summaryrefslogtreecommitdiffstats
path: root/src/network/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/network/kernel')
-rw-r--r--src/network/kernel/PSL-LICENSE.txt373
-rw-r--r--src/network/kernel/qauthenticator.cpp323
-rw-r--r--src/network/kernel/qauthenticator.h41
-rw-r--r--src/network/kernel/qauthenticator_p.h56
-rw-r--r--src/network/kernel/qdnslookup.cpp281
-rw-r--r--src/network/kernel/qdnslookup.h64
-rw-r--r--src/network/kernel/qdnslookup_android.cpp56
-rw-r--r--src/network/kernel/qdnslookup_dummy.cpp15
-rw-r--r--src/network/kernel/qdnslookup_p.h199
-rw-r--r--src/network/kernel/qdnslookup_unix.cpp585
-rw-r--r--src/network/kernel/qdnslookup_win.cpp190
-rw-r--r--src/network/kernel/qhostaddress.cpp208
-rw-r--r--src/network/kernel/qhostaddress.h66
-rw-r--r--src/network/kernel/qhostaddress_p.h40
-rw-r--r--src/network/kernel/qhostinfo.cpp224
-rw-r--r--src/network/kernel/qhostinfo.h111
-rw-r--r--src/network/kernel/qhostinfo_p.h75
-rw-r--r--src/network/kernel/qhostinfo_unix.cpp284
-rw-r--r--src/network/kernel/qhostinfo_win.cpp40
-rw-r--r--src/network/kernel/qnetconmonitor_darwin.mm83
-rw-r--r--src/network/kernel/qnetconmonitor_p.h50
-rw-r--r--src/network/kernel/qnetconmonitor_stub.cpp40
-rw-r--r--src/network/kernel/qnetconmonitor_win.cpp121
-rw-r--r--src/network/kernel/qnetworkdatagram.cpp44
-rw-r--r--src/network/kernel/qnetworkdatagram.h46
-rw-r--r--src/network/kernel/qnetworkdatagram_p.h40
-rw-r--r--src/network/kernel/qnetworkinformation.cpp396
-rw-r--r--src/network/kernel/qnetworkinformation.h83
-rw-r--r--src/network/kernel/qnetworkinformation_p.h132
-rw-r--r--src/network/kernel/qnetworkinterface.cpp79
-rw-r--r--src/network/kernel/qnetworkinterface.h54
-rw-r--r--src/network/kernel/qnetworkinterface_linux.cpp55
-rw-r--r--src/network/kernel/qnetworkinterface_p.h56
-rw-r--r--src/network/kernel/qnetworkinterface_uikit_p.h61
-rw-r--r--src/network/kernel/qnetworkinterface_unix.cpp105
-rw-r--r--src/network/kernel/qnetworkinterface_unix_p.h42
-rw-r--r--src/network/kernel/qnetworkinterface_win.cpp42
-rw-r--r--src/network/kernel/qnetworkproxy.cpp66
-rw-r--r--src/network/kernel/qnetworkproxy.h47
-rw-r--r--src/network/kernel/qnetworkproxy_android.cpp58
-rw-r--r--src/network/kernel/qnetworkproxy_darwin.cpp (renamed from src/network/kernel/qnetworkproxy_mac.cpp)177
-rw-r--r--src/network/kernel/qnetworkproxy_generic.cpp56
-rw-r--r--src/network/kernel/qnetworkproxy_libproxy.cpp56
-rw-r--r--src/network/kernel/qnetworkproxy_win.cpp224
-rw-r--r--src/network/kernel/qt_attribution.json29
-rw-r--r--src/network/kernel/qtldurl.cpp281
-rw-r--r--src/network/kernel/qtldurl_p.h43
-rw-r--r--src/network/kernel/qtnetworkglobal.h55
-rw-r--r--src/network/kernel/qtnetworkglobal_p.h51
-rw-r--r--src/network/kernel/qurltlds_p.h14906
-rw-r--r--src/network/kernel/qurltlds_p.h.INFO14
51 files changed, 2301 insertions, 18522 deletions
diff --git a/src/network/kernel/PSL-LICENSE.txt b/src/network/kernel/PSL-LICENSE.txt
deleted file mode 100644
index d0a1fa1482..0000000000
--- a/src/network/kernel/PSL-LICENSE.txt
+++ /dev/null
@@ -1,373 +0,0 @@
-Mozilla Public License Version 2.0
-==================================
-
-1. Definitions
---------------
-
-1.1. "Contributor"
- means each individual or legal entity that creates, contributes to
- the creation of, or owns Covered Software.
-
-1.2. "Contributor Version"
- means the combination of the Contributions of others (if any) used
- by a Contributor and that particular Contributor's Contribution.
-
-1.3. "Contribution"
- means Covered Software of a particular Contributor.
-
-1.4. "Covered Software"
- means Source Code Form to which the initial Contributor has attached
- the notice in Exhibit A, the Executable Form of such Source Code
- Form, and Modifications of such Source Code Form, in each case
- including portions thereof.
-
-1.5. "Incompatible With Secondary Licenses"
- means
-
- (a) that the initial Contributor has attached the notice described
- in Exhibit B to the Covered Software; or
-
- (b) that the Covered Software was made available under the terms of
- version 1.1 or earlier of the License, but not also under the
- terms of a Secondary License.
-
-1.6. "Executable Form"
- means any form of the work other than Source Code Form.
-
-1.7. "Larger Work"
- means a work that combines Covered Software with other material, in
- a separate file or files, that is not Covered Software.
-
-1.8. "License"
- means this document.
-
-1.9. "Licensable"
- means having the right to grant, to the maximum extent possible,
- whether at the time of the initial grant or subsequently, any and
- all of the rights conveyed by this License.
-
-1.10. "Modifications"
- means any of the following:
-
- (a) any file in Source Code Form that results from an addition to,
- deletion from, or modification of the contents of Covered
- Software; or
-
- (b) any new file in Source Code Form that contains any Covered
- Software.
-
-1.11. "Patent Claims" of a Contributor
- means any patent claim(s), including without limitation, method,
- process, and apparatus claims, in any patent Licensable by such
- Contributor that would be infringed, but for the grant of the
- License, by the making, using, selling, offering for sale, having
- made, import, or transfer of either its Contributions or its
- Contributor Version.
-
-1.12. "Secondary License"
- means either the GNU General Public License, Version 2.0, the GNU
- Lesser General Public License, Version 2.1, the GNU Affero General
- Public License, Version 3.0, or any later versions of those
- licenses.
-
-1.13. "Source Code Form"
- means the form of the work preferred for making modifications.
-
-1.14. "You" (or "Your")
- means an individual or a legal entity exercising rights under this
- License. For legal entities, "You" includes any entity that
- controls, is controlled by, or is under common control with You. For
- purposes of this definition, "control" means (a) the power, direct
- or indirect, to cause the direction or management of such entity,
- whether by contract or otherwise, or (b) ownership of more than
- fifty percent (50%) of the outstanding shares or beneficial
- ownership of such entity.
-
-2. License Grants and Conditions
---------------------------------
-
-2.1. Grants
-
-Each Contributor hereby grants You a world-wide, royalty-free,
-non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark)
- Licensable by such Contributor to use, reproduce, make available,
- modify, display, perform, distribute, and otherwise exploit its
- Contributions, either on an unmodified basis, with Modifications, or
- as part of a Larger Work; and
-
-(b) under Patent Claims of such Contributor to make, use, sell, offer
- for sale, have made, import, and otherwise transfer either its
- Contributions or its Contributor Version.
-
-2.2. Effective Date
-
-The licenses granted in Section 2.1 with respect to any Contribution
-become effective for each Contribution on the date the Contributor first
-distributes such Contribution.
-
-2.3. Limitations on Grant Scope
-
-The licenses granted in this Section 2 are the only rights granted under
-this License. No additional rights or licenses will be implied from the
-distribution or licensing of Covered Software under this License.
-Notwithstanding Section 2.1(b) above, no patent license is granted by a
-Contributor:
-
-(a) for any code that a Contributor has removed from Covered Software;
- or
-
-(b) for infringements caused by: (i) Your and any other third party's
- modifications of Covered Software, or (ii) the combination of its
- Contributions with other software (except as part of its Contributor
- Version); or
-
-(c) under Patent Claims infringed by Covered Software in the absence of
- its Contributions.
-
-This License does not grant any rights in the trademarks, service marks,
-or logos of any Contributor (except as may be necessary to comply with
-the notice requirements in Section 3.4).
-
-2.4. Subsequent Licenses
-
-No Contributor makes additional grants as a result of Your choice to
-distribute the Covered Software under a subsequent version of this
-License (see Section 10.2) or under the terms of a Secondary License (if
-permitted under the terms of Section 3.3).
-
-2.5. Representation
-
-Each Contributor represents that the Contributor believes its
-Contributions are its original creation(s) or it has sufficient rights
-to grant the rights to its Contributions conveyed by this License.
-
-2.6. Fair Use
-
-This License is not intended to limit any rights You have under
-applicable copyright doctrines of fair use, fair dealing, or other
-equivalents.
-
-2.7. Conditions
-
-Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
-in Section 2.1.
-
-3. Responsibilities
--------------------
-
-3.1. Distribution of Source Form
-
-All distribution of Covered Software in Source Code Form, including any
-Modifications that You create or to which You contribute, must be under
-the terms of this License. You must inform recipients that the Source
-Code Form of the Covered Software is governed by the terms of this
-License, and how they can obtain a copy of this License. You may not
-attempt to alter or restrict the recipients' rights in the Source Code
-Form.
-
-3.2. Distribution of Executable Form
-
-If You distribute Covered Software in Executable Form then:
-
-(a) such Covered Software must also be made available in Source Code
- Form, as described in Section 3.1, and You must inform recipients of
- the Executable Form how they can obtain a copy of such Source Code
- Form by reasonable means in a timely manner, at a charge no more
- than the cost of distribution to the recipient; and
-
-(b) You may distribute such Executable Form under the terms of this
- License, or sublicense it under different terms, provided that the
- license for the Executable Form does not attempt to limit or alter
- the recipients' rights in the Source Code Form under this License.
-
-3.3. Distribution of a Larger Work
-
-You may create and distribute a Larger Work under terms of Your choice,
-provided that You also comply with the requirements of this License for
-the Covered Software. If the Larger Work is a combination of Covered
-Software with a work governed by one or more Secondary Licenses, and the
-Covered Software is not Incompatible With Secondary Licenses, this
-License permits You to additionally distribute such Covered Software
-under the terms of such Secondary License(s), so that the recipient of
-the Larger Work may, at their option, further distribute the Covered
-Software under the terms of either this License or such Secondary
-License(s).
-
-3.4. Notices
-
-You may not remove or alter the substance of any license notices
-(including copyright notices, patent notices, disclaimers of warranty,
-or limitations of liability) contained within the Source Code Form of
-the Covered Software, except that You may alter any license notices to
-the extent required to remedy known factual inaccuracies.
-
-3.5. Application of Additional Terms
-
-You may choose to offer, and to charge a fee for, warranty, support,
-indemnity or liability obligations to one or more recipients of Covered
-Software. However, You may do so only on Your own behalf, and not on
-behalf of any Contributor. You must make it absolutely clear that any
-such warranty, support, indemnity, or liability obligation is offered by
-You alone, and You hereby agree to indemnify every Contributor for any
-liability incurred by such Contributor as a result of warranty, support,
-indemnity or liability terms You offer. You may include additional
-disclaimers of warranty and limitations of liability specific to any
-jurisdiction.
-
-4. Inability to Comply Due to Statute or Regulation
----------------------------------------------------
-
-If it is impossible for You to comply with any of the terms of this
-License with respect to some or all of the Covered Software due to
-statute, judicial order, or regulation then You must: (a) comply with
-the terms of this License to the maximum extent possible; and (b)
-describe the limitations and the code they affect. Such description must
-be placed in a text file included with all distributions of the Covered
-Software under this License. Except to the extent prohibited by statute
-or regulation, such description must be sufficiently detailed for a
-recipient of ordinary skill to be able to understand it.
-
-5. Termination
---------------
-
-5.1. The rights granted under this License will terminate automatically
-if You fail to comply with any of its terms. However, if You become
-compliant, then the rights granted under this License from a particular
-Contributor are reinstated (a) provisionally, unless and until such
-Contributor explicitly and finally terminates Your grants, and (b) on an
-ongoing basis, if such Contributor fails to notify You of the
-non-compliance by some reasonable means prior to 60 days after You have
-come back into compliance. Moreover, Your grants from a particular
-Contributor are reinstated on an ongoing basis if such Contributor
-notifies You of the non-compliance by some reasonable means, this is the
-first time You have received notice of non-compliance with this License
-from such Contributor, and You become compliant prior to 30 days after
-Your receipt of the notice.
-
-5.2. If You initiate litigation against any entity by asserting a patent
-infringement claim (excluding declaratory judgment actions,
-counter-claims, and cross-claims) alleging that a Contributor Version
-directly or indirectly infringes any patent, then the rights granted to
-You by any and all Contributors for the Covered Software under Section
-2.1 of this License shall terminate.
-
-5.3. In the event of termination under Sections 5.1 or 5.2 above, all
-end user license agreements (excluding distributors and resellers) which
-have been validly granted by You or Your distributors under this License
-prior to termination shall survive termination.
-
-************************************************************************
-* *
-* 6. Disclaimer of Warranty *
-* ------------------------- *
-* *
-* Covered Software is provided under this License on an "as is" *
-* basis, without warranty of any kind, either expressed, implied, or *
-* statutory, including, without limitation, warranties that the *
-* Covered Software is free of defects, merchantable, fit for a *
-* particular purpose or non-infringing. The entire risk as to the *
-* quality and performance of the Covered Software is with You. *
-* Should any Covered Software prove defective in any respect, You *
-* (not any Contributor) assume the cost of any necessary servicing, *
-* repair, or correction. This disclaimer of warranty constitutes an *
-* essential part of this License. No use of any Covered Software is *
-* authorized under this License except under this disclaimer. *
-* *
-************************************************************************
-
-************************************************************************
-* *
-* 7. Limitation of Liability *
-* -------------------------- *
-* *
-* Under no circumstances and under no legal theory, whether tort *
-* (including negligence), contract, or otherwise, shall any *
-* Contributor, or anyone who distributes Covered Software as *
-* permitted above, be liable to You for any direct, indirect, *
-* special, incidental, or consequential damages of any character *
-* including, without limitation, damages for lost profits, loss of *
-* goodwill, work stoppage, computer failure or malfunction, or any *
-* and all other commercial damages or losses, even if such party *
-* shall have been informed of the possibility of such damages. This *
-* limitation of liability shall not apply to liability for death or *
-* personal injury resulting from such party's negligence to the *
-* extent applicable law prohibits such limitation. Some *
-* jurisdictions do not allow the exclusion or limitation of *
-* incidental or consequential damages, so this exclusion and *
-* limitation may not apply to You. *
-* *
-************************************************************************
-
-8. Litigation
--------------
-
-Any litigation relating to this License may be brought only in the
-courts of a jurisdiction where the defendant maintains its principal
-place of business and such litigation shall be governed by laws of that
-jurisdiction, without reference to its conflict-of-law provisions.
-Nothing in this Section shall prevent a party's ability to bring
-cross-claims or counter-claims.
-
-9. Miscellaneous
-----------------
-
-This License represents the complete agreement concerning the subject
-matter hereof. If any provision of this License is held to be
-unenforceable, such provision shall be reformed only to the extent
-necessary to make it enforceable. Any law or regulation which provides
-that the language of a contract shall be construed against the drafter
-shall not be used to construe this License against a Contributor.
-
-10. Versions of the License
----------------------------
-
-10.1. New Versions
-
-Mozilla Foundation is the license steward. Except as provided in Section
-10.3, no one other than the license steward has the right to modify or
-publish new versions of this License. Each version will be given a
-distinguishing version number.
-
-10.2. Effect of New Versions
-
-You may distribute the Covered Software under the terms of the version
-of the License under which You originally received the Covered Software,
-or under the terms of any subsequent version published by the license
-steward.
-
-10.3. Modified Versions
-
-If you create software not governed by this License, and you want to
-create a new license for such software, you may create and use a
-modified version of this License if you rename the license and remove
-any references to the name of the license steward (except to note that
-such modified license differs from this License).
-
-10.4. Distributing Source Code Form that is Incompatible With Secondary
-Licenses
-
-If You choose to distribute Source Code Form that is Incompatible With
-Secondary Licenses under the terms of this version of the License, the
-notice described in Exhibit B of this License must be attached.
-
-Exhibit A - Source Code Form License Notice
--------------------------------------------
-
- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at https://mozilla.org/MPL/2.0/.
-
-If it is not possible or desirable to put the notice in a particular
-file, then You may include the notice in a location (such as a LICENSE
-file in a relevant directory) where a recipient would be likely to look
-for such a notice.
-
-You may add additional accurate notices of copyright ownership.
-
-Exhibit B - "Incompatible With Secondary Licenses" Notice
----------------------------------------------------------
-
- This Source Code Form is "Incompatible With Secondary Licenses", as
- defined by the Mozilla Public License, v. 2.0.
diff --git a/src/network/kernel/qauthenticator.cpp b/src/network/kernel/qauthenticator.cpp
index 4daf11cb3e..e42450d7e5 100644
--- a/src/network/kernel/qauthenticator.cpp
+++ b/src/network/kernel/qauthenticator.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qauthenticator.h>
#include <qauthenticator_p.h>
@@ -50,6 +14,7 @@
#include <qstring.h>
#include <qdatetime.h>
#include <qrandom.h>
+#include <QtNetwork/qhttpheaders.h>
#ifdef Q_OS_WIN
#include <qmutex.h>
@@ -69,6 +34,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
Q_DECLARE_LOGGING_CATEGORY(lcAuthenticator);
Q_LOGGING_CATEGORY(lcAuthenticator, "qt.network.authenticator");
@@ -77,14 +44,13 @@ static QByteArray qNtlmPhase3(QAuthenticatorPrivate *ctx, const QByteArray& phas
#if QT_CONFIG(sspi) // SSPI
static bool q_SSPI_library_load();
static QByteArray qSspiStartup(QAuthenticatorPrivate *ctx, QAuthenticatorPrivate::Method method,
- const QString& host);
+ QStringView host);
static QByteArray qSspiContinue(QAuthenticatorPrivate *ctx, QAuthenticatorPrivate::Method method,
- const QString& host, const QByteArray& challenge = QByteArray());
+ QStringView host, QByteArrayView challenge = {});
#elif QT_CONFIG(gssapi) // GSSAPI
-static bool qGssapiTestGetCredentials(const QString &host);
-static QByteArray qGssapiStartup(QAuthenticatorPrivate *ctx, const QString& host);
-static QByteArray qGssapiContinue(QAuthenticatorPrivate *ctx,
- const QByteArray& challenge = QByteArray());
+static bool qGssapiTestGetCredentials(QStringView host);
+static QByteArray qGssapiStartup(QAuthenticatorPrivate *ctx, QStringView host);
+static QByteArray qGssapiContinue(QAuthenticatorPrivate *ctx, QByteArrayView challenge = {});
#endif // gssapi
/*!
@@ -154,7 +120,28 @@ static QByteArray qGssapiContinue(QAuthenticatorPrivate *ctx,
\section2 SPNEGO/Negotiate
- This authentication mechanism currently supports no incoming or outgoing options.
+ \table
+ \header
+ \li Option
+ \li Direction
+ \li Type
+ \li Description
+ \row
+ \li \tt{spn}
+ \li Outgoing
+ \li QString
+ \li Provides a custom SPN.
+ \endtable
+
+ This authentication mechanism currently supports no incoming options.
+
+ The \c{spn} property is used on Windows clients when an SSPI library is used.
+ If the property is not set, a default SPN will be used. The default SPN on
+ Windows is \c {HTTP/<hostname>}.
+
+ Other operating systems use GSSAPI libraries. For that it is expected that
+ KDC is set up, and the credentials can be fetched from it. The backend always
+ uses \c {HTTPS@<hostname>} as an SPN.
\sa QSslSocket
*/
@@ -195,7 +182,7 @@ QAuthenticator &QAuthenticator::operator=(const QAuthenticator &other)
if (d == other.d)
return *this;
- // Do not share the d since challange reponse/based changes
+ // Do not share the d since challenge response/based changes
// could corrupt the internal store and different network requests
// can utilize different types of proxies.
detach();
@@ -406,7 +393,7 @@ void QAuthenticatorPrivate::updateCredentials()
switch (method) {
case QAuthenticatorPrivate::Ntlm:
- if ((separatorPosn = user.indexOf(QLatin1String("\\"))) != -1) {
+ if ((separatorPosn = user.indexOf("\\"_L1)) != -1) {
//domain name is present
realm.clear();
userDomain = user.left(separatorPosn);
@@ -423,12 +410,49 @@ void QAuthenticatorPrivate::updateCredentials()
}
}
-void QAuthenticatorPrivate::parseHttpResponse(const QList<QPair<QByteArray, QByteArray> > &values, bool isProxy, const QString &host)
+bool QAuthenticatorPrivate::isMethodSupported(QByteArrayView method)
+{
+ Q_ASSERT(!method.startsWith(' ')); // This should be trimmed during parsing
+ auto separator = method.indexOf(' ');
+ if (separator != -1)
+ method = method.first(separator);
+ const auto isSupported = [method](QByteArrayView reference) {
+ return method.compare(reference, Qt::CaseInsensitive) == 0;
+ };
+ static const char methods[][10] = {
+ "basic",
+ "ntlm",
+ "digest",
+#if QT_CONFIG(sspi) || QT_CONFIG(gssapi)
+ "negotiate",
+#endif
+ };
+ return std::any_of(methods, methods + std::size(methods), isSupported);
+}
+
+static bool verifyDigestMD5(QByteArrayView value)
+{
+ auto opts = QAuthenticatorPrivate::parseDigestAuthenticationChallenge(value);
+ if (auto it = opts.constFind("algorithm"); it != opts.cend()) {
+ QByteArray alg = it.value();
+ if (alg.size() < 3)
+ return false;
+ // Just compare the first 3 characters, that way we match other subvariants as well, such as
+ // "MD5-sess"
+ auto view = QByteArrayView(alg).first(3);
+ return view.compare("MD5", Qt::CaseInsensitive) == 0;
+ }
+ return true; // assume it's ok if algorithm is not specified
+}
+
+void QAuthenticatorPrivate::parseHttpResponse(const QHttpHeaders &headers,
+ bool isProxy, QStringView host)
{
#if !QT_CONFIG(gssapi)
Q_UNUSED(host);
#endif
- const char *search = isProxy ? "proxy-authenticate" : "www-authenticate";
+ const auto search = isProxy ? QHttpHeaders::WellKnownHeader::ProxyAuthenticate
+ : QHttpHeaders::WellKnownHeader::WWWAuthenticate;
method = None;
/*
@@ -441,22 +465,23 @@ void QAuthenticatorPrivate::parseHttpResponse(const QList<QPair<QByteArray, QByt
authentication parameters.
*/
- QByteArray headerVal;
- for (int i = 0; i < values.size(); ++i) {
- const QPair<QByteArray, QByteArray> &current = values.at(i);
- if (current.first.compare(search, Qt::CaseInsensitive) != 0)
- continue;
- QByteArray str = current.second.toLower();
- if (method < Basic && str.startsWith("basic")) {
+ QByteArrayView headerVal;
+ for (const auto &current : headers.values(search)) {
+ const QLatin1StringView str(current);
+ if (method < Basic && str.startsWith("basic"_L1, Qt::CaseInsensitive)) {
method = Basic;
- headerVal = current.second.mid(6);
- } else if (method < Ntlm && str.startsWith("ntlm")) {
+ headerVal = QByteArrayView(current).mid(6);
+ } else if (method < Ntlm && str.startsWith("ntlm"_L1, Qt::CaseInsensitive)) {
method = Ntlm;
- headerVal = current.second.mid(5);
- } else if (method < DigestMd5 && str.startsWith("digest")) {
+ headerVal = QByteArrayView(current).mid(5);
+ } else if (method < DigestMd5 && str.startsWith("digest"_L1, Qt::CaseInsensitive)) {
+ // Make sure the algorithm is actually MD5 before committing to it:
+ if (!verifyDigestMD5(QByteArrayView(current).sliced(7)))
+ continue;
+
method = DigestMd5;
- headerVal = current.second.mid(7);
- } else if (method < Negotiate && str.startsWith("negotiate")) {
+ headerVal = QByteArrayView(current).mid(7);
+ } else if (method < Negotiate && str.startsWith("negotiate"_L1, Qt::CaseInsensitive)) {
#if QT_CONFIG(sspi) || QT_CONFIG(gssapi) // if it's not supported then we shouldn't try to use it
#if QT_CONFIG(gssapi)
// For GSSAPI there needs to be a KDC set up for the host (afaict).
@@ -466,14 +491,14 @@ void QAuthenticatorPrivate::parseHttpResponse(const QList<QPair<QByteArray, QByt
continue;
#endif
method = Negotiate;
- headerVal = current.second.mid(10);
+ headerVal = QByteArrayView(current).mid(10);
#endif
}
}
// Reparse credentials since we know the method now
updateCredentials();
- challenge = headerVal.trimmed();
+ challenge = headerVal.trimmed().toByteArray();
QHash<QByteArray, QByteArray> options = parseDigestAuthenticationChallenge(challenge);
// Sets phase to Start if this updates our realm and sets the two locations where we store
@@ -483,7 +508,7 @@ void QAuthenticatorPrivate::parseHttpResponse(const QList<QPair<QByteArray, QByt
if (phase == Done)
phase = Start;
realm = newRealm;
- this->options[QLatin1String("realm")] = realm;
+ this->options["realm"_L1] = realm;
}
};
@@ -514,22 +539,21 @@ void QAuthenticatorPrivate::parseHttpResponse(const QList<QPair<QByteArray, QByt
}
}
-QByteArray QAuthenticatorPrivate::calculateResponse(const QByteArray &requestMethod, const QByteArray &path, const QString& host)
+QByteArray QAuthenticatorPrivate::calculateResponse(QByteArrayView requestMethod,
+ QByteArrayView path, QStringView host)
{
#if !QT_CONFIG(sspi) && !QT_CONFIG(gssapi)
Q_UNUSED(host);
#endif
QByteArray response;
- const char* methodString = nullptr;
+ QByteArrayView methodString;
switch(method) {
case QAuthenticatorPrivate::None:
- methodString = "";
phase = Done;
break;
case QAuthenticatorPrivate::Basic:
methodString = "Basic";
- response = user.toLatin1() + ':' + password.toLatin1();
- response = response.toBase64();
+ response = (user + ':'_L1 + password).toLatin1().toBase64();
phase = Done;
break;
case QAuthenticatorPrivate::DigestMd5:
@@ -599,9 +623,11 @@ QByteArray QAuthenticatorPrivate::calculateResponse(const QByteArray &requestMet
} else {
QByteArray phase3Token;
#if QT_CONFIG(sspi) // SSPI
- phase3Token = qSspiContinue(this, method, host, QByteArray::fromBase64(challenge));
+ if (sspiWindowsHandles)
+ phase3Token = qSspiContinue(this, method, host, QByteArray::fromBase64(challenge));
#elif QT_CONFIG(gssapi) // GSSAPI
- phase3Token = qGssapiContinue(this, QByteArray::fromBase64(challenge));
+ if (gssApiHandles)
+ phase3Token = qGssapiContinue(this, QByteArray::fromBase64(challenge));
#endif
if (!phase3Token.isEmpty()) {
response = phase3Token.toBase64();
@@ -616,25 +642,35 @@ QByteArray QAuthenticatorPrivate::calculateResponse(const QByteArray &requestMet
break;
}
- return QByteArray::fromRawData(methodString, qstrlen(methodString)) + ' ' + response;
+ return methodString + ' ' + response;
}
// ---------------------------- Digest Md5 code ----------------------------------------
-QHash<QByteArray, QByteArray> QAuthenticatorPrivate::parseDigestAuthenticationChallenge(const QByteArray &challenge)
+static bool containsAuth(QByteArrayView data)
+{
+ for (auto element : QLatin1StringView(data).tokenize(','_L1)) {
+ if (element == "auth"_L1)
+ return true;
+ }
+ return false;
+}
+
+QHash<QByteArray, QByteArray>
+QAuthenticatorPrivate::parseDigestAuthenticationChallenge(QByteArrayView challenge)
{
QHash<QByteArray, QByteArray> options;
// parse the challenge
- const char *d = challenge.constData();
- const char *end = d + challenge.length();
+ const char *d = challenge.data();
+ const char *end = d + challenge.size();
while (d < end) {
while (d < end && (*d == ' ' || *d == '\n' || *d == '\r'))
++d;
const char *start = d;
while (d < end && *d != '=')
++d;
- QByteArray key = QByteArray(start, d - start);
+ QByteArrayView key = QByteArrayView(start, d - start);
++d;
if (d >= end)
break;
@@ -665,13 +701,12 @@ QHash<QByteArray, QByteArray> QAuthenticatorPrivate::parseDigestAuthenticationCh
while (d < end && *d != ',')
++d;
++d;
- options[key] = value;
+ options[key.toByteArray()] = std::move(value);
}
QByteArray qop = options.value("qop");
if (!qop.isEmpty()) {
- QList<QByteArray> qopoptions = qop.split(',');
- if (!qopoptions.contains("auth"))
+ if (!containsAuth(qop))
return QHash<QByteArray, QByteArray>();
// #### can't do auth-int currently
// if (qop.contains("auth-int"))
@@ -697,24 +732,24 @@ QHash<QByteArray, QByteArray> QAuthenticatorPrivate::parseDigestAuthenticationCh
/* calculate request-digest/response-digest as per HTTP Digest spec */
static QByteArray digestMd5ResponseHelper(
- const QByteArray &alg,
- const QByteArray &userName,
- const QByteArray &realm,
- const QByteArray &password,
- const QByteArray &nonce, /* nonce from server */
- const QByteArray &nonceCount, /* 8 hex digits */
- const QByteArray &cNonce, /* client nonce */
- const QByteArray &qop, /* qop-value: "", "auth", "auth-int" */
- const QByteArray &method, /* method from the request */
- const QByteArray &digestUri, /* requested URL */
- const QByteArray &hEntity /* H(entity body) if qop="auth-int" */
+ QByteArrayView alg,
+ QByteArrayView userName,
+ QByteArrayView realm,
+ QByteArrayView password,
+ QByteArrayView nonce, /* nonce from server */
+ QByteArrayView nonceCount, /* 8 hex digits */
+ QByteArrayView cNonce, /* client nonce */
+ QByteArrayView qop, /* qop-value: "", "auth", "auth-int" */
+ QByteArrayView method, /* method from the request */
+ QByteArrayView digestUri, /* requested URL */
+ QByteArrayView hEntity /* H(entity body) if qop="auth-int" */
)
{
QCryptographicHash hash(QCryptographicHash::Md5);
hash.addData(userName);
- hash.addData(":", 1);
+ hash.addData(":");
hash.addData(realm);
- hash.addData(":", 1);
+ hash.addData(":");
hash.addData(password);
QByteArray ha1 = hash.result();
if (alg.compare("md5-sess", Qt::CaseInsensitive) == 0) {
@@ -724,9 +759,9 @@ static QByteArray digestMd5ResponseHelper(
// but according to the errata page at http://www.rfc-editor.org/errata_list.php, ID 1649, it
// must be the following line:
hash.addData(ha1.toHex());
- hash.addData(":", 1);
+ hash.addData(":");
hash.addData(nonce);
- hash.addData(":", 1);
+ hash.addData(":");
hash.addData(cNonce);
ha1 = hash.result();
};
@@ -735,10 +770,10 @@ static QByteArray digestMd5ResponseHelper(
// calculate H(A2)
hash.reset();
hash.addData(method);
- hash.addData(":", 1);
+ hash.addData(":");
hash.addData(digestUri);
if (qop.compare("auth-int", Qt::CaseInsensitive) == 0) {
- hash.addData(":", 1);
+ hash.addData(":");
hash.addData(hEntity);
}
QByteArray ha2hex = hash.result().toHex();
@@ -746,28 +781,29 @@ static QByteArray digestMd5ResponseHelper(
// calculate response
hash.reset();
hash.addData(ha1);
- hash.addData(":", 1);
+ hash.addData(":");
hash.addData(nonce);
- hash.addData(":", 1);
+ hash.addData(":");
if (!qop.isNull()) {
hash.addData(nonceCount);
- hash.addData(":", 1);
+ hash.addData(":");
hash.addData(cNonce);
- hash.addData(":", 1);
+ hash.addData(":");
hash.addData(qop);
- hash.addData(":", 1);
+ hash.addData(":");
}
hash.addData(ha2hex);
return hash.result().toHex();
}
-QByteArray QAuthenticatorPrivate::digestMd5Response(const QByteArray &challenge, const QByteArray &method, const QByteArray &path)
+QByteArray QAuthenticatorPrivate::digestMd5Response(QByteArrayView challenge, QByteArrayView method,
+ QByteArrayView path)
{
QHash<QByteArray,QByteArray> options = parseDigestAuthenticationChallenge(challenge);
++nonceCount;
QByteArray nonceCountString = QByteArray::number(nonceCount, 16);
- while (nonceCountString.length() < 8)
+ while (nonceCountString.size() < 8)
nonceCountString.prepend('0');
QByteArray nonce = options.value("nonce");
@@ -1028,9 +1064,9 @@ static void qStreamNtlmString(QDataStream& ds, const QString& s, bool unicode)
qStreamNtlmBuffer(ds, s.toLatin1());
return;
}
- const ushort *d = s.utf16();
- for (int i = 0; i < s.length(); ++i)
- ds << d[i];
+
+ for (QChar ch : s)
+ ds << quint16(ch.unicode());
}
@@ -1048,7 +1084,7 @@ static int qEncodeNtlmString(QNtlmBuffer& buf, int offset, const QString& s, boo
{
if (!unicode)
return qEncodeNtlmBuffer(buf, offset, s.toLatin1());
- buf.len = 2 * s.length();
+ buf.len = 2 * s.size();
buf.maxLen = buf.len;
buf.offset = (offset + 1) & ~1;
return buf.offset + buf.len;
@@ -1170,12 +1206,11 @@ static QByteArray qNtlmPhase1()
static QByteArray qStringAsUcs2Le(const QString& src)
{
- QByteArray rc(2*src.length(), 0);
- const unsigned short *s = src.utf16();
+ QByteArray rc(2*src.size(), 0);
unsigned short *d = (unsigned short*)rc.data();
- for (int i = 0; i < src.length(); ++i) {
- d[i] = qToLittleEndian(s[i]);
- }
+ for (QChar ch : src)
+ *d++ = qToLittleEndian(quint16(ch.unicode()));
+
return rc;
}
@@ -1184,7 +1219,7 @@ static QString qStringFromUcs2Le(QByteArray src)
{
Q_ASSERT(src.size() % 2 == 0);
unsigned short *d = (unsigned short*)src.data();
- for (int i = 0; i < src.length() / 2; ++i) {
+ for (int i = 0; i < src.size() / 2; ++i) {
d[i] = qFromLittleEndian(d[i]);
}
return QString((const QChar *)src.data(), src.size()/2);
@@ -1213,13 +1248,12 @@ static QString qStringFromUcs2Le(QByteArray src)
* ---------------------------------------
*
*********************************************************************/
-QByteArray qEncodeHmacMd5(QByteArray &key, const QByteArray &message)
+QByteArray qEncodeHmacMd5(QByteArray &key, QByteArrayView message)
{
Q_ASSERT_X(!(message.isEmpty()),"qEncodeHmacMd5", "Empty message check");
Q_ASSERT_X(!(key.isEmpty()),"qEncodeHmacMd5", "Empty key check");
QCryptographicHash hash(QCryptographicHash::Md5);
- QByteArray hMsg;
QByteArray iKeyPad(blockSize, 0x36);
QByteArray oKeyPad(blockSize, 0x5c);
@@ -1227,7 +1261,7 @@ QByteArray qEncodeHmacMd5(QByteArray &key, const QByteArray &message)
hash.reset();
// Adjust the key length to blockSize
- if (blockSize < key.length()) {
+ if (blockSize < key.size()) {
hash.addData(key);
key = hash.result(); //MD5 will always return 16 bytes length output
}
@@ -1252,7 +1286,7 @@ QByteArray qEncodeHmacMd5(QByteArray &key, const QByteArray &message)
hash.reset();
hash.addData(iKeyPad);
- hMsg = hash.result();
+ QByteArrayView hMsg = hash.resultView();
//Digest gen after pass-1: H((K0 xor ipad)||text)
QByteArray hmacDigest;
@@ -1282,7 +1316,7 @@ static QByteArray qCreatev2Hash(const QAuthenticatorPrivate *ctx,
if (phase3->v2Hash.size() == 0) {
QCryptographicHash md4(QCryptographicHash::Md4);
QByteArray passUnicode = qStringAsUcs2Le(ctx->password);
- md4.addData(passUnicode.data(), passUnicode.size());
+ md4.addData(passUnicode);
QByteArray hashKey = md4.result();
Q_ASSERT(hashKey.size() == 16);
@@ -1489,7 +1523,7 @@ static QByteArray qNtlmPhase3(QAuthenticatorPrivate *ctx, const QByteArray& phas
Q_ASSERT(QNtlmPhase3BlockBase::Size == sizeof(QNtlmPhase3BlockBase));
// for kerberos style user@domain logins, NTLM domain string should be left empty
- if (ctx->userDomain.isEmpty() && !ctx->extractedUser.contains(QLatin1Char('@'))) {
+ if (ctx->userDomain.isEmpty() && !ctx->extractedUser.contains(u'@')) {
offset = qEncodeNtlmString(pb.domain, offset, ch.targetNameStr, unicode);
pb.domainStr = ch.targetNameStr;
} else {
@@ -1529,27 +1563,16 @@ static QByteArray qNtlmPhase3(QAuthenticatorPrivate *ctx, const QByteArray& phas
// See http://davenport.sourceforge.net/ntlm.html
// and libcurl http_ntlm.c
-// Handle of secur32.dll
-static HMODULE securityDLLHandle = nullptr;
// Pointer to SSPI dispatch table
-static PSecurityFunctionTable pSecurityFunctionTable = nullptr;
+static PSecurityFunctionTableW pSecurityFunctionTable = nullptr;
static bool q_SSPI_library_load()
{
- static QBasicMutex mutex;
+ Q_CONSTINIT static QBasicMutex mutex;
QMutexLocker l(&mutex);
- // Initialize security interface
- if (pSecurityFunctionTable == nullptr) {
- securityDLLHandle = LoadLibrary(L"secur32.dll");
- if (securityDLLHandle != nullptr) {
- INIT_SECURITY_INTERFACE pInitSecurityInterface =
- reinterpret_cast<INIT_SECURITY_INTERFACE>(
- reinterpret_cast<QFunctionPointer>(GetProcAddress(securityDLLHandle, "InitSecurityInterfaceW")));
- if (pInitSecurityInterface != nullptr)
- pSecurityFunctionTable = pInitSecurityInterface();
- }
- }
+ if (pSecurityFunctionTable == nullptr)
+ pSecurityFunctionTable = InitSecurityInterfaceW();
if (pSecurityFunctionTable == nullptr)
return false;
@@ -1558,7 +1581,7 @@ static bool q_SSPI_library_load()
}
static QByteArray qSspiStartup(QAuthenticatorPrivate *ctx, QAuthenticatorPrivate::Method method,
- const QString& host)
+ QStringView host)
{
if (!q_SSPI_library_load())
return QByteArray();
@@ -1567,17 +1590,18 @@ static QByteArray qSspiStartup(QAuthenticatorPrivate *ctx, QAuthenticatorPrivate
if (!ctx->sspiWindowsHandles)
ctx->sspiWindowsHandles.reset(new QSSPIWindowsHandles);
- memset(&ctx->sspiWindowsHandles->credHandle, 0, sizeof(CredHandle));
+ SecInvalidateHandle(&ctx->sspiWindowsHandles->credHandle);
+ SecInvalidateHandle(&ctx->sspiWindowsHandles->ctxHandle);
SEC_WINNT_AUTH_IDENTITY auth;
auth.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
bool useAuth = false;
if (method == QAuthenticatorPrivate::Negotiate && !ctx->user.isEmpty()) {
- auth.Domain = const_cast<ushort *>(ctx->userDomain.utf16());
+ auth.Domain = const_cast<ushort *>(reinterpret_cast<const ushort *>(ctx->userDomain.constData()));
auth.DomainLength = ctx->userDomain.size();
- auth.User = const_cast<ushort *>(ctx->user.utf16());
+ auth.User = const_cast<ushort *>(reinterpret_cast<const ushort *>(ctx->user.constData()));
auth.UserLength = ctx->user.size();
- auth.Password = const_cast<ushort *>(ctx->password.utf16());
+ auth.Password = const_cast<ushort *>(reinterpret_cast<const ushort *>(ctx->password.constData()));
auth.PasswordLength = ctx->password.size();
useAuth = true;
}
@@ -1598,7 +1622,7 @@ static QByteArray qSspiStartup(QAuthenticatorPrivate *ctx, QAuthenticatorPrivate
}
static QByteArray qSspiContinue(QAuthenticatorPrivate *ctx, QAuthenticatorPrivate::Method method,
- const QString &host, const QByteArray &challenge)
+ QStringView host, QByteArrayView challenge)
{
QByteArray result;
SecBuffer challengeBuf;
@@ -1628,8 +1652,11 @@ static QByteArray qSspiContinue(QAuthenticatorPrivate *ctx, QAuthenticatorPrivat
responseBuf.cbBuffer = 0;
// Calculate target (SPN for Negotiate, empty for NTLM)
- std::wstring targetNameW = (method == QAuthenticatorPrivate::Negotiate
- ? QLatin1String("HTTP/") + host : QString()).toStdWString();
+ QString targetName = ctx->options.value("spn"_L1).toString();
+ if (targetName.isEmpty())
+ targetName = "HTTP/"_L1 + host;
+ const std::wstring targetNameW = (method == QAuthenticatorPrivate::Negotiate
+ ? targetName : QString()).toStdWString();
// Generate our challenge-response message
SECURITY_STATUS secStatus = pSecurityFunctionTable->InitializeSecurityContext(
@@ -1691,7 +1718,7 @@ static void q_GSSAPI_error(const char *message, OM_uint32 majStat, OM_uint32 min
q_GSSAPI_error_int(message, minStat, GSS_C_MECH_CODE);
}
-static gss_name_t qGSsapiGetServiceName(const QString &host)
+static gss_name_t qGSsapiGetServiceName(QStringView host)
{
QByteArray serviceName = "HTTPS@" + host.toLocal8Bit();
gss_buffer_desc nameDesc = {static_cast<std::size_t>(serviceName.size()), serviceName.data()};
@@ -1709,7 +1736,7 @@ static gss_name_t qGSsapiGetServiceName(const QString &host)
}
// Send initial GSS authentication token
-static QByteArray qGssapiStartup(QAuthenticatorPrivate *ctx, const QString &host)
+static QByteArray qGssapiStartup(QAuthenticatorPrivate *ctx, QStringView host)
{
if (!ctx->gssApiHandles)
ctx->gssApiHandles.reset(new QGssApiHandles);
@@ -1728,7 +1755,7 @@ static QByteArray qGssapiStartup(QAuthenticatorPrivate *ctx, const QString &host
}
// Continue GSS authentication with next token as needed
-static QByteArray qGssapiContinue(QAuthenticatorPrivate *ctx, const QByteArray& challenge)
+static QByteArray qGssapiContinue(QAuthenticatorPrivate *ctx, QByteArrayView challenge)
{
OM_uint32 majStat, minStat, ignored;
QByteArray result;
@@ -1737,7 +1764,7 @@ static QByteArray qGssapiContinue(QAuthenticatorPrivate *ctx, const QByteArray&
if (!challenge.isEmpty()) {
inBuf.value = const_cast<char*>(challenge.data());
- inBuf.length = challenge.length();
+ inBuf.length = challenge.size();
}
majStat = gss_init_sec_context(&minStat,
@@ -1774,7 +1801,7 @@ static QByteArray qGssapiContinue(QAuthenticatorPrivate *ctx, const QByteArray&
return result;
}
-static bool qGssapiTestGetCredentials(const QString &host)
+static bool qGssapiTestGetCredentials(QStringView host)
{
gss_name_t serviceName = qGSsapiGetServiceName(host);
if (!serviceName)
diff --git a/src/network/kernel/qauthenticator.h b/src/network/kernel/qauthenticator.h
index 1032c2f501..a05d359e93 100644
--- a/src/network/kernel/qauthenticator.h
+++ b/src/network/kernel/qauthenticator.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QAUTHENTICATOR_H
#define QAUTHENTICATOR_H
@@ -52,6 +16,7 @@ class QUrl;
class Q_NETWORK_EXPORT QAuthenticator
{
+ Q_GADGET
public:
QAuthenticator();
~QAuthenticator();
diff --git a/src/network/kernel/qauthenticator_p.h b/src/network/kernel/qauthenticator_p.h
index 1813634ee0..bc16139941 100644
--- a/src/network/kernel/qauthenticator_p.h
+++ b/src/network/kernel/qauthenticator_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QAUTHENTICATOR_P_H
#define QAUTHENTICATOR_P_H
@@ -62,13 +26,14 @@
QT_BEGIN_NAMESPACE
class QHttpResponseHeader;
+class QHttpHeaders;
#if QT_CONFIG(sspi) // SSPI
class QSSPIWindowsHandles;
#elif QT_CONFIG(gssapi) // GSSAPI
class QGssApiHandles;
#endif
-class Q_AUTOTEST_EXPORT QAuthenticatorPrivate
+class Q_NETWORK_EXPORT QAuthenticatorPrivate
{
public:
enum Method { None, Basic, Negotiate, Ntlm, DigestMd5, };
@@ -91,6 +56,7 @@ public:
enum Phase {
Start,
+ Phase1,
Phase2,
Done,
Invalid
@@ -105,16 +71,20 @@ public:
QString workstation;
QString userDomain;
- QByteArray calculateResponse(const QByteArray &method, const QByteArray &path, const QString& host);
+ QByteArray calculateResponse(QByteArrayView method, QByteArrayView path, QStringView host);
inline static QAuthenticatorPrivate *getPrivate(QAuthenticator &auth) { return auth.d; }
inline static const QAuthenticatorPrivate *getPrivate(const QAuthenticator &auth) { return auth.d; }
- QByteArray digestMd5Response(const QByteArray &challenge, const QByteArray &method, const QByteArray &path);
- static QHash<QByteArray, QByteArray> parseDigestAuthenticationChallenge(const QByteArray &challenge);
+ QByteArray digestMd5Response(QByteArrayView challenge, QByteArrayView method,
+ QByteArrayView path);
+ static QHash<QByteArray, QByteArray>
+ parseDigestAuthenticationChallenge(QByteArrayView challenge);
- void parseHttpResponse(const QList<QPair<QByteArray, QByteArray> >&, bool isProxy, const QString &host);
+ void parseHttpResponse(const QHttpHeaders &headers, bool isProxy, QStringView host);
void updateCredentials();
+
+ static bool isMethodSupported(QByteArrayView method);
};
diff --git a/src/network/kernel/qdnslookup.cpp b/src/network/kernel/qdnslookup.cpp
index 3f1618ddee..c310c7e28e 100644
--- a/src/network/kernel/qdnslookup.cpp
+++ b/src/network/kernel/qdnslookup.cpp
@@ -1,47 +1,14 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Jeremy Lainé <jeremy.laine@m4x.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2012 Jeremy Lainé <jeremy.laine@m4x.org>
+// Copyright (C) 2023 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qdnslookup.h"
#include "qdnslookup_p.h"
+#include <qapplicationstatic.h>
#include <qcoreapplication.h>
#include <qdatetime.h>
+#include <qloggingcategory.h>
#include <qrandom.h>
#include <qurl.h>
@@ -49,9 +16,20 @@
QT_BEGIN_NAMESPACE
-#if QT_CONFIG(thread)
-Q_GLOBAL_STATIC(QDnsLookupThreadPool, theDnsLookupThreadPool);
-#endif
+static Q_LOGGING_CATEGORY(lcDnsLookup, "qt.network.dnslookup", QtCriticalMsg)
+
+namespace {
+struct QDnsLookupThreadPool : QThreadPool
+{
+ QDnsLookupThreadPool()
+ {
+ // Run up to 5 lookups in parallel.
+ setMaxThreadCount(5);
+ }
+};
+}
+
+Q_APPLICATION_STATIC(QDnsLookupThreadPool, theDnsLookupThreadPool);
static bool qt_qdnsmailexchangerecord_less_than(const QDnsMailExchangeRecord &r1, const QDnsMailExchangeRecord &r2)
{
@@ -86,7 +64,7 @@ static void qt_qdnsmailexchangerecord_sort(QList<QDnsMailExchangeRecord> &record
// Randomize the slice of records.
while (!slice.isEmpty()) {
- const unsigned int pos = QRandomGenerator::global()->bounded(int(slice.size()));
+ const unsigned int pos = QRandomGenerator::global()->bounded(slice.size());
records[i++] = slice.takeAt(pos);
}
}
@@ -155,9 +133,6 @@ static void qt_qdnsservicerecord_sort(QList<QDnsServiceRecord> &records)
}
}
-const char *QDnsLookupPrivate::msgNoIpV6NameServerAdresses =
- QT_TRANSLATE_NOOP("QDnsLookupRunnable", "IPv6 addresses for nameservers are currently not supported");
-
/*!
\class QDnsLookup
\brief The QDnsLookup class represents a DNS lookup.
@@ -212,6 +187,9 @@ const char *QDnsLookupPrivate::msgNoIpV6NameServerAdresses =
\value NotFoundError the requested domain name does not exist
(NXDOMAIN).
+
+ \value TimeoutError the server was not reached or did not reply
+ in time (since 6.6).
*/
/*!
@@ -267,8 +245,8 @@ const char *QDnsLookupPrivate::msgNoIpV6NameServerAdresses =
QDnsLookup::QDnsLookup(QObject *parent)
: QObject(*new QDnsLookupPrivate, parent)
{
- qRegisterMetaType<QDnsLookupReply>();
}
+
/*!
Constructs a QDnsLookup object for the given \a type and \a name and sets
\a parent as the parent object.
@@ -278,7 +256,6 @@ QDnsLookup::QDnsLookup(Type type, const QString &name, QObject *parent)
: QObject(*new QDnsLookupPrivate, parent)
{
Q_D(QDnsLookup);
- qRegisterMetaType<QDnsLookupReply>();
d->name = name;
d->type = type;
}
@@ -286,17 +263,39 @@ QDnsLookup::QDnsLookup(Type type, const QString &name, QObject *parent)
/*!
\fn QDnsLookup::QDnsLookup(Type type, const QString &name, const QHostAddress &nameserver, QObject *parent)
\since 5.4
- Constructs a QDnsLookup object for the given \a type, \a name and
- \a nameserver and sets \a parent as the parent object.
+
+ Constructs a QDnsLookup object to issue a query for \a name of record type
+ \a type, using the DNS server \a nameserver running on the default DNS port,
+ and sets \a parent as the parent object.
*/
QDnsLookup::QDnsLookup(Type type, const QString &name, const QHostAddress &nameserver, QObject *parent)
+ : QDnsLookup(type, name, nameserver, DnsPort, parent)
+{
+}
+
+/*!
+ \fn QDnsLookup::QDnsLookup(Type type, const QString &name, const QHostAddress &nameserver, quint16 port, QObject *parent)
+ \since 6.6
+
+ Constructs a QDnsLookup object to issue a query for \a name of record type
+ \a type, using the DNS server \a nameserver running on port \a port, and
+ sets \a parent as the parent object.
+
+//! [nameserver-port]
+ \note Setting the port number to any value other than the default (53) can
+ cause the name resolution to fail, depending on the operating system
+ limitations and firewalls. Notably, the Windows API used by QDnsLookup is
+ unable to handle alternate port numbers.
+//! [nameserver-port]
+*/
+QDnsLookup::QDnsLookup(Type type, const QString &name, const QHostAddress &nameserver, quint16 port, QObject *parent)
: QObject(*new QDnsLookupPrivate, parent)
{
Q_D(QDnsLookup);
- qRegisterMetaType<QDnsLookupReply>();
d->name = name;
d->type = type;
+ d->port = port;
d->nameserver = nameserver;
}
@@ -344,6 +343,10 @@ bool QDnsLookup::isFinished() const
\property QDnsLookup::name
\brief the name to lookup.
+ If the name to look up is empty, QDnsLookup will attempt to resolve the
+ root domain of DNS. That query is usually performed with QDnsLookup::type
+ set to \l{QDnsLookup::Type}{NS}.
+
\note The name will be encoded using IDNA, which means it's unsuitable for
querying SRV records compatible with the DNS-SD specification.
*/
@@ -410,6 +413,46 @@ QBindable<QHostAddress> QDnsLookup::bindableNameserver()
}
/*!
+ \property QDnsLookup::nameserverPort
+ \since 6.6
+ \brief the port number of nameserver to use for DNS lookup.
+ \include qdnslookup.cpp nameserver-port
+*/
+
+quint16 QDnsLookup::nameserverPort() const
+{
+ return d_func()->port;
+}
+
+void QDnsLookup::setNameserverPort(quint16 nameserverPort)
+{
+ Q_D(QDnsLookup);
+ d->port = nameserverPort;
+}
+
+QBindable<quint16> QDnsLookup::bindableNameserverPort()
+{
+ Q_D(QDnsLookup);
+ return &d->port;
+}
+
+/*!
+ \since 6.6
+ Sets the nameserver to \a nameserver and the port to \a port.
+
+ \include qdnslookup.cpp nameserver-port
+
+ \sa QDnsLookup::nameserver, QDnsLookup::nameserverPort
+*/
+void QDnsLookup::setNameserver(const QHostAddress &nameserver, quint16 port)
+{
+ Qt::beginPropertyUpdateGroup();
+ setNameserver(nameserver);
+ setNameserverPort(port);
+ Qt::endPropertyUpdateGroup();
+}
+
+/*!
Returns the list of canonical name records associated with this lookup.
*/
@@ -510,13 +553,29 @@ void QDnsLookup::lookup()
Q_D(QDnsLookup);
d->isFinished = false;
d->reply = QDnsLookupReply();
- d->runnable = new QDnsLookupRunnable(d->type, QUrl::toAce(d->name), d->nameserver);
- connect(d->runnable, SIGNAL(finished(QDnsLookupReply)),
- this, SLOT(_q_lookupFinished(QDnsLookupReply)),
- Qt::BlockingQueuedConnection);
-#if QT_CONFIG(thread)
- theDnsLookupThreadPool()->start(d->runnable);
+ if (!QCoreApplication::instance()) {
+ // NOT qCWarning because this isn't a result of the lookup
+ qWarning("QDnsLookup requires a QCoreApplication");
+ return;
+ }
+
+ auto l = [this](const QDnsLookupReply &reply) {
+ Q_D(QDnsLookup);
+ if (d->runnable == sender()) {
+#ifdef QDNSLOOKUP_DEBUG
+ qDebug("DNS reply for %s: %i (%s)", qPrintable(d->name), reply.error, qPrintable(reply.errorString));
#endif
+ d->reply = reply;
+ d->runnable = nullptr;
+ d->isFinished = true;
+ emit finished();
+ }
+ };
+
+ d->runnable = new QDnsLookupRunnable(d);
+ connect(d->runnable, &QDnsLookupRunnable::finished, this, l,
+ Qt::BlockingQueuedConnection);
+ theDnsLookupThreadPool->start(d->runnable);
}
/*!
@@ -993,18 +1052,26 @@ QDnsTextRecord &QDnsTextRecord::operator=(const QDnsTextRecord &other)
very fast and never fails.
*/
-void QDnsLookupPrivate::_q_lookupFinished(const QDnsLookupReply &_reply)
+static QDnsLookupRunnable::EncodedLabel encodeLabel(const QString &label)
{
- Q_Q(QDnsLookup);
- if (runnable == q->sender()) {
-#ifdef QDNSLOOKUP_DEBUG
- qDebug("DNS reply for %s: %i (%s)", qPrintable(name), _reply.error, qPrintable(_reply.errorString));
+ QDnsLookupRunnable::EncodedLabel::value_type rootDomain = u'.';
+ if (label.isEmpty())
+ return QDnsLookupRunnable::EncodedLabel(1, rootDomain);
+
+ QString encodedLabel = qt_ACE_do(label, ToAceOnly, ForbidLeadingDot);
+#ifdef Q_OS_WIN
+ return encodedLabel;
+#else
+ return std::move(encodedLabel).toLatin1();
#endif
- reply = _reply;
- runnable = nullptr;
- isFinished = true;
- emit q->finished();
- }
+}
+
+inline QDnsLookupRunnable::QDnsLookupRunnable(const QDnsLookupPrivate *d)
+ : requestName(encodeLabel(d->name)),
+ nameserver(d->nameserver),
+ requestType(d->type),
+ port(d->port)
+{
}
void QDnsLookupRunnable::run()
@@ -1012,60 +1079,54 @@ void QDnsLookupRunnable::run()
QDnsLookupReply reply;
// Validate input.
- if (requestName.isEmpty()) {
+ if (qsizetype n = requestName.size(); n > MaxDomainNameLength || n == 0) {
reply.error = QDnsLookup::InvalidRequestError;
- reply.errorString = tr("Invalid domain name");
- emit finished(reply);
- return;
+ reply.errorString = QDnsLookup::tr("Invalid domain name");
+ } else {
+ // Perform request.
+ query(&reply);
+
+ // Sort results.
+ qt_qdnsmailexchangerecord_sort(reply.mailExchangeRecords);
+ qt_qdnsservicerecord_sort(reply.serviceRecords);
}
- // Perform request.
- query(requestType, requestName, nameserver, &reply);
-
- // Sort results.
- qt_qdnsmailexchangerecord_sort(reply.mailExchangeRecords);
- qt_qdnsservicerecord_sort(reply.serviceRecords);
-
emit finished(reply);
-}
-
-#if QT_CONFIG(thread)
-QDnsLookupThreadPool::QDnsLookupThreadPool()
- : signalsConnected(false)
-{
- // Run up to 5 lookups in parallel.
- setMaxThreadCount(5);
-}
-
-void QDnsLookupThreadPool::start(QRunnable *runnable)
-{
- // Ensure threads complete at application destruction.
- if (!signalsConnected) {
- QMutexLocker signalsLocker(&signalsMutex);
- if (!signalsConnected) {
- QCoreApplication *app = QCoreApplication::instance();
- if (!app) {
- qWarning("QDnsLookup requires a QCoreApplication");
- delete runnable;
- return;
- }
- moveToThread(app->thread());
- connect(app, SIGNAL(destroyed()),
- SLOT(_q_applicationDestroyed()), Qt::DirectConnection);
- signalsConnected = true;
- }
+ // maybe print the lookup error as warning
+ switch (reply.error) {
+ case QDnsLookup::NoError:
+ case QDnsLookup::OperationCancelledError:
+ case QDnsLookup::NotFoundError:
+ case QDnsLookup::ServerFailureError:
+ case QDnsLookup::ServerRefusedError:
+ case QDnsLookup::TimeoutError:
+ break; // no warning for these
+
+ case QDnsLookup::ResolverError:
+ case QDnsLookup::InvalidRequestError:
+ case QDnsLookup::InvalidReplyError:
+ qCWarning(lcDnsLookup()).nospace()
+ << "DNS lookup failed (" << reply.error << "): "
+ << qUtf16Printable(reply.errorString)
+ << "; request was " << this; // continues below
}
-
- QThreadPool::start(runnable);
}
-void QDnsLookupThreadPool::_q_applicationDestroyed()
+inline QDebug operator<<(QDebug &d, QDnsLookupRunnable *r)
{
- waitForDone();
- signalsConnected = false;
+ // continued: print the information about the request
+ d << r->requestName.left(MaxDomainNameLength);
+ if (r->requestName.size() > MaxDomainNameLength)
+ d << "... (truncated)";
+ d << " type " << r->requestType;
+ if (!r->nameserver.isNull())
+ d << " to nameserver " << qUtf16Printable(r->nameserver.toString())
+ << " port " << (r->port ? r->port : DnsPort);
+ return d;
}
-#endif // QT_CONFIG(thread)
+
QT_END_NAMESPACE
#include "moc_qdnslookup.cpp"
+#include "moc_qdnslookup_p.cpp"
diff --git a/src/network/kernel/qdnslookup.h b/src/network/kernel/qdnslookup.h
index 89d617a92e..ae89a0a11f 100644
--- a/src/network/kernel/qdnslookup.h
+++ b/src/network/kernel/qdnslookup.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Jeremy Lainé <jeremy.laine@m4x.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2012 Jeremy Lainé <jeremy.laine@m4x.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QDNSLOOKUP_H
#define QDNSLOOKUP_H
@@ -44,7 +8,6 @@
#include <QtCore/qlist.h>
#include <QtCore/qobject.h>
#include <QtCore/qshareddata.h>
-#include <QtCore/qsharedpointer.h>
#include <QtCore/qstring.h>
#include <QtCore/qproperty.h>
@@ -69,7 +32,7 @@ public:
QDnsDomainNameRecord &operator=(const QDnsDomainNameRecord &other);
~QDnsDomainNameRecord();
- void swap(QDnsDomainNameRecord &other) noexcept { qSwap(d, other.d); }
+ void swap(QDnsDomainNameRecord &other) noexcept { d.swap(other.d); }
QString name() const;
quint32 timeToLive() const;
@@ -91,7 +54,7 @@ public:
QDnsHostAddressRecord &operator=(const QDnsHostAddressRecord &other);
~QDnsHostAddressRecord();
- void swap(QDnsHostAddressRecord &other) noexcept { qSwap(d, other.d); }
+ void swap(QDnsHostAddressRecord &other) noexcept { d.swap(other.d); }
QString name() const;
quint32 timeToLive() const;
@@ -113,7 +76,7 @@ public:
QDnsMailExchangeRecord &operator=(const QDnsMailExchangeRecord &other);
~QDnsMailExchangeRecord();
- void swap(QDnsMailExchangeRecord &other) noexcept { qSwap(d, other.d); }
+ void swap(QDnsMailExchangeRecord &other) noexcept { d.swap(other.d); }
QString exchange() const;
QString name() const;
@@ -136,7 +99,7 @@ public:
QDnsServiceRecord &operator=(const QDnsServiceRecord &other);
~QDnsServiceRecord();
- void swap(QDnsServiceRecord &other) noexcept { qSwap(d, other.d); }
+ void swap(QDnsServiceRecord &other) noexcept { d.swap(other.d); }
QString name() const;
quint16 port() const;
@@ -161,7 +124,7 @@ public:
QDnsTextRecord &operator=(const QDnsTextRecord &other);
~QDnsTextRecord();
- void swap(QDnsTextRecord &other) noexcept { qSwap(d, other.d); }
+ void swap(QDnsTextRecord &other) noexcept { d.swap(other.d); }
QString name() const;
quint32 timeToLive() const;
@@ -183,6 +146,8 @@ class Q_NETWORK_EXPORT QDnsLookup : public QObject
Q_PROPERTY(Type type READ type WRITE setType NOTIFY typeChanged BINDABLE bindableType)
Q_PROPERTY(QHostAddress nameserver READ nameserver WRITE setNameserver NOTIFY nameserverChanged
BINDABLE bindableNameserver)
+ Q_PROPERTY(quint16 nameserverPort READ nameserverPort WRITE setNameserverPort
+ NOTIFY nameserverPortChanged BINDABLE bindableNameserverPort)
public:
enum Error
@@ -194,7 +159,8 @@ public:
InvalidReplyError,
ServerFailureError,
ServerRefusedError,
- NotFoundError
+ NotFoundError,
+ TimeoutError,
};
Q_ENUM(Error)
@@ -215,6 +181,8 @@ public:
explicit QDnsLookup(QObject *parent = nullptr);
QDnsLookup(Type type, const QString &name, QObject *parent = nullptr);
QDnsLookup(Type type, const QString &name, const QHostAddress &nameserver, QObject *parent = nullptr);
+ QDnsLookup(Type type, const QString &name, const QHostAddress &nameserver, quint16 port,
+ QObject *parent = nullptr);
~QDnsLookup();
Error error() const;
@@ -232,6 +200,10 @@ public:
QHostAddress nameserver() const;
void setNameserver(const QHostAddress &nameserver);
QBindable<QHostAddress> bindableNameserver();
+ quint16 nameserverPort() const;
+ void setNameserverPort(quint16 port);
+ QBindable<quint16> bindableNameserverPort();
+ void setNameserver(const QHostAddress &nameserver, quint16 port);
QList<QDnsDomainNameRecord> canonicalNameRecords() const;
QList<QDnsHostAddressRecord> hostAddressRecords() const;
@@ -251,10 +223,10 @@ Q_SIGNALS:
void nameChanged(const QString &name);
void typeChanged(Type type);
void nameserverChanged(const QHostAddress &nameserver);
+ void nameserverPortChanged(quint16 port);
private:
Q_DECLARE_PRIVATE(QDnsLookup)
- Q_PRIVATE_SLOT(d_func(), void _q_lookupFinished(const QDnsLookupReply &reply))
};
QT_END_NAMESPACE
diff --git a/src/network/kernel/qdnslookup_android.cpp b/src/network/kernel/qdnslookup_android.cpp
deleted file mode 100644
index 131fc56298..0000000000
--- a/src/network/kernel/qdnslookup_android.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Collabora Ltd, author <robin.burchell@collabora.co.uk>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qdnslookup_p.h"
-
-QT_BEGIN_NAMESPACE
-
-void QDnsLookupRunnable::query(const int requestType, const QByteArray &requestName, const QHostAddress &nameserver, QDnsLookupReply *reply)
-{
- Q_UNUSED(requestType);
- Q_UNUSED(requestName);
- Q_UNUSED(nameserver);
- Q_UNUSED(reply);
- qWarning("Not yet supported on Android");
- reply->error = QDnsLookup::ResolverError;
- reply->errorString = tr("Not yet supported on Android");
- return;
-}
-
-QT_END_NAMESPACE
diff --git a/src/network/kernel/qdnslookup_dummy.cpp b/src/network/kernel/qdnslookup_dummy.cpp
new file mode 100644
index 0000000000..6cc6ed92c5
--- /dev/null
+++ b/src/network/kernel/qdnslookup_dummy.cpp
@@ -0,0 +1,15 @@
+// Copyright (C) 2012 Collabora Ltd, author <robin.burchell@collabora.co.uk>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qdnslookup_p.h"
+
+QT_BEGIN_NAMESPACE
+
+void QDnsLookupRunnable::query(QDnsLookupReply *reply)
+{
+ reply->error = QDnsLookup::ResolverError;
+ reply->errorString = tr("Not yet supported on this OS");
+ return;
+}
+
+QT_END_NAMESPACE
diff --git a/src/network/kernel/qdnslookup_p.h b/src/network/kernel/qdnslookup_p.h
index 41901cffc8..da4721411b 100644
--- a/src/network/kernel/qdnslookup_p.h
+++ b/src/network/kernel/qdnslookup_p.h
@@ -1,41 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Jeremy Lainé <jeremy.laine@m4x.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2012 Jeremy Lainé <jeremy.laine@m4x.org>
+// Copyright (C) 2023 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QDNSLOOKUP_P_H
#define QDNSLOOKUP_P_H
@@ -54,13 +19,13 @@
#include <QtNetwork/private/qtnetworkglobal_p.h>
#include "QtCore/qmutex.h"
#include "QtCore/qrunnable.h"
-#include "QtCore/qsharedpointer.h"
#if QT_CONFIG(thread)
#include "QtCore/qthreadpool.h"
#endif
#include "QtNetwork/qdnslookup.h"
#include "QtNetwork/qhostaddress.h"
#include "private/qobject_p.h"
+#include "private/qurl_p.h"
QT_REQUIRE_CONFIG(dnslookup);
@@ -68,16 +33,16 @@ QT_BEGIN_NAMESPACE
//#define QDNSLOOKUP_DEBUG
+constexpr qsizetype MaxDomainNameLength = 255;
+constexpr quint16 DnsPort = 53;
+
class QDnsLookupRunnable;
+QDebug operator<<(QDebug &, QDnsLookupRunnable *);
class QDnsLookupReply
{
public:
- QDnsLookupReply()
- : error(QDnsLookup::NoError)
- { }
-
- QDnsLookup::Error error;
+ QDnsLookup::Error error = QDnsLookup::NoError;
QString errorString;
QList<QDnsDomainNameRecord> canonicalNameRecords;
@@ -87,23 +52,86 @@ public:
QList<QDnsDomainNameRecord> pointerRecords;
QList<QDnsServiceRecord> serviceRecords;
QList<QDnsTextRecord> textRecords;
+
+ // helper methods
+ void setError(QDnsLookup::Error err, QString &&msg)
+ {
+ error = err;
+ errorString = std::move(msg);
+ }
+
+ void makeResolverSystemError(int code = -1)
+ {
+ Q_ASSERT(allAreEmpty());
+ setError(QDnsLookup::ResolverError, qt_error_string(code));
+ }
+
+ void makeTimeoutError()
+ {
+ Q_ASSERT(allAreEmpty());
+ setError(QDnsLookup::TimeoutError, QDnsLookup::tr("Request timed out"));
+ }
+
+ void makeDnsRcodeError(quint8 rcode)
+ {
+ Q_ASSERT(allAreEmpty());
+ switch (rcode) {
+ case 1: // FORMERR
+ error = QDnsLookup::InvalidRequestError;
+ errorString = QDnsLookup::tr("Server could not process query");
+ return;
+ case 2: // SERVFAIL
+ case 4: // NOTIMP
+ error = QDnsLookup::ServerFailureError;
+ errorString = QDnsLookup::tr("Server failure");
+ return;
+ case 3: // NXDOMAIN
+ error = QDnsLookup::NotFoundError;
+ errorString = QDnsLookup::tr("Non existent domain");
+ return;
+ case 5: // REFUSED
+ error = QDnsLookup::ServerRefusedError;
+ errorString = QDnsLookup::tr("Server refused to answer");
+ return;
+ default:
+ error = QDnsLookup::InvalidReplyError;
+ errorString = QDnsLookup::tr("Invalid reply received (rcode %1)")
+ .arg(rcode);
+ return;
+ }
+ }
+
+ void makeInvalidReplyError(QString &&msg = QString())
+ {
+ if (msg.isEmpty())
+ msg = QDnsLookup::tr("Invalid reply received");
+ else
+ msg = QDnsLookup::tr("Invalid reply received (%1)").arg(std::move(msg));
+ *this = QDnsLookupReply(); // empty our lists
+ setError(QDnsLookup::InvalidReplyError, std::move(msg));
+ }
+
+private:
+ bool allAreEmpty() const
+ {
+ return canonicalNameRecords.isEmpty()
+ && hostAddressRecords.isEmpty()
+ && mailExchangeRecords.isEmpty()
+ && nameServerRecords.isEmpty()
+ && pointerRecords.isEmpty()
+ && serviceRecords.isEmpty()
+ && textRecords.isEmpty();
+ }
};
class QDnsLookupPrivate : public QObjectPrivate
{
public:
QDnsLookupPrivate()
- : isFinished(false)
- , type(QDnsLookup::A)
- , runnable(nullptr)
+ : type(QDnsLookup::A)
+ , port(DnsPort)
{ }
- void _q_lookupFinished(const QDnsLookupReply &reply);
-
- static const char *msgNoIpV6NameServerAdresses;
-
- bool isFinished;
-
void nameChanged()
{
emit q_func()->nameChanged(name);
@@ -111,6 +139,13 @@ public:
Q_OBJECT_BINDABLE_PROPERTY(QDnsLookupPrivate, QString, name,
&QDnsLookupPrivate::nameChanged);
+ void nameserverChanged()
+ {
+ emit q_func()->nameserverChanged(nameserver);
+ }
+ Q_OBJECT_BINDABLE_PROPERTY(QDnsLookupPrivate, QHostAddress, nameserver,
+ &QDnsLookupPrivate::nameserverChanged);
+
void typeChanged()
{
emit q_func()->typeChanged(type);
@@ -119,15 +154,18 @@ public:
Q_OBJECT_BINDABLE_PROPERTY(QDnsLookupPrivate, QDnsLookup::Type,
type, &QDnsLookupPrivate::typeChanged);
- void nameserverChanged()
+ void nameserverPortChanged()
{
- emit q_func()->nameserverChanged(nameserver);
+ emit q_func()->nameserverPortChanged(port);
}
- Q_OBJECT_BINDABLE_PROPERTY(QDnsLookupPrivate, QHostAddress, nameserver,
- &QDnsLookupPrivate::nameserverChanged);
+
+ Q_OBJECT_BINDABLE_PROPERTY(QDnsLookupPrivate, quint16,
+ port, &QDnsLookupPrivate::nameserverPortChanged);
+
QDnsLookupReply reply;
- QDnsLookupRunnable *runnable;
+ QDnsLookupRunnable *runnable = nullptr;
+ bool isFinished = false;
Q_DECLARE_PUBLIC(QDnsLookup)
};
@@ -137,40 +175,31 @@ class QDnsLookupRunnable : public QObject, public QRunnable
Q_OBJECT
public:
- QDnsLookupRunnable(QDnsLookup::Type type, const QByteArray &name, const QHostAddress &nameserver)
- : requestType(type)
- , requestName(name)
- , nameserver(nameserver)
- { }
+#ifdef Q_OS_WIN
+ using EncodedLabel = QString;
+#else
+ using EncodedLabel = QByteArray;
+#endif
+
+ QDnsLookupRunnable(const QDnsLookupPrivate *d);
void run() override;
signals:
void finished(const QDnsLookupReply &reply);
private:
- static void query(const int requestType, const QByteArray &requestName, const QHostAddress &nameserver, QDnsLookupReply *reply);
- QDnsLookup::Type requestType;
- QByteArray requestName;
- QHostAddress nameserver;
-};
-
-#if QT_CONFIG(thread)
-class QDnsLookupThreadPool : public QThreadPool
-{
- Q_OBJECT
-
-public:
- QDnsLookupThreadPool();
- void start(QRunnable *runnable);
-
-private slots:
- void _q_applicationDestroyed();
+ template <typename T> static QString decodeLabel(T encodedLabel)
+ {
+ return qt_ACE_do(encodedLabel.toString(), NormalizeAce, ForbidLeadingDot);
+ }
+ void query(QDnsLookupReply *reply);
-private:
- QMutex signalsMutex;
- bool signalsConnected;
+ EncodedLabel requestName;
+ QHostAddress nameserver;
+ QDnsLookup::Type requestType;
+ quint16 port;
+ friend QDebug operator<<(QDebug &, QDnsLookupRunnable *);
};
-#endif // QT_CONFIG(thread)
class QDnsRecordPrivate : public QSharedData
{
@@ -238,6 +267,4 @@ public:
QT_END_NAMESPACE
-Q_DECLARE_METATYPE(QDnsLookupReply)
-
#endif // QDNSLOOKUP_P_H
diff --git a/src/network/kernel/qdnslookup_unix.cpp b/src/network/kernel/qdnslookup_unix.cpp
index 1449c32937..5696a3ca70 100644
--- a/src/network/kernel/qdnslookup_unix.cpp
+++ b/src/network/kernel/qdnslookup_unix.cpp
@@ -1,421 +1,392 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Jeremy Lainé <jeremy.laine@m4x.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2012 Jeremy Lainé <jeremy.laine@m4x.org>
+// Copyright (C) 2023 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qdnslookup_p.h"
-#if QT_CONFIG(library)
-#include <qlibrary.h>
-#endif
-#include <qvarlengtharray.h>
+#include <qendian.h>
#include <qscopedpointer.h>
#include <qurl.h>
-#include <private/qnativesocketengine_p.h>
+#include <qvarlengtharray.h>
+#include <private/qnativesocketengine_p.h> // for setSockAddr
+#include <private/qtnetwork-config_p.h>
+
+QT_REQUIRE_CONFIG(libresolv);
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
-#if !defined(Q_OS_OPENBSD)
+#if __has_include(<arpa/nameser_compat.h>)
# include <arpa/nameser_compat.h>
#endif
+#include <errno.h>
#include <resolv.h>
-#if defined(__GNU_LIBRARY__) && !defined(__UCLIBC__)
-# include <gnu/lib-names.h>
-#endif
+#include <array>
-#if defined(Q_OS_FREEBSD) || QT_CONFIG(dlopen)
-# include <dlfcn.h>
+#ifndef T_OPT
+// the older arpa/nameser_compat.h wasn't updated between 1999 and 2016 in glibc
+# define T_OPT ns_t_opt
#endif
-#include <cstring>
-
QT_BEGIN_NAMESPACE
-#if QT_CONFIG(library)
+using namespace Qt::StringLiterals;
-#if defined(Q_OS_OPENBSD)
-typedef struct __res_state* res_state;
-#endif
-typedef int (*dn_expand_proto)(const unsigned char *, const unsigned char *, const unsigned char *, char *, int);
-static dn_expand_proto local_dn_expand = nullptr;
-typedef void (*res_nclose_proto)(res_state);
-static res_nclose_proto local_res_nclose = nullptr;
-typedef int (*res_ninit_proto)(res_state);
-static res_ninit_proto local_res_ninit = nullptr;
-typedef int (*res_nquery_proto)(res_state, const char *, int, int, unsigned char *, int);
-static res_nquery_proto local_res_nquery = nullptr;
-
-// Custom deleter to close resolver state.
-
-struct QDnsLookupStateDeleter
-{
- static inline void cleanup(struct __res_state *pointer)
- {
- local_res_nclose(pointer);
- }
+// minimum IPv6 MTU (1280) minus the IPv6 (40) and UDP headers (8)
+static constexpr qsizetype ReplyBufferSize = 1280 - 40 - 8;
+
+// https://www.rfc-editor.org/rfc/rfc6891
+static constexpr unsigned char Edns0Record[] = {
+ 0x00, // root label
+ T_OPT >> 8, T_OPT & 0xff, // type OPT
+ ReplyBufferSize >> 8, ReplyBufferSize & 0xff, // payload size
+ NOERROR, // extended rcode
+ 0, // version
+ 0x00, 0x00, // flags
+ 0x00, 0x00, // option length
};
-static QFunctionPointer resolveSymbol(QLibrary &lib, const char *sym)
-{
- if (lib.isLoaded())
- return lib.resolve(sym);
+// maximum length of a EDNS0 query with a 255-character domain (rounded up to 16)
+static constexpr qsizetype QueryBufferSize =
+ HFIXEDSZ + QFIXEDSZ + MAXCDNAME + 1 + sizeof(Edns0Record);
+using QueryBuffer = std::array<unsigned char, (QueryBufferSize + 15) / 16 * 16>;
-#if defined(RTLD_DEFAULT) && (defined(Q_OS_FREEBSD) || QT_CONFIG(dlopen))
- return reinterpret_cast<QFunctionPointer>(dlsym(RTLD_DEFAULT, sym));
-#else
- return nullptr;
-#endif
+namespace {
+struct QDnsCachedName
+{
+ QString name;
+ int code = 0;
+ QDnsCachedName(const QString &name, int code) : name(name), code(code) {}
+};
}
+Q_DECLARE_TYPEINFO(QDnsCachedName, Q_RELOCATABLE_TYPE);
+using Cache = QList<QDnsCachedName>; // QHash or QMap are overkill
-static bool resolveLibraryInternal()
+#if QT_CONFIG(res_setservers)
+// https://www.ibm.com/docs/en/i/7.3?topic=ssw_ibm_i_73/apis/ressetservers.html
+// https://docs.oracle.com/cd/E86824_01/html/E54774/res-setservers-3resolv.html
+static bool applyNameServer(res_state state, const QHostAddress &nameserver, quint16 port)
{
- QLibrary lib;
-#ifdef LIBRESOLV_SO
- lib.setFileName(QStringLiteral(LIBRESOLV_SO));
- if (!lib.load())
-#endif
- {
- lib.setFileName(QLatin1String("resolv"));
- lib.load();
+ if (!nameserver.isNull()) {
+ union res_sockaddr_union u;
+ setSockaddr(reinterpret_cast<sockaddr *>(&u.sin), nameserver, port);
+ res_setservers(state, &u, 1);
}
+ return true;
+}
+#else
+template <typename T> void setNsMap(T &ext, std::enable_if_t<sizeof(T::nsmap) != 0, uint16_t> v)
+{
+ // Set nsmap[] to indicate that nsaddrs[0] is an IPv6 address
+ // See: https://sourceware.org/ml/libc-hacker/2002-05/msg00035.html
+ // Unneeded since glibc 2.22 (2015), but doesn't hurt to set it
+ // See: https://sourceware.org/git/?p=glibc.git;a=commit;h=2212c1420c92a33b0e0bd9a34938c9814a56c0f7
+ ext.nsmap[0] = v;
+}
+template <typename T> void setNsMap(T &, ...)
+{
+ // fallback
+}
- local_dn_expand = dn_expand_proto(resolveSymbol(lib, "__dn_expand"));
- if (!local_dn_expand)
- local_dn_expand = dn_expand_proto(resolveSymbol(lib, "dn_expand"));
+template <bool Condition>
+using EnableIfIPv6 = std::enable_if_t<Condition, const QHostAddress *>;
- local_res_nclose = res_nclose_proto(resolveSymbol(lib, "__res_nclose"));
- if (!local_res_nclose)
- local_res_nclose = res_nclose_proto(resolveSymbol(lib, "res_9_nclose"));
- if (!local_res_nclose)
- local_res_nclose = res_nclose_proto(resolveSymbol(lib, "res_nclose"));
+template <typename State>
+bool setIpv6NameServer(State *state,
+ EnableIfIPv6<sizeof(std::declval<State>()._u._ext.nsaddrs) != 0> addr,
+ quint16 port)
+{
+ // glibc-like API to set IPv6 name servers
+ struct sockaddr_in6 *ns = state->_u._ext.nsaddrs[0];
+
+ // nsaddrs will be NULL if no nameserver is set in /etc/resolv.conf
+ if (!ns) {
+ // Memory allocated here will be free()'d in res_close() as we
+ // have done res_init() above.
+ ns = static_cast<struct sockaddr_in6*>(calloc(1, sizeof(struct sockaddr_in6)));
+ Q_CHECK_PTR(ns);
+ state->_u._ext.nsaddrs[0] = ns;
+ }
- local_res_ninit = res_ninit_proto(resolveSymbol(lib, "__res_ninit"));
- if (!local_res_ninit)
- local_res_ninit = res_ninit_proto(resolveSymbol(lib, "res_9_ninit"));
- if (!local_res_ninit)
- local_res_ninit = res_ninit_proto(resolveSymbol(lib, "res_ninit"));
+ setNsMap(state->_u._ext, MAXNS + 1);
+ state->_u._ext.nscount6 = 1;
+ setSockaddr(ns, *addr, port);
+ return true;
+}
- local_res_nquery = res_nquery_proto(resolveSymbol(lib, "__res_nquery"));
- if (!local_res_nquery)
- local_res_nquery = res_nquery_proto(resolveSymbol(lib, "res_9_nquery"));
- if (!local_res_nquery)
- local_res_nquery = res_nquery_proto(resolveSymbol(lib, "res_nquery"));
+template <typename State> bool setIpv6NameServer(State *, const void *, quint16)
+{
+ // fallback
+ return false;
+}
+static bool applyNameServer(res_state state, const QHostAddress &nameserver, quint16 port)
+{
+ if (nameserver.isNull())
+ return true;
+
+ state->nscount = 1;
+ state->nsaddr_list[0].sin_family = AF_UNSPEC;
+ if (nameserver.protocol() == QAbstractSocket::IPv6Protocol)
+ return setIpv6NameServer(state, &nameserver, port);
+ setSockaddr(&state->nsaddr_list[0], nameserver, port);
return true;
}
-Q_GLOBAL_STATIC_WITH_ARGS(bool, resolveLibrary, (resolveLibraryInternal()))
+#endif // !QT_CONFIG(res_setservers)
-void QDnsLookupRunnable::query(const int requestType, const QByteArray &requestName, const QHostAddress &nameserver, QDnsLookupReply *reply)
+static int
+prepareQueryBuffer(res_state state, QueryBuffer &buffer, const char *label, ns_rcode type)
{
- // Load dn_expand, res_ninit and res_nquery on demand.
- resolveLibrary();
-
- // If dn_expand, res_ninit or res_nquery is missing, fail.
- if (!local_dn_expand || !local_res_nclose || !local_res_ninit || !local_res_nquery) {
- reply->error = QDnsLookup::ResolverError;
- reply->errorString = tr("Resolver functions not found");
- return;
- }
+ // Create header and our query
+ int queryLength = res_nmkquery(state, QUERY, label, C_IN, type, nullptr, 0, nullptr,
+ buffer.data(), buffer.size());
+ Q_ASSERT(queryLength < int(buffer.size()));
+ if (Q_UNLIKELY(queryLength < 0))
+ return queryLength;
+
+ // Append EDNS0 record and set the number of additional RRs to 1
+ Q_ASSERT(queryLength + sizeof(Edns0Record) < buffer.size());
+ std::copy_n(std::begin(Edns0Record), sizeof(Edns0Record), buffer.begin() + queryLength);
+ reinterpret_cast<HEADER *>(buffer.data())->arcount = qToBigEndian<quint16>(1);
+
+ return queryLength + sizeof(Edns0Record);
+}
+void QDnsLookupRunnable::query(QDnsLookupReply *reply)
+{
// Initialize state.
- struct __res_state state;
- std::memset(&state, 0, sizeof(state));
- if (local_res_ninit(&state) < 0) {
- reply->error = QDnsLookup::ResolverError;
- reply->errorString = tr("Resolver initialization failed");
- return;
+ std::remove_pointer_t<res_state> state = {};
+ if (res_ninit(&state) < 0) {
+ int error = errno;
+ qErrnoWarning(error, "QDnsLookup: Resolver initialization failed");
+ return reply->makeResolverSystemError(error);
}
+ auto guard = qScopeGuard([&] { res_nclose(&state); });
//Check if a nameserver was set. If so, use it
- if (!nameserver.isNull()) {
- if (nameserver.protocol() == QAbstractSocket::IPv4Protocol) {
- state.nsaddr_list[0].sin_addr.s_addr = htonl(nameserver.toIPv4Address());
- state.nscount = 1;
- } else if (nameserver.protocol() == QAbstractSocket::IPv6Protocol) {
-#if defined(Q_OS_LINUX)
- struct sockaddr_in6 *ns;
- ns = state._u._ext.nsaddrs[0];
- // nsaddrs will be NULL if no nameserver is set in /etc/resolv.conf
- if (!ns) {
- // Memory allocated here will be free'd in res_close() as we
- // have done res_init() above.
- ns = (struct sockaddr_in6*) calloc(1, sizeof(struct sockaddr_in6));
- Q_CHECK_PTR(ns);
- state._u._ext.nsaddrs[0] = ns;
- }
-#ifndef __UCLIBC__
- // Set nsmap[] to indicate that nsaddrs[0] is an IPv6 address
- // See: https://sourceware.org/ml/libc-hacker/2002-05/msg00035.html
- state._u._ext.nsmap[0] = MAXNS + 1;
-#endif
- state._u._ext.nscount6 = 1;
- ns->sin6_family = AF_INET6;
- ns->sin6_port = htons(53);
- SetSALen::set(ns, sizeof(*ns));
-
- Q_IPV6ADDR ipv6Address = nameserver.toIPv6Address();
- for (int i=0; i<16; i++) {
- ns->sin6_addr.s6_addr[i] = ipv6Address[i];
- }
-#else
- qWarning("%s", QDnsLookupPrivate::msgNoIpV6NameServerAdresses);
- reply->error = QDnsLookup::ResolverError;
- reply->errorString = tr(QDnsLookupPrivate::msgNoIpV6NameServerAdresses);
- return;
-#endif
- }
- }
+ if (!applyNameServer(&state, nameserver, port))
+ return reply->setError(QDnsLookup::ResolverError,
+ QDnsLookup::tr("IPv6 nameservers are currently not supported on this OS"));
#ifdef QDNSLOOKUP_DEBUG
state.options |= RES_DEBUG;
#endif
- QScopedPointer<struct __res_state, QDnsLookupStateDeleter> state_ptr(&state);
+
+ // Prepare the DNS query.
+ QueryBuffer qbuffer;
+ int queryLength = prepareQueryBuffer(&state, qbuffer, requestName.constData(), ns_rcode(requestType));
+ if (Q_UNLIKELY(queryLength < 0))
+ return reply->makeResolverSystemError();
// Perform DNS query.
- QVarLengthArray<unsigned char, PACKETSZ> buffer(PACKETSZ);
- std::memset(buffer.data(), 0, buffer.size());
- int responseLength = local_res_nquery(&state, requestName, C_IN, requestType, buffer.data(), buffer.size());
- if (Q_UNLIKELY(responseLength > PACKETSZ)) {
- buffer.resize(responseLength);
- std::memset(buffer.data(), 0, buffer.size());
- responseLength = local_res_nquery(&state, requestName, C_IN, requestType, buffer.data(), buffer.size());
+ QVarLengthArray<unsigned char, ReplyBufferSize> buffer(ReplyBufferSize);
+ auto attemptToSend = [&]() {
+ std::memset(buffer.data(), 0, HFIXEDSZ); // the header is enough
+ int responseLength = res_nsend(&state, qbuffer.data(), queryLength, buffer.data(), buffer.size());
+ if (responseLength >= 0)
+ return responseLength; // success
+
+ // libresolv uses ETIMEDOUT for resolver errors ("no answer")
+ if (errno == ECONNREFUSED)
+ reply->setError(QDnsLookup::ServerRefusedError, qt_error_string());
+ else if (errno != ETIMEDOUT)
+ reply->makeResolverSystemError(); // some other error
+
+ auto query = reinterpret_cast<HEADER *>(qbuffer.data());
+ auto header = reinterpret_cast<HEADER *>(buffer.data());
+ if (query->id == header->id && header->qr)
+ reply->makeDnsRcodeError(header->rcode);
+ else
+ reply->makeTimeoutError(); // must really be a timeout
+ return -1;
+ };
+
+ // strictly use UDP, we'll deal with truncated replies ourselves
+ state.options |= RES_IGNTC;
+ int responseLength = attemptToSend();
+ if (responseLength < 0)
+ return;
+
+ // check if we need to use the virtual circuit (TCP)
+ auto header = reinterpret_cast<HEADER *>(buffer.data());
+ if (header->rcode == NOERROR && header->tc) {
+ // yes, increase our buffer size
+ buffer.resize(std::numeric_limits<quint16>::max());
+ header = reinterpret_cast<HEADER *>(buffer.data());
+
+ // remove the EDNS record in the query
+ reinterpret_cast<HEADER *>(qbuffer.data())->arcount = 0;
+ queryLength -= sizeof(Edns0Record);
+
+ // send using the virtual circuit
+ state.options |= RES_USEVC;
+ responseLength = attemptToSend();
if (Q_UNLIKELY(responseLength > buffer.size())) {
// Ok, we give up.
- reply->error = QDnsLookup::ResolverError;
- reply->errorString.clear(); // We cannot be more specific, alas.
- return;
+ return reply->setError(QDnsLookup::ResolverError,
+ QDnsLookup::tr("Reply was too large"));
}
}
-
- unsigned char *response = buffer.data();
- // Check the response header. Though res_nquery returns -1 as a
- // responseLength in case of error, we still can extract the
- // exact error code from the response.
- HEADER *header = (HEADER*)response;
- const int answerCount = ntohs(header->ancount);
- switch (header->rcode) {
- case NOERROR:
- break;
- case FORMERR:
- reply->error = QDnsLookup::InvalidRequestError;
- reply->errorString = tr("Server could not process query");
+ if (responseLength < 0)
return;
- case SERVFAIL:
- reply->error = QDnsLookup::ServerFailureError;
- reply->errorString = tr("Server failure");
- return;
- case NXDOMAIN:
- reply->error = QDnsLookup::NotFoundError;
- reply->errorString = tr("Non existent domain");
- return;
- case REFUSED:
- reply->error = QDnsLookup::ServerRefusedError;
- reply->errorString = tr("Server refused to answer");
- return;
- default:
- reply->error = QDnsLookup::InvalidReplyError;
- reply->errorString = tr("Invalid reply received");
- return;
- }
// Check the reply is valid.
- if (responseLength < int(sizeof(HEADER))) {
- reply->error = QDnsLookup::InvalidReplyError;
- reply->errorString = tr("Invalid reply received");
- return;
- }
+ if (responseLength < int(sizeof(HEADER)))
+ return reply->makeInvalidReplyError();
- // Skip the query host, type (2 bytes) and class (2 bytes).
- char host[PACKETSZ], answer[PACKETSZ];
- unsigned char *p = response + sizeof(HEADER);
- int status = local_dn_expand(response, response + responseLength, p, host, sizeof(host));
- if (status < 0) {
- reply->error = QDnsLookup::InvalidReplyError;
- reply->errorString = tr("Could not expand domain name");
- return;
+ // Parse the reply.
+ if (header->rcode)
+ return reply->makeDnsRcodeError(header->rcode);
+
+ qptrdiff offset = sizeof(HEADER);
+ unsigned char *response = buffer.data();
+ int status;
+
+ auto expandHost = [&, cache = Cache{}](qptrdiff offset) mutable {
+ if (uchar n = response[offset]; n & NS_CMPRSFLGS) {
+ // compressed name, see if we already have it cached
+ if (offset + 1 < responseLength) {
+ int id = ((n & ~NS_CMPRSFLGS) << 8) | response[offset + 1];
+ auto it = std::find_if(cache.constBegin(), cache.constEnd(),
+ [id](const QDnsCachedName &n) { return n.code == id; });
+ if (it != cache.constEnd()) {
+ status = 2;
+ return it->name;
+ }
+ }
+ }
+
+ // uncached, expand it
+ char host[MAXCDNAME + 1];
+ status = dn_expand(response, response + responseLength, response + offset,
+ host, sizeof(host));
+ if (status >= 0)
+ return cache.emplaceBack(decodeLabel(QLatin1StringView(host)), offset).name;
+
+ // failed
+ reply->makeInvalidReplyError(QDnsLookup::tr("Could not expand domain name"));
+ return QString();
+ };
+
+ if (ntohs(header->qdcount) == 1) {
+ // Skip the query host, type (2 bytes) and class (2 bytes).
+ expandHost(offset);
+ if (status < 0)
+ return;
+ if (offset + status + 4 >= responseLength)
+ header->qdcount = 0xffff; // invalid reply below
+ else
+ offset += status + 4;
}
- p += status + 4;
+ if (ntohs(header->qdcount) > 1)
+ return reply->makeInvalidReplyError();
// Extract results.
+ const int answerCount = ntohs(header->ancount);
int answerIndex = 0;
- while ((p < response + responseLength) && (answerIndex < answerCount)) {
- status = local_dn_expand(response, response + responseLength, p, host, sizeof(host));
- if (status < 0) {
- reply->error = QDnsLookup::InvalidReplyError;
- reply->errorString = tr("Could not expand domain name");
+ while ((offset < responseLength) && (answerIndex < answerCount)) {
+ const QString name = expandHost(offset);
+ if (status < 0)
return;
- }
- const QString name = QUrl::fromAce(host);
- p += status;
- const quint16 type = (p[0] << 8) | p[1];
- p += 2; // RR type
- p += 2; // RR class
- const quint32 ttl = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
- p += 4;
- const quint16 size = (p[0] << 8) | p[1];
- p += 2;
+ offset += status;
+ if (offset + RRFIXEDSZ > responseLength) {
+ // probably just a truncated reply, return what we have
+ return;
+ }
+ const quint16 type = qFromBigEndian<quint16>(response + offset);
+ const qint16 rrclass = qFromBigEndian<quint16>(response + offset + 2);
+ const quint32 ttl = qFromBigEndian<quint32>(response + offset + 4);
+ const quint16 size = qFromBigEndian<quint16>(response + offset + 8);
+ offset += RRFIXEDSZ;
+ if (offset + size > responseLength)
+ return; // truncated
+ if (rrclass != C_IN)
+ continue;
if (type == QDnsLookup::A) {
- if (size != 4) {
- reply->error = QDnsLookup::InvalidReplyError;
- reply->errorString = tr("Invalid IPv4 address record");
- return;
- }
- const quint32 addr = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
+ if (size != 4)
+ return reply->makeInvalidReplyError(QDnsLookup::tr("Invalid IPv4 address record"));
+ const quint32 addr = qFromBigEndian<quint32>(response + offset);
QDnsHostAddressRecord record;
record.d->name = name;
record.d->timeToLive = ttl;
record.d->value = QHostAddress(addr);
reply->hostAddressRecords.append(record);
} else if (type == QDnsLookup::AAAA) {
- if (size != 16) {
- reply->error = QDnsLookup::InvalidReplyError;
- reply->errorString = tr("Invalid IPv6 address record");
- return;
- }
+ if (size != 16)
+ return reply->makeInvalidReplyError(QDnsLookup::tr("Invalid IPv6 address record"));
QDnsHostAddressRecord record;
record.d->name = name;
record.d->timeToLive = ttl;
- record.d->value = QHostAddress(p);
+ record.d->value = QHostAddress(response + offset);
reply->hostAddressRecords.append(record);
} else if (type == QDnsLookup::CNAME) {
- status = local_dn_expand(response, response + responseLength, p, answer, sizeof(answer));
- if (status < 0) {
- reply->error = QDnsLookup::InvalidReplyError;
- reply->errorString = tr("Invalid canonical name record");
- return;
- }
QDnsDomainNameRecord record;
record.d->name = name;
record.d->timeToLive = ttl;
- record.d->value = QUrl::fromAce(answer);
+ record.d->value = expandHost(offset);
+ if (status < 0)
+ return reply->makeInvalidReplyError(QDnsLookup::tr("Invalid canonical name record"));
reply->canonicalNameRecords.append(record);
} else if (type == QDnsLookup::NS) {
- status = local_dn_expand(response, response + responseLength, p, answer, sizeof(answer));
- if (status < 0) {
- reply->error = QDnsLookup::InvalidReplyError;
- reply->errorString = tr("Invalid name server record");
- return;
- }
QDnsDomainNameRecord record;
record.d->name = name;
record.d->timeToLive = ttl;
- record.d->value = QUrl::fromAce(answer);
+ record.d->value = expandHost(offset);
+ if (status < 0)
+ return reply->makeInvalidReplyError(QDnsLookup::tr("Invalid name server record"));
reply->nameServerRecords.append(record);
} else if (type == QDnsLookup::PTR) {
- status = local_dn_expand(response, response + responseLength, p, answer, sizeof(answer));
- if (status < 0) {
- reply->error = QDnsLookup::InvalidReplyError;
- reply->errorString = tr("Invalid pointer record");
- return;
- }
QDnsDomainNameRecord record;
record.d->name = name;
record.d->timeToLive = ttl;
- record.d->value = QUrl::fromAce(answer);
+ record.d->value = expandHost(offset);
+ if (status < 0)
+ return reply->makeInvalidReplyError(QDnsLookup::tr("Invalid pointer record"));
reply->pointerRecords.append(record);
} else if (type == QDnsLookup::MX) {
- const quint16 preference = (p[0] << 8) | p[1];
- status = local_dn_expand(response, response + responseLength, p + 2, answer, sizeof(answer));
- if (status < 0) {
- reply->error = QDnsLookup::InvalidReplyError;
- reply->errorString = tr("Invalid mail exchange record");
- return;
- }
+ const quint16 preference = qFromBigEndian<quint16>(response + offset);
QDnsMailExchangeRecord record;
- record.d->exchange = QUrl::fromAce(answer);
+ record.d->exchange = expandHost(offset + 2);
record.d->name = name;
record.d->preference = preference;
record.d->timeToLive = ttl;
+ if (status < 0)
+ return reply->makeInvalidReplyError(QDnsLookup::tr("Invalid mail exchange record"));
reply->mailExchangeRecords.append(record);
} else if (type == QDnsLookup::SRV) {
- const quint16 priority = (p[0] << 8) | p[1];
- const quint16 weight = (p[2] << 8) | p[3];
- const quint16 port = (p[4] << 8) | p[5];
- status = local_dn_expand(response, response + responseLength, p + 6, answer, sizeof(answer));
- if (status < 0) {
- reply->error = QDnsLookup::InvalidReplyError;
- reply->errorString = tr("Invalid service record");
- return;
- }
+ const quint16 priority = qFromBigEndian<quint16>(response + offset);
+ const quint16 weight = qFromBigEndian<quint16>(response + offset + 2);
+ const quint16 port = qFromBigEndian<quint16>(response + offset + 4);
QDnsServiceRecord record;
record.d->name = name;
- record.d->target = QUrl::fromAce(answer);
+ record.d->target = expandHost(offset + 6);
record.d->port = port;
record.d->priority = priority;
record.d->timeToLive = ttl;
record.d->weight = weight;
+ if (status < 0)
+ return reply->makeInvalidReplyError(QDnsLookup::tr("Invalid service record"));
reply->serviceRecords.append(record);
} else if (type == QDnsLookup::TXT) {
- unsigned char *txt = p;
QDnsTextRecord record;
record.d->name = name;
record.d->timeToLive = ttl;
- while (txt < p + size) {
- const unsigned char length = *txt;
+ qptrdiff txt = offset;
+ while (txt < offset + size) {
+ const unsigned char length = response[txt];
txt++;
- if (txt + length > p + size) {
- reply->error = QDnsLookup::InvalidReplyError;
- reply->errorString = tr("Invalid text record");
- return;
- }
- record.d->values << QByteArray((char*)txt, length);
+ if (txt + length > offset + size)
+ return reply->makeInvalidReplyError(QDnsLookup::tr("Invalid text record"));
+ record.d->values << QByteArrayView(response + txt, length).toByteArray();
txt += length;
}
reply->textRecords.append(record);
}
- p += size;
+ offset += size;
answerIndex++;
}
}
-#else
-void QDnsLookupRunnable::query(const int requestType, const QByteArray &requestName, const QHostAddress &nameserver, QDnsLookupReply *reply)
-{
- Q_UNUSED(requestType);
- Q_UNUSED(requestName);
- Q_UNUSED(nameserver);
- reply->error = QDnsLookup::ResolverError;
- reply->errorString = tr("Resolver library can't be loaded: No runtime library loading support");
- return;
-}
-
-#endif /* QT_CONFIG(library) */
-
QT_END_NAMESPACE
diff --git a/src/network/kernel/qdnslookup_win.cpp b/src/network/kernel/qdnslookup_win.cpp
index 262893179c..72d5ae5c86 100644
--- a/src/network/kernel/qdnslookup_win.cpp
+++ b/src/network/kernel/qdnslookup_win.cpp
@@ -1,105 +1,115 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Jeremy Lainé <jeremy.laine@m4x.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2012 Jeremy Lainé <jeremy.laine@m4x.org>
+// Copyright (C) 2023 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <winsock2.h>
#include "qdnslookup_p.h"
#include <qurl.h>
+#include <private/qnativesocketengine_p.h>
#include <private/qsystemerror_p.h>
#include <qt_windows.h>
#include <windns.h>
#include <memory.h>
+#ifndef DNS_ADDR_MAX_SOCKADDR_LENGTH
+// MinGW headers are missing almost all of this
+typedef struct Qt_DnsAddr {
+ CHAR MaxSa[32];
+ DWORD DnsAddrUserDword[8];
+} DNS_ADDR, *PDNS_ADDR;
+typedef struct Qt_DnsAddrArray {
+ DWORD MaxCount;
+ DWORD AddrCount;
+ DWORD Tag;
+ WORD Family;
+ WORD WordReserved;
+ DWORD Flags;
+ DWORD MatchFlag;
+ DWORD Reserved1;
+ DWORD Reserved2;
+ DNS_ADDR AddrArray[];
+} DNS_ADDR_ARRAY, *PDNS_ADDR_ARRAY;
+# ifndef DNS_QUERY_RESULTS_VERSION1
+typedef struct Qt_DNS_QUERY_RESULT {
+ ULONG Version;
+ DNS_STATUS QueryStatus;
+ ULONG64 QueryOptions;
+ PDNS_RECORD pQueryRecords;
+ PVOID Reserved;
+} DNS_QUERY_RESULT, *PDNS_QUERY_RESULT;
+typedef VOID WINAPI DNS_QUERY_COMPLETION_ROUTINE(PVOID pQueryContext,PDNS_QUERY_RESULT pQueryResults);
+typedef DNS_QUERY_COMPLETION_ROUTINE *PDNS_QUERY_COMPLETION_ROUTINE;
+# endif
+typedef struct Qt_DNS_QUERY_REQUEST {
+ ULONG Version;
+ PCWSTR QueryName;
+ WORD QueryType;
+ ULONG64 QueryOptions;
+ PDNS_ADDR_ARRAY pDnsServerList;
+ ULONG InterfaceIndex;
+ PDNS_QUERY_COMPLETION_ROUTINE pQueryCompletionCallback;
+ PVOID pQueryContext;
+} DNS_QUERY_REQUEST, *PDNS_QUERY_REQUEST;
+
+typedef void *PDNS_QUERY_CANCEL; // not really, but we don't need it
+extern "C" {
+DNS_STATUS WINAPI DnsQueryEx(PDNS_QUERY_REQUEST pQueryRequest,
+ PDNS_QUERY_RESULT pQueryResults,
+ PDNS_QUERY_CANCEL pCancelHandle);
+}
+#endif
+
QT_BEGIN_NAMESPACE
-void QDnsLookupRunnable::query(const int requestType, const QByteArray &requestName, const QHostAddress &nameserver, QDnsLookupReply *reply)
+void QDnsLookupRunnable::query(QDnsLookupReply *reply)
{
// Perform DNS query.
- PDNS_RECORD dns_records = 0;
- const QString requestNameUtf16 = QString::fromUtf8(requestName.data(), requestName.size());
- IP4_ARRAY srvList;
- memset(&srvList, 0, sizeof(IP4_ARRAY));
+ alignas(DNS_ADDR_ARRAY) uchar dnsAddresses[sizeof(DNS_ADDR_ARRAY) + sizeof(DNS_ADDR)];
+ DNS_QUERY_REQUEST request = {};
+ request.Version = 1;
+ request.QueryName = reinterpret_cast<const wchar_t *>(requestName.constData());
+ request.QueryType = requestType;
+ request.QueryOptions = DNS_QUERY_STANDARD | DNS_QUERY_TREAT_AS_FQDN;
+
if (!nameserver.isNull()) {
- if (nameserver.protocol() == QAbstractSocket::IPv4Protocol) {
- // The below code is referenced from: http://support.microsoft.com/kb/831226
- srvList.AddrCount = 1;
- srvList.AddrArray[0] = htonl(nameserver.toIPv4Address());
- } else if (nameserver.protocol() == QAbstractSocket::IPv6Protocol) {
- // For supoprting IPv6 nameserver addresses, we'll need to switch
- // from DnsQuey() to DnsQueryEx() as it supports passing an IPv6
- // address in the nameserver list
- qWarning("%s", QDnsLookupPrivate::msgNoIpV6NameServerAdresses);
- reply->error = QDnsLookup::ResolverError;
- reply->errorString = tr(QDnsLookupPrivate::msgNoIpV6NameServerAdresses);
- return;
- }
- }
- const DNS_STATUS status = DnsQuery_W(reinterpret_cast<const wchar_t*>(requestNameUtf16.utf16()), requestType, DNS_QUERY_STANDARD, &srvList, &dns_records, NULL);
- switch (status) {
- case ERROR_SUCCESS:
- break;
- case DNS_ERROR_RCODE_FORMAT_ERROR:
- reply->error = QDnsLookup::InvalidRequestError;
- reply->errorString = tr("Server could not process query");
- return;
- case DNS_ERROR_RCODE_SERVER_FAILURE:
- reply->error = QDnsLookup::ServerFailureError;
- reply->errorString = tr("Server failure");
- return;
- case DNS_ERROR_RCODE_NAME_ERROR:
- reply->error = QDnsLookup::NotFoundError;
- reply->errorString = tr("Non existent domain");
- return;
- case DNS_ERROR_RCODE_REFUSED:
- reply->error = QDnsLookup::ServerRefusedError;
- reply->errorString = tr("Server refused to answer");
- return;
- default:
- reply->error = QDnsLookup::InvalidReplyError;
- reply->errorString = QSystemError(status, QSystemError::NativeError).toString();
- return;
+ memset(dnsAddresses, 0, sizeof(dnsAddresses));
+ request.pDnsServerList = new (dnsAddresses) DNS_ADDR_ARRAY;
+ auto addr = new (request.pDnsServerList->AddrArray) DNS_ADDR[1];
+ auto sa = new (addr[0].MaxSa) sockaddr;
+ request.pDnsServerList->MaxCount = sizeof(dnsAddresses);
+ request.pDnsServerList->AddrCount = 1;
+ // ### setting port 53 seems to cause some systems to fail
+ setSockaddr(sa, nameserver, port == DnsPort ? 0 : port);
+ request.pDnsServerList->Family = sa->sa_family;
}
+ DNS_QUERY_RESULT results = {};
+ results.Version = 1;
+ const DNS_STATUS status = DnsQueryEx(&request, &results, nullptr);
+ if (status >= DNS_ERROR_RCODE_FORMAT_ERROR && status <= DNS_ERROR_RCODE_LAST)
+ return reply->makeDnsRcodeError(status - DNS_ERROR_RCODE_FORMAT_ERROR + 1);
+ else if (status == ERROR_TIMEOUT)
+ return reply->makeTimeoutError();
+ else if (status != ERROR_SUCCESS)
+ return reply->makeResolverSystemError(status);
+
+ QStringView lastEncodedName;
+ QString cachedDecodedName;
+ auto extractAndCacheHost = [&](QStringView name) -> const QString & {
+ lastEncodedName = name;
+ cachedDecodedName = decodeLabel(name);
+ return cachedDecodedName;
+ };
+ auto extractMaybeCachedHost = [&](QStringView name) -> const QString & {
+ return lastEncodedName == name ? cachedDecodedName : extractAndCacheHost(name);
+ };
+
// Extract results.
- for (PDNS_RECORD ptr = dns_records; ptr != NULL; ptr = ptr->pNext) {
- const QString name = QUrl::fromAce( QString::fromWCharArray( ptr->pName ).toLatin1() );
+ for (PDNS_RECORD ptr = results.pQueryRecords; ptr != NULL; ptr = ptr->pNext) {
+ // warning: always assign name to the record before calling extractXxxHost() again
+ const QString &name = extractMaybeCachedHost(ptr->pName);
if (ptr->wType == QDnsLookup::A) {
QDnsHostAddressRecord record;
record.d->name = name;
@@ -119,12 +129,12 @@ void QDnsLookupRunnable::query(const int requestType, const QByteArray &requestN
QDnsDomainNameRecord record;
record.d->name = name;
record.d->timeToLive = ptr->dwTtl;
- record.d->value = QUrl::fromAce(QString::fromWCharArray(ptr->Data.Cname.pNameHost).toLatin1());
+ record.d->value = extractAndCacheHost(ptr->Data.Cname.pNameHost);
reply->canonicalNameRecords.append(record);
} else if (ptr->wType == QDnsLookup::MX) {
QDnsMailExchangeRecord record;
record.d->name = name;
- record.d->exchange = QUrl::fromAce(QString::fromWCharArray(ptr->Data.Mx.pNameExchange).toLatin1());
+ record.d->exchange = decodeLabel(QStringView(ptr->Data.Mx.pNameExchange));
record.d->preference = ptr->Data.Mx.wPreference;
record.d->timeToLive = ptr->dwTtl;
reply->mailExchangeRecords.append(record);
@@ -132,18 +142,18 @@ void QDnsLookupRunnable::query(const int requestType, const QByteArray &requestN
QDnsDomainNameRecord record;
record.d->name = name;
record.d->timeToLive = ptr->dwTtl;
- record.d->value = QUrl::fromAce(QString::fromWCharArray(ptr->Data.Ns.pNameHost).toLatin1());
+ record.d->value = decodeLabel(QStringView(ptr->Data.Ns.pNameHost));
reply->nameServerRecords.append(record);
} else if (ptr->wType == QDnsLookup::PTR) {
QDnsDomainNameRecord record;
record.d->name = name;
record.d->timeToLive = ptr->dwTtl;
- record.d->value = QUrl::fromAce(QString::fromWCharArray(ptr->Data.Ptr.pNameHost).toLatin1());
+ record.d->value = decodeLabel(QStringView(ptr->Data.Ptr.pNameHost));
reply->pointerRecords.append(record);
} else if (ptr->wType == QDnsLookup::SRV) {
QDnsServiceRecord record;
record.d->name = name;
- record.d->target = QUrl::fromAce(QString::fromWCharArray(ptr->Data.Srv.pNameTarget).toLatin1());
+ record.d->target = decodeLabel(QStringView(ptr->Data.Srv.pNameTarget));
record.d->port = ptr->Data.Srv.wPort;
record.d->priority = ptr->Data.Srv.wPriority;
record.d->timeToLive = ptr->dwTtl;
@@ -154,13 +164,13 @@ void QDnsLookupRunnable::query(const int requestType, const QByteArray &requestN
record.d->name = name;
record.d->timeToLive = ptr->dwTtl;
for (unsigned int i = 0; i < ptr->Data.Txt.dwStringCount; ++i) {
- record.d->values << QString::fromWCharArray((ptr->Data.Txt.pStringArray[i])).toLatin1();;
+ record.d->values << QStringView(ptr->Data.Txt.pStringArray[i]).toLatin1();
}
reply->textRecords.append(record);
}
}
- DnsRecordListFree(dns_records, DnsFreeRecordList);
+ DnsRecordListFree(results.pQueryRecords, DnsFreeRecordList);
}
QT_END_NAMESPACE
diff --git a/src/network/kernel/qhostaddress.cpp b/src/network/kernel/qhostaddress.cpp
index ea46d76ee0..0330fb091b 100644
--- a/src/network/kernel/qhostaddress.cpp
+++ b/src/network/kernel/qhostaddress.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qhostaddress.h"
#include "qhostaddress_p.h"
@@ -65,7 +29,7 @@
QT_BEGIN_NAMESPACE
QHostAddressPrivate::QHostAddressPrivate()
- : a(0), protocol(QAbstractSocket::UnknownNetworkLayerProtocol)
+ : a(0), protocol(QHostAddress::UnknownNetworkLayerProtocol)
{
memset(&a6, 0, sizeof(a6));
}
@@ -73,7 +37,7 @@ QHostAddressPrivate::QHostAddressPrivate()
void QHostAddressPrivate::setAddress(quint32 a_)
{
a = a_;
- protocol = QAbstractSocket::IPv4Protocol;
+ protocol = QHostAddress::IPv4Protocol;
//create mapped address, except for a_ == 0 (any)
a6_64.c[0] = 0;
@@ -122,7 +86,7 @@ static bool convertToIpv4(quint32& a, const Q_IPV6ADDR &a6, const QHostAddress::
void QHostAddressPrivate::setAddress(const quint8 *a_)
{
- protocol = QAbstractSocket::IPv6Protocol;
+ protocol = QHostAddress::IPv6Protocol;
memcpy(a6.c, a_, sizeof(a6));
a = 0;
convertToIpv4(a, a6, (QHostAddress::ConvertV4MappedToIPv4
@@ -137,7 +101,7 @@ void QHostAddressPrivate::setAddress(const Q_IPV6ADDR &a_)
static bool parseIp6(const QString &address, QIPAddressUtils::IPv6Address &addr, QString *scopeId)
{
QStringView tmp(address);
- int scopeIdPos = tmp.lastIndexOf(QLatin1Char('%'));
+ qsizetype scopeIdPos = tmp.lastIndexOf(u'%');
if (scopeIdPos != -1) {
*scopeId = tmp.mid(scopeIdPos + 1).toString();
tmp.chop(tmp.size() - scopeIdPos);
@@ -149,13 +113,13 @@ static bool parseIp6(const QString &address, QIPAddressUtils::IPv6Address &addr,
bool QHostAddressPrivate::parse(const QString &ipString)
{
- protocol = QAbstractSocket::UnknownNetworkLayerProtocol;
+ protocol = QHostAddress::UnknownNetworkLayerProtocol;
QString a = ipString.simplified();
if (a.isEmpty())
return false;
// All IPv6 addresses contain a ':', and may contain a '.'.
- if (a.contains(QLatin1Char(':'))) {
+ if (a.contains(u':')) {
quint8 maybeIp6[16];
if (parseIp6(a, maybeIp6, &scopeId)) {
setAddress(maybeIp6);
@@ -175,7 +139,7 @@ bool QHostAddressPrivate::parse(const QString &ipString)
void QHostAddressPrivate::clear()
{
a = 0;
- protocol = QAbstractSocket::UnknownNetworkLayerProtocol;
+ protocol = QHostAddress::UnknownNetworkLayerProtocol;
memset(&a6, 0, sizeof(a6));
}
@@ -200,8 +164,12 @@ AddressClassification QHostAddressPrivate::classify() const
return BroadcastAddress;
return UnknownAddress;
}
+ if (((a & 0xff000000U) == 0x0a000000U) // 10.0.0.0/8
+ || ((a & 0xfff00000U) == 0xac100000U) // 172.16.0.0/12
+ || ((a & 0xffff0000U) == 0xc0a80000U)) // 192.168.0.0/16
+ return PrivateNetworkAddress;
- // Not testing for PrivateNetworkAddress and TestNetworkAddress
+ // Not testing for TestNetworkAddress
// since we don't need them yet.
return GlobalAddress;
}
@@ -242,7 +210,7 @@ AddressClassification QHostAddressPrivate::classify() const
if (low64) // not ::
return GlobalAddress;
- if (protocol == QAbstractSocket::UnknownNetworkLayerProtocol)
+ if (protocol == QHostAddress::UnknownNetworkLayerProtocol)
return UnknownAddress;
// only :: and 0.0.0.0 remain now
@@ -262,10 +230,10 @@ bool QNetmask::setAddress(const QHostAddress &address)
quint8 *end;
length = 255;
- if (address.protocol() == QAbstractSocket::IPv4Protocol) {
+ if (address.protocol() == QHostAddress::IPv4Protocol) {
ip.v4 = qToBigEndian(address.toIPv4Address());
end = ptr + 4;
- } else if (address.protocol() == QAbstractSocket::IPv6Protocol) {
+ } else if (address.protocol() == QHostAddress::IPv6Protocol) {
memcpy(ip.v6, address.toIPv6Address().c, 16);
end = ptr + 16;
} else {
@@ -331,12 +299,12 @@ static void clearBits(quint8 *where, int start, int end)
memset(where + (start + 7) / 8, 0, end / 8 - (start + 7) / 8);
}
-QHostAddress QNetmask::address(QAbstractSocket::NetworkLayerProtocol protocol) const
+QHostAddress QNetmask::address(QHostAddress::NetworkLayerProtocol protocol) const
{
- if (length == 255 || protocol == QAbstractSocket::AnyIPProtocol ||
- protocol == QAbstractSocket::UnknownNetworkLayerProtocol) {
+ if (length == 255 || protocol == QHostAddress::AnyIPProtocol ||
+ protocol == QHostAddress::UnknownNetworkLayerProtocol) {
return QHostAddress();
- } else if (protocol == QAbstractSocket::IPv4Protocol) {
+ } else if (protocol == QHostAddress::IPv4Protocol) {
quint32 a;
if (length == 0)
a = 0;
@@ -657,7 +625,7 @@ void QHostAddress::setAddress(SpecialAddress address)
return;
case Any:
- d->protocol = QAbstractSocket::AnyIPProtocol;
+ d->protocol = QHostAddress::AnyIPProtocol;
return;
}
@@ -684,8 +652,8 @@ quint32 QHostAddress::toIPv4Address(bool *ok) const
{
quint32 dummy;
if (ok)
- *ok = d->protocol == QAbstractSocket::IPv4Protocol || d->protocol == QAbstractSocket::AnyIPProtocol
- || (d->protocol == QAbstractSocket::IPv6Protocol
+ *ok = d->protocol == QHostAddress::IPv4Protocol || d->protocol == QHostAddress::AnyIPProtocol
+ || (d->protocol == QHostAddress::IPv6Protocol
&& convertToIpv4(dummy, d->a6, ConversionMode(QHostAddress::ConvertV4MappedToIPv4
| QHostAddress::ConvertUnspecifiedAddress)));
return d->a;
@@ -694,9 +662,9 @@ quint32 QHostAddress::toIPv4Address(bool *ok) const
/*!
Returns the network layer protocol of the host address.
*/
-QAbstractSocket::NetworkLayerProtocol QHostAddress::protocol() const
+QHostAddress::NetworkLayerProtocol QHostAddress::protocol() const
{
- return QAbstractSocket::NetworkLayerProtocol(d->protocol);
+ return QHostAddress::NetworkLayerProtocol(d->protocol);
}
/*!
@@ -709,7 +677,7 @@ QAbstractSocket::NetworkLayerProtocol QHostAddress::protocol() const
\l{QAbstractSocket::}{IPv6Protocol}.
If the protocol is
\l{QAbstractSocket::}{IPv4Protocol},
- then the address is returned an an IPv4 mapped IPv6 address. (RFC4291)
+ then the address is returned as an IPv4 mapped IPv6 address. (RFC4291)
\sa toString()
*/
@@ -731,14 +699,14 @@ Q_IPV6ADDR QHostAddress::toIPv6Address() const
QString QHostAddress::toString() const
{
QString s;
- if (d->protocol == QAbstractSocket::IPv4Protocol
- || d->protocol == QAbstractSocket::AnyIPProtocol) {
+ if (d->protocol == QHostAddress::IPv4Protocol
+ || d->protocol == QHostAddress::AnyIPProtocol) {
quint32 i = toIPv4Address();
QIPAddressUtils::toString(s, i);
- } else if (d->protocol == QAbstractSocket::IPv6Protocol) {
+ } else if (d->protocol == QHostAddress::IPv6Protocol) {
QIPAddressUtils::toString(s, d->a6.c);
if (!d->scopeId.isEmpty())
- s.append(QLatin1Char('%') + d->scopeId);
+ s += u'%' + d->scopeId;
}
return s;
}
@@ -781,7 +749,7 @@ QString QHostAddress::toString() const
*/
QString QHostAddress::scopeId() const
{
- return (d->protocol == QAbstractSocket::IPv6Protocol) ? d->scopeId : QString();
+ return (d->protocol == QHostAddress::IPv6Protocol) ? d->scopeId : QString();
}
/*!
@@ -799,7 +767,7 @@ QString QHostAddress::scopeId() const
void QHostAddress::setScopeId(const QString &id)
{
d.detach();
- if (d->protocol == QAbstractSocket::IPv6Protocol)
+ if (d->protocol == QHostAddress::IPv6Protocol)
d->scopeId = id;
}
@@ -820,7 +788,7 @@ bool QHostAddress::operator==(const QHostAddress &other) const
Returns \c true if this host address is the same as the \a other address
given; otherwise returns \c false.
- The parameter \a mode controls which conversions are preformed between addresses
+ The parameter \a mode controls which conversions are performed between addresses
of differing protocols. If no \a mode is given, \c TolerantConversion is performed
by default.
@@ -831,41 +799,41 @@ bool QHostAddress::isEqual(const QHostAddress &other, ConversionMode mode) const
if (d == other.d)
return true;
- if (d->protocol == QAbstractSocket::IPv4Protocol) {
+ if (d->protocol == QHostAddress::IPv4Protocol) {
switch (other.d->protocol) {
- case QAbstractSocket::IPv4Protocol:
+ case QHostAddress::IPv4Protocol:
return d->a == other.d->a;
- case QAbstractSocket::IPv6Protocol:
+ case QHostAddress::IPv6Protocol:
quint32 a4;
return convertToIpv4(a4, other.d->a6, mode) && (a4 == d->a);
- case QAbstractSocket::AnyIPProtocol:
+ case QHostAddress::AnyIPProtocol:
return (mode & QHostAddress::ConvertUnspecifiedAddress) && d->a == 0;
- case QAbstractSocket::UnknownNetworkLayerProtocol:
+ case QHostAddress::UnknownNetworkLayerProtocol:
return false;
}
}
- if (d->protocol == QAbstractSocket::IPv6Protocol) {
+ if (d->protocol == QHostAddress::IPv6Protocol) {
switch (other.d->protocol) {
- case QAbstractSocket::IPv4Protocol:
+ case QHostAddress::IPv4Protocol:
quint32 a4;
return convertToIpv4(a4, d->a6, mode) && (a4 == other.d->a);
- case QAbstractSocket::IPv6Protocol:
+ case QHostAddress::IPv6Protocol:
return memcmp(&d->a6, &other.d->a6, sizeof(Q_IPV6ADDR)) == 0;
- case QAbstractSocket::AnyIPProtocol:
+ case QHostAddress::AnyIPProtocol:
return (mode & QHostAddress::ConvertUnspecifiedAddress)
- && (other.d->a6_64.c[0] == 0) && (other.d->a6_64.c[1] == 0);
- case QAbstractSocket::UnknownNetworkLayerProtocol:
+ && (d->a6_64.c[0] == 0) && (d->a6_64.c[1] == 0);
+ case QHostAddress::UnknownNetworkLayerProtocol:
return false;
}
}
- if ((d->protocol == QAbstractSocket::AnyIPProtocol)
+ if ((d->protocol == QHostAddress::AnyIPProtocol)
&& (mode & QHostAddress::ConvertUnspecifiedAddress)) {
switch (other.d->protocol) {
- case QAbstractSocket::IPv4Protocol:
+ case QHostAddress::IPv4Protocol:
return other.d->a == 0;
- case QAbstractSocket::IPv6Protocol:
+ case QHostAddress::IPv6Protocol:
return (other.d->a6_64.c[0] == 0) && (other.d->a6_64.c[1] == 0);
default:
break;
@@ -884,7 +852,7 @@ bool QHostAddress::operator ==(SpecialAddress other) const
quint32 ip4 = INADDR_ANY;
switch (other) {
case Null:
- return d->protocol == QAbstractSocket::UnknownNetworkLayerProtocol;
+ return d->protocol == QHostAddress::UnknownNetworkLayerProtocol;
case Broadcast:
ip4 = INADDR_BROADCAST;
@@ -895,14 +863,14 @@ bool QHostAddress::operator ==(SpecialAddress other) const
break;
case Any:
- return d->protocol == QAbstractSocket::AnyIPProtocol;
+ return d->protocol == QHostAddress::AnyIPProtocol;
case AnyIPv4:
break;
case LocalHostIPv6:
case AnyIPv6:
- if (d->protocol == QAbstractSocket::IPv6Protocol) {
+ if (d->protocol == QHostAddress::IPv6Protocol) {
quint64 second = quint8(other == LocalHostIPv6); // 1 for localhost, 0 for any
return d->a6_64.c[0] == 0 && d->a6_64.c[1] == qToBigEndian(second);
}
@@ -910,7 +878,7 @@ bool QHostAddress::operator ==(SpecialAddress other) const
}
// common IPv4 part
- return d->protocol == QAbstractSocket::IPv4Protocol && d->a == ip4;
+ return d->protocol == QHostAddress::IPv4Protocol && d->a == ip4;
}
/*!
@@ -922,7 +890,7 @@ bool QHostAddress::operator ==(SpecialAddress other) const
*/
bool QHostAddress::isNull() const
{
- return d->protocol == QAbstractSocket::UnknownNetworkLayerProtocol;
+ return d->protocol == QHostAddress::UnknownNetworkLayerProtocol;
}
/*!
@@ -955,14 +923,14 @@ bool QHostAddress::isInSubnet(const QHostAddress &subnet, int netmask) const
} ip4, net4;
const quint8 *ip;
const quint8 *net;
- if (d->protocol == QAbstractSocket::IPv4Protocol) {
+ if (d->protocol == QHostAddress::IPv4Protocol) {
if (netmask > 32)
netmask = 32;
ip4.ip = qToBigEndian(d->a);
net4.ip = qToBigEndian(subnet.d->a);
ip = ip4.data;
net = net4.data;
- } else if (d->protocol == QAbstractSocket::IPv6Protocol) {
+ } else if (d->protocol == QHostAddress::IPv6Protocol) {
if (netmask > 128)
netmask = 128;
ip = d->a6.c;
@@ -1043,17 +1011,17 @@ QPair<QHostAddress, int> QHostAddress::parseSubnet(const QString &subnet)
if (subnet.isEmpty())
return invalid;
- int slash = subnet.indexOf(QLatin1Char('/'));
+ qsizetype slash = subnet.indexOf(u'/');
QStringView netStr(subnet);
if (slash != -1)
netStr.truncate(slash);
int netmask = -1;
- bool isIpv6 = netStr.contains(QLatin1Char(':'));
+ bool isIpv6 = netStr.contains(u':');
if (slash != -1) {
// is the netmask given in IP-form or in bit-count form?
- if (!isIpv6 && subnet.indexOf(QLatin1Char('.'), slash + 1) != -1) {
+ if (!isIpv6 && subnet.indexOf(u'.', slash + 1) != -1) {
// IP-style, convert it to bit-count form
QHostAddress mask;
QNetmask parser;
@@ -1089,15 +1057,15 @@ QPair<QHostAddress, int> QHostAddress::parseSubnet(const QString &subnet)
return invalid; // invalid netmask
// parse the address manually
- auto parts = netStr.split(QLatin1Char('.'));
- if (parts.isEmpty() || parts.count() > 4)
+ auto parts = netStr.split(u'.');
+ if (parts.isEmpty() || parts.size() > 4)
return invalid; // invalid IPv4 address
if (parts.constLast().isEmpty())
parts.removeLast();
quint32 addr = 0;
- for (int i = 0; i < parts.count(); ++i) {
+ for (int i = 0; i < parts.size(); ++i) {
bool ok;
uint byteValue = parts.at(i).toUInt(&ok);
if (!ok || byteValue > 255)
@@ -1106,9 +1074,9 @@ QPair<QHostAddress, int> QHostAddress::parseSubnet(const QString &subnet)
addr <<= 8;
addr += byteValue;
}
- addr <<= 8 * (4 - parts.count());
+ addr <<= 8 * (4 - parts.size());
if (netmask == -1) {
- netmask = 8 * parts.count();
+ netmask = 8 * parts.size();
} else if (netmask == 0) {
// special case here
// x86's instructions "shr" and "shl" do not operate when
@@ -1143,13 +1111,13 @@ bool QHostAddress::isLoopback() const
Note that IPv6 unique local unicast addresses are considered global
addresses (see isUniqueLocalUnicast()), as are IPv4 addresses reserved for
- local networks by \l {https://tools.ietf.org/html/rfc1918}{RFC 1918}.
+ local networks by \l {RFC 1918}.
Also note that IPv6 site-local addresses are deprecated and should be
considered as global in new applications. This function returns true for
site-local addresses too.
- \sa isLoopback(), isSiteLocal(), isUniqueLocalUnicast()
+ \sa isLoopback(), isSiteLocal(), isUniqueLocalUnicast(), isPrivateUse()
*/
bool QHostAddress::isGlobal() const
{
@@ -1167,7 +1135,7 @@ bool QHostAddress::isGlobal() const
\l{https://www.iana.org/assignments/ipv6-address-space/ipv6-address-space.xhtml}{IANA
IPv6 Address Space} registry for more information.
- \sa isLoopback(), isGlobal(), isMulticast(), isSiteLocal(), isUniqueLocalUnicast()
+ \sa isLoopback(), isGlobal(), isMulticast(), isSiteLocal(), isUniqueLocalUnicast(), isPrivateUse()
*/
bool QHostAddress::isLinkLocal() const
{
@@ -1190,7 +1158,7 @@ bool QHostAddress::isLinkLocal() const
isGlobal() also returns true). Site-local addresses were replaced by Unique
Local Addresses (ULA).
- \sa isLoopback(), isGlobal(), isMulticast(), isLinkLocal(), isUniqueLocalUnicast()
+ \sa isLoopback(), isGlobal(), isMulticast(), isLinkLocal(), isUniqueLocalUnicast(), isPrivateUse()
*/
bool QHostAddress::isSiteLocal() const
{
@@ -1211,7 +1179,7 @@ bool QHostAddress::isSiteLocal() const
4193 says that, in practice, "applications may treat these addresses like
global scoped addresses." Only routers need care about the distinction.
- \sa isLoopback(), isGlobal(), isMulticast(), isLinkLocal(), isUniqueLocalUnicast()
+ \sa isLoopback(), isGlobal(), isMulticast(), isLinkLocal(), isUniqueLocalUnicast(), isPrivateUse()
*/
bool QHostAddress::isUniqueLocalUnicast() const
{
@@ -1224,7 +1192,7 @@ bool QHostAddress::isUniqueLocalUnicast() const
Returns \c true if the address is an IPv4 or IPv6 multicast address, \c
false otherwise.
- \sa isLoopback(), isGlobal(), isLinkLocal(), isSiteLocal(), isUniqueLocalUnicast()
+ \sa isLoopback(), isGlobal(), isLinkLocal(), isSiteLocal(), isUniqueLocalUnicast(), isPrivateUse()
*/
bool QHostAddress::isMulticast() const
{
@@ -1241,13 +1209,27 @@ bool QHostAddress::isMulticast() const
broadcast address. For that, please use \l QNetworkInterface to obtain the
broadcast addresses of the local machine.
- \sa isLoopback(), isGlobal(), isMulticast(), isLinkLocal(), isUniqueLocalUnicast()
+ \sa isLoopback(), isGlobal(), isMulticast(), isLinkLocal(), isUniqueLocalUnicast(), isPrivateUse()
*/
bool QHostAddress::isBroadcast() const
{
return d->classify() == BroadcastAddress;
}
+/*!
+ \since 6.6
+
+ Returns \c true if the address is an IPv6 unique local unicast address or
+ IPv4 address reserved for local networks by \l {RFC 1918}, \c false otherwise.
+
+ \sa isLoopback(), isGlobal(), isMulticast(), isLinkLocal(), isUniqueLocalUnicast(), isBroadcast()
+*/
+bool QHostAddress::isPrivateUse() const
+{
+ const AddressClassification classification = d->classify();
+ return (classification == PrivateNetworkAddress) || (classification == UniqueLocalAddress);
+}
+
#ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug d, const QHostAddress &address)
{
@@ -1305,13 +1287,13 @@ QDataStream &operator<<(QDataStream &out, const QHostAddress &address)
prot = qint8(address.protocol());
out << prot;
switch (address.protocol()) {
- case QAbstractSocket::UnknownNetworkLayerProtocol:
- case QAbstractSocket::AnyIPProtocol:
+ case QHostAddress::UnknownNetworkLayerProtocol:
+ case QHostAddress::AnyIPProtocol:
break;
- case QAbstractSocket::IPv4Protocol:
+ case QHostAddress::IPv4Protocol:
out << address.toIPv4Address();
break;
- case QAbstractSocket::IPv6Protocol:
+ case QHostAddress::IPv6Protocol:
{
Q_IPV6ADDR ipv6 = address.toIPv6Address();
for (int i = 0; i < 16; ++i)
@@ -1334,18 +1316,18 @@ QDataStream &operator>>(QDataStream &in, QHostAddress &address)
{
qint8 prot;
in >> prot;
- switch (QAbstractSocket::NetworkLayerProtocol(prot)) {
- case QAbstractSocket::UnknownNetworkLayerProtocol:
+ switch (QHostAddress::NetworkLayerProtocol(prot)) {
+ case QHostAddress::UnknownNetworkLayerProtocol:
address.clear();
break;
- case QAbstractSocket::IPv4Protocol:
+ case QHostAddress::IPv4Protocol:
{
quint32 ipv4;
in >> ipv4;
address.setAddress(ipv4);
}
break;
- case QAbstractSocket::IPv6Protocol:
+ case QHostAddress::IPv6Protocol:
{
Q_IPV6ADDR ipv6;
for (int i = 0; i < 16; ++i)
@@ -1357,7 +1339,7 @@ QDataStream &operator>>(QDataStream &in, QHostAddress &address)
address.setScopeId(scope);
}
break;
- case QAbstractSocket::AnyIPProtocol:
+ case QHostAddress::AnyIPProtocol:
address = QHostAddress::Any;
break;
default:
@@ -1370,3 +1352,5 @@ QDataStream &operator>>(QDataStream &in, QHostAddress &address)
#endif //QT_NO_DATASTREAM
QT_END_NAMESPACE
+
+#include "moc_qhostaddress.cpp"
diff --git a/src/network/kernel/qhostaddress.h b/src/network/kernel/qhostaddress.h
index 2b61cbba14..6aa045c959 100644
--- a/src/network/kernel/qhostaddress.h
+++ b/src/network/kernel/qhostaddress.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QHOSTADDRESS_H
#define QHOSTADDRESS_H
@@ -45,7 +9,9 @@
#include <QtCore/qpair.h>
#include <QtCore/qstring.h>
#include <QtCore/qshareddata.h>
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
#include <QtNetwork/qabstractsocket.h>
+#endif
struct sockaddr;
@@ -54,7 +20,7 @@ QT_BEGIN_NAMESPACE
class QHostAddressPrivate;
-class Q_NETWORK_EXPORT QIPv6Address
+class QT6_ONLY(Q_NETWORK_EXPORT) QIPv6Address
{
public:
inline quint8 &operator [](int index) { return c[index]; }
@@ -70,6 +36,7 @@ Q_NETWORK_EXPORT size_t qHash(const QHostAddress &key, size_t seed = 0) noexcept
class Q_NETWORK_EXPORT QHostAddress
{
+ Q_GADGET
public:
enum SpecialAddress {
Null,
@@ -91,6 +58,22 @@ public:
};
Q_DECLARE_FLAGS(ConversionMode, ConversionModeFlag)
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+ using NetworkLayerProtocol = QAbstractSocket::NetworkLayerProtocol;
+ static constexpr auto IPv4Protocol = QAbstractSocket::IPv4Protocol;
+ static constexpr auto IPv6Protocol = QAbstractSocket::IPv6Protocol;
+ static constexpr auto AnyIPProtocol = QAbstractSocket::AnyIPProtocol;
+ static constexpr auto UnknownNetworkLayerProtocol = QAbstractSocket::UnknownNetworkLayerProtocol;
+#else
+ enum NetworkLayerProtocol {
+ IPv4Protocol,
+ IPv6Protocol,
+ AnyIPProtocol,
+ UnknownNetworkLayerProtocol = -1
+ };
+ Q_ENUM(NetworkLayerProtocol)
+#endif
+
QHostAddress();
explicit QHostAddress(quint32 ip4Addr);
explicit QHostAddress(const quint8 *ip6Addr);
@@ -115,7 +98,7 @@ public:
bool setAddress(const QString &address);
void setAddress(SpecialAddress address);
- QAbstractSocket::NetworkLayerProtocol protocol() const;
+ NetworkLayerProtocol protocol() const;
quint32 toIPv4Address(bool *ok = nullptr) const;
Q_IPV6ADDR toIPv6Address() const;
@@ -144,6 +127,7 @@ public:
bool isUniqueLocalUnicast() const;
bool isMulticast() const;
bool isBroadcast() const;
+ bool isPrivateUse() const;
static QPair<QHostAddress, int> parseSubnet(const QString &subnet);
diff --git a/src/network/kernel/qhostaddress_p.h b/src/network/kernel/qhostaddress_p.h
index 101c163800..98586fb374 100644
--- a/src/network/kernel/qhostaddress_p.h
+++ b/src/network/kernel/qhostaddress_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QHOSTADDRESSPRIVATE_H
#define QHOSTADDRESSPRIVATE_H
diff --git a/src/network/kernel/qhostinfo.cpp b/src/network/kernel/qhostinfo.cpp
index b3d6844e43..62bb210ca1 100644
--- a/src/network/kernel/qhostinfo.cpp
+++ b/src/network/kernel/qhostinfo.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
//#define QHOSTINFO_DEBUG
@@ -43,6 +7,7 @@
#include "qhostinfo_p.h"
#include <qplatformdefs.h>
+#include "QtCore/qapplicationstatic.h"
#include "QtCore/qscopedpointer.h"
#include <qabstracteventdispatcher.h>
#include <qcoreapplication.h>
@@ -58,7 +23,7 @@
# include <unistd.h>
# include <netdb.h>
# include <netinet/in.h>
-# if defined(AI_ADDRCONFIG)
+# if defined(AI_ADDRCONFIG) && !defined(Q_OS_WASM)
# define Q_ADDRCONFIG AI_ADDRCONFIG
# endif
#elif defined Q_OS_WIN
@@ -69,8 +34,12 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
//#define QHOSTINFO_DEBUG
+QT_IMPL_METATYPE_EXTERN(QHostInfo)
+
namespace {
struct ToBeLookedUpEquals {
typedef bool result_type;
@@ -99,27 +68,20 @@ std::pair<OutputIt1, OutputIt2> separate_if(InputIt first, InputIt last, OutputI
return std::make_pair(dest1, dest2);
}
-QHostInfoLookupManager* theHostInfoLookupManager()
-{
- static QHostInfoLookupManager* theManager = nullptr;
- static QBasicMutex theMutex;
-
- const QMutexLocker locker(&theMutex);
- if (theManager == nullptr) {
- theManager = new QHostInfoLookupManager();
- Q_ASSERT(QCoreApplication::instance());
- QObject::connect(QCoreApplication::instance(), &QCoreApplication::destroyed, [] {
- const QMutexLocker locker(&theMutex);
- delete theManager;
- theManager = nullptr;
- });
- }
+Q_APPLICATION_STATIC(QHostInfoLookupManager, theHostInfoLookupManager)
- return theManager;
}
+QHostInfoResult::QHostInfoResult(const QObject *receiver, QtPrivate::SlotObjUniquePtr slot)
+ : receiver{receiver ? receiver : this}, slotObj{std::move(slot)}
+{
+ Q_ASSERT(this->receiver);
+ moveToThread(this->receiver->thread());
}
+QHostInfoResult::~QHostInfoResult()
+ = default;
+
/*
The calling thread is likely the one that executes the lookup via
QHostInfoRunnable. Unless we operate with a queued connection already,
@@ -128,8 +90,8 @@ QHostInfoLookupManager* theHostInfoLookupManager()
the thread that made the call to lookupHost. That QHostInfoResult object
then calls the user code in the correct thread.
- The 'result' object deletes itself (via deleteLater) when the metacall
- event is received.
+ The 'result' object deletes itself (via deleteLater) when
+ finalizePostResultsReady is called.
*/
void QHostInfoResult::postResultsReady(const QHostInfo &info)
{
@@ -139,55 +101,33 @@ void QHostInfoResult::postResultsReady(const QHostInfo &info)
return;
}
// we used to have a context object, but it's already destroyed
- if (withContextObject && !receiver)
+ if (!receiver)
return;
- static const int signal_index = []() -> int {
- auto senderMetaObject = &QHostInfoResult::staticMetaObject;
- auto signal = &QHostInfoResult::resultsReady;
- int signal_index = -1;
- void *args[] = { &signal_index, &signal };
- senderMetaObject->static_metacall(QMetaObject::IndexOfMethod, 0, args);
- return signal_index + QMetaObjectPrivate::signalOffset(senderMetaObject);
- }();
-
// a long-living version of this
auto result = new QHostInfoResult(this);
Q_CHECK_PTR(result);
- const int nargs = 2;
- auto metaCallEvent = new QMetaCallEvent(slotObj, nullptr, signal_index, nargs);
- Q_CHECK_PTR(metaCallEvent);
- void **args = metaCallEvent->args();
- QMetaType *types = metaCallEvent->types();
- auto voidType = QMetaType::fromType<void>();
- auto hostInfoType = QMetaType::fromType<QHostInfo>();
- types[0] = voidType;
- types[1] = hostInfoType;
- args[0] = nullptr;
- args[1] = hostInfoType.create(&info);
- Q_CHECK_PTR(args[1]);
- qApp->postEvent(result, metaCallEvent);
+ QMetaObject::invokeMethod(result,
+ &QHostInfoResult::finalizePostResultsReady,
+ Qt::QueuedConnection,
+ info);
}
/*
- Receives the event posted by postResultsReady, and calls the functor.
+ Receives the info from postResultsReady, and calls the functor.
*/
-bool QHostInfoResult::event(QEvent *event)
+void QHostInfoResult::finalizePostResultsReady(const QHostInfo &info)
{
- if (event->type() == QEvent::MetaCall) {
- Q_ASSERT(slotObj);
- auto metaCallEvent = static_cast<QMetaCallEvent *>(event);
- auto args = metaCallEvent->args();
- // we didn't have a context object, or it's still alive
- if (!withContextObject || receiver)
- slotObj->call(const_cast<QObject*>(receiver.data()), args);
- slotObj->destroyIfLastRef();
-
- deleteLater();
- return true;
+ Q_ASSERT(slotObj);
+
+ // we used to have a context object, but it's already destroyed
+ if (receiver) {
+ void *args[] = { nullptr, const_cast<QHostInfo *>(&info) };
+ slotObj->call(const_cast<QObject *>(receiver.data()), args);
}
- return QObject::event(event);
+
+ deleteLater();
}
/*!
@@ -234,7 +174,7 @@ bool QHostInfoResult::event(QEvent *event)
QHostInfo::localHostName() function.
QHostInfo uses the mechanisms provided by the operating system
- to perform the lookup. As per {https://tools.ietf.org/html/rfc6724}{RFC 6724}
+ to perform the lookup. As per \l {RFC 6724}
there is no guarantee that all IP addresses registered for a domain or
host will be returned.
@@ -245,13 +185,12 @@ bool QHostInfoResult::event(QEvent *event)
\note Since Qt 4.6.3 QHostInfo is using a small internal 60 second DNS cache
for performance improvements.
- \sa QAbstractSocket, {http://www.rfc-editor.org/rfc/rfc3492.txt}{RFC 3492},
- {https://tools.ietf.org/html/rfc6724}{RFC 6724}
+ \sa QAbstractSocket, {RFC 3492}, {RFC 6724}
*/
static int nextId()
{
- static QBasicAtomicInt counter = Q_BASIC_ATOMIC_INITIALIZER(0);
+ Q_CONSTINIT static QBasicAtomicInt counter = Q_BASIC_ATOMIC_INITIALIZER(0);
return 1 + counter.fetchAndAddRelaxed(1);
}
@@ -282,10 +221,17 @@ static int nextId()
\note There is no guarantee on the order the signals will be emitted
if you start multiple requests with lookupHost().
+ \note In Qt versions prior to 6.7, this function took \a receiver as
+ (non-const) \c{QObject*}.
+
\sa abortHostLookup(), addresses(), error(), fromName()
*/
-int QHostInfo::lookupHost(const QString &name, QObject *receiver, const char *member)
+int QHostInfo::lookupHost(const QString &name, const QObject *receiver, const char *member)
{
+ if (!receiver || !member) {
+ qWarning("QHostInfo::lookupHost: both the receiver and the member to invoke must be non-null");
+ return -1;
+ }
return QHostInfo::lookupHostImpl(name, receiver, nullptr, member);
}
@@ -311,7 +257,7 @@ int QHostInfo::lookupHost(const QString &name, QObject *receiver, const char *me
*/
/*!
- \fn template<typename Functor> int QHostInfo::lookupHost(const QString &name, Functor functor)
+ \fn template<typename Functor> int QHostInfo::lookupHost(const QString &name, Functor &&functor)
\since 5.9
@@ -395,12 +341,17 @@ QHostInfo QHostInfo::fromName(const QString &name)
qDebug("QHostInfo::fromName(\"%s\")",name.toLatin1().constData());
#endif
+#ifdef Q_OS_WASM
+ return QHostInfoAgent::lookup(name);
+#else
QHostInfo hostInfo = QHostInfoAgent::fromName(name);
QHostInfoLookupManager* manager = theHostInfoLookupManager();
manager->cache.put(name, hostInfo);
return hostInfo;
+#endif
}
+
QHostInfo QHostInfoAgent::reverseLookup(const QHostAddress &address)
{
QHostInfo results;
@@ -546,7 +497,7 @@ QHostInfo QHostInfoAgent::lookup(const QString &hostName)
QString tmp;
QList<QHostAddress> addresses = results.addresses();
for (int i = 0; i < addresses.count(); ++i) {
- if (i != 0) tmp += QLatin1String(", ");
+ if (i != 0) tmp += ", "_L1;
tmp += addresses.at(i).toString();
}
qDebug("QHostInfoAgent::fromName(): found %i entries for \"%s\": {%s}",
@@ -609,10 +560,11 @@ QHostInfo::QHostInfo(const QHostInfo &other)
*/
QHostInfo &QHostInfo::operator=(const QHostInfo &other)
{
- if (d_ptr)
- *d_ptr = *other.d_ptr;
- else
- d_ptr = new QHostInfoPrivate(*other.d_ptr);
+ if (this == &other)
+ return *this;
+
+ Q_ASSERT(d_ptr && other.d_ptr);
+ *d_ptr = *other.d_ptr;
return *this;
}
@@ -777,22 +729,25 @@ QString QHostInfo::localHostName()
\internal
Called by the various lookupHost overloads to perform the lookup.
- Signals either the functor encapuslated in the \a slotObj in the context
+ Signals either the functor encapuslated in the \a slotObjRaw in the context
of \a receiver, or the \a member slot of the \a receiver.
- \a receiver might be the nullptr, but only if a \a slotObj is provided.
+ \a receiver might be the nullptr, but only if a \a slotObjRaw is provided.
*/
int QHostInfo::lookupHostImpl(const QString &name,
const QObject *receiver,
- QtPrivate::QSlotObjectBase *slotObj,
+ QtPrivate::QSlotObjectBase *slotObjRaw,
const char *member)
{
+ QtPrivate::SlotObjUniquePtr slotObj{slotObjRaw};
#if defined QHOSTINFO_DEBUG
qDebug("QHostInfo::lookupHostImpl(\"%s\", %p, %p, %s)",
- name.toLatin1().constData(), receiver, slotObj, member ? member + 1 : 0);
+ name.toLatin1().constData(), receiver, slotObj.get(), member ? member + 1 : 0);
#endif
Q_ASSERT(!member != !slotObj); // one of these must be set, but not both
Q_ASSERT(receiver || slotObj);
+ Q_ASSERT(!member || receiver); // if member is set, also is receiver
+ const bool isUsingStringBasedSlot = static_cast<bool>(member);
if (!QAbstractEventDispatcher::instance(QThread::currentThread())) {
qWarning("QHostInfo::lookupHost() called with no event dispatcher");
@@ -808,15 +763,31 @@ int QHostInfo::lookupHostImpl(const QString &name,
hostInfo.setError(QHostInfo::HostNotFound);
hostInfo.setErrorString(QCoreApplication::translate("QHostInfo", "No host name given"));
- QHostInfoResult result(receiver, slotObj);
- if (receiver && member)
+ QHostInfoResult result(receiver, std::move(slotObj));
+ if (isUsingStringBasedSlot) {
QObject::connect(&result, SIGNAL(resultsReady(QHostInfo)),
receiver, member, Qt::QueuedConnection);
+ }
result.postResultsReady(hostInfo);
return id;
}
+#ifdef Q_OS_WASM
+ // Resolve the host name directly without using a thread or cache,
+ // since Emscripten's host lookup is fast. Emscripten maintains an internal
+ // mapping of hosts and addresses for the purposes of WebSocket socket
+ // tunnelling, and does not perform an actual host lookup.
+ QHostInfo hostInfo = QHostInfoAgent::lookup(name);
+ hostInfo.setLookupId(id);
+
+ QHostInfoResult result(receiver, std::move(slotObj));
+ if (isUsingStringBasedSlot) {
+ QObject::connect(&result, SIGNAL(resultsReady(QHostInfo)),
+ receiver, member, Qt::QueuedConnection);
+ }
+ result.postResultsReady(hostInfo);
+#else
QHostInfoLookupManager *manager = theHostInfoLookupManager();
if (Q_LIKELY(manager)) {
@@ -827,32 +798,38 @@ int QHostInfo::lookupHostImpl(const QString &name,
QHostInfo info = manager->cache.get(name, &valid);
if (valid) {
info.setLookupId(id);
- QHostInfoResult result(receiver, slotObj);
- if (receiver && member)
+ QHostInfoResult result(receiver, std::move(slotObj));
+ if (isUsingStringBasedSlot) {
QObject::connect(&result, SIGNAL(resultsReady(QHostInfo)),
receiver, member, Qt::QueuedConnection);
+ }
result.postResultsReady(info);
return id;
}
}
// cache is not enabled or it was not in the cache, do normal lookup
- QHostInfoRunnable *runnable = new QHostInfoRunnable(name, id, receiver, slotObj);
- if (receiver && member)
+ QHostInfoRunnable *runnable = new QHostInfoRunnable(name, id, receiver, std::move(slotObj));
+ if (isUsingStringBasedSlot) {
QObject::connect(&runnable->resultEmitter, SIGNAL(resultsReady(QHostInfo)),
receiver, member, Qt::QueuedConnection);
+ }
manager->scheduleLookup(runnable);
}
+#endif // Q_OS_WASM
return id;
}
QHostInfoRunnable::QHostInfoRunnable(const QString &hn, int i, const QObject *receiver,
- QtPrivate::QSlotObjectBase *slotObj) :
- toBeLookedUp(hn), id(i), resultEmitter(receiver, slotObj)
+ QtPrivate::SlotObjUniquePtr slotObj)
+ : toBeLookedUp{hn}, id{i}, resultEmitter{receiver, std::move(slotObj)}
{
setAutoDelete(true);
}
+QHostInfoRunnable::~QHostInfoRunnable()
+ = default;
+
// the QHostInfoLookupManager will at some point call this via a QThreadPool
void QHostInfoRunnable::run()
{
@@ -962,7 +939,7 @@ void QHostInfoLookupManager::rescheduleWithMutexHeld()
if (!finishedLookups.isEmpty()) {
// remove ID from aborted if it is in there
- for (int i = 0; i < finishedLookups.length(); i++) {
+ for (int i = 0; i < finishedLookups.size(); i++) {
abortedLookups.removeAll(finishedLookups.at(i)->id);
}
@@ -990,7 +967,7 @@ void QHostInfoLookupManager::rescheduleWithMutexHeld()
isAlreadyRunning).second,
scheduledLookups.end());
- const int availableThreads = threadPool.maxThreadCount() - currentLookups.size();
+ const int availableThreads = std::max(threadPool.maxThreadCount(), 1) - currentLookups.size();
if (availableThreads > 0) {
int readyToStartCount = qMin(availableThreads, scheduledLookups.size());
auto it = scheduledLookups.begin();
@@ -1028,9 +1005,12 @@ void QHostInfoLookupManager::abortLookup(int id)
if (wasDeleted)
return;
+ if (id == -1)
+ return;
+
#if QT_CONFIG(thread)
// is postponed? delete and return
- for (int i = 0; i < postponedLookups.length(); i++) {
+ for (int i = 0; i < postponedLookups.size(); i++) {
if (postponedLookups.at(i)->id == id) {
delete postponedLookups.takeAt(i);
return;
@@ -1039,7 +1019,7 @@ void QHostInfoLookupManager::abortLookup(int id)
#endif
// is scheduled? delete and return
- for (int i = 0; i < scheduledLookups.length(); i++) {
+ for (int i = 0; i < scheduledLookups.size(); i++) {
if (scheduledLookups.at(i)->id == id) {
delete scheduledLookups.takeAt(i);
return;
@@ -1174,3 +1154,5 @@ void QHostInfoCache::clear()
}
QT_END_NAMESPACE
+
+#include "moc_qhostinfo_p.cpp"
diff --git a/src/network/kernel/qhostinfo.h b/src/network/kernel/qhostinfo.h
index fd1567eb07..3942e41498 100644
--- a/src/network/kernel/qhostinfo.h
+++ b/src/network/kernel/qhostinfo.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QHOSTINFO_H
#define QHOSTINFO_H
@@ -53,6 +17,7 @@ class QHostInfoPrivate;
class Q_NETWORK_EXPORT QHostInfo
{
+ Q_GADGET
public:
enum HostInfoError {
NoError,
@@ -62,12 +27,12 @@ public:
explicit QHostInfo(int lookupId = -1);
QHostInfo(const QHostInfo &d);
- QHostInfo(QHostInfo &&other) noexcept : d_ptr(qExchange(other.d_ptr, nullptr)) {}
+ QHostInfo(QHostInfo &&other) noexcept : d_ptr(std::exchange(other.d_ptr, nullptr)) {}
QHostInfo &operator=(const QHostInfo &d);
QHostInfo &operator=(QHostInfo &&other) noexcept { swap(other); return *this; }
~QHostInfo();
- void swap(QHostInfo &other) noexcept { qSwap(d_ptr, other.d_ptr); }
+ void swap(QHostInfo &other) noexcept { qt_ptr_swap(d_ptr, other.d_ptr); }
QString hostName() const;
void setHostName(const QString &name);
@@ -84,68 +49,42 @@ public:
void setLookupId(int id);
int lookupId() const;
+#if QT_NETWORK_REMOVED_SINCE(6, 7)
static int lookupHost(const QString &name, QObject *receiver, const char *member);
+#endif
+ static int lookupHost(const QString &name, const QObject *receiver, const char *member);
static void abortHostLookup(int lookupId);
static QHostInfo fromName(const QString &name);
static QString localHostName();
static QString localDomainName();
-#ifdef Q_CLANG_QDOC
- template<typename Functor>
- static int lookupHost(const QString &name, Functor functor);
+#ifdef Q_QDOC
template<typename Functor>
static int lookupHost(const QString &name, const QObject *context, Functor functor);
#else
- // lookupHost to a QObject slot
- template <typename Func>
+ // lookupHost to a callable (with context)
+ template <typename Functor>
static inline int lookupHost(const QString &name,
- const typename QtPrivate::FunctionPointer<Func>::Object *receiver,
- Func slot)
+ const typename QtPrivate::ContextTypeForFunctor<Functor>::ContextType *receiver,
+ Functor &&func)
{
- typedef QtPrivate::FunctionPointer<Func> SlotType;
-
- typedef QtPrivate::FunctionPointer<void (*)(QHostInfo)> SignalType;
- static_assert(int(SignalType::ArgumentCount) >= int(SlotType::ArgumentCount),
- "The slot requires more arguments than the signal provides.");
- static_assert((QtPrivate::CheckCompatibleArguments<typename SignalType::Arguments,
- typename SlotType::Arguments>::value),
- "Signal and slot arguments are not compatible.");
- static_assert((QtPrivate::AreArgumentsCompatible<typename SlotType::ReturnType,
- typename SignalType::ReturnType>::value),
- "Return type of the slot is not compatible "
- "with the return type of the signal.");
-
- auto slotObj = new QtPrivate::QSlotObject<Func, typename SlotType::Arguments, void>(slot);
- return lookupHostImpl(name, receiver, slotObj, nullptr);
+ using Prototype = void(*)(QHostInfo);
+ QtPrivate::AssertCompatibleFunctions<Prototype, Functor>();
+ return lookupHostImpl(name, receiver,
+ QtPrivate::makeCallableObject<Prototype>(std::forward<Functor>(func)),
+ nullptr);
}
+#endif // Q_QDOC
+#ifndef QT_NO_CONTEXTLESS_CONNECT
// lookupHost to a callable (without context)
- template <typename Func>
- static inline typename std::enable_if<!QtPrivate::FunctionPointer<Func>::IsPointerToMemberFunction &&
- !std::is_same<const char *, Func>::value, int>::type
- lookupHost(const QString &name, Func slot)
- {
- return lookupHost(name, nullptr, std::move(slot));
- }
-
- // lookupHost to a functor or function pointer (with context)
- template <typename Func1>
- static inline typename std::enable_if<!QtPrivate::FunctionPointer<Func1>::IsPointerToMemberFunction &&
- !std::is_same<const char*, Func1>::value, int>::type
- lookupHost(const QString &name, QObject *context, Func1 slot)
+ template <typename Functor>
+ static inline int lookupHost(const QString &name, Functor &&slot)
{
- typedef QtPrivate::FunctionPointer<Func1> SlotType;
-
- static_assert(int(SlotType::ArgumentCount) <= 1,
- "The slot must not require more than one argument");
-
- auto slotObj = new QtPrivate::QFunctorSlotObject<Func1, 1,
- typename QtPrivate::List<QHostInfo>,
- void>(std::move(slot));
- return lookupHostImpl(name, context, slotObj, nullptr);
+ return lookupHost(name, nullptr, std::forward<Functor>(slot));
}
-#endif // Q_QDOC
+#endif // QT_NO_CONTEXTLESS_CONNECT
private:
QHostInfoPrivate *d_ptr;
@@ -164,6 +103,6 @@ Q_DECLARE_SHARED(QHostInfo)
QT_END_NAMESPACE
-Q_DECLARE_METATYPE(QHostInfo)
+QT_DECL_METATYPE_EXTERN(QHostInfo, Q_NETWORK_EXPORT)
#endif // QHOSTINFO_H
diff --git a/src/network/kernel/qhostinfo_p.h b/src/network/kernel/qhostinfo_p.h
index cc34d575b2..b229eb1cd8 100644
--- a/src/network/kernel/qhostinfo_p.h
+++ b/src/network/kernel/qhostinfo_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QHOSTINFO_P_H
#define QHOSTINFO_P_H
@@ -70,8 +34,6 @@
#include <QElapsedTimer>
#include <QCache>
-#include <QSharedPointer>
-
#include <atomic>
QT_BEGIN_NAMESPACE
@@ -81,26 +43,21 @@ class QHostInfoResult : public QObject
{
Q_OBJECT
public:
- QHostInfoResult(const QObject *receiver, QtPrivate::QSlotObjectBase *slotObj)
- : receiver(receiver), slotObj(slotObj),
- withContextObject(slotObj && receiver)
- {
- if (receiver)
- moveToThread(receiver->thread());
- }
+ explicit QHostInfoResult(const QObject *receiver, QtPrivate::SlotObjUniquePtr slot);
+ ~QHostInfoResult() override;
void postResultsReady(const QHostInfo &info);
Q_SIGNALS:
void resultsReady(const QHostInfo &info);
-protected:
- bool event(QEvent *event) override;
+private Q_SLOTS:
+ void finalizePostResultsReady(const QHostInfo &info);
private:
- QHostInfoResult(const QHostInfoResult *other)
- : receiver(other->receiver), slotObj(other->slotObj),
- withContextObject(other->withContextObject)
+ QHostInfoResult(QHostInfoResult *other)
+ : receiver(other->receiver.get() != other ? other->receiver.get() : this),
+ slotObj{std::move(other->slotObj)}
{
// cleanup if the application terminates before results are delivered
connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit,
@@ -109,16 +66,16 @@ private:
moveToThread(other->thread());
}
+ // receiver is either a QObject provided by the user,
+ // or it's set to `this` (to emulate the behavior of the contextless connect())
QPointer<const QObject> receiver = nullptr;
- QtPrivate::QSlotObjectBase *slotObj = nullptr;
- const bool withContextObject = false;
+ QtPrivate::SlotObjUniquePtr slotObj;
};
class QHostInfoAgent
{
public:
static QHostInfo fromName(const QString &hostName);
-private:
static QHostInfo lookup(const QString &hostName);
static QHostInfo reverseLookup(const QHostAddress &address);
};
@@ -128,7 +85,7 @@ class QHostInfoPrivate
public:
inline QHostInfoPrivate()
: err(QHostInfo::NoError),
- errorStr(QLatin1String(QT_TRANSLATE_NOOP("QHostInfo", "Unknown error"))),
+ errorStr(QLatin1StringView(QT_TRANSLATE_NOOP("QHostInfo", "Unknown error"))),
lookupId(0)
{
}
@@ -180,8 +137,10 @@ private:
class QHostInfoRunnable : public QRunnable
{
public:
- QHostInfoRunnable(const QString &hn, int i, const QObject *receiver,
- QtPrivate::QSlotObjectBase *slotObj);
+ explicit QHostInfoRunnable(const QString &hn, int i, const QObject *receiver,
+ QtPrivate::SlotObjUniquePtr slotObj);
+ ~QHostInfoRunnable() override;
+
void run() override;
QString toBeLookedUp;
diff --git a/src/network/kernel/qhostinfo_unix.cpp b/src/network/kernel/qhostinfo_unix.cpp
index 9b0a2ee669..80d386a13d 100644
--- a/src/network/kernel/qhostinfo_unix.cpp
+++ b/src/network/kernel/qhostinfo_unix.cpp
@@ -1,192 +1,80 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
//#define QHOSTINFO_DEBUG
-#include "qplatformdefs.h"
-
#include "qhostinfo_p.h"
-#include "private/qnativesocketengine_p.h"
-#include "qiodevice.h"
+
#include <qbytearray.h>
-#if QT_CONFIG(library)
-#include <qlibrary.h>
-#endif
-#include <qbasicatomic.h>
-#include <qurl.h>
#include <qfile.h>
-#include <private/qnet_unix_p.h>
+#include <qplatformdefs.h>
+#include <qurl.h>
#include <sys/types.h>
#include <netdb.h>
-#include <arpa/inet.h>
-#if defined(Q_OS_VXWORKS)
-# include <hostLib.h>
-#else
-# include <resolv.h>
-#endif
+#include <netinet/in.h>
-#if defined(__GNU_LIBRARY__) && !defined(__UCLIBC__)
-# include <gnu/lib-names.h>
+#if QT_CONFIG(libresolv)
+# include <resolv.h>
#endif
-#if defined(Q_OS_FREEBSD) || QT_CONFIG(dlopen)
-# include <dlfcn.h>
+#ifndef _PATH_RESCONF
+# define _PATH_RESCONF "/etc/resolv.conf"
#endif
QT_BEGIN_NAMESPACE
-enum LibResolvFeature {
- NeedResInit,
- NeedResNInit
-};
-
-typedef struct __res_state *res_state_ptr;
-
-typedef int (*res_init_proto)(void);
-static res_init_proto local_res_init = nullptr;
-typedef int (*res_ninit_proto)(res_state_ptr);
-static res_ninit_proto local_res_ninit = nullptr;
-typedef void (*res_nclose_proto)(res_state_ptr);
-static res_nclose_proto local_res_nclose = nullptr;
-static res_state_ptr local_res = nullptr;
-
-#if QT_CONFIG(library) && !defined(Q_OS_QNX)
-namespace {
-struct LibResolv
-{
- enum {
-#ifdef RES_NORELOAD
- // If RES_NORELOAD is defined, then the libc is capable of watching
- // /etc/resolv.conf for changes and reloading as necessary. So accept
- // whatever is configured.
- ReinitNecessary = false
-#else
- ReinitNecessary = true
-#endif
- };
-
- QLibrary lib;
- LibResolv();
- ~LibResolv() { lib.unload(); }
-};
-}
-
-static QFunctionPointer resolveSymbol(QLibrary &lib, const char *sym)
-{
- if (lib.isLoaded())
- return lib.resolve(sym);
-
-#if defined(RTLD_DEFAULT) && (defined(Q_OS_FREEBSD) || QT_CONFIG(dlopen))
- return reinterpret_cast<QFunctionPointer>(dlsym(RTLD_DEFAULT, sym));
-#else
- return nullptr;
-#endif
-}
+using namespace Qt::StringLiterals;
-LibResolv::LibResolv()
+static void maybeRefreshResolver()
{
- QLibrary lib;
-#ifdef LIBRESOLV_SO
- lib.setFileName(QStringLiteral(LIBRESOLV_SO));
- if (!lib.load())
+#if defined(RES_NORELOAD)
+ // If RES_NORELOAD is defined, then the libc is capable of watching
+ // /etc/resolv.conf for changes and reloading as necessary. So accept
+ // whatever is configured.
+ return;
+#elif defined(Q_OS_DARWIN)
+ // Apple's libsystem_info.dylib:getaddrinfo() uses the
+ // libsystem_dnssd.dylib to resolve hostnames. Using res_init() has no
+ // effect on it and is thread-unsafe.
+ return;
+#elif defined(Q_OS_FREEBSD)
+ // FreeBSD automatically refreshes:
+ // https://github.com/freebsd/freebsd-src/blob/b3fe5d932264445cbf9a1c4eab01afb6179b499b/lib/libc/resolv/res_state.c#L69
+ return;
+#elif defined(Q_OS_OPENBSD)
+ // OpenBSD automatically refreshes:
+ // https://github.com/ligurio/openbsd-src/blob/b1ce0da17da254cc15b8aff25b3d55d3c7a82cec/lib/libc/asr/asr.c#L367
+ return;
+#elif defined(Q_OS_QNX)
+ // res_init() is not thread-safe; executing it leads to state corruption.
+ // Whether it reloads resolv.conf on its own is unknown.
+ return;
#endif
- {
- lib.setFileName(QLatin1String("resolv"));
- lib.load();
- }
-
- // res_ninit is required for localDomainName()
- local_res_ninit = res_ninit_proto(resolveSymbol(lib, "__res_ninit"));
- if (!local_res_ninit)
- local_res_ninit = res_ninit_proto(resolveSymbol(lib, "res_ninit"));
- if (local_res_ninit) {
- // we must now find res_nclose
- local_res_nclose = res_nclose_proto(resolveSymbol(lib, "res_nclose"));
- if (!local_res_nclose)
- local_res_nclose = res_nclose_proto(resolveSymbol(lib, "__res_nclose"));
- if (!local_res_nclose)
- local_res_ninit = nullptr;
- }
- if (ReinitNecessary || !local_res_ninit) {
- local_res_init = res_init_proto(resolveSymbol(lib, "__res_init"));
- if (!local_res_init)
- local_res_init = res_init_proto(resolveSymbol(lib, "res_init"));
-
- if (local_res_init && !local_res_ninit) {
- // if we can't get a thread-safe context, we have to use the global _res state
- local_res = res_state_ptr(resolveSymbol(lib, "_res"));
+#if QT_CONFIG(libresolv)
+ // OSes known or thought to reach here: AIX, NetBSD, Solaris,
+ // Linux with MUSL (though res_init() does nothing and is unnecessary)
+
+ Q_CONSTINIT static QT_STATBUF lastStat = {};
+ Q_CONSTINIT static QBasicMutex mutex = {};
+ if (QT_STATBUF st; QT_STAT(_PATH_RESCONF, &st) == 0) {
+ QMutexLocker locker(&mutex);
+ bool refresh = false;
+ if ((_res.options & RES_INIT) == 0)
+ refresh = true;
+ else if (lastStat.st_ctime != st.st_ctime)
+ refresh = true; // file was updated
+ else if (lastStat.st_dev != st.st_dev || lastStat.st_ino != st.st_ino)
+ refresh = true; // file was replaced
+ if (refresh) {
+ lastStat = st;
+ res_init();
}
}
+#endif
}
-LibResolv* libResolv()
-{
- static LibResolv* theLibResolv = nullptr;
- static QBasicMutex theMutex;
-
- const QMutexLocker locker(&theMutex);
- if (theLibResolv == nullptr) {
- theLibResolv = new LibResolv();
- Q_ASSERT(QCoreApplication::instance());
- QObject::connect(QCoreApplication::instance(), &QCoreApplication::destroyed, [] {
- const QMutexLocker locker(&theMutex);
- delete theLibResolv;
- theLibResolv = nullptr;
- });
- }
-
- return theLibResolv;
-}
-
-static void resolveLibrary(LibResolvFeature f)
-{
- if (LibResolv::ReinitNecessary || f == NeedResNInit)
- libResolv();
-}
-#else // QT_CONFIG(library) || Q_OS_QNX
-static void resolveLibrary(LibResolvFeature)
-{
-}
-#endif // QT_CONFIG(library) || Q_OS_QNX
-
QHostInfo QHostInfoAgent::fromName(const QString &hostName)
{
QHostInfo results;
@@ -196,12 +84,7 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName)
hostName.toLatin1().constData());
#endif
- // Load res_init on demand.
- resolveLibrary(NeedResInit);
-
- // If res_init is available, poll it.
- if (local_res_init)
- local_res_init();
+ maybeRefreshResolver();
QHostAddress address;
if (address.setAddress(hostName))
@@ -212,56 +95,49 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName)
QString QHostInfo::localDomainName()
{
-#if !defined(Q_OS_VXWORKS) && !defined(Q_OS_ANDROID)
- resolveLibrary(NeedResNInit);
- if (local_res_ninit) {
- // using thread-safe version
- res_state_ptr state = res_state_ptr(malloc(sizeof(*state)));
- Q_CHECK_PTR(state);
- memset(state, 0, sizeof(*state));
- local_res_ninit(state);
- QString domainName = QUrl::fromAce(state->defdname);
+#if QT_CONFIG(libresolv)
+ auto domainNameFromRes = [](res_state r) {
+ QString domainName;
+ if (r->defdname[0])
+ domainName = QUrl::fromAce(r->defdname);
if (domainName.isEmpty())
- domainName = QUrl::fromAce(state->dnsrch[0]);
- local_res_nclose(state);
- free(state);
-
+ domainName = QUrl::fromAce(r->dnsrch[0]);
return domainName;
+ };
+ std::remove_pointer_t<res_state> state = {};
+ if (res_ninit(&state) == 0) {
+ // using thread-safe version
+ auto guard = qScopeGuard([&] { res_nclose(&state); });
+ return domainNameFromRes(&state);
}
- if (local_res_init && local_res) {
- // using thread-unsafe version
+ // using thread-unsafe version
+ maybeRefreshResolver();
+ return domainNameFromRes(&_res);
+#endif // !QT_CONFIG(libresolv)
- local_res_init();
- QString domainName = QUrl::fromAce(local_res->defdname);
- if (domainName.isEmpty())
- domainName = QUrl::fromAce(local_res->dnsrch[0]);
- return domainName;
- }
-#endif
// nothing worked, try doing it by ourselves:
QFile resolvconf;
-#if defined(_PATH_RESCONF)
- resolvconf.setFileName(QFile::decodeName(_PATH_RESCONF));
-#else
- resolvconf.setFileName(QLatin1String("/etc/resolv.conf"));
-#endif
+ resolvconf.setFileName(_PATH_RESCONF ""_L1);
if (!resolvconf.open(QIODevice::ReadOnly))
return QString(); // failure
QString domainName;
while (!resolvconf.atEnd()) {
- QByteArray line = resolvconf.readLine().trimmed();
- if (line.startsWith("domain "))
- return QUrl::fromAce(line.mid(sizeof "domain " - 1).trimmed());
+ const QByteArray lineArray = resolvconf.readLine();
+ QByteArrayView line = QByteArrayView(lineArray).trimmed();
+ constexpr QByteArrayView domainWithSpace = "domain ";
+ if (line.startsWith(domainWithSpace))
+ return QUrl::fromAce(line.mid(domainWithSpace.size()).trimmed().toByteArray());
// in case there's no "domain" line, fall back to the first "search" entry
- if (domainName.isEmpty() && line.startsWith("search ")) {
- QByteArray searchDomain = line.mid(sizeof "search " - 1).trimmed();
+ constexpr QByteArrayView searchWithSpace = "search ";
+ if (domainName.isEmpty() && line.startsWith(searchWithSpace)) {
+ QByteArrayView searchDomain = line.mid(searchWithSpace.size()).trimmed();
int pos = searchDomain.indexOf(' ');
if (pos != -1)
searchDomain.truncate(pos);
- domainName = QUrl::fromAce(searchDomain);
+ domainName = QUrl::fromAce(searchDomain.toByteArray());
}
}
diff --git a/src/network/kernel/qhostinfo_win.cpp b/src/network/kernel/qhostinfo_win.cpp
index 0b5cc98970..61a1983e9d 100644
--- a/src/network/kernel/qhostinfo_win.cpp
+++ b/src/network/kernel/qhostinfo_win.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <winsock2.h>
diff --git a/src/network/kernel/qnetconmonitor_darwin.mm b/src/network/kernel/qnetconmonitor_darwin.mm
index 42540c38ee..60b3cd6581 100644
--- a/src/network/kernel/qnetconmonitor_darwin.mm
+++ b/src/network/kernel/qnetconmonitor_darwin.mm
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qnativesocketengine_p.h"
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "private/qnativesocketengine_p_p.h"
#include "private/qnetconmonitor_p.h"
#include "private/qobject_p.h"
@@ -124,6 +88,9 @@ public:
void updateState(SCNetworkReachabilityFlags newState);
void reset();
bool isReachable() const;
+#ifdef QT_PLATFORM_UIKIT
+ bool isWwan() const;
+#endif
static void probeCallback(SCNetworkReachabilityRef probe, SCNetworkReachabilityFlags flags, void *info);
@@ -139,9 +106,19 @@ void QNetworkConnectionMonitorPrivate::updateState(SCNetworkReachabilityFlags ne
// is set. There are more possible flags that require more tests/some special
// setup. So in future this part and related can change/be extended.
const bool wasReachable = isReachable();
+
+#ifdef QT_PLATFORM_UIKIT
+ const bool hadWwan = isWwan();
+#endif
+
state = newState;
if (wasReachable != isReachable())
emit q->reachabilityChanged(isReachable());
+
+#ifdef QT_PLATFORM_UIKIT
+ if (hadWwan != isWwan())
+ emit q->isWwanChanged(isWwan());
+#endif
}
void QNetworkConnectionMonitorPrivate::reset()
@@ -160,6 +137,13 @@ bool QNetworkConnectionMonitorPrivate::isReachable() const
return !!(state & kSCNetworkReachabilityFlagsReachable);
}
+#ifdef QT_PLATFORM_UIKIT // The IsWWAN flag is not available on macOS
+bool QNetworkConnectionMonitorPrivate::isWwan() const
+{
+ return !!(state & kSCNetworkReachabilityFlagsIsWWAN);
+}
+#endif
+
void QNetworkConnectionMonitorPrivate::probeCallback(SCNetworkReachabilityRef probe, SCNetworkReachabilityFlags flags, void *info)
{
// To be executed only on the reachability queue.
@@ -301,6 +285,25 @@ bool QNetworkConnectionMonitor::isReachable()
return d->isReachable();
}
+#ifdef QT_PLATFORM_UIKIT
+bool QNetworkConnectionMonitor::isWwan() const
+{
+ Q_D(const QNetworkConnectionMonitor);
+
+ if (isMonitoring()) {
+ qCWarning(lcNetMon, "Calling isWwan() is unsafe after the monitoring started");
+ return false;
+ }
+
+ if (!d->probe) {
+ qCWarning(lcNetMon, "Medium is unknown, set the target first");
+ return false;
+ }
+
+ return d->isWwan();
+}
+#endif
+
bool QNetworkConnectionMonitor::isEnabled()
{
return true;
diff --git a/src/network/kernel/qnetconmonitor_p.h b/src/network/kernel/qnetconmonitor_p.h
index c6d44ae559..26211bb770 100644
--- a/src/network/kernel/qnetconmonitor_p.h
+++ b/src/network/kernel/qnetconmonitor_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QNETCONMONITOR_P_H
#define QNETCONMONITOR_P_H
@@ -73,7 +37,11 @@ public:
bool setTargets(const QHostAddress &local, const QHostAddress &remote);
bool isReachable();
- // Important: on Darwin you should not call isReachable() after
+#ifdef QT_PLATFORM_UIKIT
+ bool isWwan() const;
+#endif
+
+ // Important: on Darwin you should not call isReachable/isWwan() after
// startMonitoring(), you have to listen to reachabilityChanged()
// signal instead.
bool startMonitoring();
@@ -87,6 +55,10 @@ Q_SIGNALS:
// callback is coming on a special dispatch queue.
void reachabilityChanged(bool isOnline);
+#ifdef QT_PLATFORM_UIKIT
+ void isWwanChanged(bool isWwan);
+#endif
+
private:
Q_DECLARE_PRIVATE(QNetworkConnectionMonitor)
Q_DISABLE_COPY_MOVE(QNetworkConnectionMonitor)
diff --git a/src/network/kernel/qnetconmonitor_stub.cpp b/src/network/kernel/qnetconmonitor_stub.cpp
index 1743c0a6d5..d3f1224e86 100644
--- a/src/network/kernel/qnetconmonitor_stub.cpp
+++ b/src/network/kernel/qnetconmonitor_stub.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qnetconmonitor_p.h"
diff --git a/src/network/kernel/qnetconmonitor_win.cpp b/src/network/kernel/qnetconmonitor_win.cpp
index 81e253ff81..bf6aff1e46 100644
--- a/src/network/kernel/qnetconmonitor_win.cpp
+++ b/src/network/kernel/qnetconmonitor_win.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qnetconmonitor_p.h"
@@ -44,13 +8,15 @@
#include <QtCore/quuid.h>
#include <QtCore/qmetaobject.h>
+#include <QtCore/private/qfunctions_win_p.h>
+#include <QtCore/private/qsystemerror_p.h>
+
#include <QtNetwork/qnetworkinterface.h>
#include <objbase.h>
#include <netlistmgr.h>
#include <wrl/client.h>
#include <wrl/wrappers/corewrappers.h>
-#include <comdef.h>
#include <iphlpapi.h>
#include <algorithm>
@@ -62,12 +28,6 @@ QT_BEGIN_NAMESPACE
Q_LOGGING_CATEGORY(lcNetMon, "qt.network.monitor");
namespace {
-QString errorStringFromHResult(HRESULT hr)
-{
- _com_error error(hr);
- return QString::fromWCharArray(error.ErrorMessage());
-}
-
template<typename T>
bool QueryInterfaceImpl(IUnknown *from, REFIID riid, void **ppvObject)
{
@@ -160,6 +120,8 @@ public:
void setConnectivity(NLM_CONNECTIVITY newConnectivity);
private:
+ QComHelper comHelper;
+
ComPtr<QNetworkConnectionEvents> connectionEvents;
// We can assume we have access to internet/subnet when this class is created because
// connection has already been established to the peer:
@@ -172,7 +134,6 @@ private:
bool sameSubnet = false;
bool isLinkLocal = false;
bool monitoring = false;
- bool comInitFailed = false;
bool remoteIsIPv6 = false;
};
@@ -182,8 +143,8 @@ QNetworkConnectionEvents::QNetworkConnectionEvents(QNetworkConnectionMonitorPriv
auto hr = CoCreateInstance(CLSID_NetworkListManager, nullptr, CLSCTX_INPROC_SERVER,
IID_INetworkListManager, &networkListManager);
if (FAILED(hr)) {
- qCWarning(lcNetMon) << "Could not get a NetworkListManager instance:"
- << errorStringFromHResult(hr);
+ qCDebug(lcNetMon) << "Could not get a NetworkListManager instance:"
+ << QSystemError::windowsComString(hr);
return;
}
@@ -194,8 +155,8 @@ QNetworkConnectionEvents::QNetworkConnectionEvents(QNetworkConnectionMonitorPriv
&connectionPoint);
}
if (FAILED(hr)) {
- qCWarning(lcNetMon) << "Failed to get connection point for network events:"
- << errorStringFromHResult(hr);
+ qCDebug(lcNetMon) << "Failed to get connection point for network events:"
+ << QSystemError::windowsComString(hr);
}
}
@@ -206,27 +167,33 @@ QNetworkConnectionEvents::~QNetworkConnectionEvents()
ComPtr<INetworkConnection> QNetworkConnectionEvents::getNetworkConnectionFromAdapterGuid(QUuid guid)
{
+ if (!networkListManager) {
+ qCDebug(lcNetMon) << "Failed to enumerate network connections:"
+ << "NetworkListManager was not instantiated";
+ return nullptr;
+ }
+
ComPtr<IEnumNetworkConnections> connections;
auto hr = networkListManager->GetNetworkConnections(connections.GetAddressOf());
if (FAILED(hr)) {
- qCWarning(lcNetMon) << "Failed to enumerate network connections:"
- << errorStringFromHResult(hr);
+ qCDebug(lcNetMon) << "Failed to enumerate network connections:"
+ << QSystemError::windowsComString(hr);
return nullptr;
}
ComPtr<INetworkConnection> connection = nullptr;
do {
hr = connections->Next(1, connection.GetAddressOf(), nullptr);
if (FAILED(hr)) {
- qCWarning(lcNetMon) << "Failed to get next network connection in enumeration:"
- << errorStringFromHResult(hr);
+ qCDebug(lcNetMon) << "Failed to get next network connection in enumeration:"
+ << QSystemError::windowsComString(hr);
break;
}
if (connection) {
GUID adapterId;
hr = connection->GetAdapterId(&adapterId);
if (FAILED(hr)) {
- qCWarning(lcNetMon) << "Failed to get adapter ID from network connection:"
- << errorStringFromHResult(hr);
+ qCDebug(lcNetMon) << "Failed to get adapter ID from network connection:"
+ << QSystemError::windowsComString(hr);
continue;
}
if (guid == adapterId)
@@ -276,22 +243,23 @@ bool QNetworkConnectionEvents::setTarget(const QNetworkInterface &iface)
NET_LUID luid;
if (ConvertInterfaceIndexToLuid(iface.index(), &luid) != NO_ERROR) {
- qCWarning(lcNetMon, "Could not get the LUID for the interface.");
+ qCDebug(lcNetMon, "Could not get the LUID for the interface.");
return false;
}
GUID guid;
if (ConvertInterfaceLuidToGuid(&luid, &guid) != NO_ERROR) {
- qCWarning(lcNetMon, "Could not get the GUID for the interface.");
+ qCDebug(lcNetMon, "Could not get the GUID for the interface.");
return false;
}
ComPtr<INetworkConnection> connection = getNetworkConnectionFromAdapterGuid(guid);
if (!connection) {
- qCWarning(lcNetMon, "Could not get the INetworkConnection instance for the adapter GUID.");
+ qCDebug(lcNetMon, "Could not get the INetworkConnection instance for the adapter GUID.");
return false;
}
auto hr = connection->GetConnectionId(&guid);
if (FAILED(hr)) {
- qCWarning(lcNetMon) << "Failed to get the connection's GUID:" << errorStringFromHResult(hr);
+ qCDebug(lcNetMon) << "Failed to get the connection's GUID:"
+ << QSystemError::windowsComString(hr);
return false;
}
currentConnectionId = guid;
@@ -302,19 +270,19 @@ bool QNetworkConnectionEvents::setTarget(const QNetworkInterface &iface)
bool QNetworkConnectionEvents::startMonitoring()
{
if (currentConnectionId.isNull()) {
- qCWarning(lcNetMon, "Can not start monitoring, set targets first");
+ qCDebug(lcNetMon, "Can not start monitoring, set targets first");
return false;
}
if (!connectionPoint) {
- qCWarning(lcNetMon,
+ qCDebug(lcNetMon,
"We don't have the connection point, cannot start listening to events!");
return false;
}
auto hr = connectionPoint->Advise(this, &cookie);
if (FAILED(hr)) {
- qCWarning(lcNetMon) << "Failed to subscribe to network connectivity events:"
- << errorStringFromHResult(hr);
+ qCDebug(lcNetMon) << "Failed to subscribe to network connectivity events:"
+ << QSystemError::windowsComString(hr);
return false;
}
return true;
@@ -324,8 +292,8 @@ bool QNetworkConnectionEvents::stopMonitoring()
{
auto hr = connectionPoint->Unadvise(cookie);
if (FAILED(hr)) {
- qCWarning(lcNetMon) << "Failed to unsubscribe from network connection events:"
- << errorStringFromHResult(hr);
+ qCDebug(lcNetMon) << "Failed to unsubscribe from network connection events:"
+ << QSystemError::windowsComString(hr);
return false;
}
cookie = 0;
@@ -335,30 +303,25 @@ bool QNetworkConnectionEvents::stopMonitoring()
QNetworkConnectionMonitorPrivate::QNetworkConnectionMonitorPrivate()
{
- auto hr = CoInitialize(nullptr);
- if (FAILED(hr)) {
- qCWarning(lcNetMon) << "Failed to initialize COM:" << errorStringFromHResult(hr);
- comInitFailed = true;
+ if (!comHelper.isValid())
return;
- }
connectionEvents = new QNetworkConnectionEvents(this);
}
QNetworkConnectionMonitorPrivate::~QNetworkConnectionMonitorPrivate()
{
- if (comInitFailed)
+ if (!comHelper.isValid())
return;
if (monitoring)
stopMonitoring();
connectionEvents.Reset();
- CoUninitialize();
}
bool QNetworkConnectionMonitorPrivate::setTargets(const QHostAddress &local,
const QHostAddress &remote)
{
- if (comInitFailed)
+ if (!comHelper.isValid())
return false;
QNetworkInterface iface = getInterfaceFromHostAddress(local);
@@ -369,7 +332,7 @@ bool QNetworkConnectionMonitorPrivate::setTargets(const QHostAddress &local,
addressEntries.cbegin(), addressEntries.cend(),
[&local](const QNetworkAddressEntry &entry) { return entry.ip() == local; });
if (Q_UNLIKELY(it == addressEntries.cend())) {
- qCWarning(lcNetMon, "The address entry we were working with disappeared");
+ qCDebug(lcNetMon, "The address entry we were working with disappeared");
return false;
}
sameSubnet = remote.isInSubnet(local, it->prefixLength());
@@ -423,11 +386,11 @@ QNetworkConnectionMonitor::~QNetworkConnectionMonitor() = default;
bool QNetworkConnectionMonitor::setTargets(const QHostAddress &local, const QHostAddress &remote)
{
if (isMonitoring()) {
- qCWarning(lcNetMon, "Monitor is already active, call stopMonitoring() first");
+ qCDebug(lcNetMon, "Monitor is already active, call stopMonitoring() first");
return false;
}
if (local.isNull()) {
- qCWarning(lcNetMon, "Invalid (null) local address, cannot create a reachability target");
+ qCDebug(lcNetMon, "Invalid (null) local address, cannot create a reachability target");
return false;
}
// Silently return false for loopback addresses instead of printing warnings later
@@ -441,7 +404,7 @@ bool QNetworkConnectionMonitor::startMonitoring()
{
Q_D(QNetworkConnectionMonitor);
if (isMonitoring()) {
- qCWarning(lcNetMon, "Monitor is already active, call stopMonitoring() first");
+ qCDebug(lcNetMon, "Monitor is already active, call stopMonitoring() first");
return false;
}
return d->startMonitoring();
@@ -456,7 +419,7 @@ void QNetworkConnectionMonitor::stopMonitoring()
{
Q_D(QNetworkConnectionMonitor);
if (!isMonitoring()) {
- qCWarning(lcNetMon, "stopMonitoring was called when not monitoring!");
+ qCDebug(lcNetMon, "stopMonitoring was called when not monitoring!");
return;
}
d->stopMonitoring();
diff --git a/src/network/kernel/qnetworkdatagram.cpp b/src/network/kernel/qnetworkdatagram.cpp
index c8c87d4549..a97eb25a51 100644
--- a/src/network/kernel/qnetworkdatagram.cpp
+++ b/src/network/kernel/qnetworkdatagram.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qnetworkdatagram.h"
#include "qnetworkdatagram_p.h"
@@ -44,6 +8,8 @@
QT_BEGIN_NAMESPACE
+QT_IMPL_METATYPE_EXTERN(QNetworkDatagram)
+
/*!
\class QNetworkDatagram
\brief The QNetworkDatagram class provides the data and metadata of a UDP datagram.
@@ -515,7 +481,7 @@ void QNetworkDatagram::makeReply_helper_inplace(const QByteArray &data)
void QNetworkDatagram::destroy(QNetworkDatagramPrivate *d)
{
- Q_ASSUME(d);
+ Q_ASSERT(d);
delete d;
}
diff --git a/src/network/kernel/qnetworkdatagram.h b/src/network/kernel/qnetworkdatagram.h
index 70958fea42..dcc2f1102f 100644
--- a/src/network/kernel/qnetworkdatagram.h
+++ b/src/network/kernel/qnetworkdatagram.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QNETWORKDATAGRAM_H
#define QNETWORKDATAGRAM_H
@@ -68,7 +32,7 @@ public:
{ swap(other); return *this; }
void swap(QNetworkDatagram &other) noexcept
- { qSwap(d, other.d); }
+ { qt_ptr_swap(d, other.d); }
void clear();
bool isValid() const;
@@ -91,7 +55,7 @@ public:
QByteArray data() const;
void setData(const QByteArray &data);
-#if defined(Q_COMPILER_REF_QUALIFIERS) || defined(Q_CLANG_QDOC)
+#if defined(Q_COMPILER_REF_QUALIFIERS) || defined(Q_QDOC)
QNetworkDatagram makeReply(const QByteArray &payload) const &
{ return makeReply_helper(payload); }
QNetworkDatagram makeReply(const QByteArray &payload) &&
@@ -116,7 +80,7 @@ Q_DECLARE_SHARED(QNetworkDatagram)
QT_END_NAMESPACE
-Q_DECLARE_METATYPE(QNetworkDatagram)
+QT_DECL_METATYPE_EXTERN(QNetworkDatagram, Q_NETWORK_EXPORT)
#endif // QT_NO_UDPSOCKET
diff --git a/src/network/kernel/qnetworkdatagram_p.h b/src/network/kernel/qnetworkdatagram_p.h
index 5b5c037488..dcaddff1a9 100644
--- a/src/network/kernel/qnetworkdatagram_p.h
+++ b/src/network/kernel/qnetworkdatagram_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2015 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QNETWORKDATAGRAM_P_H
#define QNETWORKDATAGRAM_P_H
diff --git a/src/network/kernel/qnetworkinformation.cpp b/src/network/kernel/qnetworkinformation.cpp
index d10024bf05..10d6b89e2c 100644
--- a/src/network/kernel/qnetworkinformation.cpp
+++ b/src/network/kernel/qnetworkinformation.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
// #define DEBUG_LOADING
@@ -46,6 +10,7 @@
#include <QtCore/private/qobject_p.h>
#include <QtCore/qcoreapplication.h>
#include <QtCore/qmutex.h>
+#include <QtCore/qthread.h>
#include <QtCore/private/qfactoryloader_p.h>
#include <algorithm>
@@ -56,26 +21,58 @@ QT_BEGIN_NAMESPACE
Q_DECLARE_LOGGING_CATEGORY(lcNetInfo)
Q_LOGGING_CATEGORY(lcNetInfo, "qt.network.info");
-Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader,
+struct QNetworkInformationDeleter
+{
+ void operator()(QNetworkInformation *information) { delete information; }
+};
+
+Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, qniLoader,
(QNetworkInformationBackendFactory_iid,
- QStringLiteral("/networkinformationbackends")))
+ QStringLiteral("/networkinformation")))
struct QStaticNetworkInformationDataHolder
{
QMutex instanceMutex;
- std::unique_ptr<QNetworkInformation> instanceHolder;
+ std::unique_ptr<QNetworkInformation, QNetworkInformationDeleter> instanceHolder;
QList<QNetworkInformationBackendFactory *> factories;
};
Q_GLOBAL_STATIC(QStaticNetworkInformationDataHolder, dataHolder);
+static void networkInfoCleanup()
+{
+ if (!dataHolder.exists())
+ return;
+ QMutexLocker locker(&dataHolder->instanceMutex);
+ QNetworkInformation *instance = dataHolder->instanceHolder.get();
+ if (!instance)
+ return;
+
+ dataHolder->instanceHolder.reset();
+}
+
+using namespace Qt::Literals::StringLiterals;
+
+class QNetworkInformationDummyBackend : public QNetworkInformationBackend {
+ Q_OBJECT
+public:
+ QString name() const override { return u"dummy"_s; }
+ QNetworkInformation::Features featuresSupported() const override
+ {
+ return {};
+ }
+};
+
class QNetworkInformationPrivate : public QObjectPrivate
{
Q_DECLARE_PUBLIC(QNetworkInformation)
public:
- QNetworkInformationPrivate(QNetworkInformationBackend *backend) : backend(backend) { }
+ QNetworkInformationPrivate(QNetworkInformationBackend *backend) : backend(backend) {
+ qAddPostRoutine(&networkInfoCleanup);
+ }
static QNetworkInformation *create(QNetworkInformation::Features features);
static QNetworkInformation *create(QStringView name);
+ static QNetworkInformation *createDummy();
static QNetworkInformation *instance()
{
if (!dataHolder())
@@ -95,19 +92,19 @@ private:
bool QNetworkInformationPrivate::initializeList()
{
- if (!loader())
+ if (!qniLoader())
return false;
if (!dataHolder())
return false;
- static QBasicMutex mutex;
+ Q_CONSTINIT static QBasicMutex mutex;
QMutexLocker initLocker(&mutex);
#if QT_CONFIG(library)
- loader->update();
+ qniLoader->update();
#endif
// Instantiates the plugins (and registers the factories)
int index = 0;
- while (loader->instance(index))
+ while (qniLoader->instance(index))
++index;
initLocker.unlock();
@@ -166,6 +163,8 @@ QStringList QNetworkInformationPrivate::backendNames()
QNetworkInformation *QNetworkInformationPrivate::create(QStringView name)
{
+ if (name.isEmpty())
+ return nullptr;
if (!dataHolder())
return nullptr;
#ifdef DEBUG_LOADING
@@ -184,40 +183,31 @@ QNetworkInformation *QNetworkInformationPrivate::create(QStringView name)
return dataHolder->instanceHolder.get();
- QNetworkInformationBackend *backend = nullptr;
- if (!name.isEmpty()) {
- const auto nameMatches = [name](QNetworkInformationBackendFactory *factory) {
- return factory->name().compare(name, Qt::CaseInsensitive) == 0;
- };
- auto it = std::find_if(dataHolder->factories.cbegin(), dataHolder->factories.cend(),
- nameMatches);
- if (it == dataHolder->factories.cend()) {
+ const auto nameMatches = [name](QNetworkInformationBackendFactory *factory) {
+ return factory->name().compare(name, Qt::CaseInsensitive) == 0;
+ };
+ auto it = std::find_if(dataHolder->factories.cbegin(), dataHolder->factories.cend(),
+ nameMatches);
+ if (it == dataHolder->factories.cend()) {
#ifdef DEBUG_LOADING
- if (dataHolder->factories.isEmpty()) {
- qDebug("No plugins available");
- } else {
- QString listNames;
- listNames.reserve(8 * dataHolder->factories.count());
- for (const auto *factory : qAsConst(dataHolder->factories))
- listNames += factory->name() + QStringLiteral(", ");
- listNames.chop(2);
- qDebug().nospace() << "Couldn't find " << name << " in list with names: { "
- << listNames << " }";
- }
-#endif
- return nullptr;
+ if (dataHolder->factories.isEmpty()) {
+ qDebug("No plugins available");
+ } else {
+ QString listNames;
+ listNames.reserve(8 * dataHolder->factories.count());
+ for (const auto *factory : std::as_const(dataHolder->factories))
+ listNames += factory->name() + ", "_L1;
+ listNames.chop(2);
+ qDebug().nospace() << "Couldn't find " << name << " in list with names: { "
+ << listNames << " }";
}
-#ifdef DEBUG_LOADING
- qDebug() << "Creating instance using loader named " << (*it)->name();
#endif
- backend = (*it)->create({});
- } else {
+ return nullptr;
+ }
#ifdef DEBUG_LOADING
- qDebug() << "Creating instance using loader named" << dataHolder->factories.front()->name();
+ qDebug() << "Creating instance using loader named " << (*it)->name();
#endif
- if (!dataHolder->factories.isEmpty())
- backend = dataHolder->factories.front()->create({});
- }
+ QNetworkInformationBackend *backend = (*it)->create((*it)->featuresSupported());
if (!backend)
return nullptr;
dataHolder->instanceHolder.reset(new QNetworkInformation(backend));
@@ -248,7 +238,7 @@ QNetworkInformation *QNetworkInformationPrivate::create(QNetworkInformation::Fea
return dataHolder->instanceHolder.get();
const auto supportsRequestedFeatures = [features](QNetworkInformationBackendFactory *factory) {
- return factory && (factory->featuresSupported() & features) == features;
+ return factory && factory->featuresSupported().testFlags(features);
};
for (auto it = dataHolder->factories.cbegin(), end = dataHolder->factories.cend(); it != end;
@@ -261,7 +251,7 @@ QNetworkInformation *QNetworkInformationPrivate::create(QNetworkInformation::Fea
} else {
QStringList names;
names.reserve(dataHolder->factories.count());
- for (const auto *factory : qAsConst(dataHolder->factories))
+ for (const auto *factory : std::as_const(dataHolder->factories))
names += factory->name();
qDebug() << "None of the following backends has all the requested features:"
<< names << features;
@@ -289,6 +279,20 @@ QNetworkInformation *QNetworkInformationPrivate::create(QNetworkInformation::Fea
return nullptr;
}
+QNetworkInformation *QNetworkInformationPrivate::createDummy()
+{
+ if (!dataHolder())
+ return nullptr;
+
+ QMutexLocker locker(&dataHolder->instanceMutex);
+ if (dataHolder->instanceHolder)
+ return dataHolder->instanceHolder.get();
+
+ QNetworkInformationBackend *backend = new QNetworkInformationDummyBackend;
+ dataHolder->instanceHolder.reset(new QNetworkInformation(backend));
+ return dataHolder->instanceHolder.get();
+}
+
/*!
\class QNetworkInformationBackend
\internal (Semi-private)
@@ -399,6 +403,7 @@ QNetworkInformationBackendFactory::~QNetworkInformationBackendFactory()
/*!
\class QNetworkInformation
+ \inmodule QtNetwork
\since 6.1
\brief QNetworkInformation exposes various network information
through native backends.
@@ -410,7 +415,9 @@ QNetworkInformationBackendFactory::~QNetworkInformationBackendFactory()
you can load() plugins based on which features are needed.
QNetworkInformation is a singleton and stays alive from the first
- successful load() until application shutdown.
+ successful load() until destruction of the QCoreApplication object.
+ If you destroy and re-create the QCoreApplication object you must call
+ load() again.
\sa QNetworkInformation::Feature
*/
@@ -422,9 +429,26 @@ QNetworkInformationBackendFactory::~QNetworkInformationBackendFactory()
This can be used in QNetworkInformation::load().
\value Reachability
- If the plugin supports this feature then
- the \c reachability property will be available.
+ If the plugin supports this feature then the \c reachability property
+ will provide useful results. Otherwise it will always return
+ \c{Reachability::Unknown}.
See also QNetworkInformation::Reachability.
+
+ \value CaptivePortal
+ If the plugin supports this feature then the \c isBehindCaptivePortal
+ property will provide useful results. Otherwise it will always return
+ \c{false}.
+
+ \value TransportMedium
+ If the plugin supports this feature then the \c transportMedium
+ property will provide useful results. Otherwise it will always return
+ \c{TransportMedium::Unknown}.
+ See also QNetworkInformation::TransportMedium.
+
+ \value Metered
+ If the plugin supports this feature then the \c isMetered
+ property will provide useful results. Otherwise it will always return
+ \c{false}.
*/
/*!
@@ -432,7 +456,7 @@ QNetworkInformationBackendFactory::~QNetworkInformationBackendFactory()
\value Unknown
If this value is returned then we may be connected but the OS
- has still not confirmed full connectivity, or this features
+ has still not confirmed full connectivity, or this feature
is not supported.
\value Disconnected
Indicates that the system may have no connectivity at all.
@@ -451,13 +475,53 @@ QNetworkInformationBackendFactory::~QNetworkInformationBackendFactory()
*/
/*!
+ \enum QNetworkInformation::TransportMedium
+ \since 6.3
+
+ Lists the currently recognized media with which one can connect to the
+ internet.
+
+ \value Unknown
+ Returned if either the OS reports no active medium, the active medium is
+ not recognized by Qt, or the TransportMedium feature is not supported.
+ \value Ethernet
+ Indicates that the currently active connection is using ethernet.
+ Note: This value may also be returned when Windows is connected to a
+ Bluetooth personal area network.
+ \value Cellular
+ Indicates that the currently active connection is using a cellular
+ network.
+ \value WiFi
+ Indicates that the currently active connection is using Wi-Fi.
+ \value Bluetooth
+ Indicates that the currently active connection is connected using
+ Bluetooth.
+
+ \sa QNetworkInformation::transportMedium
+*/
+
+/*!
\internal ctor
*/
QNetworkInformation::QNetworkInformation(QNetworkInformationBackend *backend)
: QObject(*(new QNetworkInformationPrivate(backend)))
{
connect(backend, &QNetworkInformationBackend::reachabilityChanged, this,
- [this]() { emit reachabilityChanged(d_func()->backend->reachability()); });
+ &QNetworkInformation::reachabilityChanged);
+ connect(backend, &QNetworkInformationBackend::behindCaptivePortalChanged, this,
+ &QNetworkInformation::isBehindCaptivePortalChanged);
+ connect(backend, &QNetworkInformationBackend::transportMediumChanged, this,
+ &QNetworkInformation::transportMediumChanged);
+ connect(backend, &QNetworkInformationBackend::isMeteredChanged, this,
+ &QNetworkInformation::isMeteredChanged);
+
+ QThread *main = nullptr;
+
+ if (QCoreApplication::instance())
+ main = QCoreApplication::instance()->thread();
+
+ if (main && thread() != main)
+ moveToThread(main);
}
/*!
@@ -485,6 +549,55 @@ QNetworkInformation::Reachability QNetworkInformation::reachability() const
}
/*!
+ \property QNetworkInformation::isBehindCaptivePortal
+ \brief Lets you know if the user's device is behind a captive portal.
+ \since 6.2
+
+ This property indicates if the user's device is currently known to be
+ behind a captive portal. This functionality relies on the operating system's
+ detection of captive portals and is not supported on systems that don't
+ report this. On systems where this is not supported this will always return
+ \c{false}.
+*/
+bool QNetworkInformation::isBehindCaptivePortal() const
+{
+ return d_func()->backend->behindCaptivePortal();
+}
+
+/*!
+ \property QNetworkInformation::transportMedium
+ \brief The currently active transport medium for the application
+ \since 6.3
+
+ This property returns the currently active transport medium for the
+ application, on operating systems where such information is available.
+
+ When the current transport medium changes a signal is emitted, this can,
+ for instance, occur when a user leaves the range of a WiFi network, unplugs
+ their ethernet cable or enables Airplane mode.
+*/
+QNetworkInformation::TransportMedium QNetworkInformation::transportMedium() const
+{
+ return d_func()->backend->transportMedium();
+}
+
+/*!
+ \property QNetworkInformation::isMetered
+ \brief Check if the current connection is metered
+ \since 6.3
+
+ This property returns whether the current connection is (known to be)
+ metered or not. You can use this as a guiding factor to decide whether your
+ application should perform certain network requests or uploads.
+ For instance, you may not want to upload logs or diagnostics while this
+ property is \c true.
+*/
+bool QNetworkInformation::isMetered() const
+{
+ return d_func()->backend->isMetered();
+}
+
+/*!
Returns the name of the currently loaded backend.
*/
QString QNetworkInformation::backendName() const
@@ -502,34 +615,139 @@ bool QNetworkInformation::supports(Features features) const
}
/*!
+ \since 6.3
+
+ Returns all the supported features of the current backend.
+*/
+QNetworkInformation::Features QNetworkInformation::supportedFeatures() const
+{
+ return d_func()->backend->featuresSupported();
+}
+
+/*!
+ \since 6.3
+
+ Attempts to load the platform-default backend.
+
+ \note Starting with 6.7 this tries to load any backend that supports
+ \l{QNetworkInformation::Feature::Reachability}{Reachability} if the
+ platform-default backend is not available or fails to load.
+ If this also fails it will fall back to a backend that only returns
+ the default values for all properties.
+
+ This platform-to-plugin mapping is as follows:
+
+ \table
+ \header
+ \li Platform
+ \li Plugin-name
+ \row
+ \li Windows
+ \li networklistmanager
+ \row
+ \li Apple (macOS/iOS)
+ \li scnetworkreachability
+ \row
+ \li Android
+ \li android
+ \row
+ \li Linux
+ \li networkmanager
+ \endtable
+
+ This function is provided for convenience where the logic earlier
+ is good enough. If you require a specific plugin then you should call
+ loadBackendByName() or loadBackendByFeatures() directly instead.
+
+ Determines a suitable backend to load and returns \c true if this backend
+ is already loaded or on successful loading of it. Returns \c false if any
+ other backend has already been loaded, or if loading of the selected
+ backend fails.
+
+ \sa instance(), load()
+*/
+bool QNetworkInformation::loadDefaultBackend()
+{
+ int index = -1;
+#ifdef Q_OS_WIN
+ index = QNetworkInformationBackend::PluginNamesWindowsIndex;
+#elif defined(Q_OS_DARWIN)
+ index = QNetworkInformationBackend::PluginNamesAppleIndex;
+#elif defined(Q_OS_ANDROID)
+ index = QNetworkInformationBackend::PluginNamesAndroidIndex;
+#elif defined(Q_OS_LINUX)
+ index = QNetworkInformationBackend::PluginNamesLinuxIndex;
+#endif
+ if (index != -1 && loadBackendByName(QNetworkInformationBackend::PluginNames[index]))
+ return true;
+ // We assume reachability is the most commonly wanted feature, and try to
+ // load the backend that advertises the most features including that:
+ if (loadBackendByFeatures(Feature::Reachability))
+ return true;
+
+ // Fall back to the dummy backend
+ return loadBackendByName(u"dummy");
+}
+
+/*!
+ \since 6.4
+
Attempts to load a backend whose name matches \a backend
(case insensitively).
Returns \c true if it managed to load the requested backend or
- if it was already loaded. Returns \c false otherwise
+ if it was already loaded. Returns \c false otherwise.
\sa instance
*/
-bool QNetworkInformation::load(QStringView backend)
+bool QNetworkInformation::loadBackendByName(QStringView backend)
{
+ if (backend == u"dummy")
+ return QNetworkInformationPrivate::createDummy() != nullptr;
+
auto loadedBackend = QNetworkInformationPrivate::create(backend);
- return loadedBackend && loadedBackend->backendName() == backend;
+ return loadedBackend && loadedBackend->backendName().compare(backend, Qt::CaseInsensitive) == 0;
}
+#if QT_DEPRECATED_SINCE(6,4)
/*!
+ \deprecated [6.4] Use loadBackendByName() instead.
+
+ \sa loadBackendByName(), loadDefaultBackend(), loadBackendByFeatures()
+*/
+bool QNetworkInformation::load(QStringView backend)
+{
+ return loadBackendByName(backend);
+}
+#endif // QT_DEPRECATED_SINCE(6,4)
+
+/*!
+ \since 6.4
Load a backend which supports \a features.
Returns \c true if it managed to load the requested backend or
- if it was already loaded. Returns \c false otherwise
+ if it was already loaded. Returns \c false otherwise.
\sa instance
*/
-bool QNetworkInformation::load(Features features)
+bool QNetworkInformation::loadBackendByFeatures(Features features)
{
auto loadedBackend = QNetworkInformationPrivate::create(features);
return loadedBackend && loadedBackend->supports(features);
}
+#if QT_DEPRECATED_SINCE(6,4)
+/*!
+ \deprecated [6.4] Use loadBackendByFeatures() instead.
+
+ \sa loadBackendByName(), loadDefaultBackend(), loadBackendByFeatures()
+*/
+bool QNetworkInformation::load(Features features)
+{
+ return loadBackendByFeatures(features);
+}
+#endif // QT_DEPRECATED_SINCE(6,4)
+
/*!
Returns a list of the names of all currently available backends.
*/
@@ -550,3 +768,7 @@ QNetworkInformation *QNetworkInformation::instance()
}
QT_END_NAMESPACE
+
+#include "moc_qnetworkinformation.cpp"
+#include "moc_qnetworkinformation_p.cpp"
+#include "qnetworkinformation.moc"
diff --git a/src/network/kernel/qnetworkinformation.h b/src/network/kernel/qnetworkinformation.h
index bc71b37c64..4e70a7faf2 100644
--- a/src/network/kernel/qnetworkinformation.h
+++ b/src/network/kernel/qnetworkinformation.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QNETWORKINFORMATION_H
#define QNETWORKINFORMATION_H
@@ -49,11 +13,17 @@ QT_BEGIN_NAMESPACE
class QNetworkInformationBackend;
class QNetworkInformationPrivate;
+struct QNetworkInformationDeleter;
class Q_NETWORK_EXPORT QNetworkInformation : public QObject
{
Q_OBJECT
Q_DECLARE_PRIVATE(QNetworkInformation)
Q_PROPERTY(Reachability reachability READ reachability NOTIFY reachabilityChanged)
+ Q_PROPERTY(bool isBehindCaptivePortal READ isBehindCaptivePortal
+ NOTIFY isBehindCaptivePortalChanged)
+ Q_PROPERTY(TransportMedium transportMedium READ transportMedium NOTIFY transportMediumChanged)
+ Q_PROPERTY(bool isMetered READ isMetered NOTIFY isMeteredChanged)
+ Q_CLASSINFO("RegisterEnumClassesUnscoped", "false")
public:
enum class Reachability {
Unknown,
@@ -64,31 +34,58 @@ public:
};
Q_ENUM(Reachability)
+ enum class TransportMedium {
+ Unknown,
+ Ethernet,
+ Cellular,
+ WiFi,
+ Bluetooth,
+ };
+ Q_ENUM(TransportMedium)
+
enum class Feature {
Reachability = 0x1,
+ CaptivePortal = 0x2,
+ TransportMedium = 0x4,
+ Metered = 0x8,
};
Q_DECLARE_FLAGS(Features, Feature)
Q_FLAG(Features)
- ~QNetworkInformation() override;
-
Reachability reachability() const;
+ bool isBehindCaptivePortal() const;
+
+ TransportMedium transportMedium() const;
+
+ bool isMetered() const;
+
QString backendName() const;
- virtual bool supports(Features features) const;
+ bool supports(Features features) const;
+ Features supportedFeatures() const;
- static bool load(QStringView backend = {});
- static bool load(Features features);
+ static bool loadDefaultBackend();
+ static bool loadBackendByName(QStringView backend);
+ static bool loadBackendByFeatures(Features features);
+#if QT_DEPRECATED_SINCE(6,4)
+ QT_DEPRECATED_VERSION_X_6_4("Use loadBackendByName") static bool load(QStringView backend);
+ QT_DEPRECATED_VERSION_X_6_4("Use loadBackendByFeatures") static bool load(Features features);
+#endif
static QStringList availableBackends();
static QNetworkInformation *instance();
Q_SIGNALS:
void reachabilityChanged(Reachability newReachability);
+ void isBehindCaptivePortalChanged(bool state);
+ void transportMediumChanged(TransportMedium current);
+ void isMeteredChanged(bool isMetered);
private:
+ friend struct QNetworkInformationDeleter;
friend class QNetworkInformationPrivate;
QNetworkInformation(QNetworkInformationBackend *backend);
+ ~QNetworkInformation() override;
Q_DISABLE_COPY_MOVE(QNetworkInformation)
};
diff --git a/src/network/kernel/qnetworkinformation_p.h b/src/network/kernel/qnetworkinformation_p.h
index 8cb31e6641..504955a6e1 100644
--- a/src/network/kernel/qnetworkinformation_p.h
+++ b/src/network/kernel/qnetworkinformation_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QNETWORKINFORMATION_P_H
#define QNETWORKINFORMATION_P_H
@@ -56,35 +20,112 @@
#include <QtNetwork/qnetworkinformation.h>
#include <QtCore/qloggingcategory.h>
+#include <QtCore/qreadwritelock.h>
QT_BEGIN_NAMESPACE
class Q_NETWORK_EXPORT QNetworkInformationBackend : public QObject
{
Q_OBJECT
+
+ using Reachability = QNetworkInformation::Reachability;
+ using TransportMedium = QNetworkInformation::TransportMedium;
+
public:
+ static inline const char16_t PluginNames[4][22] = {
+ { u"networklistmanager" },
+ { u"scnetworkreachability" },
+ { u"android" },
+ { u"networkmanager" },
+ };
+ static constexpr int PluginNamesWindowsIndex = 0;
+ static constexpr int PluginNamesAppleIndex = 1;
+ static constexpr int PluginNamesAndroidIndex = 2;
+ static constexpr int PluginNamesLinuxIndex = 3;
+
QNetworkInformationBackend() = default;
~QNetworkInformationBackend() override;
virtual QString name() const = 0;
virtual QNetworkInformation::Features featuresSupported() const = 0;
- QNetworkInformation::Reachability reachability() const { return m_reachability; }
+ Reachability reachability() const
+ {
+ QReadLocker locker(&m_lock);
+ return m_reachability;
+ }
+
+ bool behindCaptivePortal() const
+ {
+ QReadLocker locker(&m_lock);
+ return m_behindCaptivePortal;
+ }
+
+ TransportMedium transportMedium() const
+ {
+ QReadLocker locker(&m_lock);
+ return m_transportMedium;
+ }
+
+ bool isMetered() const
+ {
+ QReadLocker locker(&m_lock);
+ return m_metered;
+ }
Q_SIGNALS:
- void reachabilityChanged();
+ void reachabilityChanged(Reachability reachability);
+ void behindCaptivePortalChanged(bool behindPortal);
+ void transportMediumChanged(TransportMedium medium);
+ void isMeteredChanged(bool isMetered);
protected:
void setReachability(QNetworkInformation::Reachability reachability)
{
+ QWriteLocker locker(&m_lock);
if (m_reachability != reachability) {
m_reachability = reachability;
- emit reachabilityChanged();
+ locker.unlock();
+ emit reachabilityChanged(reachability);
+ }
+ }
+
+ void setBehindCaptivePortal(bool behindPortal)
+ {
+ QWriteLocker locker(&m_lock);
+ if (m_behindCaptivePortal != behindPortal) {
+ m_behindCaptivePortal = behindPortal;
+ locker.unlock();
+ emit behindCaptivePortalChanged(behindPortal);
+ }
+ }
+
+ void setTransportMedium(TransportMedium medium)
+ {
+ QWriteLocker locker(&m_lock);
+ if (m_transportMedium != medium) {
+ m_transportMedium = medium;
+ locker.unlock();
+ emit transportMediumChanged(medium);
+ }
+ }
+
+ void setMetered(bool isMetered)
+ {
+ QWriteLocker locker(&m_lock);
+ if (m_metered != isMetered) {
+ m_metered = isMetered;
+ locker.unlock();
+ emit isMeteredChanged(isMetered);
}
}
private:
- QNetworkInformation::Reachability m_reachability = QNetworkInformation::Reachability::Unknown;
+ mutable QReadWriteLock m_lock;
+ Reachability m_reachability = Reachability::Unknown;
+ TransportMedium m_transportMedium = TransportMedium::Unknown;
+ bool m_behindCaptivePortal = false;
+ bool m_metered = false;
Q_DISABLE_COPY_MOVE(QNetworkInformationBackend)
friend class QNetworkInformation;
@@ -94,12 +135,15 @@ private:
class Q_NETWORK_EXPORT QNetworkInformationBackendFactory : public QObject
{
Q_OBJECT
+
+ using Features = QNetworkInformation::Features;
+
public:
QNetworkInformationBackendFactory();
virtual ~QNetworkInformationBackendFactory();
virtual QString name() const = 0;
- virtual QNetworkInformationBackend *create(QNetworkInformation::Features requiredFeatures) const = 0;
- virtual QNetworkInformation::Features featuresSupported() const = 0;
+ virtual QNetworkInformationBackend *create(Features requiredFeatures) const = 0;
+ virtual Features featuresSupported() const = 0;
private:
Q_DISABLE_COPY_MOVE(QNetworkInformationBackendFactory)
diff --git a/src/network/kernel/qnetworkinterface.cpp b/src/network/kernel/qnetworkinterface.cpp
index 6e87a783a8..f03e85c7f6 100644
--- a/src/network/kernel/qnetworkinterface.cpp
+++ b/src/network/kernel/qnetworkinterface.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2017 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2017 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qnetworkinterface.h"
#include "qnetworkinterface_p.h"
@@ -49,6 +13,12 @@
QT_BEGIN_NAMESPACE
+QT_IMPL_METATYPE_EXTERN(QNetworkAddressEntry)
+QT_IMPL_METATYPE_EXTERN(QNetworkInterface)
+
+static_assert(QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+ && sizeof(QScopedPointer<QNetworkAddressEntryPrivate>) == sizeof(std::unique_ptr<QNetworkAddressEntryPrivate>));
+
static QList<QNetworkInterfacePrivate *> postProcess(QList<QNetworkInterfacePrivate *> list)
{
// Some platforms report a netmask but don't report a broadcast address
@@ -139,7 +109,7 @@ QString QNetworkInterfacePrivate::makeHwAddress(int len, uchar *data)
QChar *out = result.data();
for (int i = 0; i < len; ++i) {
if (i)
- *out++ = QLatin1Char(':');
+ *out++ = u':';
*out++ = QLatin1Char(QtMiscUtils::toHexUpper(data[i] / 16));
*out++ = QLatin1Char(QtMiscUtils::toHexUpper(data[i] % 16));
}
@@ -204,7 +174,7 @@ QNetworkAddressEntry::QNetworkAddressEntry()
object \a other.
*/
QNetworkAddressEntry::QNetworkAddressEntry(const QNetworkAddressEntry &other)
- : d(new QNetworkAddressEntryPrivate(*other.d.data()))
+ : d(new QNetworkAddressEntryPrivate(*other.d.get()))
{
}
@@ -213,7 +183,7 @@ QNetworkAddressEntry::QNetworkAddressEntry(const QNetworkAddressEntry &other)
*/
QNetworkAddressEntry &QNetworkAddressEntry::operator=(const QNetworkAddressEntry &other)
{
- *d.data() = *other.d.data();
+ *d.get() = *other.d.get();
return *this;
}
@@ -489,7 +459,7 @@ void QNetworkAddressEntry::clearAddressLifetime()
\since 5.11
Returns \c true if this address is permanent on this interface, \c false if
- it's temporary. A permenant address is one which has no expiration time and
+ it's temporary. A permanent address is one which has no expiration time and
is often static (manually configured).
If this information could not be determined, this function returns \c true.
@@ -903,7 +873,7 @@ QList<QHostAddress> QNetworkInterface::allAddresses()
if ((p->flags & QNetworkInterface::IsUp) == 0)
continue;
- for (const QNetworkAddressEntry &entry : qAsConst(p->addressEntries))
+ for (const QNetworkAddressEntry &entry : std::as_const(p->addressEntries))
result += entry.ip();
}
@@ -928,17 +898,32 @@ static inline QDebug flagsDebug(QDebug debug, QNetworkInterface::InterfaceFlags
return debug;
}
-static inline QDebug operator<<(QDebug debug, const QNetworkAddressEntry &entry)
+/*!
+ \since 6.2
+
+ Writes the QNetworkAddressEntry \a entry to the stream and
+ returns a reference to the \a debug stream.
+
+ \relates QNetworkAddressEntry
+ */
+QDebug operator<<(QDebug debug, const QNetworkAddressEntry &entry)
{
- debug << "(address = " << entry.ip();
+ QDebugStateSaver saver(debug);
+ debug.resetFormat().nospace();
+ debug << "address = " << entry.ip();
if (!entry.netmask().isNull())
debug << ", netmask = " << entry.netmask();
if (!entry.broadcast().isNull())
debug << ", broadcast = " << entry.broadcast();
- debug << ')';
return debug;
}
+/*!
+ Writes the QNetworkInterface \a networkInterface to the stream and
+ returns a reference to the \a debug stream.
+
+ \relates QNetworkInterface
+ */
QDebug operator<<(QDebug debug, const QNetworkInterface &networkInterface)
{
QDebugStateSaver saver(debug);
diff --git a/src/network/kernel/qnetworkinterface.h b/src/network/kernel/qnetworkinterface.h
index c65ea58860..2d79f9e2a1 100644
--- a/src/network/kernel/qnetworkinterface.h
+++ b/src/network/kernel/qnetworkinterface.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QNETWORKINTERFACE_H
#define QNETWORKINTERFACE_H
@@ -45,6 +9,8 @@
#include <QtCore/qscopedpointer.h>
#include <QtNetwork/qhostaddress.h>
+#include <memory>
+
#ifndef QT_NO_NETWORKINTERFACE
QT_BEGIN_NAMESPACE
@@ -67,7 +33,7 @@ public:
QNetworkAddressEntry &operator=(const QNetworkAddressEntry &other);
~QNetworkAddressEntry();
- void swap(QNetworkAddressEntry &other) noexcept { qSwap(d, other.d); }
+ void swap(QNetworkAddressEntry &other) noexcept { d.swap(other.d); }
bool operator==(const QNetworkAddressEntry &other) const;
inline bool operator!=(const QNetworkAddressEntry &other) const
@@ -96,7 +62,8 @@ public:
bool isTemporary() const { return !isPermanent(); }
private:
- QScopedPointer<QNetworkAddressEntryPrivate> d;
+ // ### Qt 7: make implicitly shared
+ std::unique_ptr<QNetworkAddressEntryPrivate> d;
};
Q_DECLARE_SHARED(QNetworkAddressEntry)
@@ -143,7 +110,7 @@ public:
QNetworkInterface &operator=(const QNetworkInterface &other);
~QNetworkInterface();
- void swap(QNetworkInterface &other) noexcept { qSwap(d, other.d); }
+ void swap(QNetworkInterface &other) noexcept { d.swap(other.d); }
bool isValid() const;
@@ -173,13 +140,14 @@ Q_DECLARE_SHARED(QNetworkInterface)
Q_DECLARE_OPERATORS_FOR_FLAGS(QNetworkInterface::InterfaceFlags)
#ifndef QT_NO_DEBUG_STREAM
+Q_NETWORK_EXPORT QDebug operator<<(QDebug debug, const QNetworkAddressEntry &entry);
Q_NETWORK_EXPORT QDebug operator<<(QDebug debug, const QNetworkInterface &networkInterface);
#endif
QT_END_NAMESPACE
-Q_DECLARE_METATYPE(QNetworkAddressEntry)
-Q_DECLARE_METATYPE(QNetworkInterface)
+QT_DECL_METATYPE_EXTERN(QNetworkAddressEntry, Q_NETWORK_EXPORT)
+QT_DECL_METATYPE_EXTERN(QNetworkInterface, Q_NETWORK_EXPORT)
#endif // QT_NO_NETWORKINTERFACE
diff --git a/src/network/kernel/qnetworkinterface_linux.cpp b/src/network/kernel/qnetworkinterface_linux.cpp
index ce36bf2e11..67ed8006bb 100644
--- a/src/network/kernel/qnetworkinterface_linux.cpp
+++ b/src/network/kernel/qnetworkinterface_linux.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qnetworkinterface.h"
#include "qnetworkinterface_p.h"
@@ -47,7 +11,7 @@
#include <qobjectdefs.h>
#include <qvarlengtharray.h>
-// accordding to rtnetlink(7)
+// according to rtnetlink(7)
#include <asm/types.h>
#include <linux/if.h>
#include <linux/if_arp.h>
@@ -147,7 +111,10 @@ struct NetlinkSocket
template <typename Lambda> struct ProcessNetlinkRequest
{
using FunctionTraits = QtPrivate::FunctionPointer<decltype(&Lambda::operator())>;
- using FirstArgument = typename FunctionTraits::Arguments::Car;
+ using FirstArgumentPointer = typename FunctionTraits::Arguments::Car;
+ using FirstArgument = std::remove_pointer_t<FirstArgumentPointer>;
+ static_assert(std::is_pointer_v<FirstArgumentPointer>);
+ static_assert(std::is_aggregate_v<FirstArgument>);
static int expectedTypeForRequest(int rtype)
{
@@ -172,7 +139,7 @@ template <typename Lambda> struct ProcessNetlinkRequest
if (!NLMSG_OK(hdr, quint32(len)))
return;
- auto arg = reinterpret_cast<FirstArgument>(NLMSG_DATA(hdr));
+ auto arg = static_cast<FirstArgument *>(NLMSG_DATA(hdr));
size_t payloadLen = NLMSG_PAYLOAD(hdr, 0);
// is this a multipart message?
@@ -192,7 +159,7 @@ template <typename Lambda> struct ProcessNetlinkRequest
// NLMSG_NEXT also updates the len variable
hdr = NLMSG_NEXT(hdr, len);
- arg = reinterpret_cast<FirstArgument>(NLMSG_DATA(hdr));
+ arg = static_cast<FirstArgument *>(NLMSG_DATA(hdr));
payloadLen = NLMSG_PAYLOAD(hdr, 0);
} while (NLMSG_OK(hdr, quint32(len)));
@@ -222,7 +189,7 @@ void processNetlinkRequest(int sock, struct nlmsghdr *hdr, char *buf, size_t buf
uint QNetworkInterfaceManager::interfaceIndexFromName(const QString &name)
{
uint index = 0;
- if (name.length() >= IFNAMSIZ)
+ if (name.size() >= IFNAMSIZ)
return index;
int socket = qt_safe_socket(AF_INET, SOCK_DGRAM, 0);
@@ -345,7 +312,7 @@ static void getAddresses(int sock, char *buf, QList<QNetworkInterfacePrivate *>
// find the interface this is relevant to
QNetworkInterfacePrivate *iface = nullptr;
- for (auto candidate : qAsConst(result)) {
+ for (auto candidate : std::as_const(result)) {
if (candidate->index != int(ifa->ifa_index))
continue;
iface = candidate;
diff --git a/src/network/kernel/qnetworkinterface_p.h b/src/network/kernel/qnetworkinterface_p.h
index b879a397f2..2a24826a3e 100644
--- a/src/network/kernel/qnetworkinterface_p.h
+++ b/src/network/kernel/qnetworkinterface_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QNETWORKINTERFACEPRIVATE_H
#define QNETWORKINTERFACEPRIVATE_H
@@ -56,7 +20,6 @@
#include <QtCore/qatomic.h>
#include <QtCore/qdeadlinetimer.h>
#include <QtCore/qlist.h>
-#include <QtCore/qreadwritelock.h>
#include <QtCore/qstring.h>
#include <QtNetwork/qhostaddress.h>
#include <QtNetwork/qabstractsocket.h>
@@ -104,14 +67,15 @@ public:
{
// this implements an algorithm that yields the same results as Windows
// produces, for the same input (as far as I can test)
- if (isTemporary || isDeprecated)
+ if (isTemporary || isDeprecated) {
entry->setDnsEligibility(QNetworkAddressEntry::DnsIneligible);
-
- AddressClassification cl = QHostAddressPrivate::classify(entry->ip());
- if (cl == LoopbackAddress || cl == LinkLocalAddress)
- entry->setDnsEligibility(QNetworkAddressEntry::DnsIneligible);
- else
- entry->setDnsEligibility(QNetworkAddressEntry::DnsEligible);
+ } else {
+ AddressClassification cl = QHostAddressPrivate::classify(entry->ip());
+ if (cl == LoopbackAddress || cl == LinkLocalAddress)
+ entry->setDnsEligibility(QNetworkAddressEntry::DnsIneligible);
+ else
+ entry->setDnsEligibility(QNetworkAddressEntry::DnsEligible);
+ }
}
private:
diff --git a/src/network/kernel/qnetworkinterface_uikit_p.h b/src/network/kernel/qnetworkinterface_uikit_p.h
index ea40e74f5c..49e2db007b 100644
--- a/src/network/kernel/qnetworkinterface_uikit_p.h
+++ b/src/network/kernel/qnetworkinterface_uikit_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QNETWORKINTERFACE_UIKIT_P_H
#define QNETWORKINTERFACE_UIKIT_P_H
@@ -237,26 +201,5 @@ struct in6_ifreq {
#define SIOCGIFAFLAG_IN6 _IOWR('i', 73, struct in6_ifreq)
#define SIOCGIFALIFETIME_IN6 _IOWR('i', 81, struct in6_ifreq)
-// The definition below is ONLY a temporary workaround to unblock
-// integrations on CI. MUST be removed ASAP, as soon as SDK is
-// updated. Currently, we have WatchOS SDK 3.2 and it's missing
-// net/if_types.h (unlike SDK 4.0, which has it). Alas, we have to
-// work this around. We only define constants that we use in code.
-
-#if !QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_NA, __IPHONE_NA, __TVOS_NA, __WATCHOS_4_0)
-
-#define QT_WATCHOS_OUTDATED_SDK_WORKAROUND
-
-#define IFT_PPP 0x17 /* RFC 1331 */
-#define IFT_LOOP 0x18 /* loopback */
-#define IFT_SLIP 0x1c /* IP over generic TTY */
-
-#define IFT_GIF 0x37 /*0xf0*/
-#define IFT_STF 0x39 /*0xf3*/
-
-#define IFT_IEEE1394 0x90 /* IEEE1394 High Performance SerialBus*/
-
-#endif // WatchOS SDK below 4.0
-
#endif // QNETWORKINTERFACE_UIKIT_P_H
diff --git a/src/network/kernel/qnetworkinterface_unix.cpp b/src/network/kernel/qnetworkinterface_unix.cpp
index 5b34b99caa..c0a7d9e00d 100644
--- a/src/network/kernel/qnetworkinterface_unix.cpp
+++ b/src/network/kernel/qnetworkinterface_unix.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qbytearray.h"
#include "qset.h"
@@ -53,11 +17,7 @@
# include "qdatetime.h"
#endif
-#if defined(QT_LINUXBASE)
-# define QT_NO_GETIFADDRS
-#endif
-
-#ifndef QT_NO_GETIFADDRS
+#if QT_CONFIG(getifaddrs)
# include <ifaddrs.h>
#endif
@@ -92,36 +52,49 @@ static QHostAddress addressFromSockaddr(sockaddr *sa, int ifindex = 0, const QSt
}
}
return address;
+}
+
+template <typename Req> [[maybe_unused]]
+static auto &ifreq_index(Req &req, std::enable_if_t<sizeof(std::declval<Req>().ifr_index) != 0, int> = 0)
+{
+ return req.ifr_index;
+}
+template <typename Req> [[maybe_unused]]
+static auto &ifreq_index(Req &req, std::enable_if_t<sizeof(std::declval<Req>().ifr_ifindex) != 0, int> = 0)
+{
+ return req.ifr_ifindex;
}
uint QNetworkInterfaceManager::interfaceIndexFromName(const QString &name)
{
-#ifndef QT_NO_IPV6IFNAME
- return ::if_nametoindex(name.toLatin1());
+#if QT_CONFIG(ipv6ifname)
+ return ::if_nametoindex(name.toLatin1().constData());
#elif defined(SIOCGIFINDEX)
struct ifreq req;
int socket = qt_safe_socket(AF_INET, SOCK_STREAM, 0);
if (socket < 0)
return 0;
- QByteArray name8bit = name.toLatin1();
+ const QByteArray name8bit = name.toLatin1();
memset(&req, 0, sizeof(ifreq));
- memcpy(req.ifr_name, name8bit, qMin<int>(name8bit.length() + 1, sizeof(req.ifr_name) - 1));
+ if (!name8bit.isNull())
+ memcpy(req.ifr_name, name8bit.data(), qMin(size_t(name8bit.length()) + 1, sizeof(req.ifr_name) - 1));
uint id = 0;
if (qt_safe_ioctl(socket, SIOCGIFINDEX, &req) >= 0)
- id = req.ifr_ifindex;
+ id = ifreq_index(req);
qt_safe_close(socket);
return id;
#else
+ Q_UNUSED(name);
return 0;
#endif
}
QString QNetworkInterfaceManager::interfaceNameFromIndex(uint index)
{
-#ifndef QT_NO_IPV6IFNAME
+#if QT_CONFIG(ipv6ifname)
char buf[IF_NAMESIZE];
if (::if_indextoname(index, buf))
return QString::fromLatin1(buf);
@@ -130,8 +103,7 @@ QString QNetworkInterfaceManager::interfaceNameFromIndex(uint index)
int socket = qt_safe_socket(AF_INET, SOCK_STREAM, 0);
if (socket >= 0) {
memset(&req, 0, sizeof(ifreq));
- req.ifr_ifindex = index;
-
+ ifreq_index(req) = index;
if (qt_safe_ioctl(socket, SIOCGIFNAME, &req) >= 0) {
qt_safe_close(socket);
return QString::fromLatin1(req.ifr_name);
@@ -151,13 +123,13 @@ static int getMtu(int socket, struct ifreq *req)
return 0;
}
-#ifdef QT_NO_GETIFADDRS
+#if !QT_CONFIG(getifaddrs)
// getifaddrs not available
static QSet<QByteArray> interfaceNames(int socket)
{
QSet<QByteArray> result;
-#ifdef QT_NO_IPV6IFNAME
+#if !QT_CONFIG(ipv6ifname)
QByteArray storageBuffer;
struct ifconf interfaceList;
static const int STORAGEBUFFER_GROWTH = 256;
@@ -212,15 +184,11 @@ static QNetworkInterfacePrivate *findInterface(int socket, QList<QNetworkInterfa
QNetworkInterfacePrivate *iface = nullptr;
int ifindex = 0;
-#if !defined(QT_NO_IPV6IFNAME) || defined(SIOCGIFINDEX)
+#if QT_CONFIG(ipv6ifname) || defined(SIOCGIFINDEX)
// Get the interface index
# ifdef SIOCGIFINDEX
if (qt_safe_ioctl(socket, SIOCGIFINDEX, &req) >= 0)
-# if defined(Q_OS_HAIKU)
- ifindex = req.ifr_index;
-# else
- ifindex = req.ifr_ifindex;
-# endif
+ ifindex = ifreq_index(req);
# else
ifindex = if_nametoindex(req.ifr_name);
# endif
@@ -234,10 +202,11 @@ static QNetworkInterfacePrivate *findInterface(int socket, QList<QNetworkInterfa
break;
}
#else
+ Q_UNUSED(socket);
// Search by name
QList<QNetworkInterfacePrivate *>::Iterator if_it = interfaces.begin();
for ( ; if_it != interfaces.end(); ++if_it)
- if ((*if_it)->name == QLatin1String(req.ifr_name)) {
+ if ((*if_it)->name == QLatin1StringView(req.ifr_name)) {
// existing interface
iface = *if_it;
break;
@@ -267,7 +236,8 @@ static QList<QNetworkInterfacePrivate *> interfaceListing()
for ( ; it != names.constEnd(); ++it) {
ifreq req;
memset(&req, 0, sizeof(ifreq));
- memcpy(req.ifr_name, *it, qMin<int>(it->length() + 1, sizeof(req.ifr_name) - 1));
+ if (!it->isNull())
+ memcpy(req.ifr_name, it->constData(), qMin(size_t(it->length()) + 1, sizeof(req.ifr_name) - 1));
QNetworkInterfacePrivate *iface = findInterface(socket, interfaces, req);
@@ -278,7 +248,8 @@ static QList<QNetworkInterfacePrivate *> interfaceListing()
iface->name = QString::fromLatin1(req.ifr_name);
// reset the name:
- memcpy(req.ifr_name, oldName, qMin<int>(oldName.length() + 1, sizeof(req.ifr_name) - 1));
+ if (!oldName.isNull())
+ memcpy(req.ifr_name, oldName.constData(), qMin(size_t(oldName.length()) + 1, sizeof(req.ifr_name) - 1));
} else
#endif
{
@@ -408,10 +379,7 @@ QT_BEGIN_INCLUDE_NAMESPACE
# include <net/if_dl.h>
#if defined(QT_PLATFORM_UIKIT)
# include "qnetworkinterface_uikit_p.h"
-#if !defined(QT_WATCHOS_OUTDATED_SDK_WORKAROUND)
-// TODO: remove it as soon as SDK is updated on CI!!!
# include <net/if_types.h>
-#endif
#else
# include <net/if_media.h>
# include <net/if_types.h>
@@ -488,7 +456,8 @@ static QList<QNetworkInterfacePrivate *> createInterfaces(ifaddrs *rawList)
// ensure both structs start with the name field, of size IFNAMESIZ
static_assert(sizeof(mediareq.ifm_name) == sizeof(req.ifr_name));
- Q_ASSERT(&mediareq.ifm_name == &req.ifr_name);
+ static_assert(offsetof(struct ifmediareq, ifm_name) == 0);
+ static_assert(offsetof(struct ifreq, ifr_name) == 0);
// on NetBSD we use AF_LINK and sockaddr_dl
// scan the list for that family
@@ -617,7 +586,7 @@ static QList<QNetworkInterfacePrivate *> interfaceListing()
interfaces = createInterfaces(interfaceListing);
for (ifaddrs *ptr = interfaceListing; ptr; ptr = ptr->ifa_next) {
// Find the interface
- QLatin1String name(ptr->ifa_name);
+ QLatin1StringView name(ptr->ifa_name);
QNetworkInterfacePrivate *iface = nullptr;
QList<QNetworkInterfacePrivate *>::Iterator if_it = interfaces.begin();
for ( ; if_it != interfaces.end(); ++if_it)
diff --git a/src/network/kernel/qnetworkinterface_unix_p.h b/src/network/kernel/qnetworkinterface_unix_p.h
index e5c8909eca..80af9c8e0d 100644
--- a/src/network/kernel/qnetworkinterface_unix_p.h
+++ b/src/network/kernel/qnetworkinterface_unix_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Copyright (C) 2017 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 The Qt Company Ltd.
+// Copyright (C) 2017 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QNETWORKINTERFACE_UNIX_P_H
#define QNETWORKINTERFACE_UNIX_P_H
diff --git a/src/network/kernel/qnetworkinterface_win.cpp b/src/network/kernel/qnetworkinterface_win.cpp
index a8d56a9b11..20e75139db 100644
--- a/src/network/kernel/qnetworkinterface_win.cpp
+++ b/src/network/kernel/qnetworkinterface_win.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#define WIN32_LEAN_AND_MEAN 1
diff --git a/src/network/kernel/qnetworkproxy.cpp b/src/network/kernel/qnetworkproxy.cpp
index 75f81a0037..62bba24bce 100644
--- a/src/network/kernel/qnetworkproxy.cpp
+++ b/src/network/kernel/qnetworkproxy.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
/*!
@@ -189,7 +153,7 @@
QNetworkProxy sets different capabilities by default when the
object is created (see QNetworkProxy::ProxyType for a list of the
- defaults). However, it is possible to change the capabitilies
+ defaults). However, it is possible to change the capabilities
after the object has been created with setCapabilities().
The capabilities that QNetworkProxy supports are:
@@ -243,6 +207,10 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
+QT_IMPL_METATYPE_EXTERN(QNetworkProxy)
+
class QSocks5SocketEngineHandler;
class QHttpSocketEngineHandler;
@@ -354,10 +322,8 @@ QList<QNetworkProxy> QGlobalNetworkProxy::proxyForQuery(const QNetworkProxyQuery
// don't look for proxies for a local connection
QHostAddress parsed;
QString hostname = query.url().host();
- if (hostname == QLatin1String("localhost")
- || hostname.startsWith(QLatin1String("localhost."))
- || (parsed.setAddress(hostname)
- && (parsed.isLoopback()))) {
+ if (hostname == "localhost"_L1 || hostname.startsWith("localhost."_L1)
+ || (parsed.setAddress(hostname) && (parsed.isLoopback()))) {
result << QNetworkProxy(QNetworkProxy::NoProxy);
return result;
}
@@ -1500,13 +1466,18 @@ void QNetworkProxyFactory::setApplicationProxyFactory(QNetworkProxyFactory *fact
Internet Explorer's settings and use them.
On \macos, this function will obtain the proxy settings using the
- SystemConfiguration framework from Apple. It will apply the FTP,
+ CFNetwork framework from Apple. It will apply the FTP,
HTTP and HTTPS proxy configurations for queries that contain the
protocol tag "ftp", "http" and "https", respectively. If the SOCKS
proxy is enabled in that configuration, this function will use the
SOCKS server for all queries. If SOCKS isn't enabled, it will use
the HTTPS proxy for all TcpSocket and UrlRequest queries.
+ On systems configured with libproxy support, this function will
+ rely on libproxy to obtain the proxy settings. Depending on
+ libproxy configurations, this can in turn delegate to desktop
+ settings, environment variables, etc.
+
On other systems, this function will pick up proxy settings from
the "http_proxy" environment variable. This variable must be a URL
using one of the following schemes: "http", "socks5" or "socks5h".
@@ -1518,9 +1489,6 @@ void QNetworkProxyFactory::setApplicationProxyFactory(QNetworkProxyFactory *fact
listed here.
\list
- \li On \macos, this function will ignore the Proxy Auto Configuration
- settings, since it cannot execute the associated ECMAScript code.
-
\li On Windows platforms, this function may take several seconds to
execute depending on the configuration of the user's system.
\endlist
@@ -1585,7 +1553,7 @@ QDebug operator<<(QDebug debug, const QNetworkProxy &proxy)
scaps << QStringLiteral("SctpTunnel");
if (caps & QNetworkProxy::SctpListeningCapability)
scaps << QStringLiteral("SctpListen");
- debug << '[' << scaps.join(QLatin1Char(' ')) << ']';
+ debug << '[' << scaps.join(u' ') << ']';
return debug;
}
@@ -1607,4 +1575,6 @@ QDebug operator<<(QDebug debug, const QNetworkProxyQuery &proxyQuery)
QT_END_NAMESPACE
+#include "moc_qnetworkproxy.cpp"
+
#endif // QT_NO_NETWORKPROXY
diff --git a/src/network/kernel/qnetworkproxy.h b/src/network/kernel/qnetworkproxy.h
index 1f0409e8ab..d04bd9ee13 100644
--- a/src/network/kernel/qnetworkproxy.h
+++ b/src/network/kernel/qnetworkproxy.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QNETWORKPROXY_H
#define QNETWORKPROXY_H
@@ -79,7 +43,7 @@ public:
QNetworkProxyQuery &operator=(const QNetworkProxyQuery &other);
~QNetworkProxyQuery();
- void swap(QNetworkProxyQuery &other) noexcept { qSwap(d, other.d); }
+ void swap(QNetworkProxyQuery &other) noexcept { d.swap(other.d); }
bool operator==(const QNetworkProxyQuery &other) const;
inline bool operator!=(const QNetworkProxyQuery &other) const
@@ -113,6 +77,7 @@ class QNetworkProxyPrivate;
class Q_NETWORK_EXPORT QNetworkProxy
{
+ Q_GADGET
public:
enum ProxyType {
DefaultProxy,
@@ -142,7 +107,7 @@ public:
QNetworkProxy &operator=(const QNetworkProxy &other);
~QNetworkProxy();
- void swap(QNetworkProxy &other) noexcept { qSwap(d, other.d); }
+ void swap(QNetworkProxy &other) noexcept { d.swap(other.d); }
bool operator==(const QNetworkProxy &other) const;
inline bool operator!=(const QNetworkProxy &other) const
@@ -210,7 +175,7 @@ Q_NETWORK_EXPORT QDebug operator<<(QDebug debug, const QNetworkProxyQuery &proxy
QT_END_NAMESPACE
-Q_DECLARE_METATYPE(QNetworkProxy)
+QT_DECL_METATYPE_EXTERN(QNetworkProxy, Q_NETWORK_EXPORT)
#endif // QT_NO_NETWORKPROXY
diff --git a/src/network/kernel/qnetworkproxy_android.cpp b/src/network/kernel/qnetworkproxy_android.cpp
index aba4cd3ec3..3d37266b70 100644
--- a/src/network/kernel/qnetworkproxy_android.cpp
+++ b/src/network/kernel/qnetworkproxy_android.cpp
@@ -1,44 +1,9 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qnetworkproxy.h"
+#include <QtCore/qcoreapplication_platform.h>
#include <QtCore/qjnienvironment.h>
#include <QtCore/qjniobject.h>
@@ -59,11 +24,13 @@ Q_GLOBAL_STATIC(ProxyInfoObject, proxyInfoInstance)
static const char networkClass[] = "org/qtproject/qt/android/network/QtNetwork";
+Q_DECLARE_JNI_CLASS(ProxyInfo, "android/net/ProxyInfo")
+Q_DECLARE_JNI_TYPE(JStringArray, "[Ljava/lang/String;")
+
ProxyInfoObject::ProxyInfoObject()
{
QJniObject::callStaticMethod<void>(networkClass,
"registerReceiver",
- "(Landroid/content/Context;)V",
QAndroidApplication::context());
}
@@ -71,7 +38,6 @@ ProxyInfoObject::~ProxyInfoObject()
{
QJniObject::callStaticMethod<void>(networkClass,
"unregisterReceiver",
- "(Landroid/content/Context;)V",
QAndroidApplication::context());
}
@@ -81,16 +47,14 @@ QList<QNetworkProxy> QNetworkProxyFactory::systemProxyForQuery(const QNetworkPro
if (!proxyInfoInstance)
return proxyList;
- QJniObject proxyInfo = QJniObject::callStaticObjectMethod(networkClass,
- "getProxyInfo",
- "(Landroid/content/Context;)Landroid/net/ProxyInfo;",
- QAndroidApplication::context());
+ QJniObject proxyInfo = QJniObject::callStaticObjectMethod<QtJniTypes::ProxyInfo>(
+ networkClass, "getProxyInfo", QAndroidApplication::context());
if (proxyInfo.isValid()) {
- QJniObject exclusionList = proxyInfo.callObjectMethod("getExclusionList",
- "()[Ljava/lang/String;");
+ QJniObject exclusionList =
+ proxyInfo.callObjectMethod<QtJniTypes::JStringArray>("getExclusionList");
bool exclude = false;
if (exclusionList.isValid()) {
- jobjectArray listObject = static_cast<jobjectArray>(exclusionList.object());
+ jobjectArray listObject = exclusionList.object<jobjectArray>();
QJniEnvironment env;
QJniObject entry;
const int size = env->GetArrayLength(listObject);
diff --git a/src/network/kernel/qnetworkproxy_mac.cpp b/src/network/kernel/qnetworkproxy_darwin.cpp
index a8327a40fb..d2bd4958dd 100644
--- a/src/network/kernel/qnetworkproxy_mac.cpp
+++ b/src/network/kernel/qnetworkproxy_darwin.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qnetworkproxy.h"
@@ -50,6 +14,7 @@
#include <QtCore/QUrl>
#include <QtCore/qendian.h>
#include <QtCore/qstringlist.h>
+#include <QtCore/qsystemdetection.h>
#include "private/qcore_mac_p.h"
/*
@@ -68,25 +33,33 @@
* \li Bypass list (by default: *.local, 169.254/16)
* \endlist
*
- * The matching configuration can be obtained by calling SCDynamicStoreCopyProxies
- * (from <SystemConfiguration/SCDynamicStoreCopySpecific.h>). See
+ * The matching configuration can be obtained by calling CFNetworkCopySystemProxySettings()
+ * (from <CFNetwork/CFProxySupport.h>). See
* Apple's documentation:
*
- * http://developer.apple.com/DOCUMENTATION/Networking/Reference/SysConfig/SCDynamicStoreCopySpecific/CompositePage.html#//apple_ref/c/func/SCDynamicStoreCopyProxies
+ * https://developer.apple.com/documentation/cfnetwork/1426754-cfnetworkcopysystemproxysettings?language=objc
*
*/
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
static bool isHostExcluded(CFDictionaryRef dict, const QString &host)
{
+ Q_ASSERT(dict);
+
if (host.isEmpty())
return true;
- bool isSimple = !host.contains(QLatin1Char('.')) && !host.contains(QLatin1Char(':'));
+#ifndef Q_OS_IOS
+ // On iOS all those keys are not available, and worse so - entries
+ // for HTTPS are not in the dictionary, but instead in some nested dictionary
+ // with undocumented keys/object types.
+ bool isSimple = !host.contains(u'.') && !host.contains(u':');
CFNumberRef excludeSimples;
if (isSimple &&
- (excludeSimples = (CFNumberRef)CFDictionaryGetValue(dict, kSCPropNetProxiesExcludeSimpleHostnames))) {
+ (excludeSimples = (CFNumberRef)CFDictionaryGetValue(dict, kCFNetworkProxiesExcludeSimpleHostnames))) {
int enabled;
if (CFNumberGetValue(excludeSimples, kCFNumberIntType, &enabled) && enabled)
return true;
@@ -97,7 +70,7 @@ static bool isHostExcluded(CFDictionaryRef dict, const QString &host)
// not a simple host name
// does it match the list of exclusions?
- CFArrayRef exclusionList = (CFArrayRef)CFDictionaryGetValue(dict, kSCPropNetProxiesExceptionsList);
+ CFArrayRef exclusionList = (CFArrayRef)CFDictionaryGetValue(dict, kCFNetworkProxiesExceptionsList);
if (!exclusionList)
return false;
@@ -115,7 +88,9 @@ static bool isHostExcluded(CFDictionaryRef dict, const QString &host)
return true;
}
}
-
+#else
+ Q_UNUSED(dict);
+#endif // Q_OS_IOS
// host was not excluded
return false;
}
@@ -146,7 +121,6 @@ static QNetworkProxy proxyFromDictionary(CFDictionaryRef dict, QNetworkProxy::Pr
return QNetworkProxy();
}
-
static QNetworkProxy proxyFromDictionary(CFDictionaryRef dict)
{
QNetworkProxy::ProxyType proxyType = QNetworkProxy::DefaultProxy;
@@ -212,16 +186,43 @@ QCFType<CFStringRef> stringByAddingPercentEscapes(CFStringRef originalPath)
return escaped.toCFString();
}
-} // anon namespace
+#ifdef Q_OS_IOS
+QList<QNetworkProxy> proxiesForQueryUrl(CFDictionaryRef dict, const QUrl &url)
+{
+ Q_ASSERT(dict);
+
+ const QCFType<CFURLRef> cfUrl = url.toCFURL();
+ const QCFType<CFArrayRef> proxies = CFNetworkCopyProxiesForURL(cfUrl, dict);
+ Q_ASSERT(proxies);
+
+ QList<QNetworkProxy> result;
+ const auto count = CFArrayGetCount(proxies);
+ if (!count) // Could be no proper proxy or host excluded.
+ return result;
+
+ for (CFIndex i = 0; i < count; ++i) {
+ const void *obj = CFArrayGetValueAtIndex(proxies, i);
+ if (CFGetTypeID(obj) != CFDictionaryGetTypeID())
+ continue;
+ const QNetworkProxy proxy = proxyFromDictionary(static_cast<CFDictionaryRef>(obj));
+ if (proxy.type() == QNetworkProxy::NoProxy || proxy.type() == QNetworkProxy::DefaultProxy)
+ continue;
+ result << proxy;
+ }
+
+ return result;
+}
+#endif // Q_OS_IOS
+} // unnamed namespace.
QList<QNetworkProxy> macQueryInternal(const QNetworkProxyQuery &query)
{
QList<QNetworkProxy> result;
// obtain a dictionary to the proxy settings:
- const QCFType<CFDictionaryRef> dict = SCDynamicStoreCopyProxies(NULL);
+ const QCFType<CFDictionaryRef> dict = CFNetworkCopySystemProxySettings();
if (!dict) {
- qWarning("QNetworkProxyFactory::systemProxyForQuery: SCDynamicStoreCopyProxies returned NULL");
+ qWarning("QNetworkProxyFactory::systemProxyForQuery: CFNetworkCopySystemProxySettings returned nullptr");
return result; // failed
}
@@ -230,13 +231,13 @@ QList<QNetworkProxy> macQueryInternal(const QNetworkProxyQuery &query)
// is there a PAC enabled? If so, use it first.
CFNumberRef pacEnabled;
- if ((pacEnabled = (CFNumberRef)CFDictionaryGetValue(dict, kSCPropNetProxiesProxyAutoConfigEnable))) {
+ if ((pacEnabled = (CFNumberRef)CFDictionaryGetValue(dict, kCFNetworkProxiesProxyAutoConfigEnable))) {
int enabled;
if (CFNumberGetValue(pacEnabled, kCFNumberIntType, &enabled) && enabled) {
// PAC is enabled
// kSCPropNetProxiesProxyAutoConfigURLString returns the URL string
// as entered in the system proxy configuration dialog
- CFStringRef pacLocationSetting = (CFStringRef)CFDictionaryGetValue(dict, kSCPropNetProxiesProxyAutoConfigURLString);
+ CFStringRef pacLocationSetting = (CFStringRef)CFDictionaryGetValue(dict, kCFNetworkProxiesProxyAutoConfigURLString);
auto cfPacLocation = stringByAddingPercentEscapes(pacLocationSetting);
QCFType<CFDataRef> pacData;
QCFType<CFURLRef> pacUrl = CFURLCreateWithString(kCFAllocatorDefault, cfPacLocation, NULL);
@@ -286,53 +287,77 @@ QList<QNetworkProxy> macQueryInternal(const QNetworkProxyQuery &query)
}
}
- // no PAC, decide which proxy we're looking for based on the query
- bool isHttps = false;
- QString protocol = query.protocolTag().toLower();
-
+ // No PAC, decide which proxy we're looking for based on the query
// try the protocol-specific proxy
+ const QString protocol = query.protocolTag();
QNetworkProxy protocolSpecificProxy;
- if (protocol == QLatin1String("ftp")) {
- protocolSpecificProxy =
- proxyFromDictionary(dict, QNetworkProxy::FtpCachingProxy,
- kSCPropNetProxiesFTPEnable,
- kSCPropNetProxiesFTPProxy,
- kSCPropNetProxiesFTPPort);
- } else if (protocol == QLatin1String("http")) {
+ if (protocol.compare("http"_L1, Qt::CaseInsensitive) == 0) {
protocolSpecificProxy =
proxyFromDictionary(dict, QNetworkProxy::HttpProxy,
- kSCPropNetProxiesHTTPEnable,
- kSCPropNetProxiesHTTPProxy,
- kSCPropNetProxiesHTTPPort);
- } else if (protocol == QLatin1String("https")) {
+ kCFNetworkProxiesHTTPEnable,
+ kCFNetworkProxiesHTTPProxy,
+ kCFNetworkProxiesHTTPPort);
+ }
+
+
+#ifdef Q_OS_IOS
+ if (protocolSpecificProxy.type() != QNetworkProxy::DefaultProxy
+ && protocolSpecificProxy.type() != QNetworkProxy::DefaultProxy) {
+ // HTTP proxy is enabled (on iOS there is no separate HTTPS, though
+ // 'dict' contains deeply buried entries which are the same as HTTP.
+ result << protocolSpecificProxy;
+ }
+
+ // TODO: check query.queryType()? It's possible, the exclude list
+ // did exclude it but above we added a proxy because HTTP proxy
+ // is found. We'll deal with such a situation later, since now NMI.
+ const auto proxiesForUrl = proxiesForQueryUrl(dict, query.url());
+ for (const auto &proxy : proxiesForUrl) {
+ if (!result.contains(proxy))
+ result << proxy;
+ }
+#else
+ bool isHttps = false;
+ if (protocol.compare("ftp"_L1, Qt::CaseInsensitive) == 0) {
+ protocolSpecificProxy =
+ proxyFromDictionary(dict, QNetworkProxy::FtpCachingProxy,
+ kCFNetworkProxiesFTPEnable,
+ kCFNetworkProxiesFTPProxy,
+ kCFNetworkProxiesFTPPort);
+ } else if (protocol.compare("https"_L1, Qt::CaseInsensitive) == 0) {
isHttps = true;
protocolSpecificProxy =
proxyFromDictionary(dict, QNetworkProxy::HttpProxy,
- kSCPropNetProxiesHTTPSEnable,
- kSCPropNetProxiesHTTPSProxy,
- kSCPropNetProxiesHTTPSPort);
+ kCFNetworkProxiesHTTPSEnable,
+ kCFNetworkProxiesHTTPSProxy,
+ kCFNetworkProxiesHTTPSPort);
}
+
if (protocolSpecificProxy.type() != QNetworkProxy::DefaultProxy)
result << protocolSpecificProxy;
// let's add SOCKSv5 if present too
QNetworkProxy socks5 = proxyFromDictionary(dict, QNetworkProxy::Socks5Proxy,
- kSCPropNetProxiesSOCKSEnable,
- kSCPropNetProxiesSOCKSProxy,
- kSCPropNetProxiesSOCKSPort);
+ kCFNetworkProxiesSOCKSEnable,
+ kCFNetworkProxiesSOCKSProxy,
+ kCFNetworkProxiesSOCKSPort);
if (socks5.type() != QNetworkProxy::DefaultProxy)
result << socks5;
// let's add the HTTPS proxy if present (and if we haven't added
// yet)
if (!isHttps) {
- QNetworkProxy https = proxyFromDictionary(dict, QNetworkProxy::HttpProxy,
- kSCPropNetProxiesHTTPSEnable,
- kSCPropNetProxiesHTTPSProxy,
- kSCPropNetProxiesHTTPSPort);
+ QNetworkProxy https;
+ https = proxyFromDictionary(dict, QNetworkProxy::HttpProxy,
+ kCFNetworkProxiesHTTPSEnable,
+ kCFNetworkProxiesHTTPSProxy,
+ kCFNetworkProxiesHTTPSPort);
+
+
if (https.type() != QNetworkProxy::DefaultProxy && https != protocolSpecificProxy)
result << https;
}
+#endif // !Q_OS_IOS
return result;
}
diff --git a/src/network/kernel/qnetworkproxy_generic.cpp b/src/network/kernel/qnetworkproxy_generic.cpp
index d2c7b29bc4..b915ee8fc8 100644
--- a/src/network/kernel/qnetworkproxy_generic.cpp
+++ b/src/network/kernel/qnetworkproxy_generic.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qnetworkproxy.h"
@@ -51,6 +15,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
static bool ignoreProxyFor(const QNetworkProxyQuery &query)
{
const QByteArray noProxy = qgetenv("no_proxy").trimmed();
@@ -62,7 +28,7 @@ static bool ignoreProxyFor(const QNetworkProxyQuery &query)
const QList<QByteArray> noProxyTokens = noProxy.split(',');
for (const QByteArray &rawToken : noProxyTokens) {
- auto token = QLatin1String(rawToken).trimmed();
+ auto token = QLatin1StringView(rawToken).trimmed();
// Since we use suffix matching, "*" is our 'default' behaviour
if (token.startsWith(u'*'))
@@ -101,11 +67,11 @@ QList<QNetworkProxy> QNetworkProxyFactory::systemProxyForQuery(const QNetworkPro
const QString queryProtocol = query.protocolTag();
QByteArray proxy_env;
- if (queryProtocol == QLatin1String("http"))
+ if (queryProtocol == "http"_L1)
proxy_env = qgetenv("http_proxy");
- else if (queryProtocol == QLatin1String("https"))
+ else if (queryProtocol == "https"_L1)
proxy_env = qgetenv("https_proxy");
- else if (queryProtocol == QLatin1String("ftp"))
+ else if (queryProtocol == "ftp"_L1)
proxy_env = qgetenv("ftp_proxy");
else
proxy_env = qgetenv("all_proxy");
@@ -117,16 +83,16 @@ QList<QNetworkProxy> QNetworkProxyFactory::systemProxyForQuery(const QNetworkPro
if (!proxy_env.isEmpty()) {
QUrl url = QUrl(QString::fromLocal8Bit(proxy_env));
const QString scheme = url.scheme();
- if (scheme == QLatin1String("socks5")) {
+ if (scheme == "socks5"_L1) {
QNetworkProxy proxy(QNetworkProxy::Socks5Proxy, url.host(),
url.port() ? url.port() : 1080, url.userName(), url.password());
proxyList << proxy;
- } else if (scheme == QLatin1String("socks5h")) {
+ } else if (scheme == "socks5h"_L1) {
QNetworkProxy proxy(QNetworkProxy::Socks5Proxy, url.host(),
url.port() ? url.port() : 1080, url.userName(), url.password());
proxy.setCapabilities(QNetworkProxy::HostNameLookupCapability);
proxyList << proxy;
- } else if ((scheme.isEmpty() || scheme == QLatin1String("http"))
+ } else if ((scheme.isEmpty() || scheme == "http"_L1)
&& query.queryType() != QNetworkProxyQuery::UdpSocket
&& query.queryType() != QNetworkProxyQuery::TcpServer) {
QNetworkProxy proxy(QNetworkProxy::HttpProxy, url.host(),
diff --git a/src/network/kernel/qnetworkproxy_libproxy.cpp b/src/network/kernel/qnetworkproxy_libproxy.cpp
index 29d2a0bd3b..248a8d2456 100644
--- a/src/network/kernel/qnetworkproxy_libproxy.cpp
+++ b/src/network/kernel/qnetworkproxy_libproxy.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2017 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2017 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qnetworkproxy.h"
@@ -48,12 +12,15 @@
#include <QtCore/QUrl>
#include <QtCore/private/qeventdispatcher_unix_p.h>
#include <QtCore/private/qthread_p.h>
+#include <QtCore/qapplicationstatic.h>
#include <proxy.h>
#include <dlfcn.h>
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
static bool isThreadingNeeded()
{
// Try to guess if the libproxy we linked to is from the libproxy project
@@ -106,7 +73,7 @@ private:
Data *request;
};
-Q_GLOBAL_STATIC(QLibProxyWrapper, libProxyWrapper);
+Q_APPLICATION_STATIC(QLibProxyWrapper, libProxyWrapper)
QLibProxyWrapper::QLibProxyWrapper()
{
@@ -221,14 +188,13 @@ QList<QNetworkProxy> QNetworkProxyFactory::systemProxyForQuery(const QNetworkPro
for (const QUrl& url : rawProxies) {
QNetworkProxy::ProxyType type;
const QString scheme = url.scheme();
- if (scheme == QLatin1String("http")) {
+ if (scheme == "http"_L1) {
type = QNetworkProxy::HttpProxy;
- } else if (scheme == QLatin1String("socks")
- || scheme == QLatin1String("socks5")) {
+ } else if (scheme == "socks"_L1 || scheme == "socks5"_L1) {
type = QNetworkProxy::Socks5Proxy;
- } else if (scheme == QLatin1String("ftp")) {
+ } else if (scheme == "ftp"_L1) {
type = QNetworkProxy::FtpCachingProxy;
- } else if (scheme == QLatin1String("direct")) {
+ } else if (scheme == "direct"_L1) {
type = QNetworkProxy::NoProxy;
haveDirectConnection = true;
} else {
diff --git a/src/network/kernel/qnetworkproxy_win.cpp b/src/network/kernel/qnetworkproxy_win.cpp
index 30663917ce..a2daa62e84 100644
--- a/src/network/kernel/qnetworkproxy_win.cpp
+++ b/src/network/kernel/qnetworkproxy_win.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qnetworkproxy.h"
@@ -45,109 +9,38 @@
#include <qstringlist.h>
#include <qregularexpression.h>
#include <qurl.h>
-#include <private/qsystemlibrary_p.h>
#include <qnetworkinterface.h>
#include <qdebug.h>
+#include <qvarlengtharray.h>
+#include <qhash.h>
#include <string.h>
#include <qt_windows.h>
-#include <wininet.h>
#include <lmcons.h>
-
-/*
- * Information on the WinHTTP DLL:
- * http://msdn.microsoft.com/en-us/library/aa384122(VS.85).aspx example for WPAD
- *
- * http://msdn.microsoft.com/en-us/library/aa384097(VS.85).aspx WinHttpGetProxyForUrl
- * http://msdn.microsoft.com/en-us/library/aa384096(VS.85).aspx WinHttpGetIEProxyConfigForCurrentUs
- * http://msdn.microsoft.com/en-us/library/aa384095(VS.85).aspx WinHttpGetDefaultProxyConfiguration
- */
-
-// We don't want to include winhttp.h because that's not
-// present in some Windows SDKs (I don't know why)
-// So, instead, copy the definitions here
-
-typedef struct {
- DWORD dwFlags;
- DWORD dwAutoDetectFlags;
- LPCWSTR lpszAutoConfigUrl;
- LPVOID lpvReserved;
- DWORD dwReserved;
- BOOL fAutoLogonIfChallenged;
-} WINHTTP_AUTOPROXY_OPTIONS;
-
-typedef struct {
- DWORD dwAccessType;
- LPWSTR lpszProxy;
- LPWSTR lpszProxyBypass;
-} WINHTTP_PROXY_INFO;
-
-typedef struct {
- BOOL fAutoDetect;
- LPWSTR lpszAutoConfigUrl;
- LPWSTR lpszProxy;
- LPWSTR lpszProxyBypass;
-} WINHTTP_CURRENT_USER_IE_PROXY_CONFIG;
-
-#define WINHTTP_AUTOPROXY_AUTO_DETECT 0x00000001
-#define WINHTTP_AUTOPROXY_CONFIG_URL 0x00000002
-
-#define WINHTTP_AUTO_DETECT_TYPE_DHCP 0x00000001
-#define WINHTTP_AUTO_DETECT_TYPE_DNS_A 0x00000002
-
-#define WINHTTP_ACCESS_TYPE_DEFAULT_PROXY 0
-#define WINHTTP_ACCESS_TYPE_NO_PROXY 1
-#define WINHTTP_ACCESS_TYPE_NAMED_PROXY 3
-
-#define WINHTTP_NO_PROXY_NAME NULL
-#define WINHTTP_NO_PROXY_BYPASS NULL
-
-#define WINHTTP_ERROR_BASE 12000
-#define ERROR_WINHTTP_LOGIN_FAILURE (WINHTTP_ERROR_BASE + 15)
-#define ERROR_WINHTTP_UNABLE_TO_DOWNLOAD_SCRIPT (WINHTTP_ERROR_BASE + 167)
-#define ERROR_WINHTTP_AUTODETECTION_FAILED (WINHTTP_ERROR_BASE + 180)
+#include <winhttp.h>
QT_BEGIN_NAMESPACE
-typedef BOOL (WINAPI * PtrWinHttpGetProxyForUrl)(HINTERNET, LPCWSTR, WINHTTP_AUTOPROXY_OPTIONS*, WINHTTP_PROXY_INFO*);
-typedef HINTERNET (WINAPI * PtrWinHttpOpen)(LPCWSTR, DWORD, LPCWSTR, LPCWSTR,DWORD);
-typedef BOOL (WINAPI * PtrWinHttpGetDefaultProxyConfiguration)(WINHTTP_PROXY_INFO*);
-typedef BOOL (WINAPI * PtrWinHttpGetIEProxyConfigForCurrentUser)(WINHTTP_CURRENT_USER_IE_PROXY_CONFIG*);
-typedef BOOL (WINAPI * PtrWinHttpCloseHandle)(HINTERNET);
-typedef BOOL (WINAPI * PtrCloseServiceHandle)(SC_HANDLE hSCObject);
-static PtrWinHttpGetProxyForUrl ptrWinHttpGetProxyForUrl = 0;
-static PtrWinHttpOpen ptrWinHttpOpen = 0;
-static PtrWinHttpGetDefaultProxyConfiguration ptrWinHttpGetDefaultProxyConfiguration = 0;
-static PtrWinHttpGetIEProxyConfigForCurrentUser ptrWinHttpGetIEProxyConfigForCurrentUser = 0;
-static PtrWinHttpCloseHandle ptrWinHttpCloseHandle = 0;
-
+using namespace Qt::StringLiterals;
static bool currentProcessIsService()
{
- typedef BOOL (WINAPI *PtrGetUserName)(LPTSTR lpBuffer, LPDWORD lpnSize);
- typedef BOOL (WINAPI *PtrLookupAccountName)(LPCTSTR lpSystemName, LPCTSTR lpAccountName, PSID Sid,
- LPDWORD cbSid, LPTSTR ReferencedDomainName, LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse);
- static PtrGetUserName ptrGetUserName = (PtrGetUserName)QSystemLibrary::resolve(QLatin1String("Advapi32"), "GetUserNameW");
- static PtrLookupAccountName ptrLookupAccountName = (PtrLookupAccountName)QSystemLibrary::resolve(QLatin1String("Advapi32"), "LookupAccountNameW");
-
- if (ptrGetUserName && ptrLookupAccountName) {
- wchar_t userName[UNLEN + 1] = L"";
- DWORD size = UNLEN;
- if (ptrGetUserName(userName, &size)) {
- SID_NAME_USE type = SidTypeUser;
- DWORD sidSize = 0;
- DWORD domainSize = 0;
- // first call is to get the correct size
- bool bRet = ptrLookupAccountName(NULL, userName, NULL, &sidSize, NULL, &domainSize, &type);
- if (bRet == FALSE && ERROR_INSUFFICIENT_BUFFER != GetLastError())
- return false;
- QVarLengthArray<BYTE, 68> buff(sidSize);
- QVarLengthArray<wchar_t, MAX_PATH> domainName(domainSize);
- // second call to LookupAccountNameW actually gets the SID
- // both the pointer to the buffer and the pointer to the domain name should not be NULL
- if (ptrLookupAccountName(NULL, userName, buff.data(), &sidSize, domainName.data(), &domainSize, &type))
- return type != SidTypeUser; //returns true if the current user is not a user
- }
+ wchar_t userName[UNLEN + 1] = L"";
+ DWORD size = UNLEN;
+ if (GetUserNameW(userName, &size)) {
+ SID_NAME_USE type = SidTypeUser;
+ DWORD sidSize = 0;
+ DWORD domainSize = 0;
+ // first call is to get the correct size
+ bool bRet = LookupAccountNameW(NULL, userName, NULL, &sidSize, NULL, &domainSize, &type);
+ if (bRet == FALSE && ERROR_INSUFFICIENT_BUFFER != GetLastError())
+ return false;
+ QVarLengthArray<BYTE, 68> buff(sidSize);
+ QVarLengthArray<wchar_t, MAX_PATH> domainName(domainSize);
+ // second call to LookupAccountNameW actually gets the SID
+ // both the pointer to the buffer and the pointer to the domain name should not be NULL
+ if (LookupAccountNameW(NULL, userName, buff.data(), &sidSize, domainName.data(), &domainSize, &type))
+ return type != SidTypeUser; //returns true if the current user is not a user
}
return false;
}
@@ -155,11 +48,11 @@ static bool currentProcessIsService()
static QStringList splitSpaceSemicolon(const QString &source)
{
QStringList list;
- int start = 0;
- int end;
+ qsizetype start = 0;
+ qsizetype end;
while (true) {
- int space = source.indexOf(QLatin1Char(' '), start);
- int semicolon = source.indexOf(QLatin1Char(';'), start);
+ qsizetype space = source.indexOf(u' ', start);
+ qsizetype semicolon = source.indexOf(u';', start);
end = space;
if (semicolon != -1 && (end == -1 || semicolon < end))
end = semicolon;
@@ -181,7 +74,7 @@ static bool isBypassed(const QString &host, const QStringList &bypassList)
if (host.isEmpty())
return false;
- bool isSimple = !host.contains(QLatin1Char('.')) && !host.contains(QLatin1Char(':'));
+ bool isSimple = !host.contains(u'.') && !host.contains(u':');
QHostAddress ipAddress;
bool isIpAddress = ipAddress.setAddress(host);
@@ -192,7 +85,7 @@ static bool isBypassed(const QString &host, const QStringList &bypassList)
// does it match the list of exclusions?
for (const QString &entry : bypassList) {
- if (entry == QLatin1String("<local>")) {
+ if (entry == "<local>"_L1) {
if (isSimple)
return true;
if (isIpAddress) {
@@ -292,32 +185,32 @@ static QList<QNetworkProxy> parseServerList(const QNetworkProxyQuery &query, con
&& query.queryType() != QNetworkProxyQuery::TcpServer
&& query.queryType() != QNetworkProxyQuery::SctpServer;
for (const QString &entry : proxyList) {
- int server = 0;
+ qsizetype server = 0;
QNetworkProxy::ProxyType proxyType = QNetworkProxy::HttpProxy;
quint16 port = 8080;
- int pos = entry.indexOf(QLatin1Char('='));
+ qsizetype pos = entry.indexOf(u'=');
QStringView scheme;
QStringView protocolTag;
if (pos != -1) {
scheme = protocolTag = QStringView{entry}.left(pos);
server = pos + 1;
}
- pos = entry.indexOf(QLatin1String("://"), server);
+ pos = entry.indexOf("://"_L1, server);
if (pos != -1) {
scheme = QStringView{entry}.mid(server, pos - server);
server = pos + 3;
}
if (!scheme.isEmpty()) {
- if (scheme == QLatin1String("http") || scheme == QLatin1String("https")) {
+ if (scheme == "http"_L1 || scheme == "https"_L1) {
// no-op
// defaults are above
- } else if (scheme == QLatin1String("socks") || scheme == QLatin1String("socks5")) {
+ } else if (scheme == "socks"_L1 || scheme == "socks5"_L1) {
proxyType = QNetworkProxy::Socks5Proxy;
port = 1080;
- } else if (scheme == QLatin1String("ftp")) {
+ } else if (scheme == "ftp"_L1) {
proxyType = QNetworkProxy::FtpCachingProxy;
port = 2121;
} else {
@@ -326,7 +219,7 @@ static QList<QNetworkProxy> parseServerList(const QNetworkProxyQuery &query, con
}
}
- pos = entry.indexOf(QLatin1Char(':'), server);
+ pos = entry.indexOf(u':', server);
if (pos != -1) {
bool ok;
uint value = QStringView{entry}.mid(pos + 1).toUInt(&ok);
@@ -352,10 +245,10 @@ static QList<QNetworkProxy> parseServerList(const QNetworkProxyQuery &query, con
result.prepend(taggedProxies.value(requiredTag));
}
}
- if (!checkTags || requiredTag != QLatin1String("http")) {
+ if (!checkTags || requiredTag != "http"_L1) {
// if there are different http proxies for http and https, prefer the https one (more likely to be capable of CONNECT)
- QNetworkProxy httpProxy = taggedProxies.value(QLatin1String("http"));
- QNetworkProxy httpsProxy = taggedProxies.value(QLatin1String("http"));
+ QNetworkProxy httpProxy = taggedProxies.value("http"_L1);
+ QNetworkProxy httpsProxy = taggedProxies.value("http"_L1);
if (httpProxy != httpsProxy && httpProxy.type() == QNetworkProxy::HttpProxy && httpsProxy.type() == QNetworkProxy::HttpProxy) {
for (int i = 0; i < result.count(); i++) {
if (httpProxy == result.at(i))
@@ -402,9 +295,9 @@ public:
}
void clear() {
- for (HANDLE event : qAsConst(m_watchEvents))
+ for (HANDLE event : std::as_const(m_watchEvents))
CloseHandle(event);
- for (HKEY key : qAsConst(m_registryHandles))
+ for (HKEY key : std::as_const(m_registryHandles))
RegCloseKey(key);
m_watchEvents.clear();
@@ -456,7 +349,7 @@ QWindowsSystemProxy::QWindowsSystemProxy()
QWindowsSystemProxy::~QWindowsSystemProxy()
{
if (hHttpSession)
- ptrWinHttpCloseHandle(hHttpSession);
+ WinHttpCloseHandle(hHttpSession);
}
void QWindowsSystemProxy::reset()
@@ -486,20 +379,9 @@ void QWindowsSystemProxy::init()
proxySettingsWatcher.addLocation(HKEY_LOCAL_MACHINE, QStringLiteral("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"));
proxySettingsWatcher.addLocation(HKEY_LOCAL_MACHINE, QStringLiteral("Software\\Policies\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"));
- // load the winhttp.dll library
- QSystemLibrary lib(L"winhttp");
- if (!lib.load())
- return; // failed to load
-
- ptrWinHttpOpen = (PtrWinHttpOpen)lib.resolve("WinHttpOpen");
- ptrWinHttpCloseHandle = (PtrWinHttpCloseHandle)lib.resolve("WinHttpCloseHandle");
- ptrWinHttpGetProxyForUrl = (PtrWinHttpGetProxyForUrl)lib.resolve("WinHttpGetProxyForUrl");
- ptrWinHttpGetDefaultProxyConfiguration = (PtrWinHttpGetDefaultProxyConfiguration)lib.resolve("WinHttpGetDefaultProxyConfiguration");
- ptrWinHttpGetIEProxyConfigForCurrentUser = (PtrWinHttpGetIEProxyConfigForCurrentUser)lib.resolve("WinHttpGetIEProxyConfigForCurrentUser");
-
// Try to obtain the Internet Explorer configuration.
WINHTTP_CURRENT_USER_IE_PROXY_CONFIG ieProxyConfig;
- const bool hasIEConfig = ptrWinHttpGetIEProxyConfigForCurrentUser(&ieProxyConfig);
+ const bool hasIEConfig = WinHttpGetIEProxyConfigForCurrentUser(&ieProxyConfig);
if (hasIEConfig) {
if (ieProxyConfig.lpszAutoConfigUrl) {
autoConfigUrl = QString::fromWCharArray(ieProxyConfig.lpszAutoConfigUrl);
@@ -524,7 +406,7 @@ void QWindowsSystemProxy::init()
// attempt to get the default configuration instead
// that config will serve as default if WPAD fails
WINHTTP_PROXY_INFO proxyInfo;
- if (ptrWinHttpGetDefaultProxyConfiguration(&proxyInfo) &&
+ if (WinHttpGetDefaultProxyConfiguration(&proxyInfo) &&
proxyInfo.dwAccessType == WINHTTP_ACCESS_TYPE_NAMED_PROXY) {
// we got information from the registry
// overwrite the IE configuration, if any
@@ -542,11 +424,11 @@ void QWindowsSystemProxy::init()
hHttpSession = NULL;
if (ieProxyConfig.fAutoDetect || !autoConfigUrl.isEmpty()) {
// open the handle and obtain the options
- hHttpSession = ptrWinHttpOpen(L"Qt System Proxy access/1.0",
- WINHTTP_ACCESS_TYPE_NO_PROXY,
- WINHTTP_NO_PROXY_NAME,
- WINHTTP_NO_PROXY_BYPASS,
- 0);
+ hHttpSession = WinHttpOpen(L"Qt System Proxy access/1.0",
+ WINHTTP_ACCESS_TYPE_NO_PROXY,
+ WINHTTP_NO_PROXY_NAME,
+ WINHTTP_NO_PROXY_BYPASS,
+ 0);
if (!hHttpSession)
return;
@@ -588,11 +470,11 @@ QList<QNetworkProxy> QNetworkProxyFactory::systemProxyForQuery(const QNetworkPro
// url could be empty, e.g. from QNetworkProxy::applicationProxy(), that's fine,
// we'll still ask for the proxy.
// But for a file url, we know we don't need one.
- if (url.scheme() == QLatin1String("file") || url.scheme() == QLatin1String("qrc"))
+ if (url.scheme() == "file"_L1 || url.scheme() == "qrc"_L1)
return sp->defaultResult;
if (query.queryType() != QNetworkProxyQuery::UrlRequest) {
// change the scheme to https, maybe it'll work
- url.setScheme(QLatin1String("https"));
+ url.setScheme("https"_L1);
}
QString urlQueryString = url.toString();
@@ -603,7 +485,7 @@ QList<QNetworkProxy> QNetworkProxyFactory::systemProxyForQuery(const QNetworkPro
urlQueryString = url.toString().left(2083);
}
- bool getProxySucceeded = ptrWinHttpGetProxyForUrl(sp->hHttpSession,
+ bool getProxySucceeded = WinHttpGetProxyForUrl(sp->hHttpSession,
reinterpret_cast<LPCWSTR>(urlQueryString.utf16()),
&sp->autoProxyOptions,
&proxyInfo);
@@ -621,7 +503,7 @@ QList<QNetworkProxy> QNetworkProxyFactory::systemProxyForQuery(const QNetworkPro
sp->autoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_CONFIG_URL;
sp->autoProxyOptions.lpszAutoConfigUrl =
reinterpret_cast<LPCWSTR>(sp->autoConfigUrl.utf16());
- getProxySucceeded = ptrWinHttpGetProxyForUrl(sp->hHttpSession,
+ getProxySucceeded = WinHttpGetProxyForUrl(sp->hHttpSession,
reinterpret_cast<LPCWSTR>(urlQueryString.utf16()),
&sp->autoProxyOptions,
&proxyInfo);
@@ -634,7 +516,7 @@ QList<QNetworkProxy> QNetworkProxyFactory::systemProxyForQuery(const QNetworkPro
// We first tried without AutoLogon, because this might prevent caching the result.
// But now we've to enable it (http://msdn.microsoft.com/en-us/library/aa383153%28v=VS.85%29.aspx)
sp->autoProxyOptions.fAutoLogonIfChallenged = TRUE;
- getProxySucceeded = ptrWinHttpGetProxyForUrl(sp->hHttpSession,
+ getProxySucceeded = WinHttpGetProxyForUrl(sp->hHttpSession,
reinterpret_cast<LPCWSTR>(urlQueryString.utf16()),
&sp->autoProxyOptions,
&proxyInfo);
diff --git a/src/network/kernel/qt_attribution.json b/src/network/kernel/qt_attribution.json
deleted file mode 100644
index 3713973543..0000000000
--- a/src/network/kernel/qt_attribution.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "Id": "psl",
- "Name": "The Public Suffix List",
- "QDocModule": "qtcore",
- "Description": "The Public Suffix List is an initiative of Mozilla,
-but is maintained as a community resource. It is available for use in any software,
-but was originally created to meet the needs of browser manufacturers.
-It allows browsers to, for example:
-
-- Avoid privacy-damaging \"supercookies\" being set for high-level domain name suffixes
-
-- Highlight the most important part of a domain name in the user interface
-
-- Accurately sort history entries by site",
-
- "Files": "qurltlds_p.h",
- "QtUsage": "See util/publicSuffix/ for code-generator",
- "QtUsage": "Used in Qt Core to avoid setting \"supercookies\" in the cookie jar
-supported by Qt (by the QNetworkCookieJar class).",
-
- "Homepage": "Consult https://github.com/publicsuffix/list for the sha1 but download from ...",
- "Homepage": "http://publicsuffix.org/",
- "Version": "f2cce86a42f38265c67caa32c6e0ff61793bb534, fetched on 2021-01-21",
- "License": "Mozilla Public License 2.0",
- "LicenseFile": "PSL-LICENSE.txt",
- "LicenseId": "MPL-2.0",
- "Copyright": "The list was originally provided by Jo Hermans <jo.hermans@gmail.com>.
-It is now maintained on github (https://github.com/publicsuffix/list)."
-}
diff --git a/src/network/kernel/qtldurl.cpp b/src/network/kernel/qtldurl.cpp
index 55c893ed2d..a7aceddb18 100644
--- a/src/network/kernel/qtldurl.cpp
+++ b/src/network/kernel/qtldurl.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qglobal.h>
@@ -43,70 +7,167 @@
#if QT_CONFIG(topleveldomain)
-#include "qplatformdefs.h"
-#include "qurl.h"
-#include "private/qurltlds_p.h"
-#include "private/qtldurl_p.h"
-#include "QtCore/qlist.h"
+#include "QtCore/qfile.h"
+#include "QtCore/qloggingcategory.h"
+#include "QtCore/qstandardpaths.h"
#include "QtCore/qstring.h"
+#if !QT_CONFIG(publicsuffix_qt) && !QT_CONFIG(publicsuffix_system)
+# error Enable at least one feature: publicsuffix-qt, publicsuffix-system
+#endif
+
+#if QT_CONFIG(publicsuffix_qt)
+# include "psl_data.cpp"
+#endif
+
+// Defined in src/3rdparty/libpsl/src/lookup_string_in_fixed_set.c
+extern "C" int LookupStringInFixedSet(const unsigned char *graph, std::size_t length,
+ const char *key, std::size_t key_length);
+
QT_BEGIN_NAMESPACE
-enum TLDMatchType {
- ExactMatch,
- SuffixMatch,
- ExceptionMatch,
+using namespace Qt::StringLiterals;
+
+Q_LOGGING_CATEGORY(lcTld, "qt.network.tld")
+
+static constexpr int PSL_NOT_FOUND = -1;
+static constexpr int PSL_FLAG_EXCEPTION = 1 << 0;
+static constexpr int PSL_FLAG_WILDCARD = 1 << 1;
+
+class QPublicSuffixDatabase final
+{
+public:
+#if QT_CONFIG(publicsuffix_system)
+ QPublicSuffixDatabase();
+#endif // QT_CONFIG(publicsuffix_system)
+
+ int lookupDomain(QByteArrayView domain) const;
+
+private:
+ QByteArrayView m_data
+#if QT_CONFIG(publicsuffix_qt)
+ {
+ kDafsa, sizeof(kDafsa)
+ }
+#endif // QT_CONFIG(publicsuffix_qt)
+ ;
+
+#if QT_CONFIG(publicsuffix_system)
+ std::unique_ptr<QFile> m_dev;
+ QByteArray m_storage;
+ bool loadFile(const QString &fileName);
+#endif // QT_CONFIG(publicsuffix_system)
};
-// Scan the auto-generated table of TLDs for an entry. For more details
-// see comments in file: util/publicSuffix/main.cpp
-static bool containsTLDEntry(QStringView entry, TLDMatchType match)
+int QPublicSuffixDatabase::lookupDomain(QByteArrayView domain) const
+{
+ return LookupStringInFixedSet(reinterpret_cast<const unsigned char *>(m_data.constData()),
+ m_data.size(), domain.data(), domain.size());
+}
+
+#if QT_CONFIG(publicsuffix_system)
+
+static QStringList locatePublicSuffixFiles()
+{
+ return QStandardPaths::locateAll(QStandardPaths::GenericDataLocation,
+ u"publicsuffix/public_suffix_list.dafsa"_s);
+}
+
+QPublicSuffixDatabase::QPublicSuffixDatabase()
{
- const QStringView matchSymbols[] = {
- u"",
- u"*",
- u"!",
- };
- const auto symbol = matchSymbols[match];
- const int index = qt_hash(entry, qt_hash(symbol)) % tldCount;
-
- // select the right chunk from the big table
- short chunk = 0;
- uint chunkIndex = tldIndices[index], offset = 0;
-
- // The offset in the big string, of the group that our entry hashes into.
- const auto tldGroupOffset = tldIndices[index];
-
- // It should always be inside all chunks' total size.
- Q_ASSERT(tldGroupOffset < tldChunks[tldChunkCount - 1]);
- // All offsets are stored in non-decreasing order.
- // This check is within bounds as tldIndices has length tldCount+1.
- Q_ASSERT(tldGroupOffset <= tldIndices[index + 1]);
- // The last extra entry in tldIndices
- // should be equal to the total of all chunks' lengths.
- static_assert(tldIndices[tldCount] == tldChunks[tldChunkCount - 1]);
-
- // Find which chunk contains the tldGroupOffset
- while (tldGroupOffset >= tldChunks[chunk]) {
- chunkIndex -= tldChunks[chunk];
- offset += tldChunks[chunk];
- chunk++;
-
- // We can not go above the number of chunks we have, since all our
- // indices are less than the total chunks' size (see asserts above).
- Q_ASSERT(chunk < tldChunkCount);
+ for (auto &&fileName : locatePublicSuffixFiles()) {
+ if (loadFile(fileName))
+ return;
}
- // check all the entries from the given offset
- while (chunkIndex < tldIndices[index+1] - offset) {
- const auto utf8 = tldData[chunk] + chunkIndex;
- if ((symbol.isEmpty() || QLatin1Char(*utf8) == symbol) && entry == QString::fromUtf8(utf8 + symbol.size()))
- return true;
- chunkIndex += uint(qstrlen(utf8)) + 1; // +1 for the ending \0
+#if QT_CONFIG(publicsuffix_qt)
+ qCDebug(lcTld, "Using builtin publicsuffix list");
+#else
+ qCWarning(lcTld, "No usable publicsuffix file found");
+#endif
+}
+
+bool QPublicSuffixDatabase::loadFile(const QString &fileName)
+{
+ static const QByteArrayView DafsaFileHeader = ".DAFSA@PSL_0 \n";
+
+ qCDebug(lcTld, "Loading publicsuffix file: %s", qUtf8Printable(fileName));
+
+ auto systemFile = std::make_unique<QFile>(fileName);
+
+ if (!systemFile->open(QIODevice::ReadOnly)) {
+ qCDebug(lcTld, "Failed to open publicsuffix file: %s",
+ qUtf8Printable(systemFile->errorString()));
+ return false;
+ }
+
+ auto fileSize = systemFile->size();
+ // Check if there is enough data for header, version byte and some data
+ if (fileSize < DafsaFileHeader.size() + 2) {
+ qCWarning(lcTld, "publicsuffix file is too small: %zu", std::size_t(fileSize));
+ return false;
+ }
+
+ auto header = systemFile->read(DafsaFileHeader.size());
+ if (header != DafsaFileHeader) {
+ qCWarning(lcTld, "Invalid publicsuffix file header: %s", header.toHex().constData());
+ return false;
+ }
+
+ // Check if the file is UTF-8 compatible
+ if (!systemFile->seek(fileSize - 1)) {
+ qCWarning(lcTld, "Failed to seek to the end of file: %s",
+ qUtf8Printable(systemFile->errorString()));
+ return false;
+ }
+
+ char version;
+ if (systemFile->read(&version, 1) != 1) {
+ qCWarning(lcTld, "Failed to read publicsuffix version");
+ return false;
+ }
+
+ if (version != 0x01) {
+ qCWarning(lcTld, "Unsupported publicsuffix version: %d", int(version));
+ return false;
+ }
+
+ const auto dataSize = fileSize - DafsaFileHeader.size() - 1;
+ // Try to map the file first
+ auto mappedData = systemFile->map(DafsaFileHeader.size(), dataSize);
+ if (mappedData) {
+ qCDebug(lcTld, "Using mapped system publicsuffix data");
+ systemFile->close();
+ m_data = QByteArrayView(mappedData, dataSize);
+ m_dev = std::move(systemFile);
+ return true;
+ }
+
+ qCDebug(lcTld, "Failed to map publicsuffix file: %s",
+ qUtf8Printable(systemFile->errorString()));
+
+ systemFile->seek(DafsaFileHeader.size());
+ m_storage = systemFile->read(dataSize);
+ if (m_storage.size() != dataSize) {
+ qCWarning(lcTld, "Failed to read publicsuffix file");
+ m_storage.clear();
+ return false;
}
- return false;
+
+ qCDebug(lcTld, "Using system publicsuffix data");
+ m_data = m_storage;
+
+ return true;
}
+Q_GLOBAL_STATIC(QPublicSuffixDatabase, publicSuffix);
+
+#else
+
+static const QPublicSuffixDatabase m_publicSuffix;
+
+#endif // QT_CONFIG(publicsuffix_system)
+
/*!
\internal
@@ -118,21 +179,37 @@ static bool containsTLDEntry(QStringView entry, TLDMatchType match)
Q_NETWORK_EXPORT bool qIsEffectiveTLD(QStringView domain)
{
// for domain 'foo.bar.com':
- // 1. return if TLD table contains 'foo.bar.com'
- // 2. else if table contains '*.bar.com',
- // 3. test that table does not contain '!foo.bar.com'
-
- if (containsTLDEntry(domain, ExactMatch)) // 1
- return true;
+ // 1. return false if TLD table contains '!foo.bar.com'
+ // 2. return true if TLD table contains 'foo.bar.com'
+ // 3. return true if the table contains '*.bar.com'
+
+ QByteArray decodedDomain = domain.toUtf8();
+ QByteArrayView domainView(decodedDomain);
+
+#if QT_CONFIG(publicsuffix_system)
+ if (publicSuffix.isDestroyed())
+ return false;
+#else
+ auto publicSuffix = &m_publicSuffix;
+#endif // QT_CONFIG(publicsuffix_system)
+
+ auto ret = publicSuffix->lookupDomain(domainView);
+ if (ret != PSL_NOT_FOUND) {
+ if (ret & PSL_FLAG_EXCEPTION) // 1
+ return false;
+ if ((ret & PSL_FLAG_WILDCARD) == 0) // 2
+ return true;
+ }
- const auto dot = domain.indexOf(QLatin1Char('.'));
+ const auto dot = domainView.indexOf('.');
if (dot < 0) // Actual TLD: may be effective if the subject of a wildcard rule:
- return containsTLDEntry(QString(QLatin1Char('.') + domain), SuffixMatch);
- if (containsTLDEntry(domain.mid(dot), SuffixMatch)) // 2
- return !containsTLDEntry(domain, ExceptionMatch); // 3
- return false;
+ return ret != PSL_NOT_FOUND;
+ ret = publicSuffix->lookupDomain(domainView.sliced(dot + 1)); // 3
+ if (ret == PSL_NOT_FOUND)
+ return false;
+ return (ret & PSL_FLAG_WILDCARD) != 0;
}
QT_END_NAMESPACE
-#endif
+#endif // QT_CONFIG(topleveldomain)
diff --git a/src/network/kernel/qtldurl_p.h b/src/network/kernel/qtldurl_p.h
index ea1ed78034..86b163f161 100644
--- a/src/network/kernel/qtldurl_p.h
+++ b/src/network/kernel/qtldurl_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTLDURL_P_H
#define QTLDURL_P_H
@@ -52,7 +16,6 @@
//
#include <QtNetwork/private/qtnetworkglobal_p.h>
-#include "QtCore/qurl.h"
#include "QtCore/qstring.h"
QT_REQUIRE_CONFIG(topleveldomain);
@@ -67,4 +30,4 @@ inline bool qIsEffectiveTLD(const QString &domain)
QT_END_NAMESPACE
-#endif // QDATAURL_P_H
+#endif // QTLDURL_P_H
diff --git a/src/network/kernel/qtnetworkglobal.h b/src/network/kernel/qtnetworkglobal.h
index 586b847816..b22ddc6950 100644
--- a/src/network/kernel/qtnetworkglobal.h
+++ b/src/network/kernel/qtnetworkglobal.h
@@ -1,61 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTNETWORKGLOBAL_H
#define QTNETWORKGLOBAL_H
#include <QtCore/qglobal.h>
#include <QtNetwork/qtnetwork-config.h>
-
-QT_BEGIN_NAMESPACE
-
-#ifndef QT_STATIC
-# if defined(QT_BUILD_NETWORK_LIB)
-# define Q_NETWORK_EXPORT Q_DECL_EXPORT
-# else
-# define Q_NETWORK_EXPORT Q_DECL_IMPORT
-# endif
-#else
-# define Q_NETWORK_EXPORT
-#endif
-
-QT_END_NAMESPACE
+#include <QtNetwork/qtnetworkexports.h>
#endif
diff --git a/src/network/kernel/qtnetworkglobal_p.h b/src/network/kernel/qtnetworkglobal_p.h
index 859e3d9ebd..b90e675cb4 100644
--- a/src/network/kernel/qtnetworkglobal_p.h
+++ b/src/network/kernel/qtnetworkglobal_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTNETWORKGLOBAL_P_H
#define QTNETWORKGLOBAL_P_H
@@ -55,4 +19,15 @@
#include <QtCore/private/qglobal_p.h>
#include <QtNetwork/private/qtnetwork-config_p.h>
+QT_BEGIN_NAMESPACE
+
+enum {
+#if defined(Q_OS_LINUX) || defined(Q_OS_QNX)
+ PlatformSupportsAbstractNamespace = true
+#else
+ PlatformSupportsAbstractNamespace = false
+#endif
+};
+
+QT_END_NAMESPACE
#endif // QTNETWORKGLOBAL_P_H
diff --git a/src/network/kernel/qurltlds_p.h b/src/network/kernel/qurltlds_p.h
deleted file mode 100644
index 63e34db70c..0000000000
--- a/src/network/kernel/qurltlds_p.h
+++ /dev/null
@@ -1,14906 +0,0 @@
-// License: MPL 2.0/GPL 2.0/LGPL 3
-//
-// The contents of this file are subject to the Mozilla Public License Version
-// 2.0 (the "License"); you may not use this file except in compliance with
-// the License. You may obtain a copy of the License at
-// http://www.mozilla.org/MPL/
-//
-// Software distributed under the License is distributed on an "AS IS" basis,
-// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-// for the specific language governing rights and limitations under the
-// License.
-//
-// The Original Code is the Public Suffix List.
-//
-// The Initial Developer of the Original Code is
-// Jo Hermans <jo.hermans@gmail.com>.
-// Portions created by the Initial Developer are Copyright (C) 2007
-// the Initial Developer. All Rights Reserved.
-//
-// Contributor(s):
-// Ruben Arakelyan <ruben@wackomenace.co.uk>
-// Gervase Markham <gerv@gerv.net>
-// Pamela Greene <pamg.bugs@gmail.com>
-// David Triendl <david@triendl.name>
-// Jothan Frakes <jothan@gmail.com>
-// The kind representatives of many TLD registries
-//
-// Alternatively, the contents of this file may be used under the terms of
-// either the GNU General Public License Version 2 or later (the "GPL"), or
-// the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-// in which case the provisions of the GPL or the LGPL are applicable instead
-// of those above. If you wish to allow use of your version of this file only
-// under the terms of either the GPL or the LGPL, and not to allow others to
-// use your version of this file under the terms of the MPL, indicate your
-// decision by deleting the provisions above and replace them with the notice
-// and other provisions required by the GPL or the LGPL. If you do not delete
-// the provisions above, a recipient may use your version of this file under
-// the terms of any one of the MPL, the GPL or the LGPL.
-//
-
-#ifndef QURLTLD_P_H
-#define QURLTLD_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of the Network Access and Core framework. This header file may change from
-// version to version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtNetwork/private/qtnetworkglobal_p.h>
-
-QT_BEGIN_NAMESPACE
-
-// note to maintainer:
-// this file should be updated before each release ->
-// for instructions see the program at
-// util/publicSuffix/
-
-static const quint16 tldCount = 9117;
-// After the tldCount "real" entries in tldIndices, include a final entry
-// that records the sum of the lengths of all the chunks, i.e. the index
-// just past the end of tldChunks.
-static constexpr quint32 tldIndices[tldCount + 1] = {
-0,
-39,
-64,
-81,
-81,
-81,
-87,
-113,
-134,
-134,
-152,
-152,
-160,
-177,
-183,
-218,
-244,
-244,
-264,
-271,
-284,
-306,
-336,
-360,
-360,
-383,
-394,
-394,
-394,
-394,
-394,
-399,
-399,
-399,
-416,
-443,
-454,
-454,
-454,
-479,
-500,
-507,
-507,
-507,
-541,
-541,
-541,
-548,
-562,
-562,
-593,
-597,
-635,
-641,
-641,
-652,
-665,
-665,
-680,
-680,
-699,
-699,
-709,
-709,
-709,
-724,
-730,
-776,
-785,
-791,
-799,
-805,
-828,
-834,
-843,
-853,
-853,
-882,
-882,
-882,
-882,
-892,
-897,
-903,
-913,
-913,
-930,
-936,
-948,
-977,
-1032,
-1048,
-1061,
-1061,
-1067,
-1095,
-1095,
-1121,
-1121,
-1130,
-1146,
-1172,
-1172,
-1172,
-1172,
-1172,
-1172,
-1172,
-1178,
-1178,
-1197,
-1225,
-1225,
-1235,
-1254,
-1254,
-1280,
-1302,
-1319,
-1346,
-1354,
-1391,
-1395,
-1411,
-1436,
-1452,
-1458,
-1458,
-1477,
-1481,
-1481,
-1481,
-1481,
-1492,
-1499,
-1499,
-1515,
-1543,
-1543,
-1543,
-1543,
-1555,
-1559,
-1574,
-1574,
-1598,
-1630,
-1642,
-1654,
-1654,
-1670,
-1670,
-1686,
-1710,
-1710,
-1726,
-1726,
-1742,
-1756,
-1756,
-1756,
-1769,
-1804,
-1804,
-1810,
-1816,
-1832,
-1832,
-1832,
-1838,
-1854,
-1854,
-1854,
-1854,
-1858,
-1885,
-1924,
-1952,
-1967,
-1967,
-1977,
-2005,
-2024,
-2036,
-2084,
-2100,
-2126,
-2126,
-2138,
-2174,
-2201,
-2246,
-2246,
-2279,
-2286,
-2330,
-2366,
-2366,
-2372,
-2415,
-2424,
-2443,
-2462,
-2482,
-2488,
-2534,
-2534,
-2557,
-2587,
-2597,
-2623,
-2623,
-2642,
-2686,
-2698,
-2717,
-2754,
-2754,
-2771,
-2795,
-2828,
-2855,
-2884,
-2944,
-2980,
-2980,
-3042,
-3042,
-3110,
-3117,
-3127,
-3140,
-3154,
-3164,
-3164,
-3164,
-3169,
-3213,
-3231,
-3253,
-3260,
-3298,
-3322,
-3322,
-3365,
-3376,
-3386,
-3386,
-3393,
-3401,
-3417,
-3417,
-3430,
-3488,
-3488,
-3516,
-3563,
-3578,
-3593,
-3609,
-3624,
-3624,
-3638,
-3675,
-3721,
-3731,
-3731,
-3736,
-3751,
-3780,
-3820,
-3820,
-3858,
-3868,
-3920,
-3926,
-3947,
-3947,
-3961,
-3961,
-3961,
-3978,
-3978,
-3987,
-4006,
-4015,
-4031,
-4037,
-4056,
-4067,
-4067,
-4067,
-4067,
-4091,
-4091,
-4099,
-4099,
-4117,
-4153,
-4170,
-4170,
-4187,
-4187,
-4187,
-4205,
-4205,
-4205,
-4205,
-4226,
-4226,
-4226,
-4226,
-4234,
-4252,
-4252,
-4260,
-4260,
-4260,
-4278,
-4313,
-4313,
-4331,
-4344,
-4390,
-4390,
-4390,
-4414,
-4435,
-4435,
-4435,
-4450,
-4467,
-4467,
-4467,
-4467,
-4467,
-4479,
-4535,
-4584,
-4595,
-4595,
-4595,
-4654,
-4669,
-4669,
-4669,
-4713,
-4734,
-4776,
-4776,
-4811,
-4811,
-4828,
-4839,
-4839,
-4839,
-4857,
-4887,
-4887,
-4921,
-4932,
-4948,
-4953,
-4953,
-4965,
-4970,
-4970,
-4970,
-4998,
-5013,
-5013,
-5013,
-5013,
-5013,
-5013,
-5030,
-5048,
-5048,
-5048,
-5048,
-5048,
-5048,
-5078,
-5078,
-5078,
-5078,
-5078,
-5103,
-5127,
-5127,
-5150,
-5164,
-5164,
-5164,
-5175,
-5183,
-5211,
-5211,
-5227,
-5239,
-5239,
-5249,
-5261,
-5277,
-5277,
-5277,
-5277,
-5296,
-5296,
-5336,
-5336,
-5336,
-5342,
-5342,
-5342,
-5386,
-5419,
-5441,
-5466,
-5466,
-5466,
-5488,
-5488,
-5507,
-5511,
-5511,
-5528,
-5545,
-5545,
-5573,
-5573,
-5588,
-5614,
-5624,
-5624,
-5634,
-5634,
-5661,
-5661,
-5661,
-5679,
-5679,
-5679,
-5689,
-5709,
-5709,
-5747,
-5759,
-5759,
-5759,
-5759,
-5759,
-5759,
-5777,
-5794,
-5834,
-5854,
-5854,
-5873,
-5894,
-5918,
-5993,
-5993,
-5993,
-6020,
-6020,
-6020,
-6039,
-6039,
-6062,
-6062,
-6067,
-6067,
-6067,
-6074,
-6088,
-6105,
-6118,
-6138,
-6138,
-6161,
-6161,
-6161,
-6169,
-6169,
-6169,
-6175,
-6175,
-6196,
-6215,
-6280,
-6297,
-6317,
-6321,
-6357,
-6399,
-6420,
-6420,
-6420,
-6420,
-6420,
-6420,
-6456,
-6482,
-6482,
-6482,
-6536,
-6541,
-6554,
-6578,
-6578,
-6602,
-6602,
-6618,
-6618,
-6618,
-6618,
-6618,
-6626,
-6626,
-6626,
-6626,
-6626,
-6640,
-6640,
-6640,
-6656,
-6656,
-6656,
-6662,
-6662,
-6662,
-6662,
-6678,
-6678,
-6725,
-6744,
-6744,
-6744,
-6753,
-6762,
-6775,
-6799,
-6812,
-6826,
-6836,
-6836,
-6858,
-6914,
-6914,
-6949,
-6989,
-6989,
-6999,
-6999,
-7008,
-7008,
-7014,
-7040,
-7078,
-7096,
-7113,
-7113,
-7130,
-7130,
-7130,
-7130,
-7153,
-7153,
-7153,
-7159,
-7159,
-7159,
-7175,
-7175,
-7175,
-7190,
-7222,
-7222,
-7222,
-7240,
-7240,
-7276,
-7283,
-7310,
-7310,
-7310,
-7310,
-7323,
-7341,
-7341,
-7366,
-7366,
-7366,
-7415,
-7415,
-7415,
-7420,
-7420,
-7438,
-7446,
-7457,
-7475,
-7493,
-7493,
-7528,
-7569,
-7569,
-7569,
-7584,
-7584,
-7593,
-7593,
-7593,
-7593,
-7601,
-7622,
-7633,
-7670,
-7670,
-7701,
-7701,
-7725,
-7764,
-7764,
-7783,
-7783,
-7783,
-7806,
-7806,
-7806,
-7849,
-7854,
-7887,
-7887,
-7894,
-7901,
-7921,
-7921,
-7928,
-7934,
-7934,
-7971,
-7995,
-8010,
-8010,
-8029,
-8067,
-8081,
-8095,
-8114,
-8137,
-8137,
-8137,
-8160,
-8160,
-8167,
-8180,
-8184,
-8237,
-8250,
-8268,
-8268,
-8286,
-8306,
-8313,
-8320,
-8320,
-8337,
-8359,
-8389,
-8403,
-8470,
-8470,
-8470,
-8483,
-8498,
-8527,
-8531,
-8531,
-8551,
-8563,
-8581,
-8588,
-8594,
-8601,
-8601,
-8608,
-8608,
-8646,
-8694,
-8705,
-8705,
-8712,
-8716,
-8744,
-8770,
-8783,
-8794,
-8804,
-8820,
-8827,
-8827,
-8837,
-8866,
-8866,
-8883,
-8910,
-8910,
-8925,
-8925,
-8925,
-8948,
-8964,
-8971,
-8986,
-8986,
-8986,
-9001,
-9001,
-9019,
-9043,
-9074,
-9081,
-9117,
-9117,
-9126,
-9155,
-9159,
-9159,
-9168,
-9186,
-9217,
-9249,
-9262,
-9262,
-9275,
-9296,
-9319,
-9319,
-9355,
-9371,
-9378,
-9419,
-9448,
-9448,
-9455,
-9472,
-9492,
-9492,
-9530,
-9551,
-9573,
-9598,
-9598,
-9631,
-9671,
-9671,
-9676,
-9676,
-9686,
-9691,
-9725,
-9737,
-9752,
-9757,
-9788,
-9788,
-9788,
-9788,
-9795,
-9815,
-9822,
-9822,
-9822,
-9838,
-9845,
-9852,
-9862,
-9869,
-9884,
-9893,
-9893,
-9893,
-9893,
-9934,
-9934,
-9941,
-9941,
-9948,
-9948,
-9993,
-9993,
-9993,
-9993,
-10013,
-10013,
-10020,
-10020,
-10044,
-10056,
-10056,
-10062,
-10077,
-10119,
-10161,
-10183,
-10190,
-10208,
-10232,
-10245,
-10289,
-10296,
-10303,
-10329,
-10336,
-10366,
-10391,
-10407,
-10407,
-10427,
-10459,
-10482,
-10489,
-10496,
-10503,
-10516,
-10533,
-10551,
-10558,
-10558,
-10565,
-10581,
-10595,
-10602,
-10602,
-10602,
-10609,
-10609,
-10622,
-10622,
-10636,
-10684,
-10710,
-10724,
-10738,
-10745,
-10763,
-10770,
-10797,
-10817,
-10844,
-10858,
-10881,
-10898,
-10909,
-10916,
-10916,
-10916,
-10916,
-10941,
-10951,
-10951,
-10978,
-10995,
-10995,
-11011,
-11036,
-11058,
-11065,
-11065,
-11099,
-11115,
-11154,
-11154,
-11168,
-11199,
-11199,
-11206,
-11214,
-11245,
-11277,
-11304,
-11329,
-11347,
-11356,
-11356,
-11381,
-11407,
-11414,
-11437,
-11482,
-11526,
-11526,
-11562,
-11569,
-11584,
-11628,
-11660,
-11690,
-11699,
-11728,
-11738,
-11738,
-11738,
-11750,
-11767,
-11767,
-11806,
-11816,
-11848,
-11867,
-11871,
-11903,
-11920,
-11932,
-11943,
-11979,
-11994,
-12012,
-12055,
-12062,
-12075,
-12092,
-12098,
-12146,
-12153,
-12153,
-12164,
-12172,
-12197,
-12197,
-12197,
-12204,
-12204,
-12204,
-12235,
-12253,
-12267,
-12304,
-12311,
-12335,
-12354,
-12378,
-12427,
-12437,
-12437,
-12479,
-12486,
-12522,
-12535,
-12542,
-12549,
-12559,
-12566,
-12578,
-12611,
-12628,
-12652,
-12665,
-12671,
-12712,
-12712,
-12712,
-12712,
-12729,
-12729,
-12746,
-12751,
-12779,
-12779,
-12786,
-12824,
-12841,
-12848,
-12869,
-12876,
-12876,
-12876,
-12898,
-12930,
-12951,
-12969,
-13013,
-13019,
-13019,
-13019,
-13026,
-13026,
-13049,
-13073,
-13105,
-13125,
-13141,
-13141,
-13182,
-13192,
-13192,
-13228,
-13228,
-13241,
-13282,
-13282,
-13282,
-13282,
-13297,
-13297,
-13297,
-13315,
-13324,
-13335,
-13382,
-13391,
-13391,
-13417,
-13417,
-13440,
-13469,
-13476,
-13496,
-13530,
-13530,
-13548,
-13548,
-13570,
-13580,
-13580,
-13599,
-13609,
-13627,
-13627,
-13634,
-13634,
-13634,
-13634,
-13634,
-13663,
-13663,
-13663,
-13674,
-13674,
-13686,
-13686,
-13707,
-13714,
-13714,
-13714,
-13733,
-13733,
-13781,
-13793,
-13793,
-13793,
-13809,
-13809,
-13825,
-13876,
-13886,
-13896,
-13925,
-13958,
-13958,
-13999,
-13999,
-13999,
-13999,
-14018,
-14039,
-14039,
-14046,
-14055,
-14055,
-14059,
-14100,
-14115,
-14129,
-14142,
-14142,
-14148,
-14173,
-14209,
-14209,
-14209,
-14224,
-14224,
-14224,
-14224,
-14224,
-14224,
-14229,
-14244,
-14263,
-14263,
-14271,
-14271,
-14271,
-14288,
-14288,
-14288,
-14335,
-14335,
-14344,
-14363,
-14363,
-14363,
-14394,
-14415,
-14446,
-14495,
-14512,
-14512,
-14518,
-14535,
-14535,
-14548,
-14557,
-14571,
-14582,
-14614,
-14614,
-14635,
-14649,
-14649,
-14656,
-14663,
-14684,
-14689,
-14689,
-14689,
-14689,
-14689,
-14689,
-14689,
-14701,
-14701,
-14713,
-14713,
-14725,
-14725,
-14725,
-14725,
-14762,
-14807,
-14807,
-14814,
-14834,
-14846,
-14846,
-14857,
-14864,
-14864,
-14871,
-14879,
-14879,
-14892,
-14892,
-14932,
-14932,
-14942,
-14949,
-14949,
-14961,
-14961,
-14976,
-14990,
-14990,
-15038,
-15038,
-15057,
-15078,
-15078,
-15078,
-15078,
-15091,
-15091,
-15098,
-15098,
-15098,
-15105,
-15105,
-15105,
-15105,
-15105,
-15105,
-15105,
-15113,
-15128,
-15140,
-15140,
-15140,
-15152,
-15164,
-15178,
-15195,
-15207,
-15223,
-15234,
-15251,
-15251,
-15251,
-15271,
-15287,
-15287,
-15297,
-15328,
-15345,
-15345,
-15383,
-15412,
-15412,
-15412,
-15412,
-15437,
-15470,
-15470,
-15490,
-15490,
-15490,
-15490,
-15495,
-15504,
-15514,
-15514,
-15514,
-15514,
-15522,
-15528,
-15528,
-15528,
-15528,
-15528,
-15539,
-15539,
-15575,
-15575,
-15575,
-15575,
-15575,
-15595,
-15610,
-15628,
-15641,
-15651,
-15664,
-15675,
-15675,
-15680,
-15690,
-15690,
-15704,
-15719,
-15740,
-15740,
-15740,
-15740,
-15740,
-15740,
-15740,
-15740,
-15752,
-15759,
-15759,
-15816,
-15844,
-15844,
-15844,
-15844,
-15852,
-15859,
-15867,
-15888,
-15936,
-15936,
-15989,
-16014,
-16014,
-16028,
-16028,
-16042,
-16069,
-16076,
-16076,
-16092,
-16099,
-16108,
-16118,
-16118,
-16123,
-16123,
-16141,
-16158,
-16178,
-16193,
-16205,
-16223,
-16223,
-16223,
-16233,
-16233,
-16233,
-16256,
-16271,
-16271,
-16283,
-16302,
-16310,
-16310,
-16316,
-16338,
-16358,
-16358,
-16358,
-16368,
-16376,
-16409,
-16409,
-16442,
-16442,
-16451,
-16451,
-16451,
-16451,
-16472,
-16487,
-16506,
-16558,
-16579,
-16579,
-16593,
-16593,
-16593,
-16607,
-16607,
-16607,
-16623,
-16661,
-16684,
-16742,
-16742,
-16742,
-16762,
-16762,
-16762,
-16778,
-16815,
-16844,
-16922,
-16922,
-16922,
-16950,
-16968,
-16968,
-16987,
-17003,
-17003,
-17015,
-17015,
-17015,
-17035,
-17035,
-17035,
-17063,
-17079,
-17079,
-17079,
-17093,
-17110,
-17127,
-17140,
-17158,
-17178,
-17192,
-17219,
-17219,
-17219,
-17238,
-17254,
-17254,
-17264,
-17264,
-17279,
-17279,
-17279,
-17279,
-17279,
-17293,
-17293,
-17293,
-17293,
-17304,
-17331,
-17331,
-17347,
-17366,
-17366,
-17391,
-17423,
-17427,
-17427,
-17427,
-17432,
-17432,
-17432,
-17451,
-17451,
-17458,
-17462,
-17462,
-17477,
-17488,
-17515,
-17568,
-17580,
-17580,
-17603,
-17603,
-17615,
-17615,
-17638,
-17668,
-17677,
-17714,
-17714,
-17746,
-17746,
-17762,
-17771,
-17771,
-17771,
-17771,
-17771,
-17793,
-17793,
-17826,
-17826,
-17826,
-17837,
-17861,
-17881,
-17889,
-17889,
-17889,
-17889,
-17889,
-17889,
-17889,
-17889,
-17889,
-17889,
-17904,
-17904,
-17917,
-17917,
-17917,
-17917,
-17935,
-17956,
-17973,
-18008,
-18008,
-18017,
-18027,
-18027,
-18048,
-18065,
-18065,
-18065,
-18071,
-18075,
-18075,
-18103,
-18103,
-18103,
-18168,
-18168,
-18201,
-18213,
-18225,
-18264,
-18274,
-18292,
-18292,
-18298,
-18298,
-18327,
-18338,
-18390,
-18390,
-18390,
-18410,
-18410,
-18410,
-18410,
-18417,
-18417,
-18432,
-18432,
-18432,
-18438,
-18451,
-18451,
-18467,
-18467,
-18481,
-18485,
-18502,
-18502,
-18532,
-18548,
-18548,
-18564,
-18564,
-18564,
-18575,
-18591,
-18591,
-18637,
-18663,
-18680,
-18680,
-18691,
-18691,
-18691,
-18691,
-18691,
-18691,
-18699,
-18699,
-18715,
-18715,
-18715,
-18715,
-18715,
-18715,
-18715,
-18715,
-18715,
-18728,
-18728,
-18741,
-18741,
-18741,
-18771,
-18789,
-18795,
-18813,
-18825,
-18825,
-18864,
-18880,
-18880,
-18880,
-18880,
-18896,
-18896,
-18896,
-18896,
-18901,
-18931,
-18953,
-18964,
-18964,
-18984,
-18984,
-18993,
-19016,
-19025,
-19036,
-19051,
-19072,
-19089,
-19114,
-19121,
-19121,
-19121,
-19141,
-19141,
-19158,
-19158,
-19203,
-19203,
-19203,
-19242,
-19242,
-19242,
-19287,
-19287,
-19287,
-19301,
-19316,
-19338,
-19338,
-19338,
-19358,
-19391,
-19419,
-19419,
-19443,
-19443,
-19456,
-19468,
-19468,
-19468,
-19479,
-19479,
-19495,
-19512,
-19512,
-19512,
-19540,
-19540,
-19552,
-19552,
-19552,
-19586,
-19586,
-19586,
-19586,
-19594,
-19605,
-19605,
-19630,
-19634,
-19634,
-19644,
-19673,
-19694,
-19714,
-19714,
-19733,
-19743,
-19759,
-19766,
-19778,
-19797,
-19811,
-19825,
-19842,
-19842,
-19878,
-19878,
-19878,
-19887,
-19887,
-19905,
-19905,
-19905,
-19905,
-19922,
-19940,
-19959,
-19959,
-19995,
-20003,
-20018,
-20068,
-20076,
-20092,
-20101,
-20117,
-20148,
-20151,
-20199,
-20199,
-20219,
-20219,
-20225,
-20231,
-20242,
-20262,
-20268,
-20294,
-20307,
-20313,
-20325,
-20351,
-20351,
-20374,
-20391,
-20407,
-20433,
-20443,
-20446,
-20453,
-20466,
-20472,
-20558,
-20564,
-20599,
-20621,
-20627,
-20630,
-20630,
-20653,
-20669,
-20672,
-20675,
-20682,
-20682,
-20685,
-20696,
-20696,
-20756,
-20759,
-20781,
-20805,
-20808,
-20843,
-20859,
-20859,
-20862,
-20890,
-20916,
-20936,
-20936,
-20936,
-20946,
-20968,
-20971,
-20982,
-20985,
-20985,
-20998,
-21001,
-21001,
-21010,
-21026,
-21047,
-21073,
-21073,
-21104,
-21113,
-21129,
-21158,
-21182,
-21182,
-21198,
-21206,
-21221,
-21224,
-21224,
-21224,
-21227,
-21235,
-21259,
-21266,
-21275,
-21281,
-21281,
-21298,
-21315,
-21332,
-21335,
-21338,
-21341,
-21341,
-21360,
-21363,
-21366,
-21382,
-21382,
-21385,
-21402,
-21405,
-21428,
-21431,
-21449,
-21449,
-21452,
-21472,
-21481,
-21514,
-21544,
-21569,
-21602,
-21605,
-21623,
-21623,
-21627,
-21630,
-21643,
-21649,
-21684,
-21684,
-21691,
-21691,
-21697,
-21704,
-21718,
-21727,
-21784,
-21793,
-21813,
-21813,
-21829,
-21832,
-21835,
-21838,
-21841,
-21841,
-21852,
-21904,
-21922,
-21922,
-21935,
-21935,
-21945,
-21945,
-21981,
-21984,
-21997,
-22018,
-22046,
-22065,
-22068,
-22068,
-22108,
-22114,
-22117,
-22121,
-22148,
-22148,
-22151,
-22174,
-22189,
-22204,
-22240,
-22273,
-22289,
-22304,
-22318,
-22342,
-22378,
-22383,
-22404,
-22407,
-22425,
-22425,
-22461,
-22493,
-22493,
-22493,
-22503,
-22528,
-22534,
-22540,
-22546,
-22549,
-22575,
-22608,
-22617,
-22617,
-22620,
-22635,
-22640,
-22673,
-22713,
-22746,
-22752,
-22755,
-22791,
-22831,
-22873,
-22904,
-22910,
-22913,
-22925,
-22928,
-22946,
-22969,
-23005,
-23005,
-23008,
-23042,
-23055,
-23058,
-23079,
-23079,
-23098,
-23119,
-23119,
-23129,
-23154,
-23173,
-23185,
-23199,
-23202,
-23202,
-23202,
-23208,
-23221,
-23221,
-23233,
-23240,
-23243,
-23246,
-23258,
-23267,
-23267,
-23282,
-23307,
-23327,
-23340,
-23343,
-23343,
-23343,
-23346,
-23349,
-23358,
-23361,
-23409,
-23439,
-23442,
-23442,
-23445,
-23464,
-23464,
-23476,
-23482,
-23504,
-23525,
-23540,
-23540,
-23547,
-23553,
-23553,
-23563,
-23587,
-23605,
-23611,
-23631,
-23631,
-23657,
-23677,
-23677,
-23677,
-23693,
-23700,
-23728,
-23731,
-23746,
-23763,
-23789,
-23789,
-23814,
-23830,
-23853,
-23872,
-23875,
-23885,
-23914,
-23939,
-23942,
-23942,
-23949,
-23971,
-23984,
-23999,
-24002,
-24040,
-24043,
-24110,
-24120,
-24133,
-24136,
-24146,
-24174,
-24184,
-24203,
-24207,
-24210,
-24228,
-24235,
-24251,
-24258,
-24268,
-24274,
-24281,
-24288,
-24298,
-24301,
-24389,
-24454,
-24478,
-24478,
-24478,
-24488,
-24514,
-24549,
-24565,
-24578,
-24606,
-24609,
-24626,
-24646,
-24678,
-24678,
-24684,
-24701,
-24733,
-24745,
-24773,
-24773,
-24780,
-24794,
-24807,
-24817,
-24827,
-24833,
-24833,
-24839,
-24864,
-24871,
-24882,
-24888,
-24910,
-24917,
-24917,
-24955,
-24955,
-24979,
-24986,
-24986,
-24993,
-25000,
-25007,
-25019,
-25049,
-25056,
-25056,
-25073,
-25086,
-25093,
-25100,
-25107,
-25120,
-25133,
-25140,
-25161,
-25161,
-25189,
-25206,
-25206,
-25213,
-25222,
-25267,
-25304,
-25345,
-25345,
-25345,
-25363,
-25363,
-25370,
-25373,
-25373,
-25373,
-25395,
-25411,
-25425,
-25445,
-25445,
-25452,
-25462,
-25475,
-25511,
-25535,
-25560,
-25575,
-25582,
-25589,
-25601,
-25607,
-25610,
-25654,
-25679,
-25698,
-25705,
-25711,
-25711,
-25718,
-25724,
-25724,
-25724,
-25766,
-25766,
-25809,
-25828,
-25852,
-25852,
-25867,
-25867,
-25891,
-25934,
-25969,
-25986,
-26015,
-26041,
-26070,
-26095,
-26109,
-26129,
-26129,
-26150,
-26157,
-26175,
-26189,
-26229,
-26244,
-26244,
-26244,
-26244,
-26263,
-26263,
-26288,
-26326,
-26340,
-26340,
-26347,
-26382,
-26412,
-26448,
-26468,
-26474,
-26481,
-26488,
-26524,
-26563,
-26596,
-26596,
-26613,
-26627,
-26671,
-26710,
-26722,
-26729,
-26773,
-26812,
-26826,
-26844,
-26861,
-26876,
-26905,
-26905,
-26905,
-26919,
-26938,
-26970,
-26970,
-26970,
-26988,
-27001,
-27025,
-27025,
-27025,
-27054,
-27060,
-27073,
-27099,
-27133,
-27140,
-27157,
-27184,
-27231,
-27257,
-27271,
-27293,
-27312,
-27330,
-27392,
-27401,
-27401,
-27426,
-27433,
-27445,
-27482,
-27489,
-27489,
-27524,
-27556,
-27563,
-27570,
-27570,
-27587,
-27600,
-27600,
-27623,
-27623,
-27673,
-27673,
-27688,
-27688,
-27688,
-27688,
-27694,
-27701,
-27706,
-27706,
-27728,
-27775,
-27782,
-27806,
-27828,
-27828,
-27834,
-27840,
-27853,
-27862,
-27868,
-27899,
-27906,
-27923,
-27937,
-27956,
-27963,
-27974,
-27981,
-28010,
-28046,
-28050,
-28078,
-28085,
-28085,
-28092,
-28099,
-28105,
-28128,
-28146,
-28153,
-28170,
-28190,
-28197,
-28215,
-28225,
-28232,
-28251,
-28251,
-28251,
-28258,
-28271,
-28278,
-28278,
-28285,
-28300,
-28300,
-28325,
-28325,
-28325,
-28332,
-28362,
-28392,
-28401,
-28401,
-28416,
-28423,
-28468,
-28475,
-28488,
-28495,
-28504,
-28511,
-28558,
-28565,
-28588,
-28588,
-28622,
-28629,
-28629,
-28647,
-28660,
-28672,
-28683,
-28683,
-28698,
-28705,
-28712,
-28712,
-28730,
-28761,
-28776,
-28800,
-28826,
-28832,
-28870,
-28882,
-28905,
-28926,
-28926,
-28933,
-28933,
-28933,
-28958,
-28965,
-28981,
-28981,
-28988,
-29022,
-29034,
-29034,
-29056,
-29070,
-29086,
-29093,
-29099,
-29099,
-29111,
-29118,
-29118,
-29138,
-29138,
-29155,
-29155,
-29188,
-29231,
-29231,
-29231,
-29245,
-29245,
-29251,
-29263,
-29284,
-29290,
-29313,
-29313,
-29349,
-29362,
-29362,
-29393,
-29393,
-29407,
-29407,
-29447,
-29453,
-29453,
-29470,
-29470,
-29498,
-29530,
-29530,
-29570,
-29570,
-29576,
-29576,
-29597,
-29610,
-29610,
-29620,
-29620,
-29620,
-29636,
-29661,
-29665,
-29665,
-29665,
-29680,
-29680,
-29693,
-29693,
-29693,
-29693,
-29698,
-29705,
-29738,
-29747,
-29765,
-29765,
-29775,
-29795,
-29795,
-29818,
-29818,
-29833,
-29885,
-29885,
-29919,
-29919,
-29953,
-29980,
-29988,
-30004,
-30023,
-30027,
-30040,
-30057,
-30064,
-30064,
-30073,
-30098,
-30098,
-30110,
-30110,
-30110,
-30130,
-30138,
-30164,
-30164,
-30168,
-30181,
-30185,
-30210,
-30223,
-30223,
-30251,
-30307,
-30346,
-30346,
-30359,
-30365,
-30365,
-30375,
-30408,
-30408,
-30416,
-30416,
-30422,
-30422,
-30422,
-30422,
-30422,
-30422,
-30444,
-30469,
-30506,
-30506,
-30514,
-30514,
-30540,
-30561,
-30575,
-30601,
-30601,
-30601,
-30617,
-30617,
-30652,
-30663,
-30667,
-30674,
-30688,
-30695,
-30725,
-30725,
-30749,
-30760,
-30778,
-30786,
-30786,
-30799,
-30805,
-30809,
-30809,
-30845,
-30845,
-30845,
-30871,
-30871,
-30911,
-30932,
-30932,
-30947,
-30953,
-30957,
-30976,
-30976,
-30985,
-30991,
-30991,
-31008,
-31024,
-31055,
-31055,
-31072,
-31112,
-31120,
-31128,
-31137,
-31181,
-31205,
-31205,
-31205,
-31205,
-31205,
-31227,
-31227,
-31234,
-31273,
-31273,
-31273,
-31273,
-31281,
-31317,
-31327,
-31348,
-31384,
-31392,
-31409,
-31409,
-31417,
-31446,
-31446,
-31446,
-31446,
-31446,
-31463,
-31463,
-31463,
-31463,
-31463,
-31483,
-31490,
-31490,
-31500,
-31500,
-31500,
-31525,
-31584,
-31584,
-31594,
-31594,
-31594,
-31636,
-31647,
-31647,
-31667,
-31667,
-31688,
-31692,
-31692,
-31704,
-31719,
-31734,
-31734,
-31739,
-31739,
-31739,
-31755,
-31786,
-31807,
-31807,
-31807,
-31807,
-31822,
-31834,
-31838,
-31856,
-31856,
-31876,
-31884,
-31908,
-31908,
-31908,
-31912,
-31932,
-31954,
-31960,
-31960,
-31990,
-31990,
-32000,
-32000,
-32029,
-32054,
-32094,
-32101,
-32101,
-32111,
-32111,
-32200,
-32217,
-32226,
-32230,
-32230,
-32230,
-32230,
-32244,
-32270,
-32270,
-32295,
-32311,
-32311,
-32311,
-32325,
-32329,
-32341,
-32350,
-32387,
-32404,
-32414,
-32422,
-32443,
-32449,
-32449,
-32449,
-32469,
-32489,
-32489,
-32496,
-32496,
-32502,
-32502,
-32507,
-32524,
-32542,
-32551,
-32571,
-32604,
-32620,
-32639,
-32663,
-32668,
-32674,
-32689,
-32710,
-32710,
-32710,
-32710,
-32720,
-32720,
-32720,
-32775,
-32775,
-32775,
-32775,
-32828,
-32864,
-32864,
-32864,
-32864,
-32880,
-32901,
-32928,
-32953,
-32964,
-32964,
-32976,
-32976,
-32976,
-32976,
-32976,
-32997,
-33013,
-33043,
-33043,
-33075,
-33107,
-33122,
-33168,
-33182,
-33193,
-33193,
-33218,
-33218,
-33234,
-33240,
-33264,
-33304,
-33347,
-33359,
-33359,
-33359,
-33359,
-33368,
-33384,
-33384,
-33428,
-33428,
-33428,
-33428,
-33450,
-33459,
-33459,
-33478,
-33489,
-33489,
-33489,
-33496,
-33496,
-33507,
-33541,
-33577,
-33577,
-33587,
-33587,
-33604,
-33616,
-33642,
-33642,
-33642,
-33642,
-33642,
-33642,
-33654,
-33662,
-33662,
-33662,
-33679,
-33679,
-33716,
-33716,
-33726,
-33726,
-33733,
-33733,
-33766,
-33766,
-33766,
-33770,
-33770,
-33782,
-33806,
-33815,
-33815,
-33834,
-33834,
-33834,
-33834,
-33850,
-33864,
-33885,
-33885,
-33895,
-33895,
-33895,
-33931,
-33938,
-33938,
-33944,
-33971,
-33977,
-34000,
-34000,
-34032,
-34036,
-34036,
-34053,
-34053,
-34068,
-34082,
-34082,
-34099,
-34110,
-34110,
-34115,
-34148,
-34148,
-34148,
-34148,
-34161,
-34175,
-34194,
-34194,
-34194,
-34249,
-34249,
-34253,
-34253,
-34253,
-34253,
-34253,
-34264,
-34264,
-34264,
-34272,
-34272,
-34279,
-34284,
-34292,
-34317,
-34323,
-34323,
-34323,
-34360,
-34360,
-34380,
-34411,
-34411,
-34433,
-34433,
-34454,
-34454,
-34454,
-34477,
-34477,
-34481,
-34481,
-34498,
-34504,
-34504,
-34521,
-34521,
-34556,
-34566,
-34572,
-34593,
-34593,
-34617,
-34617,
-34617,
-34640,
-34640,
-34640,
-34658,
-34665,
-34680,
-34698,
-34698,
-34698,
-34723,
-34723,
-34723,
-34723,
-34729,
-34753,
-34768,
-34768,
-34768,
-34768,
-34768,
-34768,
-34768,
-34768,
-34786,
-34799,
-34824,
-34824,
-34839,
-34859,
-34897,
-34897,
-34897,
-34906,
-34945,
-34945,
-34987,
-34987,
-34987,
-34987,
-34993,
-35016,
-35025,
-35035,
-35035,
-35074,
-35074,
-35080,
-35080,
-35091,
-35098,
-35119,
-35147,
-35147,
-35147,
-35159,
-35165,
-35165,
-35165,
-35177,
-35204,
-35211,
-35211,
-35211,
-35233,
-35233,
-35233,
-35241,
-35241,
-35241,
-35273,
-35273,
-35273,
-35296,
-35303,
-35303,
-35308,
-35308,
-35308,
-35336,
-35344,
-35355,
-35360,
-35360,
-35385,
-35403,
-35403,
-35436,
-35436,
-35436,
-35447,
-35447,
-35470,
-35476,
-35517,
-35528,
-35537,
-35537,
-35537,
-35563,
-35611,
-35622,
-35622,
-35631,
-35631,
-35655,
-35655,
-35661,
-35661,
-35674,
-35687,
-35687,
-35693,
-35693,
-35702,
-35711,
-35711,
-35722,
-35722,
-35741,
-35759,
-35759,
-35775,
-35775,
-35775,
-35775,
-35782,
-35782,
-35845,
-35845,
-35865,
-35903,
-35927,
-35949,
-35955,
-35961,
-35961,
-35974,
-35998,
-36040,
-36040,
-36058,
-36058,
-36058,
-36093,
-36093,
-36093,
-36093,
-36135,
-36143,
-36160,
-36171,
-36180,
-36189,
-36196,
-36196,
-36196,
-36224,
-36255,
-36262,
-36337,
-36337,
-36337,
-36349,
-36356,
-36370,
-36401,
-36401,
-36420,
-36420,
-36434,
-36434,
-36462,
-36462,
-36474,
-36481,
-36481,
-36481,
-36481,
-36481,
-36481,
-36481,
-36488,
-36488,
-36488,
-36505,
-36544,
-36571,
-36571,
-36587,
-36616,
-36616,
-36628,
-36680,
-36690,
-36690,
-36711,
-36732,
-36732,
-36736,
-36754,
-36754,
-36761,
-36761,
-36794,
-36812,
-36849,
-36860,
-36860,
-36898,
-36918,
-36927,
-36944,
-36957,
-36957,
-36962,
-36977,
-37000,
-37017,
-37017,
-37017,
-37017,
-37032,
-37032,
-37038,
-37054,
-37054,
-37063,
-37063,
-37063,
-37088,
-37135,
-37145,
-37156,
-37169,
-37181,
-37210,
-37254,
-37254,
-37285,
-37316,
-37333,
-37378,
-37391,
-37422,
-37444,
-37444,
-37444,
-37444,
-37444,
-37460,
-37460,
-37518,
-37518,
-37541,
-37576,
-37593,
-37610,
-37614,
-37619,
-37625,
-37625,
-37629,
-37649,
-37670,
-37698,
-37714,
-37727,
-37739,
-37739,
-37739,
-37762,
-37762,
-37790,
-37790,
-37807,
-37807,
-37807,
-37862,
-37878,
-37893,
-37900,
-37920,
-37951,
-37951,
-37976,
-37985,
-37985,
-38021,
-38051,
-38065,
-38065,
-38065,
-38065,
-38081,
-38081,
-38112,
-38112,
-38150,
-38150,
-38150,
-38150,
-38150,
-38150,
-38150,
-38167,
-38178,
-38206,
-38238,
-38238,
-38261,
-38296,
-38296,
-38321,
-38321,
-38363,
-38389,
-38389,
-38389,
-38403,
-38403,
-38415,
-38431,
-38431,
-38445,
-38473,
-38525,
-38571,
-38578,
-38578,
-38578,
-38589,
-38589,
-38589,
-38589,
-38604,
-38618,
-38618,
-38618,
-38624,
-38624,
-38634,
-38640,
-38640,
-38647,
-38685,
-38685,
-38694,
-38714,
-38729,
-38729,
-38729,
-38755,
-38755,
-38760,
-38760,
-38778,
-38778,
-38814,
-38814,
-38830,
-38842,
-38857,
-38857,
-38867,
-38882,
-38882,
-38893,
-38893,
-38893,
-38911,
-38911,
-38911,
-38925,
-38925,
-38932,
-38939,
-38939,
-38945,
-38953,
-38953,
-38953,
-38960,
-38960,
-38994,
-39004,
-39004,
-39004,
-39004,
-39014,
-39019,
-39051,
-39073,
-39073,
-39095,
-39095,
-39137,
-39162,
-39162,
-39167,
-39167,
-39188,
-39205,
-39210,
-39223,
-39223,
-39223,
-39237,
-39255,
-39280,
-39280,
-39311,
-39358,
-39406,
-39406,
-39406,
-39429,
-39444,
-39454,
-39487,
-39487,
-39503,
-39516,
-39516,
-39516,
-39522,
-39540,
-39540,
-39559,
-39559,
-39559,
-39569,
-39591,
-39591,
-39611,
-39611,
-39611,
-39611,
-39619,
-39619,
-39619,
-39619,
-39631,
-39646,
-39646,
-39651,
-39657,
-39657,
-39657,
-39657,
-39674,
-39729,
-39729,
-39758,
-39772,
-39789,
-39875,
-39887,
-39887,
-39887,
-39887,
-39944,
-39944,
-39983,
-39999,
-39999,
-40015,
-40019,
-40049,
-40064,
-40064,
-40073,
-40073,
-40080,
-40089,
-40089,
-40089,
-40089,
-40094,
-40094,
-40101,
-40112,
-40128,
-40155,
-40187,
-40187,
-40187,
-40194,
-40194,
-40221,
-40258,
-40258,
-40265,
-40272,
-40272,
-40279,
-40283,
-40290,
-40290,
-40307,
-40336,
-40370,
-40370,
-40370,
-40389,
-40389,
-40406,
-40429,
-40429,
-40429,
-40429,
-40429,
-40429,
-40429,
-40436,
-40447,
-40447,
-40447,
-40464,
-40478,
-40487,
-40487,
-40520,
-40520,
-40526,
-40526,
-40531,
-40531,
-40549,
-40568,
-40574,
-40574,
-40616,
-40623,
-40630,
-40630,
-40644,
-40666,
-40666,
-40695,
-40703,
-40703,
-40711,
-40711,
-40718,
-40723,
-40736,
-40736,
-40736,
-40746,
-40785,
-40795,
-40804,
-40804,
-40816,
-40835,
-40851,
-40877,
-40891,
-40931,
-40938,
-40976,
-40986,
-41006,
-41006,
-41013,
-41025,
-41031,
-41045,
-41045,
-41097,
-41118,
-41118,
-41143,
-41157,
-41183,
-41194,
-41194,
-41236,
-41264,
-41286,
-41286,
-41327,
-41334,
-41334,
-41334,
-41334,
-41352,
-41352,
-41358,
-41358,
-41358,
-41375,
-41383,
-41383,
-41398,
-41423,
-41423,
-41467,
-41467,
-41474,
-41490,
-41490,
-41521,
-41521,
-41521,
-41559,
-41566,
-41576,
-41598,
-41643,
-41667,
-41680,
-41703,
-41703,
-41703,
-41714,
-41752,
-41761,
-41768,
-41775,
-41789,
-41789,
-41825,
-41841,
-41841,
-41841,
-41871,
-41906,
-41906,
-41936,
-41975,
-41990,
-41990,
-41990,
-41990,
-42030,
-42030,
-42056,
-42056,
-42066,
-42066,
-42097,
-42097,
-42124,
-42141,
-42141,
-42141,
-42147,
-42154,
-42161,
-42177,
-42177,
-42203,
-42210,
-42210,
-42210,
-42210,
-42210,
-42222,
-42222,
-42222,
-42244,
-42244,
-42300,
-42300,
-42322,
-42346,
-42356,
-42356,
-42387,
-42387,
-42387,
-42413,
-42413,
-42434,
-42434,
-42487,
-42507,
-42514,
-42528,
-42528,
-42528,
-42548,
-42582,
-42582,
-42588,
-42631,
-42649,
-42656,
-42676,
-42684,
-42704,
-42718,
-42743,
-42764,
-42777,
-42783,
-42802,
-42829,
-42855,
-42869,
-42869,
-42869,
-42869,
-42879,
-42879,
-42891,
-42891,
-42919,
-42919,
-42934,
-42950,
-42950,
-42992,
-43012,
-43012,
-43021,
-43033,
-43033,
-43056,
-43066,
-43079,
-43079,
-43079,
-43088,
-43095,
-43163,
-43163,
-43163,
-43163,
-43171,
-43171,
-43194,
-43217,
-43217,
-43223,
-43252,
-43252,
-43267,
-43281,
-43304,
-43322,
-43348,
-43359,
-43392,
-43402,
-43441,
-43441,
-43441,
-43468,
-43468,
-43468,
-43485,
-43489,
-43519,
-43526,
-43526,
-43564,
-43564,
-43564,
-43583,
-43583,
-43605,
-43609,
-43621,
-43640,
-43651,
-43651,
-43655,
-43662,
-43662,
-43685,
-43712,
-43728,
-43733,
-43752,
-43760,
-43775,
-43786,
-43786,
-43796,
-43811,
-43846,
-43862,
-43862,
-43892,
-43930,
-43930,
-43956,
-43986,
-44006,
-44006,
-44016,
-44059,
-44059,
-44084,
-44091,
-44091,
-44105,
-44113,
-44128,
-44157,
-44167,
-44173,
-44195,
-44195,
-44195,
-44213,
-44213,
-44213,
-44238,
-44255,
-44316,
-44316,
-44327,
-44327,
-44335,
-44335,
-44335,
-44335,
-44372,
-44372,
-44372,
-44372,
-44379,
-44402,
-44431,
-44454,
-44470,
-44486,
-44486,
-44512,
-44512,
-44525,
-44538,
-44555,
-44574,
-44574,
-44574,
-44583,
-44583,
-44583,
-44583,
-44597,
-44617,
-44627,
-44627,
-44666,
-44666,
-44666,
-44673,
-44673,
-44673,
-44736,
-44736,
-44736,
-44736,
-44743,
-44763,
-44787,
-44804,
-44819,
-44819,
-44835,
-44848,
-44886,
-44886,
-44915,
-44944,
-44949,
-44949,
-44949,
-44949,
-44976,
-44976,
-45008,
-45008,
-45028,
-45028,
-45062,
-45062,
-45069,
-45069,
-45095,
-45095,
-45095,
-45105,
-45122,
-45143,
-45153,
-45153,
-45153,
-45153,
-45153,
-45153,
-45153,
-45153,
-45158,
-45158,
-45158,
-45186,
-45198,
-45225,
-45225,
-45243,
-45270,
-45287,
-45287,
-45287,
-45316,
-45348,
-45365,
-45372,
-45381,
-45381,
-45402,
-45402,
-45420,
-45420,
-45435,
-45435,
-45448,
-45448,
-45499,
-45507,
-45507,
-45529,
-45547,
-45547,
-45547,
-45556,
-45573,
-45583,
-45593,
-45609,
-45620,
-45620,
-45663,
-45688,
-45705,
-45705,
-45711,
-45729,
-45752,
-45766,
-45772,
-45782,
-45799,
-45811,
-45866,
-45866,
-45903,
-45903,
-45903,
-45903,
-45924,
-45974,
-45978,
-45994,
-45994,
-45998,
-46045,
-46060,
-46083,
-46083,
-46114,
-46123,
-46130,
-46180,
-46186,
-46201,
-46201,
-46201,
-46259,
-46280,
-46291,
-46295,
-46301,
-46347,
-46347,
-46396,
-46412,
-46455,
-46455,
-46455,
-46460,
-46487,
-46509,
-46509,
-46509,
-46523,
-46565,
-46578,
-46578,
-46578,
-46584,
-46594,
-46594,
-46638,
-46659,
-46659,
-46671,
-46671,
-46691,
-46691,
-46691,
-46718,
-46718,
-46732,
-46742,
-46759,
-46759,
-46787,
-46803,
-46803,
-46816,
-46844,
-46867,
-46867,
-46898,
-46898,
-46920,
-46963,
-46991,
-47006,
-47016,
-47016,
-47028,
-47043,
-47047,
-47047,
-47047,
-47078,
-47093,
-47100,
-47120,
-47125,
-47139,
-47139,
-47143,
-47162,
-47162,
-47182,
-47182,
-47204,
-47204,
-47223,
-47223,
-47234,
-47234,
-47234,
-47239,
-47239,
-47247,
-47247,
-47253,
-47287,
-47287,
-47287,
-47287,
-47287,
-47306,
-47346,
-47376,
-47376,
-47412,
-47412,
-47412,
-47412,
-47412,
-47412,
-47420,
-47429,
-47438,
-47438,
-47438,
-47438,
-47449,
-47449,
-47465,
-47465,
-47479,
-47498,
-47498,
-47498,
-47498,
-47510,
-47532,
-47540,
-47547,
-47553,
-47553,
-47553,
-47553,
-47569,
-47569,
-47589,
-47589,
-47589,
-47631,
-47637,
-47637,
-47637,
-47637,
-47653,
-47653,
-47653,
-47672,
-47672,
-47672,
-47703,
-47703,
-47703,
-47711,
-47725,
-47725,
-47748,
-47778,
-47790,
-47790,
-47815,
-47815,
-47815,
-47842,
-47842,
-47858,
-47880,
-47880,
-47880,
-47880,
-47910,
-47910,
-47921,
-47948,
-47959,
-47959,
-47959,
-47979,
-47979,
-47984,
-48010,
-48019,
-48035,
-48035,
-48054,
-48054,
-48089,
-48089,
-48105,
-48115,
-48121,
-48135,
-48159,
-48169,
-48169,
-48169,
-48169,
-48187,
-48187,
-48187,
-48227,
-48244,
-48256,
-48272,
-48272,
-48287,
-48287,
-48287,
-48287,
-48287,
-48309,
-48341,
-48341,
-48351,
-48351,
-48351,
-48380,
-48380,
-48380,
-48386,
-48414,
-48439,
-48455,
-48491,
-48505,
-48517,
-48517,
-48517,
-48517,
-48562,
-48577,
-48577,
-48589,
-48594,
-48631,
-48631,
-48644,
-48644,
-48644,
-48648,
-48660,
-48667,
-48685,
-48685,
-48695,
-48695,
-48695,
-48695,
-48710,
-48710,
-48710,
-48727,
-48753,
-48753,
-48769,
-48769,
-48775,
-48788,
-48788,
-48802,
-48830,
-48834,
-48873,
-48873,
-48882,
-48886,
-48898,
-48915,
-48915,
-48950,
-49002,
-49019,
-49019,
-49029,
-49029,
-49068,
-49068,
-49068,
-49090,
-49090,
-49106,
-49106,
-49106,
-49113,
-49148,
-49163,
-49163,
-49206,
-49229,
-49253,
-49281,
-49281,
-49281,
-49281,
-49295,
-49307,
-49311,
-49327,
-49343,
-49360,
-49403,
-49403,
-49403,
-49429,
-49429,
-49434,
-49434,
-49434,
-49434,
-49444,
-49444,
-49460,
-49460,
-49496,
-49503,
-49538,
-49574,
-49574,
-49574,
-49574,
-49612,
-49612,
-49651,
-49661,
-49686,
-49686,
-49695,
-49710,
-49710,
-49725,
-49742,
-49742,
-49742,
-49742,
-49742,
-49757,
-49757,
-49762,
-49815,
-49835,
-49863,
-49863,
-49869,
-49888,
-49907,
-49907,
-49917,
-49940,
-49940,
-49946,
-49963,
-49998,
-50017,
-50031,
-50052,
-50074,
-50074,
-50085,
-50085,
-50105,
-50105,
-50123,
-50123,
-50136,
-50152,
-50192,
-50192,
-50212,
-50212,
-50226,
-50226,
-50259,
-50259,
-50259,
-50282,
-50287,
-50315,
-50320,
-50320,
-50320,
-50320,
-50379,
-50396,
-50412,
-50412,
-50412,
-50412,
-50443,
-50466,
-50466,
-50489,
-50489,
-50503,
-50503,
-50503,
-50503,
-50521,
-50529,
-50529,
-50556,
-50575,
-50575,
-50581,
-50581,
-50581,
-50585,
-50585,
-50598,
-50598,
-50598,
-50598,
-50598,
-50611,
-50636,
-50636,
-50646,
-50661,
-50661,
-50661,
-50680,
-50680,
-50713,
-50713,
-50729,
-50753,
-50753,
-50759,
-50791,
-50806,
-50806,
-50806,
-50806,
-50806,
-50814,
-50831,
-50831,
-50831,
-50878,
-50897,
-50897,
-50921,
-50943,
-50949,
-50960,
-50981,
-50991,
-51008,
-51020,
-51020,
-51035,
-51045,
-51045,
-51085,
-51110,
-51123,
-51123,
-51142,
-51176,
-51204,
-51204,
-51214,
-51214,
-51214,
-51214,
-51232,
-51239,
-51239,
-51279,
-51279,
-51279,
-51279,
-51279,
-51295,
-51295,
-51314,
-51340,
-51358,
-51383,
-51414,
-51434,
-51434,
-51434,
-51440,
-51440,
-51459,
-51465,
-51484,
-51502,
-51502,
-51519,
-51536,
-51536,
-51551,
-51551,
-51557,
-51557,
-51557,
-51564,
-51573,
-51573,
-51573,
-51580,
-51580,
-51594,
-51594,
-51610,
-51610,
-51625,
-51625,
-51669,
-51669,
-51669,
-51720,
-51720,
-51720,
-51720,
-51730,
-51730,
-51730,
-51730,
-51750,
-51793,
-51800,
-51810,
-51821,
-51827,
-51852,
-51865,
-51869,
-51869,
-51875,
-51911,
-51911,
-51911,
-51934,
-51953,
-51953,
-51953,
-51967,
-51967,
-51967,
-51980,
-51985,
-51985,
-51985,
-51985,
-51985,
-51985,
-51996,
-52044,
-52044,
-52044,
-52065,
-52065,
-52079,
-52093,
-52105,
-52105,
-52112,
-52136,
-52136,
-52158,
-52167,
-52194,
-52211,
-52232,
-52266,
-52290,
-52321,
-52321,
-52338,
-52371,
-52371,
-52371,
-52371,
-52376,
-52401,
-52415,
-52415,
-52425,
-52425,
-52435,
-52435,
-52443,
-52443,
-52455,
-52491,
-52506,
-52547,
-52567,
-52567,
-52584,
-52588,
-52598,
-52638,
-52643,
-52664,
-52664,
-52664,
-52664,
-52664,
-52693,
-52701,
-52701,
-52740,
-52775,
-52775,
-52813,
-52824,
-52849,
-52849,
-52862,
-52877,
-52890,
-52890,
-52890,
-52906,
-52931,
-52952,
-52952,
-52952,
-52952,
-52968,
-52977,
-52995,
-52995,
-52995,
-53010,
-53010,
-53039,
-53039,
-53039,
-53056,
-53056,
-53065,
-53077,
-53095,
-53113,
-53142,
-53142,
-53151,
-53151,
-53167,
-53167,
-53192,
-53192,
-53198,
-53198,
-53198,
-53226,
-53226,
-53226,
-53232,
-53276,
-53288,
-53288,
-53301,
-53301,
-53301,
-53301,
-53301,
-53301,
-53301,
-53301,
-53313,
-53336,
-53345,
-53363,
-53384,
-53384,
-53413,
-53413,
-53421,
-53421,
-53428,
-53450,
-53472,
-53510,
-53510,
-53510,
-53540,
-53540,
-53546,
-53558,
-53558,
-53558,
-53558,
-53558,
-53570,
-53570,
-53591,
-53611,
-53650,
-53664,
-53671,
-53710,
-53722,
-53722,
-53741,
-53771,
-53780,
-53827,
-53833,
-53863,
-53868,
-53880,
-53893,
-53893,
-53907,
-53919,
-53939,
-53939,
-53956,
-54004,
-54004,
-54004,
-54021,
-54021,
-54045,
-54045,
-54060,
-54060,
-54060,
-54060,
-54060,
-54060,
-54077,
-54077,
-54091,
-54115,
-54124,
-54175,
-54175,
-54175,
-54194,
-54194,
-54221,
-54272,
-54302,
-54314,
-54324,
-54324,
-54324,
-54336,
-54349,
-54369,
-54369,
-54369,
-54431,
-54431,
-54451,
-54479,
-54526,
-54526,
-54568,
-54577,
-54577,
-54577,
-54587,
-54609,
-54609,
-54616,
-54637,
-54658,
-54665,
-54665,
-54681,
-54692,
-54692,
-54705,
-54705,
-54738,
-54750,
-54764,
-54764,
-54770,
-54770,
-54779,
-54779,
-54779,
-54810,
-54810,
-54843,
-54874,
-54874,
-54874,
-54874,
-54900,
-54913,
-54913,
-54929,
-54956,
-54985,
-54991,
-55048,
-55048,
-55069,
-55069,
-55105,
-55105,
-55112,
-55127,
-55127,
-55133,
-55153,
-55171,
-55203,
-55215,
-55250,
-55262,
-55262,
-55272,
-55272,
-55272,
-55286,
-55286,
-55296,
-55336,
-55336,
-55390,
-55390,
-55390,
-55390,
-55421,
-55421,
-55428,
-55460,
-55487,
-55487,
-55505,
-55505,
-55521,
-55521,
-55525,
-55530,
-55541,
-55551,
-55551,
-55551,
-55564,
-55564,
-55585,
-55585,
-55585,
-55585,
-55610,
-55661,
-55661,
-55681,
-55698,
-55716,
-55716,
-55725,
-55734,
-55751,
-55812,
-55823,
-55832,
-55832,
-55832,
-55871,
-55889,
-55889,
-55905,
-55905,
-55905,
-55948,
-55956,
-55971,
-55971,
-55971,
-56009,
-56037,
-56037,
-56037,
-56044,
-56044,
-56044,
-56044,
-56044,
-56044,
-56074,
-56074,
-56074,
-56078,
-56119,
-56131,
-56152,
-56159,
-56186,
-56248,
-56252,
-56252,
-56256,
-56256,
-56256,
-56256,
-56283,
-56295,
-56342,
-56367,
-56367,
-56367,
-56382,
-56394,
-56415,
-56415,
-56421,
-56421,
-56421,
-56486,
-56499,
-56499,
-56531,
-56531,
-56531,
-56560,
-56597,
-56604,
-56612,
-56621,
-56656,
-56656,
-56656,
-56671,
-56671,
-56671,
-56684,
-56684,
-56684,
-56684,
-56684,
-56684,
-56684,
-56702,
-56710,
-56718,
-56738,
-56738,
-56755,
-56770,
-56785,
-56821,
-56821,
-56832,
-56832,
-56832,
-56832,
-56880,
-56906,
-56914,
-56914,
-56914,
-56914,
-56914,
-56914,
-56922,
-56922,
-56931,
-56940,
-56940,
-56950,
-56972,
-56990,
-57000,
-57006,
-57006,
-57006,
-57030,
-57054,
-57063,
-57095,
-57095,
-57095,
-57095,
-57100,
-57100,
-57100,
-57100,
-57100,
-57129,
-57129,
-57129,
-57147,
-57147,
-57184,
-57203,
-57203,
-57215,
-57258,
-57286,
-57308,
-57308,
-57308,
-57335,
-57352,
-57352,
-57382,
-57403,
-57415,
-57450,
-57457,
-57478,
-57499,
-57506,
-57506,
-57523,
-57545,
-57545,
-57566,
-57579,
-57589,
-57597,
-57632,
-57659,
-57667,
-57696,
-57696,
-57705,
-57743,
-57751,
-57798,
-57818,
-57830,
-57857,
-57865,
-57865,
-57895,
-57940,
-57976,
-57976,
-57976,
-57976,
-57976,
-57976,
-57976,
-57976,
-57976,
-58011,
-58016,
-58016,
-58052,
-58066,
-58066,
-58066,
-58066,
-58089,
-58089,
-58089,
-58105,
-58105,
-58123,
-58160,
-58179,
-58179,
-58179,
-58179,
-58179,
-58187,
-58187,
-58187,
-58210,
-58227,
-58227,
-58254,
-58254,
-58254,
-58254,
-58254,
-58254,
-58271,
-58290,
-58305,
-58318,
-58336,
-58336,
-58353,
-58353,
-58353,
-58365,
-58365,
-58365,
-58377,
-58425,
-58425,
-58446,
-58446,
-58446,
-58446,
-58456,
-58456,
-58470,
-58495,
-58495,
-58495,
-58495,
-58495,
-58508,
-58508,
-58530,
-58564,
-58574,
-58574,
-58574,
-58615,
-58658,
-58658,
-58686,
-58686,
-58686,
-58686,
-58686,
-58686,
-58703,
-58703,
-58738,
-58767,
-58767,
-58767,
-58767,
-58774,
-58774,
-58774,
-58781,
-58781,
-58781,
-58781,
-58781,
-58781,
-58781,
-58795,
-58795,
-58812,
-58836,
-58836,
-58844,
-58844,
-58865,
-58865,
-58871,
-58881,
-58908,
-58908,
-58908,
-58927,
-58927,
-58927,
-58941,
-58941,
-58941,
-58941,
-58941,
-58941,
-58941,
-58959,
-58959,
-58959,
-58959,
-58966,
-58966,
-58980,
-58980,
-59006,
-59016,
-59016,
-59032,
-59055,
-59067,
-59067,
-59092,
-59092,
-59097,
-59116,
-59135,
-59154,
-59154,
-59164,
-59181,
-59209,
-59268,
-59268,
-59281,
-59281,
-59294,
-59310,
-59329,
-59329,
-59329,
-59360,
-59367,
-59367,
-59378,
-59385,
-59385,
-59385,
-59385,
-59385,
-59385,
-59385,
-59385,
-59385,
-59409,
-59413,
-59413,
-59413,
-59420,
-59420,
-59449,
-59449,
-59449,
-59467,
-59467,
-59486,
-59501,
-59507,
-59507,
-59533,
-59540,
-59553,
-59553,
-59553,
-59553,
-59553,
-59553,
-59572,
-59572,
-59592,
-59601,
-59618,
-59654,
-59659,
-59659,
-59659,
-59659,
-59659,
-59669,
-59687,
-59717,
-59717,
-59717,
-59717,
-59717,
-59744,
-59771,
-59803,
-59813,
-59836,
-59876,
-59899,
-59899,
-59899,
-59899,
-59919,
-59919,
-59927,
-59956,
-59975,
-59975,
-59975,
-59993,
-60046,
-60068,
-60087,
-60087,
-60117,
-60117,
-60117,
-60117,
-60127,
-60127,
-60127,
-60142,
-60163,
-60163,
-60179,
-60202,
-60211,
-60245,
-60245,
-60245,
-60245,
-60263,
-60282,
-60294,
-60294,
-60294,
-60318,
-60318,
-60318,
-60318,
-60327,
-60327,
-60327,
-60390,
-60390,
-60395,
-60395,
-60395,
-60395,
-60410,
-60424,
-60444,
-60502,
-60502,
-60502,
-60529,
-60546,
-60573,
-60573,
-60588,
-60609,
-60609,
-60613,
-60613,
-60613,
-60659,
-60700,
-60714,
-60714,
-60714,
-60723,
-60739,
-60739,
-60739,
-60753,
-60753,
-60753,
-60759,
-60759,
-60766,
-60781,
-60810,
-60835,
-60835,
-60835,
-60835,
-60882,
-60891,
-60891,
-60909,
-60927,
-60927,
-60927,
-60927,
-60927,
-60927,
-60927,
-60927,
-60953,
-60959,
-60970,
-60970,
-60991,
-60991,
-61001,
-61037,
-61074,
-61074,
-61093,
-61102,
-61102,
-61112,
-61124,
-61132,
-61141,
-61141,
-61141,
-61141,
-61172,
-61172,
-61172,
-61184,
-61200,
-61200,
-61200,
-61222,
-61237,
-61247,
-61247,
-61261,
-61261,
-61269,
-61269,
-61269,
-61269,
-61269,
-61269,
-61274,
-61274,
-61292,
-61320,
-61320,
-61327,
-61355,
-61368,
-61368,
-61368,
-61379,
-61386,
-61386,
-61386,
-61403,
-61425,
-61453,
-61469,
-61480,
-61487,
-61487,
-61487,
-61487,
-61487,
-61487,
-61487,
-61514,
-61514,
-61522,
-61532,
-61532,
-61532,
-61568,
-61587,
-61599,
-61622,
-61622,
-61622,
-61627,
-61627,
-61627,
-61647,
-61647,
-61652,
-61652,
-61652,
-61652,
-61676,
-61692,
-61692,
-61692,
-61732,
-61732,
-61732,
-61732,
-61732,
-61732,
-61755,
-61755,
-61755,
-61755,
-61755,
-61788,
-61788,
-61788,
-61788,
-61788,
-61826,
-61826,
-61836,
-61849,
-61889,
-61934,
-61934,
-61934,
-61949,
-61949,
-61949,
-61955,
-61955,
-61955,
-61955,
-61955,
-61955,
-61955,
-61966,
-61974,
-61974,
-61974,
-61981,
-61981,
-61981,
-61998,
-62018,
-62061,
-62080,
-62088,
-62122,
-62133,
-62149,
-62166,
-62182,
-62182,
-62188,
-62188,
-62188,
-62197,
-62205,
-62211,
-62211,
-62211,
-62234,
-62234,
-62239,
-62247,
-62267,
-62267,
-62286,
-62286,
-62286,
-62286,
-62286,
-62308,
-62308,
-62308,
-62308,
-62323,
-62334,
-62375,
-62383,
-62393,
-62414,
-62427,
-62494,
-62504,
-62525,
-62525,
-62525,
-62525,
-62525,
-62525,
-62563,
-62563,
-62571,
-62583,
-62583,
-62583,
-62594,
-62608,
-62636,
-62648,
-62648,
-62648,
-62648,
-62680,
-62693,
-62693,
-62702,
-62702,
-62702,
-62720,
-62732,
-62757,
-62772,
-62778,
-62793,
-62813,
-62830,
-62847,
-62862,
-62888,
-62888,
-62900,
-62924,
-62934,
-62934,
-62934,
-62953,
-63001,
-63006,
-63006,
-63006,
-63006,
-63006,
-63012,
-63012,
-63025,
-63025,
-63025,
-63057,
-63063,
-63063,
-63081,
-63081,
-63098,
-63118,
-63135,
-63135,
-63135,
-63135,
-63154,
-63170,
-63183,
-63183,
-63183,
-63183,
-63183,
-63183,
-63202,
-63202,
-63202,
-63202,
-63231,
-63242,
-63248,
-63248,
-63265,
-63265,
-63265,
-63265,
-63265,
-63277,
-63287,
-63311,
-63321,
-63336,
-63336,
-63348,
-63348,
-63366,
-63366,
-63366,
-63366,
-63366,
-63373,
-63373,
-63373,
-63384,
-63384,
-63389,
-63394,
-63407,
-63407,
-63425,
-63444,
-63492,
-63515,
-63542,
-63542,
-63542,
-63569,
-63569,
-63586,
-63586,
-63613,
-63613,
-63626,
-63654,
-63659,
-63659,
-63659,
-63693,
-63693,
-63710,
-63710,
-63737,
-63741,
-63741,
-63778,
-63778,
-63778,
-63784,
-63806,
-63833,
-63846,
-63879,
-63887,
-63887,
-63887,
-63887,
-63916,
-63926,
-63933,
-63952,
-63956,
-63990,
-64002,
-64017,
-64028,
-64028,
-64045,
-64097,
-64130,
-64130,
-64140,
-64148,
-64154,
-64168,
-64196,
-64218,
-64225,
-64225,
-64231,
-64256,
-64277,
-64294,
-64308,
-64313,
-64320,
-64320,
-64325,
-64325,
-64345,
-64345,
-64345,
-64345,
-64345,
-64386,
-64386,
-64393,
-64399,
-64405,
-64420,
-64427,
-64435,
-64435,
-64435,
-64445,
-64445,
-64445,
-64472,
-64472,
-64513,
-64528,
-64528,
-64539,
-64562,
-64562,
-64568,
-64568,
-64568,
-64586,
-64624,
-64650,
-64650,
-64662,
-64662,
-64668,
-64677,
-64677,
-64677,
-64677,
-64677,
-64677,
-64677,
-64698,
-64715,
-64746,
-64760,
-64774,
-64794,
-64794,
-64819,
-64836,
-64836,
-64862,
-64874,
-64880,
-64899,
-64916,
-64916,
-64916,
-64948,
-64965,
-64965,
-64990,
-65011,
-65060,
-65067,
-65081,
-65081,
-65081,
-65097,
-65097,
-65113,
-65133,
-65152,
-65152,
-65179,
-65196,
-65234,
-65253,
-65272,
-65272,
-65279,
-65279,
-65318,
-65318,
-65364,
-65364,
-65424,
-65493,
-65493,
-65499,
-65499,
-65499,
-65518,
-65525,
-65525,
-65534,
-65534,
-65534,
-65534,
-65541,
-65566,
-65595,
-65595,
-65595,
-65613,
-65681,
-65690,
-65690,
-65711,
-65728,
-65747,
-65762,
-65785,
-65785,
-65809,
-65809,
-65820,
-65826,
-65835,
-65861,
-65883,
-65912,
-65918,
-65918,
-65936,
-65936,
-65936,
-65936,
-65941,
-65941,
-65951,
-65967,
-65973,
-65979,
-65979,
-66008,
-66008,
-66008,
-66013,
-66013,
-66030,
-66030,
-66045,
-66045,
-66045,
-66052,
-66052,
-66052,
-66052,
-66094,
-66098,
-66105,
-66105,
-66143,
-66143,
-66191,
-66196,
-66196,
-66226,
-66226,
-66253,
-66268,
-66268,
-66305,
-66305,
-66305,
-66317,
-66324,
-66324,
-66324,
-66330,
-66330,
-66346,
-66346,
-66346,
-66369,
-66408,
-66408,
-66408,
-66426,
-66426,
-66426,
-66435,
-66443,
-66443,
-66443,
-66443,
-66443,
-66443,
-66443,
-66443,
-66450,
-66450,
-66450,
-66466,
-66471,
-66492,
-66507,
-66507,
-66530,
-66543,
-66564,
-66576,
-66576,
-66576,
-66591,
-66628,
-66628,
-66628,
-66628,
-66628,
-66667,
-66691,
-66691,
-66698,
-66748,
-66760,
-66777,
-66777,
-66795,
-66817,
-66817,
-66836,
-66854,
-66854,
-66854,
-66866,
-66888,
-66904,
-66914,
-66924,
-66924,
-66924,
-66953,
-66968,
-66999,
-66999,
-67011,
-67011,
-67011,
-67031,
-67031,
-67031,
-67042,
-67092,
-67107,
-67126,
-67132,
-67143,
-67151,
-67160,
-67160,
-67166,
-67180,
-67180,
-67180,
-67180,
-67180,
-67195,
-67195,
-67195,
-67195,
-67195,
-67206,
-67211,
-67217,
-67217,
-67234,
-67234,
-67276,
-67276,
-67276,
-67287,
-67287,
-67287,
-67297,
-67310,
-67343,
-67360,
-67370,
-67370,
-67386,
-67427,
-67460,
-67480,
-67480,
-67480,
-67511,
-67529,
-67529,
-67546,
-67579,
-67617,
-67617,
-67634,
-67634,
-67658,
-67658,
-67665,
-67679,
-67679,
-67696,
-67732,
-67748,
-67748,
-67748,
-67758,
-67758,
-67758,
-67758,
-67758,
-67758,
-67765,
-67780,
-67791,
-67791,
-67791,
-67791,
-67812,
-67822,
-67822,
-67844,
-67844,
-67844,
-67858,
-67884,
-67884,
-67884,
-67897,
-67897,
-67905,
-67905,
-67939,
-67950,
-67950,
-67950,
-67950,
-67965,
-67977,
-67977,
-67977,
-67977,
-68005,
-68025,
-68025,
-68025,
-68036,
-68036,
-68046,
-68060,
-68106,
-68124,
-68140,
-68162,
-68162,
-68162,
-68162,
-68174,
-68212,
-68212,
-68212,
-68212,
-68239,
-68239,
-68265,
-68265,
-68272,
-68290,
-68290,
-68323,
-68323,
-68332,
-68332,
-68332,
-68332,
-68342,
-68359,
-68359,
-68359,
-68387,
-68387,
-68387,
-68387,
-68387,
-68402,
-68402,
-68402,
-68417,
-68440,
-68445,
-68454,
-68454,
-68461,
-68461,
-68482,
-68482,
-68482,
-68512,
-68553,
-68563,
-68563,
-68563,
-68563,
-68563,
-68563,
-68583,
-68583,
-68618,
-68627,
-68627,
-68645,
-68645,
-68645,
-68660,
-68666,
-68676,
-68676,
-68697,
-68697,
-68697,
-68702,
-68715,
-68752,
-68767,
-68787,
-68787,
-68808,
-68808,
-68808,
-68827,
-68857,
-68857,
-68871,
-68895,
-68895,
-68910,
-68924,
-68955,
-68968,
-68989,
-68989,
-68989,
-69014,
-69014,
-69035,
-69035,
-69035,
-69062,
-69062,
-69069,
-69077,
-69077,
-69092,
-69107,
-69127,
-69127,
-69127,
-69145,
-69157,
-69157,
-69164,
-69164,
-69171,
-69171,
-69178,
-69178,
-69256,
-69270,
-69270,
-69322,
-69322,
-69336,
-69344,
-69344,
-69375,
-69394,
-69452,
-69452,
-69452,
-69452,
-69465,
-69488,
-69508,
-69508,
-69514,
-69514,
-69524,
-69552,
-69552,
-69552,
-69552,
-69569,
-69575,
-69595,
-69595,
-69602,
-69643,
-69661,
-69667,
-69681,
-69681,
-69692,
-69699,
-69699,
-69721,
-69721,
-69721,
-69740,
-69740,
-69760,
-69766,
-69774,
-69774,
-69783,
-69815,
-69838,
-69848,
-69848,
-69848,
-69848,
-69848,
-69861,
-69871,
-69871,
-69881,
-69924,
-69940,
-69947,
-69947,
-69977,
-69989,
-69989,
-70005,
-70005,
-70016,
-70016,
-70058,
-70058,
-70068,
-70098,
-70098,
-70110,
-70126,
-70137,
-70146,
-70165,
-70177,
-70177,
-70177,
-70177,
-70183,
-70183,
-70183,
-70196,
-70223,
-70223,
-70239,
-70258,
-70258,
-70258,
-70296,
-70296,
-70306,
-70314,
-70330,
-70345,
-70369,
-70369,
-70369,
-70369,
-70369,
-70413,
-70430,
-70430,
-70463,
-70463,
-70479,
-70479,
-70479,
-70486,
-70520,
-70546,
-70559,
-70559,
-70570,
-70619,
-70685,
-70723,
-70742,
-70742,
-70756,
-70784,
-70784,
-70784,
-70791,
-70809,
-70816,
-70823,
-70830,
-70837,
-70837,
-70856,
-70863,
-70870,
-70877,
-70877,
-70877,
-70884,
-70903,
-70915,
-70925,
-70925,
-70925,
-70954,
-70968,
-70975,
-70975,
-70975,
-70982,
-70989,
-71010,
-71027,
-71036,
-71036,
-71065,
-71065,
-71079,
-71104,
-71111,
-71119,
-71162,
-71181,
-71181,
-71196,
-71238,
-71269,
-71276,
-71281,
-71281,
-71298,
-71311,
-71311,
-71352,
-71352,
-71359,
-71359,
-71372,
-71395,
-71395,
-71395,
-71404,
-71428,
-71428,
-71428,
-71449,
-71449,
-71471,
-71478,
-71478,
-71478,
-71478,
-71487,
-71487,
-71494,
-71494,
-71525,
-71532,
-71532,
-71544,
-71544,
-71544,
-71567,
-71584,
-71584,
-71591,
-71591,
-71618,
-71631,
-71638,
-71648,
-71648,
-71655,
-71677,
-71684,
-71699,
-71706,
-71706,
-71713,
-71713,
-71740,
-71763,
-71768,
-71784,
-71812,
-71830,
-71864,
-71882,
-71882,
-71882,
-71910,
-71928,
-71939,
-71977,
-71984,
-71984,
-71999,
-71999,
-71999,
-72023,
-72023,
-72023,
-72037,
-72037,
-72037,
-72081,
-72112,
-72158,
-72177,
-72229,
-72229,
-72253,
-72263,
-72263,
-72278,
-72283,
-72283,
-72283,
-72283,
-72294,
-72294,
-72315,
-72330,
-72350,
-72350,
-72375,
-72388,
-72388,
-72388,
-72408,
-72434,
-72462,
-72482,
-72524,
-72530,
-72530,
-72585,
-72600,
-72636,
-72672,
-72679,
-72686,
-72717,
-72749,
-72749,
-72749,
-72749,
-72756,
-72762,
-72798,
-72824,
-72843,
-72867,
-72867,
-72885,
-72897,
-72897,
-72903,
-72916,
-72938,
-72983,
-72983,
-73006,
-73020,
-73036,
-73065,
-73084,
-73103,
-73110,
-73110,
-73146,
-73153,
-73153,
-73160,
-73160,
-73177,
-73184,
-73191,
-73205,
-73248,
-73290,
-73304,
-73355,
-73355,
-73355,
-73355,
-73361,
-73361,
-73367,
-73367,
-73374,
-73390,
-73408,
-73408,
-73420,
-73431,
-73438,
-73448,
-73448,
-73455,
-73455,
-73482,
-73482,
-73493,
-73516,
-73554,
-73591,
-73600,
-73600,
-73607,
-73632,
-73646,
-73674,
-73680,
-73690,
-73697,
-73704,
-73727,
-73744,
-73761,
-73767,
-73774,
-73801,
-73819,
-73826,
-73826,
-73826,
-73833,
-73840,
-73859,
-73888,
-73912,
-73919,
-73930,
-73937,
-73959,
-73959,
-73966,
-73990,
-74000,
-74000,
-74012,
-74019,
-74045,
-74045,
-74070,
-74077,
-74077,
-74094,
-74119,
-74139,
-74153,
-74169,
-74176,
-74229,
-74263,
-74277,
-74314,
-74314,
-74344,
-74358,
-74365,
-74411,
-74441,
-74455,
-74461,
-74475,
-74489,
-74489,
-74489,
-74489,
-74503,
-74524,
-74543,
-74550,
-74568,
-74580,
-74596,
-74610,
-74621,
-74628,
-74657,
-74684,
-74709,
-74709,
-74716,
-74744,
-74744,
-74783,
-74845,
-74850,
-74887,
-74904,
-74904,
-74918,
-74933,
-74961,
-74961,
-74995,
-75002,
-75002,
-75023,
-75023,
-75030,
-75072,
-75079,
-75079,
-75110,
-75117,
-75138,
-75170,
-75179,
-75193,
-75213,
-75220,
-75227,
-75238,
-75246,
-75253,
-75278,
-75285,
-75292,
-75292,
-75311,
-75311,
-75341,
-75358,
-75358,
-75392,
-75421,
-75438,
-75450,
-75456,
-75474,
-75480,
-75501,
-75514,
-75521,
-75521,
-75546,
-75574,
-75600,
-75623,
-75623,
-75642,
-75655,
-75662,
-75694,
-75701,
-75724,
-75724,
-75740,
-75769,
-75801,
-75808,
-75826,
-75826,
-75841,
-75865,
-75879,
-75879,
-75879,
-75910,
-75919,
-75938,
-75945,
-75952,
-76008,
-76018,
-76057,
-76064,
-76071,
-76078,
-76078,
-76100,
-76100,
-76100,
-76133,
-76177,
-76177,
-76187,
-76222,
-76222,
-76222,
-76246,
-76286,
-76309,
-76318,
-76346,
-76346,
-76346,
-76354,
-76371,
-76371,
-76412,
-76421,
-76436,
-76446,
-76453,
-76475,
-76506,
-76513,
-76520,
-76543,
-76570,
-76577,
-76615,
-76615,
-76639,
-76672,
-76706,
-76713,
-76720,
-76736,
-76736,
-76736,
-76768,
-76775,
-76788,
-76805,
-76827,
-76843,
-76850,
-76857,
-76880,
-76895,
-76902,
-76929,
-76969,
-76976,
-76982,
-77036,
-77043,
-77043,
-77050,
-77050,
-77057,
-77071,
-77087,
-77100,
-77114,
-77128,
-77142,
-77159,
-77192,
-77206,
-77213,
-77226,
-77226,
-77292,
-77292,
-77310,
-77310,
-77326,
-77346,
-77375,
-77402,
-77402,
-77425,
-77456,
-77467,
-77467,
-77474,
-77484,
-77484,
-77491,
-77505,
-77505,
-77520,
-77520,
-77541,
-77555,
-77569,
-77576,
-77576,
-77589,
-77603,
-77610,
-77649,
-77681,
-77681,
-77688,
-77724,
-77751,
-77758,
-77792,
-77792,
-77792,
-77798,
-77813,
-77820,
-77853,
-77860,
-77860,
-77897,
-77945,
-77954,
-77954,
-77980,
-77993,
-78011,
-78011,
-78011,
-78027,
-78054,
-78085,
-78085,
-78105,
-78112,
-78119,
-78152,
-78173,
-78188,
-78188,
-78195,
-78223,
-78242,
-78249,
-78300,
-78300,
-78332,
-78339,
-78339,
-78354,
-78354,
-78394,
-78394,
-78418,
-78425,
-78448,
-78455,
-78489,
-78507,
-78532,
-78532,
-78549,
-78563,
-78585,
-78592,
-78606,
-78613,
-78613,
-78620,
-78648,
-78692,
-78714,
-78758,
-78805,
-78825,
-78839,
-78885,
-78934,
-78979,
-78984,
-79016,
-79016,
-79030,
-79050,
-79057,
-79070,
-79070,
-79070,
-79070,
-79070,
-79077,
-79095,
-79102,
-79102,
-79110,
-79148,
-79176,
-79183,
-79195,
-79195,
-79195,
-79202,
-79202,
-79254,
-79268,
-79268,
-79276,
-79300,
-79315,
-79332,
-79332,
-79340,
-79359,
-79378,
-79390,
-79404,
-79429,
-79441,
-79453,
-79462,
-79462,
-79485,
-79492,
-79492,
-79492,
-79492,
-79492,
-79512,
-79530,
-79542,
-79552,
-79552,
-79560,
-79588,
-79595,
-79623,
-79652,
-79661,
-79661,
-79696,
-79721,
-79721,
-79731,
-79731,
-79738,
-79749,
-79749,
-79778,
-79796,
-79796,
-79804,
-79804,
-79811,
-79811,
-79811,
-79846,
-79857,
-79865,
-79890,
-79890,
-79890,
-79897,
-79916,
-79916,
-79923,
-79948,
-79987,
-79987,
-79987,
-79987,
-80003,
-80047,
-80060,
-80068,
-80098,
-80098,
-80098,
-80098,
-80098,
-80127,
-80136,
-80136,
-80136,
-80157,
-80177,
-80177,
-80212,
-80237,
-80237,
-80247,
-80265,
-80278,
-80278,
-80278,
-80290,
-80308,
-80341,
-80348,
-80356,
-80356,
-80356,
-80387,
-80387,
-80403,
-80418,
-80447,
-80447,
-80453,
-80453,
-80453,
-80479,
-80479,
-80495,
-80495,
-80495,
-80495,
-80495,
-80507,
-80507,
-80507,
-80507,
-80507,
-80507,
-80513,
-80542,
-80573,
-80573,
-80579,
-80579,
-80579,
-80610,
-80620,
-80620,
-80620,
-80636,
-80636,
-80636,
-80663,
-80672,
-80672,
-80672,
-80689,
-80734,
-80734,
-80734,
-80743,
-80771,
-80780,
-80780,
-80789,
-80789,
-80820,
-80828,
-80870,
-80897,
-80908,
-80934,
-80947,
-80947,
-80959,
-80996,
-81025,
-81025,
-81025,
-81037,
-81037,
-81037,
-81037,
-81037,
-81037,
-81044,
-81057,
-81057,
-81091,
-81099,
-81109,
-81126,
-81142,
-81142,
-81157,
-81157,
-81189,
-81189,
-81217,
-81248,
-81248,
-81255,
-81279,
-81289,
-81289,
-81316,
-81316,
-81316,
-81334,
-81334,
-81345,
-81350,
-81378,
-81391,
-81415,
-81426,
-81446,
-81446,
-81488,
-81523,
-81523,
-81533,
-81533,
-81551,
-81580,
-81593,
-81605,
-81605,
-81605,
-81605,
-81612,
-81631,
-81661,
-81681,
-81697,
-81733,
-81733,
-81733,
-81745,
-81770,
-81770,
-81781,
-81781,
-81781,
-81794,
-81805,
-81805,
-81805,
-81837,
-81837,
-81848,
-81866,
-81866,
-81866,
-81866,
-81872,
-81872,
-81880,
-81891,
-81891,
-81912,
-81912,
-81937,
-81937,
-81943,
-81959,
-81971,
-82016,
-82029,
-82071,
-82071,
-82071,
-82071,
-82071,
-82082,
-82082,
-82094,
-82101,
-82101,
-82108,
-82121,
-82141,
-82154,
-82154,
-82154,
-82154,
-82166,
-82166,
-82173,
-82204,
-82230,
-82249,
-82298,
-82320,
-82348,
-82348,
-82348,
-82373,
-82389,
-82389,
-82405,
-82405,
-82412,
-82426,
-82433,
-82433,
-82440,
-82463,
-82492,
-82499,
-82499,
-82525,
-82542,
-82560,
-82576,
-82600,
-82613,
-82613,
-82628,
-82642,
-82664,
-82713,
-82747,
-82747,
-82754,
-82763,
-82787,
-82808,
-82808,
-82828,
-82835,
-82842,
-82863,
-82880,
-82880,
-82880,
-82891,
-82891,
-82918,
-82923,
-82958,
-82965,
-82972,
-82972,
-82972,
-82972,
-82979,
-82989,
-83011,
-83021,
-83021,
-83021,
-83028,
-83028,
-83035,
-83059,
-83066,
-83066,
-83066,
-83082,
-83082,
-83082,
-83100,
-83100,
-83100,
-83126,
-83126,
-83126,
-83126,
-83157,
-83157,
-83157,
-83157,
-83168,
-83186,
-83210,
-83210,
-83210,
-83229,
-83235,
-83243,
-83279,
-83307,
-83316,
-83325,
-83353,
-83374,
-83374,
-83384,
-83405,
-83419,
-83425,
-83455,
-83471,
-83483,
-83490,
-83510,
-83515,
-83515,
-83549,
-83555,
-83555,
-83595,
-83595,
-83595,
-83595,
-83602,
-83668,
-83696,
-83696,
-83696,
-83696,
-83696,
-83702,
-83718,
-83734,
-83734,
-83771,
-83810,
-83818,
-83836,
-83836,
-83836,
-83867,
-83867,
-83874,
-83874,
-83900,
-83923,
-83923,
-83958,
-83982,
-84022,
-84029,
-84044,
-84044,
-84051,
-84051,
-84067,
-84084,
-84134,
-84149,
-84192,
-84198,
-84205,
-84211,
-84241,
-84259,
-84270,
-84288,
-84310,
-84339,
-84346,
-84353,
-84400,
-84400,
-84400,
-84400,
-84421,
-84428,
-84444,
-84487,
-84507,
-84539,
-84575,
-84575,
-84587,
-84587,
-84602,
-84614,
-84621,
-84628,
-84642,
-84653,
-84653,
-84663,
-84690,
-84699,
-84706,
-84731,
-84738,
-84767,
-84774,
-84781,
-84799,
-84816,
-84823,
-84836,
-84843,
-84850,
-84872,
-84879,
-84886,
-84886,
-84886,
-84893,
-84900,
-84921,
-84946,
-84953,
-84967,
-84974,
-84981,
-84988,
-85004,
-85004,
-85004,
-85022,
-85050,
-85050,
-85050,
-85057,
-85071,
-85071,
-85115,
-85135,
-85135,
-85154,
-85174,
-85190,
-85217,
-85243,
-85250,
-85250,
-85276,
-85284,
-85295,
-85313,
-85313,
-85330,
-85330,
-85330,
-85330,
-85337,
-85344,
-85354,
-85374,
-85381,
-85393,
-85400,
-85414,
-85429,
-85452,
-85459,
-85496,
-85520,
-85520,
-85534,
-85534,
-85540,
-85547,
-85547,
-85547,
-85594,
-85594,
-85611,
-85611,
-85633,
-85679,
-85716,
-85732,
-85732,
-85767,
-85782,
-85791,
-85804,
-85818,
-85828,
-85828,
-85828,
-85855,
-85855,
-85855,
-85878,
-85902,
-85909,
-85923,
-85930,
-85973,
-85996,
-86028,
-86070,
-86117,
-86117,
-86137,
-86144,
-86144,
-86152,
-86159,
-86181,
-86195,
-86195,
-86202,
-86220,
-86239,
-86239,
-86239,
-86246,
-86265,
-86272,
-86272,
-86296,
-86303,
-86317,
-86340,
-86340,
-86356,
-86368,
-86386,
-86419,
-86419,
-86448,
-86475,
-86482,
-86482,
-86497,
-86520,
-86520,
-86520,
-86530,
-86530,
-86544,
-86576,
-86576,
-86583,
-86583,
-86637,
-86651,
-86668,
-86668,
-86668,
-86679,
-86679,
-86679,
-86701,
-86735,
-86772,
-86772,
-86779,
-86779,
-86798,
-86841,
-86848,
-86848,
-86848,
-86882,
-86903,
-86903,
-86912,
-86924,
-86924,
-86924,
-86950,
-86957,
-86973,
-86982,
-86989,
-86989,
-87009,
-87036,
-87036,
-87036,
-87045,
-87058,
-87094,
-87094,
-87094,
-87120,
-87120,
-87168,
-87174,
-87174,
-87195,
-87211,
-87239,
-87239,
-87239,
-87239,
-87282,
-87282,
-87307,
-87307,
-87307,
-87307,
-87312,
-87338,
-87345,
-87354,
-87382,
-87390,
-87422,
-87440,
-87447,
-87457,
-87472,
-87472,
-87489,
-87489,
-87512,
-87556,
-87556,
-87575,
-87599,
-87599,
-87610,
-87610,
-87610,
-87631,
-87668,
-87680,
-87680,
-87680,
-87693,
-87719,
-87736,
-87787,
-87818,
-87825,
-87831,
-87831,
-87831,
-87831,
-87843,
-87880,
-87892,
-87909,
-87909,
-87909,
-87929,
-87951,
-87951,
-87973,
-87973,
-87997,
-88019,
-88031,
-88031,
-88040,
-88040,
-88060,
-88067,
-88074,
-88081,
-88111,
-88137,
-88144,
-88144,
-88156,
-88163,
-88163,
-88192,
-88192,
-88192,
-88192,
-88192,
-88192,
-88192,
-88192,
-88211,
-88218,
-88218,
-88245,
-88245,
-88271,
-88286,
-88293,
-88306,
-88336,
-88336,
-88336,
-88336,
-88348,
-88370,
-88370,
-88370,
-88394,
-88394,
-88394,
-88409,
-88409,
-88434,
-88448,
-88462,
-88484,
-88512,
-88525,
-88551,
-88584,
-88592,
-88599,
-88611,
-88667,
-88667,
-88684,
-88696,
-88696,
-88728,
-88728,
-88728,
-88744,
-88744,
-88771,
-88792,
-88814,
-88814,
-88814,
-88832,
-88832,
-88832,
-88842,
-88849,
-88849,
-88854,
-88868,
-88876,
-88916,
-88916,
-88941,
-88941,
-88976,
-88976,
-88985,
-88993,
-89008,
-89008,
-89008,
-89027,
-89027,
-89027,
-89040,
-89064,
-89064,
-89064,
-89064,
-89105,
-89113,
-89120,
-89142,
-89142,
-89142,
-89150,
-89197,
-89197,
-89197,
-89204,
-89210,
-89210,
-89230,
-89248,
-89275,
-89303,
-89303,
-89310,
-89310,
-89321,
-89321,
-89339,
-89374,
-89374,
-89374,
-89391,
-89417,
-89442,
-89442,
-89451,
-89461,
-89461,
-89461,
-89471,
-89471,
-89525,
-89525,
-89541,
-89541,
-89561,
-89592,
-89602,
-89614,
-89636,
-89636,
-89650,
-89684,
-89684,
-89707,
-89733,
-89733,
-89733,
-89746,
-89746,
-89746,
-89746,
-89746,
-89785,
-89785,
-89785,
-89802,
-89802,
-89802,
-89812,
-89819,
-89819,
-89826,
-89826,
-89826,
-89826,
-89826,
-89826,
-89826,
-89844,
-89851,
-89866,
-89876,
-89917,
-89929,
-89948,
-89973,
-89987,
-90013,
-90013,
-90020,
-90020,
-90051,
-90060,
-90070,
-90070,
-90077,
-90088,
-90096,
-90096,
-90096,
-90096,
-90116,
-90142,
-90156,
-90168,
-90175,
-90186,
-90192,
-90212,
-90238,
-90265,
-90277,
-90301,
-90301,
-90301,
-90306,
-90306,
-90384,
-90384,
-90398,
-90418,
-90438,
-90467,
-90474,
-90486,
-90504,
-90513,
-90513,
-90513,
-90529,
-90538,
-90546,
-90557,
-90564,
-90585,
-90592,
-90604,
-90622,
-90627,
-90642,
-90642,
-90652,
-90659,
-90659,
-90666,
-90666,
-90666,
-90686,
-90706,
-90743,
-90743,
-90750,
-90750,
-90750,
-90770,
-90786,
-90830,
-90849,
-90856,
-90856,
-90856,
-90881,
-90896,
-90910,
-90956,
-90969,
-90991,
-90999,
-91007,
-91021,
-91036,
-91036,
-91054,
-91059,
-91101,
-91120,
-91159,
-91177,
-91217,
-91236,
-91268,
-91285,
-91293,
-91300,
-91300,
-91300,
-91300,
-91310,
-91348,
-91379,
-91386,
-91386,
-91408,
-91415,
-91438,
-91455,
-91455,
-91474,
-91474,
-91485,
-91485,
-91492,
-91513,
-91546,
-91546,
-91553,
-91553,
-91553,
-91566,
-91566,
-91566,
-91581,
-91596,
-91596,
-91615,
-91615,
-91629,
-91629,
-91637,
-91637,
-91644,
-91658,
-91673,
-91688,
-91705,
-91705,
-91723,
-91741,
-91759,
-91759,
-91759,
-91759,
-91771,
-91825,
-91825,
-91842,
-91860,
-91870,
-91870,
-91870,
-91888,
-91888,
-91914,
-91940,
-91955,
-91962,
-91962,
-91994,
-92009,
-92036,
-92036,
-92043,
-92054,
-92054,
-92086,
-92086,
-92086,
-92095,
-92125,
-92125,
-92138,
-92138,
-92147,
-92173,
-92234,
-92249,
-92256,
-92277,
-92293,
-92322,
-92322,
-92322,
-92322,
-92322,
-92322,
-92328,
-92339,
-92348,
-92348,
-92348,
-92357,
-92400,
-92400,
-92400,
-92415,
-92425,
-92432,
-92432,
-92432,
-92432,
-92438,
-92462,
-92492,
-92499,
-92499,
-92499,
-92499,
-92520,
-92534,
-92560,
-92560,
-92587,
-92587,
-92596,
-92613,
-92642,
-92676,
-92699,
-92699,
-92699,
-92712,
-92712,
-92712,
-92732,
-92732,
-92754,
-92769,
-92795,
-92845,
-92857,
-92857,
-92879,
-92879,
-92879,
-92898,
-92931,
-92943,
-92952,
-92952,
-92952,
-92961,
-92961,
-92969,
-92969,
-92969,
-92969,
-93001,
-93001,
-93001,
-93001,
-93017,
-93017,
-93033,
-93054,
-93054,
-93061,
-93061,
-93061,
-93070,
-93070,
-93070,
-93099,
-93099,
-93112,
-93112,
-93121,
-93153,
-93153,
-93153,
-93187,
-93208,
-93214,
-93220,
-93231,
-93231,
-93231,
-93231,
-93231,
-93256,
-93256,
-93256,
-93262,
-93262,
-93270,
-93270,
-93270,
-93270,
-93270,
-93277,
-93326,
-93344,
-93362,
-93362,
-93362,
-93362,
-93376,
-93408,
-93408,
-93415,
-93415,
-93415,
-93427,
-93427,
-93427,
-93433,
-93445,
-93464,
-93503,
-93513,
-93525,
-93525,
-93547,
-93564,
-93595,
-93595,
-93623,
-93653,
-93662,
-93662,
-93678,
-93678,
-93678,
-93742,
-93763,
-93770,
-93777,
-93790,
-93796,
-93814,
-93823,
-93830,
-93843,
-93856,
-93864,
-93908,
-93935,
-93935,
-93935,
-93944,
-93952,
-93952,
-93997,
-94035,
-94054,
-94054,
-94065,
-94065,
-94079,
-94125,
-94138,
-94155,
-94170,
-94182,
-94208,
-94243,
-94253,
-94271,
-94283,
-94295,
-94312,
-94326,
-94326,
-94364,
-94382,
-94382,
-94410,
-94432,
-94432,
-94453,
-94453,
-94479,
-94487,
-94514,
-94529,
-94529,
-94540,
-94540,
-94547,
-94601,
-94601,
-94631,
-94669,
-94669,
-94680,
-94680,
-94706,
-94742,
-94782,
-94782,
-94792,
-94802,
-94824,
-94824,
-94834,
-94834,
-94851,
-94871,
-94878,
-94878,
-94906,
-94906,
-94913,
-94957,
-94980,
-94989,
-94995,
-95008,
-95024,
-95068,
-95089,
-95089,
-95099,
-95099,
-95140,
-95146,
-95146,
-95146,
-95173,
-95185,
-95185,
-95185,
-95185,
-95185,
-95208,
-95208,
-95208,
-95208,
-95214,
-95214,
-95214,
-95248,
-95254,
-95261,
-95288,
-95288,
-95300,
-95326,
-95326,
-95344,
-95360,
-95360,
-95360,
-95360,
-95360,
-95360,
-95369,
-95369,
-95381,
-95393,
-95414,
-95414,
-95414,
-95414,
-95420,
-95427,
-95474,
-95474,
-95474,
-95516,
-95516,
-95516,
-95562,
-95569,
-95611,
-95611,
-95611,
-95652,
-95664,
-95664,
-95671,
-95671,
-95716,
-95716,
-95741,
-95741,
-95741,
-95757,
-95781,
-95781,
-95781,
-95781,
-95792,
-95810,
-95836,
-95836,
-95836,
-95841,
-95860,
-95860,
-95871,
-95871,
-95871,
-95923,
-95923,
-95938,
-95956,
-95968,
-95990,
-96000,
-96007,
-96017,
-96017,
-96017,
-96029,
-96047,
-96064,
-96064,
-96078,
-96078,
-96078,
-96085,
-96085,
-96097,
-96097,
-96106,
-96106,
-96128,
-96152,
-96152,
-96152,
-96152,
-96201,
-96217,
-96237,
-96237,
-96237,
-96247,
-96255,
-96287,
-96293,
-96301,
-96325,
-96331,
-96331,
-96349,
-96359,
-96375,
-96406,
-96406,
-96412,
-96440,
-96451,
-96451,
-96463,
-96463,
-96488,
-96507,
-96519,
-96519,
-96531,
-96537,
-96558,
-96570,
-96585,
-96604,
-96622,
-96638,
-96638,
-96638,
-96668,
-96668,
-96668,
-96668,
-96668,
-96702,
-96702,
-96725,
-96735,
-96735,
-96735,
-96747,
-96758,
-96777,
-96777,
-96777,
-96777,
-96795,
-96795,
-96804,
-96816,
-96844,
-96844,
-96844,
-96892,
-96904,
-96916,
-96916,
-96935,
-96935,
-96972,
-96972,
-96972,
-96972,
-96989,
-97005,
-97013,
-97013,
-97013,
-97013,
-97013,
-97043,
-97061,
-97061,
-97071,
-97108,
-97124,
-97124,
-97178,
-97178,
-97178,
-97178,
-97178,
-97183,
-97215,
-97235,
-97242,
-97242,
-97273,
-97273,
-97325,
-97325,
-97325,
-97325,
-97366,
-97366,
-97366,
-97377,
-97377,
-97383,
-97390,
-97422,
-97422,
-97434,
-97459,
-97490,
-97490,
-97530,
-97530,
-97530,
-97530,
-97530,
-97541,
-97541,
-97541,
-97541,
-97541,
-97558,
-97571,
-97571,
-97597,
-97608,
-97622,
-97639,
-97639,
-97639,
-97646,
-97646,
-97646,
-97646,
-97668,
-97668,
-97685,
-97711,
-97744,
-97764,
-97764,
-97776,
-97788,
-97817,
-97817,
-97817,
-97817,
-97833,
-97846,
-97846,
-97866,
-97866,
-97866,
-97878,
-97878,
-97878,
-97901,
-97925,
-97931,
-97949,
-97949,
-97957,
-97965,
-97965,
-97965,
-97965,
-97965,
-97980,
-97991,
-98004,
-98023,
-98034,
-98034,
-98045,
-98045,
-98045,
-98056,
-98085,
-98085,
-98085,
-98106,
-98132,
-98141,
-98141,
-98166,
-98183,
-98183,
-98189,
-98189,
-98195,
-98252,
-98252,
-98252,
-98274,
-98278,
-98288,
-98288,
-98309,
-98330,
-98330,
-98336,
-98356,
-98356,
-98411,
-98427,
-98427,
-98448,
-98448,
-98448,
-98448,
-98464,
-98464,
-98495,
-98510,
-98510,
-98510,
-98510,
-98510,
-98510,
-98525,
-98553,
-98553,
-98580,
-98610,
-98610,
-98626,
-98626,
-98637,
-98637,
-98652,
-98662,
-98662,
-98662,
-98662,
-98662,
-98678,
-98691,
-98706,
-98716,
-98732,
-98732,
-98759,
-98774,
-98778,
-98792,
-98792,
-98801,
-98819,
-98819,
-98844,
-98866,
-98886,
-98886,
-98886,
-98886,
-98906,
-98915,
-98915,
-98915,
-98947,
-98947,
-98947,
-98947,
-98995,
-99001,
-99031,
-99031,
-99031,
-99035,
-99035,
-99035,
-99053,
-99053,
-99059,
-99059,
-99059,
-99059,
-99081,
-99097,
-99109,
-99109,
-99116,
-99116,
-99134,
-99134,
-99144,
-99144,
-99187,
-99193,
-99193,
-99193,
-99193,
-99193,
-99234,
-99268,
-99296,
-99313,
-99322,
-99353,
-99353,
-99359,
-99359,
-99359,
-99368,
-99379,
-99379,
-99379,
-99385,
-99385,
-99400,
-99400,
-99404,
-99404,
-99404,
-99422,
-99422,
-99422,
-99447,
-99469,
-99469,
-99469,
-99497,
-99522,
-99544,
-99544,
-99544,
-99544,
-99562,
-99583,
-99603,
-99603,
-99609,
-99609,
-99609,
-99619,
-99654,
-99673,
-99673,
-99683,
-99683,
-99720,
-99731,
-99747,
-99754,
-99795,
-99805,
-99817,
-99817,
-99841,
-99854,
-99872,
-99885,
-99885,
-99907,
-99939,
-99944,
-99961,
-99988,
-100011,
-100011,
-100011,
-100011,
-100011,
-100011,
-100011,
-100011,
-100011,
-100087,
-100103,
-100103,
-100125,
-100149,
-100157,
-100157,
-100169,
-100169,
-100169,
-100169,
-100184,
-100196,
-100196,
-100196,
-100196,
-100204,
-100204,
-100217,
-100246,
-100258,
-100284,
-100300,
-100315,
-100338,
-100355,
-100355,
-100361,
-100361,
-100361,
-100387,
-100387,
-100387,
-100387,
-100404,
-100422,
-100428,
-100428,
-100437,
-100443,
-100458,
-100491,
-100529,
-100542,
-100555,
-100559,
-100559,
-100559,
-100575,
-100593,
-100593,
-100593,
-100593,
-100593,
-100615,
-100615,
-100623,
-100641,
-100647,
-100666,
-100690,
-100690,
-100708,
-100724,
-100737,
-100741,
-100770,
-100789,
-100810,
-100810,
-100810,
-100827,
-100827,
-100885,
-100885,
-100885,
-100885,
-100908,
-100918,
-100939,
-100939,
-100939,
-100953,
-100957,
-100987,
-101008,
-101008,
-101008,
-101008,
-101008,
-101008,
-101034,
-101050,
-101050,
-101070,
-101070,
-101079,
-101079,
-101087,
-101087,
-101087,
-101095,
-101116,
-101129,
-101148,
-101148,
-101148,
-101148,
-101148,
-101148,
-101162,
-101215,
-101215,
-101215,
-101215,
-101236,
-101241,
-101267,
-101267,
-101272,
-101272,
-101272,
-101281,
-101296,
-101296,
-101296,
-101296,
-101296,
-101296,
-101296,
-101325,
-101330,
-101330,
-101378,
-101378,
-101392,
-101399,
-101406,
-101419,
-101419,
-101469,
-101469,
-101469,
-101494,
-101511,
-101528,
-101528,
-101535,
-101535,
-101539,
-101551,
-101551,
-101571,
-101571,
-101586,
-101608,
-101620,
-101630,
-101630,
-101630,
-101670,
-101670,
-101679,
-101696,
-101728,
-101741,
-101747,
-101758,
-101790,
-101790,
-101804,
-101804,
-101816,
-101816,
-101852,
-101862,
-101876,
-101876,
-101925,
-101939,
-101959,
-101978,
-101988,
-101988,
-101988,
-101988,
-102026,
-102054,
-102120,
-102155,
-102166,
-102184,
-102184,
-102198,
-102211,
-102221,
-102237,
-102248,
-102254,
-102254,
-102277,
-102277,
-102288,
-102297,
-102314,
-102324,
-102382,
-102382,
-102397,
-102404,
-102418,
-102418,
-102431,
-102431,
-102447,
-102455,
-102455,
-102468,
-102468,
-102502,
-102523,
-102532,
-102542,
-102562,
-102598,
-102598,
-102617,
-102617,
-102658,
-102658,
-102675,
-102694,
-102711,
-102750,
-102750,
-102760,
-102760,
-102774,
-102786,
-102833,
-102844,
-102866,
-102881,
-102913,
-102928,
-102952,
-102982,
-103002,
-103021,
-103048,
-103064,
-103083,
-103098,
-103098,
-103098,
-103132,
-103138,
-103152,
-103152,
-103152,
-103174,
-103185,
-103185,
-103197,
-103228,
-103228,
-103228,
-103262,
-103262,
-103296,
-103296,
-103296,
-103317,
-103330,
-103330,
-103343,
-103357,
-103357,
-103411,
-103418,
-103422,
-103436,
-103447,
-103478,
-103478,
-103513,
-103522,
-103557,
-103562,
-103594,
-103607,
-103635,
-103635,
-103635,
-103649,
-103658,
-103664,
-103678,
-103699,
-103699,
-103712,
-103726,
-103730,
-103730,
-103734,
-103756,
-103756,
-103763,
-103782,
-103786,
-103805,
-103818,
-103832,
-103836,
-103836,
-103848,
-103855,
-103855,
-103855,
-103878,
-103878,
-103878,
-103878,
-103903,
-103903,
-103918,
-103940,
-103945,
-103945,
-103962,
-103973,
-103973,
-103973,
-103987,
-104026,
-104026,
-104041,
-104075,
-104079,
-104089,
-104105,
-104109,
-104109,
-104109,
-104109,
-104127,
-104172,
-104188,
-104188,
-104203,
-104203,
-104225,
-104239,
-104254,
-104276,
-104301,
-104338,
-104349,
-104371,
-104390,
-104390,
-104407,
-104421,
-104434,
-104441,
-104441,
-104441,
-104441,
-104441,
-104441,
-104441,
-104448,
-104461,
-104493,
-104511,
-104519,
-104519,
-104527,
-104552,
-104562,
-104581,
-104598,
-104598,
-104598,
-104598,
-104615,
-104648,
-104675,
-104691,
-104701,
-104737,
-104737,
-104737,
-104737,
-104737,
-104737,
-104737,
-104737,
-104754,
-104775,
-104779,
-104792,
-104796,
-104801,
-104801,
-104816,
-104829,
-104829,
-104845,
-104865,
-104869,
-104869,
-104887,
-104887,
-104887,
-104887,
-104902,
-104967,
-104977,
-104977,
-104984,
-104995,
-105048,
-105048,
-105055,
-105055,
-105055,
-105055,
-105063,
-105063,
-105063,
-105100,
-105130,
-105178,
-105178,
-105206,
-105206,
-105228,
-105245,
-105245,
-105245,
-105245,
-105245,
-105245,
-105245,
-105245,
-105245,
-105245,
-105245,
-105257,
-105257,
-105257,
-105257,
-105306,
-105306,
-105328,
-105333,
-105333,
-105351,
-105370,
-105378,
-105378,
-105388,
-105410,
-105410,
-105415,
-105438,
-105438,
-105438,
-105438,
-105438,
-105446,
-105482,
-105486,
-105516,
-105516,
-105516,
-105526,
-105544,
-105544,
-105558,
-105558,
-105570,
-105603,
-105610,
-105610,
-105610,
-105624,
-105670,
-105670,
-105670,
-105680,
-105690,
-105698,
-105709,
-105709,
-105709,
-105729,
-105729,
-105737,
-105742,
-105764,
-105805,
-105836,
-105846,
-105846,
-105890,
-105890,
-105902,
-105920,
-105957,
-105968,
-105968,
-105968,
-105975,
-105975,
-105996,
-105996,
-105996,
-106001,
-106001,
-106019,
-106019,
-106043,
-106064,
-106107,
-106153,
-106190,
-106208,
-106208,
-106208,
-106220,
-106220,
-106220,
-106220,
-106220,
-106254,
-106254,
-106254,
-106264,
-106296,
-106304,
-106309,
-106328,
-106333,
-106348,
-106366,
-106384,
-106384,
-106408,
-106408,
-106424,
-106424,
-106424,
-106443,
-106459,
-106474,
-106474,
-106499,
-106522,
-106545,
-106558,
-106625,
-106630,
-106642,
-106665,
-106684,
-106697,
-106703,
-106703,
-106737,
-106743,
-106743,
-106766,
-106782,
-106782,
-106782,
-106782,
-106788,
-106816,
-106816,
-106834,
-106857,
-106863,
-106889,
-106906,
-106925,
-106925,
-106935,
-106961,
-106971,
-106971,
-107004,
-107004,
-107023,
-107023,
-107023,
-107029,
-107035,
-107041,
-107096,
-107119,
-107123,
-107144,
-107144,
-107165,
-107185,
-107185,
-107234,
-107259,
-107278,
-107294,
-107308,
-107319,
-107319,
-107319,
-107319,
-107333,
-107372,
-107385,
-107385,
-107385,
-107385,
-107405,
-107405,
-107405,
-107405,
-107405,
-107421,
-107427,
-107432,
-107432,
-107432,
-107441,
-107446,
-107446,
-107466,
-107466,
-107466,
-107466,
-107518,
-107528,
-107528,
-107528,
-107544,
-107561,
-107567,
-107567,
-107572,
-107582,
-107594,
-107635,
-107675,
-107675,
-107675,
-107697,
-107703,
-107703,
-107741,
-107751,
-107751,
-107768,
-107773,
-107796,
-107796,
-107828,
-107828,
-107828,
-107828,
-107848,
-107863,
-107873,
-107880,
-107880,
-107886,
-107922,
-107958,
-107981,
-107981,
-107981
-};
-
-static const quint16 tldChunkCount = 2;
-static const char * const tldData[tldChunkCount] = {
-"misasa.tottori.jp\0is-into-cartoons.com\0"
-"pistoia.it\0indian.museum\0"
-"traeumtgerade.de\0"
-"co.id\0"
-"arq.br\0co.hu\0salem.museum\0"
-"fukuchiyama.kyoto.jp\0"
-"laz.it\0ts.it\0\xd0\xb1\xd0\xb3\0"
-"tickets\0"
-"pn.it\0gorlice.pl\0"
-"co.il\0"
-"co.im\0communications.museum\0de.com\0"
-"magazine.aero\0co.in\0li.it\0"
-"aibetsu.hokkaido.jp\0"
-"lk3.ru\0"
-"co.ir\0uwu.ai\0"
-"trysil.no\0is-gone.com\0"
-"co.it\0notteroy.no\0lviv.ua\0dhl\0"
-"co.je\0endofinternet.net\0"
-"dupont\0kerryproperties\0"
-"unjarga.no\0"
-"asia\0"
-"co.jp\0vercel.dev\0"
-"fuel.aero\0ibara.okayama.jp\0"
-"ciencia.bo\0"
-"marche.it\0co.ke\0\xc3\xa5mot.no\0"
-"shimodate.ibaraki.jp\0"
-"jor.br\0"
-"celtic.museum\0contractors\0mycd.eu\0"
-"moscow\0"
-"tosa.kochi.jp\0"
-"aizumisato.fukushima.jp\0rocher\0"
-"diy\0"
-"takanezawa.tochigi.jp\0co.kr\0travel.tt\0"
-"co.lc\0"
-"gorizia.it\0"
-"shima.mie.jp\0"
-"village.museum\0"
-"ujitawara.kyoto.jp\0"
-"rj.gov.br\0"
-"*.moonscale.io\0"
-"reise\0"
-"yamakita.kanagawa.jp\0co.ma\0oster\xc3\xb8y.no\0\xe8\xb0\xb7\xe6\xad\x8c\0"
-"sampa.br\0"
-"co.ls\0"
-"express\0"
-"co.me\0"
-"mamurogawa.yamagata.jp\0"
-"co.mg\0"
-"engineer\0"
-"algard.no\0"
-"sasayama.hyogo.jp\0memset.net\0"
-"pi.leg.br\0"
-"meme\0"
-"co.na\0"
-"*.otap.co\0"
-"fjaler.no\0\xd9\x83\xd9\x88\xd9\x85\0"
-"co.mu\0"
-"kids.museum\0"
-"childrensgarden.museum\0co.mw\0"
-"okawa.fukuoka.jp\0mishima.shizuoka.jp\0historisch.museum\0"
-"df.gov.br\0co.ni\0"
-"co.mz\0locker\0"
-"co.nl\0"
-"akashi.hyogo.jp\0sorreisa.no\0"
-"kibichuo.okayama.jp\0co.no\0"
-"lutsk.ua\0"
-"toyota.aichi.jp\0"
-"ulsan.kr\0uppo.gov.pl\0\xd0\xb5\xd1\x8e\0"
-"co.nz\0"
-"writesthisblog.com\0"
-"co.om\0fastvps.site\0co.place\0"
-"tr.eu.org\0"
-"jewish.museum\0menu\0"
-"music.museum\0freemyip.com\0"
-"handson.museum\0degree\0"
-"is-a-caterer.com\0"
-"steiermark.museum\0valle.no\0"
-"android\0"
-"toscana.it\0nara.nara.jp\0for-some.biz\0"
-"dnp\0"
-"building.museum\0"
-"paderborn.museum\0berg.no\0"
-"fuchu.toyama.jp\0"
-"co.pl\0"
-"co.pn\0hepforge.org\0"
-"dog\0"
-"skierva.no\0"
-"\xec\x82\xbc\xec\x84\xb1\0"
-"shinto.gunma.jp\0"
-"nakagawa.tokushima.jp\0co.pw\0"
-"blogdns.com\0"
-"dot\0"
-"so.it\0cleaning\0"
-"himi.toyama.jp\0gs.fm.no\0"
-"monzaebrianza.it\0hobby-site.com\0"
-"co.business\0"
-"mydatto.net\0"
-"platter-app.dev\0"
-"lib.as.us\0earth\0"
-"\xe6\x8b\x9b\xe8\x81\x98\0futurehosting.at\0"
-"como.it\0walmart\0"
-"nishio.aichi.jp\0"
-"ueno.gunma.jp\0"
-"no.com\0co.ro\0"
-"kawara.fukuoka.jp\0arao.kumamoto.jp\0"
-"nf.ca\0"
-"co.rs\0"
-"aya.miyazaki.jp\0"
-"co.rw\0"
-"vic.gov.au\0spot\0"
-"eat\0"
-"anjo.aichi.jp\0mo-i-rana.no\0"
-"katsuyama.fukui.jp\0akabira.hokkaido.jp\0"
-"homebuilt.aero\0kinghost.net\0"
-"stor-elvdal.no\0"
-"horten.no\0"
-"diamonds\0is-an-engineer.com\0"
-"co.st\0loginline.io\0"
-"griw.gov.pl\0"
-"fukudomi.saga.jp\0mashiko.tochigi.jp\0nowaruda.pl\0"
-"ozu.kumamoto.jp\0"
-"encyclopedic.museum\0co.th\0"
-"co.sz\0co.tj\0"
-"reggiocalabria.it\0est-le-patron.com\0"
-"aizuwakamatsu.fukushima.jp\0"
-"friulive-giulia.it\0yamagata.ibaraki.jp\0co.tm\0"
-"environmentalconservation.museum\0"
-"dunlop\0"
-"yamanashi.yamanashi.jp\0burghof.museum\0co.ua\0"
-"muroran.hokkaido.jp\0blogspot.com.cy\0"
-"co.tt\0"
-"kadena.okinawa.jp\0barrel-of-knowledge.info\0"
-"softbank\0"
-"rodoy.no\0co.ug\0eco\0"
-"takasu.hokkaido.jp\0"
-"\xc3\xb8yer.no\0loginto.me\0"
-"co.tz\0"
-"yashio.saitama.jp\0kautokeino.no\0co.uk\0realtor\0"
-"ohira.tochigi.jp\0ky.us\0"
-"aktyubinsk.su\0blogspot.com.ee\0"
-"pe.leg.br\0"
-"b\xc3\xb8mlo.no\0blogspot.com.eg\0"
-"freemasonry.museum\0"
-"co.us\0s3-website.ca-central-1.amazonaws.com\0"
-"siracusa.it\0"
-"co.ve\0ftpaccess.cc\0"
-"kunneppu.hokkaido.jp\0sumida.tokyo.jp\0"
-"hachijo.tokyo.jp\0"
-"takahama.aichi.jp\0co.vi\0"
-"kochi.kochi.jp\0co.uz\0edgeapp.net\0"
-"budejju.no\0blogspot.com.ar\0"
-"toyoake.aichi.jp\0silk.museum\0"
-"edu\0yabu.hyogo.jp\0kashihara.nara.jp\0wloclawek.pl\0square7.de\0"
-"dtv\0misconfused.org\0blogspot.com.au\0"
-"ichikawa.chiba.jp\0setouchi.okayama.jp\0\xd0\xbf\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0photography\0"
-"pesaro-urbino.it\0cartoonart.museum\0missoula.museum\0cloudaccess.host\0"
-"fin.ci\0"
-"k12.sc.us\0"
-"basel.museum\0"
-"servehttp.com\0"
-"k12.oh.us\0"
-"l.se\0"
-"garden.museum\0dynathome.net\0blogspot.com.br\0"
-"maniwa.okayama.jp\0"
-"trentinosued-tirol.it\0"
-"uwu.nu\0"
-"imperia.it\0milano.it\0onojo.fukuoka.jp\0"
-"muko.kyoto.jp\0tr\xc3\xa6na.no\0"
-"mimata.miyazaki.jp\0exposed\0blogspot.com.by\0"
-"belluno.it\0"
-"sicily.it\0"
-"amazon\0"
-"hs.zone\0"
-"blogspot.com.co\0"
-"bomlo.no\0dvr\0"
-"casino.hu\0nishinoshima.shimane.jp\0omaha.museum\0in-dsl.org\0"
-"fin.ec\0is-a-hard-worker.com\0"
-"ap-southeast-1.elasticbeanstalk.com\0dscloud.me\0"
-"country\0eu.com\0"
-"luxe\0ddnss.org\0"
-"corvette.museum\0"
-"miyake.nara.jp\0"
-"dontexist.org\0"
-"kahoku.ishikawa.jp\0linkyard-cloud.ch\0"
-"\xe5\xb1\xb1\xe5\x8f\xa3.jp\0*.sendai.jp\0agakhan\0dyndns-wiki.com\0"
-"microsoft\0"
-"\xd1\x80\xd1\x84\0"
-"filegear-gb.me\0"
-"\xe1\x83\x92\xe1\x83\x94\0is-a-conservative.com\0"
-"shakotan.hokkaido.jp\0loginline.services\0"
-"trani-andria-barletta.it\0\xe5\x8c\x97\xe6\xb5\xb7\xe9\x81\x93.jp\0"
-"sa.gov.au\0"
-"oslo.no\0\xd9\x85\xd8\xb5\xd8\xb1\0plumbing\0square7.ch\0virtualserver.io\0"
-"co.za\0"
-"taishin.fukushima.jp\0"
-"castle.museum\0"
-"azure-mobile.net\0"
-"clothing\0"
-"yoshida.saitama.jp\0"
-"delivery\0"
-"blogspot.com.es\0"
-"co.zm\0"
-"ag.it\0myiphost.com\0"
-"vestnes.no\0"
-"\xc3\xa5seral.no\0xs4all.space\0"
-"hamburg\0"
-"mb.ca\0co.zw\0za.bz\0"
-"fujisawa.iwate.jp\0is-a-designer.com\0"
-"biei.hokkaido.jp\0"
-"shitara.aichi.jp\0"
-"anan.tokushima.jp\0"
-"trentinoaltoadige.it\0"
-"booking\0"
-"bjark\xc3\xb8y.no\0tools\0"
-"odda.no\0"
-"rr.gov.br\0publ.pt\0"
-"kitahata.saga.jp\0heroy.nordland.no\0"
-"automotive.museum\0"
-"fastlylb.net\0"
-"udi.br\0fujioka.gunma.jp\0rag-cloud.hosteur.com\0"
-"hiji.oita.jp\0jolster.no\0"
-"takamori.kumamoto.jp\0"
-"gs.svalbard.no\0"
-"kijo.miyazaki.jp\0"
-"from-sd.com\0"
-"venice.it\0kamikoani.akita.jp\0b\xc3\xb8.telemark.no\0associates\0"
-"kunimi.fukushima.jp\0santabarbara.museum\0barefoot\0"
-"university\0"
-"bolzano-altoadige.it\0nago.okinawa.jp\0sciencehistory.museum\0"
-"dnsiskinky.com\0"
-"ginowan.okinawa.jp\0in-vpn.org\0onthewifi.com\0"
-"living.museum\0madrid\0"
-"ariake.saga.jp\0narvik.no\0nieruchomosci.pl\0"
-"rs.gov.br\0sc.gov.br\0usercontent.jp\0"
-"niki.hokkaido.jp\0"
-"vaapste.no\0"
-"cc.ms.us\0cc.nc.us\0"
-"social\0mein-iserv.de\0bar1.net\0"
-"brindisi.it\0sosnowiec.pl\0cc.in.us\0"
-"jeonbuk.kr\0"
-"figueres.museum\0"
-"u.bg\0"
-"bern.museum\0"
-"0.bg\0"
-"misato.akita.jp\0dyndns.info\0"
-"talk\0pr.leg.br\0"
-"cam.it\0k12.ak.us\0"
-"tamamura.gunma.jp\0"
-"kyotanabe.kyoto.jp\0opoczno.pl\0"
-"nakatombetsu.hokkaido.jp\0"
-"malatvuopmi.no\0zarow.pl\0"
-"kvitsoy.no\0enscaled.sg\0"
-"aprendemas.cl\0"
-"r\xc3\xb8""d\xc3\xb8y.no\0"
-"farmers\0"
-"abira.hokkaido.jp\0alvdal.no\0"
-"massacarrara.it\0"
-"design.aero\0"
-"uk.eu.org\0"
-"ingatlan.hu\0"
-"pharmacy.museum\0"
-"is-a-therapist.com\0"
-"yokote.akita.jp\0from-ms.com\0from-nc.com\0"
-"mb.it\0"
-"abruzzo.it\0lib.ct.us\0norton\0blogspot.com.mt\0"
-"togitsu.nagasaki.jp\0zachpomor.pl\0"
-"okinoshima.shimane.jp\0"
-"blogspot.com.ng\0ddns.net\0"
-"vaga.no\0\xe5\x80\x8b\xe4\xba\xba.\xe9\xa6\x99\xe6\xb8\xaf\0"
-"vip.jelastic.cloud\0"
-"fan\0"
-"brother\0etisalat\0"
-"a.ssl.fastly.net\0"
-"ayase.kanagawa.jp\0in.london\0"
-"nsn.us\0comcast\0"
-"press.aero\0s\xc3\xb8r-aurdal.no\0"
-"mypsx.net\0"
-"afjord.no\0"
-"sx.cn\0trentino-sudtirol.it\0"
-"home-webserver.de\0"
-"kalisz.pl\0"
-"kitamoto.saitama.jp\0"
-"rn.gov.br\0saigawa.fukuoka.jp\0orsta.no\0"
-"agents.aero\0"
-"takayama.gunma.jp\0"
-"vestre-slidre.no\0"
-"khmelnitskiy.ua\0cloud.fedoraproject.org\0"
-"inatsuki.fukuoka.jp\0"
-"doshi.yamanashi.jp\0"
-"mizunami.gifu.jp\0esq\0"
-"tsurugashima.saitama.jp\0"
-"noto.ishikawa.jp\0s3.dualstack.ap-southeast-2.amazonaws.com\0blogspot.com.tr\0"
-"dnsdojo.com\0webspace.rocks\0"
-"certification.aero\0"
-"seki.gifu.jp\0richardli\0"
-"audi\0"
-"url.tw\0"
-"realestate.pl\0"
-"\xe4\xba\xac\xe9\x83\xbd.jp\0estate\0"
-"tr\xc3\xb8gstad.no\0"
-"ro.gov.br\0aquarelle\0"
-"ikeda.osaka.jp\0sandvik\0"
-"neustar\0"
-"radio\0"
-"est-mon-blogueur.com\0"
-"kommunalforbund.se\0"
-"abashiri.hokkaido.jp\0kitagawa.miyazaki.jp\0hm.no\0\xc3\xa1lt\xc3\xa1.no\0pub.sa\0"
-"fujimi.nagano.jp\0"
-"ichinoseki.iwate.jp\0"
-"eus\0"
-"ap-northeast-3.elasticbeanstalk.com\0"
-"a.bg\0kofu.yamanashi.jp\0cc.de.us\0in-dsl.de\0"
-"kazo.saitama.jp\0beer\0"
-"notodden.no\0szczytno.pl\0flir\0in.net\0"
-"radom.pl\0blackbaudcdn.net\0"
-"matsumoto.kagoshima.jp\0fauske.no\0fin.tn\0serveblog.net\0"
-"host\0"
-"krasnodar.su\0"
-"nsw.au\0monza-brianza.it\0"
-"devices.resinstaging.io\0"
-"dyndns-pics.com\0"
-"i234.me\0"
-"services.aero\0"
-"maritime.museum\0"
-"koeln\0"
-"perspecta.cloud\0"
-"fredrikstad.no\0s3-ap-southeast-2.amazonaws.com\0"
-"\xe6\x89\x8b\xe6\x9c\xba\0freeddns.us\0"
-"agrar.hu\0"
-"volyn.ua\0"
-"leirfjord.no\0"
-"pc.it\0ravenna.it\0js.org\0"
-"bjerkreim.no\0"
-"panama.museum\0"
-"\xe7\xbd\x91\xe7\xbb\x9c.cn\0"
-"piemonte.it\0barsy.net\0"
-"sanda.hyogo.jp\0stuttgart.museum\0vang.no\0blogspot.com.uy\0"
-"s3-website-sa-east-1.amazonaws.com\0"
-"bt.it\0\xe9\xa3\x9f\xe5\x93\x81\0s3-us-west-1.amazonaws.com\0"
-"\xe7\xb5\x84\xe7\xb9\x94.tw\0"
-"lecce.it\0"
-"eu.ax\0"
-"fit\0health-carereform.com\0"
-"taxi\0winners\0is-a-personaltrainer.com\0"
-"dyndns-remote.com\0"
-"kitagata.saga.jp\0"
-"sanjo.niigata.jp\0"
-"boldlygoingnowhere.org\0"
-"sd.cn\0"
-"dyndns-free.com\0"
-"knx-server.net\0"
-"kraanghke.no\0cloudfunctions.net\0"
-"rebun.hokkaido.jp\0"
-"obuse.nagano.jp\0wpenginepowered.com\0"
-"shw.io\0"
-"nakatsugawa.gifu.jp\0mutual\0"
-"freeboxos.fr\0"
-"dh.bytemark.co.uk\0"
-"esashi.hokkaido.jp\0cx.ua\0"
-"posts-and-telecommunications.museum\0rakkestad.no\0"
-"diet\0"
-"us-4.evennode.com\0"
-"auspost\0"
-"barsy.menu\0"
-"endofinternet.org\0"
-"*.bzz.dapps.earth\0"
-"kimitsu.chiba.jp\0pittsburgh.museum\0"
-"bedzin.pl\0eu-west-1.elasticbeanstalk.com\0"
-"ggf.br\0systems\0"
-"fly\0kddi\0"
-"stat.no\0"
-"*.spectrum.myjino.ru\0"
-"selfip.net\0"
-"chesapeakebay.museum\0dinosaur.museum\0"
-"avocat.pro\0\xe3\x82\xaf\xe3\x83\xa9\xe3\x82\xa6\xe3\x83\x89\0hu.com\0"
-"aircraft.aero\0\xe7\xbd\x91\xe7\xbb\x9c.hk\0"
-"friuli-v-giulia.it\0k12.wy.us\0tec.mi.us\0"
-"koshu.yamanashi.jp\0"
-"ullensaker.no\0cc.ca.us\0"
-"kokubunji.tokyo.jp\0olkusz.pl\0nz.basketball\0"
-"u.se\0"
-"net.ac\0veneto.it\0hostyhosting.io\0"
-"net.ae\0"
-"net.af\0"
-"gliding.aero\0net.ag\0"
-"net.ai\0"
-"paris\0"
-"net.al\0ako.hyogo.jp\0oarai.ibaraki.jp\0"
-"net.am\0cesena-forl\xc3\xac.it\0"
-"aisho.shiga.jp\0"
-"control.aero\0pc.pl\0"
-"net.ba\0otsuchi.iwate.jp\0kawai.nara.jp\0"
-"net.ar\0net.bb\0"
-"amsterdam\0foo\0"
-"customer.enonic.io\0"
-"net.au\0kyuragi.saga.jp\0"
-"net.bh\0stufftoread.com\0"
-"net.az\0"
-"\xe3\x82\xb0\xe3\x83\xbc\xe3\x82\xb0\xe3\x83\xab\0"
-"fox\0"
-"net.bm\0satsumasendai.kagoshima.jp\0yamato.kanagawa.jp\0"
-"net.bn\0iz.hr\0"
-"net.bo\0g\xc3\xa1ls\xc3\xa1.no\0"
-"us-3.evennode.com\0"
-"net.br\0dynalias.net\0"
-"net.bs\0"
-"net.bt\0"
-"gs.nl.no\0fl\xc3\xa5.no\0"
-"hiratsuka.kanagawa.jp\0"
-"se.gov.br\0hikari.yamaguchi.jp\0"
-"net.ci\0inc.hk\0"
-"championship.aero\0net.bz\0koori.fukushima.jp\0touch.museum\0lib.mo.us\0"
-"net.cm\0no.it\0"
-"net.cn\0ddns.me\0"
-"net.co\0canada.museum\0lincoln\0"
-"gal\0"
-"kikonai.hokkaido.jp\0"
-"fe.it\0gives\0"
-"boston.museum\0gap\0"
-"net.cu\0"
-"ap.it\0"
-"net.cw\0"
-"net.cy\0"
-"otoineppu.hokkaido.jp\0kasuga.hyogo.jp\0"
-"chikuhoku.nagano.jp\0fantasyleague.cc\0dyn-vpn.de\0"
-"net.dm\0gay\0"
-"net.do\0"
-"frl\0"
-"kyotango.kyoto.jp\0miasta.pl\0"
-"kitahiroshima.hokkaido.jp\0"
-"zj.cn\0net.ec\0"
-"in-dsl.net\0"
-"ba.gov.br\0"
-"kosaka.akita.jp\0"
-"net.eg\0"
-"habmer.no\0"
-"net.dz\0morotsuka.miyazaki.jp\0"
-"gaular.no\0villas\0"
-"mobara.chiba.jp\0fuoisku.no\0"
-"even\xc3\xa1\xc5\xa1\xc5\xa1i.no\0"
-"uni5.net\0meteorapp.com\0"
-"yandexcloud.net\0"
-"net.et\0"
-"b\xc3\xa5""d\xc3\xa5""ddj\xc3\xa5.no\0"
-"vardo.no\0lixil\0"
-"net.fj\0hamaroy.no\0"
-"\xe7\xbb\x84\xe7\xbb\x87.hk\0nature.museum\0"
-"ponpes.id\0sayama.osaka.jp\0best\0"
-"net.fm\0"
-"toyoura.hokkaido.jp\0barsycenter.com\0"
-"dynu.net\0"
-"usa.museum\0us-2.evennode.com\0"
-"gdn\0"
-"cityeats\0"
-"net.ge\0tra.kp\0gea\0"
-"s\xc3\xa1lat.no\0ftr\0at-band-camp.net\0"
-"net.gg\0architecture.museum\0auto\0"
-"diadem.cloud\0"
-"isa-geek.org\0"
-"tsuchiura.ibaraki.jp\0"
-"net.gl\0toda.saitama.jp\0"
-"net.gn\0hongo.hiroshima.jp\0ooguy.com\0"
-"navigation.aero\0"
-"net.gp\0"
-"higashinaruse.akita.jp\0kurate.fukuoka.jp\0"
-"net.gr\0fun\0thingdustdata.com\0"
-"net.gt\0"
-"net.gu\0kozow.com\0"
-"outsystemscloud.com\0"
-"asahi.yamagata.jp\0oksnes.no\0barsy.pro\0"
-"net.gy\0zao.miyagi.jp\0"
-"sukagawa.fukushima.jp\0"
-"net.hk\0kasama.ibaraki.jp\0"
-"virtual-user.de\0woltlab-demo.com\0"
-"net.hn\0otake.hiroshima.jp\0anthro.museum\0"
-"cyou\0"
-"sa.gov.pl\0"
-"9.bg\0"
-"net.ht\0net.id\0k12.ms.us\0k12.nc.us\0"
-"grosseto.it\0"
-"nedre-eiker.no\0"
-"a.se\0"
-"balsan-suedtirol.it\0bielawa.pl\0"
-"net.il\0"
-"net.im\0holt\xc3\xa5len.no\0"
-"net.in\0"
-"net.iq\0clan.rip\0"
-"net.ir\0"
-"net.is\0"
-"odessa.ua\0"
-"net.je\0"
-"buyshouses.net\0"
-"odesa.ua\0"
-"modern.museum\0transport.museum\0barsy.pub\0"
-"viajes\0"
-"net.jo\0"
-"sardegna.it\0otoyo.kochi.jp\0us-1.evennode.com\0"
-"iitate.fukushima.jp\0"
-"net.kg\0"
-"mie.jp\0net.ki\0lib.vi.us\0"
-"calabria.it\0"
-"ve.it\0"
-"fyi\0lolipop.io\0"
-"net.kn\0s3-website-us-west-2.amazonaws.com\0"
-"minamiise.mie.jp\0ocelot.mythic-beasts.com\0"
-"shirahama.wakayama.jp\0"
-"net.la\0"
-"net.lb\0foundation\0"
-"net.lc\0dish\0nfshost.com\0"
-"trainer.aero\0"
-"sorocaba.br\0morimachi.shizuoka.jp\0spdns.org\0"
-"log.br\0"
-"net.kw\0"
-"sg-1.paas.massivegrid.net\0"
-"net.ky\0"
-"minokamo.gifu.jp\0net.kz\0parts\0"
-"tomisato.chiba.jp\0net.lk\0"
-"adachi.tokyo.jp\0"
-"gop.pk\0gentapps.com\0"
-"horology.museum\0salzburg.museum\0"
-"yaita.tochigi.jp\0party\0"
-"net.ma\0"
-"net.lr\0"
-"net.ls\0"
-"dscloud.mobi\0"
-"am.gov.br\0net.me\0"
-"erotica.hu\0net.lv\0"
-"travel\0"
-"net.ly\0"
-"gotpantheon.com\0"
-"net.mk\0select\0"
-"net.ml\0"
-"net.mo\0"
-"joinville.br\0"
-"net.ms\0fam.pk\0"
-"hb.cn\0gosen.niigata.jp\0net.mt\0builtwithdark.com\0"
-"mutsuzawa.chiba.jp\0net.mu\0"
-"net.mv\0net.nf\0"
-"net.mw\0net.ng\0"
-"net.mx\0"
-"net.my\0net.ni\0gle\0"
-"net.mz\0"
-"yamashina.kyoto.jp\0roan.no\0"
-"bandai.fukushima.jp\0"
-"kawanishi.nara.jp\0\xd8\xaa\xd9\x88\xd9\x86\xd8\xb3\0"
-"kirovograd.ua\0"
-"*.elb.amazonaws.com.cn\0"
-"caltanissetta.it\0"
-"wiw.gov.pl\0"
-"net.nr\0"
-"hirado.nagasaki.jp\0wi.us\0"
-"\xe7\xb5\x84\xe7\xb9\x94.hk\0"
-"assassination.museum\0sd.us\0"
-"bamble.no\0net.nz\0"
-"doesntexist.org\0"
-"nogata.fukuoka.jp\0net.om\0"
-"culturalcenter.museum\0"
-"ryukyu\0"
-"mantova.it\0maryland.museum\0net.pa\0"
-"epilepsy.museum\0"
-"kashima.saga.jp\0interactive.museum\0gmo\0"
-"net.pe\0lancia\0"
-"isumi.chiba.jp\0bato.tochigi.jp\0"
-"net.ph\0"
-"jewelry\0"
-"us-west-1.elasticbeanstalk.com\0"
-"ranzan.saitama.jp\0net.pk\0coffee\0"
-"tajiri.osaka.jp\0net.pl\0gmx\0"
-"shinshinotsu.hokkaido.jp\0"
-"net.pn\0donetsk.ua\0"
-"ilawa.pl\0"
-"hirakata.osaka.jp\0net.qa\0"
-"entertainment.aero\0net.pr\0"
-"net.ps\0"
-"s\xc3\xb8gne.no\0net.pt\0guide\0"
-"j.bg\0nishiaizu.fukushima.jp\0toyooka.hyogo.jp\0"
-"higashihiroshima.hiroshima.jp\0oshu.iwate.jp\0"
-"yamanashi.jp\0hokksund.no\0svelvik.no\0"
-"net.py\0"
-"servequake.com\0"
-"psc.br\0okayama.jp\0vodka\0j.scaleforce.com.cy\0"
-"\xe7\xa6\x8f\xe5\xb3\xb6.jp\0utah.museum\0k12.il.us\0"
-"date.hokkaido.jp\0folkebibl.no\0"
-"daegu.kr\0"
-"mikawa.yamagata.jp\0k12.de.us\0"
-"jele.site\0"
-"vega.no\0goo\0"
-"vegarshei.no\0gop\0"
-"monzaedellabrianza.it\0futuremailing.at\0"
-"\xe5\x95\x86\xe6\xa5\xad.tw\0"
-"journalism.museum\0got\0solutions\0"
-"wales.museum\0toray\0"
-"gov\0"
-"global.ssl.fastly.net\0ms.leg.br\0"
-"br\xc3\xb8nn\xc3\xb8ysund.no\0"
-"tank.museum\0"
-"onyourside\0"
-"terni.it\0nakagawa.fukuoka.jp\0co.krd\0"
-"lillehammer.no\0"
-"net.sa\0in-vpn.net\0"
-"net.sb\0\xe9\xa6\x99\xe6\xb8\xaf\0kosher\0ch.trendhosting.cloud\0"
-"net.sc\0"
-"net.sd\0nikon\0"
-"ap.gov.br\0net.ru\0"
-"store\0"
-"tsumagoi.gunma.jp\0airguard.museum\0net.rw\0net.sg\0"
-"net.sh\0"
-"sn\xc3\xa5""ase.no\0"
-"website\0"
-"zoological.museum\0net.sl\0"
-"net.so\0"
-"karikatur.museum\0international\0"
-"enebakk.no\0net.ss\0"
-"ass.km\0net.st\0"
-"fukuchi.fukuoka.jp\0sherbrooke.museum\0"
-"fhs.no\0"
-"from-mt.com\0from-nd.com\0"
-"net.th\0pcloud.host\0"
-"net.sy\0ollo\0productions\0"
-"belem.br\0gr.it\0jeju.kr\0konin.pl\0net.tj\0lib.ca.us\0"
-"mt.leg.br\0"
-"bodo.no\0net.tm\0lon-1.paas.massivegrid.net\0"
-"net.tn\0"
-"f\xc3\xb8rde.no\0ap.gov.pl\0olawa.pl\0net.to\0"
-"isa-geek.com\0"
-"net.ua\0"
-"net.tr\0"
-"lg.jp\0hbo\0"
-"net.tt\0"
-"limanowa.pl\0"
-"bologna.it\0gr.jp\0wake.okayama.jp\0"
-"tranoy.no\0net.tw\0"
-"web.bo\0hosting\0""4lima.de\0"
-"apps.lair.io\0"
-"aetna\0"
-"hirono.fukushima.jp\0net.uk\0\xd2\x9b\xd0\xb0\xd0\xb7\0abbott\0"
-"hobol.no\0fashion\0"
-"try-snowplow.com\0"
-"star\0"
-"nx.cn\0olbiatempio.it\0net.vc\0"
-"net.ve\0"
-"js.cn\0estate.museum\0malbork.pl\0target\0"
-"feira.br\0lanxess\0"
-"web.co\0"
-"net.uy\0net.vi\0\xe6\x85\x88\xe5\x96\x84\0"
-"net.uz\0"
-"gitapp.si\0now-dns.net\0"
-"net.vn\0is-lost.org\0appchizi.com\0"
-"seaport.museum\0mk.ua\0"
-"hiranai.aomori.jp\0"
-"trieste.it\0usui.fukuoka.jp\0\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd9\x87\0"
-"if.ua\0"
-"net.vu\0"
-"likes-pie.com\0""4lima.at\0"
-"web.do\0uk.reclaim.cloud\0"
-"yatsushiro.kumamoto.jp\0forde.no\0"
-"yotsukaido.chiba.jp\0"
-"mansions.museum\0"
-"prato.it\0urausu.hokkaido.jp\0force.museum\0"
-"mielec.pl\0"
-"aoste.it\0ofunato.iwate.jp\0barsy.org\0"
-"ome.tokyo.jp\0"
-"ono.hyogo.jp\0hoyanger.no\0molde.no\0net.ws\0"
-"cancerresearch\0"
-"uk.primetel.cloud\0"
-"4lima.ch\0"
-"cloud66.ws\0"
-"matsumoto.nagano.jp\0ishikawa.okinawa.jp\0clinic\0"
-"cc.tn.us\0"
-"flor\xc3\xb8.no\0nes.buskerud.no\0"
-"siellak.no\0uzhgorod.ua\0"
-"lodingen.no\0\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd8\xa9\0"
-"abo.pa\0"
-"net.ye\0rugby\0\xe9\xa4\x90\xe5\x8e\x85\0"
-"muenster.museum\0aukra.no\0no-ip.ca\0"
-"macys\0selfip.info\0"
-"godo.gifu.jp\0romsa.no\0"
-"k12.or.us\0"
-"kimino.wakayama.jp\0"
-"\xe6\xa0\x83\xe6\x9c\xa8.jp\0"
-"portlligat.museum\0"
-"net.za\0"
-"tsukui.kanagawa.jp\0termez.su\0"
-"extraspace\0"
-"wios.gov.pl\0"
-"g\xc3\xa1ivuotna.no\0net.zm\0"
-"web.gu\0"
-"kaisei.kanagawa.jp\0"
-"tas.edu.au\0kasuga.fukuoka.jp\0aure.no\0boehringer\0"
-"lans.museum\0"
-"sakae.nagano.jp\0"
-"delaware.museum\0"
-"!city.kitakyushu.jp\0okegawa.saitama.jp\0synology.me\0"
-"ybo.faith\0"
-"recht.pro\0"
-"web.id\0d\xc3\xb8nna.no\0rzgw.gov.pl\0"
-"tosashimizu.kochi.jp\0from-hi.com\0"
-"tsurugi.ishikawa.jp\0cloud-de.unispace.io\0"
-"bifuka.hokkaido.jp\0"
-"shell.museum\0flowers\0"
-"web.in\0"
-"klabu.no\0"
-"hiv\0"
-"trentino-s\xc3\xbc""d-tirol.it\0gamagori.aichi.jp\0"
-"*.banzai.cloud\0"
-"movimiento.bo\0"
-"hornindal.no\0"
-"ua.rs\0"
-"cechire.com\0co.financial\0"
-"bi.it\0brussel.museum\0history.museum\0"
-"trustee.museum\0"
-"qpon\0"
-"\xd8\xa7\xd9\x84\xd8\xac\xd8\xb2\xd8\xa7\xd8\xa6\xd8\xb1\0"
-"showa.yamanashi.jp\0"
-"conf.au\0"
-"eiheiji.fukui.jp\0"
-"bihoro.hokkaido.jp\0hara.nagano.jp\0field.museum\0"
-"donna.no\0"
-"\xd9\xbe\xd8\xa7\xda\xa9\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86\0hkt\0"
-"is-an-accountant.com\0kurgan.su\0"
-"oita.jp\0drayddns.com\0"
-"isen.kagoshima.jp\0bydgoszcz.pl\0"
-"honbetsu.hokkaido.jp\0oregon.museum\0square.museum\0"
-"inagawa.hyogo.jp\0"
-"pl.ua\0"
-"tsuruga.fukui.jp\0"
-"web.lk\0lg.ua\0"
-"ardal.no\0"
-"dontexist.com\0"
-"dr\xc3\xb8""bak.no\0"
-"tone.ibaraki.jp\0is-a-techie.com\0"
-"kiyokawa.kanagawa.jp\0"
-"webhosting.be\0"
-"hs.run\0"
-"\xe7\xa7\xbb\xe5\x8a\xa8\0"
-"takikawa.hokkaido.jp\0"
-"mini\0"
-"bill.museum\0"
-"from-ks.com\0"
-"mint\0gsj.bz\0"
-"ichikawa.hyogo.jp\0axis.museum\0web.nf\0"
-"s3.eu-west-3.amazonaws.com\0is-a-musician.com\0"
-"web.ni\0"
-"historisches.museum\0"
-"laspezia.it\0"
-"pescara.it\0"
-"market\0"
-"reisen\0"
-"for.men\0"
-"charter.aero\0"
-"elasticbeanstalk.com\0dyndns.dappnode.io\0"
-"k12.nv.us\0"
-"vgs.no\0"
-"*.owo.codes\0"
-"groks-the.info\0"
-"oxford.museum\0"
-"from.hr\0gyeongnam.kr\0umig.gov.pl\0hot\0syno-ds.de\0"
-"fuchu.hiroshima.jp\0"
-"kurobe.toyama.jp\0how\0"
-"versicherung\0"
-"alipay\0"
-"web.pk\0"
-"tcp4.me\0"
-"fuchu.tokyo.jp\0"
-"coal.museum\0"
-"myfast.host\0"
-"mircloud.us\0"
-"tarnobrzeg.pl\0"
-"iide.yamagata.jp\0"
-"farm.museum\0"
-"chino.nagano.jp\0"
-"selfip.org\0"
-"oumu.hokkaido.jp\0"
-"shiroishi.miyagi.jp\0"
-"ri.it\0lib.nh.us\0"
-"under.one\0"
-"mt.it\0kanegasaki.iwate.jp\0zone\0"
-"sanuki.kagawa.jp\0"
-"gs.jan-mayen.no\0\xc3\xb8ystre-slidre.no\0ibm\0"
-"owani.aomori.jp\0oppeg\xc3\xa5rd.no\0"
-"dyn-o-saur.com\0ntdll.top\0"
-"andasuolo.no\0dyndns.biz\0forte.id\0"
-"\xd0\xb8\xd0\xba\xd0\xbe\xd0\xbc.museum\0ice\0"
-"team\0"
-"\xd8\xb9\xd8\xb1\xd8\xa7\xd9\x82\0"
-"police.uk\0"
-"riik.ee\0"
-"io.kg\0"
-"coupon\0icu\0"
-"deals\0s3-eu-central-1.amazonaws.com\0"
-"hk.cn\0koryo.nara.jp\0"
-"matera.it\0raid\0"
-"shari.hokkaido.jp\0"
-"web.tj\0sm.ua\0"
-"hsbc\0icbc\0"
-"dynalias.org\0"
-"swiftcover\0"
-"tech\0"
-"online.th\0"
-"web.tr\0toyota\0"
-"baghdad.museum\0"
-"miyoshi.hiroshima.jp\0"
-"loans\0phone\0"
-"\xd0\xb1\xd0\xb5\xd0\xbb\0"
-"semboku.akita.jp\0gotemba.shizuoka.jp\0sebastopol.ua\0oh.us\0"
-"nogi.tochigi.jp\0oygarden.no\0"
-"fly.dev\0"
-"web.ve\0"
-"oyer.no\0"
-"other.nf\0nissedal.no\0"
-"lazio.it\0kunitomi.miyazaki.jp\0ifm\0mo-siemens.io\0"
-"\xe5\x80\x8b\xe4\xba\xba.hk\0mesaverde.museum\0hammerfest.no\0mircloud.ru\0"
-"poivron.org\0edgestack.me\0"
-"gildesk\xc3\xa5l.no\0"
-"kami.kochi.jp\0"
-"genkai.saga.jp\0from-wv.com\0"
-"isa.us\0"
-"okaya.nagano.jp\0"
-"etc.br\0"
-"cc.il.us\0"
-"k12.ut.us\0"
-"s.bg\0"
-"emilia-romagna.it\0"
-"flynnhosting.net\0"
-"k12.nj.us\0\xe4\xb8\xad\xe6\x96\x87\xe7\xbd\x91\0"
-"veterinaire.km\0"
-"vercelli.it\0"
-"kamigori.hyogo.jp\0"
-"ro.eu.org\0"
-"minamidaito.okinawa.jp\0"
-"loseyourip.com\0"
-"kumamoto.jp\0"
-"shiojiri.nagano.jp\0"
-"2000.hu\0"
-"nowtv\0"
-"lodi.it\0tobe.ehime.jp\0"
-"\xe6\x94\xbf\xe5\xba\x9c\0isa-geek.net\0"
-"stange.no\0"
-"pisa.it\0"
-"kamitonda.wakayama.jp\0bajddar.no\0"
-"schools.nsw.edu.au\0bieszczady.pl\0"
-"vefsn.no\0"
-"is-a-libertarian.com\0"
-"filegear-de.me\0"
-"showa.fukushima.jp\0"
-"lucania.it\0minamiyamashiro.kyoto.jp\0platter-app.com\0"
-"alesund.no\0ac.leg.br\0"
-"\xc3\xa5l.no\0web.za\0"
-"yasu.shiga.jp\0"
-"pu.it\0wnext.app\0"
-"ide.kyoto.jp\0jelastic.regruhosting.ru\0"
-"pagespeedmobilizer.com\0"
-"kamifurano.hokkaido.jp\0hidaka.kochi.jp\0photography.museum\0"
-"ichinomiya.chiba.jp\0"
-"soka.saitama.jp\0"
-"onomichi.hiroshima.jp\0leangaviika.no\0"
-"veterinaire.fr\0meeres.museum\0"
-"larsson.museum\0nordkapp.no\0us-gov-west-1.elasticbeanstalk.com\0internet-dns.de\0"
-"kawanabe.kagoshima.jp\0gg.ax\0"
-"friuli-vgiulia.it\0"
-"mining.museum\0food\0"
-"is-very-bad.org\0"
-"abkhazia.su\0"
-"kamikawa.saitama.jp\0"
-"yuasa.wakayama.jp\0si.eu.org\0"
-"aviation.museum\0"
-"photo\0conf.se\0"
-"jerusalem.museum\0"
-"sakuho.nagano.jp\0"
-"skole.museum\0"
-"can.museum\0dealer\0"
-"ohtawara.tochigi.jp\0"
-"!www.ck\0vn.ua\0"
-"osakikamijima.hiroshima.jp\0"
-"aogashima.tokyo.jp\0"
-"g\xc3\xa1\xc5\x8bgaviika.no\0"
-"lahppi.no\0"
-"orangecloud.tn\0"
-"sydney.museum\0"
-"inc\0spb.ru\0"
-"oiso.kanagawa.jp\0ee.eu.org\0"
-"presse.km\0ri.us\0"
-"missile.museum\0ing\0"
-"mt.us\0nd.us\0paris.eu.org\0"
-"slz.br\0shibata.niigata.jp\0irish\0"
-"ink\0"
-"ford\0"
-"sells-for-less.com\0"
-"spb.su\0"
-"int\0"
-"suita.osaka.jp\0"
-"etnedal.no\0"
-"carbonia-iglesias.it\0total\0"
-"ina.nagano.jp\0cadaques.museum\0cc.pr.us\0hasura-app.io\0"
-"notaires.km\0"
-"qsl.br\0chiryu.aichi.jp\0"
-"kopervik.no\0"
-"porsgrunn.no\0k12.tx.us\0"
-"trentinosud-tirol.it\0giske.no\0"
-"cc.dc.us\0"
-"mashiki.kumamoto.jp\0k12.pa.us\0design\0"
-"presse.ml\0narviika.no\0s\xc3\xb8rum.no\0"
-"poker\0sk.eu.org\0"
-"mytis.ru\0"
-"selbu.no\0\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4\0"
-"sciencesnaturelles.museum\0datsun\0"
-"hasura.app\0"
-"newholland\0yolasite.com\0"
-"nombre.bo\0strand.no\0"
-"for.mom\0"
-"kanra.gunma.jp\0"
-"yamaguchi.jp\0"
-"tsuno.miyazaki.jp\0"
-"shintomi.miyazaki.jp\0"
-"sakahogi.gifu.jp\0"
-"kaho.fukuoka.jp\0haebaru.okinawa.jp\0"
-"somna.no\0"
-"kuokgroup\0"
-"kitakata.miyazaki.jp\0"
-"sv.it\0sandnes.no\0"
-"pa.it\0"
-"jcb\0"
-"lancashire.museum\0jambyl.su\0"
-"a\xc3\xa9roport.ci\0ama.shimane.jp\0eurovision\0from-nm.com\0game-host.org\0"
-"trentino-stirol.it\0exeter.museum\0"
-"br.it\0cb.it\0"
-"sauherad.no\0"
-"alto-adige.it\0misato.saitama.jp\0vision\0"
-"osasco.br\0"
-"usantiques.museum\0"
-"es.ax\0"
-"higashikagawa.kagawa.jp\0surf\0"
-"skedsmo.no\0"
-"tananger.no\0evenes.no\0ist\0is-a-financialadvisor.com\0"
-"ru.eu.org\0se.eu.org\0"
-"dep.no\0"
-"skydiving.aero\0"
-"nm.cn\0"
-"council.aero\0"
-"os.hordaland.no\0"
-"credit\0cya.gg\0"
-"itv\0"
-"omigawa.chiba.jp\0"
-"rsc.cdn77.org\0pantheonsite.io\0"
-"suli.hu\0gifu.jp\0"
-"tahara.aichi.jp\0"
-"nhlfan.net\0"
-"*.alces.network\0"
-"philadelphiaarea.museum\0cv.ua\0sells-for-u.com\0"
-"higashisumiyoshi.osaka.jp\0"
-"nagawa.nagano.jp\0"
-"barsy.mobi\0"
-"conf.lv\0"
-"kiyose.tokyo.jp\0"
-"press.museum\0"
-"hiroshima.jp\0"
-"kumiyama.kyoto.jp\0psse.gov.pl\0"
-"bialystok.pl\0teva\0"
-"lamer\0"
-"tagami.niigata.jp\0"
-"from-md.com\0"
-"kikuchi.kumamoto.jp\0educational.museum\0"
-"pulawy.pl\0build\0"
-"ent.platform.sh\0"
-"s.se\0"
-"eniwa.hokkaido.jp\0now-dns.org\0"
-"ternopil.ua\0passagens\0"
-"\xd9\x87\xd9\x85\xd8\xb1\xd8\xa7\xd9\x87\0"
-"north-kazakhstan.su\0"
-"hurum.no\0"
-"*.oci.customer-oci.com\0"
-"natal.br\0"
-"poltava.ua\0"
-"komae.tokyo.jp\0"
-"yukuhashi.fukuoka.jp\0"
-"dynamic-dns.info\0"
-"baidu\0northwesternmutual\0"
-"cat.ax\0"
-"mochizuki.nagano.jp\0"
-"repbody.aero\0jio\0"
-"\xe0\xa4\xb8\xe0\xa4\x82\xe0\xa4\x97\xe0\xa4\xa0\xe0\xa4\xa8\0nordeste-idc.saveincloud.net\0"
-"timekeeping.museum\0verran.no\0iopsys.se\0"
-"trentino-a-adige.it\0shimonoseki.yamaguchi.jp\0"
-"bhz.br\0doctor\0"
-"api.stdlib.com\0"
-"archaeological.museum\0"
-"higashiomi.shiga.jp\0"
-"app.br\0skj\xc3\xa5k.no\0visa\0pubtls.org\0"
-"ce.gov.br\0!city.kawasaki.jp\0"
-"nanao.ishikawa.jp\0ninja\0"
-"\xe0\xaa\xad\xe0\xaa\xbe\xe0\xaa\xb0\xe0\xaa\xa4\0"
-"zakopane.pl\0"
-"bike\0us.ax\0"
-"children.museum\0"
-"fc.it\0l\xc3\xa6rdal.no\0"
-"id.au\0an.it\0otari.nagano.jp\0"
-"piedmont.it\0"
-"flesberg.no\0tashkent.su\0al.leg.br\0"
-"dentist\0"
-"group.aero\0"
-"\xe9\x9b\x86\xe5\x9b\xa2\0ilovecollege.info\0"
-"jll\0"
-"sa.edu.au\0"
-"marugame.kagawa.jp\0v\xc3\xa5gan.no\0"
-"horonobe.hokkaido.jp\0"
-"yonaguni.okinawa.jp\0"
-"incheon.kr\0rost.no\0"
-"\xe5\xa5\x88\xe8\x89\xaf.jp\0"
-"katano.osaka.jp\0"
-"vet.br\0"
-"dali.museum\0"
-"trentinsudtirol.it\0"
-"school.museum\0"
-"es.kr\0game.tw\0"
-"jab.br\0skodje.no\0"
-"siena.it\0fentiger.mythic-beasts.com\0"
-"jmp\0viva\0"
-"a.prod.fastly.net\0"
-"santacruz.museum\0"
-"university.museum\0"
-"hakone.kanagawa.jp\0"
-"ac\0kharkov.ua\0jnj\0homeoffice.gov.uk\0"
-"ad\0bing\0"
-"ae\0jevnaker.no\0"
-"accident-investigation.aero\0af\0saitama.saitama.jp\0"
-"ag\0vivo\0"
-"togane.chiba.jp\0"
-"ai\0pa.us\0"
-"alp1.ae.flow.ch\0"
-"westeurope.azurestaticapps.net\0"
-"al\0"
-"am\0obanazawa.yamagata.jp\0report\0forgot.her.name\0"
-"ao\0kurotaki.nara.jp\0"
-"aq\0ba\0"
-"ar\0bb\0"
-"as\0amot.no\0"
-"at\0yaese.okinawa.jp\0"
-"au\0be\0"
-"bf\0miners.museum\0cc.vt.us\0"
-"aw\0bg\0app.gp\0"
-"ax\0bh\0"
-"bi\0sejny.pl\0"
-"az\0bj\0*.landing.myjino.ru\0"
-"cc.nj.us\0mydissent.net\0"
-"bm\0jot\0cn.eu.org\0"
-"bn\0walbrzych.pl\0"
-"bo\0botanicalgarden.museum\0"
-"daplie.me\0"
-"ca\0"
-"br\0joy\0"
-"bs\0cc\0hk.com\0"
-"bt\0cd\0"
-"7.bg\0shirako.chiba.jp\0biratori.hokkaido.jp\0tabayama.yamanashi.jp\0nittedal.no\0cc.ak.us\0"
-"bv\0cf\0"
-"bw\0cg\0b\xc3\xa1hcavuotna.no\0l\xc3\xb8""dingen.no\0"
-"ch\0yamamoto.miyagi.jp\0"
-"by\0ci\0"
-"bz\0"
-"cl\0friuli-ve-giulia.it\0"
-"cm\0blogsyte.com\0"
-"cn\0"
-"co\0"
-"pictet\0"
-"cr\0"
-"s\xc3\xa1l\xc3\xa1t.no\0"
-"cu\0de\0sakegawa.yamagata.jp\0science-fiction.museum\0sirdal.no\0"
-"cv\0"
-"cw\0kitaaiki.nagano.jp\0"
-"cx\0kakamigahara.gifu.jp\0"
-"cy\0"
-"cz\0dj\0kwp.gov.pl\0trafficplex.cloud\0"
-"dk\0fukushima.jp\0"
-"dm\0"
-"oketo.hokkaido.jp\0solund.no\0"
-"show.aero\0do\0meiwa.mie.jp\0"
-"kumano.hiroshima.jp\0"
-"ec\0crd.co\0"
-"teshikaga.hokkaido.jp\0"
-"ee\0"
-"liguria.it\0"
-"eg\0"
-"is-saved.org\0"
-"dz\0"
-"hemne.no\0"
-"tempio-olbia.it\0"
-"vc.it\0sabae.fukui.jp\0"
-"vall\xc3\xa9""eaoste.it\0iserv.dev\0"
-"livorno.it\0lib.me.us\0statebank\0"
-"stcgroup\0"
-"es\0krellian.net\0"
-"et\0mi.it\0tsubata.ishikawa.jp\0"
-"eu\0id.ir\0bergbau.museum\0"
-"oz.au\0lib.co.us\0"
-"watches\0"
-"fi\0fireweb.app\0"
-"fj\0"
-"fm\0"
-"gran.no\0"
-"fo\0palermo.it\0marker.no\0"
-"gon.pk\0"
-"ga\0us.kg\0"
-"fr\0gb\0"
-"gd\0vao.it\0vxl.sh\0"
-"ge\0online.museum\0"
-"gf\0myravendb.com\0"
-"gg\0"
-"gh\0"
-"gi\0"
-"yurihonjo.akita.jp\0"
-"gl\0"
-"gm\0"
-"gn\0ono.fukui.jp\0"
-"gp\0"
-"gq\0onfabrica.com\0"
-"gr\0"
-"gs\0museumcenter.museum\0"
-"gt\0"
-"gu\0jamison.museum\0"
-"gw\0"
-"balsan-s\xc3\xbc""dtirol.it\0"
-"gy\0sb.ua\0"
-"midatlantic.museum\0portal.museum\0"
-"presse.ci\0hk\0ogimi.okinawa.jp\0"
-"ibaraki.osaka.jp\0reviews\0"
-"hm\0anamizu.ishikawa.jp\0cy.eu.org\0"
-"hn\0"
-"settlement.museum\0"
-"kfh\0"
-"hr\0"
-"airport.aero\0"
-"ht\0id\0"
-"crew.aero\0hu\0ie\0freetls.fastly.net\0"
-"eu.int\0"
-"id.lv\0"
-"plo.ps\0"
-"us.na\0storage\0"
-"il\0id.ly\0"
-"im\0shinyoshitomi.fukuoka.jp\0asahi.nagano.jp\0paris.museum\0"
-"in\0nm.us\0"
-"io\0iwakura.aichi.jp\0"
-"iq\0bashkiria.ru\0"
-"ir\0"
-"is\0"
-"it\0"
-"je\0"
-"os\xc3\xb8yro.no\0"
-"chikujo.fukuoka.jp\0mugi.tokushima.jp\0newyork.museum\0"
-"democrat\0fbxos.fr\0"
-"etne.no\0ieee\0"
-"cz.eu.org\0"
-"jo\0historicalsociety.museum\0bar.pro\0"
-"jp\0"
-"bashkiria.su\0"
-"kaneyama.yamagata.jp\0"
-"naturalhistorymuseum.museum\0"
-"cc.ia.us\0fairwinds\0"
-"ke\0"
-"h.bg\0beppu.oita.jp\0kg\0is-into-games.com\0"
-"crown\0"
-"ki\0"
-"kia\0"
-"tsuruta.aomori.jp\0bradesco\0"
-"km\0"
-"kn\0jls-sto3.elastx.net\0"
-"abeno.osaka.jp\0"
-"kp\0blackfriday\0"
-"miyakonojo.miyazaki.jp\0la\0k12.dc.us\0"
-"nic.in\0kr\0lb\0stryn.no\0gliwice.pl\0"
-"lc\0iki.fi\0to.gt\0"
-"phoenix.museum\0"
-"museum\0ru.com\0"
-"newhampshire.museum\0kim\0"
-"ogawara.miyagi.jp\0kw\0lucerne.museum\0"
-"game\0"
-"ky\0li\0alwaysdata.net\0"
-"kz\0"
-"lk\0nord-aurdal.no\0"
-"badajoz.museum\0gloppen.no\0dk.eu.org\0"
-"alsace\0selfip.biz\0\xd0\xba\xd0\xbe\xd0\xbc.\xd1\x80\xd1\x83\xd1\x81\0"
-"ma\0center\0"
-"lr\0heimatunduhren.museum\0"
-"ls\0mc\0"
-"lt\0md\0"
-"lu\0me\0"
-"lv\0"
-"mg\0uw.gov.pl\0smushcdn.com\0"
-"notaires.fr\0shikatsu.aichi.jp\0mh\0"
-"ly\0sucks\0"
-"mk\0"
-"ml\0tree.museum\0"
-"open\0"
-"mn\0santafe.museum\0filegear-ie.me\0"
-"iwaizumi.iwate.jp\0mo\0sm\xc3\xb8la.no\0\xd8\xa8\xd9\x8a\xd8\xaa\xd9\x83\0"
-"fukuoka.jp\0kamiichi.toyama.jp\0mp\0"
-"mq\0na\0"
-"mr\0"
-"to.it\0ms\0bilbao.museum\0nc\0lib.or.us\0"
-"kanazawa.ishikawa.jp\0mt\0instantcloud.cn\0"
-"minoh.osaka.jp\0kitayama.wakayama.jp\0mu\0ne\0"
-"mv\0nf\0vossevangen.no\0lib.ky.us\0"
-"mw\0ng\0"
-"mx\0"
-"le.it\0my\0ni\0"
-"mz\0"
-"v\xc3\xa5ler.hedmark.no\0"
-"nl\0x.mythic-beasts.com\0"
-"azumino.nagano.jp\0savannahga.museum\0"
-"no\0"
-"s3-eu-west-2.amazonaws.com\0us.org\0"
-"trading.aero\0"
-"nr\0"
-"leg.br\0servebeer.com\0"
-"sk.ca\0nu\0gdansk.pl\0"
-"communication.museum\0"
-"in-vpn.de\0"
-"app.os.fedoraproject.org\0"
-"nz\0mincom.tn\0locus\0"
-"from-nv.com\0"
-"snillfjord.no\0"
-"om\0"
-"of.by\0"
-"voagat.no\0pa\0"
-"krager\xc3\xb8.no\0"
-"dental\0"
-"pe\0"
-"pf\0"
-"murmansk.su\0"
-"ph\0mi.th\0"
-"kasai.hyogo.jp\0"
-"ishikawa.fukushima.jp\0pk\0"
-"niihama.ehime.jp\0pl\0"
-"pm\0de.eu.org\0"
-"pn\0"
-"qa\0"
-"pr\0"
-"ps\0to.md\0"
-"pt\0"
-"aeroport.fr\0bungoono.oita.jp\0fishing\0istmein.de\0"
-"sakai.ibaraki.jp\0ine.kyoto.jp\0"
-"pw\0"
-"py\0"
-"go.gov.br\0security\0"
-"bahn.museum\0"
-"actor\0"
-"teramo.it\0ishikawa.jp\0"
-"osakasayama.osaka.jp\0"
-"valledaosta.it\0"
-"edu.ac\0"
-"mi.us\0"
-"edu.af\0re\0"
-"molise.it\0id.us\0for.one\0"
-"allstate\0yokohama\0"
-"gallo\0"
-"natural.bo\0football\0"
-"edu.al\0*.on-rancher.cloud\0"
-"yonabaru.okinawa.jp\0"
-"ro\0remotewd.com\0"
-"edu.ba\0"
-"edu.ar\0edu.bb\0sa\0karacol.su\0"
-"sb\0"
-"rs\0sc\0copro.uk\0"
-"edu.au\0sd\0\xd7\xa7\xd7\x95\xd7\x9d\0"
-"ru\0se\0wales\0nh-serv.co.uk\0"
-"edu.bh\0rw\0sg\0kpn\0zsew.ru\0"
-"edu.bi\0sh\0tours\0"
-"edu.az\0turystyka.pl\0si\0"
-"loyalist.museum\0sj\0"
-"sk\0"
-"edu.bm\0sl\0"
-"edu.bn\0campidano-medio.it\0sm\0"
-"edu.bo\0abiko.chiba.jp\0sn\0"
-"so\0"
-"edu.br\0"
-"edu.bs\0sr\0from-ar.com\0"
-"edu.bt\0ss\0tc\0"
-"ulvik.no\0st\0td\0"
-"su\0"
-"narita.chiba.jp\0lubin.pl\0sv\0tf\0\xeb\x8b\xb7\xec\xbb\xb4\0"
-"tg\0"
-"edu.ci\0lakas.hu\0hamatonbetsu.hokkaido.jp\0judaica.museum\0sx\0th\0free\0"
-"edu.bz\0sy\0"
-"mil.ac\0sz\0tj\0"
-"tk\0"
-"mil.ae\0tl\0"
-"edu.cn\0tozsde.hu\0tm\0krd\0lat\0"
-"edu.co\0tn\0"
-"oizumi.gunma.jp\0to\0"
-"law\0"
-"ua\0"
-"tomika.gifu.jp\0tr\0"
-"mil.al\0"
-"edu.cu\0tt\0drive\0"
-"per.la\0"
-"edu.cw\0tv\0"
-"tw\0ug\0"
-"mil.ba\0"
-"mil.ar\0"
-"tz\0vuelos\0"
-"uk\0"
-"exchange.aero\0edu.dm\0shizukuishi.iwate.jp\0\xd9\x85\xd9\x88\xd9\x82\xd8\xb9\0s3.dualstack.us-east-1.amazonaws.com\0"
-"mashike.hokkaido.jp\0is-a-cubicle-slave.com\0githubusercontent.com\0"
-"edu.do\0nishi.fukuoka.jp\0"
-"mil.az\0va\0"
-"edu.ec\0user.aseinet.ne.jp\0"
-"kira.aichi.jp\0detroit.museum\0us\0vc\0"
-"edu.ee\0dedyn.io\0"
-"lib.sc.us\0ve\0"
-"mil.bo\0edu.eg\0tarui.gifu.jp\0"
-"vg\0"
-"lib.nv.us\0school\0"
-"mil.br\0edu.dz\0uy\0vi\0"
-"ac.ae\0uz\0tiffany\0service.gov.uk\0"
-"of.je\0"
-"valer.ostfold.no\0"
-"karasuyama.tochigi.jp\0nic.tj\0vn\0"
-"uvic.museum\0"
-"mil.by\0osteroy.no\0rybnik.pl\0"
-"edu.es\0"
-"mil.cl\0edu.et\0"
-"bg.it\0ngo.lk\0"
-"mil.cn\0vu\0"
-"mil.co\0wf\0"
-"globo\0"
-"ac.at\0"
-"ac.be\0per.nf\0*.on-k3s.io\0"
-"nyc.mn\0"
-"edu.fm\0lds\0"
-"nb.ca\0"
-"naturalhistory.museum\0"
-"nhs.uk\0"
-"agematsu.nagano.jp\0kazimierz-dolny.pl\0"
-"edu.gd\0ws\0servepics.com\0"
-"edu.ge\0"
-"mil.do\0"
-"edu.gh\0"
-"edu.gi\0"
-"tysfjord.no\0"
-"mil.ec\0kawaminami.miyazaki.jp\0"
-"edu.gl\0"
-"edu.gn\0ca.eu.org\0"
-"ac.ci\0mil.eg\0"
-"edu.gp\0"
-"ngo.ng\0"
-"edu.gr\0"
-"trust.museum\0"
-"ac.cn\0edu.gt\0"
-"edu.gu\0"
-"ye\0virtueeldomein.nl\0"
-"ac.cr\0essex.museum\0bykle.no\0"
-"edu.gy\0lifestyle\0"
-"edu.hk\0"
-"gunma.jp\0"
-"nakadomari.aomori.jp\0sagae.yamagata.jp\0ck.ua\0"
-"edu.hn\0monza-e-della-brianza.it\0gbiz\0"
-"ac.cy\0mel\xc3\xb8y.no\0porsanger.no\0from-az.net\0"
-"mil.fj\0selfip.com\0"
-"edu.ht\0"
-"yt\0"
-"lab.ms\0us.platform.sh\0"
-"yamada.iwate.jp\0"
-"\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86.ir\0"
-"obihiro.hokkaido.jp\0"
-"mil.ge\0"
-"edu.in\0zm\0"
-"texas.museum\0"
-"mil.gh\0bushey.museum\0app.render.com\0"
-"edu.iq\0kusatsu.gunma.jp\0"
-"ngo.ph\0adobeaemcloud.net\0"
-"edu.is\0singles\0"
-"edu.it\0"
-"supply\0"
-"rennesoy.no\0"
-"of.no\0"
-"zw\0"
-"hachirogata.akita.jp\0nakamichi.yamanashi.jp\0"
-"mibu.tochigi.jp\0bar2.net\0"
-"furano.hokkaido.jp\0"
-"mil.gt\0"
-"games\0"
-"edu.jo\0"
-"ac.fj\0"
-"ichinomiya.aichi.jp\0rahkkeravju.no\0health\0"
-"yugawa.fukushima.jp\0tokushima.tokushima.jp\0"
-"mil.hn\0h.se\0nic.za\0"
-"edu.kg\0jefferson.museum\0"
-"name.hr\0edu.ki\0"
-"cesena-forli.it\0ferrari\0"
-"mil.id\0ooshika.nagano.jp\0per.sg\0nflfan.org\0"
-"edu.km\0paroch.k12.ma.us\0bnpparibas\0"
-"\xe5\xa4\xa7\xe9\x98\xaa.jp\0edu.kn\0"
-"podhale.pl\0finance\0marine.ru\0"
-"shingu.wakayama.jp\0edu.kp\0"
-"edu.la\0winb.gov.pl\0sp.leg.br\0"
-"edu.lb\0eu-4.evennode.com\0"
-"edu.lc\0ens.tn\0"
-"ac.gn\0\xd8\xa8\xd8\xa7\xd8\xb1\xd8\xaa\0docs\0"
-"mil.in\0servegame.com\0"
-"edu.kw\0"
-"taiki.hokkaido.jp\0"
-"mil.iq\0edu.ky\0"
-"tomakomai.hokkaido.jp\0edu.kz\0gleeze.com\0"
-"name.et\0edu.lk\0"
-"sodegaura.chiba.jp\0"
-"name.fj\0karumai.iwate.jp\0"
-"bmd.br\0edu.lr\0dst.mi.us\0isteingeek.de\0"
-"edu.ls\0\xe5\x95\x86\xe6\xa0\x87\0"
-"edu.me\0"
-"\xe5\xb1\xb1\xe5\xbd\xa2.jp\0inami.wakayama.jp\0edu.lv\0"
-"mil.jo\0edu.mg\0lima-city.rocks\0"
-"munakata.fukuoka.jp\0\xd1\x81\xd0\xbe\xd1\x87\xd0\xb8.\xd1\x80\xd1\x83\xd1\x81\0"
-"edu.ly\0kvinesdal.no\0"
-"ac.id\0"
-"edu.mk\0"
-"edu.ml\0"
-"taketa.oita.jp\0nikko.tochigi.jp\0llc\0"
-"rg.it\0edu.mn\0lib.nj.us\0cisco\0cd.eu.org\0"
-"ibaraki.ibaraki.jp\0mil.kg\0edu.mo\0"
-"lib.ia.us\0google\0"
-"ac.il\0markets\0"
-"ac.im\0ukiha.fukuoka.jp\0gamo.shiga.jp\0edu.ms\0"
-"ac.in\0bulsan-s\xc3\xbc""dtirol.it\0im.it\0edu.mt\0"
-"mil.km\0page\0"
-"edu.mv\0"
-"edu.mw\0edu.ng\0lib.ak.us\0read\0dattolocal.net\0"
-"ac.ir\0edu.mx\0chernihiv.ua\0ddnsking.com\0"
-"edu.my\0edu.ni\0"
-"mil.kr\0edu.mz\0llp\0"
-"arboretum.museum\0"
-"kin.okinawa.jp\0"
-"app.os.stg.fedoraproject.org\0"
-"qc.ca\0name.cy\0"
-"atsuma.hokkaido.jp\0"
-"mil.kz\0historical.museum\0edu.nr\0"
-"hinohara.tokyo.jp\0"
-"ac.jp\0col.ng\0"
-"kunst.museum\0dnshome.de\0"
-"campinas.br\0uruma.okinawa.jp\0"
-"ac.ke\0"
-"h\xc3\xb8yanger.no\0"
-"trentinoa-adige.it\0edu.om\0"
-"name.eg\0kasaoka.okayama.jp\0mil.lv\0"
-"mil.mg\0"
-"ln.cn\0tochigi.jp\0"
-"contemporary.museum\0edu.pa\0"
-"nagiso.nagano.jp\0sortland.no\0eu-3.evennode.com\0"
-"hi.cn\0kutchan.hokkaido.jp\0"
-"theworkpc.com\0"
-"edu.pe\0weatherchannel\0"
-"berlevag.no\0edu.pf\0"
-"rollag.no\0banamex\0"
-"tenei.fukushima.jp\0ac.kr\0edu.ph\0um.gov.pl\0cloudcontrolapp.com\0"
-"cnpy.gdn\0"
-"kure.hiroshima.jp\0edu.pk\0"
-"edu.pl\0"
-"broker.aero\0"
-"yokawa.hyogo.jp\0mil.mv\0edu.pn\0c66.me\0"
-"mil.ng\0"
-"name.az\0ac.lk\0mil.my\0mil.ni\0edu.qa\0"
-"mil.mz\0edu.pr\0anquan\0republican\0"
-"edu.ps\0"
-"edu.pt\0"
-"ama.aichi.jp\0lol\0"
-"ac.ma\0mil.no\0"
-"rovigo.it\0ac.ls\0edu.py\0"
-"ac.me\0jfk.museum\0scotland.museum\0\xc3\xb8rskog.no\0nv.us\0"
-"itami.hyogo.jp\0"
-"fl.us\0"
-"mil.nz\0"
-"kiwi\0"
-"custom.metacentrum.cz\0"
-"lpl\0dnsalias.com\0github.io\0fi.cloudplatform.fi\0"
-"qld.au\0"
-"bahcavuotna.no\0cc.vi.us\0"
-"tas.gov.au\0karelia.su\0"
-"ac.mu\0"
-"mr.no\0"
-"ac.mw\0mil.pe\0"
-"cc.mo.us\0"
-"ac.ni\0"
-"hidaka.saitama.jp\0ac.mz\0mil.ph\0"
-"edu.sa\0"
-"edu.sb\0\xe0\xa4\xa8\xe0\xa5\x87\xe0\xa4\x9f\0"
-"edu.rs\0edu.sc\0"
-"q.bg\0mil.pl\0edu.sd\0"
-"edu.ru\0"
-"draydns.de\0"
-"edu.sg\0"
-"padova.it\0man\0geekgalaxy.com\0"
-"imakane.hokkaido.jp\0mil.qa\0feedback\0"
-"map\0"
-"miyota.nagano.jp\0ngo.za\0mba\0"
-"edu.sl\0"
-"edu.sn\0"
-"edu.so\0"
-"ac.nz\0"
-"kanzaki.saga.jp\0mil.py\0"
-"eu-2.evennode.com\0"
-"edu.ss\0"
-"rad\xc3\xb8y.no\0edu.st\0"
-"tokigawa.saitama.jp\0"
-"edu.sv\0"
-"ac.pa\0events\0tiaa\0"
-"us.gov.pl\0"
-"edu.sy\0"
-"edu.tj\0telebit.app\0"
-"edu.tm\0"
-"arvo.network\0"
-"edu.to\0"
-"edu.ua\0"
-"edu.tr\0jele.io\0"
-"hikawa.shimane.jp\0edu.tt\0"
-"edu.tw\0"
-"ac.pr\0cooking\0firebaseapp.com\0"
-"minnesota.museum\0paleo.museum\0"
-"lundbeck\0"
-"quicksytes.com\0"
-"mil.ru\0"
-"morena.br\0towada.aomori.jp\0l\xc3\xb8renskog.no\0ltd\0"
-"mil.rw\0"
-"mil.sh\0study\0"
-"nowruz\0"
-"computer\0"
-"edu.vc\0"
-"\xe4\xbd\x9b\xe5\xb1\xb1\0s3-website-ap-southeast-1.amazonaws.com\0"
-"edu.ve\0"
-"pordenone.it\0lib.gu.us\0"
-"kristiansund.no\0folionetwork.site\0"
-"edu.uy\0"
-"sand\xc3\xb8y.no\0airbus\0"
-"ct.it\0mil.st\0"
-"service.one\0"
-"edu.vn\0med\0"
-"dattorelay.com\0"
-"mil.sy\0"
-"mil.tj\0"
-"nakama.fukuoka.jp\0"
-"mil.tm\0edu.vu\0b.ssl.fastly.net\0"
-"oto.fukuoka.jp\0"
-"bonn.museum\0mil.to\0reit\0"
-"coastaldefence.museum\0men\0"
-"ac.rs\0"
-"oamishirasato.chiba.jp\0kvam.no\0mil.tr\0"
-"ac.se\0ac.ru\0"
-"shirakawa.fukushima.jp\0"
-"kawai.iwate.jp\0ac.rw\0"
-"mil.tw\0"
-"mil.tz\0eu-1.evennode.com\0"
-"edu.ws\0"
-"sado.niigata.jp\0"
-"\xe3\x82\xb3\xe3\x83\xa0\0"
-"nakamura.kochi.jp\0montreal.museum\0"
-"engineering\0"
-"s\xc3\xb8r-odal.no\0brussels\0"
-"elk.pl\0mil.vc\0"
-"iki.nagasaki.jp\0"
-"mil.ve\0"
-"ac.th\0"
-"ac.sz\0ac.tj\0"
-"mil.uy\0"
-"jls-sto1.elastx.net\0"
-"loabat.no\0edu.ye\0"
-"sakyo.kyoto.jp\0toyonaka.osaka.jp\0"
-"fukumitsu.toyama.jp\0hembygdsforbund.museum\0"
-"muncie.museum\0"
-"ac.ug\0"
-"mill.museum\0"
-"hayashima.okayama.jp\0"
-"ac.tz\0"
-"wa.gov.au\0ac.uk\0edu.za\0"
-"pars\0eu-west-3.elasticbeanstalk.com\0"
-"t3l3p0rt.net\0"
-"it1.eur.aruba.jenv-aruba.cloud\0"
-"joyo.kyoto.jp\0"
-"matsushima.miyagi.jp\0kainan.wakayama.jp\0"
-"praxi\0"
-"edu.zm\0xnbay.com\0"
-"lombardia.it\0konan.aichi.jp\0"
-"johana.toyama.jp\0kerrylogistics\0"
-"scientist.aero\0broadway\0dyndns-mail.com\0"
-"ac.vn\0"
-"shibuya.tokyo.jp\0mil\0"
-"fastblog.net\0"
-"cyon.link\0"
-"asmatart.museum\0"
-"fukaya.saitama.jp\0mil.ye\0"
-"mit\0"
-"kanie.aichi.jp\0"
-"toki.gifu.jp\0"
-"rent\0"
-"alt.za\0"
-"\xe0\xb8\xa8\xe0\xb8\xb6\xe0\xb8\x81\xe0\xb8\xa9\xe0\xb8\xb2.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0mil.za\0"
-"ddnss.de\0"
-"nakanojo.gunma.jp\0"
-"accenture\0"
-"n\xc3\xa5\xc3\xa5mesjevuemie.no\0"
-"theater\0readmyblog.org\0"
-"*.uberspace.de\0"
-"etajima.hiroshima.jp\0kamaishi.iwate.jp\0familyds.com\0"
-"name.vn\0mil.zm\0paas.datacenter.fi\0"
-"workinggroup.aero\0s\xc3\xb8ndre-land.no\0"
-"tottori.jp\0svizzera.museum\0"
-"digital\0"
-"miyako.iwate.jp\0"
-"nakijin.okinawa.jp\0"
-"mlb\0"
-"space.museum\0"
-"maibara.shiga.jp\0"
-"mil.zw\0"
-"gs.ol.no\0"
-"artcenter.museum\0shiksha\0"
-"campania.it\0"
-"vindafjord.no\0ac.za\0"
-"12hp.de\0"
-"hasuda.saitama.jp\0osen.no\0"
-"mma\0"
-"git-repos.de\0"
-"mls\0"
-"ge.it\0uchinomi.kagawa.jp\0"
-"kani.gifu.jp\0"
-"nagato.yamaguchi.jp\0name.tj\0"
-"koto.shiga.jp\0marburg.museum\0\xc3\xb8stre-toten.no\0golffan.us\0"
-"kawaue.gifu.jp\0kamisu.ibaraki.jp\0ac.zm\0"
-"ringsaker.no\0"
-"we.bs\0"
-"dyndns.tv\0"
-"shinkamigoto.nagasaki.jp\0name.tr\0"
-"name.tt\0"
-"ac.zw\0"
-"\xc4\x8d\xc3\xa1hcesuolo.no\0boats\0"
-"tur.ar\0mizusawa.iwate.jp\0"
-"manchester.museum\0dyndns-at-work.com\0"
-"12hp.at\0"
-"kitanakagusuku.okinawa.jp\0"
-"cust.retrosnub.co.uk\0"
-"ogaki.gifu.jp\0"
-"tennis\0here-for-more.info\0"
-"mer\xc3\xa5ker.no\0moe\0"
-"act.edu.au\0\xe9\x9d\x99\xe5\xb2\xa1.jp\0fuso.aichi.jp\0"
-"psp.gov.pl\0"
-"moi\0"
-"tur.br\0"
-"lucca.it\0blog\0"
-"sic.it\0"
-"kr\xc3\xa5""anghke.no\0kep.tr\0mom\0rest\0"
-"shichikashuku.miyagi.jp\0"
-"gotdns.com\0"
-"vads\xc3\xb8.no\0""12hp.ch\0"
-"asti.it\0"
-"feste-ip.net\0"
-"tx.us\0"
-"mov\0"
-"muni.il\0ohda.shimane.jp\0mazowsze.pl\0"
-"toho.fukuoka.jp\0dyndns.ws\0"
-"shimada.shizuoka.jp\0funahashi.toyama.jp\0"
-"society.museum\0hi.us\0"
-"rifu.miyagi.jp\0"
-"ct.us\0"
-"nab\0"
-"takamori.nagano.jp\0"
-"cc.wv.us\0"
-"st.no\0"
-"shimane.jp\0citic\0"
-"sakurai.nara.jp\0"
-"reklam.hu\0\xe6\x84\x9b\xe7\x9f\xa5.jp\0aurland.no\0"
-"trentino.it\0mobi\0"
-"iijima.nagano.jp\0direct.quickconnect.to\0"
-"name.qa\0"
-"name.pr\0"
-"flora.no\0"
-"nba\0s3-website.ap-northeast-2.amazonaws.com\0"
-"fortworth.museum\0\xe6\xb8\xb8\xe6\x88\x8f\0"
-"matsubushi.saitama.jp\0"
-"sld.do\0"
-"insure\0s3-ap-southeast-1.amazonaws.com\0"
-"name.na\0"
-"yachiyo.ibaraki.jp\0tips\0my-vigor.de\0"
-"\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
-"moareke.no\0bloger.id\0"
-"office-on-the.net\0demo.jelastic.com\0"
-"name.mv\0"
-"name.ng\0moda\0msd\0"
-"name.my\0"
-"hirosaki.aomori.jp\0fr\xc3\xb8ya.no\0"
-"cranbrook.museum\0"
-"gyokuto.kumamoto.jp\0"
-"eun.eg\0"
-"ch.eu.org\0"
-"barletta-trani-andria.it\0"
-"jogasz.hu\0tamatsukuri.ibaraki.jp\0ny-2.paas.massivegrid.net\0"
-"lib.wi.us\0"
-"s3.dualstack.ap-northeast-2.amazonaws.com\0"
-"mattel\0mtn\0"
-"lib.ms.us\0lib.nc.us\0"
-"mtr\0*.svc.firenet.ch\0"
-"nec\0"
-"r\xc3\xb8mskog.no\0"
-"bearalvahki.no\0"
-"ogata.akita.jp\0"
-"blue\0"
-"al.it\0marshalls\0"
-"tsukiyono.gunma.jp\0from-fl.com\0"
-"furubira.hokkaido.jp\0"
-"synology-ds.de\0"
-"nagasaki.jp\0"
-"net\0"
-"humanities.museum\0"
-"sakawa.kochi.jp\0new\0"
-"name.mk\0"
-"americana.museum\0gda.pl\0"
-"nfl\0"
-"stavanger.no\0caseih\0"
-"koriyama.fukushima.jp\0"
-"cymru\0"
-"tomioka.gunma.jp\0sykkylven.no\0"
-"snaase.no\0"
-"uki.kumamoto.jp\0storfjord.no\0"
-"redumbrella\0tempurl.host\0"
-"\xe0\xb8\xad\xe0\xb8\x87\xe0\xb8\x84\xe0\xb9\x8c\xe0\xb8\x81\xe0\xb8\xa3.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0mycloud.by\0"
-"abbvie\0"
-"e164.arpa\0"
-"name.jo\0miyako.fukuoka.jp\0miyazaki.miyazaki.jp\0taira.toyama.jp\0ventures\0*.cns.joyent.com\0"
-"iiyama.nagano.jp\0"
-"fukui.jp\0"
-"ngo\0"
-"public.museum\0"
-"union.aero\0denmark.museum\0"
-"telekommunikation.museum\0"
-"wy.us\0to.leg.br\0"
-"circus.museum\0"
-"nhk\0"
-"barsy.co.uk\0"
-"salud.bo\0"
-"noticias.bo\0shingu.fukuoka.jp\0\xe6\x9c\xba\xe6\x9e\x84\0"
-"miyoshi.aichi.jp\0"
-"travelers\0"
-"amsw.nl\0"
-"ishinomaki.miyagi.jp\0"
-"swiss\0"
-"huissier-justice.fr\0"
-"kushima.miyazaki.jp\0"
-"pug.it\0"
-"amfam\0"
-"pccw\0"
-"tagajo.miyagi.jp\0"
-"onagawa.miyagi.jp\0"
-"cc.nh.us\0"
-"localhistory.museum\0"
-"mosvik.no\0yali.mythic-beasts.com\0"
-"joso.ibaraki.jp\0"
-"sanok.pl\0k12.va.us\0"
-"inazawa.aichi.jp\0circle\0"
-"z.bg\0"
-"al.no\0"
-"cloudjiffy.net\0"
-"5.bg\0forli-cesena.it\0"
-"on-web.fr\0"
-"shimizu.hokkaido.jp\0shonai.yamagata.jp\0myqnapcloud.com\0"
-"basilicata.it\0ozora.hokkaido.jp\0tokamachi.niigata.jp\0"
-"gen.mi.us\0adygeya.su\0basicserver.io\0"
-"volda.no\0reg.dk\0"
-"\xe7\x9f\xb3\xe5\xb7\x9d.jp\0bplaced.de\0"
-"nichinan.miyazaki.jp\0gmail\0"
-"fujiyoshida.yamanashi.jp\0"
-"utwente.io\0"
-"from-wi.com\0"
-"m\xc3\xa5s\xc3\xb8y.no\0at.eu.org\0"
-"dyndns.ddnss.de\0"
-"is-an-actor.com\0\xd0\xbc\xd1\x81\xd0\xba.\xd1\x80\xd1\x83\xd1\x81\0"
-"rochester.museum\0gol.no\0lier.no\0"
-"izumi.kagoshima.jp\0nord-odal.no\0"
-"mitake.gifu.jp\0"
-"toyako.hokkaido.jp\0skedsmokorset.no\0ic.gov.pl\0"
-"small-web.org\0"
-"arendal.no\0"
-"sakado.saitama.jp\0\xc3\xa5s.no\0"
-"topology.museum\0"
-"va.it\0"
-"rishirifuji.hokkaido.jp\0"
-"s3.dualstack.ca-central-1.amazonaws.com\0"
-"aju.br\0warabi.saitama.jp\0olecko.pl\0hangout\0"
-"from-il.com\0"
-"*.nom.br\0"
-"sld.pa\0graphics\0"
-"shiiba.miyazaki.jp\0nagai.yamagata.jp\0yandex\0"
-"shimotsuma.ibaraki.jp\0"
-"samsclub\0"
-"takatsuki.shiga.jp\0"
-"adygeya.ru\0"
-"vic.au\0"
-"uzs.gov.pl\0"
-"modalen.no\0lynx.mythic-beasts.com\0"
-"calvinklein\0we.tc\0community-pro.net\0"
-"lowicz.pl\0"
-"eu.meteorapp.com\0"
-"platterp.us\0"
-"scholarships\0pimienta.org\0"
-"safety.aero\0"
-"theatre\0"
-"tm.cy\0viterbo.it\0"
-"akaiwa.okayama.jp\0travelersinsurance\0"
-"lebork.pl\0"
-"gen.in\0"
-"andria-barletta-trani.it\0run.app\0"
-"now\0"
-"*.stolos.io\0"
-"mad.museum\0cloud66.zone\0"
-"fidelity\0"
-"tm.dz\0autos\0wbq.me\0"
-"ibigawa.gifu.jp\0"
-"cleverapps.io\0"
-"ena.gifu.jp\0turek.pl\0"
-"marketing\0"
-"sennan.osaka.jp\0pruszkow.pl\0edu.krd\0"
-"seg.br\0"
-"al.us\0"
-"is-very-nice.org\0dynvpn.de\0"
-"va.no\0"
-"asaminami.hiroshima.jp\0"
-"miho.ibaraki.jp\0bellevue.museum\0"
-"nra\0"
-"saltdal.no\0click\0"
-"tm.fr\0cc.md.us\0"
-"\xd0\xbc\xd0\xb8\xd1\x80.\xd1\x80\xd1\x83\xd1\x81\0"
-"guovdageaidnu.no\0"
-"pro.az\0obi\0"
-"f.bg\0"
-"art.museum\0k12.pr.us\0from-me.org\0"
-"myddns.rocks\0"
-"pro.br\0rnu.tn\0"
-"trentino-aadige.it\0"
-"matsuzaki.shizuoka.jp\0elvendrell.museum\0ostre-toten.no\0"
-"nrw\0"
-"fuossko.no\0"
-"weather\0"
-"hol.no\0"
-"moto\0"
-"32-b.it\0"
-"muosat.no\0ae.org\0""2038.io\0"
-"lexus\0"
-"pro.cy\0tm.hu\0trapani.it\0blogspot.com\0"
-"hirata.fukushima.jp\0"
-"center.museum\0lur\xc3\xb8y.no\0gen.ng\0"
-"christiansburg.museum\0"
-"minamiawaji.hyogo.jp\0"
-"pro.ec\0kihoku.ehime.jp\0"
-"ntt\0"
-"kitagata.gifu.jp\0"
-"chase\0"
-"vibo-valentia.it\0"
-"milan.it\0fujieda.shizuoka.jp\0sport\0"
-"equipment\0"
-"lc.it\0"
-"mat.br\0gen.nz\0kaufen\0"
-"nt.au\0neyagawa.osaka.jp\0"
-"ci.it\0kaizuka.osaka.jp\0"
-"off\0mangyshlak.su\0"
-"expert\0"
-"tokai.aichi.jp\0"
-"deporte.bo\0pro.fj\0"
-"nt.ca\0*.advisor.ws\0be.ax\0"
-"tm.km\0"
-"es.gov.br\0pvt.ge\0giving\0"
-"heguri.nara.jp\0"
-"cloudycluster.net\0"
-"berlev\xc3\xa5g.no\0"
-"sande.more-og-romsdal.no\0"
-"bc.platform.sh\0"
-"fj.cn\0county.museum\0"
-"oseto.nagasaki.jp\0preservation.museum\0"
-"skaun.no\0"
-"gonohe.aomori.jp\0nakatane.kagoshima.jp\0"
-"hatoyama.saitama.jp\0tm.mc\0ownprovider.com\0"
-"tm.mg\0"
-"kharkiv.ua\0zhytomyr.ua\0"
-"ip6.arpa\0"
-"\xe5\x8d\x83\xe8\x91\x89.jp\0"
-"vald-aosta.it\0national.museum\0barum.no\0"
-"va.us\0"
-"pro.ht\0nyc\0"
-"nissan\0"
-"nishihara.okinawa.jp\0"
-"aosta.it\0grandrapids.museum\0"
-"karasjok.no\0"
-"sener\0"
-"oji.nara.jp\0"
-"matsuno.ehime.jp\0l\xc3\xb8ten.no\0"
-"nissay\0"
-"mihara.kochi.jp\0tm.no\0"
-"ismaili\0"
-"frogn.no\0fnwk.site\0dyn.ddnss.de\0"
-"virginia.museum\0taipei\0"
-"far.br\0"
-"fund\0"
-"okinawa.okinawa.jp\0skjak.no\0"
-"rome.it\0"
-"sdn.gov.pl\0"
-"z.se\0"
-"notogawa.shiga.jp\0gen.tr\0"
-"joetsu.niigata.jp\0"
-"stj\xc3\xb8rdalshalsen.no\0\xe9\xa6\x99\xe6\xa0\xbc\xe9\x87\x8c\xe6\x8b\x89\0"
-"tcm.museum\0"
-"seihi.nagasaki.jp\0gent\0"
-"tm.pl\0"
-"trentinosuedtirol.it\0tobetsu.hokkaido.jp\0"
-"*.awdev.ca\0"
-"capetown\0"
-"atlanta.museum\0mmafan.biz\0"
-"s3-fips-us-gov-west-1.amazonaws.com\0balashov.su\0"
-"restaurant\0"
-"zagan.pl\0"
-"kamagaya.chiba.jp\0sharp\0"
-"be.gy\0"
-"definima.net\0"
-"mjondalen.no\0"
-"rocks\0"
-"reliance\0"
-"gs.sf.no\0"
-"bygland.no\0"
-"nagaoka.niigata.jp\0"
-"myforum.community\0"
-"si.it\0lib.oh.us\0"
-"pro.na\0"
-"tm.ro\0naturbruksgymn.se\0oncilla.mythic-beasts.com\0*.sys.qcx.io\0"
-"au.eu.org\0be.eu.org\0"
-"aostavalley.it\0linz.museum\0pro.mv\0one\0"
-"usa.oita.jp\0levanger.no\0"
-"ikeda.hokkaido.jp\0ong\0"
-"tm.se\0"
-"ox.rs\0"
-"przeworsk.pl\0"
-"chitose.hokkaido.jp\0onl\0"
-"tomobe.ibaraki.jp\0usuki.oita.jp\0analytics\0"
-"matsue.shimane.jp\0"
-"mp.br\0tokuyama.yamaguchi.jp\0hzc.io\0"
-"*.compute.amazonaws.com.cn\0damnserver.com\0"
-"kids.us\0"
-"maintenance.aero\0"
-"creditcard\0"
-"barsy.me\0"
-"fedje.no\0"
-"pro.om\0"
-"nishiawakura.okayama.jp\0ooo\0"
-"ibaraki.jp\0akkeshi.hokkaido.jp\0"
-"maison\0"
-"\xe7\xa7\x8b\xe7\x94\xb0.jp\0obama.nagasaki.jp\0hagi.yamaguchi.jp\0troitsk.su\0wien.funkfeuer.at\0"
-"stargard.pl\0"
-"bostik\0"
-"g.vbrplsbx.io\0"
-"us-east-2.elasticbeanstalk.com\0"
-"gifu.gifu.jp\0ks.ua\0"
-"azerbaijan.su\0"
-"westus2.azurestaticapps.net\0"
-"hjartdal.no\0"
-"pro.pr\0"
-"\xe5\xbe\xae\xe5\x8d\x9a\0"
-"enna.it\0goodyear\0"
-"association.aero\0consulting.aero\0ks.us\0"
-"jewelry.museum\0bridgestone\0"
-"wakasa.fukui.jp\0"
-"maceio.br\0ryd.wafaicloud.com\0"
-"tado.mie.jp\0"
-"\xe0\xb4\xad\xe0\xb4\xbe\xe0\xb4\xb0\xe0\xb4\xa4\xe0\xb4\x82\0motorcycles\0okinawa\0\xe5\x98\x89\xe9\x87\x8c\xe5\xa4\xa7\xe9\x85\x92\xe5\xba\x97\0"
-"bg.eu.org\0"
-"au.cloudswitches.com\0"
-"goshiki.hyogo.jp\0org\0"
-"pay\0"
-"nt.no\0from-wy.com\0"
-"rep.br\0"
-"itoman.okinawa.jp\0theater.museum\0"
-"flt.cloud.muni.cz\0"
-"seiyo.ehime.jp\0vanylven.no\0k12.vt.us\0"
-"apartments\0"
-"halloffame.museum\0is-a-linux-user.org\0"
-"okuizumo.shimane.jp\0"
-"cc.ar.us\0"
-"maizuru.kyoto.jp\0"
-"\xe7\xbb\x84\xe7\xbb\x87\xe6\x9c\xba\xe6\x9e\x84\0"
-"f.se\0"
-"eco.br\0assn.lk\0"
-"ppg.br\0izu.shizuoka.jp\0"
-"valer.hedmark.no\0"
-"with.marketing\0"
-"dubai\0"
-"mito.ibaraki.jp\0"
-"akita.jp\0"
-"tanabe.wakayama.jp\0sling\0"
-"hanggliding.aero\0nakai.kanagawa.jp\0graz.museum\0"
-"in-brb.de\0"
-"bryansk.su\0"
-"kviteseid.no\0"
-"b\xc3\xa1jddar.no\0"
-"glass.museum\0pasadena.museum\0"
-"\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xdb\x8c\xd8\xa9\0jls-sto2.elastx.net\0now.sh\0"
-"shimonita.gunma.jp\0gjerstad.no\0"
-"meraker.no\0\xd1\x81\xd0\xb0\xd0\xbc\xd0\xb0\xd1\x80\xd0\xb0.\xd1\x80\xd1\x83\xd1\x81\0"
-"frosta.no\0pro.tt\0"
-"trentinos\xc3\xbc""d-tirol.it\0vestvagoy.no\0tm.za\0ott\0"
-"temp-dns.com\0"
-"\xe7\xa6\x8f\xe4\xba\x95.jp\0mysecuritycamera.net\0"
-"avocat.fr\0swidnica.pl\0"
-"ogawa.nagano.jp\0"
-"trentin-sud-tirol.it\0lib.ri.us\0is-leet.com\0from.marketing\0"
-"osaka.jp\0kilatiron.com\0"
-"tv.bb\0re.it\0realm.cz\0*.transurl.be\0"
-"soeda.fukuoka.jp\0"
-"matsudo.chiba.jp\0"
-"pet\0"
-"bofa\0"
-"skype\0"
-"ovh\0"
-"boston\0wpmudev.host\0"
-"nt.ro\0collegefan.org\0"
-"aso.kumamoto.jp\0blockbuster\0"
-"inami.toyama.jp\0"
-"yk.ca\0pro.vn\0"
-"tv.bo\0rodeo\0"
-"tv.br\0\xe9\xab\x98\xe7\x9f\xa5.jp\0ath.cx\0"
-"\xe8\x8c\xa8\xe5\x9f\x8e.jp\0tokoname.aichi.jp\0"
-"myshopblocks.com\0"
-"nishikatsura.yamanashi.jp\0\xe0\xb8\x98\xe0\xb8\xb8\xe0\xb8\xa3\xe0\xb8\x81\xe0\xb8\xb4\xe0\xb8\x88.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
-"is-a-player.com\0"
-"anan.nagano.jp\0"
-"agency\0"
-"odawara.kanagawa.jp\0"
-"numata.gunma.jp\0chtr.k12.ma.us\0"
-"kawakami.nagano.jp\0re.kr\0"
-"barsy.uk\0"
-"tsuru.yamanashi.jp\0dielddanuorri.no\0"
-"kujukuri.chiba.jp\0york.museum\0"
-"phd\0hr.eu.org\0"
-"hamura.tokyo.jp\0"
-"geometre-expert.fr\0from-ak.com\0"
-"friuli-venezia-giulia.it\0od.ua\0natura\0"
-"shiki.saitama.jp\0"
-"fvg.it\0pid\0"
-"s3-ap-south-1.amazonaws.com\0"
-"arteducation.museum\0foodnetwork\0"
-"sologne.museum\0sund.no\0"
-"mifune.kumamoto.jp\0sano.tochigi.jp\0"
-"kalmykia.su\0*.firenet.ch\0"
-"takahama.fukui.jp\0direct\0is-an-artist.com\0"
-"shimokitayama.nara.jp\0pin\0"
-"*.transurl.eu\0"
-"wiih.gov.pl\0"
-"american.museum\0"
-"co.technology\0"
-"toyota.yamaguchi.jp\0ferrero\0"
-"higashiizu.shizuoka.jp\0ivano-frankivsk.ua\0mypets.ws\0"
-"inashiki.ibaraki.jp\0balsfjord.no\0khakassia.su\0"
-"nagoya\0"
-"karlsoy.no\0"
-"textile.museum\0"
-"pors\xc3\xa1\xc5\x8bgu.no\0"
-"volvo\0"
-"*.bd\0o.bg\0"
-"aa.no\0"
-"rep.kp\0"
-"matsuda.kanagawa.jp\0shiroishi.saga.jp\0"
-"sklep.pl\0"
-"bungotakada.oita.jp\0"
-"gateway.museum\0"
-"cust.testing.thingdust.io\0"
-"vote\0"
-"minakami.gunma.jp\0"
-"kitaakita.akita.jp\0name\0webhop.info\0"
-"asahi.toyama.jp\0"
-"kalmykia.ru\0"
-"omachi.saga.jp\0"
-"*.ck\0voto\0"
-"hobby-site.org\0"
-"consulting\0"
-"dnipropetrovsk.ua\0"
-"\xd0\xbe\xd1\x80\xd0\xb3.\xd1\x81\xd1\x80\xd0\xb1\0"
-"oya.to\0"
-"ski.no\0"
-"tv.im\0"
-"alibaba\0"
-"art.br\0"
-"resistance.museum\0is-a-lawyer.com\0"
-"tv.it\0pnc\0"
-"rj.leg.br\0"
-"bond\0"
-"orkdal.no\0overhalla.no\0stord.no\0"
-"tomigusuku.okinawa.jp\0"
-"hamamatsu.shizuoka.jp\0"
-"nishiwaki.hyogo.jp\0watch-and-clock.museum\0"
-"cr.it\0shinshiro.aichi.jp\0"
-"rich\0"
-"nat.tn\0servegame.org\0"
-"omiya.saitama.jp\0"
-"*.er\0"
-"bel.tr\0tv.kg\0"
-"durham.museum\0"
-"collection.museum\0"
-"\xe5\xb2\x90\xe9\x98\x9c.jp\0iwate.iwate.jp\0"
-"art.do\0nationalfirearms.museum\0"
-"empresa.bo\0saobernardo.br\0gc.ca\0*.fk\0hemnes.no\0"
-"riobranco.br\0hanawa.fukushima.jp\0hurdal.no\0book\0"
-"sagamihara.kanagawa.jp\0"
-"idnblogger.com\0"
-"df.leg.br\0"
-"chikugo.fukuoka.jp\0impertrix.com\0"
-"forl\xc3\xac""cesena.it\0"
-"jx.cn\0art.dz\0"
-"uz.ua\0"
-"chikuma.nagano.jp\0"
-"aurskog-h\xc3\xb8land.no\0"
-"melhus.no\0"
-"qld.edu.au\0bronnoy.no\0"
-"williamsburg.museum\0"
-"hyundai\0"
-"from-ri.com\0"
-"boleslawiec.pl\0"
-"ggee\0"
-"tv.na\0"
-"izena.okinawa.jp\0"
-"flog.br\0okuma.fukushima.jp\0asahi.mie.jp\0primetel.cloud\0"
-"florence.it\0chiyoda.gunma.jp\0"
-"*.transurl.nl\0"
-"\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xdb\x8c\xdb\x83\0"
-"kayabe.hokkaido.jp\0memorial\0ham-radio-op.net\0customer.speedpartner.de\0diskstation.org\0"
-"duckdns.org\0"
-"pro\0s3.dualstack.ap-south-1.amazonaws.com\0uk.com\0mine.nu\0"
-"shimogo.fukushima.jp\0yasugi.shimane.jp\0"
-"uto.kumamoto.jp\0"
-"sandnessjoen.no\0"
-"pru\0"
-"herad.no\0cc.ky.us\0vapor.cloud\0"
-"kr\xc3\xb8""dsherad.no\0"
-"jpmorgan\0"
-"enf.br\0"
-"cc.co.us\0"
-"*.jm\0"
-"art.ht\0"
-"loab\xc3\xa1t.no\0"
-"shiroi.chiba.jp\0"
-"vlog.br\0americanart.museum\0"
-"yamatotakada.nara.jp\0\xc3\xb8rland.no\0"
-"hu.net\0"
-"ashiya.hyogo.jp\0*.kh\0press\0"
-"kawahara.tottori.jp\0d.gv.vc\0barsy.bg\0"
-"csx.cc\0"
-"biz.bb\0"
-"biz.at\0"
-"pub\0"
-"mol.it\0"
-"westfalen.museum\0"
-"takahagi.ibaraki.jp\0barsy.ca\0"
-"biz.az\0kashima.ibaraki.jp\0godaddy\0"
-"schokoladen.museum\0"
-"ogano.saitama.jp\0"
-"otaki.nagano.jp\0sakura\0"
-"realty\0"
-"nationwide\0"
-"sr.it\0properties\0"
-"tamaki.mie.jp\0"
-"barsy.de\0"
-"urbinopesaro.it\0navy\0certmgr.org\0"
-"it.ao\0"
-"*.mm\0"
-"hakui.ishikawa.jp\0"
-"tv.sd\0pwc\0software\0"
-"bn.it\0"
-"biz.cy\0trentin-sudtirol.it\0taito.tokyo.jp\0"
-"\xe4\xb8\xad\xe4\xbf\xa1\0"
-"biz.dk\0"
-"brasil.museum\0"
-"asnes.no\0scrapping.cc\0"
-"jcloud-ver-jpc.ik-server.com\0"
-"nyan.to\0"
-"pisz.pl\0"
-"prd.fr\0"
-"*.np\0"
-"karaganda.su\0"
-"co.events\0"
-"gemological.museum\0intelligence.museum\0"
-"hapmir.no\0"
-"barsy.eu\0"
-"pleskns.com\0"
-"nanbu.yamanashi.jp\0"
-"undersea.museum\0"
-"kita.kyoto.jp\0progressive\0"
-"1337.pictures\0"
-"biz.et\0tsuga.tochigi.jp\0tv.tr\0dynns.com\0"
-"sch.ae\0"
-"higashiyodogawa.osaka.jp\0gratangen.no\0"
-"ma.gov.br\0"
-"yabuki.fukushima.jp\0"
-"biz.fj\0"
-"nerdpol.ovh\0"
-"tv.tz\0"
-"anani.br\0*.pg\0"
-"decorativearts.museum\0gallery.museum\0tokke.no\0cr.ua\0"
-"yamagata.yamagata.jp\0"
-"tenri.nara.jp\0homeip.net\0"
-"mymediapc.net\0"
-"tochigi.tochigi.jp\0eu.org\0"
-"ostroda.pl\0"
-"cherkasy.ua\0s3.ca-central-1.amazonaws.com\0"
-"googlecode.com\0co.education\0"
-"shiranuka.hokkaido.jp\0"
-"yokosuka.kanagawa.jp\0hokuto.yamanashi.jp\0"
-"biz.gl\0"
-"kyoto.jp\0curv.dev\0"
-"amica\0"
-"sk\xc3\xa1nit.no\0style\0"
-"corsica\0"
-"amusement.aero\0"
-"ogose.saitama.jp\0science\0"
-"toyotsu.fukuoka.jp\0ostrowwlkp.pl\0suwalki.pl\0"
-"art.pl\0"
-"mymailer.com.tw\0"
-"aizumi.tokushima.jp\0sunndal.no\0"
-"unazuki.toyama.jp\0cloudcontrolled.com\0"
-"biz.id\0"
-"k12.ny.us\0"
-"clic2000.net\0barsy.in\0"
-"togura.nagano.jp\0\xd1\x81\xd0\xb0\xd0\xb9\xd1\x82\0il.eu.org\0barsy.io\0"
-"miyoshi.saitama.jp\0o.se\0"
-"*.sapporo.jp\0"
-"yamatokoriyama.nara.jp\0"
-"graphox.us\0"
-"kagamiishi.fukushima.jp\0hizen.saga.jp\0"
-"shopping\0"
-"prd.km\0"
-"living\0"
-"kuji.iwate.jp\0"
-"matsuura.nagasaki.jp\0england.museum\0"
-"cloudaccess.net\0"
-"newport.museum\0clubmed\0\xe4\xb8\x96\xe7\x95\x8c\0"
-"komono.mie.jp\0is-not-certified.com\0"
-"pharmaciens.km\0*.futurecms.at\0"
-"\xd8\xa7\xd8\xa8\xd9\x88\xd8\xb8\xd8\xa8\xd9\x8a\0njs.jelastic.vps-host.net\0"
-"konan.shiga.jp\0"
-"vestre-toten.no\0us-east-1.amazonaws.com\0"
-"my.id\0paas.leviracloud.eu\0"
-"lpages.co\0"
-"klodzko.pl\0hu.eu.org\0ie.eu.org\0"
-"hatogaya.saitama.jp\0biz.ki\0"
-"prd.mg\0rr.leg.br\0"
-"vs.it\0"
-"4u.com\0"
-"art.sn\0"
-"rn.it\0lib.ne.us\0"
-"nose.osaka.jp\0roma.museum\0"
-"agr.br\0"
-"wmcloud.org\0"
-"tokorozawa.saitama.jp\0"
-"latina.it\0tranibarlettaandria.it\0\xc3\xa1laheadju.no\0mortgage\0"
-"iwamizawa.hokkaido.jp\0"
-"komoro.nagano.jp\0\xeb\x8b\xb7\xeb\x84\xb7\0"
-"fujixerox\0"
-"biz.ls\0s\xc3\xb8mna.no\0go.dyndns.org\0"
-"trento.it\0sukumo.kochi.jp\0"
-"tachiarai.fukuoka.jp\0"
-"makurazaki.kagoshima.jp\0rs.leg.br\0sc.leg.br\0spdns.eu\0"
-"schule\0barsy.online\0"
-"\xe6\xbe\xb3\xe9\x96\x80\0"
-"santamaria.br\0"
-"isehara.kanagawa.jp\0"
-"motosu.gifu.jp\0delmenhorst.museum\0"
-"dabur\0"
-"sch.id\0kadogawa.miyazaki.jp\0myfirewall.org\0"
-"ayagawa.kagawa.jp\0"
-"biz.mv\0"
-"biz.mw\0cloudns.club\0"
-"taxi.br\0"
-"suedtirol.it\0biz.ni\0"
-"\xd0\xbe\xd1\x80\xd0\xb3.\xd1\x80\xd1\x83\xd1\x81\0"
-"kusu.oita.jp\0dray-dns.de\0"
-"mysecuritycamera.org\0"
-"alaheadju.no\0"
-"kh.ua\0"
-"chikuho.fukuoka.jp\0"
-"filatelia.museum\0museum.tt\0"
-"suzu.ishikawa.jp\0askim.no\0"
-"sch.ir\0biz.nr\0"
-"\xe6\xb2\x96\xe7\xb8\x84.jp\0"
-"gyeonggi.kr\0"
-"!city.sapporo.jp\0skoczow.pl\0"
-"wpdevcloud.com\0"
-"koge.tottori.jp\0"
-"val-d-aosta.it\0sch.jo\0pilots.museum\0xerox\0"
-"claims\0app.lmpm.com\0"
-"smola.no\0"
-"homeftp.org\0"
-"kasumigaura.ibaraki.jp\0"
-"school.na\0"
-"langev\xc3\xa5g.no\0"
-"pharmacy\0"
-"biz.pk\0"
-"tatsuno.hyogo.jp\0biz.pl\0homedepot\0ca-central-1.elasticbeanstalk.com\0"
-"agro.bo\0"
-"biz.pr\0freedesktop.org\0"
-"mulhouse.museum\0tattoo\0"
-"cheap\0"
-"x.bg\0gotdns.ch\0*.telebit.xyz\0"
-"jl.serv.net.mx\0"
-"3.bg\0media.hu\0"
-"consulado.st\0k12.nm.us\0"
-"sch.lk\0storj.farm\0"
-"nagano.jp\0nakano.tokyo.jp\0"
-"vaksdal.no\0"
-"akagi.shimane.jp\0berkeley.museum\0"
-"school.nz\0"
-"shinjo.yamagata.jp\0franziskaner.museum\0"
-"gushikami.okinawa.jp\0mango\0"
-"soc.dz\0apigee.io\0"
-"red\0"
-"fujinomiya.shizuoka.jp\0emb.kw\0"
-"sch.ly\0"
-"skiptvet.no\0barrell-of-knowledge.info\0"
-"yamagata.nagano.jp\0"
-"shinichi.hiroshima.jp\0"
-"ren\0"
-"mordovia.su\0"
-"zentsuji.kagawa.jp\0"
-"\xd8\xa7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86\0"
-"qvc\0"
-"sch.ng\0"
-"wang\0*.ex.futurecms.at\0"
-"bauhaus\0rn.leg.br\0spdns.de\0"
-"is-a-soxfan.org\0"
-"cafe\0"
-"bozen-suedtirol.it\0"
-"hole.no\0"
-"point2this.com\0"
-"farsund.no\0"
-"lib.pr.us\0"
-"biz.ss\0aero.tt\0"
-"shimamoto.osaka.jp\0gs.hm.no\0\xe6\xbe\xb3\xe9\x97\xa8\0"
-"pz.it\0lib.mi.us\0"
-"research.aero\0pol.dz\0grane.no\0"
-"lu.it\0me.it\0lib.il.us\0voorloper.cloud\0"
-"izumisano.osaka.jp\0biz.tj\0"
-"trentins\xc3\xbc""dtirol.it\0lib.dc.us\0"
-"karuizawa.nagano.jp\0"
-"leczna.pl\0"
-"samukawa.kanagawa.jp\0video\0home.dyndns.org\0"
-"hamada.shimane.jp\0biz.ua\0"
-"biz.tr\0"
-"biz.tt\0\xe6\x97\xb6\xe5\xb0\x9a\0"
-"aero.mv\0"
-"ambulance.aero\0"
-"fuettertdasnetz.de\0gr.eu.org\0"
-"lyngen.no\0"
-"me.ke\0"
-"szczecin.pl\0ro.leg.br\0"
-"yakumo.shimane.jp\0"
-"dnsdojo.org\0ddnslive.com\0"
-"lunner.no\0sch.qa\0"
-"shibata.miyagi.jp\0takahata.yamagata.jp\0hareid.no\0mordovia.ru\0"
-"kartuzy.pl\0"
-"lapy.pl\0"
-"sandvikcoromant\0vs.mythic-beasts.com\0"
-"biz.vn\0"
-"akune.kagoshima.jp\0ril\0"
-"oe.yamagata.jp\0wolterskluwer\0"
-"sassari.it\0from-al.com\0"
-"stjordal.no\0rio\0"
-"rip\0from-mo.com\0"
-"nishikata.tochigi.jp\0duck\0"
-"s\xc3\xb8r-fron.no\0"
-"vevelstad.no\0"
-"us.reclaim.cloud\0"
-"avianca\0edu.eu.org\0"
-"uri.arpa\0"
-"pol.ht\0sch.sa\0"
-"museum.mv\0sigdal.no\0"
-"museum.mw\0"
-"matsusaka.mie.jp\0orkanger.no\0skanit.no\0"
-"its.me\0"
-"kumenan.okayama.jp\0museum.no\0insurance\0oldnavy\0backplaneapp.io\0"
-"sch.so\0"
-"drammen.no\0media.pl\0"
-"observer\0vladikavkaz.ru\0"
-"ascoli-piceno.it\0"
-"equipment.aero\0"
-"yahaba.iwate.jp\0"
-"koeln.museum\0"
-"ninohe.iwate.jp\0soc.lk\0casino\0xfinity\0"
-"arakawa.saitama.jp\0museum.om\0"
-"assisi.museum\0bo.telemark.no\0"
-"d.bg\0"
-"takayama.gifu.jp\0k12.la.us\0"
-"wa.edu.au\0rns.tn\0vladikavkaz.su\0"
-"geology.museum\0call\0"
-"palace.museum\0skien.no\0industries\0"
-"beauty\0"
-"alfaromeo\0nv.elastyco.com\0"
-"meldal.no\0"
-"biz.zm\0frontdoor\0"
-"tatebayashi.gunma.jp\0"
-"bindal.no\0"
-"camp\0"
-"australia.museum\0lezajsk.pl\0"
-"salangen.no\0"
-"kiryu.gunma.jp\0netlify.app\0"
-"kakogawa.hyogo.jp\0"
-"puglia.it\0nisshin.aichi.jp\0"
-"esan.hokkaido.jp\0"
-"izumi.osaka.jp\0gallup\0photos\0"
-"leikanger.no\0meland.no\0demon.nl\0"
-"wanouchi.gifu.jp\0"
-"\xd0\xba\xd0\xbe\xd0\xbc\0"
-"airforce\0"
-"nakayama.yamagata.jp\0"
-"himeshima.oita.jp\0"
-"alabama.museum\0"
-"nannestad.no\0"
-"urakawa.hokkaido.jp\0yoita.niigata.jp\0homelinux.com\0"
-"cpa.pro\0"
-"kaneyama.fukushima.jp\0"
-"birthplace.museum\0"
-"turin.it\0"
-"asaka.saitama.jp\0"
-"us.eu.org\0"
-"tynset.no\0"
-"is-a-hunter.com\0"
-"ivanovo.su\0"
-"inuyama.aichi.jp\0tsuno.kochi.jp\0muos\xc3\xa1t.no\0"
-"augustow.pl\0serveirc.com\0"
-"vall\xc3\xa9""edaoste.it\0"
-"me.so\0"
-"gjesdal.no\0ar.com\0"
-"bc.ca\0baltimore.museum\0"
-"ullensvang.no\0"
-"me.tc\0"
-"\xe6\xb7\xa1\xe9\xa9\xac\xe9\x94\xa1\0"
-"tires\0africa.com\0"
-"juif.museum\0"
-"s3-website.eu-west-3.amazonaws.com\0*.azurecontainer.io\0"
-"tendo.yamagata.jp\0parti.se\0onred.one\0"
-"prochowice.pl\0racing\0"
-"inf.br\0kota.aichi.jp\0ikeda.nagano.jp\0\xd8\xa7\xd9\x84\xd9\x85\xd8\xba\xd8\xb1\xd8\xa8\0"
-"sap\0"
-"cesenaforl\xc3\xac.it\0"
-"sas\0"
-"nesoddtangen.no\0afamilycompany\0dev.static.land\0"
-"kongsvinger.no\0"
-"trd.br\0yono.saitama.jp\0"
-"\xe9\x95\xb7\xe9\x87\x8e.jp\0fujikawa.shizuoka.jp\0"
-"care\0sbi\0"
-"sch.zm\0"
-"\xe7\xbb\x84\xe7\xb9\x94.hk\0agano.niigata.jp\0newmexico.museum\0me.tz\0"
-"me.uk\0"
-"convent.museum\0"
-"ecologia.bo\0gose.nara.jp\0yosemite.museum\0czest.pl\0neko.am\0"
-"stockholm.museum\0sca\0"
-"inf.cu\0scb\0"
-"sbs\0"
-"me.us\0"
-"ogasawara.tokyo.jp\0\xe0\xae\x87\xe0\xae\xa8\xe0\xaf\x8d\xe0\xae\xa4\xe0\xae\xbf\xe0\xae\xaf\xe0\xae\xbe\0casa\0"
-"kagoshima.kagoshima.jp\0cars\0politie\0servemp3.com\0"
-"nes.akershus.no\0"
-"trentinsuedtirol.it\0keisen.fukuoka.jp\0case\0"
-"cash\0"
-"s3-us-east-2.amazonaws.com\0"
-"honjo.saitama.jp\0gift\0"
-"bauern.museum\0"
-"kizu.kyoto.jp\0loginline.dev\0mein-vigor.de\0"
-"vps.mcdir.ru\0"
-"me.vu\0"
-"se.leg.br\0"
-"saga.jp\0castres.museum\0beta.bounty-full.com\0"
-"firewall-gateway.com\0"
-"moskenes.no\0"
-"arte.bo\0arts.museum\0"
-"suwa.nagano.jp\0x.se\0nis.za\0"
-"my-gateway.de\0"
-"mg.gov.br\0"
-"hamatama.saga.jp\0"
-"kamiizumi.saitama.jp\0jaguar\0"
-"nikaho.akita.jp\0"
-"applinzi.com\0"
-"oyabe.toyama.jp\0s\xc3\xb8rfold.no\0"
-"sakaiminato.tottori.jp\0"
-"passenger-association.aero\0run\0"
-"air-surveillance.aero\0"
-"ritto.shiga.jp\0j\xc3\xb8rpeland.no\0mj\xc3\xb8ndalen.no\0"
-"mlbfan.org\0community-pro.de\0"
-"nextdirect\0ses\0"
-"ba.leg.br\0"
-"dynserv.org\0"
-"kpmg\0sew\0shell\0"
-"sex\0"
-"shinjo.nara.jp\0monmouth.museum\0"
-"pol.tr\0bugatti\0"
-"mar.it\0"
-"otofuke.hokkaido.jp\0"
-"imdb\0"
-"bio.br\0tjmaxx\0"
-"sfr\0"
-"naoshima.kagawa.jp\0"
-"nantan.kyoto.jp\0rwe\0"
-"shirataka.yamagata.jp\0"
-"is-a-candidate.org\0"
-"mitsubishi\0"
-"dvag\0"
-"cologne\0"
-"ed.ao\0"
-"kanonji.kagawa.jp\0coach\0education\0"
-"association.museum\0"
-"kunigami.okinawa.jp\0haibara.shizuoka.jp\0"
-"meloy.no\0br.com\0cdn77-ssl.net\0"
-"nakagyo.kyoto.jp\0kahoku.yamagata.jp\0"
-"grocery\0"
-"bozen.it\0"
-"tgory.pl\0"
-"h\xc3\xa1""bmer.no\0"
-"kiwi.nz\0agro.pl\0"
-"ed.ci\0geek.nz\0"
-"eating-organic.net\0"
-"evenassi.no\0"
-"kitakata.fukushima.jp\0"
-"nara.jp\0"
-"imb.br\0"
-"ed.cr\0"
-"kazuno.akita.jp\0"
-"shimizu.shizuoka.jp\0"
-"izumiotsu.osaka.jp\0cymru.museum\0pgfog.com\0"
-"tirol\0"
-"honjyo.akita.jp\0"
-"\xd8\xa8\xda\xbe\xd8\xa7\xd8\xb1\xd8\xaa\0fujitsu\0"
-"kembuchi.hokkaido.jp\0la.us\0ski\0"
-"rade.no\0"
-"brunel.museum\0"
-"memorial.museum\0unicom\0"
-"mediocampidano.it\0from-de.com\0"
-"dvrcam.info\0"
-"kawaba.gunma.jp\0cc.wi.us\0"
-"yaizu.shizuoka.jp\0cc.sd.us\0"
-"inf.mk\0loten.no\0"
-"kitagawa.kochi.jp\0sky\0"
-"judygarland.museum\0ulm.museum\0"
-"norddal.no\0"
-"cloud.jelastic.open.tim.it\0"
-"krasnik.pl\0"
-"iglesiascarbonia.it\0"
-"d.se\0"
-"jinsekikogen.hiroshima.jp\0"
-"adult.ht\0"
-"\xd0\xba\xd1\x80\xd1\x8b\xd0\xbc.\xd1\x80\xd1\x83\xd1\x81\0"
-"tozawa.yamagata.jp\0"
-"brandywinevalley.museum\0kherson.ua\0"
-"baseball.museum\0"
-"edunet.tn\0"
-"watch\0"
-"babia-gora.pl\0"
-"cri.br\0is-a-teacher.com\0"
-"am.leg.br\0"
-"television.museum\0"
-"nishinoomote.kagoshima.jp\0omi.nagano.jp\0"
-"servesarcasm.com\0"
-"homeftp.net\0"
-"otsuki.kochi.jp\0"
-"shiwa.iwate.jp\0"
-"tondabayashi.osaka.jp\0"
-"better-than.tv\0impertrixcdn.com\0"
-"lib.ut.us\0"
-"mitsuke.niigata.jp\0\xe4\xba\x9a\xe9\xa9\xac\xe9\x80\x8a\0"
-"rc.it\0"
-"aurskog-holand.no\0stokke.no\0"
-"chrome\0ravendb.community\0"
-"mn.it\0spa\0xy.ax\0"
-"chippubetsu.hokkaido.jp\0lavangen.no\0"
-"taifun-dns.de\0"
-"witd.gov.pl\0"
-"mitane.akita.jp\0chijiwa.nagasaki.jp\0wlocl.pl\0"
-"barueri.br\0soy\0"
-"*.dweb.link\0"
-"immo\0"
-"omachi.nagano.jp\0n\xc3\xa1vuotna.no\0gos.pk\0"
-"jan-mayen.no\0"
-"tab\0"
-"ed.jp\0fh.se\0"
-"hotels\0"
-"pippu.hokkaido.jp\0"
-"\xe6\xbb\x8b\xe8\xb3\x80.jp\0"
-"openair.museum\0"
-"is-into-cars.com\0"
-"higashikagura.hokkaido.jp\0"
-"soja.okayama.jp\0"
-"he.cn\0"
-"shiftedit.io\0"
-"herokuapp.com\0"
-"midtre-gauldal.no\0directory\0"
-"tax\0"
-"friulivenezia-giulia.it\0\xe7\xbe\xa4\xe9\xa6\xac.jp\0cbre\0"
-"pymnt.uk\0"
-"srl\0"
-"nyny.museum\0"
-"s3.amazonaws.com\0"
-"minami-alps.yamanashi.jp\0enonic.io\0"
-"nishitosa.kochi.jp\0naustdal.no\0paas.massivegrid.com\0"
-"publishproxy.com\0"
-"halden.no\0"
-"narusawa.yamanashi.jp\0astronomy.museum\0"
-"tci\0\xe5\xae\xb6\xe9\x9b\xbb\0armenia.su\0"
-"yasuda.kochi.jp\0"
-"inf.ua\0"
-"sjc.br\0yoshimi.saitama.jp\0radoy.no\0"
-"meiwa.gunma.jp\0"
-"toyotomi.hokkaido.jp\0utashinai.hokkaido.jp\0"
-"hokuto.hokkaido.jp\0stc\0"
-"film.hu\0as.us\0ap.leg.br\0"
-"bo.nordland.no\0elastyco.com\0"
-"suisse.museum\0"
-"dnsdojo.net\0"
-"tdk\0"
-"servehumour.com\0"
-"\xe0\xb0\xad\xe0\xb0\xbe\xe0\xb0\xb0\xe0\xb0\xa4\xe0\xb1\x8d\0"
-"chizu.tottori.jp\0"
-"tanabe.kyoto.jp\0jp.net\0azurestaticapps.net\0"
-"hjelmeland.no\0investments\0"
-"m.bg\0"
-"k12.md.us\0"
-"citadel\0and.mom\0"
-"tamakawa.fukushima.jp\0oppdal.no\0tel\0"
-"poa.br\0"
-"air-traffic-control.aero\0genova.it\0"
-"haboro.hokkaido.jp\0muika.niigata.jp\0"
-"yamanobe.yamagata.jp\0divttasvuotna.no\0"
-"sa.com\0homelinux.net\0isa-hockeynut.com\0"
-"sandoy.no\0"
-"\xe5\x85\xac\xe5\x8f\xb8.\xe9\xa6\x99\xe6\xb8\xaf\0boomla.net\0"
-"lomza.pl\0"
-"chofu.tokyo.jp\0"
-"map.fastly.net\0"
-"omuta.fukuoka.jp\0"
-"seika.kyoto.jp\0"
-"land\0"
-"higashimatsushima.miyagi.jp\0playstation\0togliatti.su\0"
-"abr.it\0plaza.museum\0"
-"oshima.yamaguchi.jp\0ebiz.tw\0"
-"tt.im\0"
-"ota.gunma.jp\0ed.pw\0"
-"mail.pl\0\xd8\xa7\xd9\x84\xd9\x8a\xd9\x85\xd9\x86\0"
-"lib.tx.us\0"
-"caserta.it\0aarborte.no\0"
-"ud.it\0"
-"yashiro.hyogo.jp\0"
-"ogawa.ibaraki.jp\0embroidery.museum\0"
-"po.it\0bremanger.no\0"
-"thd\0fr.eu.org\0"
-"botanicgarden.museum\0"
-"navuotna.no\0lib.hi.us\0"
-"tsu.mie.jp\0"
-"matsukawa.nagano.jp\0"
-"wakasa.tottori.jp\0"
-"cloudns.info\0"
-"kristiansand.no\0"
-"lel.br\0uhren.museum\0midsund.no\0hotel.tz\0"
-"yoshinogari.saga.jp\0"
-"*.kawasaki.jp\0"
-"catering.aero\0assabu.hokkaido.jp\0"
-"monticello.museum\0pics\0"
-"town\0"
-"media.aero\0minowa.nagano.jp\0"
-"info\0"
-"friuli-veneziagiulia.it\0kamikawa.hokkaido.jp\0torino.museum\0"
-"yokkaichi.mie.jp\0"
-"imizu.toyama.jp\0"
-"soma.fukushima.jp\0sells-it.net\0"
-"andriabarlettatrani.it\0"
-"contemporaryart.museum\0"
-"cri.nz\0\xd0\xbc\xd0\xba\xd0\xb4\0"
-"cloud.unispace.io\0"
-"news.hu\0"
-"yamada.toyama.jp\0vestby.no\0"
-"yatsuka.shimane.jp\0"
-"delta\0"
-"tjx\0"
-"s\xc3\xbc""dtirol.it\0"
-"nome.pt\0toys\0"
-"toyohashi.aichi.jp\0mn.us\0"
-"b\xc3\xa6rum.no\0"
-"readthedocs.io\0"
-"chattanooga.museum\0"
-"urayasu.chiba.jp\0hirono.iwate.jp\0"
-"*.vps.myjino.ru\0"
-"bruxelles.museum\0fhv.se\0"
-"archi\0"
-"narashino.chiba.jp\0broke-it.net\0"
-"okawa.kochi.jp\0"
-"test.tj\0"
-"hiraya.nagano.jp\0"
-"nyc.museum\0ap-northeast-2.elasticbeanstalk.com\0"
-"shimoji.okinawa.jp\0"
-"musica.ar\0miyama.mie.jp\0"
-"kushimoto.wakayama.jp\0"
-"prime\0"
-"ybo.review\0"
-"fujisawa.kanagawa.jp\0"
-"k12.ga.us\0"
-"deno-staging.dev\0"
-"from-in.com\0"
-"chieti.it\0kred\0"
-"krakow.pl\0"
-"s3-website-ap-southeast-2.amazonaws.com\0"
-"musica.bo\0florida.museum\0"
-"house.museum\0"
-"yoichi.hokkaido.jp\0"
-"futbol\0s3.eu-west-2.amazonaws.com\0"
-"misugi.mie.jp\0london.museum\0"
-"\xe9\x95\xb7\xe5\xb4\x8e.jp\0"
-"isla.pr\0school.za\0"
-"\xd0\xbc\xd0\xbe\xd0\xbd\0"
-"journal.aero\0bsb.br\0kawajima.saitama.jp\0"
-"webredirect.org\0"
-"homesecuritypc.com\0"
-"time.museum\0fylkesbibl.no\0"
-"lib.wy.us\0test.ru\0"
-"wakayama.wakayama.jp\0top\0"
-"hotel.lk\0shouji\0on-aptible.com\0"
-"mizumaki.fukuoka.jp\0"
-"sp.it\0"
-"urn.arpa\0mc.eu.org\0"
-"wa.au\0"
-"builders\0\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0\0"
-"versailles.museum\0"
-"naie.hokkaido.jp\0"
-"eastcoast.museum\0"
-"\xd8\xa7\xd9\x84\xd8\xb9\xd9\x84\xd9\x8a\xd8\xa7\xd9\x86\0"
-"bl.it\0"
-"611.to\0"
-"woodside\0"
-"vda.it\0"
-"hb.cldmail.ru\0"
-"mallorca.museum\0"
-"aerobatic.aero\0"
-"moriyama.shiga.jp\0sande.m\xc3\xb8re-og-romsdal.no\0"
-"dgca.aero\0rikuzentakata.iwate.jp\0tsunan.niigata.jp\0"
-"lt.eu.org\0"
-"is-a-bookkeeper.com\0"
-"cesenaforli.it\0kamioka.akita.jp\0and.museum\0"
-"otsuka\0"
-"is.gov.pl\0"
-"iveland.no\0"
-"ah.cn\0"
-"hatsukaichi.hiroshima.jp\0"
-"obu.aichi.jp\0"
-"ubs\0"
-"forex\0"
-"gouv.fr\0kvinnherad.no\0siljan.no\0trv\0"
-"lamborghini\0pgafan.net\0"
-"elverum.no\0hitachi\0"
-"halsa.no\0ping\0"
-"nordreisa.no\0"
-"pink\0"
-"rzeszow.pl\0"
-"gu.us\0eu-west-2.elasticbeanstalk.com\0ravendb.me\0"
-"hotel.hu\0filegear.me\0"
-"campobasso.it\0"
-"ouchi.saga.jp\0"
-"ravendb.run\0"
-"fnd.br\0"
-"soni.nara.jp\0qbuser.com\0"
-"\xc3\xb8rsta.no\0cloudns.pro\0"
-"cc.oh.us\0"
-"susaki.kochi.jp\0technology\0"
-"pagefrontapp.com\0"
-"gouv.ht\0homeunix.net\0"
-"k12.wa.us\0tui\0is-a-landscaper.com\0"
-"monza.it\0inagi.tokyo.jp\0"
-"indigena.bo\0mitou.yamaguchi.jp\0"
-"rmit\0from-mi.com\0"
-"kyowa.akita.jp\0setagaya.tokyo.jp\0"
-"m.se\0"
-"toyono.osaka.jp\0selje.no\0"
-"platform0.app\0"
-"stockholm\0"
-"k12.ar.us\0"
-"caravan\0"
-"tonsberg.no\0"
-"\xe7\xae\x87\xe4\xba\xba.hk\0iwi.nz\0\xe3\x83\x95\xe3\x82\xa1\xe3\x83\x83\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3\0"
-"gouv.bj\0gb.com\0"
-"omotego.fukushima.jp\0taketomi.okinawa.jp\0"
-"tama.tokyo.jp\0salon\0"
-"isesaki.gunma.jp\0"
-"tvs\0"
-"cuiaba.br\0"
-"watari.miyagi.jp\0grong.no\0dyndns-ip.com\0"
-"news\0"
-"livinghistory.museum\0"
-"okutama.tokyo.jp\0kustanai.ru\0"
-"gouv.ci\0"
-"kawachinagano.osaka.jp\0fribourg.museum\0"
-"higashikawa.hokkaido.jp\0steigen.no\0"
-"toyokawa.aichi.jp\0ishigaki.okinawa.jp\0"
-"firenze.it\0"
-"ato.br\0tonaki.okinawa.jp\0"
-"vinnytsia.ua\0"
-"recife.br\0next\0"
-"steam.museum\0"
-"\xe4\xbd\x90\xe8\xb3\x80.jp\0onion\0"
-"north.museum\0kustanai.su\0"
-"trentinsued-tirol.it\0"
-"hinode.tokyo.jp\0"
-"raisa.no\0"
-"miura.kanagawa.jp\0"
-"showtime\0mc.ax\0"
-"eastasia.azurestaticapps.net\0"
-"*.compute.estate\0"
-"galsa.no\0"
-"moma.museum\0"
-"tsugaru.aomori.jp\0"
-"dyndns-office.com\0"
-"sn\xc3\xa5sa.no\0is-a-anarchist.com\0"
-"dyn53.io\0"
-"freiburg.museum\0"
-"kamisunagawa.hokkaido.jp\0"
-"qh.cn\0"
-"sera.hiroshima.jp\0malvik.no\0"
-"hn.cn\0"
-"obira.hokkaido.jp\0dyndns.org\0miniserver.com\0"
-"sor-fron.no\0"
-"ballangen.no\0"
-"sor-odal.no\0"
-"minato.tokyo.jp\0pfizer\0"
-"caa.aero\0"
-"adobeaemcloud.com\0"
-"\xe5\xb2\xa9\xe6\x89\x8b.jp\0legnica.pl\0"
-"southcarolina.museum\0juniper\0"
-"frei.no\0"
-"srv.br\0"
-"nishikawa.yamagata.jp\0"
-"fundacio.museum\0ok.us\0"
-"uchinada.ishikawa.jp\0botanical.museum\0"
-"nishiarita.saga.jp\0int.eu.org\0"
-"ga.us\0"
-"ogi.saga.jp\0"
-"konyvelo.hu\0"
-"mansion.museum\0rl.no\0"
-"bestbuy\0from-ky.com\0"
-"soo.kagoshima.jp\0kppsp.gov.pl\0cc.ri.us\0"
-"saiki.oita.jp\0"
-"yachts\0"
-"rec.br\0cc.mt.us\0cc.nd.us\0\xe7\xb6\xb2\xe7\xb5\xa1.\xe9\xa6\x99\xe6\xb8\xaf\0"
-"protonet.io\0"
-"kitami.hokkaido.jp\0"
-"centralus.azurestaticapps.net\0"
-"ra-ru.ru\0"
-"v.bg\0s3.dualstack.ap-southeast-1.amazonaws.com\0"
-"ah.no\0"
-"britishcolumbia.museum\0aid.pl\0"
-"1.bg\0"
-"ybo.science\0"
-"poniatowa.pl\0"
-"rec.co\0gr.com\0"
-"k\xc3\xa5""fjord.no\0"
-"washingtondc.museum\0"
-"kamimine.saga.jp\0"
-"ichiba.tokushima.jp\0luzern.museum\0loginline.app\0"
-"tosu.saga.jp\0uno\0"
-"des.br\0myoko.niigata.jp\0"
-"otaki.chiba.jp\0"
-"is-very-good.org\0"
-"kicks-ass.net\0"
-"otsuki.yamanashi.jp\0uol\0"
-"frontier\0"
-"handa.aichi.jp\0sweetpepper.org\0wellbeingzone.co.uk\0"
-"g\xc3\xbcnstigliefern.de\0"
-"gildeskal.no\0se.net\0ru.net\0"
-"ikeda.fukui.jp\0community.museum\0osaka\0serveftp.net\0"
-"culture.museum\0fineart.museum\0"
-"from-pr.com\0"
-"mk.eu.org\0"
-"for-the.biz\0"
-"aki.kochi.jp\0"
-"yamato.fukushima.jp\0"
-"fuefuki.yamanashi.jp\0*.in.futurecms.at\0fra1-de.cloudjiffy.net\0"
-"sanfrancisco.museum\0"
-"mc.it\0kyonan.chiba.jp\0yahoo\0"
-"otsu.shiga.jp\0hoylandet.no\0konsulat.gov.pl\0ups\0"
-"nanporo.hokkaido.jp\0honefoss.no\0lib.de.us\0"
-"ericsson\0"
-"beiarn.no\0"
-"fujikawa.yamanashi.jp\0"
-"gsm.pl\0"
-"trentin-suedtirol.it\0"
-"mel.cloudlets.com.au\0"
-"ven.it\0"
-"cieszyn.pl\0weir\0"
-"messina.it\0"
-"\xe0\xa6\xad\xe0\xa6\xbe\xe0\xa6\xb0\xe0\xa6\xa4\0"
-"static.observableusercontent.com\0"
-"mosj\xc3\xb8""en.no\0"
-"homelinux.org\0"
-"forum\0"
-"\xc3\xa5mli.no\0"
-"takasago.hyogo.jp\0eigersund.no\0"
-"trader.aero\0nakagawa.hokkaido.jp\0"
-"onjuku.chiba.jp\0americanfamily\0"
-"komatsushima.tokushima.jp\0"
-"lima-city.de\0"
-"heritage.museum\0"
-"kuju.oita.jp\0kv\xc3\xa6nangen.no\0"
-"\xe7\xa5\x9e\xe5\xa5\x88\xe5\xb7\x9d.jp\0columbia.museum\0"
-"cloud\0"
-"\xe5\xba\x83\xe5\xb3\xb6.jp\0hayakawa.yamanashi.jp\0scienceandhistory.museum\0"
-"couchpotatofries.org\0"
-"takamatsu.kagawa.jp\0oshima.tokyo.jp\0"
-"sar.it\0"
-"aus.basketball\0"
-"wa.us\0"
-"lu.eu.org\0me.eu.org\0"
-"nanae.hokkaido.jp\0"
-"rokunohe.aomori.jp\0naval.museum\0"
-"fyresdal.no\0"
-"asahi.chiba.jp\0murakami.niigata.jp\0"
-"cloudns.org\0"
-"christmas\0"
-"kumano.mie.jp\0"
-"savona.it\0"
-"naples.it\0chigasaki.kanagawa.jp\0blog.gt\0"
-"airline.aero\0paas.hosted-by-previder.com\0lima-city.at\0"
-"us-west-2.elasticbeanstalk.com\0"
-"oracle\0"
-"katagami.akita.jp\0oyodo.nara.jp\0"
-"ugim.gov.pl\0operaunite.com\0"
-"luroy.no\0yombo.me\0"
-"kuki.saitama.jp\0"
-"vet\0"
-"b.bg\0"
-"ise.mie.jp\0"
-"lv.eu.org\0"
-"lima-city.ch\0"
-"kawaguchi.saitama.jp\0"
-"b.br\0miharu.fukushima.jp\0"
-"koshimizu.hokkaido.jp\0minato.osaka.jp\0flatanger.no\0"
-"wassamu.hokkaido.jp\0"
-"gotsu.shimane.jp\0"
-"tohnosho.chiba.jp\0"
-"bytom.pl\0"
-"tokyo.jp\0"
-"coz.br\0rindal.no\0"
-"macapa.br\0kitakami.iwate.jp\0london.cloudapps.digital\0nyaa.am\0"
-"n\xc3\xa6r\xc3\xb8y.no\0"
-"saarland\0"
-"blog.bo\0kotoura.tottori.jp\0from-or.com\0"
-"yakage.okayama.jp\0"
-"blog.br\0gouv.sn\0"
-"upaas.kazteleport.kz\0alpha.bounty-full.com\0"
-"ukco.me\0"
-"game-server.cc\0"
-"hakata.fukuoka.jp\0yanagawa.fukuoka.jp\0"
-"mihama.wakayama.jp\0lukow.pl\0"
-"rec.nf\0"
-"ot.it\0pd.it\0saka.hiroshima.jp\0"
-"vig\0"
-"kamitsue.oita.jp\0krodsherad.no\0dnsup.net\0"
-"grimstad.no\0"
-"shintoku.hokkaido.jp\0"
-"cruise\0"
-"verdal.no\0global\0panasonic\0"
-"ce.it\0illustration.museum\0rauma.no\0lon-2.paas.massivegrid.net\0"
-"vin\0"
-"vip\0"
-"yachiyo.chiba.jp\0es.eu.org\0"
-"now-dns.top\0"
-"settlers.museum\0cn-north-1.eb.amazonaws.com.cn\0"
-"parma.it\0kameyama.mie.jp\0"
-"awaji.hyogo.jp\0"
-"from-la.net\0"
-"tsuruoka.yamagata.jp\0"
-"codes\0"
-"trentin-s\xc3\xbc""d-tirol.it\0yuzawa.niigata.jp\0nord-fron.no\0scrysec.com\0"
-"mino.gifu.jp\0"
-"roros.no\0js.wpenginepowered.com\0"
-"\xe0\xb8\xa3\xe0\xb8\xb1\xe0\xb8\x90\xe0\xb8\x9a\xe0\xb8\xb2\xe0\xb8\xa5.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
-"kawatana.nagasaki.jp\0aquarium.museum\0"
-"durban\0"
-"info.gu\0"
-"lenug.su\0"
-"ind.br\0farmequipment.museum\0search\0"
-"whaling.museum\0"
-"mydobiss.com\0"
-"info.ht\0\xe0\xb8\x84\xe0\xb8\xad\xe0\xb8\xa1\0"
-"info.hu\0"
-"origins\0"
-"tec.br\0\xe0\xac\xad\xe0\xac\xbe\xe0\xac\xb0\xe0\xac\xa4\0"
-"rana.no\0sochi.su\0"
-"holmestrand.no\0"
-"\xc3\xb8vre-eiker.no\0"
-"sakai.osaka.jp\0aarp\0dyndns-work.com\0"
-"schaeffler\0"
-"shibecha.hokkaido.jp\0niyodogawa.kochi.jp\0rec.ro\0"
-"hattfjelldal.no\0\xe3\x82\xb9\xe3\x83\x88\xe3\x82\xa2\0"
-"info.et\0"
-"info.fj\0"
-"cc.pa.us\0"
-"navoi.su\0"
-"ce.leg.br\0"
-"takehara.hiroshima.jp\0"
-"futsu.nagasaki.jp\0"
-"kr.eu.org\0"
-"bu.no\0"
-"yamanakako.yamanashi.jp\0"
-"roma.it\0bounty-full.com\0"
-"guardian\0"
-"stpetersburg.museum\0enterprises\0"
-"gmbh\0"
-"canon\0square7.net\0prvcy.page\0"
-"hachioji.tokyo.jp\0"
-"iwanuma.miyagi.jp\0kawasaki.miyagi.jp\0"
-"info.cx\0seidat.net\0"
-"potager.org\0"
-"business\0sydney\0s3-us-west-2.amazonaws.com\0"
-"shikabe.hokkaido.jp\0gouv.km\0"
-"furudono.fukushima.jp\0"
-"s3.us-east-2.amazonaws.com\0"
-"wellbeingzone.eu\0"
-"info.ec\0ina.saitama.jp\0sanofi\0"
-"moseushi.hokkaido.jp\0"
-"\xd0\xbe\xd1\x80\xd0\xb3\0v.ua\0"
-"civilization.museum\0filegear-au.me\0"
-"secure\0"
-"hellas.museum\0rec.ve\0"
-"ind.gt\0masfjorden.no\0"
-"act.au\0"
-"massa-carrara.it\0"
-"ashibetsu.hokkaido.jp\0"
-"place\0resindevice.io\0"
-"servebbs.net\0"
-"half.host\0"
-"info.bb\0"
-"s3-website.eu-west-2.amazonaws.com\0"
-"tsubame.niigata.jp\0info.at\0"
-"info.au\0"
-"haga.tochigi.jp\0homeunix.org\0"
-"naklo.pl\0"
-"port.fr\0izunokuni.shizuoka.jp\0goip.de\0"
-"info.az\0"
-"noboribetsu.hokkaido.jp\0gouv.ml\0sondre-land.no\0"
-"yoshida.shizuoka.jp\0"
-"aq.it\0ba.it\0"
-"shonai.fukuoka.jp\0gulen.no\0"
-"info.bo\0"
-"saito.miyazaki.jp\0mykolaiv.ua\0"
-"kaminokawa.tochigi.jp\0arna.no\0schulserver.de\0"
-"ind.in\0ogawa.saitama.jp\0from-ok.com\0"
-"harvestcelebration.museum\0fjell.no\0"
-"cern\0"
-"info.co\0sec.ps\0on-the-web.tv\0hk.org\0"
-"chernovtsy.ua\0"
-"kochi.jp\0health.museum\0"
-"gojome.akita.jp\0"
-"cincinnati.museum\0"
-"midori.chiba.jp\0kouyama.kagoshima.jp\0"
-"vanguard\0gitlab.io\0"
-"blog.vu\0"
-"oceanographique.museum\0"
-"yorii.saitama.jp\0"
-"mobile\0is-an-anarchist.com\0"
-"\xe5\x9f\xbc\xe7\x8e\x89.jp\0ind.kw\0"
-"sekigahara.gifu.jp\0"
-"coldwar.museum\0"
-"express.aero\0"
-"namikata.ehime.jp\0"
-"edogawa.tokyo.jp\0"
-"manx.museum\0"
-"saogonca.br\0"
-"tksat.bo\0batsfjord.no\0karpacz.pl\0bananarepublic\0"
-"nishinomiya.hyogo.jp\0"
-"fi.eu.org\0"
-"cc.nm.us\0able\0"
-"sphinx.mythic-beasts.com\0"
-"\xc3\xa5krehamn.no\0"
-"gwangju.kr\0finn\xc3\xb8y.no\0"
-"obama.fukui.jp\0tsukuba.ibaraki.jp\0"
-"k12.mn.us\0"
-"kunstunddesign.museum\0landes.museum\0b.se\0"
-"amber.museum\0annefrank.museum\0\xe0\xb2\xad\xe0\xb2\xbe\xe0\xb2\xb0\xe0\xb2\xa4\0"
-"tsushima.aichi.jp\0k12.fl.us\0"
-"kusatsu.shiga.jp\0"
-"microlight.aero\0trentinos-tirol.it\0"
-"skierv\xc3\xa1.no\0skanland.no\0play\0"
-"g12.br\0"
-"cim.br\0"
-"is-a-geek.com\0"
-"s\xc3\xb8r-varanger.no\0"
-"kamishihoro.hokkaido.jp\0"
-"sola.no\0"
-"pa.gov.br\0telebit.io\0"
-"seven\0"
-"luster.no\0"
-"okayama.okayama.jp\0organic\0"
-"ra.it\0polkowice.pl\0"
-"\xe6\x96\xb0\xe5\x8a\xa0\xe5\x9d\xa1\0win\0"
-"akishima.tokyo.jp\0"
-"eid.no\0"
-"balestrand.no\0"
-"caracal.mythic-beasts.com\0"
-"\xe5\x85\xac\xe5\x8f\xb8.cn\0"
-"nasu.tochigi.jp\0"
-"idf.il\0miasa.nagano.jp\0"
-"cagliari.it\0"
-"pb.gov.br\0rentals\0za.com\0"
-"room\0"
-"dyndns-at-home.com\0"
-"floripa.br\0orx.biz\0"
-"balsan-sudtirol.it\0"
-"\xe5\x85\xac\xe5\x8f\xb8.hk\0"
-"urbino-pesaro.it\0"
-"oguchi.aichi.jp\0kirkenes.no\0"
-"mombetsu.hokkaido.jp\0\xe0\xae\x87\xe0\xae\xb2\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xaf\x88\0buzz\0kicks-ass.org\0"
-"jdf.br\0gs.cn\0"
-"h\xc3\xb8nefoss.no\0"
-"is-a-knight.org\0"
-"rawa-maz.pl\0e12.ve\0"
-"us-east-1.elasticbeanstalk.com\0"
-"rel.ht\0"
-"kragero.no\0"
-"kr.com\0"
-"pueblo.bo\0santoandre.br\0"
-"wme\0"
-"ind.tn\0"
-"iwakuni.yamaguchi.jp\0info.ve\0"
-"router.management\0"
-"doomdns.org\0qcx.io\0"
-"daito.osaka.jp\0"
-"dr.na\0"
-"vf.no\0info.vn\0pokrovsk.su\0"
-"foz.br\0"
-"bible.museum\0"
-"wielun.pl\0cc.mi.us\0"
-"nobeoka.miyazaki.jp\0"
-"cc.id.us\0"
-"nakano.nagano.jp\0"
-"miyama.fukuoka.jp\0*.cryptonomic.net\0"
-"k.bg\0"
-"\xe5\xa4\xa7\xe5\x88\x86.jp\0"
-"bozen-sudtirol.it\0"
-"hirogawa.wakayama.jp\0bargains\0"
-"nuoro.it\0minami.fukuoka.jp\0"
-"achi.nagano.jp\0egersund.no\0"
-"suzaka.nagano.jp\0tec.ve\0omg.lol\0"
-"health.nz\0"
-"higashiyamato.tokyo.jp\0"
-"kuriyama.hokkaido.jp\0dynamisches-dns.de\0"
-"info.tn\0skygearapp.com\0"
-"info.tr\0wow\0blog.kg\0"
-"info.tt\0"
-"ivgu.no\0cbg.ru\0jelastic.team\0"
-"gokase.miyazaki.jp\0"
-"u.channelsdvr.net\0"
-"parachuting.aero\0sanagochi.tokushima.jp\0info.tz\0lego\0"
-"madrid.museum\0network\0"
-"r\xc3\xb8yrvik.no\0\xe8\x87\xba\xe7\x81\xa3\0"
-"shizuoka.shizuoka.jp\0abudhabi\0"
-"and\xc3\xb8y.no\0"
-"ueda.nagano.jp\0"
-"ishikari.hokkaido.jp\0"
-"tr.it\0lib.pa.us\0"
-"*.ocs.customer-oci.com\0"
-"haram.no\0"
-"fastly-terrarium.com\0familyds.net\0"
-"info.ro\0go.leg.br\0"
-"ohkura.yamagata.jp\0"
-"contagem.br\0"
-"\xe4\xb8\xaa\xe4\xba\xba.hk\0cn.it\0info.sd\0"
-"lecco.it\0"
-"s3-website-eu-west-1.amazonaws.com\0eastus2.azurestaticapps.net\0"
-"nico\0"
-"hamburg.museum\0"
-"is-a-geek.org\0"
-"nagaokakyo.kyoto.jp\0"
-"abu.yamaguchi.jp\0kudamatsu.yamaguchi.jp\0git-pages.rit.edu\0"
-"sn.cn\0omihachiman.shiga.jp\0"
-"tomiya.miyagi.jp\0"
-"morioka.iwate.jp\0tj\xc3\xb8me.no\0"
-"info.pk\0rel.pl\0"
-"tokushima.jp\0info.pl\0"
-"wtc\0"
-"wtf\0cloudfront.net\0ghost.io\0appengine.flow.ch\0"
-"mihara.hiroshima.jp\0info.pr\0serveftp.org\0"
-"bj.cn\0med.pro\0"
-"firmdale\0"
-"sowa.ibaraki.jp\0"
-"konskowola.pl\0"
-"dr.tr\0"
-"zappos\0"
-"googleapis.com\0"
-"trentins\xc3\xbc""d-tirol.it\0info.na\0"
-"botany.museum\0""001www.com\0"
-"yanaizu.fukushima.jp\0info.mv\0info.nf\0landrover\0"
-"fermo.it\0"
-"info.ni\0myvnc.com\0"
-"aremark.no\0xihuan\0"
-"tatsuno.nagano.jp\0info.nr\0"
-"tr.no\0"
-"rennebu.no\0"
-"beeldengeluid.museum\0"
-"cyon.site\0"
-"klepp.no\0r\xc3\xb8st.no\0is-very-sweet.org\0"
-"randaberg.no\0west1-us.cloudjiffy.net\0"
-"iwafune.tochigi.jp\0"
-"floro.no\0"
-"health.vn\0"
-"myphotos.cc\0"
-"info.la\0"
-"ustka.pl\0"
-"embetsu.hokkaido.jp\0\xc3\xa5""fjord.no\0"
-"avellino.it\0"
-"\xc3\xa1k\xc5\x8boluokta.no\0"
-"trentin-sued-tirol.it\0"
-"nesna.no\0trust\0"
-"secaas.hk\0"
-"cahcesuolo.no\0"
-"info.ls\0"
-"java\0"
-"exhibition.museum\0"
-"orland.no\0vm.bytemark.co.uk\0"
-"\xe4\xb8\xad\xe5\x9b\xbd\0"
-"pi.gov.br\0yokoze.saitama.jp\0"
-"author\0smart\0"
-"works.aero\0"
-"viking\0"
-"sel.no\0komvux.se\0"
-"asahikawa.hokkaido.jp\0"
-"gs.of.no\0xin\0net-freaks.com\0"
-"karatsu.saga.jp\0"
-"georgia.su\0"
-"\xe4\xb8\xad\xe5\x9c\x8b\0"
-"adm.br\0nordre-land.no\0nike\0"
-"info.ke\0"
-"lib.ar.us\0"
-"info.ki\0frankfurt.museum\0healthcare\0"
-"tateyama.toyama.jp\0"
-"ribeirao.br\0"
-"fusa.no\0zaporizhzhe.ua\0"
-"adac\0"
-"komatsu.ishikawa.jp\0"
-"plus\0"
-"riopreto.br\0from-co.net\0"
-"withyoutube.com\0"
-"kiyosato.hokkaido.jp\0numata.hokkaido.jp\0"
-"higashiyoshino.nara.jp\0"
-"otama.fukushima.jp\0cdn-edges.net\0"
-"s3-website.eu-central-1.amazonaws.com\0"
-"barcelona\0"
-"hita.oita.jp\0"
-"nonoichi.ishikawa.jp\0jelastic.dogado.eu\0"
-"itoigawa.niigata.jp\0cn.ua\0is-a-socialist.com\0"
-"ryuoh.shiga.jp\0"
-"ws.na\0"
-"accountant\0"
-"firm.ht\0"
-"emr.it\0"
-"buzen.fukuoka.jp\0"
-"knightpoint.systems\0"
-"iwatsuki.saitama.jp\0leirvik.no\0vennesla.no\0"
-"yamato.kumamoto.jp\0"
-"firm.in\0"
-"campinagrande.br\0yuu.yamaguchi.jp\0"
-"crotone.it\0"
-"onga.fukuoka.jp\0"
-"alta.no\0cc.nv.us\0"
-"yazu.tottori.jp\0"
-"azure\0"
-"cc.fl.us\0"
-"cricket\0"
-"cn.vu\0"
-"chungnam.kr\0royrvik.no\0"
-"k.se\0"
-"sumy.ua\0"
-"tateshina.nagano.jp\0"
-"youtube\0jele.cloud\0"
-"tsukigata.hokkaido.jp\0"
-"shiso.hyogo.jp\0"
-"vicenza.it\0"
-"andriatranibarletta.it\0campidanomedio.it\0"
-"firm.co\0"
-"baidar.no\0"
-"kinokawa.wakayama.jp\0"
-"lplfinancial\0"
-"shinanomachi.nagano.jp\0voss.no\0is-certified.com\0enterprisecloud.nu\0"
-"pe.gov.br\0"
-"browsersafetymark.io\0"
-"shisui.chiba.jp\0kasserver.com\0firm.dk\0"
-"qa2.com\0"
-"bib.br\0safe\0"
-"eidskog.no\0"
-"test-iserv.de\0"
-"takatsuki.osaka.jp\0gs.mr.no\0"
-"iraq.museum\0"
-"chat\0s3-sa-east-1.amazonaws.com\0"
-"hida.gifu.jp\0"
-"ehime.jp\0"
-"misato.shimane.jp\0"
-"v\xc3\xa5gs\xc3\xb8y.no\0"
-"isernia.it\0seto.aichi.jp\0"
-"valleeaoste.it\0"
-"bible\0"
-"clinton.museum\0"
-"rishiri.hokkaido.jp\0"
-"sakaki.nagano.jp\0"
-"ne.jp\0troms\xc3\xb8.no\0"
-"emergency.aero\0"
-"nayoro.hokkaido.jp\0aramco\0"
-"from-ga.com\0"
-"ne.ke\0is-an-actress.com\0"
-"gamvik.no\0"
-"rovno.ua\0bloomberg\0"
-"jus.br\0tsuiki.fukuoka.jp\0youth.museum\0raholt.no\0"
-"tube\0"
-"fedex\0"
-"ne.kr\0\xd1\x80\xd1\x83\xd1\x81\0"
-"niiza.saitama.jp\0is-a-green.com\0"
-"hl.cn\0"
-"exchange\0hopto.me\0"
-"is-a-patsfan.org\0"
-"nagatoro.saitama.jp\0"
-"nagano.nagano.jp\0"
-"nakagawa.nagano.jp\0"
-"helsinki.museum\0"
-"servebbs.org\0"
-"serveminecraft.net\0"
-"engine.aero\0yuza.yamagata.jp\0"
-"grajewo.pl\0"
-"ny.us\0"
-"seiro.niigata.jp\0"
-"oirm.gov.pl\0"
-"\xe6\x9d\xb1\xe4\xba\xac.jp\0"
-"seirou.niigata.jp\0az.us\0"
-"pa.gov.pl\0"
-"lajolla.museum\0"
-"shizuoka.jp\0"
-"toride.ibaraki.jp\0"
-"tel.tr\0"
-"vpnplus.to\0"
-"t.bg\0"
-"sale\0"
-"\xd9\x81\xd9\x84\xd8\xb3\xd8\xb7\xd9\x8a\xd9\x86\0"
-"k12.ma.us\0domains\0"
-"ondigitalocean.app\0"
-"minamifurano.hokkaido.jp\0cust.prod.thingdust.io\0"
-"friuliveneziagiulia.it\0"
-"webcam\0est-a-la-masion.com\0"
-"k12.ec\0kagamino.okayama.jp\0"
-"cal.it\0k12.al.us\0"
-"higashichichibu.saitama.jp\0"
-"gold\0jpn.com\0"
-"aosta-valley.it\0sandcats.io\0"
-"golf\0"
-"okoppe.hokkaido.jp\0dyndns-web.com\0"
-"hanno.saitama.jp\0"
-"uonuma.niigata.jp\0gov.scot\0"
-"xxx\0"
-"dnepropetrovsk.ua\0pages.wiardweb.com\0"
-"ne.pw\0"
-"medecin.km\0nalchik.ru\0"
-"tajimi.gifu.jp\0ipifony.net\0"
-"saga.saga.jp\0"
-"komagane.nagano.jp\0moscow.museum\0"
-"info.zm\0"
-"hitachi.ibaraki.jp\0zp.gov.pl\0"
-"jp.eu.org\0"
-"\xe4\xbf\xa1\xe6\x81\xaf\0"
-"sumoto.kumamoto.jp\0"
-"xyz\0"
-"shiogama.miyagi.jp\0tvedestrand.no\0"
-"pb.ao\0pv.it\0"
-"kosei.shiga.jp\0"
-"nalchik.su\0"
-"genoa.it\0hoteles\0"
-"or.at\0vall\xc3\xa9""e-d-aoste.it\0misawa.aomori.jp\0osoyro.no\0"
-"catania.it\0torino.it\0b\xc3\xa1id\xc3\xa1r.no\0"
-"pr.gov.br\0"
-"firm.ve\0"
-"or.bi\0"
-"\xd0\xbe\xd0\xb1\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0"
-"abogado\0*.elb.amazonaws.com\0"
-"nishimera.miyazaki.jp\0"
-"sos.pl\0"
-"uk.kg\0"
-"sth.ac.at\0odate.akita.jp\0"
-"iglesias-carbonia.it\0"
-"stuff-4-sale.org\0"
-"barsy.support\0"
-"goog\0"
-"umb.it\0"
-"lgbt\0"
-"or.ci\0jdevcloud.com\0"
-"tos.it\0toya.hokkaido.jp\0toyama.toyama.jp\0"
-"camera\0"
-"zt.ua\0"
-"or.cr\0"
-"sue.fukuoka.jp\0"
-"k12.il\0"
-"x443.pw\0"
-"*.stg.dev\0"
-"airtraffic.aero\0l\xc3\xa1hppi.no\0"
-"ashoro.hokkaido.jp\0farmers.museum\0hiphop\0"
-"ami.ibaraki.jp\0"
-"ne.ug\0wien\0"
-"kaminoyama.yamagata.jp\0"
-"ne.tz\0"
-"copenhagen.museum\0"
-"\xd7\x99\xd7\xa8\xd7\x95\xd7\xa9\xd7\x9c\xd7\x99\xd7\x9d.museum\0ann-arbor.mi.us\0"
-"omaezaki.shizuoka.jp\0sarl\0"
-"iron.museum\0"
-"ne.us\0"
-"grainger\0"
-"watchandclock.museum\0"
-"fst.br\0ris\xc3\xb8r.no\0"
-"koebenhavn.museum\0bounceme.net\0"
-"is-a-geek.net\0"
-"freeboxos.com\0"
-"sko.gov.pl\0cc.tx.us\0"
-"pup.gov.pl\0accesscam.org\0"
-"iwama.ibaraki.jp\0"
-"agriculture.museum\0atm.pl\0"
-"no-ip.co.uk\0"
-"hl.no\0"
-"hadano.kanagawa.jp\0"
-"firm.ro\0cc.hi.us\0"
-"cc.ct.us\0*.ocp.customer-oci.com\0"
-"bando.ibaraki.jp\0"
-"shirosato.ibaraki.jp\0you\0"
-"townnews-staging.com\0"
-"tono.iwate.jp\0hakuba.nagano.jp\0foundation.museum\0"
-"\xd1\x81\xd1\x80\xd0\xb1\0"
-"alaska.museum\0"
-"himeji.hyogo.jp\0"
-"frana.no\0comsec\0"
-"kosuge.yamanashi.jp\0"
-"hosting-cluster.nl\0"
-"natuurwetenschappen.museum\0"
-"iruma.saitama.jp\0"
-"harima.hyogo.jp\0ams1.jls.docktera.net\0"
-"archaeology.museum\0"
-"bulsan-sudtirol.it\0"
-"hof.no\0"
-"stream\0users.scale.virtualcloud.com.br\0"
-"kita.osaka.jp\0lardal.no\0cloud-fr1.unispace.io\0"
-"kitaura.miyazaki.jp\0ryokami.saitama.jp\0histoire.museum\0save\0"
-"agrigento.it\0katsuura.chiba.jp\0minami.kyoto.jp\0kv\xc3\xa6""fjord.no\0loppa.no\0"
-"or.id\0"
-"\xe0\xa6\xad\xe0\xa6\xbe\xe0\xa7\xb0\xe0\xa6\xa4\0cc.hn\0"
-"tkmaxx\0"
-"gs.st.no\0",
-
-"pri.ee\0"
-"from-ia.com\0webthings.io\0"
-"kumatori.osaka.jp\0fetsund.no\0"
-"otobe.hokkaido.jp\0"
-"or.it\0ninomiya.kanagawa.jp\0comunica\xc3\xa7\xc3\xb5""es.museum\0j.layershift.co.uk\0"
-"balat.no\0"
-"adv.br\0aknoluokta.no\0"
-"friulivgiulia.it\0"
-"erotika.hu\0firm.nf\0"
-"taobao\0firm.ng\0"
-"torahime.shiga.jp\0wiki\0"
-"bs.it\0sites.static.land\0"
-"spy.museum\0"
-"or.jp\0"
-"mckinsey\0"
-"aichi.jp\0geelvinck.museum\0"
-"goldpoint\0definima.io\0"
-"slupsk.pl\0beep.pl\0pointto.us\0"
-"or.ke\0"
-"gs.oslo.no\0kinder\0"
-"saxo\0"
-"\xe7\xb6\xb2\xe8\xb7\xaf.tw\0"
-"sumita.iwate.jp\0"
-"cards\0"
-"sc.cn\0"
-"or.kr\0ocs.opusinteractive.io\0"
-"itau\0"
-"kai.yamanashi.jp\0"
-"diskstation.me\0"
-"est.pr\0"
-"trentin-s\xc3\xbc""dtirol.it\0shijonawate.osaka.jp\0"
-"yun\0"
-"cci.fr\0"
-"numazu.shizuoka.jp\0u2-local.xnbay.com\0"
-"chirurgiens-dentistes-en-france.fr\0familyds.org\0"
-"wine\0"
-"dattolocal.com\0diskstation.eu\0"
-"yusui.kagoshima.jp\0sula.no\0"
-"is-a-nurse.com\0"
-"production.aero\0shibetsu.hokkaido.jp\0"
-"or.na\0ma.us\0"
-"slg.br\0"
-"or.mu\0"
-"masaki.ehime.jp\0"
-"isshiki.aichi.jp\0cc.na\0"
-"kmpsp.gov.pl\0cc.wy.us\0clicketcloud.com\0"
-"maebashi.gunma.jp\0"
-"ngrok.io\0"
-"samsung\0"
-"k12.tr\0"
-"happou.akita.jp\0"
-"t.se\0"
-"mysecuritycamera.com\0"
-"filegear-jp.me\0"
-"uslivinghistory.museum\0"
-"depot.museum\0"
-"fukagawa.hokkaido.jp\0"
-"shacknet.nu\0"
-"freebox-os.com\0"
-"bozen-s\xc3\xbc""dtirol.it\0oguni.yamagata.jp\0"
-"cnt.br\0nosegawa.nara.jp\0railway.museum\0"
-"lerdal.no\0*.dapps.earth\0"
-"k12.vi\0"
-"ap-southeast-2.elasticbeanstalk.com\0bitbridge.net\0"
-"zip\0zuerich\0"
-"reggio-emilia.it\0"
-"serveexchange.com\0"
-"kozaki.chiba.jp\0or.pw\0"
-"is-a-bulls-fan.com\0"
-"bjarkoy.no\0kindle\0"
-"curitiba.br\0"
-"mus.br\0\xd8\xa7\xd8\xaa\xd8\xb5\xd8\xa7\xd9\x84\xd8\xa7\xd8\xaa\0"
-"stalbans.museum\0"
-"lib.vt.us\0"
-"po.gov.pl\0"
-"shimoda.shizuoka.jp\0edu.scot\0"
-"umaji.kochi.jp\0"
-"shichinohe.aomori.jp\0lib.mn.us\0"
-"r.cdn77.net\0"
-"kasukabe.saitama.jp\0"
-"obninsk.su\0"
-"m\xc3\xa1tta-v\xc3\xa1rjjat.no\0holdings\0playstation-cloud.com\0"
-"fh-muenster.io\0"
-"ichikai.tochigi.jp\0"
-"ao.it\0"
-"treviso.it\0"
-"kaas.gg\0"
-"res.aero\0"
-"sc.ke\0"
-"travelchannel\0"
-"sakai.fukui.jp\0"
-"no-ip.info\0"
-"aero\0"
-"sc.kr\0"
-"medecin.fr\0miami\0"
-"valle-d-aosta.it\0takayama.nagano.jp\0or.th\0"
-"boxfuse.io\0"
-"vard\xc3\xb8.no\0"
-"uji.kyoto.jp\0"
-"satosho.okayama.jp\0veg\xc3\xa5rshei.no\0"
-"ricoh\0ufcfan.org\0"
-"nohost.me\0"
-"\xe7\xb6\xb2\xe7\xb5\xa1.cn\0km.ua\0"
-"mitaka.tokyo.jp\0sc.ls\0pohl\0toolforge.org\0"
-"oystre-slidre.no\0discourse.group\0"
-"or.ug\0\xd1\x81\xd0\xbf\xd0\xb1.\xd1\x80\xd1\x83\xd1\x81\0"
-"stadt.museum\0or.tz\0promo\0cc.ua\0"
-"h\xc3\xa1mm\xc3\xa1rfeasta.no\0"
-"tadaoka.osaka.jp\0"
-"tomi.nagano.jp\0sakura.tochigi.jp\0"
-"adv.mz\0sa-east-1.elasticbeanstalk.com\0"
-"ube.yamaguchi.jp\0"
-"erimo.hokkaido.jp\0or.us\0"
-"emerck\0"
-"aioi.hyogo.jp\0"
-"starostwo.gov.pl\0"
-"futaba.fukushima.jp\0sor-varanger.no\0"
-"nagi.okayama.jp\0"
-"deatnu.no\0"
-"rio.br\0"
-"science.museum\0"
-"olsztyn.pl\0"
-"mayfirst.org\0noip.us\0"
-"is.eu.org\0"
-"mihama.mie.jp\0schmidt\0"
-"8.bg\0cc.al.us\0"
-"research.museum\0k12.mt.us\0"
-"dnsalias.net\0"
-"club.tw\0"
-"ono.fukushima.jp\0francaise.museum\0"
-"slattum.no\0"
-"trolley.museum\0"
-"asso.eu.org\0"
-"shingu.hyogo.jp\0from-ca.com\0"
-"amakusa.kumamoto.jp\0"
-"of.fashion\0"
-"my-wan.de\0"
-"*.triton.zone\0"
-"s3-us-gov-west-1.amazonaws.com\0wafflecell.com\0"
-"capital\0it.eu.org\0"
-"ohira.miyagi.jp\0"
-"trentino-altoadige.it\0"
-"skjervoy.no\0"
-"\xe7\xb6\xb2\xe7\xb5\xa1.hk\0corporation.museum\0gs.va.no\0"
-"customer.mythic-beasts.com\0"
-"guernsey.museum\0statefarm\0"
-"\xe8\xb4\xad\xe7\x89\xa9\0"
-"trycloudflare.com\0"
-"kamakura.kanagawa.jp\0warszawa.pl\0"
-"mcdir.ru\0"
-"\xe6\x84\x9b\xe5\xaa\x9b.jp\0"
-"oirase.aomori.jp\0"
-"rikubetsu.hokkaido.jp\0green\0"
-"british.museum\0"
-"ina.ibaraki.jp\0"
-"shishikui.tokushima.jp\0"
-"citi\0"
-"trana.no\0"
-"office\0"
-"yugawara.kanagawa.jp\0"
-"iizuna.nagano.jp\0is-found.org\0"
-"!city.kobe.jp\0money.museum\0\xd0\xb1\xd0\xb8\xd0\xb7.\xd1\x80\xd1\x83\xd1\x81\0"
-"aomori.jp\0"
-"ha.cn\0varoy.no\0city\0"
-"utazas.hu\0koto.tokyo.jp\0stavern.no\0"
-"gmina.pl\0"
-"hofu.yamaguchi.jp\0"
-"virtual.museum\0"
-"sc.ug\0"
-"in.eu.org\0"
-"honai.ehime.jp\0sc.tz\0"
-"hair\0"
-"\xe9\xb9\xbf\xe5\x85\x90\xe5\xb3\xb6.jp\0"
-"higashiizumo.shimane.jp\0lorenskog.no\0"
-"asuke.aichi.jp\0"
-"namegawa.saitama.jp\0"
-"sc.us\0simple-url.com\0"
-"kaita.hiroshima.jp\0"
-"lea\xc5\x8bgaviika.no\0\xe6\x94\xbf\xe5\xba\x9c.\xe9\xa6\x99\xe6\xb8\xaf\0"
-"parliament.nz\0"
-"newjersey.museum\0virgin\0"
-"dnsupdate.info\0"
-"mircloud.host\0"
-"fortmissoula.museum\0immobilien\0"
-"yao.osaka.jp\0"
-"minamata.kumamoto.jp\0"
-"creation.museum\0cc.va.us\0"
-"porn\0daemon.panel.gg\0"
-"kushiro.hokkaido.jp\0\xe5\xb9\xbf\xe4\xb8\x9c\0"
-"grp.lk\0"
-"monster\0"
-"cooperativa.bo\0"
-"jeep\0twmail.cc\0"
-"i.bg\0land-4-sale.us\0"
-"shinjo.okayama.jp\0"
-"eidsberg.no\0"
-"\xe7\xbd\x91\xe7\xab\x99\0"
-"uk.net\0"
-"\xe7\xbd\x91\xe5\x9d\x80\0"
-"hidaka.wakayama.jp\0post\0s3-website-us-west-1.amazonaws.com\0chimkent.su\0nid.io\0"
-"xen.prgmr.com\0"
-"kawanishi.yamagata.jp\0b\xc3\xa1hccavuotna.no\0serveftp.com\0"
-"def.br\0george\0"
-"free.hr\0"
-"s3.cn-north-1.amazonaws.com.cn\0"
-"funabashi.chiba.jp\0"
-"shimotsuke.tochigi.jp\0tysnes.no\0forgot.his.name\0es.leg.br\0"
-"skjerv\xc3\xb8y.no\0"
-"odo.br\0koga.ibaraki.jp\0"
-"shiraoka.saitama.jp\0"
-"gifts\0"
-"mw.gov.pl\0"
-"s3.ap-south-1.amazonaws.com\0"
-"szex.hu\0gs.tm.no\0"
-"lease\0"
-"is-a-republican.com\0"
-"\xd1\x83\xd0\xba\xd1\x80\0"
-"alessandria.it\0zamami.okinawa.jp\0noip.me\0"
-"tarama.okinawa.jp\0"
-"tp.it\0"
-"toon.ehime.jp\0"
-"og.ao\0scot\0"
-"condos\0"
-"bod\xc3\xb8.no\0final\0caa.li\0"
-"tottori.tottori.jp\0"
-"indianmarket.museum\0"
-"cl.it\0"
-"time.no\0"
-"iwate.jp\0"
-"sasaguri.fukuoka.jp\0dagestan.ru\0"
-"kuchinotsu.nagasaki.jp\0"
-"zapto.org\0"
-"crafting.xyz\0"
-"tysvar.no\0"
-"ms.gov.br\0"
-"kiyama.saga.jp\0meguro.tokyo.jp\0film.museum\0"
-"fm.br\0snoasa.no\0"
-"\xd5\xb0\xd5\xa1\xd5\xb5\0"
-"hachinohe.aomori.jp\0tranby.no\0"
-"dagestan.su\0"
-"pilot.aero\0lidl\0"
-"debian.net\0"
-"americanantiques.museum\0vlaanderen.museum\0"
-"bergen.no\0"
-"kita.tokyo.jp\0chintai\0mcpe.me\0"
-"birkenes.no\0"
-"kiyosu.aichi.jp\0"
-"webhop.biz\0"
-"iobb.net\0"
-"shinonsen.hyogo.jp\0"
-"dsmynas.org\0"
-"dp.ua\0"
-"homeunix.com\0"
-"mydrobo.com\0linkyard.cloud\0"
-"mt.gov.br\0ut.us\0"
-"stjohn.museum\0life\0"
-"umi.fukuoka.jp\0kolobrzeg.pl\0financial\0"
-"wegrow.pl\0"
-"charity\0"
-"in-the-band.net\0"
-"chita.aichi.jp\0"
-"synology-diskstation.de\0"
-"kouzushima.tokyo.jp\0b\xc3\xa5tsfjord.no\0vacations\0"
-"tydal.no\0de.cool\0"
-"uchihara.ibaraki.jp\0thruhere.net\0"
-"com.ac\0boutique\0"
-"com.af\0"
-"com.ag\0varggat.no\0washtenaw.mi.us\0"
-"takatori.nara.jp\0cc.ks.us\0"
-"com.ai\0ha.no\0"
-"sicilia.it\0"
-"com.al\0*.nodebalancer.linode.com\0ditchyourip.com\0"
-"com.am\0emp.br\0fortal.br\0andria-trani-barletta.it\0tonami.toyama.jp\0"
-"inawashiro.fukushima.jp\0gangaviika.no\0"
-"hiraizumi.iwate.jp\0"
-"com.ba\0lefrak\0"
-"com.ar\0com.bb\0karate.museum\0"
-"com.au\0"
-"plantation.museum\0"
-"com.aw\0"
-"com.bh\0"
-"com.bi\0"
-"com.az\0"
-"saroma.hokkaido.jp\0"
-"com.bm\0"
-"com.bn\0"
-"com.bo\0"
-"com.br\0"
-"com.bs\0kanagawa.jp\0"
-"com.bt\0rsvp\0"
-"v\xc3\xa5g\xc3\xa5.no\0"
-"frog.museum\0haus\0blogdns.org\0"
-"com.by\0com.ci\0"
-"com.bz\0"
-"com.cm\0"
-"com.cn\0"
-"com.co\0worse-than.tv\0"
-"nore-og-uvdal.no\0"
-"masoy.no\0"
-"wajiki.tokushima.jp\0turen.tn\0"
-"com.cu\0com.de\0"
-"portland.museum\0gs.nt.no\0"
-"com.cw\0"
-"moss.no\0"
-"com.cy\0asakawa.fukushima.jp\0apps.fbsbx.com\0"
-"wajima.ishikawa.jp\0"
-"fukui.fukui.jp\0"
-"com.dm\0og.it\0mitoyo.kagawa.jp\0from-ne.com\0"
-"l-o-g-i-n.de\0static-access.net\0"
-"com.do\0"
-"like\0"
-"yorkshire.museum\0"
-"com.ec\0fm.it\0"
-"com.ee\0eu-central-1.elasticbeanstalk.com\0"
-"com.eg\0"
-"i.ng\0holiday\0"
-"com.dz\0hichiso.gifu.jp\0"
-"salat.no\0"
-"nishiazai.shiga.jp\0yoga\0"
-"fedorainfracloud.org\0"
-"com.es\0kiso.nagano.jp\0"
-"com.et\0"
-"naroy.no\0"
-"com.fj\0"
-"miyashiro.saitama.jp\0\xe3\x82\xbb\xe3\x83\xbc\xe3\x83\xab\0"
-"com.fm\0"
-"svalbard.no\0"
-"federation.aero\0com.fr\0"
-"murata.miyagi.jp\0"
-"com.ge\0"
-"surgeonshall.museum\0safety\0"
-"com.gh\0kv.ua\0"
-"com.gi\0"
-"i.ph\0limo\0"
-"com.gl\0"
-"sciencecenters.museum\0"
-"com.gn\0"
-"tamba.hyogo.jp\0"
-"com.gp\0"
-"com.gr\0"
-"com.gt\0nagareyama.chiba.jp\0"
-"com.gu\0vegas\0dd-dns.de\0"
-"link\0"
-"database.museum\0"
-"academy.museum\0baths.museum\0"
-"vic.edu.au\0com.gy\0"
-"\xe0\xae\x9a\xe0\xae\xbf\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xae\xaa\xe0\xaf\x8d\xe0\xae\xaa\xe0\xaf\x82\xe0\xae\xb0\xe0\xaf\x8d\0"
-"com.hk\0granvin.no\0"
-"com.hn\0aquila.it\0perugia.it\0"
-"tagawa.fukuoka.jp\0"
-"defense.tn\0"
-"amagasaki.hyogo.jp\0misato.wakayama.jp\0"
-"com.hr\0"
-"com.ht\0amli.no\0"
-"bibai.hokkaido.jp\0money\0"
-"user.srcf.net\0"
-"com.im\0ohi.fukui.jp\0naamesjevuemie.no\0dy.fi\0"
-"wiki.bo\0fm.no\0jgora.pl\0gallery\0"
-"com.io\0bolzano.it\0sandefjord.no\0freesite.host\0"
-"hioki.kagoshima.jp\0"
-"wiki.br\0com.iq\0s3.dualstack.us-east-2.amazonaws.com\0"
-"com.is\0ogori.fukuoka.jp\0"
-"k12.ok.us\0"
-"saijo.ehime.jp\0"
-"i.se\0"
-"mosjoen.no\0"
-"issmarterthanyou.com\0"
-"kanna.gunma.jp\0"
-"com.jo\0drangedal.no\0"
-"aerodrome.aero\0lima.zone\0"
-"dynalias.com\0"
-"kanoya.kagoshima.jp\0"
-"pacific.museum\0protection\0"
-"oristano.it\0com.kg\0redstone\0"
-"localhost.daplie.me\0"
-"com.ki\0austevoll.no\0infiniti\0servebbs.com\0"
-"nexus\0"
-"trentino-sued-tirol.it\0*.0emm.com\0firewall-gateway.net\0"
-"com.km\0limited\0"
-"tokai.ibaraki.jp\0\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb1\xd8\xaf\xd9\x86\0lotte\0"
-"yura.wakayama.jp\0evje-og-hornnes.no\0"
-"com.kp\0"
-"com.la\0"
-"iheya.okinawa.jp\0com.lb\0law.za\0"
-"com.lc\0bjugn.no\0\xd8\xb4\xd8\xa8\xd9\x83\xd8\xa9\0msk.ru\0"
-"com.kw\0"
-"lotto\0"
-"com.ky\0lib.va.us\0works\0blogsite.xyz\0"
-"com.kz\0\xe0\xb6\xbd\xe0\xb6\x82\xe0\xb6\x9a\xe0\xb7\x8f\0world\0"
-"londrina.br\0com.lk\0"
-"nasushiobara.tochigi.jp\0"
-"kurume.fukuoka.jp\0"
-"glug.org.uk\0"
-"adult\0"
-"ms.it\0com.lr\0"
-"msk.su\0ciscofreak.com\0"
-"kuzumaki.iwate.jp\0juedisches.museum\0gs.aa.no\0"
-"com.lv\0homegoods\0stada\0"
-"com.mg\0cn.com\0"
-"davvenj\xc3\xa1rga.no\0"
-"minamiizu.shizuoka.jp\0com.ly\0"
-"higashi.fukuoka.jp\0"
-"com.mk\0wuoz.gov.pl\0"
-"com.ml\0"
-"kamijima.ehime.jp\0is-a-democrat.com\0"
-"com.mo\0"
-"com.na\0"
-"*.kobe.jp\0com.ms\0"
-"com.mt\0"
-"com.mu\0"
-"com.mv\0com.nf\0"
-"ad.jp\0com.mw\0com.ng\0krokstadelva.no\0\xd8\xb9\xd8\xb1\xd8\xa8\0"
-"yn.cn\0com.mx\0sokndal.no\0seat\0\xd8\xa7\xd8\xb1\xd8\xa7\xd9\x85\xd9\x83\xd9\x88\0"
-"com.my\0com.ni\0"
-"bolivia.bo\0ltd.cy\0otago.museum\0est-a-la-maison.com\0"
-"dance\0"
-"ms.kr\0"
-"com.nr\0"
-"sakura.chiba.jp\0"
-"gz.cn\0hashbang.sh\0"
-"from-tn.com\0"
-"air.museum\0"
-"review\0"
-"\xc3\xa5rdal.no\0"
-"\xe4\xbc\x81\xe4\xb8\x9a\0"
-"boavista.br\0com.om\0auction\0"
-"net.eu.org\0"
-"dell-ogliastra.it\0live\0"
-"medicina.bo\0com.pa\0is-a-nascarfan.com\0"
-"taiji.wakayama.jp\0lon.wafaicloud.com\0"
-"\xd0\xb4\xd0\xb5\xd1\x82\xd0\xb8\0"
-"com.pe\0"
-"res.in\0lebesby.no\0com.pf\0"
-"valleaosta.it\0"
-"artsandcrafts.museum\0com.ph\0"
-"shoes\0"
-"hasvik.no\0"
-"com.pk\0"
-"com.pl\0"
-"dyr\xc3\xb8y.no\0embaixada.st\0"
-"uwajima.ehime.jp\0"
-"beauxarts.museum\0"
-"tunes\0"
-"com.qa\0"
-"in.na\0namdalseid.no\0com.pr\0"
-"com.ps\0uber.space\0"
-"com.pt\0"
-"\xe9\x80\x9a\xe8\xb2\xa9\0"
-"org.ac\0"
-"gjerdrum.no\0com.py\0"
-"org.ae\0ltd.gi\0in.ni\0training\0"
-"org.af\0philately.museum\0"
-"org.ag\0"
-"revista.bo\0"
-"org.ai\0"
-"aguni.okinawa.jp\0seek\0"
-"org.al\0"
-"org.am\0arakawa.tokyo.jp\0"
-"k12.vi.us\0"
-"r.bg\0com.re\0"
-"org.ba\0"
-"org.ar\0org.bb\0inder\xc3\xb8y.no\0"
-"hawaii.museum\0co.network\0"
-"org.au\0"
-"k12.id.us\0ltd.hk\0"
-"org.bh\0minano.saitama.jp\0"
-"org.bi\0udono.mie.jp\0"
-"org.az\0com.ro\0"
-"taishi.osaka.jp\0"
-"com.sa\0"
-"org.bm\0oishida.yamagata.jp\0rygge.no\0com.sb\0pt.eu.org\0"
-"org.bn\0naruto.tokushima.jp\0com.sc\0"
-"org.bo\0com.sd\0"
-"niepce.museum\0hitra.no\0com.se\0com.ru\0"
-"org.br\0naka.ibaraki.jp\0com.sg\0"
-"org.bs\0com.sh\0"
-"org.bt\0"
-"yusuhara.kochi.jp\0syncloud.it\0indowapblog.com\0"
-"barsyonline.co.uk\0urown.cloud\0"
-"org.bw\0com.sl\0"
-"de.gt\0"
-"org.ci\0com.sn\0"
-"org.bz\0com.so\0"
-"org.cn\0com.ss\0"
-"org.co\0com.st\0nym.by\0"
-"jaworzno.pl\0nym.bz\0"
-"com.sv\0"
-"ebina.kanagawa.jp\0"
-"\xd0\xb0\xd0\xba.\xd1\x81\xd1\x80\xd0\xb1\0"
-"com.sy\0\xd8\xb9\xd9\x85\xd8\xa7\xd9\x86\0"
-"org.cu\0com.tj\0"
-"\xd8\xb3\xd9\x88\xd8\xaf\xd8\xa7\xd9\x86\0"
-"org.cw\0"
-"com.tm\0ams.cloudswitches.com\0"
-"org.cy\0ora.gunma.jp\0com.tn\0"
-"tamano.okayama.jp\0com.to\0"
-"com.ua\0"
-"parliament.cy\0org.dm\0com.tr\0"
-"org.do\0pt.it\0shimofusa.chiba.jp\0com.tt\0"
-"nishiokoppe.hokkaido.jp\0uscountryestate.museum\0user.party.eus\0"
-"ruhr\0"
-"forl\xc3\xac-cesena.it\0lo.it\0com.tw\0com.ug\0"
-"org.ec\0hadsel.no\0"
-"abc.br\0org.ee\0"
-"tselinograd.su\0"
-"org.eg\0oceanographic.museum\0"
-"dnsalias.org\0dyn-berlin.de\0nym.ec\0"
-"org.dz\0"
-"*.kunden.ortsinfo.at\0"
-"com.vc\0"
-"catholic.edu.au\0chikusei.ibaraki.jp\0in.rs\0"
-"com.ve\0"
-"artanddesign.museum\0komforb.se\0"
-"org.es\0"
-"org.et\0com.uy\0com.vi\0"
-"state.museum\0com.uz\0appspot.com\0"
-"barclays\0"
-"int.ar\0ltd.lk\0"
-"xj.cn\0taka.hyogo.jp\0"
-"com.vn\0"
-"org.fj\0"
-"romskog.no\0"
-"tuva.su\0"
-"org.fm\0"
-"plc.co.im\0leclerc\0\xe8\x81\x94\xe9\x80\x9a\0"
-"int.az\0"
-"com.vu\0"
-"matsuyama.ehime.jp\0"
-"int.bo\0satte.saitama.jp\0in.th\0"
-"org.ge\0larvik.no\0"
-"ac.gov.br\0org.gg\0vall\xc3\xa9""e-aoste.it\0"
-"org.gh\0fukushima.hokkaido.jp\0"
-"org.gi\0\xe9\x9d\x92\xe6\xa3\xae.jp\0"
-"rendalen.no\0"
-"nc.tr\0"
-"org.gl\0repair.men\0"
-"in.ua\0"
-"int.ci\0org.gn\0com.ws\0"
-"pubol.museum\0"
-"org.gp\0"
-"org.gr\0shop.ht\0toyama.jp\0"
-"shop.hu\0yoro.gifu.jp\0ltd.ng\0"
-"int.co\0org.gt\0yamagata.jp\0"
-"org.gu\0katori.chiba.jp\0"
-"soc.srcf.net\0de.ls\0"
-"nym.gr\0de.md\0"
-"org.gy\0"
-"democracia.bo\0shiga.jp\0wblog.id\0"
-"org.hk\0"
-"tysv\xc3\xa6r.no\0ms.us\0nc.us\0"
-"aland.fi\0org.hn\0"
-"valleedaoste.it\0in.us\0nym.gy\0"
-"finearts.museum\0bardu.no\0com.ye\0"
-"nym.hk\0"
-"yamada.fukuoka.jp\0"
-"org.ht\0city.hu\0"
-"org.hu\0cipriani\0temasek\0"
-"omasvuotna.no\0"
-"okagaki.fukuoka.jp\0ashgabad.su\0"
-"for.sale\0"
-"flakstad.no\0nym.ie\0"
-"org.il\0"
-"org.im\0"
-"org.in\0monzabrianza.it\0chiba.jp\0storage.yandexcloud.net\0"
-"ask\xc3\xb8y.no\0"
-"mutsu.aomori.jp\0homes\0j.scaleforce.net\0"
-"org.iq\0"
-"org.ir\0"
-"org.is\0"
-"org.je\0translate.goog\0"
-"krym.ua\0com.zm\0today\0wmflabs.org\0"
-"habikino.osaka.jp\0sandiego.museum\0k12.ks.us\0"
-"manaus.br\0"
-"ushiku.ibaraki.jp\0fedorapeople.org\0"
-"org.jo\0k12.ca.us\0intuit\0"
-"cambridge.museum\0global.prod.fastly.net\0"
-"gujo.gifu.jp\0kaluga.su\0"
-"bryne.no\0"
-"rankoshi.hokkaido.jp\0monash\0"
-"arts.co\0"
-"org.kg\0idrett.no\0"
-"isa.kagoshima.jp\0org.ki\0jewishart.museum\0"
-"yalta.ua\0"
-"3utilities.com\0"
-"modena.it\0"
-"org.km\0"
-"saku.nagano.jp\0org.kn\0"
-"izumizaki.fukushima.jp\0mypi.co\0"
-"org.kp\0"
-"org.la\0"
-"kanmaki.nara.jp\0org.lb\0"
-"chikuzen.fukuoka.jp\0org.lc\0"
-"zlg.br\0"
-"izumo.shimane.jp\0kikugawa.shizuoka.jp\0"
-"org.kw\0pramerica\0nym.la\0"
-"uk0.bigv.io\0endoftheinternet.org\0"
-"fujimino.saitama.jp\0org.ky\0nym.lc\0"
-"org.kz\0"
-"org.lk\0"
-"brussels.museum\0"
-"higashishirakawa.gifu.jp\0nym.li\0"
-"nym.kz\0"
-"te.it\0org.ma\0"
-"org.lr\0utsira.no\0"
-"org.ls\0davvenjarga.no\0"
-"bunkyo.tokyo.jp\0"
-"org.me\0"
-"org.lv\0"
-"sa.au\0org.mg\0b-data.io\0"
-"betainabox.com\0"
-"org.ly\0"
-"*.magentosite.cloud\0nym.lt\0"
-"org.mk\0demo.datacenter.fi\0nym.lu\0nym.me\0"
-"org.ml\0"
-"ca.it\0"
-"shobara.hiroshima.jp\0settsu.osaka.jp\0org.mn\0szkola.pl\0"
-"org.mo\0"
-"org.na\0"
-"org.ms\0"
-"org.mt\0nym.mn\0"
-"org.mu\0budapest\0"
-"nl.ca\0org.mv\0"
-"org.mw\0org.ng\0"
-"int.is\0org.mx\0"
-"org.my\0org.ni\0"
-"org.mz\0\xe0\xa4\x95\xe0\xa5\x89\xe0\xa4\xae\0"
-"\xe9\xa6\x99\xe5\xb7\x9d.jp\0stateofdelaware.museum\0"
-"surrey.museum\0"
-"ltd.ua\0"
-"nym.mx\0nl.ci\0"
-"am.br\0trentinostirol.it\0s3.dualstack.ap-northeast-1.amazonaws.com\0"
-"h\xc3\xa1pmir.no\0org.nr\0"
-"sa.cr\0lancaster\0"
-"pages.dev\0no-ip.org\0"
-"paragliding.aero\0politica.bo\0"
-"riodejaneiro.museum\0ltd.uk\0"
-"coloradoplateau.museum\0"
-"org.nz\0\xe5\x9c\xa8\xe7\xba\xbf\0teaches-yoga.com\0"
-"oum.gov.pl\0"
-"org.om\0"
-"ltd.co.im\0"
-"nym.nz\0"
-"lib.ee\0org.pa\0"
-"lincoln.museum\0"
-"dallas.museum\0org.pe\0"
-"int.la\0org.pf\0"
-"freebox-os.fr\0"
-"org.ph\0"
-"r\xc3\xa6lingen.no\0"
-"org.pk\0nym.pe\0"
-"org.pl\0"
-"vadso.no\0s3-ca-central-1.amazonaws.com\0"
-"heroy.more-og-romsdal.no\0org.pn\0"
-"int.lk\0"
-"futtsu.chiba.jp\0kongsberg.no\0org.qa\0"
-"org.pr\0property\0mypep.link\0"
-"org.ps\0"
-"valle-daosta.it\0gjemnes.no\0org.pt\0"
-"de.us\0"
-"station.museum\0"
-"org.py\0"
-"trentinosudtirol.it\0ca.na\0nym.pt\0"
-"\xe5\xa8\xb1\xe4\xb9\x90\0"
-"seoul.kr\0colonialwilliamsburg.museum\0"
-"yamagata.gifu.jp\0sarpsborg.no\0servehalflife.com\0"
-"helsinki\0"
-"in-addr.arpa\0catanzaro.it\0"
-"uk.oxa.cloud\0"
-"trentinoaadige.it\0"
-"is-uberleet.com\0"
-"katashina.gunma.jp\0trading\0"
-"sarufutsu.hokkaido.jp\0that.win\0"
-"bulsan-suedtirol.it\0"
-"int.mv\0"
-"int.mw\0"
-"niikappu.hokkaido.jp\0dsmynas.net\0"
-"int.ni\0r.se\0verisign\0"
-"org.ro\0na4u.ru\0"
-"org.sa\0"
-"takaharu.miyazaki.jp\0org.sb\0"
-"org.rs\0org.sc\0hdfc\0"
-"org.sd\0"
-"ochi.kochi.jp\0hammarfeasta.no\0org.se\0org.ru\0nym.ro\0"
-"shikama.miyagi.jp\0org.rw\0org.sg\0"
-"org.sh\0"
-"uozu.toyama.jp\0"
-"naumburg.museum\0usculture.museum\0org.sl\0"
-"broadcast.museum\0org.sn\0"
-"org.so\0"
-"bas.it\0laakesvuemie.no\0"
-"nym.sk\0"
-"moriyoshi.akita.jp\0omi.niigata.jp\0"
-"beskidy.pl\0org.ss\0"
-"nagahama.shiga.jp\0org.st\0"
-"org.sv\0grozny.su\0"
-"family.museum\0"
-"nishihara.kumamoto.jp\0"
-"org.sy\0"
-"org.sz\0org.tj\0"
-"nym.su\0"
-"org.tm\0"
-"org.tn\0mayfirst.info\0nym.sx\0"
-"hokuryu.hokkaido.jp\0ushistory.museum\0org.to\0"
-"\xe6\x94\xbf\xe5\xba\x9c.hk\0airtel\0prod\0"
-"sandnessj\xc3\xb8""en.no\0org.ua\0*.hosting.myjino.ru\0"
-"trani-barletta-andria.it\0ruovat.no\0org.tr\0prof\0"
-"vv.it\0karasjohka.no\0"
-"org.tt\0bnr.la\0"
-"medizinhistorisches.museum\0stjordalshalsen.no\0"
-"nsw.edu.au\0press.cy\0sa.it\0annaka.gunma.jp\0\xed\x95\x9c\xea\xb5\xad\0"
-"emiliaromagna.it\0davvesiida.no\0org.tw\0org.ug\0"
-"sexy\0"
-"carrara-massa.it\0int.pt\0pioneer\0"
-"idv.hk\0org.uk\0"
-"dni.us\0arts.ve\0club\0"
-"nym.tw\0"
-"freeddns.org\0"
-"org.vc\0"
-"hyuga.miyazaki.jp\0"
-"org.ve\0"
-"asso.fr\0"
-"her\xc3\xb8y.m\xc3\xb8re-og-romsdal.no\0czeladz.pl\0"
-"design.museum\0org.uy\0org.vi\0"
-"org.uz\0"
-"engerdal.no\0"
-"org.vn\0"
-"sciencecenter.museum\0v\xc3\xa5ler.\xc3\xb8stfold.no\0blogdns.net\0"
-"russia.museum\0"
-"leka.no\0"
-"tamayu.shimane.jp\0weber\0"
-"asso.gp\0org.vu\0"
-"vix.br\0grozny.ru\0"
-"netbank\0"
-"is-a-bruinsfan.org\0"
-"int.ru\0gets-it.net\0"
-"awsmppl.com\0"
-"chuo.tokyo.jp\0"
-"nebraska.museum\0snasa.no\0"
-"te.ua\0honda\0"
-"piacenza.it\0"
-"is-by.us\0"
-"kashiwazaki.niigata.jp\0"
-"org.ws\0"
-"asakuchi.okayama.jp\0"
-"asso.ht\0finnoy.no\0"
-"jessheim.no\0"
-"ragusa.it\0"
-"couk.me\0"
-"aikawa.kanagawa.jp\0hamar.no\0"
-"int.tj\0"
-"technology.museum\0r\xc3\xb8ros.no\0"
-"kisarazu.chiba.jp\0kaszuby.pl\0"
-"lighting\0"
-"iwanai.hokkaido.jp\0opensocial.site\0"
-"hanamaki.iwate.jp\0org.ye\0"
-"al.gov.br\0"
-"int.tt\0"
-"q-a.eu.org\0"
-"geo.br\0divtasvuodna.no\0ca.us\0"
-"masuda.shimane.jp\0"
-"asso.bj\0"
-"org.za\0"
-"chikushino.fukuoka.jp\0nl.no\0org.yt\0"
-"ekloges.cy\0"
-"arts.ro\0"
-"sport.hu\0taiwa.miyagi.jp\0"
-"int.ve\0"
-"hidaka.hokkaido.jp\0"
-"org.zm\0"
-"asso.ci\0wakuya.miyagi.jp\0"
-"6.bg\0chuo.chiba.jp\0takarazuka.hyogo.jp\0"
-"perso.ht\0int.vn\0"
-"yatomi.aichi.jp\0altervista.org\0cloudapp.net\0"
-"chambagri.fr\0"
-"shop.th\0"
-"mo\xc3\xa5reke.no\0org.zw\0vlaanderen\0"
-"koza.wakayama.jp\0troandin.no\0"
-"tjome.no\0"
-"it1.jenv-aruba.cloud\0"
-"kamisato.saitama.jp\0"
-"iwaki.fukushima.jp\0computer.museum\0"
-"kuromatsunai.hokkaido.jp\0"
-"of.london\0"
-"hikimi.shimane.jp\0"
-"lillesand.no\0"
-"williamhill\0"
-"okinawa.jp\0voting\0"
-"computerhistory.museum\0lanbib.se\0"
-"abarth\0"
-"asso.dz\0"
-"shiraoi.hokkaido.jp\0swidnik.pl\0"
-"biella.it\0bosch\0"
-"kami.miyagi.jp\0"
-"musashino.tokyo.jp\0byen.site\0"
-"vb.it\0"
-"shoo.okayama.jp\0lib.md.us\0"
-"arts.nf\0shop.ro\0"
-"fage\0rogers\0"
-"tmall\0"
-"guam.gu\0kakegawa.shizuoka.jp\0"
-"naka.hiroshima.jp\0tara.saga.jp\0"
-"solar\0"
-"machida.tokyo.jp\0is-a-chef.org\0"
-"\xe5\xae\xae\xe5\xb4\x8e.jp\0"
-"nahari.kochi.jp\0"
-"minami.tokushima.jp\0family\0"
-"carrd.co\0"
-"shop.pl\0merckmsd\0"
-"go.ci\0wakkanai.hokkaido.jp\0urasoe.okinawa.jp\0"
-"discover\0"
-"hs.kr\0ontario.museum\0imamat\0"
-"r\xc3\xa5""de.no\0"
-"jozi.biz\0"
-"go.cr\0anpachi.gifu.jp\0penza.su\0"
-"audible\0"
-"fukushima.fukushima.jp\0oregontrail.museum\0"
-"s3-eu-west-1.amazonaws.com\0"
-"cloud.goog\0"
-"khmelnytskyi.ua\0fail\0zara\0"
-"rackmaze.com\0"
-"uda.nara.jp\0"
-"s3.dualstack.eu-west-3.amazonaws.com\0"
-"tabuse.yamaguchi.jp\0clinique\0"
-"merseine.nu\0"
-"\xe5\x98\x89\xe9\x87\x8c\0"
-"lindesnes.no\0"
-"jcloud.ik-server.com\0siteleaf.net\0"
-"prof.pr\0"
-"lublin.pl\0"
-"gobo.wakayama.jp\0"
-"moka.tochigi.jp\0"
-"voyage\0conn.uk\0"
-"kudoyama.wakayama.jp\0bukhara.su\0"
-"higashitsuno.kochi.jp\0lilly\0"
-"katsushika.tokyo.jp\0dopaas.com\0"
-"idv.tw\0"
-"museumvereniging.museum\0"
-"ancona.it\0"
-"cc.me.us\0dyndns-server.com\0"
-"shioya.tochigi.jp\0"
-"wsa.gov.pl\0"
-"g.bg\0"
-"friuli-vegiulia.it\0andoy.no\0"
-"inabe.mie.jp\0"
-"americanexpress\0wedding\0"
-"ketrzyn.pl\0"
-"namegata.ibaraki.jp\0"
-"goiania.br\0hekinan.aichi.jp\0pyatigorsk.ru\0"
-"cn-northwest-1.eb.amazonaws.com.cn\0"
-"k12.ct.us\0"
-"\xe6\x9b\xb8\xe7\xb1\x8d\0lelux.site\0"
-"\xe5\xbe\xb3\xe5\xb3\xb6.jp\0fujiidera.osaka.jp\0"
-"gaivuotna.no\0"
-"\xd0\xbe\xd0\xb4.\xd1\x81\xd1\x80\xd0\xb1\0"
-"lawyer\0"
-"guge\0is-a-chef.com\0"
-"wallonie.museum\0tuxfamily.org\0"
-"partners\0dvrdns.org\0"
-"donostia.museum\0"
-"nanto.toyama.jp\0salvadordali.museum\0"
-"\xc3\xa5lesund.no\0"
-"software.aero\0dnsking.ch\0"
-"commune.am\0"
-"dattoweb.com\0"
-"bergamo.it\0"
-"go.id\0kiho.mie.jp\0dnsupdater.de\0"
-"gj\xc3\xb8vik.no\0"
-"losangeles.museum\0"
-"tn.it\0"
-"kitchen\0"
-"pi.it\0fans\0"
-"hakodate.hokkaido.jp\0"
-"tsukumi.oita.jp\0nodum.co\0"
-"go.it\0"
-"kunohe.iwate.jp\0"
-"static.land\0"
-"bz.it\0hazu.aichi.jp\0kui.hiroshima.jp\0cruises\0"
-"ddnsfree.com\0"
-"sunagawa.hokkaido.jp\0ryugasaki.ibaraki.jp\0"
-"harstad.no\0"
-"nu.ca\0go.jp\0"
-"alstom\0"
-"chanel\0"
-"cloudns.asia\0"
-"go.ke\0*.gateway.dev\0"
-"oita.oita.jp\0"
-"nikolaev.ua\0"
-"gov.ac\0"
-"nakasatsunai.hokkaido.jp\0oy.lc\0"
-"gov.ae\0*.quipelements.com\0"
-"gov.af\0myfritz.net\0"
-"natori.miyagi.jp\0press.se\0\xe0\xb8\x97\xe0\xb8\xab\xe0\xb8\xb2\xe0\xb8\xa3.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
-"tanagura.fukushima.jp\0"
-"go.kr\0dolls.museum\0nodum.io\0"
-"gov.al\0kyotamba.kyoto.jp\0"
-"\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbe\0"
-"courses\0flap.id\0"
-"gov.ba\0"
-"gov.ar\0gov.bb\0"
-"gov.as\0"
-"gov.au\0"
-"iris.arpa\0gov.bf\0dn.ua\0"
-"\xe7\xb5\x84\xe7\xbb\x87.hk\0susono.shizuoka.jp\0"
-"gov.bh\0"
-"gov.az\0east-kazakhstan.su\0"
-"ojiya.niigata.jp\0"
-"kamikawa.hyogo.jp\0"
-"gov.bm\0marriott\0"
-"gov.bn\0goto.nagasaki.jp\0"
-"asso.re\0farm\0"
-"western.museum\0"
-"gov.br\0\xe7\xbd\x91\xe7\xbb\x9c\0"
-"gov.bs\0watarai.mie.jp\0"
-"gov.bt\0gov.cd\0asahi.ibaraki.jp\0saintlouis.museum\0"
-"ostrowiec.pl\0help\0phx.enscaled.us\0"
-"mod.gi\0"
-"tunk.org\0"
-"gov.by\0koganei.tokyo.jp\0"
-"gov.bz\0suzuka.mie.jp\0"
-"gov.cl\0marnardal.no\0"
-"gov.cm\0"
-"gov.cn\0"
-"gov.co\0nabari.mie.jp\0"
-"barcelona.museum\0"
-"tourism.tn\0"
-"gov.cu\0cc.la.us\0grondar.za\0"
-"fast\0"
-"priv.hu\0misato.miyagi.jp\0no-ip.net\0"
-"gov.cx\0"
-"gov.cy\0"
-"gov.dm\0"
-"vagsoy.no\0"
-"gov.do\0tome.miyagi.jp\0"
-"crimea.ua\0"
-"gov.ec\0"
-"gov.ee\0"
-"historyofscience.museum\0"
-"gov.eg\0"
-"gov.dz\0\xda\x80\xd8\xa7\xd8\xb1\xd8\xaa\0"
-"tohma.hokkaido.jp\0"
-"imari.saga.jp\0nesodden.no\0"
-"gov.et\0balsan.it\0noda.iwate.jp\0"
-"capitalone\0"
-"niigata.jp\0berlin\0"
-"gov.fj\0unnan.shimane.jp\0"
-"asso.nc\0karm\xc3\xb8y.no\0"
-"go.pw\0"
-"jur.pro\0"
-"toei.aichi.jp\0oki.fukuoka.jp\0gb.net\0"
-"farmstead.museum\0cuisinella\0"
-"perso.sn\0"
-"press.ma\0"
-"gov.gd\0wodzislaw.pl\0academy\0"
-"gov.ge\0lifeinsurance\0"
-"lib.ny.us\0"
-"gov.gh\0berlin.museum\0"
-"gov.gi\0fla.no\0"
-"nu.it\0"
-"birdart.museum\0hisamitsu\0shaw\0"
-"wazuka.kyoto.jp\0"
-"orsites.com\0"
-"gov.gn\0"
-"sekikawa.niigata.jp\0"
-"\xce\xb5\xce\xbb\0"
-"gov.gr\0yoshioka.gunma.jp\0perso.tn\0"
-"av.it\0"
-"gov.gu\0ujiie.tochigi.jp\0elblag.pl\0gripe\0"
-"gov.gy\0"
-"trentino-s\xc3\xbc""dtirol.it\0fujikawaguchiko.yamanashi.jp\0\xce\xb5\xcf\x85\0akdn\0here\0"
-"gov.hk\0higashi.fukushima.jp\0"
-"jp.kg\0"
-"presidio.museum\0"
-"cable-modem.org\0"
-"usdecorativearts.museum\0hyllestad.no\0"
-"ab.ca\0gov.ie\0gyeongbuk.kr\0beats\0london\0"
-"priv.at\0"
-"zushi.kanagawa.jp\0"
-"niigata.niigata.jp\0guru\0repair\0"
-"gov.il\0"
-"gov.in\0palmsprings.museum\0"
-"echizen.fukui.jp\0go.th\0"
-"gov.iq\0go.tj\0diskussionsbereich.de\0"
-"gov.ir\0dreamhosters.com\0"
-"gov.is\0hagebostad.no\0barsy.site\0to.work\0"
-"gov.it\0"
-"filegear-sg.me\0"
-"gob.ar\0"
-"yuki.ibaraki.jp\0"
-"is-very-evil.org\0"
-"avoues.fr\0traniandriabarletta.it\0official.academy\0"
-"sakae.chiba.jp\0"
-"miyazu.kyoto.jp\0murayama.yamagata.jp\0jp.md\0"
-"go.ug\0"
-"gov.jo\0"
-"ikano\0"
-"sardinia.it\0go.tz\0tn.us\0epson\0"
-"tainai.niigata.jp\0"
-"daejeon.kr\0"
-"gob.bo\0\xc3\xb8ksnes.no\0"
-"utsunomiya.tochigi.jp\0"
-"taranto.it\0tateyama.chiba.jp\0"
-"gov.kg\0"
-"\xe5\x95\x86\xe5\x9f\x8e\0"
-"aisai.aichi.jp\0kanan.osaka.jp\0gov.ki\0glogow.pl\0"
-"tako.chiba.jp\0gov.km\0"
-"gov.kn\0"
-"tsk.tr\0istanbul\0"
-"gov.kp\0railroad.museum\0aver\xc3\xb8y.no\0dovre.no\0"
-"gob.cl\0gov.la\0smile\0"
-"gov.lb\0\xd0\xba\xd0\xb0\xd1\x82\xd0\xbe\xd0\xbb\xd0\xb8\xd0\xba\0pl.eu.org\0"
-"iwade.wakayama.jp\0gov.lc\0seljord.no\0"
-"hokkaido.jp\0"
-"asso.km\0gov.kw\0"
-"tingvoll.no\0"
-"gov.ky\0"
-"gov.kz\0"
-"gov.lk\0\xe5\x81\xa5\xe5\xba\xb7\0"
-"logoip.com\0"
-"royken.no\0"
-"\xc3\xa5lg\xc3\xa5rd.no\0tele.amune.org\0"
-"cc.as.us\0"
-"gov.ma\0"
-"iizuka.fukuoka.jp\0gov.lr\0"
-"gov.ls\0"
-"gob.do\0gov.lt\0g.se\0k12.in.us\0"
-"gov.me\0"
-"gov.lv\0"
-"gov.mg\0leksvik.no\0"
-"gob.ec\0myjino.ru\0"
-"gov.ly\0"
-"aparecida.br\0"
-"gov.mk\0"
-"gov.ml\0"
-"asso.mc\0keymachine.de\0"
-"gov.mn\0"
-"gov.mo\0"
-"gov.mr\0"
-"gov.ms\0"
-"engineer.aero\0cng.br\0"
-"gov.mu\0ostroleka.pl\0shia\0"
-"gov.mv\0"
-"gov.mw\0gov.ng\0"
-"gob.es\0"
-"gov.my\0"
-"gov.mz\0"
-"erni\0barsy.info\0"
-"california.museum\0"
-"cloud.interhostsolutions.be\0"
-"gov.nr\0"
-"pharmacien.fr\0"
-"marumori.miyagi.jp\0cust.disrec.thingdust.io\0"
-"shikaoi.hokkaido.jp\0"
-"sakata.yamagata.jp\0"
-"nichinan.tottori.jp\0"
-"hino.tottori.jp\0"
-"zaporizhzhia.ua\0barsy.shop\0"
-"utazu.kagawa.jp\0lib.nm.us\0"
-"gov.om\0"
-"na.it\0saskatchewan.museum\0"
-"aaa.pro\0"
-"tourism.pl\0"
-"nanyo.yamagata.jp\0"
-"qld.gov.au\0nokia\0"
-"gov.ph\0"
-"gob.gt\0"
-"glitch.me\0"
-"gov.pk\0fastvps.host\0"
-"gov.pl\0"
-"omniwe.site\0"
-"gov.pn\0"
-"cinema.museum\0"
-"schokokeks.net\0"
-"windmill.museum\0gov.qa\0"
-"gov.pr\0"
-"gob.hn\0potenza.it\0kiwa.mie.jp\0gov.ps\0"
-"chocolate.museum\0gov.pt\0"
-"nsupdate.info\0"
-"tw.cn\0"
-"gov.py\0"
-"miyada.nagano.jp\0s3.eu-central-1.amazonaws.com\0"
-"ethnology.museum\0"
-"hitachiota.ibaraki.jp\0"
-"gx.cn\0inzai.chiba.jp\0higashiagatsuma.gunma.jp\0"
-"reggioemilia.it\0kunstsammlung.museum\0"
-"kagami.kochi.jp\0"
-"linde\0\xe3\x81\xbf\xe3\x82\x93\xe3\x81\xaa\0bmoattachments.org\0"
-"arkhangelsk.su\0"
-"lesja.no\0"
-"my-router.de\0"
-"swiebodzin.pl\0"
-"miyagi.jp\0"
-"isleofman.museum\0r\xc3\xa1isa.no\0"
-"alstahaug.no\0mielno.pl\0"
-"forsand.no\0gov.sa\0av.tr\0"
-"gov.sb\0"
-"gov.rs\0gov.sc\0"
-"gov.sd\0"
-"kawanishi.hyogo.jp\0furniture.museum\0gov.ru\0"
-"dellogliastra.it\0legal\0"
-"takata.fukuoka.jp\0gov.rw\0gov.sg\0"
-"kumejima.okinawa.jp\0costume.museum\0gov.sh\0"
-"economia.bo\0pesarourbino.it\0schoenbrunn.museum\0"
-"is-with-theband.com\0"
-"gov.sl\0"
-"drud.io\0"
-"gov.so\0"
-"trentinoalto-adige.it\0"
-"is-a-chef.net\0"
-"gov.ss\0"
-"lavagis.no\0gov.st\0"
-"*.yokohama.jp\0work\0"
-"gov.sx\0"
-"gov.sy\0*.on-rio.io\0"
-"gov.tj\0"
-"gov.tl\0cc.mn.us\0coupons\0"
-"gov.tm\0"
-"esp.br\0gov.tn\0"
-"*.kitakyushu.jp\0gov.to\0"
-"greta.fr\0gov.ua\0"
-"p.bg\0gov.tr\0"
-"opencraft.hosting\0"
-"shikokuchuo.ehime.jp\0gov.tt\0shop\0"
-"her\xc3\xb8y.nordland.no\0k12.me.us\0"
-"ashikaga.tochigi.jp\0gov.tw\0"
-"psi.br\0"
-"logistics.aero\0"
-"cremona.it\0gov.uk\0show\0"
-"\xe7\xbd\x91\xe7\xb5\xa1.hk\0"
-"aeroclub.aero\0"
-"hanamigawa.chiba.jp\0accountants\0"
-"gov.vc\0"
-"kishiwada.osaka.jp\0muenchen.museum\0gov.ve\0from-wa.com\0"
-"malopolska.pl\0"
-"fuji.shizuoka.jp\0"
-"\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86\0"
-"gob.mx\0senseering.net\0"
-"gob.ni\0gov.vn\0is-a-celticsfan.org\0"
-"higashimatsuyama.saitama.jp\0catholic\0"
-"bir.ru\0"
-"tawaramoto.nara.jp\0"
-"ballooning.aero\0komaki.aichi.jp\0pagexl.com\0"
-"lom.it\0"
-"moriguchi.osaka.jp\0latrobe\0qc.com\0"
-"funagata.yamagata.jp\0"
-"store.nf\0"
-"from-id.com\0"
-"video.hu\0aomori.aomori.jp\0"
-"plc.ly\0"
-"pr.it\0lib.la.us\0"
-"kepno.pl\0"
-"gov.ws\0"
-"bentley\0homedns.org\0"
-"coop.ht\0gob.pa\0kerryhotels\0"
-"modum.no\0"
-"cs.it\0gob.pe\0"
-"olayangroup\0*.dev.adobeaemcloud.com\0"
-"hughes\0balena-devices.com\0"
-"ichikawamisato.yamanashi.jp\0gob.pk\0pixolino.com\0"
-"tc.br\0"
-"modelling.aero\0on.ca\0"
-"cultural.museum\0"
-"\xe5\xb1\xb1\xe6\xa2\xa8.jp\0b\xc3\xa1l\xc3\xa1t.no\0gov.ye\0"
-"shimamaki.hokkaido.jp\0tsushima.nagasaki.jp\0"
-"niteroi.br\0slask.pl\0cool\0"
-"coop\0"
-"artdeco.museum\0stranda.no\0"
-"gov.za\0"
-"risor.no\0"
-"zp.ua\0is-an-entertainer.com\0"
-"coop.br\0"
-"unzen.nagasaki.jp\0vaporcloud.io\0"
-"gd.cn\0spacekit.io\0"
-"orange\0"
-"\xe4\xb8\x89\xe9\x87\x8d.jp\0"
-"sibenik.museum\0"
-"govt.nz\0tychy.pl\0"
-"ito.shizuoka.jp\0gov.zm\0"
-"daisen.akita.jp\0mizuho.tokyo.jp\0from-tx.com\0"
-"kounosu.saitama.jp\0"
-"eidfjord.no\0katowice.pl\0"
-"piw.gov.pl\0"
-"tsubetsu.hokkaido.jp\0"
-"seranishi.hiroshima.jp\0gov.zw\0own.pm\0"
-"workers.dev\0"
-"gorge.museum\0"
-"scienceandindustry.museum\0"
-"plurinacional.bo\0"
-"shinjuku.tokyo.jp\0austrheim.no\0priv.pl\0zhitomir.ua\0"
-"wakayama.jp\0mukawa.hokkaido.jp\0"
-"lom.no\0"
-"il.us\0"
-"from-dc.com\0"
-"joboji.iwate.jp\0nishiizu.shizuoka.jp\0"
-"hemsedal.no\0"
-"itako.ibaraki.jp\0"
-"taiki.mie.jp\0gob.sv\0"
-"cust.dev.thingdust.io\0"
-"ikoma.nara.jp\0lacaixa\0"
-"kasahara.gifu.jp\0\xe6\x94\xbf\xe5\x8a\xa1\0"
-"trentino-suedtirol.it\0"
-"langevag.no\0"
-"cc.gu.us\0"
-"eng.br\0leadpages.co\0"
-"nom.ad\0"
-"nom.ae\0"
-"nom.af\0"
-"nom.ag\0podlasie.pl\0edugit.org\0"
-"conference.aero\0k12.ky.us\0"
-"nom.ai\0"
-"from-va.com\0"
-"nom.al\0"
-"matsumae.hokkaido.jp\0priv.no\0"
-"dazaifu.fukuoka.jp\0"
-"gob.ve\0"
-"kokonoe.oita.jp\0\xd8\xb3\xd9\x88\xd8\xb1\xd9\x8a\xd8\xa7\0"
-"\xd8\xb3\xd9\x88\xd8\xb1\xd9\x8a\xd8\xa9\0loginline.site\0"
-"pavia.it\0iveco\0"
-"waw.pl\0"
-"rennes\xc3\xb8y.no\0"
-"nativeamerican.museum\0aca.pro\0"
-"toba.mie.jp\0"
-"katsuragi.wakayama.jp\0"
-"fed.us\0store.ve\0nctu.me\0"
-"careers\0nom.bz\0"
-"univ.sn\0ma.leg.br\0nom.cl\0"
-"namsskogan.no\0"
-"sosa.chiba.jp\0"
-"nom.co\0plc.uk\0drud.us\0"
-"ss.it\0kawanehon.shizuoka.jp\0"
-"onrender.com\0"
-"toyo.kochi.jp\0kvafjord.no\0"
-"kannami.shizuoka.jp\0rackmaze.net\0"
-"priv.me\0"
-"\xe5\x8f\xb0\xe6\xb9\xbe\0"
-"akrehamn.no\0"
-"education.museum\0flekkefjord.no\0vinnica.ua\0\xe9\x9b\xbb\xe8\xa8\x8a\xe7\x9b\x88\xe7\xa7\x91\0"
-"matta-varjjat.no\0"
-"salvador.br\0"
-"bo.it\0*.compute-1.amazonaws.com\0"
-"koga.fukuoka.jp\0"
-"bizen.okayama.jp\0mandal.no\0"
-"jelenia-gora.pl\0ally\0"
-"v\xc3\xa6r\xc3\xb8y.no\0pomorze.pl\0"
-"kariwa.niigata.jp\0"
-"fosnes.no\0"
-"walter\0"
-"silk\0"
-"sor-aurdal.no\0"
-"pila.pl\0"
-"kamo.niigata.jp\0sweden.museum\0no.eu.org\0"
-"rag-cloud-ch.hosteur.com\0"
-"nom.es\0ushuaia.museum\0jorpeland.no\0"
-"rivne.ua\0"
-"tula.su\0"
-"aoki.nagano.jp\0"
-"saikai.nagasaki.jp\0"
-"servep2p.com\0"
-"minamiuonuma.niigata.jp\0"
-"nom.fr\0itayanagi.aomori.jp\0sauda.no\0sina\0"
-"genting\0"
-"nom.gd\0"
-"asago.hyogo.jp\0nom.ge\0"
-"bolt.hu\0"
-"kitashiobara.fukushima.jp\0jobs.tt\0mintere.site\0"
-"nom.gl\0"
-"pr.us\0"
-"carboniaiglesias.it\0"
-"choyo.kumamoto.jp\0"
-"motobu.okinawa.jp\0store.ro\0"
-"it1-eur.jenv-arubabiz.cloud\0"
-"nom.gt\0"
-"dc.us\0loan\0"
-"yahiko.niigata.jp\0"
-"hashikami.aomori.jp\0likescandy.com\0"
-"giehtavuoatna.no\0"
-"kameoka.kyoto.jp\0*.sch.uk\0"
-"space-to-rent.com\0nom.hn\0"
-"cc.ok.us\0"
-"webhop.me\0"
-"ownip.net\0"
-"kawazu.shizuoka.jp\0nyuzen.toyama.jp\0store.st\0cc.ga.us\0"
-"kouhoku.saga.jp\0"
-"owariasahi.aichi.jp\0"
-"benevento.it\0azurewebsites.net\0"
-"al.eu.org\0"
-"p.se\0nom.im\0"
-"nakaniikawa.toyama.jp\0"
-"plants.museum\0"
-"jetzt\0ssl.origin.cdn77-secure.org\0"
-"leasing.aero\0k12.as.us\0"
-"\xd8\xa7\xd9\x85\xd8\xa7\xd8\xb1\xd8\xa7\xd8\xaa\0\xd0\xbe\xd0\xbd\xd0\xbb\xd0\xb0\xd0\xb9\xd0\xbd\0"
-"l\xc3\xa4ns.museum\0"
-"sci.eg\0higashimurayama.tokyo.jp\0career\0"
-"semine.miyagi.jp\0"
-"patria.bo\0"
-"2ix.at\0"
-"nom.ke\0"
-"chuo.yamanashi.jp\0"
-"nom.km\0"
-"gs.rl.no\0ro.im\0"
-"nz.eu.org\0"
-"kumagaya.saitama.jp\0mazury.pl\0twmail.net\0"
-"kvalsund.no\0"
-"vt.it\0ino.kochi.jp\0"
-"koka.shiga.jp\0volkswagen\0"
-"myasustor.com\0"
-"arezzo.it\0ro.it\0\xe5\x85\xb5\xe5\xba\xab.jp\0"
-"2ix.ch\0"
-"kagawa.jp\0austin.museum\0nom.li\0"
-"gs.ah.no\0"
-"lib.fl.us\0"
-"energy\0"
-"plesk.page\0"
-"forsale\0"
-"\xc3\xa5snes.no\0dynv6.net\0"
-"sasebo.nagasaki.jp\0""2ix.de\0"
-"\xd8\xa7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86.ir\0"
-"site\0nom.lv\0"
-"nom.mg\0"
-"froland.no\0"
-"glade\0"
-"tromsa.no\0*.lcl.dev\0"
-"kashiwara.osaka.jp\0nom.mk\0"
-"miki.hyogo.jp\0kyiv.ua\0loft\0"
-"from-oh.com\0"
-"minamitane.kagoshima.jp\0"
-"amex\0"
-"industria.bo\0nom.nc\0kvits\xc3\xb8y.no\0is-a-llama.com\0es-1.axarnet.cloud\0brasilia.me\0"
-"sevastopol.ua\0"
-"j\xc3\xb8lster.no\0coop.rw\0"
-"trentino-s-tirol.it\0"
-"minamiboso.chiba.jp\0*.s5y.io\0"
-"nom.ni\0"
-"v-info.info\0"
-"fujimi.saitama.jp\0"
-"padua.it\0"
-"michigan.museum\0"
-"tolga.no\0"
-"toshiba\0"
-"wroclaw.pl\0"
-"za.net\0"
-"varese.it\0lind\xc3\xa5s.no\0"
-"nom.nu\0"
-"from-mn.com\0"
-"kyowa.hokkaido.jp\0"
-"hgtv\0"
-"honjo.akita.jp\0"
-"caxias.br\0"
-"\xe5\xa4\xa7\xe6\x8b\xbf\0"
-"broker\0"
-"yufu.oita.jp\0nom.pa\0"
-"securitytactics.com\0"
-"coop.tt\0is-a-student.com\0vladimir.su\0"
-"nom.pe\0"
-"verona.it\0beardu.no\0"
-"\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa5\x8b\xe0\xa4\xa4\0"
-"foggia.it\0capebreton.museum\0civilwar.museum\0"
-"nemuro.hokkaido.jp\0"
-"nom.pl\0"
-"cc.wa.us\0tushu\0poznan.pl\0"
-"oharu.aichi.jp\0"
-"mormon\0nom.qa\0"
-"hitachiomiya.ibaraki.jp\0hopto.org\0wedeploy.sh\0"
-"\xe0\xa8\xad\xe0\xa8\xbe\xe0\xa8\xb0\xe0\xa8\xa4\0"
-"higashine.yamagata.jp\0"
-"coop.mv\0"
-"coop.mw\0"
-"eti.br\0nom.pw\0"
-"schweiz.museum\0"
-"agdenes.no\0joburg\0"
-"y.bg\0"
-"hiroo.hokkaido.jp\0torsken.no\0tn.oxa.cloud\0"
-"tachikawa.tokyo.jp\0"
-"4.bg\0audio\0windows\0*.linodeobjects.com\0"
-"k12.nh.us\0philips\0"
-"yachimata.chiba.jp\0jeonnam.kr\0cog.mi.us\0"
-"bulsan.it\0catering\0"
-"powiat.pl\0k12.ia.us\0does-it.net\0"
-"kodaira.tokyo.jp\0"
-"intl.tn\0"
-"nom.re\0"
-"aejrie.no\0"
-"ureshino.mie.jp\0bievat.no\0casacam.net\0"
-"*.nagoya.jp\0kuroiso.tochigi.jp\0"
-"dev.br\0"
-"samegawa.fukushima.jp\0"
-"nom.ro\0"
-"nrw.museum\0bplaced.com\0"
-"nanjo.okinawa.jp\0"
-"vladimir.ru\0nom.rs\0"
-"sogndal.no\0"
-"asn.au\0"
-"sg.cloudswitches.com\0"
-"kuwana.mie.jp\0pinb.gov.pl\0nom.si\0"
-"makeup\0"
-"soundcast.me\0"
-"vestv\xc3\xa5g\xc3\xb8y.no\0"
-"for-better.biz\0"
-"cloudns.biz\0nom.st\0"
-"togo.aichi.jp\0"
-"coop.py\0"
-"nom.tj\0"
-"is-a-guru.com\0"
-"wada.nagano.jp\0"
-"nom.tm\0netflix\0"
-"koya.wakayama.jp\0"
-"entomology.museum\0"
-"sellsyourhome.org\0"
-"yawara.ibaraki.jp\0"
-"from-nh.com\0"
-"environment.museum\0usgarden.museum\0creditunion\0nom.ug\0"
-"palmas.br\0gok.pk\0"
-"kamogawa.chiba.jp\0"
-"\xe9\xa3\x9e\xe5\x88\xa9\xe6\xb5\xa6\0"
-"mima.tokushima.jp\0"
-"principe.st\0\xd1\x83\xd0\xbf\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0"
-"hino.tokyo.jp\0surnadal.no\0"
-"rockart.museum\0"
-"nom.vc\0"
-"s3-ap-northeast-1.amazonaws.com\0"
-"shopitsite.com\0"
-"trogstad.no\0contact\0nom.vg\0"
-"nom.uy\0"
-"jc.neen.it\0"
-"kasamatsu.gifu.jp\0coop.km\0kyoto\0"
-"panel.gg\0"
-"labor.museum\0n4t.co\0myftp.org\0"
-"audnedaln.no\0"
-"store.bb\0"
-"mikasa.hokkaido.jp\0africa\0"
-"ebetsu.hokkaido.jp\0itano.tokushima.jp\0higashikurume.tokyo.jp\0"
-"forlicesena.it\0"
-"flickr\0"
-"nakanoto.ishikawa.jp\0"
-"b\xc3\xb8.nordland.no\0"
-"nomi.ishikawa.jp\0mydatto.com\0"
-"vt.us\0"
-"gotdns.org\0"
-"kutno.pl\0"
-"busan.kr\0"
-"correios-e-telecomunica\xc3\xa7\xc3\xb5""es.museum\0nj.us\0"
-"swinoujscie.pl\0"
-"namsos.no\0"
-"garden\0"
-"ak.us\0"
-"kamiamakusa.kumamoto.jp\0"
-"crafts.museum\0*.r.appspot.com\0"
-"fot.br\0"
-"yonezawa.yamagata.jp\0"
-"pvt.k12.ma.us\0"
-"quebec\0*.sensiosite.cloud\0"
-"sande.vestfold.no\0bar0.net\0"
-"store.dk\0"
-"k12.tn.us\0church\0"
-"\xe5\x92\x8c\xe6\xad\x8c\xe5\xb1\xb1.jp\0azimuth.network\0"
-"e.bg\0\xe7\x86\x8a\xe6\x9c\xac.jp\0kinko.kagoshima.jp\0"
-"government.aero\0nom.za\0"
-"ddnsgeek.com\0"
-"k12.gu.us\0fresenius\0"
-"higashiosaka.osaka.jp\0"
-"cookingchannel\0"
-"geisei.kochi.jp\0fbx-os.fr\0"
-"kunitachi.tokyo.jp\0commbank\0jelastic.tsukaeru.net\0"
-"porsangu.no\0"
-"homesense\0wedeploy.me\0"
-"lewismiller.museum\0"
-"norfolk.museum\0institute\0repl.co\0"
-"blogspot.vn\0"
-"radio.am\0"
-"baseball\0"
-"lund.no\0"
-"cheltenham.museum\0vantaa.museum\0"
-"chosei.chiba.jp\0"
-"sannan.hyogo.jp\0"
-"kitadaito.okinawa.jp\0"
-"\xe7\xbd\x91\xe5\xba\x97\0"
-"radio.br\0"
-"kisofukushima.nagano.jp\0love\0"
-"pg.it\0suzuki\0"
-"gs.bu.no\0"
-"kr.it\0tenkawa.nara.jp\0lib.ga.us\0"
-"\xe5\xaf\x8c\xe5\xb1\xb1.jp\0matsushige.tokushima.jp\0"
-"kamoenai.hokkaido.jp\0"
-"glass\0"
-"ch.it\0"
-"webhop.org\0"
-"jelastic.saveincloud.net\0"
-"ns.ca\0"
-"guitars\0"
-"asn.lv\0"
-"suifu.ibaraki.jp\0muroto.kochi.jp\0gausdal.no\0zero\0"
-"artgallery.museum\0"
-"sh.cn\0blogspot.re\0"
-"meinforum.net\0"
-"columbus.museum\0physio\0services\0"
-"aip.ee\0"
-"blogspot.ro\0"
-"fi.cr\0"
-"blogspot.rs\0"
-"lv.ua\0\xd9\x85\xd9\x84\xd9\x8a\xd8\xb3\xd9\x8a\xd8\xa7\0"
-"insurance.aero\0blogspot.ru\0blogspot.se\0"
-"mg.leg.br\0"
-"blogspot.sg\0"
-"mt.eu.org\0blogspot.si\0"
-"chiyoda.tokyo.jp\0"
-"tmp.br\0blogspot.sk\0bloxcms.com\0"
-"e4.cz\0de.trendhosting.cloud\0"
-"sayama.saitama.jp\0blogspot.sn\0"
-"radio.fm\0"
-"!city.sendai.jp\0"
-"maserati\0blogspot.td\0jed.wafaicloud.com\0website.yandexcloud.net\0"
-"yamanouchi.nagano.jp\0"
-"online\0"
-"dating\0"
-"homelink.one\0"
-"ia.us\0"
-"sannohe.aomori.jp\0"
-"froya.no\0"
-"us.com\0"
-"blogsite.org\0"
-"kagoshima.jp\0"
-"kiev.ua\0"
-"s3.ap-northeast-2.amazonaws.com\0from-ct.com\0"
-"medio-campidano.it\0qoto.io\0"
-"opole.pl\0"
-"bari.it\0"
-"toyone.aichi.jp\0data\0blogspot.tw\0blogspot.ug\0"
-"sobetsu.hokkaido.jp\0arida.wakayama.jp\0"
-"namie.fukushima.jp\0"
-"date\0tatar\0"
-"gwiddle.co.uk\0"
-"lenvik.no\0ap-northeast-1.elasticbeanstalk.com\0"
-"neues.museum\0"
-"kaga.ishikawa.jp\0"
-"bronnoysund.no\0"
-"blogspot.mr\0"
-"countryestate.museum\0y.se\0"
-"hannan.osaka.jp\0ralingen.no\0\xe5\x8f\xb0\xe7\x81\xa3\0"
-"fitjar.no\0"
-"unusualperson.com\0"
-"oppegard.no\0"
-"blogspot.mx\0"
-"skin\0blogspot.my\0"
-"quebec.museum\0"
-"fastvps-server.com\0blogspot.nl\0rdv.to\0"
-"iwata.shizuoka.jp\0"
-"kisosaki.mie.jp\0blogspot.no\0"
-"hashimoto.wakayama.jp\0"
-"saves-the-whales.com\0"
-"barsyonline.com\0hicam.net\0"
-"wanggou\0"
-"s3-eu-west-3.amazonaws.com\0"
-"virtuel.museum\0"
-"ibestad.no\0"
-"hermes\0"
-"newspaper.museum\0s3.dualstack.eu-west-1.amazonaws.com\0"
-"law.pro\0horse\0mozilla-iot.org\0"
-"takanabe.miyazaki.jp\0yasaka.nagano.jp\0"
-"sorfold.no\0"
-"ny-1.paas.massivegrid.net\0"
-"gratis\0privatizehealthinsurance.net\0"
-"lib.wa.us\0scrapper-site.net\0blogspot.pe\0"
-"furniture\0"
-"lib.sd.us\0"
-"trentino-sud-tirol.it\0"
-"lib.ok.us\0"
-"ca.reclaim.cloud\0"
-"gjovik.no\0lib.in.us\0"
-"med.br\0"
-"olbia-tempio.it\0blogspot.qa\0"
-"co.com\0"
-"fi.it\0yame.fukuoka.jp\0allfinanz\0blogspot.pt\0"
-"*.cloud.metacentrum.cz\0"
-"exnet.su\0"
-"at.it\0"
-"mytuleap.com\0"
-"cargo.aero\0xbox\0"
-"imabari.ehime.jp\0supplies\0is-into-anime.com\0"
-"nagasaki.nagasaki.jp\0"
-"\xe6\x96\xb0\xe6\xbd\x9f.jp\0"
-"kosai.shizuoka.jp\0onza.mythic-beasts.com\0"
-"lipsy\0"
-"mitsue.nara.jp\0blogspot.is\0"
-"blogspot.it\0"
-"egyptian.museum\0dev.vu\0"
-"mo.cn\0"
-"med.ec\0blogspot.jp\0vipsinaapp.com\0"
-"ch.tc\0"
-"med.ee\0"
-"blogspot.co.at\0wedeploy.io\0"
-"dscloud.biz\0"
-"civilaviation.aero\0taa.it\0"
-"tochio.niigata.jp\0"
-"kr.ua\0a.run.app\0"
-"asker.no\0"
-"author.aero\0"
-"blogspot.kr\0"
-"minamiaiki.nagano.jp\0"
-"at.md\0"
-"gru.br\0"
-"lombardy.it\0sogne.no\0\xe6\x95\x99\xe8\x82\xb2.\xe9\xa6\x99\xe6\xb8\xaf\0blogspot.li\0"
-"fujisato.akita.jp\0kwpsp.gov.pl\0vpndns.net\0"
-"valdaosta.it\0naha.okinawa.jp\0nanbu.tottori.jp\0"
-"soccer\0"
-"yonago.tottori.jp\0wskr.gov.pl\0bplaced.net\0"
-"k\xc3\xa1r\xc3\xa1\xc5\xa1johka.no\0blogspot.lt\0blogspot.md\0"
-"blogspot.lu\0"
-"luxury\0"
-"soundandvision.museum\0my.eu.org\0myeffect.net\0"
-"oga.akita.jp\0blogspot.mk\0"
-"misaki.osaka.jp\0"
-"yoka.hyogo.jp\0k12.wi.us\0"
-"\xd8\xa8\xd8\xa7\xd8\xb2\xd8\xa7\xd8\xb1\0"
-"takaishi.osaka.jp\0"
-"k12.mo.us\0groks-this.info\0"
-"e.se\0"
-"ecn.br\0blogspot.fi\0"
-"gangwon.kr\0"
-"chiropractic.museum\0historichouses.museum\0k12.az.us\0"
-"fhsk.se\0za.org\0"
-"med.ht\0brescia.it\0"
-"blogspot.fr\0"
-"h\xc3\xb8ylandet.no\0yamaxun\0"
-"community\0"
-"bharti\0"
-"kl\xc3\xa6""bu.no\0"
-"taki.mie.jp\0"
-"itabashi.tokyo.jp\0"
-"hvaler.no\0nov.ru\0"
-"leitungsen.de\0"
-"ing.pa\0"
-"blogspot.gr\0"
-"vikna.no\0"
-"gs.vf.no\0pomorskie.pl\0"
-"military.museum\0compare\0"
-"zgorzelec.pl\0space\0nov.su\0blogspot.hk\0hidora.com\0"
-"mihama.fukui.jp\0"
-"vi.it\0os.hedmark.no\0"
-"\xe6\x95\x8e\xe8\x82\xb2.hk\0"
-"wroc.pl\0"
-"blogspot.hr\0dev-myqnapcloud.com\0"
-"mo.it\0"
-"web.app\0"
-"blogspot.hu\0blogspot.ie\0"
-"gv.ao\0"
-"motorcycle.museum\0"
-"lib.al.us\0"
-"tinn.no\0flights\0"
-"gv.at\0pp.az\0*.customer-oci.com\0"
-"black\0"
-"taishi.hyogo.jp\0blogspot.in\0"
-"cistron.nl\0"
-"blogspot.ba\0"
-"sp.gov.br\0blogspot.co.id\0"
-"agrinet.tn\0hotmail\0"
-"blogspot.be\0"
-"blogspot.bg\0"
-"bd.se\0"
-"xz.cn\0dyroy.no\0hyatt\0"
-"blogspot.bj\0"
-"blogspot.co.il\0"
-"higashi.okinawa.jp\0"
-"sveio.no\0repl.run\0"
-"rotorcraft.aero\0"
-"sugito.saitama.jp\0blogspot.ca\0"
-"med.ly\0blogspot.cf\0eu.platform.sh\0"
-"cq.cn\0maif\0blogspot.ch\0"
-"nl.eu.org\0"
-"blogspot.cl\0"
-"twmail.org\0"
-"oyamazaki.kyoto.jp\0"
-"takaoka.toyama.jp\0"
-"ipiranga\0"
-"blogspot.de\0"
-"mihama.aichi.jp\0blogspot.cv\0"
-"myhome-server.de\0localzone.xyz\0stage.nodeart.io\0"
-"blogspot.cz\0"
-"blogspot.dk\0"
-"app.banzaicloud.io\0"
-"kakuda.miyagi.jp\0shimosuwa.nagano.jp\0"
-"otaki.saitama.jp\0"
-"chuo.fukuoka.jp\0"
-"desa.id\0"
-"kasugai.aichi.jp\0med.om\0at.vg\0"
-"novara.it\0company\0"
-"so.gov.pl\0"
-"indianapolis.museum\0med.pa\0firestone\0"
-"yawata.kyoto.jp\0"
-"valled-aosta.it\0chihayaakasaka.osaka.jp\0usarts.museum\0"
-"n.bg\0"
-"reggio-calabria.it\0t\xc3\xb8nsberg.no\0"
-"groundhandling.aero\0"
-"med.pl\0"
-"kakinoki.shimane.jp\0ringebu.no\0"
-"yokaichiba.chiba.jp\0ap-south-1.elasticbeanstalk.com\0"
-"*.compute.amazonaws.com\0is-a-liberal.com\0"
-"lyngdal.no\0"
-"quest\0"
-"\xe6\x96\xb0\xe9\x97\xbb\0"
-"moroyama.saitama.jp\0lugs.org.uk\0"
-"unicloud.pl\0"
-"accident-prevention.aero\0"
-"iyo.ehime.jp\0oguni.kumamoto.jp\0"
-"aizubange.fukushima.jp\0itakura.gunma.jp\0"
-"gitpage.si\0"
-"suldal.no\0bip.sh\0"
-"la-spezia.it\0"
-"oyama.tochigi.jp\0gs.tr.no\0"
-"cosenza.it\0"
-"cloudera.site\0"
-"club.aero\0med.sa\0"
-"med.sd\0"
-"lib.ks.us\0blogspot.ae\0"
-"amsterdam.museum\0"
-"fr-1.paas.massivegrid.net\0"
-"rieti.it\0brumunddal.no\0ng.eu.org\0"
-"recipes\0rhcloud.com\0"
-"blogspot.al\0"
-"blogspot.am\0"
-"knowsitall.info\0svn-repos.de\0"
-"bearalv\xc3\xa1hki.no\0"
-"media.museum\0"
-"firewall-gateway.de\0"
-"cody.museum\0"
-"yamatsuri.fukushima.jp\0"
-"drobak.no\0n\xc3\xb8tter\xc3\xb8y.no\0"
-"omega\0"
-"athleta\0khplay.nl\0"
-"rexroth\0"
-"frogans\0"
-"\xd9\x83\xd8\xa7\xd8\xab\xd9\x88\xd9\x84\xd9\x8a\xd9\x83\0"
-"mragowo.pl\0"
-"is-a-cpa.com\0"
-"\xd9\x85\xd9\x88\xd8\xb1\xd9\x8a\xd8\xaa\xd8\xa7\xd9\x86\xd9\x8a\xd8\xa7\0"
-"r\xc3\xa5holt.no\0"
-"inderoy.no\0"
-"camdvr.org\0"
-"askoy.no\0aaa\0doesntexist.com\0"
-"izumozaki.niigata.jp\0"
-"\xe5\xa4\xa9\xe4\xb8\xbb\xe6\x95\x99\0qualifioapp.com\0"
-"agric.za\0"
-"ota.tokyo.jp\0town.museum\0"
-"uryu.hokkaido.jp\0"
-"movie\0"
-"vi.us\0"
-"teo.br\0noheji.aomori.jp\0eidsvoll.no\0nesset.no\0tran\xc3\xb8y.no\0"
-"nakagusuku.okinawa.jp\0"
-"abb\0"
-"mo.us\0abc\0"
-"kawakita.ishikawa.jp\0"
-"hob\xc3\xb8l.no\0realestate\0"
-"media\0"
-"shunan.yamaguchi.jp\0"
-"takko.aomori.jp\0dyn.home-webserver.de\0map.fastlylb.net\0"
-"uchiko.ehime.jp\0"
-"imageandsound.museum\0"
-"mup.gov.pl\0dclk\0"
-"minamimaki.nagano.jp\0dnsfor.me\0"
-"read-books.org\0"
-"blogspot.co.uk\0"
-"bristol.museum\0gehirn.ne.jp\0"
-"naganohara.gunma.jp\0vik.no\0"
-"pvh.br\0daiwa.hiroshima.jp\0aco\0"
-"nerima.tokyo.jp\0"
-"cupcake.is\0"
-"chicago.museum\0"
-"\xe7\xa6\x8f\xe5\xb2\xa1.jp\0"
-"stalowa-wola.pl\0"
-"songdalen.no\0"
-"\xd9\xbe\xd8\xa7\xd9\x83\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86\0"
-"sr.gov.pl\0"
-"\xe7\xb6\xb2\xe7\xbb\x9c.hk\0bingo\0"
-"deloitte\0email\0from-ny.net\0"
-"shopware.store\0"
-"ads\0"
-"wzmiuw.gov.pl\0"
-"hyogo.jp\0"
-"kobierzyce.pl\0aeg\0"
-"naturhistorisches.museum\0"
-"shimokawa.hokkaido.jp\0"
-"trentinsud-tirol.it\0"
-"philadelphia.museum\0"
-"belau.pw\0"
-"altoadige.it\0nagasu.kumamoto.jp\0"
-"ikusaka.nagano.jp\0ambulance.museum\0ringerike.no\0"
-"ta.it\0"
-"uenohara.yamanashi.jp\0grue.no\0"
-"afl\0"
-"ichinohe.iwate.jp\0"
-"fr.it\0"
-"forum.hu\0clock.museum\0"
-"*.statics.cloud\0"
-"pp.se\0pp.ru\0"
-"\xe5\x85\xac\xe7\x9b\x8a\0"
-"shika.ishikawa.jp\0"
-"tromso.no\0"
-"miyoshi.tokushima.jp\0myactivedirectory.com\0"
-"pizza\0"
-"ikawa.akita.jp\0omitama.ibaraki.jp\0juegos\0"
-"daigo.ibaraki.jp\0kunisaki.oita.jp\0"
-"dlugoleka.pl\0discourse.team\0"
-"kawakami.nara.jp\0"
-"rissa.no\0"
-"oshino.yamanashi.jp\0wif.gov.pl\0"
-"kg.kr\0"
-"vagan.no\0"
-"war.museum\0"
-"pp.ua\0"
-"blogspot.co.ke\0"
-"aig\0"
-"misaki.okayama.jp\0"
-"kawagoe.mie.jp\0warmia.pl\0"
-"hikone.shiga.jp\0weibo\0"
-"nankoku.kochi.jp\0webhop.net\0"
-"friulivegiulia.it\0\xe5\x85\xab\xe5\x8d\xa6\0"
-"horokanai.hokkaido.jp\0"
-"usr.cloud.muni.cz\0"
-"g\xc3\xbcnstigbestellen.de\0"
-"togakushi.nagano.jp\0"
-"gv.vc\0"
-"ug.gov.pl\0"
-"midori.gunma.jp\0bus.museum\0nysa.pl\0"
-"amami.kagoshima.jp\0"
-"zapto.xyz\0"
-"takahashi.okayama.jp\0dyndns-home.com\0"
-"gniezno.pl\0"
-"ol.no\0orskog.no\0"
-"pmn.it\0"
-"maringa.br\0yoshikawa.saitama.jp\0cc.ny.us\0"
-"\xe5\xae\xae\xe5\x9f\x8e.jp\0"
-"glas.museum\0"
-"nationalheritage.museum\0"
-"frosinone.it\0"
-"motegi.tochigi.jp\0"
-"stj\xc3\xb8rdal.no\0"
-"chernigov.ua\0cc.az.us\0"
-"discovery.museum\0withgoogle.com\0"
-"jobs\0"
-"starnberg.museum\0"
-"casadelamoneda.museum\0n.se\0"
-"trentino-alto-adige.it\0"
-"koshigaya.saitama.jp\0eastafrica.museum\0s3.dualstack.sa-east-1.amazonaws.com\0"
-"stuff-4-sale.us\0"
-"chonan.chiba.jp\0""0e.vc\0"
-"journalist.aero\0lasalle\0"
-"mobi.gp\0"
-"holtalen.no\0"
-"blogspot.co.nz\0"
-"upow.gov.pl\0"
-"support\0"
-"ogliastra.it\0"
-"higashiura.aichi.jp\0sopot.pl\0"
-"lubartow.pl\0"
-"anthropology.museum\0gucci\0"
-"ikaruga.nara.jp\0"
-"ayabe.kyoto.jp\0"
-"ferrara.it\0verbania.it\0"
-"wphostedmail.com\0"
-"vr.it\0"
-"rm.it\0lib.mt.us\0lib.nd.us\0"
-"childrens.museum\0"
-"kasuya.fukuoka.jp\0"
-"is.it\0"
-"acct.pro\0"
-"en.it\0"
-"valle-aosta.it\0"
-"ascolipiceno.it\0nanmoku.gunma.jp\0"
-"furukawa.miyagi.jp\0attorney\0\xe8\xaf\xba\xe5\x9f\xba\xe4\xba\x9a\0"
-"targi.pl\0anz\0"
-"in-butter.de\0"
-"aol\0"
-"is-a-doctor.com\0"
-"stordal.no\0bbs.tr\0"
-"kimobetsu.hokkaido.jp\0"
-"16-b.it\0"
-"yasuoka.nagano.jp\0"
-"apple\0"
-"md.ci\0\xe3\x83\x9d\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x88\0"
-"minamisanriku.miyagi.jp\0"
-"otaru.hokkaido.jp\0"
-"aogaki.hyogo.jp\0"
-"tlon.network\0"
-"app\0"
-"ginan.gifu.jp\0giessen.museum\0"
-"verm\xc3\xb6gensberatung\0"
-"lierne.no\0mywire.org\0"
-"kashiwa.chiba.jp\0"
-"fukuroi.shizuoka.jp\0musashimurayama.tokyo.jp\0tjeldsund.no\0"
-"naturalsciences.museum\0"
-"jele.host\0"
-"schwarz\0ui.nabu.casa\0"
-"kamo.kyoto.jp\0"
-"bar\0"
-"sciences.museum\0bbc\0gdynia.pl\0"
-"akita.akita.jp\0wv.us\0"
-"atl.jelastic.vps-host.net\0"
-"starachowice.pl\0"
-"mx.na\0herokussl.com\0"
-"sorum.no\0"
-"eng.pro\0"
-"art\0bbt\0"
-"takinoue.hokkaido.jp\0"
-"s\xc3\xb8rreisa.no\0"
-"iida.nagano.jp\0bcg\0"
-"cc.ne.us\0baby\0"
-"kobayashi.miyazaki.jp\0medical.museum\0bcn\0forumz.info\0"
-"gov.nc.tr\0vercel.app\0"
-"w.bg\0"
-"atsugi.kanagawa.jp\0\xe5\x85\xac\xe5\x8f\xb8\0"
-"2.bg\0"
-"hospital\0"
-"redirectme.net\0"
-"kozagawa.wakayama.jp\0tana.no\0"
-"sncf\0"
-"det.br\0to.gov.br\0takazaki.miyazaki.jp\0jele.club\0"
-"chernivtsi.ua\0"
-"gub.uy\0"
-"ong.br\0"
-"shoparena.pl\0"
-"katsuragi.nara.jp\0tokashiki.okinawa.jp\0prudential\0"
-"project.museum\0giize.com\0"
-"r\xc3\xa1hkker\xc3\xa1vju.no\0"
-"vana\0from-pa.com\0"
-"studio\0"
-"bet\0"
-"podzone.net\0"
-"chichibu.saitama.jp\0"
-"carrier.museum\0"
-"kawamata.fukushima.jp\0"
-"flight.aero\0"
-"lib.tn.us\0"
-"recreation.aero\0vologda.su\0myfast.space\0"
-"gs.hl.no\0"
-"akiruno.tokyo.jp\0"
-"takashima.shiga.jp\0v\xc3\xa1rgg\xc3\xa1t.no\0"
-"stathelle.no\0"
-"lt.it\0"
-"cloudns.eu\0"
-"yoshino.nara.jp\0dyndns-blog.com\0"
-"spreadbetting\0"
-"cz.it\0tokyo\0"
-"chirurgiens-dentistes.fr\0biev\xc3\xa1t.no\0"
-"rimini.it\0"
-"\xe7\xb5\x84\xe7\xb9\x94.\xe9\xa6\x99\xe6\xb8\xaf\0"
-"yomitan.okinawa.jp\0folldal.no\0axa\0blogspot.co.za\0"
-"noda.chiba.jp\0"
-"salerno.it\0aws\0deal\0"
-"pe.ca\0is-slick.com\0"
-"mus.mi.us\0"
-"shingo.aomori.jp\0nishigo.fukushima.jp\0"
-"ikeda.gifu.jp\0elburg.museum\0"
-"shimabara.nagasaki.jp\0schlesisches.museum\0viking.museum\0pony.club\0"
-"kumakogen.ehime.jp\0antiques.museum\0"
-"management\0"
-"tj.cn\0bale.museum\0"
-"educator.aero\0"
-"codespot.com\0"
-"ybo.trade\0"
-"development.run\0"
-"sex.hu\0bid\0"
-"rehab\0"
-"sk\xc3\xa5nland.no\0from.work\0"
-"r\xc3\xb8yken.no\0"
-"brand.se\0"
-"toshima.tokyo.jp\0"
-"oxa.cloud\0"
-"arai.shizuoka.jp\0kanuma.tochigi.jp\0\xe0\xb9\x80\xe0\xb8\x99\xe0\xb9\x87\xe0\xb8\x95.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
-"ski.museum\0bio\0"
-"tas.au\0"
-"val-daosta.it\0"
-"ando.nara.jp\0"
-"kadoma.osaka.jp\0"
-"whoswho\0"
-"\xd9\x82\xd8\xb7\xd8\xb1\0group\0"
-"biz\0chungbuk.kr\0staging.onred.one\0"
-"mishima.fukushima.jp\0"
-"pictures\0"
-"logoip.de\0"
-"hakusan.ishikawa.jp\0"
-"nango.fukushima.jp\0nh.us\0cloudns.in\0"
-"planetarium.museum\0"
-"luxembourg.museum\0servecounterstrike.com\0"
-"ookuwa.nagano.jp\0"
-"yamaga.kumamoto.jp\0"
-"workisboring.com\0"
-"hisayama.fukuoka.jp\0shimane.shimane.jp\0"
-"ybo.party\0"
-"tecnologia.bo\0"
-"dyn-ip24.de\0"
-"ebino.miyazaki.jp\0is-a-photographer.com\0ras.ru\0"
-"indie.porn\0"
-"nirasaki.yamanashi.jp\0"
-"indiana.museum\0"
-"taku.saga.jp\0cc.ma.us\0yodobashi\0"
-"faith\0hdfcbank\0"
-"cloudns.cc\0for-our.info\0"
-"noshiro.akita.jp\0hostedpi.com\0"
-"isahaya.nagasaki.jp\0"
-"shibukawa.gunma.jp\0"
-"c.bg\0nozawaonsen.nagano.jp\0"
-"my-firewall.org\0"
-"yakumo.hokkaido.jp\0"
-"georgia.museum\0"
-"vallee-d-aoste.it\0channelsdvr.net\0"
-"house\0"
-"moonscale.net\0"
-"experts-comptables.fr\0"
-"malselv.no\0"
-"miyazaki.jp\0"
-"ikata.ehime.jp\0bahccavuotna.no\0"
-"hashima.gifu.jp\0*.platformsh.site\0"
-"sumoto.hyogo.jp\0shimoichi.nara.jp\0"
-"namerikawa.toyama.jp\0"
-"for-more.biz\0"
-"trondheim.no\0"
-"bms\0jcloud.kz\0"
-"shinagawa.tokyo.jp\0s3-website.us-east-2.amazonaws.com\0"
-"not.br\0"
-"bmw\0"
-"games.hu\0band\0"
-"tatamotors\0"
-"mihama.chiba.jp\0zoology.museum\0"
-"higashiyama.kyoto.jp\0labour.museum\0"
-"discount\0"
-"\xe6\x95\x99\xe8\x82\xb2.hk\0civilisation.museum\0fiat\0"
-"bank\0"
-"s3-ap-northeast-2.amazonaws.com\0"
-"u2.xnbay.com\0"
-"umbria.it\0takasaki.gunma.jp\0"
-"www.ro\0hockey\0"
-"zgora.pl\0"
-"pe.it\0"
-"arita.saga.jp\0"
-"kamikitayama.nara.jp\0"
-"cherkassy.ua\0"
-"lebtimnetz.de\0"
-"bom\0"
-"boo\0"
-"stackhero-network.com\0"
-"swatch\0"
-"tsuwano.shimane.jp\0"
-"bot\0"
-"volkenkunde.museum\0"
-"spydeberg.no\0"
-"bialowieza.pl\0"
-"box\0"
-"satx.museum\0"
-"sex.pl\0"
-"macerata.it\0nesseby.no\0"
-"kumamoto.kumamoto.jp\0cab\0"
-"finland.museum\0"
-"!city.nagoya.jp\0pe.kr\0"
-"arab\0"
-"eisenbahn.museum\0"
-"jl.cn\0fido\0"
-"jondal.no\0cal\0"
-"cam\0s3-website-us-east-1.amazonaws.com\0"
-"virtualuser.de\0"
-"wildlife.museum\0lpusercontent.com\0"
-"cba\0"
-"lt.ua\0car\0"
-"onna.okinawa.jp\0"
-"cat\0"
-"fr\xc3\xa6na.no\0mobi.tt\0"
-"niimi.okayama.jp\0haugesund.no\0h\xc3\xa6gebostad.no\0"
-"vibovalentia.it\0"
-"aga.niigata.jp\0"
-"nt.edu.au\0mobi.tz\0cbn\0"
-"chuo.osaka.jp\0"
-"nishi.osaka.jp\0"
-"alpha-myqnapcloud.com\0"
-"laquila.it\0*.webhare.dev\0"
-"kommune.no\0cbs\0dell\0bci.dnstrace.pro\0"
-"md.us\0ltda\0"
-"scjohnson\0doomdns.com\0"
-"tsuyama.okayama.jp\0"
-"takagi.nagano.jp\0"
-"dontexist.net\0"
-"\xe3\x82\xa2\xe3\x83\x9e\xe3\x82\xbe\xe3\x83\xb3\0"
-"tienda\0"
-"h\xc3\xa5.no\0"
-"kvanangen.no\0"
-"toga.toyama.jp\0rnrt.tn\0cc.or.us\0"
-"fukusaki.hyogo.jp\0"
-"mex.com\0"
-"64-b.it\0"
-"date.fukushima.jp\0\xe5\x95\x86\xe5\xba\x97\0"
-"karmoy.no\0"
-"hasami.nagasaki.jp\0"
-"zama.kanagawa.jp\0"
-"gentlentapis.com\0"
-"samnanger.no\0w.se\0red.sv\0staples\0"
-"*.backyards.banzaicloud.io\0"
-"nagara.chiba.jp\0"
-"andebu.no\0"
-"kurogi.fukuoka.jp\0atami.shizuoka.jp\0"
-"southwest.museum\0"
-"trentinos\xc3\xbc""dtirol.it\0"
-"ceo\0"
-"student.aero\0"
-"cfa\0"
-"c.la\0"
-"sondrio.it\0cfd\0"
-"ozu.ehime.jp\0"
-"consultant.aero\0"
-"steinkjer.no\0latino\0"
-"buy\0"
-"toyosato.shiga.jp\0"
-"hasama.oita.jp\0"
-"fukuyama.hiroshima.jp\0minamiashigara.kanagawa.jp\0kashiba.nara.jp\0"
-"\xe5\xb2\xa1\xe5\xb1\xb1.jp\0"
-"lig.it\0"
-"cloudns.us\0"
-"choshi.chiba.jp\0mobi.na\0saotome.st\0verm\xc3\xb6gensberater\0"
-"olayan\0"
-"mobi.ng\0"
-"omura.nagasaki.jp\0members.linode.com\0"
-"sakuragawa.ibaraki.jp\0bokn.no\0"
-"tobishima.aichi.jp\0kawagoe.saitama.jp\0lindas.no\0"
-"fg.it\0lib.az.us\0from-nj.com\0"
-"trade\0lcube-server.de\0"
-"ar.it\0wolomin.pl\0"
-"unj\xc3\xa1rga.no\0"
-"udine.it\0s3.dualstack.eu-central-1.amazonaws.com\0"
-"kafjord.no\0bss.design\0"
-"film\0"
-"ginoza.okinawa.jp\0"
-"jampa.br\0napoli.it\0"
-"channel\0"
-"averoy.no\0"
-"download\0\xd0\xbc\xd0\xbe\xd1\x81\xd0\xba\xd0\xb2\xd0\xb0\0"
-"desi\0"
-"makinohara.shizuoka.jp\0"
-"fitness\0"
-"sayo.hyogo.jp\0aridagawa.wakayama.jp\0"
-"bzh\0"
-"academia.bo\0tonosho.kagawa.jp\0"
-"9guacu.br\0"
-"college\0pdns.page\0"
-"sango.nara.jp\0"
-"the.br\0sohu\0"
-"ddr.museum\0from-sc.com\0\xd1\x8f.\xd1\x80\xd1\x83\xd1\x81\0"
-"bayern\0"
-"spjelkavik.no\0"
-"hitachinaka.ibaraki.jp\0c.cdn77.org\0en-root.fr\0"
-"shangrila\0"
-"\xe5\xb3\xb6\xe6\xa0\xb9.jp\0"
-"myds.me\0"
-"saitama.jp\0"
-"komatsu\0dsmynas.com\0"
-"surgery\0"
-"jprs\0"
-"maritimo.museum\0sf.no\0"
-"ashiya.fukuoka.jp\0minamiminowa.nagano.jp\0"
-"tuscany.it\0venezia.it\0cc.sc.us\0"
-"pa.leg.br\0"
-"kariya.aichi.jp\0miyawaka.fukuoka.jp\0mobi.ke\0"
-"from-ma.com\0"
-"marylhurst.museum\0"
-"s3.dualstack.eu-west-2.amazonaws.com\0"
-"dyndns1.de\0"
-"off.ai\0"
-"lugansk.ua\0k12.ne.us\0"
-"c.se\0"
-"!city.yokohama.jp\0"
-"edeka\0is-a-rockstar.com\0"
-"fujishiro.ibaraki.jp\0"
-"ainan.ehime.jp\0s3-external-1.amazonaws.com\0"
-"hirokawa.fukuoka.jp\0takino.hyogo.jp\0sytes.net\0"
-"shiriuchi.hokkaido.jp\0dyn.cosidns.de\0"
-"hirara.okinawa.jp\0"
-"from-vt.com\0"
-"minamioguni.kumamoto.jp\0pb.leg.br\0"
-"m\xc4\x81ori.nz\0"
-"transporte.bo\0fie.ee\0askvoll.no\0"
-"florist\0"
-"army\0"
-"\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4\xe0\xa4\xae\xe0\xa5\x8d\0"
-"fire\0"
-"yaotsu.gifu.jp\0"
-"ichihara.chiba.jp\0"
-"shirakawa.gifu.jp\0"
-"\xe7\x82\xb9\xe7\x9c\x8b\0is-a-blogger.com\0"
-"carraramassa.it\0"
-"tomari.hokkaido.jp\0"
-"m\xc3\xa1latvuopmi.no\0"
-"profesional.bo\0"
-"co.ae\0com\0fudai.iwate.jp\0"
-"cyber.museum\0lib.ma.us\0"
-"co.ag\0okazaki.aichi.jp\0"
-"br\xc3\xb8nn\xc3\xb8y.no\0"
-"oi.kanagawa.jp\0minobu.yamanashi.jp\0lib.id.us\0cpa\0cloudapps.digital\0"
-"fish\0"
-"fet.no\0song\0"
-"\xc3\xb8ygarden.no\0melbourne\0"
-"co.am\0arpa\0auto.pl\0"
-"h\xc3\xa4kkinen.fi\0"
-"co.ao\0"
-"motoyama.kochi.jp\0flanders.museum\0"
-"co.bb\0"
-"co.at\0is-a-painter.com\0"
-"yamazoe.nara.jp\0"
-"co.bi\0"
-"barreau.bj\0hanyu.saitama.jp\0"
-"dad\0iamallama.com\0"
-"tanohata.iwate.jp\0sony\0"
-"co.bn\0"
-"louvre.museum\0badaddja.no\0"
-"*.ex.ortsinfo.at\0"
-"co.ca\0in-berlin.de\0"
-"myftp.biz\0"
-"nachikatsuura.wakayama.jp\0"
-"lohmus.me\0"
-"co.bw\0tempioolbia.it\0m\xc3\xa5lselv.no\0"
-"co.ci\0neat-url.com\0"
-"co.cl\0"
-"co.cm\0"
-"rv.ua\0"
-"showa.gunma.jp\0s3-website-ap-northeast-1.amazonaws.com\0"
-"cloudns.pw\0podzone.org\0"
-"day\0"
-"co.cr\0maori.nz\0ubank\0"
-"kurashiki.okayama.jp\0"
-"cuneo.it\0barsy.club\0"
-"friuliv-giulia.it\0urawa.saitama.jp\0myshopify.com\0"
-"yokoshibahikari.chiba.jp\0"
-"matsubara.osaka.jp\0"
-"\xe9\xb3\xa5\xe5\x8f\x96.jp\0co.cz\0"
-"crs\0csc\0co.dk\0"
-"lug.org.uk\0"
-"museet.museum\0"
-"kuroishi.aomori.jp\0homesecuritymac.com\0"
-"ouda.nara.jp\0"
-"\xe5\xa4\xa7\xe4\xbc\x97\xe6\xb1\xbd\xe8\xbd\xa6\0uy.com\0"
-"manno.kagawa.jp\0"
-"ar.us\0"
-"asda\0"
-"cc.ut.us\0"
-"arte\0"
-"yawatahama.ehime.jp\0"
-"vallee-aoste.it\0s3-website.ap-south-1.amazonaws.com\0"
-"aseral.no\0"
-"barclaycard\0dds\0"
-"l.bg\0wpmucdn.com\0"
-"xx.gl\0"
-"meet\0"
-"k12.mi.us\0"
-"getmyip.com\0"
-"barlettatraniandria.it\0moriya.ibaraki.jp\0"
-"workshop.museum\0eaton.mi.us\0from-ut.com\0"
-"k12.co.us\0sinaapp.com\0"
-"co.gg\0"
-"tarumizu.kagoshima.jp\0osaki.miyagi.jp\0"
-"travel.pl\0"
-"co.gl\0basketball\0"
-"bbva\0"
-"kotohira.kagawa.jp\0dev\0"
-"suginami.tokyo.jp\0valley.museum\0"
-"kainan.tokushima.jp\0"
-"fussa.tokyo.jp\0"
-"1kapp.com\0"
-"ntr.br\0"
-"co.gy\0"
-"tadotsu.kagawa.jp\0no-ip.biz\0noho.st\0"
-"ovre-eiker.no\0construction\0deno.dev\0"
-"minamiechizen.fukui.jp\0"
-};
-static constexpr quint32 tldChunks[tldChunkCount] = {65534, 107981};
-
-QT_END_NAMESPACE
-
-#endif // QURLTLD_P_H
diff --git a/src/network/kernel/qurltlds_p.h.INFO b/src/network/kernel/qurltlds_p.h.INFO
deleted file mode 100644
index 3f72ac9b04..0000000000
--- a/src/network/kernel/qurltlds_p.h.INFO
+++ /dev/null
@@ -1,14 +0,0 @@
-The file qurltlds_p.h is generated from the Public Suffix
-List (see [1] and [2]), by the program residing at
-qtbase/util/publicSuffix/ in the Qt source tree.
-
-That program generates a character array and an index array from the
-list to provide fast lookups of elements within C++.
-
-Those arrays in qurltlds_p.h are derived from the Public
-Suffix List ([2]), which was originally provided by
-Jo Hermans <jo.hermans@gmail.com>.
-
-----
-[1] list: http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1
-[2] homepage: http://publicsuffix.org/