diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b806e1..825824c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,49 @@ The format is **not** based on [Keep a Changelog][kec], since the project +## AGDNS-1954 / Build 719 + + * The objects within `server_groups` array have a new property + `block_page_redirect`: + + ```yaml + block_page_redirect: + enabled: true + ipv4: + - address: '127.0.0.1' + - address: '127.0.0.2' + ipv6: + - address: '::1' + - address: '::2' + apply: + client: + - address: '192.168.0.0/16' + - address: '1.2.3.4' + skip: + client: + - address: '1.2.0.0/16' + question: + - domain: 'do-not-show-block.site.example' + probability: 0.01 + ``` + + For server groups that do not require a block-page redirect, set: + + ```yaml + block_page_redirect: + enabled: false + ``` + + + +## AGDNS-1888 / Build 717 + + * The new environment variable `PROFILES_ENABLED` has been added. With `0` + value it disables user profiles and devices recognition, and billing. Its + default value is `1`. Adjust the value, if necessary. + + + ## AGDNS-1761 / Build 702 * The property `upstream` has been modified. Its property `timeout` has been diff --git a/Makefile b/Makefile index d5d91df..967628b 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ # Makefile. Bump this number every time a significant change is made to # this Makefile. # -# AdGuard-Project-Version: 2 +# AdGuard-Project-Version: 4 # Don't name these macros "GO" etc., because GNU Make apparently makes # them exported environment variables with the literal value of @@ -23,7 +23,7 @@ VERBOSE.MACRO = $${VERBOSE:-0} BRANCH = $$( git rev-parse --abbrev-ref HEAD ) GOAMD64 = v1 GOPROXY = https://goproxy.cn|https://proxy.golang.org|direct -GOTOOLCHAIN = go1.21.5 +GOTOOLCHAIN = go1.21.8 RACE = 0 REVISION = $$( git rev-parse --short HEAD ) VERSION = 0 @@ -59,6 +59,8 @@ go-lint: ; $(ENV) "$(SHELL)" ./scripts/make/go-lint.sh go-test: ; $(ENV) RACE='1' "$(SHELL)" ./scripts/make/go-test.sh go-tools: ; $(ENV) "$(SHELL)" ./scripts/make/go-tools.sh +go-upd-tools: ; $(ENV) "$(SHELL)" ./scripts/make/go-upd-tools.sh + go-check: go-tools go-lint go-test # A quick check to make sure that all operating systems relevant to the @@ -73,11 +75,4 @@ go-os-check: txt-lint: ; $(ENV) "$(SHELL)" ./scripts/make/txt-lint.sh -# TODO(a.garipov): Consider adding to scripts/ and the common project -# structure. -go-upd-tools: - cd ./internal/tools/ &&\ - "$(GO.MACRO)" get -u &&\ - "$(GO.MACRO)" mod tidy - sync-github: ; $(ENV) "$(SHELL)" ./scripts/make/github-sync.sh diff --git a/config.dist.yaml b/config.dist.yaml index 378047b..29945bd 100644 --- a/config.dist.yaml +++ b/config.dist.yaml @@ -274,7 +274,7 @@ filters: # FILTER_INDEX_URL environment variable. refresh_interval: 1h # The timeout for the entire filter update operation. Be aware that each - # individual refresh operation also has its own hardcoded 30s timeout. + # individual refresh operation also has its own hardcoded 3m timeout. refresh_timeout: 5m # MaxSize is the maximum size of the downloadable filtering rule-list. max_size: 256MB @@ -351,15 +351,38 @@ server_groups: - name: 'adguard_dns_default' # This filtering_group is used for all anonymous clients. filtering_group: 'default' - tls: - certificates: - - certificate: './test/cert.crt' - key: './test/cert.key' - session_keys: - - './test/tls_key_1' - - './test/tls_key_2' - device_id_wildcards: - - '*.dns.example.com' + # Settings for redirection to a block page. + block_page_redirect: + # If enabled is false, other fields can be skipped. + enabled: true + # Addresses to use for A queries. If enabled is true, ipv4, ipv6, or + # both must be filled. + ipv4: + - address: '127.0.0.1' + - address: '127.0.0.2' + # Addresses to use for AAAA queries. If enabled is true, ipv4, ipv6, or + # both must be filled. + ipv6: + - address: '::1' + - address: '::2' + # Request parameters based on which the block page is always shown. For + # requests matching these parameters, both skip and probability are + # ignored. + apply: + client: + - address: '192.168.0.0/16' + - address: '1.2.3.4' + # Request parameters based on which the block page is never shown. For + # requests matching these parameters, probability is ignored. + skip: + client: + - address: '1.2.0.0/16' + - address: '5.6.7.8' + question: + - domain: 'do-not-show-block.site.example' + # The probability of responding with the block page IPs based on remote + # address. Must be between 0.0 and 1.0. + probability: 0.01 ddr: enabled: true # Device ID domain name suffix to DDR record template mapping. Keep in @@ -386,6 +409,15 @@ server_groups: - '127.0.0.1' ipv6_hints: - '::1' + tls: + certificates: + - certificate: './test/cert.crt' + key: './test/cert.key' + session_keys: + - './test/tls_key_1' + - './test/tls_key_2' + device_id_wildcards: + - '*.dns.example.com' servers: - name: 'default_dns' # See README for the list of protocol values. diff --git a/doc/configuration.md b/doc/configuration.md index ee99059..0534f87 100644 --- a/doc/configuration.md +++ b/doc/configuration.md @@ -28,8 +28,9 @@ configuration file with comments. * [Filtering groups](#filtering_groups) * [Network interface listeners](#interface_listeners) * [Server groups](#server_groups) - * [TLS](#server_groups-*-tls) + * [Block-page redirecting](#server_groups-*-block_page_redirect) * [DDR](#server_groups-*-ddr) + * [TLS](#server_groups-*-tls) * [Servers](#server_groups-*-servers-*) * [Connectivity check](#connectivity-check) * [Network settings](#network) @@ -108,9 +109,10 @@ Currently, there are the following recommendations for parameters TCP sockets. That is, if the instance currently has a maximum of 100 000 TCP sockets in use every day, `resume` should be set to about `120000`. -**NOTE:** The number of active stream-connections includes sockets that are -in the process of accepting new connections but have not yet accepted one. That -means that `resume` should be greater than the number of bound addresses. + > [!NOTE] + > The number of active stream-connections includes sockets that are in the + > process of accepting new connections but have not yet accepted one. That + > means that `resume` should be greater than the number of bound addresses. These recommendations are to be revised based on the metrics. @@ -776,7 +778,7 @@ The `filters` object has the following properties: * `refresh_timeout`: The timeout for the *entire* filter update operation, as a human-readable duration. Be aware that each individual refresh operation also has its own - hardcoded 30s timeout. + hardcoded 3m timeout. **Example:** `5m`. @@ -890,9 +892,10 @@ The items of the `filtering_groups` array have the following properties: ## Network interface listeners -**NOTE:** The network interface listening works only on Linux with -`SO_BINDTODEVICE` support (2.0.30 and later) and properly setup IP routes. See -the [section on testing `SO_BINDTODEVICE` using Docker][dev-btd]. + > [!NOTE] + > The network interface listening works only on Linux with `SO_BINDTODEVICE` + > support (2.0.30 and later) and properly setup IP routes. See the [section + > on testing `SO_BINDTODEVICE` using Docker][dev-btd]. The `interface_listeners` object has the following properties: @@ -936,52 +939,83 @@ The items of the `server_groups` array have the following properties: **Example:** `default`. - * `tls`: The optional TLS configuration object. See - [below](#server_groups-*-tls). + * `block_page_redirect`: The block-page redirect configuration object. See + [below](#server_groups-*-block_page_redirect). * `ddr`: The DDR configuration object. See [below](#server_groups-*-ddr). + * `tls`: The TLS configuration object. See [below](#server_groups-*-tls). + + > [!NOTE] + > The `tls` object is optional unless the [`servers` + > array](#server_groups-*-servers-*) contains at least one item with an + > encrypted protocol. + * `servers`: Server configuration for this filtering group. See [below](#server_groups-*-servers-*). - ### TLS + ### Block-page redirecting - * `certificates`: - The array of objects with paths to the certificate and the private key for - this server group. +The block-page redirect configuration object. If enabled, AdGuard DNS responds +with the configured IP addresses to “redirect” users to an informative block +page. + + * `enabled`: + + Shows if the block-page redirect is enabled. If `false`, the fields below + can be skipped. + + * `ipv4`: + + Arrays of IPv4 addresses with which to respond to blocked `A` queries. + + If `enabled` is true, `ipv4`, `ipv6`, or both must be filled. + + * `ipv6`: + + Arrays of IPv6 addresses with which to respond to blocked `AAAA` queries. + + If `enabled` is true, `ipv4`, `ipv6`, or both must be filled. + + * `apply`: + + Request parameters based on which the block-page redirect is always + performed. For requests matching these parameters, both `skip` and + `probability` are + ignored. **Property example:** ```yaml - 'certificates': - - 'certificate': '/etc/dns/cert.crt' - 'key': '/etc/dns/cert.key' + apply: + client: + - address: '192.168.0.0/16' + - address: '1.2.3.4' ``` - * `session_keys`: - The array of file paths from which the each server's TLS session keys are - updated. Session ticket key files must contain at least 32 bytes. + * `skip`: + + Request parameters based on which the block-page redirect is never + performed. For requests matching these parameters, `probability` is + ignored. **Property example:** ```yaml - 'session_keys': - - './private/key_1' - - './private/key_2' + skip: + client: + - address: '1.2.0.0/16' + - address: '5.6.7.8' + question: + - domain: 'do-not-show-block.site.example' ``` - * `device_id_wildcards`: - The array of domain name wildcards to use to detect clients' device IDs. - Use this to prevent conflicts when using certificates for subdomains. + * `probability`: - **Property example:** - - ```yaml - 'device_id_wildcards': - - '*.d.dns.example.com' - ``` + The probability of responding with the block page IPs based on remote + address. Must be between `0.0` and `1.0`. @@ -1062,6 +1096,45 @@ collected the required data was not self-describing and flexible enough. + ### TLS + + * `certificates`: + The array of objects with paths to the certificate and the private key for + this server group. + + **Property example:** + + ```yaml + 'certificates': + - 'certificate': '/etc/dns/cert.crt' + 'key': '/etc/dns/cert.key' + ``` + + * `session_keys`: + The array of file paths from which the each server's TLS session keys are + updated. Session ticket key files must contain at least 32 bytes. + + **Property example:** + + ```yaml + 'session_keys': + - './private/key_1' + - './private/key_2' + ``` + + * `device_id_wildcards`: + The array of domain name wildcards to use to detect clients' device IDs. + Use this to prevent conflicts when using certificates for subdomains. + + **Property example:** + + ```yaml + 'device_id_wildcards': + - '*.d.dns.example.com' + ``` + + + ### Servers The items of the `servers` array have the following properties: diff --git a/doc/debughttp.md b/doc/debughttp.md index bdba4e8..0bbcd36 100644 --- a/doc/debughttp.md +++ b/doc/debughttp.md @@ -27,8 +27,9 @@ The response is sent with the `Transfer-Encoding` set to `chunked` and with an HTTP trailer named `X-Error` which describes errors that might have occurred during the database dump. -**NOTE:** For legacy software reasons, despite the endpoint being a `GET` one, -it rotates the database, and so changes the internal state. + > [!NOTE] + > For legacy software reasons, despite the endpoint being a `GET` one, it + > rotates the database, and so changes the internal state. diff --git a/doc/development.md b/doc/development.md index 5020058..0690f3c 100644 --- a/doc/development.md +++ b/doc/development.md @@ -315,8 +315,8 @@ Open `http://127.0.0.1:8081/metrics` to see the server's metrics. DNSCrypt is a bit trickier. You need to open `dnscrypt.yml` and use values from there to generate an SDNS stamp on . -**NOTE:** The example below is for a test configuration that won't work for -you. + > [!NOTE] + > The example below is for a test configuration that won't work for you. ```sh dnslookup example.org sdns://AQcAAAAAAAAADjEyNy4wLjAuMTo1NDQzIAbKgP3dmXybr1DaKIFgKjsc8zSFX4rgT_hFgymSq6w1FzIuZG5zY3J5cHQtY2VydC50ZXN0ZG5z diff --git a/doc/environment.md b/doc/environment.md index deace96..59427ac 100644 --- a/doc/environment.md +++ b/doc/environment.md @@ -23,6 +23,7 @@ sensitive configuration. All other configuration is stored in the * [`LOG_TIMESTAMP`](#LOG_TIMESTAMP) * [`NEW_REG_DOMAINS_URL`](#NEW_REG_DOMAINS_URL) * [`PROFILES_CACHE_PATH`](#PROFILES_CACHE_PATH) + * [`PROFILES_ENABLED`](#PROFILES_ENABLED) * [`PROFILES_URL`](#PROFILES_URL) * [`QUERYLOG_PATH`](#QUERYLOG_PATH) * [`RESEARCH_LOGS`](#RESEARCH_LOGS) @@ -236,6 +237,14 @@ The profile cache is read on start and is later updated on every +## `PROFILES_ENABLED` + +If `0`, disables user profiles and devices recognition and billing. + +**Default:** `1`. + + + ## `PROFILES_URL` The base backend URL for profiles API. Supports GRPC (`grpc://` and`grpcs://`) diff --git a/doc/externalhttp.md b/doc/externalhttp.md index 7d576fb..1d21f46 100644 --- a/doc/externalhttp.md +++ b/doc/externalhttp.md @@ -30,9 +30,11 @@ document should set the `Server` header in their replies. This is the service to which the [`BILLSTAT_URL`][env-billstat_url] environment variable points. Supports `grpc(s)` URLs. The service must correspond to -`./internal/backendpb/backend.proto`. +`./internal/backendpb/backend.proto`. This service can be disabled with the +[`PROFILES_ENABLED`][env-profiles_enabled] environment variable. [env-billstat_url]: environment.md#BILLSTAT_URL +[env-profiles_enabled]: environment.md#PROFILES_ENABLED @@ -40,7 +42,8 @@ variable points. Supports `grpc(s)` URLs. The service must correspond to This is the service to which the [`PROFILES_URL`][env-profiles_url] environment variable points. Supports `grpc(s)` URLs. The service must correspond to -`./internal/backendpb/backend.proto`. +`./internal/backendpb/backend.proto`. This service can be disabled with the +[`PROFILES_ENABLED`][env-profiles_enabled] environment variable. [env-profiles_url]: environment.md#PROFILES_URL diff --git a/doc/querylog.md b/doc/querylog.md index 08bef90..1c18b09 100644 --- a/doc/querylog.md +++ b/doc/querylog.md @@ -42,8 +42,9 @@ rules to remember, which property means what. The properties are: alpha-2][wiki-iso] country code, if any. If none could be detected, this property is absent. The short name `c` stands for “client country”. - **NOTE:** AdGuard DNS uses the common user-assigned ISO 3166-1 alpha-2 code - `XK` for the partially-recognized state of the Republic of Kosovo. + > [!NOTE] + > AdGuard DNS uses the common user-assigned ISO 3166-1 alpha-2 code `XK` + > for the partially-recognized state of the Republic of Kosovo. **Example:** `"AU"` @@ -53,8 +54,9 @@ rules to remember, which property means what. The properties are: could be detected, this property is absent. The short name `d` stands for “destination”. - **NOTE:** AdGuard DNS uses the common user-assigned ISO 3166-1 alpha-2 code - `XK` for the partially-recognized state of the Republic of Kosovo. + > [!NOTE] + > AdGuard DNS uses the common user-assigned ISO 3166-1 alpha-2 code `XK` + > for the partially-recognized state of the Republic of Kosovo. **Example:** `"US"` diff --git a/go.mod b/go.mod index 44b559a..f15db5c 100644 --- a/go.mod +++ b/go.mod @@ -1,32 +1,32 @@ module github.com/AdguardTeam/AdGuardDNS -go 1.21.5 +go 1.21.8 require ( github.com/AdguardTeam/AdGuardDNS/internal/dnsserver v0.0.0-00010101000000-000000000000 - github.com/AdguardTeam/golibs v0.18.1 - github.com/AdguardTeam/urlfilter v0.17.2 + github.com/AdguardTeam/golibs v0.20.1 + github.com/AdguardTeam/urlfilter v0.18.0 github.com/ameshkov/dnscrypt/v2 v2.2.7 - github.com/axiomhq/hyperloglog v0.0.0-20230201085229-3ddf4bad03dc + github.com/axiomhq/hyperloglog v0.0.0-20240124082744-24bca3a5b39b github.com/bluele/gcache v0.0.2 - github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b + github.com/c2h5oh/datasize v0.0.0-20231215233829-aa82cc1e6500 github.com/caarlos0/env/v7 v7.1.0 - github.com/getsentry/sentry-go v0.25.0 + github.com/getsentry/sentry-go v0.27.0 github.com/google/renameio/v2 v2.0.0 - github.com/miekg/dns v1.1.56 + github.com/miekg/dns v1.1.58 github.com/oschwald/maxminddb-golang v1.12.0 github.com/patrickmn/go-cache v2.1.1-0.20191004192108-46f407853014+incompatible - github.com/prometheus/client_golang v1.17.0 + github.com/prometheus/client_golang v1.18.0 github.com/prometheus/client_model v0.5.0 - github.com/prometheus/common v0.44.0 - github.com/quic-go/quic-go v0.39.0 + github.com/prometheus/common v0.46.0 + github.com/quic-go/quic-go v0.41.0 github.com/stretchr/testify v1.8.4 - golang.org/x/exp v0.0.0-20231006140011-7918f672742d - golang.org/x/net v0.17.0 - golang.org/x/sys v0.13.0 - golang.org/x/time v0.3.0 - google.golang.org/grpc v1.58.3 - google.golang.org/protobuf v1.31.0 + golang.org/x/exp v0.0.0-20240213143201-ec583247a57a + golang.org/x/net v0.21.0 + golang.org/x/sys v0.17.0 + golang.org/x/time v0.5.0 + google.golang.org/grpc v1.61.1 + google.golang.org/protobuf v1.32.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -40,20 +40,18 @@ require ( github.com/dgryski/go-metro v0.0.0-20211217172704-adc40b04c140 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/onsi/ginkgo/v2 v2.13.0 // indirect - github.com/panjf2000/ants/v2 v2.8.2 // indirect + github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 // indirect + github.com/onsi/ginkgo/v2 v2.15.0 // indirect + github.com/panjf2000/ants/v2 v2.9.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/qtls-go1-20 v0.3.4 // indirect - go.uber.org/mock v0.3.0 // indirect - golang.org/x/crypto v0.14.0 // indirect - golang.org/x/mod v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/tools v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231009173412-8bfb1ae86b6c // indirect + go.uber.org/mock v0.4.0 // indirect + golang.org/x/crypto v0.19.0 // indirect + golang.org/x/mod v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/tools v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240213162025-012b6fc9bca9 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 01d06ba..07b3d00 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ -github.com/AdguardTeam/golibs v0.18.1 h1:6u0fvrIj2qjUsRdbIGJ9AR0g5QRSWdKIo/DYl3tp5aM= -github.com/AdguardTeam/golibs v0.18.1/go.mod h1:DKhCIXHcUYtBhU8ibTLKh1paUL96n5zhQBlx763sj+U= -github.com/AdguardTeam/urlfilter v0.17.2 h1:xTntfr1UWah8m6wwoXJmFgplFk/+kL/hDu204ptrM1U= -github.com/AdguardTeam/urlfilter v0.17.2/go.mod h1:Jru7jFfeH2CoDf150uDs+rRYcZBzHHBz05r9REyDKyE= +github.com/AdguardTeam/golibs v0.20.1 h1:ol8qLjWGZhU9paMMwN+OLWVTUigGsXa29iVTyd62VKY= +github.com/AdguardTeam/golibs v0.20.1/go.mod h1:bgcMgRviCKyU6mkrX+RtT/OsKPFzyppelfRsksMG3KU= +github.com/AdguardTeam/urlfilter v0.18.0 h1:ZZzwODC/ADpjJSODxySrrUnt/fvOCfGFaCW6j+wsGfQ= +github.com/AdguardTeam/urlfilter v0.18.0/go.mod h1:IXxBwedLiZA2viyHkaFxY/8mjub0li2PXRg8a3d9Z1s= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 h1:52m0LGchQBBVqJRyYYufQuIbVqRawmubW3OFGqK1ekw= @@ -10,14 +10,14 @@ github.com/ameshkov/dnscrypt/v2 v2.2.7 h1:aEitLIR8HcxVodZ79mgRcCiC0A0I5kZPBuWGFw github.com/ameshkov/dnscrypt/v2 v2.2.7/go.mod h1:qPWhwz6FdSmuK7W4sMyvogrez4MWdtzosdqlr0Rg3ow= github.com/ameshkov/dnsstamps v1.0.3 h1:Srzik+J9mivH1alRACTbys2xOxs0lRH9qnTA7Y1OYVo= github.com/ameshkov/dnsstamps v1.0.3/go.mod h1:Ii3eUu73dx4Vw5O4wjzmT5+lkCwovjzaEZZ4gKyIH5A= -github.com/axiomhq/hyperloglog v0.0.0-20230201085229-3ddf4bad03dc h1:Keo7wQ7UODUaHcEi7ltENhbAK2VgZjfat6mLy03tQzo= -github.com/axiomhq/hyperloglog v0.0.0-20230201085229-3ddf4bad03dc/go.mod h1:k08r+Yj1PRAmuayFiRK6MYuR5Ve4IuZtTfxErMIh0+c= +github.com/axiomhq/hyperloglog v0.0.0-20240124082744-24bca3a5b39b h1:F3yMzKumBUQ6Fn0sYI1YQ16vQRucpZOfBQ9HXWl5+XI= +github.com/axiomhq/hyperloglog v0.0.0-20240124082744-24bca3a5b39b/go.mod h1:k08r+Yj1PRAmuayFiRK6MYuR5Ve4IuZtTfxErMIh0+c= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bluele/gcache v0.0.2 h1:WcbfdXICg7G/DGBh1PFfcirkWOQV+v077yF1pSy3DGw= github.com/bluele/gcache v0.0.2/go.mod h1:m15KV+ECjptwSPxKhOhQoAFQVtUFjTVkc3H8o0t/fp0= -github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b h1:6+ZFm0flnudZzdSE0JxlhR2hKnGPcNB35BjQf4RYQDY= -github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= +github.com/c2h5oh/datasize v0.0.0-20231215233829-aa82cc1e6500 h1:6lhrsTEnloDPXyeZBvSYvQf8u86jbKehZPVDDlkgDl4= +github.com/c2h5oh/datasize v0.0.0-20231215233829-aa82cc1e6500/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= github.com/caarlos0/env/v7 v7.1.0 h1:9lzTF5amyQeWHZzuZeKlCb5FWSUxpG1js43mhbY8ozg= github.com/caarlos0/env/v7 v7.1.0/go.mod h1:LPPWniDUq4JaO6Q41vtlyikhMknqymCLBw0eX4dcH1E= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= @@ -28,25 +28,24 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc/go.mod h1:c9O8+fpSOX1DM8cPNSkX/qsBWdkD4yd2dpciOWQjpBw= github.com/dgryski/go-metro v0.0.0-20211217172704-adc40b04c140 h1:y7y0Oa6UawqTFPCDw9JG6pdKt4F9pAhHv0B7FMGaGD0= github.com/dgryski/go-metro v0.0.0-20211217172704-adc40b04c140/go.mod h1:c9O8+fpSOX1DM8cPNSkX/qsBWdkD4yd2dpciOWQjpBw= -github.com/getsentry/sentry-go v0.25.0 h1:q6Eo+hS+yoJlTO3uu/azhQadsD8V+jQn2D8VvX1eOyI= -github.com/getsentry/sentry-go v0.25.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98 h1:pUa4ghanp6q4IJHwE9RwLgmVFfReJN+KbQ8ExNEUUoQ= -github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 h1:E/LAvt58di64hlYjx7AsNS6C/ysHWYo+2qPCZKTQhRo= +github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/google/renameio/v2 v2.0.0 h1:UifI23ZTGY8Tt29JbYFiuyIU3eX+RNFtUwefq9qAhxg= github.com/google/renameio/v2 v2.0.0/go.mod h1:BtmJXm5YlszgC+TD4HOEEUFgkJP3nLxehU6hfe7jRt4= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -55,18 +54,16 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.1.56 h1:5imZaSeoRNvpM9SzWNhEcP9QliKiz20/dA2QabIGVnE= -github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY= -github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= -github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= -github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4= +github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY= +github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= +github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/oschwald/maxminddb-golang v1.12.0 h1:9FnTOD0YOhP7DGxGsq4glzpGy5+w7pq50AS6wALUMYs= github.com/oschwald/maxminddb-golang v1.12.0/go.mod h1:q0Nob5lTCqyQ8WT6FYgS1L7PXKVVbgiymefNwIjPzgY= -github.com/panjf2000/ants/v2 v2.8.2 h1:D1wfANttg8uXhC9149gRt1PDQ+dLVFjNXkCEycMcvQQ= -github.com/panjf2000/ants/v2 v2.8.2/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I= +github.com/panjf2000/ants/v2 v2.9.0 h1:SztCLkVxBRigbg+vt0S5QvF5vxAbxbKt09/YfAJ0tEo= +github.com/panjf2000/ants/v2 v2.9.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I= github.com/patrickmn/go-cache v2.1.1-0.20191004192108-46f407853014+incompatible h1:IWzUvJ72xMjmrjR9q3H1PF+jwdN0uNQiR2t1BLNalyo= github.com/patrickmn/go-cache v2.1.1-0.20191004192108-46f407853014+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= @@ -77,20 +74,18 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= -github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/common v0.46.0 h1:doXzt5ybi1HBKpsZOL0sSkaNHJJqkyfEWZGGqqScV0Y= +github.com/prometheus/common v0.46.0/go.mod h1:Tp0qkxpb9Jsg54QMe+EAmqXkSV7Evdy1BTn+g2pa/hQ= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/qtls-go1-20 v0.3.4 h1:MfFAPULvst4yoMgY9QmtpYmfij/em7O8UUi+bNVm7Cg= -github.com/quic-go/qtls-go1-20 v0.3.4/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= -github.com/quic-go/quic-go v0.39.0 h1:AgP40iThFMY0bj8jGxROhw3S0FMGa8ryqsmi9tBH3So= -github.com/quic-go/quic-go v0.39.0/go.mod h1:T09QsDQWjLiQ74ZmacDfqZmhY/NLnw5BC40MANNNZ1Q= +github.com/quic-go/quic-go v0.41.0 h1:aD8MmHfgqTURWNJy48IYFg2OnxwHT3JL7ahGs73lb4k= +github.com/quic-go/quic-go v0.41.0/go.mod h1:qCkNjqczPEvgsOnxZ0eCD14lv+B2LHlFAB++CNOh9hA= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/shirou/gopsutil/v3 v3.23.7 h1:C+fHO8hfIppoJ1WdsVm1RoI0RwXoNdfTK7yWXV0wVj4= @@ -112,37 +107,36 @@ github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYm github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.uber.org/mock v0.3.0 h1:3mUxI1No2/60yUYax92Pt8eNOEecx2D3lcXZh2NEZJo= -go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= -golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/exp v0.0.0-20240213143201-ec583247a57a h1:HinSgX1tJRX3KsL//Gxynpw5CTOAIPhgL4W8PNiIpVE= +golang.org/x/exp v0.0.0-20240213143201-ec583247a57a/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= +golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231009173412-8bfb1ae86b6c h1:jHkCUWkseRf+W+edG5hMzr/Uh1xkDREY4caybAq4dpY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231009173412-8bfb1ae86b6c/go.mod h1:4cYg8o5yUbm77w8ZX00LhMVNl/YVBFJRYWDc0uYWMs0= -google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= -google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240213162025-012b6fc9bca9 h1:hZB7eLIaYlW9qXRfCq/qDaPdbeY3757uARz5Vvfv+cY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:YUWgXUFRPfoYK1IHMuxH5K6nPEXSCzIMljnQ59lLRCk= +google.golang.org/grpc v1.61.1 h1:kLAiWrZs7YeDM6MumDe7m3y4aM6wacLzM1Y/wiLP9XY= +google.golang.org/grpc v1.61.1/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/go.work b/go.work index f0aeb95..73f6dc4 100644 --- a/go.work +++ b/go.work @@ -1,4 +1,4 @@ -go 1.21.5 +go 1.21.8 use ( . diff --git a/go.work.sum b/go.work.sum index b1d1317..41b9568 100644 --- a/go.work.sum +++ b/go.work.sum @@ -4,8 +4,11 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= cloud.google.com/go v0.65.0 h1:Dg9iHVQfrhq82rUNu9ZxUDrJLaxFUe/HlCVaLyRruq8= cloud.google.com/go/bigquery v1.8.0 h1:PQcPefKFdaIzjQFbiyOgAqyx8q5djaE7x9Sqe712DPA= +cloud.google.com/go/compute v1.21.0 h1:JNBsyXVoOoNJtTQcnEY5uYpZIbeCTYIeDe0Xh1bySMk= cloud.google.com/go/compute v1.21.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.1.0 h1:/May9ojXjRkPBNVrq+oWLqmWCkr4OU5uRY29bu0mRyQ= cloud.google.com/go/pubsub v1.3.1 h1:ukjixP1wl0LpnZ6LWtZJ0mX5tBmjp1f8Sqer8Z2OMUU= @@ -23,7 +26,9 @@ git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999 h1:OR8VhtwhcAI3U48/ git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/AdguardTeam/golibs v0.10.7/go.mod h1:rSfQRGHIdgfxriDDNgNJ7HmE5zRoURq8R+VdR81Zuzw= github.com/AdguardTeam/golibs v0.17.2/go.mod h1:DKhCIXHcUYtBhU8ibTLKh1paUL96n5zhQBlx763sj+U= +github.com/AdguardTeam/golibs v0.19.0/go.mod h1:3WunclLLfrVAq7fYQRhd6f168FHOEMssnipVXCxDL/w= github.com/AdguardTeam/gomitmproxy v0.2.0 h1:rvCOf17pd1/CnMyMQW891zrEiIQBpQ8cIGjKN9pinUU= +github.com/AdguardTeam/gomitmproxy v0.2.1 h1:p9gr8Er1TYvf+7ic81Ax1sZ62UNCsMTZNbm7tC59S9o= github.com/AdguardTeam/gomitmproxy v0.2.1/go.mod h1:Qdv0Mktnzer5zpdpi5rAwixNJzW2FN91LjKJCkVbYGU= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= @@ -46,6 +51,7 @@ github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjK github.com/alecthomas/kingpin/v2 v2.3.1/go.mod h1:oYL5vtsvEHZGHxU7DMp32Dvx+qL+ptGn6lWaot2vCNE= github.com/alecthomas/kingpin/v2 v2.3.2 h1:H0aULhgmSzN8xQ3nX1uxtdlTHYoPLu5AhHxWrKI6ocU= github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= +github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= @@ -64,10 +70,14 @@ github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBT github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23 h1:D21IyuvjDCshj1/qq+pCNd3VZOAEI9jy6Bi131YlXgI= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk= +github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89 h1:aPflPkRFkVwbW6dmcVqfgwp1i+UWGFH6VgR1Jim5Ygc= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= +github.com/chromedp/chromedp v0.9.2 h1:dKtNz4kApb06KuSXoTQIyUC2TrA0fhGDwNZf3bcgfKw= github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs= +github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic= github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -86,8 +96,11 @@ github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38 github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f h1:WBZRG4aNOuI15bLRrCgN8fCq8E5Xuty6jGbmSNEvSsU= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d h1:t5Wuyh53qYyg9eqn4BbnlIT+vmhyww0TatL+zT3uWgI= @@ -98,8 +111,10 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/envoyproxy/go-control-plane v0.9.4 h1:rEvIZUSZ3fx39WIi3JkQqQBitGwpELBIYWeBVh6wn+E= +github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A= +github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= @@ -141,8 +156,11 @@ github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= @@ -151,7 +169,9 @@ github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7 h1:2hRPrmiwPrp3fQX967rNJIhQPtiGXdlQWAxKbKw3VHA= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= @@ -180,6 +200,7 @@ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20230821062121-407c9e7a662f/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible h1:j0GKcs05QVmm7yesiZq2+9cxHkNK9YM6zKx4D2qucQU= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= @@ -292,6 +313,7 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/microcosm-cc/bluemonday v1.0.1 h1:SIYunPjnlXcW+gVfvm0IlSeR5U3WZUOLfVmqg85Go44= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/microcosm-cc/bluemonday v1.0.21 h1:dNH3e4PSyE4vNX+KlRGHT5KrSvjeUkoNPwEORjffHJg= @@ -336,6 +358,7 @@ github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/quic-go/qtls-go1-20 v0.3.3/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= github.com/quic-go/quic-go v0.38.0/go.mod h1:MPCuRq7KBK2hNcfKj/1iD1BGuN3eAYMeNxp3T42LRUg= +github.com/quic-go/quic-go v0.39.4/go.mod h1:T09QsDQWjLiQ74ZmacDfqZmhY/NLnw5BC40MANNNZ1Q= github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= @@ -446,12 +469,14 @@ go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1 golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d h1:E2M5QgjZ/Jg+ObCQAudsXxuTsLj7Nl5RV/lZcQZmKSo= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220517005047-85d78b3ac167/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20221019170559-20944726eadf/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= golang.org/x/exp v0.0.0-20221205204356-47842c84f3db/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= @@ -497,7 +522,9 @@ golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852 h1:xYq6+9AtI+xP3M4r0N1hCkHrInHDBohhquRgx9Kk6gI= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -508,6 +535,7 @@ golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -523,6 +551,9 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808/go.mod h1:KG1lNk5ZFNssSZLrpVb4sMXKMpGwGXOxSG3rnu2gZQQ= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.1.0 h1:g6Z6vPFA9dYBAF7DWcH6sCcOntplXsDKcliusYijMlw= golang.org/x/term v0.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI= @@ -532,7 +563,13 @@ golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= @@ -553,6 +590,7 @@ golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= @@ -566,6 +604,7 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -576,7 +615,11 @@ google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWof google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 h1:SeZZZx0cP0fqUyA+oRzP9k7cSwJlvDFiROO72uwD6i0= google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk= +google.golang.org/genproto v0.0.0-20240205150955-31a09d347014 h1:g/4bk7P6TPMkAUbUhquq98xey1slwvuVJPosdBqYJlU= +google.golang.org/genproto v0.0.0-20240205150955-31a09d347014/go.mod h1:xEgQu1e4stdSSsxPDK8Azkrk/ECl5HvdPf6nbZrTS5M= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 h1:FmF5cCW94Ij59cfpoLiwTgodWmm60eEV0CjlsVg2fuw= google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= diff --git a/internal/access/access.go b/internal/access/access.go index e44cc80..7e0dbce 100644 --- a/internal/access/access.go +++ b/internal/access/access.go @@ -6,6 +6,7 @@ import ( "net/netip" "strings" + "github.com/AdguardTeam/golibs/netutil" "github.com/AdguardTeam/golibs/stringutil" "github.com/AdguardTeam/urlfilter" "github.com/AdguardTeam/urlfilter/filterlist" @@ -23,26 +24,20 @@ type Interface interface { // IsBlockedIP returns the status of the IP address blocking as well as the // rule that blocked it. - IsBlockedIP(ip netip.Addr) (blocked bool, rule string) + IsBlockedIP(ip netip.Addr) (blocked bool) } // Global controls IP and client blocking that takes place before all other // processing. Global is safe for concurrent use. type Global struct { - blockedIPs map[netip.Addr]string blockedHostsEng *urlfilter.DNSEngine - blockedNets []netip.Prefix + blockedNets netutil.SubnetSet } // NewGlobal create a new Global from provided parameters. -func NewGlobal(blockedDomains, blockedSubnets []string) (g *Global, err error) { +func NewGlobal(blockedDomains []string, blockedSubnets []netip.Prefix) (g *Global, err error) { g = &Global{ - blockedIPs: map[netip.Addr]string{}, - } - - err = processAccessList(blockedSubnets, g.blockedIPs, &g.blockedNets) - if err != nil { - return nil, fmt.Errorf("adding blocked hosts: %w", err) + blockedNets: netutil.SliceSubnetSet(blockedSubnets), } b := &strings.Builder{} @@ -68,24 +63,6 @@ func NewGlobal(blockedDomains, blockedSubnets []string) (g *Global, err error) { return g, nil } -// processAccessList is a helper for processing a list of strings, each of them -// could be an IP address or a CIDR. -func processAccessList(strs []string, ips map[netip.Addr]string, nets *[]netip.Prefix) (err error) { - for _, s := range strs { - var ip netip.Addr - var ipnet netip.Prefix - if ip, err = netip.ParseAddr(s); err == nil { - ips[ip] = ip.String() - } else if ipnet, err = netip.ParsePrefix(s); err == nil { - *nets = append(*nets, ipnet) - } else { - return fmt.Errorf("cannot parse subnet or ip address: %q", s) - } - } - - return nil -} - // type check var _ Interface = (*Global)(nil) @@ -104,16 +81,6 @@ func (g *Global) IsBlockedHost(host string, qt uint16) (blocked bool) { } // IsBlockedIP implements the [Interface] interface for *Global. -func (g *Global) IsBlockedIP(ip netip.Addr) (blocked bool, rule string) { - if ipStr, ok := g.blockedIPs[ip]; ok { - return true, ipStr - } - - for _, ipnet := range g.blockedNets { - if ipnet.Contains(ip) { - return true, ipnet.String() - } - } - - return false, "" +func (g *Global) IsBlockedIP(ip netip.Addr) (blocked bool) { + return g.blockedNets.Contains(ip) } diff --git a/internal/access/access_test.go b/internal/access/access_test.go index b4d2ee0..8d47940 100644 --- a/internal/access/access_test.go +++ b/internal/access/access_test.go @@ -17,7 +17,7 @@ func TestGlobal_IsBlockedHost(t *testing.T) { "||block_aaaa.test^$dnstype=AAAA", "||allowlist.test^", "@@||allow.allowlist.test^", - }, []string{}) + }, nil) require.NoError(t, err) testCases := []struct { @@ -76,44 +76,38 @@ func TestGlobal_IsBlockedHost(t *testing.T) { } func TestGlobal_IsBlockedIP(t *testing.T) { - global, err := access.NewGlobal([]string{}, []string{ - "1.1.1.1", - "2.2.2.0/8", + global, err := access.NewGlobal([]string{}, []netip.Prefix{ + netip.MustParsePrefix("1.1.1.1/32"), + netip.MustParsePrefix("2.2.2.0/8"), }) require.NoError(t, err) testCases := []struct { - want assert.BoolAssertionFunc - ip netip.Addr - wantRule string - name string + want assert.BoolAssertionFunc + ip netip.Addr + name string }{{ - want: assert.False, - wantRule: "", - name: "pass", - ip: netip.MustParseAddr("1.1.1.0"), + want: assert.False, + name: "pass", + ip: netip.MustParseAddr("1.1.1.0"), }, { - want: assert.True, - wantRule: "1.1.1.1", - name: "block_ip", - ip: netip.MustParseAddr("1.1.1.1"), + want: assert.True, + name: "block_ip", + ip: netip.MustParseAddr("1.1.1.1"), }, { - want: assert.False, - wantRule: "", - name: "pass_subnet", - ip: netip.MustParseAddr("1.2.2.2"), + want: assert.False, + name: "pass_subnet", + ip: netip.MustParseAddr("1.2.2.2"), }, { - want: assert.True, - wantRule: "2.2.2.0/8", - name: "block_subnet", - ip: netip.MustParseAddr("2.2.2.2"), + want: assert.True, + name: "block_subnet", + ip: netip.MustParseAddr("2.2.2.2"), }} for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - blocked, rule := global.IsBlockedIP(tc.ip) + blocked := global.IsBlockedIP(tc.ip) tc.want(t, blocked) - assert.Equal(t, tc.wantRule, rule) }) } } diff --git a/internal/access/engine.go b/internal/access/engine.go index e38512a..26c9548 100644 --- a/internal/access/engine.go +++ b/internal/access/engine.go @@ -29,7 +29,8 @@ func newBlockedHostEngine(rules []string) (e *blockedHostEngine) { } } -// isBlocked returns true if the req is blocked by this engine. +// isBlocked returns true if the req is blocked by this engine. req must have +// exactly one question. func (e *blockedHostEngine) isBlocked(req *dns.Msg) (blocked bool) { e.initOnce.Do(func() { start := time.Now() diff --git a/internal/access/profile.go b/internal/access/profile.go index 767d7c6..691fe3b 100644 --- a/internal/access/profile.go +++ b/internal/access/profile.go @@ -131,7 +131,7 @@ func matchASNs(asns []geoip.ASN, l *geoip.Location) (ok bool) { } // isBlockedByHostsEng returns true if the req is blocked by -// BlocklistDomainRules. +// BlocklistDomainRules. req must have exactly one question. func (p *DefaultProfile) isBlockedByHostsEng(req *dns.Msg) (blocked bool) { return p.blockedHostsEng.isBlocked(req) } diff --git a/internal/agd/server.go b/internal/agd/server.go index df7efae..ac7b540 100644 --- a/internal/agd/server.go +++ b/internal/agd/server.go @@ -9,76 +9,9 @@ import ( "github.com/AdguardTeam/AdGuardDNS/internal/agdnet" "github.com/AdguardTeam/AdGuardDNS/internal/dnsserver/netext" "github.com/AdguardTeam/golibs/errors" - "github.com/AdguardTeam/golibs/stringutil" "github.com/ameshkov/dnscrypt/v2" - "github.com/miekg/dns" ) -// Servers And Server Groups - -// ServerGroup is a group of DNS servers all of which use the same filtering -// settings. -type ServerGroup struct { - // TLS are the TLS settings for this server group. If Servers contains at - // least one server with a non-plain protocol (see [Protocol.IsPlain]), TLS - // must not be nil. - TLS *TLS - - // DDR is the configuration for the server group's Discovery Of Designated - // Resolvers (DDR) handlers. DDR is never nil. - DDR *DDR - - // Name is the unique name of the server group. - Name ServerGroupName - - // FilteringGroup is the ID of the filtering group for this server. - FilteringGroup FilteringGroupID - - // Servers are the settings for servers. Each element must be non-nil. - Servers []*Server -} - -// ServerGroupName is the name of a server group. -type ServerGroupName string - -// TLS is the TLS configuration of a DNS server group. -type TLS struct { - // Conf is the server's TLS configuration. - Conf *tls.Config - - // DeviceIDWildcards are the domain wildcards used to detect device IDs from - // clients' server names. - DeviceIDWildcards []string - - // SessionKeys are paths to files containing the TLS session keys for this - // server. - SessionKeys []string -} - -// DDR is the configuration for the server group's Discovery Of Designated -// Resolvers (DDR) handlers. -type DDR struct { - // DeviceTargets is the set of all domain names, subdomains of which should - // be checked for DDR queries with device IDs. - DeviceTargets *stringutil.Set - - // PublicTargets is the set of all public domain names, DDR queries for - // which should be processed. - PublicTargets *stringutil.Set - - // DeviceRecordTemplates are used to respond to DDR queries from recognized - // devices. - DeviceRecordTemplates []*dns.SVCB - - // PubilcRecordTemplates are used to respond to DDR queries from - // unrecognized devices. - PublicRecordTemplates []*dns.SVCB - - // Enabled shows if DDR queries are processed. If it is false, DDR domain - // name queries receive an NXDOMAIN response. - Enabled bool -} - // Server represents a single DNS server. That is, an entity that binds to one // or more ports and serves DNS over a single protocol. type Server struct { @@ -192,6 +125,24 @@ func (s *Server) BindsToInterfaces() (ok bool) { return len(s.bindData) > 0 && s.bindData[0].PrefixAddr != nil } +// BindDataPrefixes returns a slice of CIDR networks collected from the bind +// data of this server. +func (s *Server) BindDataPrefixes() (ps []netip.Prefix) { + for _, bd := range s.bindData { + var pref netip.Prefix + if bd.PrefixAddr == nil { + addr := bd.AddrPort.Addr() + pref = netip.PrefixFrom(addr, addr.BitLen()) + } else { + pref = bd.PrefixAddr.Prefix + } + + ps = append(ps, pref) + } + + return ps +} + // ServerBindData are the socket binding data for a server. Either AddrPort or // ListenConfig with PrefixAddr must be set. // diff --git a/internal/agd/server_test.go b/internal/agd/server_test.go index 534f091..4b57723 100644 --- a/internal/agd/server_test.go +++ b/internal/agd/server_test.go @@ -13,27 +13,31 @@ import ( // Common variables for tests. var ( + addrV4 = netip.MustParseAddr("1.2.3.4") bindDataAddrPortV4 = &agd.ServerBindData{ - AddrPort: netip.MustParseAddrPort("1.2.3.4:53"), + AddrPort: netip.AddrPortFrom(addrV4, 53), } + addrV6 = netip.MustParseAddr("1234::cdef") bindDataAddrPortV6 = &agd.ServerBindData{ - AddrPort: netip.MustParseAddrPort("[1234::cdef]:53"), + AddrPort: netip.AddrPortFrom(addrV6, 53), } + prefixV4 = netip.MustParsePrefix("1.2.3.0/24") bindDataIface = &agd.ServerBindData{ ListenConfig: &agdtest.ListenConfig{}, PrefixAddr: &agdnet.PrefixNetAddr{ - Prefix: netip.MustParsePrefix("1.2.3.0/24"), + Prefix: prefixV4, Net: "", Port: 53, }, } + singleIPPrefixV4 = netip.MustParsePrefix("1.2.3.4/32") bindDataIfaceSingleIP = &agd.ServerBindData{ ListenConfig: &agdtest.ListenConfig{}, PrefixAddr: &agdnet.PrefixNetAddr{ - Prefix: netip.MustParsePrefix("1.2.3.4/32"), + Prefix: singleIPPrefixV4, Net: "", Port: 53, }, @@ -105,6 +109,41 @@ func TestServer_BindsToInterfaces(t *testing.T) { assert.True(t, s.BindsToInterfaces()) } +func TestServer_BindDataPrefixes(t *testing.T) { + testCases := []struct { + bindData *agd.ServerBindData + name string + want []netip.Prefix + }{{ + bindData: bindDataAddrPortV4, + want: []netip.Prefix{netip.PrefixFrom(addrV4, addrV4.BitLen())}, + name: "addr_port_v4", + }, { + bindData: bindDataAddrPortV6, + want: []netip.Prefix{netip.PrefixFrom(addrV6, addrV6.BitLen())}, + name: "addr_port_v6", + }, { + bindData: bindDataIface, + want: []netip.Prefix{prefixV4}, + name: "prefix", + }, { + bindData: bindDataIfaceSingleIP, + want: []netip.Prefix{singleIPPrefixV4}, + name: "prefix_single_ip", + }} + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + s := &agd.Server{} + require.NotPanics(t, func() { + s.SetBindData([]*agd.ServerBindData{tc.bindData}) + }) + + assert.Equal(t, tc.want, s.BindDataPrefixes()) + }) + } +} + func TestServer_HasAddr(t *testing.T) { testCases := []struct { bindData *agd.ServerBindData diff --git a/internal/agd/servergroup.go b/internal/agd/servergroup.go new file mode 100644 index 0000000..51c7ba6 --- /dev/null +++ b/internal/agd/servergroup.go @@ -0,0 +1,158 @@ +package agd + +import ( + "crypto/tls" + "fmt" + "math" + "net/netip" + + "github.com/AdguardTeam/golibs/stringutil" + "github.com/miekg/dns" +) + +// ServerGroup is a group of DNS servers all of which use the same filtering +// settings. +type ServerGroup struct { + // BlockPageRedirect is the configuration for the server group's block page. + // BlockPageRedirect is never nil. + // + // TODO(a.garipov): Use. + BlockPageRedirect *BlockPageRedirect + + // DDR is the configuration for the server group's Discovery Of Designated + // Resolvers (DDR) handlers. DDR is never nil. + DDR *DDR + + // TLS are the TLS settings for this server group. If Servers contains at + // least one server with a non-plain protocol (see [Protocol.IsPlain]), TLS + // must not be nil. + TLS *TLS + + // Name is the unique name of the server group. + Name ServerGroupName + + // FilteringGroup is the ID of the filtering group for this server. + FilteringGroup FilteringGroupID + + // Servers are the settings for servers. Each element must be non-nil. + Servers []*Server +} + +// ServerGroupName is the name of a server group. +type ServerGroupName string + +// TLS is the TLS configuration of a DNS server group. +type TLS struct { + // Conf is the server's TLS configuration. + Conf *tls.Config + + // DeviceIDWildcards are the domain wildcards used to detect device IDs from + // clients' server names. + DeviceIDWildcards []string + + // SessionKeys are paths to files containing the TLS session keys for this + // server. + SessionKeys []string +} + +// DDR is the configuration for the server group's Discovery Of Designated +// Resolvers (DDR) handlers. +type DDR struct { + // DeviceTargets is the set of all domain names, subdomains of which should + // be checked for DDR queries with device IDs. + DeviceTargets *stringutil.Set + + // PublicTargets is the set of all public domain names, DDR queries for + // which should be processed. + PublicTargets *stringutil.Set + + // DeviceRecordTemplates are used to respond to DDR queries from recognized + // devices. + DeviceRecordTemplates []*dns.SVCB + + // PubilcRecordTemplates are used to respond to DDR queries from + // unrecognized devices. + PublicRecordTemplates []*dns.SVCB + + // Enabled shows if DDR queries are processed. If it is false, DDR domain + // name queries receive an NXDOMAIN response. + Enabled bool +} + +// BlockPageRedirect is the configuration for a [ServerGroup]'s block page. +type BlockPageRedirect struct { + // Apply defines request parameters based on which the block page is shown + // always. If a request matches Apply, both [BlockPageRedirect.Skip] and + // [BlockPageRedirect.Probability] are ignored. + // + // If [BlockPageRedirect.Enabled] is true, Apply must not be nil. + Apply *BlockPageRedirectApply + + // Skip defines request parameters based on which the block page is not + // shown, regardless of [BlockPageRedirect.Probability]. + // + // If [BlockPageRedirect.Enabled] is true, Skip must not be nil. + Skip *BlockPageRedirectSkip + + // IPv4 are the IPv4 addresses of the block page, used to respond to A + // queries. + // + // If [BlockPageRedirect.Enabled] is true, IPv4, [BlockPageRedirect.IPv6], + // or both must be filled. + IPv4 []netip.Addr + + // IPv6 are the IPv6 addresses of the block page, used to respond to AAAA + // queries. + // + // If [BlockPageRedirect.Enabled] is true, [BlockPageRedirect.IPv4], IPv6, + // or both must be filled. + IPv6 []netip.Addr + + // Probability defines the probability of responding with the block page IPs + // based on remote address. Probability must be between 0.0 and 1.0. + Probability Probability + + // Enabled defines whether the block-page feature is enabled. + Enabled bool +} + +// Probability is a type for probabilities ranging from 0.0 to 1.0. +type Probability float64 + +// NewProbability returns a properly converted Probability or an error. +func NewProbability(f float64) (prob Probability, err error) { + if math.IsNaN(f) || f < 0.0 || f > 1.0 { + return 0, fmt.Errorf("probability must be between 0.0 and 1.0; got %v", f) + } + + return Probability(f), nil +} + +// MustNewProbability returns a properly converted Probability or panics with an +// error. +func MustNewProbability(f float64) (prob Probability) { + prob, err := NewProbability(f) + if err != nil { + panic(err) + } + + return prob +} + +// BlockPageRedirectApply defines the conditions for applying the block-page +// logic for a particular request. +type BlockPageRedirectApply struct { + // ClientSubnets are the subnets for which block page is always enabled. + ClientSubnets []netip.Prefix +} + +// BlockPageRedirectSkip defines the conditions for skipping the block page +// logic for a particular request. +type BlockPageRedirectSkip struct { + // ClientSubnets are the subnets for which block page is always disabled. + ClientSubnets []netip.Prefix + + // QuestionDomains are the domain names for which block page is always + // disabled. + QuestionDomains []string +} diff --git a/internal/agdnet/agdnet.go b/internal/agdnet/agdnet.go index c0e258c..32e9036 100644 --- a/internal/agdnet/agdnet.go +++ b/internal/agdnet/agdnet.go @@ -4,8 +4,6 @@ package agdnet import ( - "fmt" - "net/netip" "strings" ) @@ -48,33 +46,6 @@ func AndroidMetricDomainReplacement(fqdn string) (repl string) { return "" } -// ParseSubnets parses IP networks, including single-address ones, from strings. -func ParseSubnets(strs ...string) (subnets []netip.Prefix, err error) { - subnets = make([]netip.Prefix, len(strs)) - for i, s := range strs { - // Detect if this is a CIDR or an IP early, so that the path to - // returning an error is shorter. - if strings.Contains(s, "/") { - subnets[i], err = netip.ParsePrefix(s) - if err != nil { - return nil, fmt.Errorf("subnet at idx %d: %w", i, err) - } - - continue - } - - var ip netip.Addr - ip, err = netip.ParseAddr(s) - if err != nil { - return nil, fmt.Errorf("ip at idx %d: %w", i, err) - } - - subnets[i] = netip.PrefixFrom(ip, ip.BitLen()) - } - - return subnets, nil -} - // NormalizeDomain returns lowercased version of the host without the final dot. // // TODO(a.garipov): Move to golibs. diff --git a/internal/agdservice/agdservice.go b/internal/agdservice/agdservice.go index f83ab5c..3fa27bc 100644 --- a/internal/agdservice/agdservice.go +++ b/internal/agdservice/agdservice.go @@ -1,38 +1,7 @@ // Package agdservice defines types and interfaces for long-running services. // -// TODO(a.garipov): Move to golibs. +// TODO(a.garipov): Move more to golibs. package agdservice -import "context" - -// Interface is the interface for long-running services. -// -// TODO(a.garipov): Define whether or not a service should finish starting or -// shutting down before returning from these methods. -type Interface interface { - // Start starts the service. ctx is used for cancelation. - // - // TODO(a.garipov): Use contexts with timeouts everywhere. - Start(ctx context.Context) (err error) - - // Shutdown gracefully stops the service. ctx is used to determine - // a timeout before trying to stop the service less gracefully. - // - // TODO(a.garipov): Use contexts with timeouts everywhere. - Shutdown(ctx context.Context) (err error) -} - -// type check -var _ Interface = Empty{} - -// Empty is an [Interface] implementation that does nothing. -type Empty struct{} - -// Start implements the [Interface] interface for Empty. -func (Empty) Start(_ context.Context) (err error) { return nil } - -// Shutdown implements the [Interface] interface for Empty. -func (Empty) Shutdown(_ context.Context) (err error) { return nil } - // unit is a convenient alias for struct{}. type unit = struct{} diff --git a/internal/agdservice/refresh.go b/internal/agdservice/refresh.go index a685260..0ac590c 100644 --- a/internal/agdservice/refresh.go +++ b/internal/agdservice/refresh.go @@ -7,6 +7,7 @@ import ( "github.com/AdguardTeam/AdGuardDNS/internal/errcoll" "github.com/AdguardTeam/golibs/log" + "github.com/AdguardTeam/golibs/service" "golang.org/x/exp/rand" ) @@ -111,17 +112,17 @@ func NewRefreshWorker(c *RefreshWorkerConfig) (w *RefreshWorker) { } // type check -var _ Interface = (*RefreshWorker)(nil) +var _ service.Interface = (*RefreshWorker)(nil) -// Start implements the [Interface] interface for *RefreshWorker. err is always -// nil. +// Start implements the [service.Interface] interface for *RefreshWorker. err +// is always nil. func (w *RefreshWorker) Start(_ context.Context) (err error) { go w.refreshInALoop() return nil } -// Shutdown implements the [Interface] interface for *RefreshWorker. +// Shutdown implements the [service.Interface] interface for *RefreshWorker. func (w *RefreshWorker) Shutdown(ctx context.Context) (err error) { if w.refrOnShutdown { err = w.refr.Refresh(ctx) diff --git a/internal/agdtest/interface.go b/internal/agdtest/interface.go index 716522c..00b901c 100644 --- a/internal/agdtest/interface.go +++ b/internal/agdtest/interface.go @@ -39,7 +39,7 @@ var _ access.Interface = (*AccessManager)(nil) // AccessManager is a [access.Interface] for tests. type AccessManager struct { OnIsBlockedHost func(host string, qt uint16) (blocked bool) - OnIsBlockedIP func(ip netip.Addr) (blocked bool, rule string) + OnIsBlockedIP func(ip netip.Addr) (blocked bool) } // IsBlockedHost implements the [access.Interface] interface for *AccessManager. @@ -48,7 +48,7 @@ func (a *AccessManager) IsBlockedHost(host string, qt uint16) (blocked bool) { } // IsBlockedIP implements the [access.Interface] interface for *AccessManager. -func (a *AccessManager) IsBlockedIP(ip netip.Addr) (blocked bool, rule string) { +func (a *AccessManager) IsBlockedIP(ip netip.Addr) (blocked bool) { return a.OnIsBlockedIP(ip) } diff --git a/internal/backendpb/profiledb.go b/internal/backendpb/profiledb.go index 8318997..1ae0d8f 100644 --- a/internal/backendpb/profiledb.go +++ b/internal/backendpb/profiledb.go @@ -16,8 +16,10 @@ import ( "github.com/AdguardTeam/AdGuardDNS/internal/dnsmsg" "github.com/AdguardTeam/AdGuardDNS/internal/errcoll" "github.com/AdguardTeam/AdGuardDNS/internal/geoip" + "github.com/AdguardTeam/AdGuardDNS/internal/metrics" "github.com/AdguardTeam/AdGuardDNS/internal/profiledb" "github.com/AdguardTeam/golibs/errors" + "github.com/AdguardTeam/golibs/netutil" "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" @@ -27,6 +29,9 @@ import ( // ProfileStorageConfig is the configuration for the business logic backend // profile storage. type ProfileStorageConfig struct { + // BindSet is the subnet set created from DNS servers listening addresses. + BindSet netutil.SubnetSet + // ErrColl is the error collector that is used to collect critical and // non-critical errors. ErrColl errcoll.Interface @@ -40,6 +45,7 @@ type ProfileStorageConfig struct { // that retrieves the profile and device information from the business logic // backend. It is safe for concurrent use. type ProfileStorage struct { + bindSet netutil.SubnetSet errColl errcoll.Interface // client is the current GRPC client. @@ -56,6 +62,7 @@ func NewProfileStorage(c *ProfileStorageConfig) (s *ProfileStorage, err error) { } return &ProfileStorage{ + bindSet: c.BindSet, client: client, errColl: c.ErrColl, }, nil @@ -97,7 +104,7 @@ func (s *ProfileStorage) Profiles( stats.endRecv() stats.startDec() - prof, devices, profErr := profile.toInternal(ctx, time.Now(), s.errColl) + prof, devices, profErr := profile.toInternal(ctx, time.Now(), s.bindSet, s.errColl) if profErr != nil { reportf(ctx, s.errColl, "loading profile: %w", profErr) @@ -140,6 +147,7 @@ func fixGRPCError(err error) (wErr error) { func (x *DNSProfile) toInternal( ctx context.Context, updTime time.Time, + bindSet netutil.SubnetSet, errColl errcoll.Interface, ) (profile *agd.Profile, devices []*agd.Device, err error) { if x == nil { @@ -156,7 +164,7 @@ func (x *DNSProfile) toInternal( return nil, nil, fmt.Errorf("blocking mode: %w", err) } - devices, deviceIds := devicesToInternal(ctx, x.Devices, errColl) + devices, deviceIds := devicesToInternal(ctx, x.Devices, bindSet, errColl) listsEnabled, listIDs := x.RuleLists.toInternal(ctx, errColl) profID, err := agd.NewProfileID(x.DnsId) @@ -384,6 +392,7 @@ func blockingModeToInternal(pbm isDNSProfile_BlockingMode) (m dnsmsg.BlockingMod func devicesToInternal( ctx context.Context, ds []*DeviceSettings, + bindSet netutil.SubnetSet, errColl errcoll.Interface, ) (out []*agd.Device, ids []agd.DeviceID) { l := len(ds) @@ -393,9 +402,10 @@ func devicesToInternal( out = make([]*agd.Device, 0, l) for _, d := range ds { - dev, err := d.toInternal() + dev, err := d.toInternal(bindSet) if err != nil { reportf(ctx, errColl, "invalid device settings: %w", err) + metrics.DevicesInvalidTotal.Inc() continue } @@ -409,7 +419,7 @@ func devicesToInternal( // toInternal is a helper that converts device settings from backend protobuf // response to AdGuard DNS device object. -func (ds *DeviceSettings) toInternal() (dev *agd.Device, err error) { +func (ds *DeviceSettings) toInternal(bindSet netutil.SubnetSet) (dev *agd.Device, err error) { if ds == nil { return nil, fmt.Errorf("device is nil") } @@ -426,6 +436,13 @@ func (ds *DeviceSettings) toInternal() (dev *agd.Device, err error) { return nil, fmt.Errorf("dedicated ips: %w", err) } + // TODO(d.kolyshev): Extract business logic validation. + for _, addr := range dedicatedIPs { + if !bindSet.Contains(addr) { + return nil, fmt.Errorf("dedicated ip %q is not in bind data", addr) + } + } + id, err := agd.NewDeviceID(ds.Id) if err != nil { return nil, fmt.Errorf("device id: %s: %w", ds.Id, err) diff --git a/internal/backendpb/profiledb_internal_test.go b/internal/backendpb/profiledb_internal_test.go index f9e1cd7..000197e 100644 --- a/internal/backendpb/profiledb_internal_test.go +++ b/internal/backendpb/profiledb_internal_test.go @@ -30,6 +30,9 @@ const testProfileID agd.ProfileID = "prof1234" // TestUpdTime is the common update time for tests. var TestUpdTime = time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC) +// testBind includes any IPv4 address. +var testBind = netip.MustParsePrefix("0.0.0.0/0") + func TestDNSProfile_ToInternal(t *testing.T) { ctx := context.Background() @@ -40,7 +43,7 @@ func TestDNSProfile_ToInternal(t *testing.T) { } t.Run("success", func(t *testing.T) { - got, gotDevices, err := NewTestDNSProfile(t).toInternal(ctx, TestUpdTime, errColl) + got, gotDevices, err := NewTestDNSProfile(t).toInternal(ctx, TestUpdTime, testBind, errColl) require.NoError(t, err) assert.Equal(t, newProfile(t), got) @@ -57,18 +60,44 @@ func TestDNSProfile_ToInternal(t *testing.T) { got, gotDevices, err := newDNSProfileWithBadData(t).toInternal( ctx, TestUpdTime, + testBind, savingErrColl, ) require.NoError(t, err) - require.Error(t, errCollErr) + testutil.AssertErrorMsg(t, "backendpb: invalid device settings:"+ + " dedicated ips: ip at index 0: unexpected slice size", errCollErr) assert.Equal(t, newProfile(t), got) assert.Equal(t, newDevices(t), gotDevices) }) + t.Run("invalid_device_ded_ip", func(t *testing.T) { + var errCollErr error + savingErrColl := &agdtest.ErrorCollector{ + OnCollect: func(_ context.Context, err error) { + errCollErr = err + }, + } + + bindSet := netip.MustParsePrefix("2.2.2.2/32") + got, gotDevices, err := NewTestDNSProfile(t).toInternal( + ctx, + TestUpdTime, + bindSet, + savingErrColl, + ) + require.NoError(t, err) + testutil.AssertErrorMsg(t, "backendpb: invalid device settings:"+ + " dedicated ip \"1.1.1.2\" is not in bind data", errCollErr) + + assert.NotEqual(t, newProfile(t), got) + assert.NotEqual(t, newDevices(t), gotDevices) + assert.Len(t, gotDevices, 1) + }) + t.Run("empty", func(t *testing.T) { var emptyDNSProfile *DNSProfile - _, _, err := emptyDNSProfile.toInternal(ctx, TestUpdTime, errColl) + _, _, err := emptyDNSProfile.toInternal(ctx, TestUpdTime, testBind, errColl) testutil.AssertErrorMsg(t, "profile is nil", err) }) @@ -78,7 +107,7 @@ func TestDNSProfile_ToInternal(t *testing.T) { Deleted: true, } - got, gotDevices, err := dp.toInternal(ctx, TestUpdTime, errColl) + got, gotDevices, err := dp.toInternal(ctx, TestUpdTime, testBind, errColl) require.NoError(t, err) require.NotNil(t, got) @@ -91,7 +120,7 @@ func TestDNSProfile_ToInternal(t *testing.T) { dp := NewTestDNSProfile(t) dp.Parental.Schedule.Tmz = "invalid" - _, _, err := dp.toInternal(ctx, TestUpdTime, errColl) + _, _, err := dp.toInternal(ctx, TestUpdTime, testBind, errColl) testutil.AssertErrorMsg(t, "parental: schedule: loading timezone: unknown time zone invalid", err) }) @@ -102,7 +131,7 @@ func TestDNSProfile_ToInternal(t *testing.T) { End: nil, } - _, _, err := dp.toInternal(ctx, TestUpdTime, errColl) + _, _, err := dp.toInternal(ctx, TestUpdTime, testBind, errColl) testutil.AssertErrorMsg(t, "parental: schedule: weekday Sunday: bad day range: end 0 less than start 16", err) }) @@ -111,7 +140,7 @@ func TestDNSProfile_ToInternal(t *testing.T) { bm := dp.BlockingMode.(*DNSProfile_BlockingModeCustomIp) bm.BlockingModeCustomIp.Ipv4 = []byte("1") - _, _, err := dp.toInternal(ctx, TestUpdTime, errColl) + _, _, err := dp.toInternal(ctx, TestUpdTime, testBind, errColl) testutil.AssertErrorMsg(t, "blocking mode: bad custom ipv4: unexpected slice size", err) }) @@ -120,7 +149,7 @@ func TestDNSProfile_ToInternal(t *testing.T) { bm := dp.BlockingMode.(*DNSProfile_BlockingModeCustomIp) bm.BlockingModeCustomIp.Ipv6 = []byte("1") - _, _, err := dp.toInternal(ctx, TestUpdTime, errColl) + _, _, err := dp.toInternal(ctx, TestUpdTime, testBind, errColl) testutil.AssertErrorMsg(t, "blocking mode: bad custom ipv6: unexpected slice size", err) }) @@ -128,7 +157,7 @@ func TestDNSProfile_ToInternal(t *testing.T) { dp := NewTestDNSProfile(t) dp.BlockingMode = nil - got, gotDevices, err := dp.toInternal(ctx, TestUpdTime, errColl) + got, gotDevices, err := dp.toInternal(ctx, TestUpdTime, testBind, errColl) require.NoError(t, err) require.NotNil(t, got) @@ -143,7 +172,7 @@ func TestDNSProfile_ToInternal(t *testing.T) { dp := NewTestDNSProfile(t) dp.Access = nil - got, _, err := dp.toInternal(ctx, TestUpdTime, errColl) + got, _, err := dp.toInternal(ctx, TestUpdTime, testBind, errColl) require.NoError(t, err) require.NotNil(t, got) @@ -157,7 +186,7 @@ func TestDNSProfile_ToInternal(t *testing.T) { Enabled: false, } - got, _, err := dp.toInternal(ctx, TestUpdTime, errColl) + got, _, err := dp.toInternal(ctx, TestUpdTime, testBind, errColl) require.NoError(t, err) require.NotNil(t, got) @@ -451,7 +480,7 @@ func BenchmarkDNSProfile_ToInternal(b *testing.B) { b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { - profSink, _, errSink = dp.toInternal(ctx, TestUpdTime, errColl) + profSink, _, errSink = dp.toInternal(ctx, TestUpdTime, testBind, errColl) } require.NotNil(b, profSink) diff --git a/internal/backendpb/profiledb_test.go b/internal/backendpb/profiledb_test.go index 3382adc..90cdbf0 100644 --- a/internal/backendpb/profiledb_test.go +++ b/internal/backendpb/profiledb_test.go @@ -1,8 +1,9 @@ package backendpb_test import ( - context "context" + "context" "net" + "net/netip" "net/url" "strconv" "testing" @@ -52,6 +53,7 @@ func BenchmarkProfileStorage_Profiles(b *testing.B) { require.NoError(b, err) s, err := backendpb.NewProfileStorage(&backendpb.ProfileStorageConfig{ + BindSet: netip.MustParsePrefix("0.0.0.0/0"), ErrColl: errColl, Endpoint: &url.URL{ Scheme: "grpc", diff --git a/internal/bindtodevice/chanpacketconn_linux.go b/internal/bindtodevice/chanpacketconn_linux.go index b362fc2..c799e9e 100644 --- a/internal/bindtodevice/chanpacketconn_linux.go +++ b/internal/bindtodevice/chanpacketconn_linux.go @@ -106,6 +106,9 @@ func (c *chanPacketConn) LocalAddr() (addr net.Addr) { return c.laddr } // *chanPacketConn. func (c *chanPacketConn) ReadFrom(b []byte) (n int, raddr net.Addr, err error) { n, sess, err := c.readFromSession(b, "ReadFrom") + if sess == nil { + return 0, nil, err + } return n, sess.RemoteAddr(), err } @@ -121,6 +124,13 @@ func (c *chanPacketConn) readFromSession( b []byte, fnName string, ) (n int, s netext.PacketSession, err error) { + var sess *packetSession + defer func() { + if sess != nil { + n = copy(b, sess.readBody) + } + }() + var deadline time.Time func() { c.deadlineMu.RLock() @@ -137,16 +147,19 @@ func (c *chanPacketConn) readFromSession( } defer stopTimer() - sess, err := receiveWithTimer(c.sessions, timerCh) + sess, err = receiveWithTimer(c.sessions, timerCh) if err != nil { err = fmt.Errorf("receiving: %w", err) - return 0, nil, wrapConnError(tnChanPConn, fnName, c.laddr, err) + // Prevent netext.PacketSession((*packetSession)(nil)). + if sess != nil { + s = sess + } + + return 0, s, wrapConnError(tnChanPConn, fnName, c.laddr, err) } - n = copy(b, sess.readBody) - - return n, sess, nil + return 0, sess, nil } // timerFromDeadline converts a deadline value into a timer channel. stopTimer diff --git a/internal/bindtodevice/manager_linux.go b/internal/bindtodevice/manager_linux.go index 8abac5d..cdbffef 100644 --- a/internal/bindtodevice/manager_linux.go +++ b/internal/bindtodevice/manager_linux.go @@ -10,12 +10,12 @@ import ( "sync" "github.com/AdguardTeam/AdGuardDNS/internal/agdnet" - "github.com/AdguardTeam/AdGuardDNS/internal/agdservice" "github.com/AdguardTeam/AdGuardDNS/internal/dnsserver/netext" "github.com/AdguardTeam/AdGuardDNS/internal/errcoll" "github.com/AdguardTeam/golibs/errors" "github.com/AdguardTeam/golibs/log" "github.com/AdguardTeam/golibs/mapsutil" + "github.com/AdguardTeam/golibs/service" "github.com/AdguardTeam/golibs/syncutil" "github.com/miekg/dns" ) @@ -211,12 +211,12 @@ func (m *Manager) validateIfaceSubnet(ifaceName string, subnet netip.Prefix) (er } // type check -var _ agdservice.Interface = (*Manager)(nil) +var _ service.Interface = (*Manager)(nil) -// Start implements the [agdservice.Interface] interface for *Manager. If m is +// Start implements the [service.Interface] interface for *Manager. If m is // nil, Start returns nil, since this feature is optional. // -// TODO(a.garipov): Consider an interface solution. +// TODO(a.garipov): Consider an interface solution instead of the nil exception. // // TODO(a.garipov): Use the context for cancelation. func (m *Manager) Start(_ context.Context) (err error) { @@ -249,12 +249,15 @@ func (m *Manager) Start(_ context.Context) (err error) { return nil } -// Shutdown implements the [agdservice.Interface] interface for *Manager. If m -// is nil, Shutdown returns nil, since this feature is optional. -// -// TODO(a.garipov): Consider an interface solution. +// Shutdown implements the [service.Interface] interface for *Manager. Shutdown +// does not actually wait for all sockets to close. If m is nil, Shutdown +// returns nil, since this feature is optional. // // TODO(a.garipov): Consider waiting for all sockets to close. +// +// TODO(a.garipov): Use the context for cancelation. +// +// TODO(a.garipov): Consider an interface solution instead of the nil exception. func (m *Manager) Shutdown(_ context.Context) (err error) { if m == nil { return nil diff --git a/internal/bindtodevice/manager_others.go b/internal/bindtodevice/manager_others.go index 32fe66e..d24db8c 100644 --- a/internal/bindtodevice/manager_others.go +++ b/internal/bindtodevice/manager_others.go @@ -7,8 +7,8 @@ import ( "fmt" "net/netip" - "github.com/AdguardTeam/AdGuardDNS/internal/agdservice" "github.com/AdguardTeam/golibs/errors" + "github.com/AdguardTeam/golibs/service" ) // Manager creates individual listeners and dispatches connections to them. @@ -43,9 +43,9 @@ func (m *Manager) ListenConfig(id ID, subnet netip.Prefix) (c *ListenConfig, err } // type check -var _ agdservice.Interface = (*Manager)(nil) +var _ service.Interface = (*Manager)(nil) -// Start implements the [agdservice.Interface] interface for *Manager. If m is +// Start implements the [service.Interface] interface for *Manager. If m is // nil, Start returns nil, since this feature is optional. // // It is only supported on Linux. @@ -57,8 +57,8 @@ func (m *Manager) Start(_ context.Context) (err error) { return fmt.Errorf("bindtodevice: starting: %w; only supported on linux", errors.ErrUnsupported) } -// Shutdown implements the [agdservice.Interface] interface for *Manager. If m -// is nil, Shutdown returns nil, since this feature is optional. +// Shutdown implements the [service.Interface] interface for *Manager. If m is +// nil, Shutdown returns nil, since this feature is optional. // // It is only supported on Linux. func (m *Manager) Shutdown(_ context.Context) (err error) { diff --git a/internal/cmd/access.go b/internal/cmd/access.go index dbf71dc..3a76108 100644 --- a/internal/cmd/access.go +++ b/internal/cmd/access.go @@ -1,8 +1,7 @@ package cmd import ( - "fmt" - "net/netip" + "github.com/AdguardTeam/golibs/netutil" ) // accessConfig is the configuration that controls IP and hosts blocking. @@ -11,7 +10,7 @@ type accessConfig struct { BlockedQuestionDomains []string `yaml:"blocked_question_domains"` // BlockedClientSubnets is a list of IP addresses or subnets to block. - BlockedClientSubnets []string `yaml:"blocked_client_subnets"` + BlockedClientSubnets []netutil.Prefix `yaml:"blocked_client_subnets"` } // validate returns an error if the access configuration is invalid. @@ -20,21 +19,5 @@ func (a *accessConfig) validate() (err error) { return errNilConfig } - for i, s := range a.BlockedClientSubnets { - // TODO(a.garipov): Use [netutil.ParseSubnet] after refactoring it to - // [netip.Addr]. - _, parseErr := netip.ParseAddr(s) - if parseErr == nil { - continue - } - - _, parseErr = netip.ParsePrefix(s) - if parseErr == nil { - continue - } - - return fmt.Errorf("value %q at index %d: bad ip or cidr: %w", s, i, parseErr) - } - return nil } diff --git a/internal/cmd/backend.go b/internal/cmd/backend.go index b2b2c69..d68e5df 100644 --- a/internal/cmd/backend.go +++ b/internal/cmd/backend.go @@ -3,14 +3,18 @@ package cmd import ( "context" "fmt" + "net/netip" "net/url" + "github.com/AdguardTeam/AdGuardDNS/internal/agd" "github.com/AdguardTeam/AdGuardDNS/internal/agdservice" "github.com/AdguardTeam/AdGuardDNS/internal/backendpb" "github.com/AdguardTeam/AdGuardDNS/internal/billstat" "github.com/AdguardTeam/AdGuardDNS/internal/errcoll" "github.com/AdguardTeam/AdGuardDNS/internal/profiledb" + "github.com/AdguardTeam/golibs/log" "github.com/AdguardTeam/golibs/netutil" + "github.com/AdguardTeam/golibs/service" "github.com/AdguardTeam/golibs/timeutil" ) @@ -67,17 +71,22 @@ func (c *backendConfig) validate() (err error) { // handler. func setupBackend( conf *backendConfig, + grps []*agd.ServerGroup, envs *environments, - sigHdlr signalHandler, + sigHdlr *service.SignalHandler, errColl errcoll.Interface, -) (profDB *profiledb.Default, rec *billstat.RuntimeRecorder, err error) { +) (profDB profiledb.Interface, rec billstat.Recorder, err error) { + if !envs.ProfilesEnabled { + return &profiledb.Disabled{}, billstat.EmptyRecorder{}, nil + } + rec, err = setupBillStat(conf, envs, sigHdlr, errColl) if err != nil { // Don't wrap the error, because it's informative enough as is. return nil, nil, err } - profDB, err = setupProfDB(conf, envs, sigHdlr, errColl) + profDB, err = setupProfDB(conf, grps, envs, sigHdlr, errColl) if err != nil { // Don't wrap the error, because it's informative enough as is. return nil, nil, err @@ -91,7 +100,7 @@ func setupBackend( func setupBillStat( conf *backendConfig, envs *environments, - sigHdlr signalHandler, + sigHdlr *service.SignalHandler, errColl errcoll.Interface, ) (rec *billstat.RuntimeRecorder, err error) { apiURL := netutil.CloneURL(&envs.BillStatURL.URL) @@ -124,7 +133,7 @@ func setupBillStat( return nil, fmt.Errorf("starting bill stat recorder refresher: %w", err) } - sigHdlr.add(billStatRefr) + sigHdlr.Add(billStatRefr) return rec, nil } @@ -133,12 +142,14 @@ func setupBillStat( // registers its refresher in the signal handler. func setupProfDB( conf *backendConfig, + grps []*agd.ServerGroup, envs *environments, - sigHdlr signalHandler, + sigHdlr *service.SignalHandler, errColl errcoll.Interface, ) (profDB *profiledb.Default, err error) { apiURL := netutil.CloneURL(&envs.ProfilesURL.URL) - profStrg, err := setupProfStorage(apiURL, errColl) + bindSet := collectBindSubnetSet(grps) + profStrg, err := setupProfStorage(apiURL, bindSet, errColl) if err != nil { return nil, fmt.Errorf("creating profile storage: %w", err) } @@ -174,11 +185,40 @@ func setupProfDB( return nil, fmt.Errorf("starting default profile database refresher: %w", err) } - sigHdlr.add(profDBRefr) + sigHdlr.Add(profDBRefr) return profDB, nil } +// collectBindSubnetSet returns a subnet set with IP addresses of servers in the +// provided server groups grps. +func collectBindSubnetSet(grps []*agd.ServerGroup) (s netutil.SubnetSet) { + var serverPrefixes []netip.Prefix + allSingleIP := true + for _, grp := range grps { + for _, srv := range grp.Servers { + for _, p := range srv.BindDataPrefixes() { + allSingleIP = allSingleIP && p.IsSingleIP() + serverPrefixes = append(serverPrefixes, p) + } + } + } + + // In cases where an installation only has single-IP prefixes in bind + // interfaces, or no bind interfaces at all, only check the dedicated IPs in + // profiles for validity. + // + // TODO(a.garipov): Do not load profiles on such installations at all, as + // they don't really need them. See AGDNS-1888. + if allSingleIP { + log.Info("warning: all bind ifaces are single-ip; only checking validity of dedicated ips") + + return netutil.SubnetSetFunc(netip.Addr.IsValid) + } + + return netutil.SliceSubnetSet(serverPrefixes) +} + // Backend API URL schemes. const ( schemeGRPC = "grpc" @@ -189,11 +229,13 @@ const ( // provided API URL. func setupProfStorage( apiURL *url.URL, + bindSet netutil.SubnetSet, errColl errcoll.Interface, ) (s profiledb.Storage, err error) { scheme := apiURL.Scheme if scheme == schemeGRPC || scheme == schemeGRPCS { return backendpb.NewProfileStorage(&backendpb.ProfileStorageConfig{ + BindSet: bindSet, Endpoint: apiURL, ErrColl: errColl, }) diff --git a/internal/cmd/cmd.go b/internal/cmd/cmd.go index 059e398..405a533 100644 --- a/internal/cmd/cmd.go +++ b/internal/cmd/cmd.go @@ -24,6 +24,9 @@ import ( "github.com/AdguardTeam/AdGuardDNS/internal/metrics" "github.com/AdguardTeam/AdGuardDNS/internal/websvc" "github.com/AdguardTeam/golibs/log" + "github.com/AdguardTeam/golibs/logutil/slogutil" + "github.com/AdguardTeam/golibs/netutil" + "github.com/AdguardTeam/golibs/service" "github.com/AdguardTeam/golibs/timeutil" ) @@ -41,7 +44,8 @@ func Main() { envs, err := readEnvs() check(err) - envs.configureLogs() + // TODO(a.garipov): Use slog everywhere. + slogLogger := envs.configureLogs() // Signal service startup now that we have the logs set up. log.Info("main: starting adguard dns") @@ -70,7 +74,9 @@ func Main() { // Signal handler - sigHdlr := newSignalHandler() + sigHdlr := service.NewSignalHandler(&service.SignalHandlerConfig{ + Logger: slogLogger.With(slogutil.KeyPrefix, service.SignalHandlerPrefix), + }) // GeoIP database @@ -160,7 +166,7 @@ func Main() { accessGlobal, err := access.NewGlobal( c.Access.BlockedQuestionDomains, - c.Access.BlockedClientSubnets, + netutil.UnembedPrefixes(c.Access.BlockedClientSubnets), ) check(err) @@ -180,12 +186,14 @@ func Main() { srvGrps, err := c.ServerGroups.toInternal(messages, btdMgr, fltGroups, c.RateLimit, c.DNS) check(err) + ctx := context.Background() + // Start the bind-to-device manager here, now that no further calls to // btdMgr.ListenConfig are required. - err = btdMgr.Start(context.Background()) + err = btdMgr.Start(ctx) check(err) - sigHdlr.add(btdMgr) + sigHdlr.Add(btdMgr) // TLS keys logging @@ -202,7 +210,7 @@ func Main() { // Profiles database and billing statistics - profDB, billStatRec, err := setupBackend(c.Backend, envs, sigHdlr, errColl) + profDB, billStatRec, err := setupBackend(c.Backend, srvGrps, envs, sigHdlr, errColl) check(err) // DNS checker @@ -230,7 +238,7 @@ func Main() { // Wait for long-running GeoIP initialization. check(<-geoIPErrCh) - sigHdlr.add(geoIPRefr) + sigHdlr.Add(geoIPRefr) // Web service @@ -240,9 +248,9 @@ func Main() { webSvc := websvc.New(webConf) // The web service is considered critical, so its Start method panics // instead of returning an error. - _ = webSvc.Start(context.Background()) + _ = webSvc.Start(ctx) - sigHdlr.add(webSvc) + sigHdlr.Add(webSvc) // DNS service @@ -284,6 +292,7 @@ func Main() { CacheMinTTL: c.Cache.TTLOverride.Min.Duration, UseCacheTTLOverride: c.Cache.TTLOverride.Enabled, UseECSCache: c.Cache.Type == cacheTypeECS, + ProfileDBEnabled: bool(envs.ProfilesEnabled), ResearchMetrics: bool(envs.ResearchMetrics), ResearchLogs: bool(envs.ResearchLogs), } @@ -297,16 +306,16 @@ func Main() { check(err) upstreamHealthcheckUpd := newUpstreamHealthcheck(handler, c.Upstream, errColl) - err = upstreamHealthcheckUpd.Start(context.Background()) + err = upstreamHealthcheckUpd.Start(ctx) check(err) - sigHdlr.add(upstreamHealthcheckUpd) + sigHdlr.Add(upstreamHealthcheckUpd) // The DNS service is considered critical, so its Start method panics // instead of returning an error. - _ = dnsSvc.Start(context.Background()) + _ = dnsSvc.Start(ctx) - sigHdlr.add(dnsSvc) + sigHdlr.Add(dnsSvc) // Debug HTTP-service @@ -314,9 +323,9 @@ func Main() { // The debug HTTP service is considered critical, so its Start method panics // instead of returning an error. - _ = debugSvc.Start(context.Background()) + _ = debugSvc.Start(ctx) - sigHdlr.add(debugSvc) + sigHdlr.Add(debugSvc) // Signal that the server is started. metrics.SetUpGauge( @@ -327,7 +336,7 @@ func Main() { runtime.Version(), ) - os.Exit(sigHdlr.handle()) + os.Exit(sigHdlr.Handle(ctx)) } // collectPanics reports all panics in Main. It should be called in a defer. diff --git a/internal/cmd/env.go b/internal/cmd/env.go index c677df4..070e462 100644 --- a/internal/cmd/env.go +++ b/internal/cmd/env.go @@ -3,6 +3,7 @@ package cmd import ( "context" "fmt" + "log/slog" "net" "net/http" "os" @@ -16,8 +17,10 @@ import ( "github.com/AdguardTeam/AdGuardDNS/internal/geoip" "github.com/AdguardTeam/AdGuardDNS/internal/rulestat" "github.com/AdguardTeam/golibs/log" + "github.com/AdguardTeam/golibs/logutil/slogutil" "github.com/AdguardTeam/golibs/netutil" "github.com/AdguardTeam/golibs/netutil/urlutil" + "github.com/AdguardTeam/golibs/service" "github.com/caarlos0/env/v7" "github.com/getsentry/sentry-go" ) @@ -56,6 +59,7 @@ type environments struct { LogTimestamp strictBool `env:"LOG_TIMESTAMP" envDefault:"1"` LogVerbose strictBool `env:"VERBOSE" envDefault:"0"` + ProfilesEnabled strictBool `env:"PROFILES_ENABLED" envDefault:"1"` ResearchMetrics strictBool `env:"RESEARCH_METRICS" envDefault:"0"` ResearchLogs strictBool `env:"RESEARCH_LOGS" envDefault:"0"` } @@ -71,8 +75,9 @@ func readEnvs() (envs *environments, err error) { return envs, nil } -// configureLogs sets the configuration for the plain text logs. -func (envs *environments) configureLogs() { +// configureLogs sets the configuration for the plain text logs. It also +// returns a [slog.Logger] for code that uses it. +func (envs *environments) configureLogs() (slogLogger *slog.Logger) { var flags int if envs.LogTimestamp { flags = log.LstdFlags | log.Lmicroseconds @@ -83,6 +88,13 @@ func (envs *environments) configureLogs() { if envs.LogVerbose { log.SetLevel(log.DEBUG) } + + return slogutil.New(&slogutil.Config{ + Output: os.Stdout, + Format: slogutil.FormatAdGuardLegacy, + AddTimestamp: bool(envs.LogTimestamp), + Verbose: bool(envs.LogVerbose), + }) } // buildErrColl builds and returns an error collector from environment. @@ -158,7 +170,7 @@ func (envs *environments) debugConf(dnsDB dnsdb.Interface) (conf *debugsvc.Confi // buildRuleStat returns a filtering rule statistics collector from environment and // registers its refresher in sigHdlr, if necessary. func (envs *environments) buildRuleStat( - sigHdlr signalHandler, + sigHdlr *service.SignalHandler, errColl errcoll.Interface, ) (r rulestat.Interface, err error) { if envs.RuleStatURL == nil { @@ -187,7 +199,7 @@ func (envs *environments) buildRuleStat( return nil, fmt.Errorf("starting rulestat refresher: %w", err) } - sigHdlr.add(refr) + sigHdlr.Add(refr) return httpRuleStat, nil } diff --git a/internal/cmd/filter.go b/internal/cmd/filter.go index f734813..074754f 100644 --- a/internal/cmd/filter.go +++ b/internal/cmd/filter.go @@ -12,6 +12,7 @@ import ( "github.com/AdguardTeam/AdGuardDNS/internal/filter" "github.com/AdguardTeam/AdGuardDNS/internal/filter/hashprefix" "github.com/AdguardTeam/golibs/netutil" + "github.com/AdguardTeam/golibs/service" "github.com/AdguardTeam/golibs/timeutil" "github.com/c2h5oh/datasize" ) @@ -136,7 +137,7 @@ func (c *fltRuleListCache) validate() (err error) { // registers its refresher in the signal handler. func setupFilterStorage( conf *filter.DefaultStorageConfig, - sigHdlr signalHandler, + sigHdlr *service.SignalHandler, errColl errcoll.Interface, refreshTimeout time.Duration, ) (strg *filter.DefaultStorage, err error) { @@ -162,7 +163,7 @@ func setupFilterStorage( return nil, fmt.Errorf("starting default filter storage update: %w", err) } - sigHdlr.add(refr) + sigHdlr.Add(refr) return strg, nil } diff --git a/internal/cmd/ifacelistener.go b/internal/cmd/ifacelistener.go index acbe33c..8a530ba 100644 --- a/internal/cmd/ifacelistener.go +++ b/internal/cmd/ifacelistener.go @@ -41,7 +41,6 @@ func (c *interfaceListenersConfig) toInternal( return errors.Annotate(m.Add(id, l.Interface, l.Port, ctrlConf), "adding listener %q: %w", id) }, ) - if err != nil { return nil, err } diff --git a/internal/cmd/ratelimit.go b/internal/cmd/ratelimit.go index 7d91f29..5fa8089 100644 --- a/internal/cmd/ratelimit.go +++ b/internal/cmd/ratelimit.go @@ -5,7 +5,6 @@ import ( "fmt" "net/url" - "github.com/AdguardTeam/AdGuardDNS/internal/agdnet" "github.com/AdguardTeam/AdGuardDNS/internal/agdservice" "github.com/AdguardTeam/AdGuardDNS/internal/connlimiter" "github.com/AdguardTeam/AdGuardDNS/internal/consul" @@ -13,6 +12,8 @@ import ( "github.com/AdguardTeam/AdGuardDNS/internal/errcoll" "github.com/AdguardTeam/AdGuardDNS/internal/metrics" "github.com/AdguardTeam/golibs/errors" + "github.com/AdguardTeam/golibs/netutil" + "github.com/AdguardTeam/golibs/service" "github.com/AdguardTeam/golibs/timeutil" "github.com/c2h5oh/datasize" ) @@ -64,7 +65,7 @@ type rateLimitConfig struct { // allowListConfig is the consul allow list configuration. type allowListConfig struct { // List contains IPs and CIDRs. - List []string `yaml:"list"` + List []netutil.Prefix `yaml:"list"` // RefreshIvl time between two updates of allow list from the Consul URL. RefreshIvl timeutil.Duration `yaml:"refresh_interval"` @@ -138,14 +139,10 @@ func (c *rateLimitConfig) validate() (err error) { func setupRateLimiter( conf *rateLimitConfig, consulAllowlist *url.URL, - sigHdlr signalHandler, + sigHdlr *service.SignalHandler, errColl errcoll.Interface, ) (rateLimiter *ratelimit.Backoff, connLimiter *connlimiter.Limiter, err error) { - allowSubnets, err := agdnet.ParseSubnets(conf.Allowlist.List...) - if err != nil { - return nil, nil, fmt.Errorf("parsing allowlist subnets: %w", err) - } - + allowSubnets := netutil.UnembedPrefixes(conf.Allowlist.List) allowlist := ratelimit.NewDynamicAllowlist(allowSubnets, nil) refresher, err := consul.NewAllowlistRefresher(allowlist, consulAllowlist) if err != nil { @@ -168,7 +165,7 @@ func setupRateLimiter( return nil, nil, fmt.Errorf("starting allowlist refresher: %w", err) } - sigHdlr.add(refr) + sigHdlr.Add(refr) return ratelimit.NewBackoff(conf.toInternal(allowlist)), conf.ConnectionLimit.toInternal(), nil } diff --git a/internal/cmd/safebrowsing.go b/internal/cmd/safebrowsing.go index 5aefb0c..595a79a 100644 --- a/internal/cmd/safebrowsing.go +++ b/internal/cmd/safebrowsing.go @@ -14,6 +14,7 @@ import ( "github.com/AdguardTeam/golibs/errors" "github.com/AdguardTeam/golibs/netutil" "github.com/AdguardTeam/golibs/netutil/urlutil" + "github.com/AdguardTeam/golibs/service" "github.com/AdguardTeam/golibs/timeutil" ) @@ -99,7 +100,7 @@ func setupHashPrefixFilter( url *urlutil.URL, cachePath string, maxSize uint64, - sigHdlr signalHandler, + sigHdlr *service.SignalHandler, errColl errcoll.Interface, ) (strg *hashprefix.Storage, flt *hashprefix.Filter, err error) { fltConf, err := conf.toInternal(errColl, resolver, cloner, id, url, cachePath, maxSize) @@ -127,7 +128,7 @@ func setupHashPrefixFilter( return nil, nil, fmt.Errorf("starting refresher for hash prefix filter %s: %w", id, err) } - sigHdlr.add(refr) + sigHdlr.Add(refr) return fltConf.Hashes, flt, nil } diff --git a/internal/cmd/servergroup.go b/internal/cmd/servergroup.go index 4920d92..33b1db1 100644 --- a/internal/cmd/servergroup.go +++ b/internal/cmd/servergroup.go @@ -2,11 +2,13 @@ package cmd import ( "fmt" + "net/netip" "github.com/AdguardTeam/AdGuardDNS/internal/agd" "github.com/AdguardTeam/AdGuardDNS/internal/bindtodevice" "github.com/AdguardTeam/AdGuardDNS/internal/dnsmsg" "github.com/AdguardTeam/golibs/errors" + "github.com/AdguardTeam/golibs/netutil" "github.com/AdguardTeam/golibs/stringutil" ) @@ -39,10 +41,11 @@ func (srvGrps serverGroups) toInternal( } svcSrvGrps[i] = &agd.ServerGroup{ - TLS: tlsConf, - DDR: g.DDR.toInternal(messages), - Name: agd.ServerGroupName(g.Name), - FilteringGroup: fltGrpID, + BlockPageRedirect: g.BlockPageRedirect.toInternal(), + DDR: g.DDR.toInternal(messages), + TLS: tlsConf, + Name: agd.ServerGroupName(g.Name), + FilteringGroup: fltGrpID, } svcSrvGrps[i].Servers, err = g.Servers.toInternal(tlsConf, btdMgr, ratelimitConf, dnsConf) @@ -83,13 +86,16 @@ func (srvGrps serverGroups) validate() (err error) { // TODO(a.garipov): Think about more consistent naming, since this object is a // configuration, but it also stores other configurations. type serverGroup struct { - // TLS are the TLS settings for this server, if any. - TLS *tlsConfig `yaml:"tls"` + // BlockPageRedirect is the configuration for the server group's block page. + BlockPageRedirect *serverGroupBlockPageConfig `yaml:"block_page_redirect"` // DDR is the Discovery Of Designated Resolvers (DDR) configuration for this // server group. DDR *ddrConfig `yaml:"ddr"` + // TLS are the TLS settings for this server, if any. + TLS *tlsConfig `yaml:"tls"` + // Name is the unique name of the server group. Name string `yaml:"name"` @@ -111,6 +117,11 @@ func (g *serverGroup) validate() (err error) { return errors.Error("no filtering_group") } + err = g.BlockPageRedirect.validate() + if err != nil { + return fmt.Errorf("block_page_redirect: %w", err) + } + err = g.DDR.validate() if err != nil { return fmt.Errorf("ddr: %w", err) @@ -128,3 +139,255 @@ func (g *serverGroup) validate() (err error) { return nil } + +// serverGroupBlockPageConfig is the configuration for a [serverGroup]'s block +// page. See [agd.BlockPageRedirect] and the related types for more +// documentation and contracts. +type serverGroupBlockPageConfig struct { + // Apply defines request parameters based on which the block page is always + // shown. + Apply *serverGroupBlockPageApplyConfig `yaml:"apply"` + + // Skip defines request parameters based on which the block page is never + // shown, regardless of the probability. + Skip *serverGroupBlockPageSkipConfig `yaml:"skip"` + + // IPv4 are the IPv4 records of the block page, used to respond to A + // queries. + IPv4 []*serverGroupBlockPageRecord `yaml:"ipv4"` + + // IPv6 are the IPv6 records of the block page, used to respond to AAAA + // queries. + IPv6 []*serverGroupBlockPageRecord `yaml:"ipv6"` + + // Probability defines the probability of responding with the block page IPs + // based on remote address. + Probability float64 `yaml:"probability"` + + // Enabled defines whether the block-page feature is enabled. + Enabled bool `yaml:"enabled"` +} + +// toInternal returns the block-page redirect configuration for a server group. +// c is assumed to be valid. +func (c *serverGroupBlockPageConfig) toInternal() (conf *agd.BlockPageRedirect) { + if !c.Enabled { + return &agd.BlockPageRedirect{} + } + + var ipv4 []netip.Addr + for _, r := range c.IPv4 { + ipv4 = append(ipv4, r.Address) + } + + var ipv6 []netip.Addr + for _, r := range c.IPv6 { + ipv6 = append(ipv6, r.Address) + } + + return &agd.BlockPageRedirect{ + Apply: c.Apply.toInternal(), + Skip: c.Skip.toInternal(), + IPv4: ipv4, + IPv6: ipv6, + Probability: agd.MustNewProbability(c.Probability), + Enabled: c.Enabled, + } +} + +// validate returns an error if the block-page redirect configuration is +// invalid. +func (c *serverGroupBlockPageConfig) validate() (err error) { + switch { + case c == nil: + return errNilConfig + case !c.Enabled: + return nil + case len(c.IPv4) == 0 && len(c.IPv6) == 0: + return errors.Error("ipv4, ipv6, or both must be set") + } + + _, err = agd.NewProbability(c.Probability) + if err != nil { + return fmt.Errorf("probability: %w", err) + } + + err = c.validateAddrs() + if err != nil { + // Don't wrap the error, because it's informative enough as is. + return err + } + + err = c.Apply.validate() + if err != nil { + return fmt.Errorf("apply: %w", err) + } + + err = c.Skip.validate() + if err != nil { + return fmt.Errorf("skip: %w", err) + } + + return nil +} + +// validateAddrs returns an error if the block-page redirect if the IP addresses +// in the block-page redirect configuration are invalid. +func (c *serverGroupBlockPageConfig) validateAddrs() (err error) { + for i, r := range c.IPv4 { + err = r.validate() + if err != nil { + return fmt.Errorf("ipv4: at index %d: address: %w", i, err) + } else if !r.Address.Is4() { + return fmt.Errorf("ipv4: at index %d: address: not ipv4: %v", i, r.Address) + } + } + + for i, r := range c.IPv6 { + err = r.validate() + if err != nil { + return fmt.Errorf("ipv6: at index %d: %w", i, err) + } else if !r.Address.Is6() { + return fmt.Errorf("ipv6: at index %d: address: not ipv6: %v", i, r.Address) + } + } + + return nil +} + +// serverGroupBlockPageRecord is a structure for defining answer records in +// [serverGroupBlockPageConfig]. +type serverGroupBlockPageRecord struct { + Address netip.Addr `yaml:"address"` +} + +// validate returns an error if the record configuration is invalid. +func (c *serverGroupBlockPageRecord) validate() (err error) { + switch { + case c == nil: + return errNilConfig + case !c.Address.IsValid(): + return errors.Error("invalid addr") + default: + return nil + } +} + +// serverGroupBlockPageApplyConfig defines the conditions for applying the +// block-page logic for a particular request. +type serverGroupBlockPageApplyConfig struct { + // Client are the parameters for clients for which block page is always + // enabled. + Client []*serverGroupBlockPageClientConfig `yaml:"client"` +} + +// toInternal returns the block-page redirect applying configuration for a +// server group. c is assumed to be valid. +func (c *serverGroupBlockPageApplyConfig) toInternal() (conf *agd.BlockPageRedirectApply) { + var subnets []netip.Prefix + for _, cli := range c.Client { + subnets = append(subnets, cli.Address.Prefix) + } + + return &agd.BlockPageRedirectApply{ + ClientSubnets: subnets, + } +} + +// validate returns an error if the block-page redirect applying configuration +// is invalid. +func (c *serverGroupBlockPageApplyConfig) validate() (err error) { + if c == nil { + return errNilConfig + } + + for i, cli := range c.Client { + err = cli.validate() + if err != nil { + return fmt.Errorf("client: at index %d: %w", i, err) + } + } + + return nil +} + +// serverGroupBlockPageClientConfig is a common structure for defining clients +// in [serverGroupBlockPageSkipConfig] and [serverGroupBlockPageApplyConfig]. +type serverGroupBlockPageClientConfig struct { + Address netutil.Prefix `yaml:"address"` +} + +// validate returns an error if the client configuration is invalid. +func (c *serverGroupBlockPageClientConfig) validate() (err error) { + switch { + case c == nil: + return errNilConfig + case !c.Address.IsValid(): + return errors.Error("invalid addr") + default: + return nil + } +} + +// serverGroupBlockPageSkipConfig defines the conditions for skipping the block +// page logic for a particular request. +type serverGroupBlockPageSkipConfig struct { + // Client are the parameters for clients for which block page is always + // disabled. + Client []*serverGroupBlockPageClientConfig `yaml:"client"` + + // QuestionDomains are the parameters for request questions for which block + // page is always disabled. + Question []*serverGroupBlockPageQuestionConfig `yaml:"question"` +} + +// toInternal returns the block-page redirect skipping configuration for a +// server group. c is assumed to be valid. +func (c *serverGroupBlockPageSkipConfig) toInternal() (conf *agd.BlockPageRedirectSkip) { + var subnets []netip.Prefix + for _, cli := range c.Client { + subnets = append(subnets, cli.Address.Prefix) + } + + var domains []string + for _, q := range c.Question { + domains = append(domains, q.Domain) + } + + return &agd.BlockPageRedirectSkip{ + ClientSubnets: subnets, + QuestionDomains: domains, + } +} + +// validate returns an error if the block-page redirect skipping configuration +// is invalid. +func (c *serverGroupBlockPageSkipConfig) validate() (err error) { + if c == nil { + return errNilConfig + } + + for i, cli := range c.Client { + err = cli.validate() + if err != nil { + return fmt.Errorf("client: at index %d: %w", i, err) + } + } + + for i, q := range c.Question { + switch { + case q == nil: + return fmt.Errorf("question: at index %d: %w", i, errNilConfig) + case q.Domain == "": + return fmt.Errorf("question: at index %d: %w", i, errors.Error("empty domain")) + } + } + + return nil +} + +// serverGroupBlockPageQuestionConfig is a structure for defining question +// domains in [serverGroupBlockPageRedirectSkip]. +type serverGroupBlockPageQuestionConfig struct { + Domain string `yaml:"domain"` +} diff --git a/internal/cmd/signal.go b/internal/cmd/signal.go deleted file mode 100644 index eaa79df..0000000 --- a/internal/cmd/signal.go +++ /dev/null @@ -1,85 +0,0 @@ -package cmd - -import ( - "context" - "os" - "os/signal" - "time" - - "github.com/AdguardTeam/AdGuardDNS/internal/agdservice" - "github.com/AdguardTeam/golibs/log" - "golang.org/x/sys/unix" -) - -// signalHandler processes incoming signals and shuts services down. -type signalHandler struct { - signal chan os.Signal - - // services are the services that are shut down before application - // exiting. - services []agdservice.Interface -} - -// newSignalHandler returns a new signalHandler that shuts down services. -func newSignalHandler() (h signalHandler) { - h = signalHandler{ - signal: make(chan os.Signal, 1), - } - - signal.Notify(h.signal, unix.SIGINT, unix.SIGQUIT, unix.SIGTERM) - - return h -} - -// add adds a service to the signal handler. -func (h *signalHandler) add(s agdservice.Interface) { - h.services = append(h.services, s) -} - -// Exit status constants. -const ( - statusSuccess = 0 - statusError = 1 -) - -// handle processes OS signals. status is statusSuccess on success and -// statusError on error. -func (h *signalHandler) handle() (status int) { - defer log.OnPanic("signalHandler.handle") - - for sig := range h.signal { - log.Info("sighdlr: received signal %q", sig) - - switch sig { - case - unix.SIGINT, - unix.SIGQUIT, - unix.SIGTERM: - return h.shutdown() - } - } - - // Shouldn't happen, since h.signal is currently never closed. - return statusError -} - -// shutdown gracefully shuts down all services. status is statusSuccess on -// success and statusError on error. -func (h *signalHandler) shutdown() (status int) { - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - - log.Info("sighdlr: shutting down services") - for i := len(h.services) - 1; i >= 0; i-- { - s := h.services[i] - err := s.Shutdown(ctx) - if err != nil { - log.Error("sighdlr: shutting down service at index %d: %s", i, err) - status = statusError - } - } - - log.Info("sighdlr: shutting down adguard dns") - - return status -} diff --git a/internal/cmd/tls.go b/internal/cmd/tls.go index 1bc88be..dd50b16 100644 --- a/internal/cmd/tls.go +++ b/internal/cmd/tls.go @@ -16,6 +16,7 @@ import ( "github.com/AdguardTeam/AdGuardDNS/internal/errcoll" "github.com/AdguardTeam/AdGuardDNS/internal/metrics" "github.com/AdguardTeam/golibs/errors" + "github.com/AdguardTeam/golibs/service" "github.com/AdguardTeam/golibs/stringutil" "github.com/prometheus/client_golang/prometheus" ) @@ -300,7 +301,7 @@ func enableTLSKeyLogging(grps []*agd.ServerGroup, keyLogFileName string) (err er // registers its refresher in the signal handler. func setupTicketRotator( srvGrps []*agd.ServerGroup, - sigHdlr signalHandler, + sigHdlr *service.SignalHandler, errColl errcoll.Interface, ) (err error) { tickRot, err := newTicketRotator(srvGrps) @@ -324,7 +325,7 @@ func setupTicketRotator( return fmt.Errorf("starting ticket rotator refresh: %w", err) } - sigHdlr.add(refr) + sigHdlr.Add(refr) return nil } diff --git a/internal/cmd/upstream.go b/internal/cmd/upstream.go index 24eae49..3372e2c 100644 --- a/internal/cmd/upstream.go +++ b/internal/cmd/upstream.go @@ -13,11 +13,10 @@ import ( "github.com/AdguardTeam/AdGuardDNS/internal/dnsserver/prometheus" "github.com/AdguardTeam/AdGuardDNS/internal/errcoll" "github.com/AdguardTeam/golibs/errors" + "github.com/AdguardTeam/golibs/service" "github.com/AdguardTeam/golibs/timeutil" ) -// DNS upstream configuration - // upstreamConfig is the upstream module configuration. type upstreamConfig struct { // Healthcheck contains the upstream healthcheck configuration. @@ -160,9 +159,9 @@ func newUpstreamHealthcheck( handler *forward.Handler, conf *upstreamConfig, errColl errcoll.Interface, -) (refr agdservice.Interface) { +) (refr service.Interface) { if !conf.Healthcheck.Enabled { - return agdservice.Empty{} + return service.Empty{} } return agdservice.NewRefreshWorker(&agdservice.RefreshWorkerConfig{ diff --git a/internal/debugsvc/debugsvc.go b/internal/debugsvc/debugsvc.go index ee2f935..dcee854 100644 --- a/internal/debugsvc/debugsvc.go +++ b/internal/debugsvc/debugsvc.go @@ -7,10 +7,10 @@ import ( "io" "net/http" - "github.com/AdguardTeam/AdGuardDNS/internal/agdservice" "github.com/AdguardTeam/golibs/errors" "github.com/AdguardTeam/golibs/log" "github.com/AdguardTeam/golibs/pprofutil" + "github.com/AdguardTeam/golibs/service" "github.com/prometheus/client_golang/prometheus/promhttp" ) @@ -69,11 +69,15 @@ func startServer(s *server) { } // type check -var _ agdservice.Interface = (*Service)(nil) +var _ service.Interface = (*Service)(nil) -// Start implements the [agdservice.Interface] interface for *Service. It -// starts serving all endpoints. err is always nil, if any endpoint fails to -// start, it panics. +// Start implements the [service.Interface] interface for *Service. It starts +// serving all endpoints but does not wait for them to actually go online. err +// is always nil, if any endpoint fails to start, it panics. +// +// TODO(a.garipov): Wait for the services to go online. +// +// TODO(a.garipov): Use the context for cancelation. func (svc *Service) Start(_ context.Context) (err error) { for _, srv := range svc.servers { go startServer(srv) @@ -82,8 +86,8 @@ func (svc *Service) Start(_ context.Context) (err error) { return nil } -// Shutdown implements the [agdservice.Interface] interface for *Service. It -// stops serving all endpoints. +// Shutdown implements the [service.Interface] interface for *Service. It stops +// serving all endpoints. func (svc *Service) Shutdown(ctx context.Context) (err error) { srvNum := 0 for _, srv := range svc.servers { diff --git a/internal/dnscheck/consulkv.go b/internal/dnscheck/consulkv.go index de55bb2..002c016 100644 --- a/internal/dnscheck/consulkv.go +++ b/internal/dnscheck/consulkv.go @@ -76,6 +76,15 @@ func (kv *httpKV) get(ctx context.Context, key string) (inf *info, err error) { } defer func() { err = errors.WithDeferred(err, httpResp.Body.Close()) }() + // Note that, if no key exists at the given path, a 404 is returned instead + // of a normal 200 response. + // + // See https://developer.hashicorp.com/consul/api-docs/kv#read-key. + err = agdhttp.CheckStatus(httpResp, http.StatusOK) + if err != nil { + return nil, fmt.Errorf("response for key %q: %w", key, err) + } + var resp []*consulKVResponse err = json.NewDecoder(httpResp.Body).Decode(&resp) if err != nil { @@ -153,6 +162,14 @@ func (kv *httpKV) set(ctx context.Context, key string, inf *info) (err error) { } defer func() { err = errors.WithDeferred(err, sessHTTPResp.Body.Close()) }() + // Status 200 is expected. + // + // See https://developer.hashicorp.com/consul/api-docs/session. + err = agdhttp.CheckStatus(sessHTTPResp, http.StatusOK) + if err != nil { + return fmt.Errorf("getting session for key %q: %w", key, err) + } + sessResp := &consulSessionResponse{} err = json.NewDecoder(sessHTTPResp.Body).Decode(sessResp) if err != nil { @@ -176,6 +193,14 @@ func (kv *httpKV) set(ctx context.Context, key string, inf *info) (err error) { } defer func() { err = errors.WithDeferred(err, resp.Body.Close()) }() + // Status 200 is expected. + // + // See https://github.com/hashicorp/consul/blob/main/api/kv.go#L224. + err = agdhttp.CheckStatus(resp, http.StatusOK) + if err != nil { + return fmt.Errorf("setting key %q: %w", key, err) + } + return nil } diff --git a/internal/dnscheck/httpkv_test.go b/internal/dnscheck/httpkv_test.go index 34ed17c..591b217 100644 --- a/internal/dnscheck/httpkv_test.go +++ b/internal/dnscheck/httpkv_test.go @@ -209,7 +209,75 @@ func TestHTTPKV(t *testing.T) { dnsCk.ServeHTTP(rw, r) assert.Equal(t, http.StatusInternalServerError, rw.Code) - + assert.Equal(t, wantResp, rw.Body.String()) + }) +} + +// newKVErrorServer returns URLs emulating behavior of Consul KV database +// server returning HTTP errors. +func newKVErrorServer(t *testing.T) (kv, sess *url.URL) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusInternalServerError) + })) + t.Cleanup(srv.Close) + + u, err := url.Parse(srv.URL) + require.NoError(t, err) + + return u.JoinPath(kvPath), u.JoinPath(sessPath) +} + +func TestHTTPKV_status_error(t *testing.T) { + const ( + randomid = "randomid" + localDomain = "example.local" + ) + + conf := &dnscheck.ConsulConfig{ + Messages: &dnsmsg.Constructor{}, + ErrColl: &agdtest.ErrorCollector{ + OnCollect: func(_ context.Context, _ error) {}, + }, + Domains: []string{localDomain}, + NodeLocation: "some-node-location", + NodeName: "some-node-name", + TTL: 1 * time.Minute, + } + + conf.ConsulKVURL, conf.ConsulSessionURL = newKVErrorServer(t) + dnsCk, err := dnscheck.NewConsul(conf) + require.NoError(t, err) + + req := dnsservertest.CreateMessage(randomid+"-"+localDomain, dns.TypeA) + ri := &agd.RequestInfo{ + Device: &agd.Device{ID: "some-device-id"}, + Profile: &agd.Profile{ID: "some-profile-id"}, + ServerGroup: "some-server-group-name", + Server: "some-server-name", + Host: randomid + "-" + localDomain, + RemoteIP: testRemoteIP, + QType: dns.TypeA, + Proto: agd.ProtoDNS, + } + + _, err = dnsCk.Check(context.Background(), req, ri) + require.NoError(t, err) + + dnscheck.FlushConsulCache(t, dnsCk) + + t.Run("fail", func(t *testing.T) { + const wantResp = `getting from consul: response for key "randomid": server "": ` + + `status code error: expected 200, got 500` + "\n" + + r := httptest.NewRequest(http.MethodGet, (&url.URL{ + Scheme: "http", + Host: randomid + "-" + localDomain, + Path: "/dnscheck/test", + }).String(), strings.NewReader("")) + rw := httptest.NewRecorder() + + dnsCk.ServeHTTP(rw, r) + assert.Equal(t, http.StatusInternalServerError, rw.Code) assert.Equal(t, wantResp, rw.Body.String()) }) } diff --git a/internal/dnsmsg/constructor.go b/internal/dnsmsg/constructor.go index cbc75ce..92b9f81 100644 --- a/internal/dnsmsg/constructor.go +++ b/internal/dnsmsg/constructor.go @@ -200,6 +200,7 @@ func (c *Constructor) AppendDebugExtra(req, resp *dns.Msg, str string) (err erro // positive numbers, but we need a ceiling operation here. strNum := (strLen + MaxTXTStringLen - 1) / MaxTXTStringLen + // TODO(a.garipov): Use slices.Chunk in Go 1.23. newStr := make([]string, strNum) for i := 0; i < strNum; i++ { start := i * MaxTXTStringLen diff --git a/internal/dnsserver/dnsserver_test.go b/internal/dnsserver/dnsserver_test.go index 99698d2..8fd0d68 100644 --- a/internal/dnsserver/dnsserver_test.go +++ b/internal/dnsserver/dnsserver_test.go @@ -1,11 +1,30 @@ package dnsserver_test import ( + "context" "testing" + "time" + "github.com/AdguardTeam/AdGuardDNS/internal/dnsserver" "github.com/AdguardTeam/golibs/testutil" ) func TestMain(m *testing.M) { testutil.DiscardLogOutput(m) } + +// testTimeout is a common timeout for tests. +const testTimeout = dnsserver.DefaultReadTimeout + +// contextWithTimeout is a helper that creates a new context with timeout and +// registers ctx's cleanup with t.Cleanup. +// +// TODO(a.garipov): Move to golibs and DRY. +func contextWithTimeout(tb testing.TB, timeout time.Duration) (ctx context.Context) { + tb.Helper() + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + tb.Cleanup(cancel) + + return ctx +} diff --git a/internal/dnsserver/dnsservertest/server.go b/internal/dnsserver/dnsservertest/server.go index 1d3d34e..36b07b7 100644 --- a/internal/dnsserver/dnsservertest/server.go +++ b/internal/dnsserver/dnsservertest/server.go @@ -189,12 +189,12 @@ func RunLocalQUICServer( tlsConfig *tls.Config, ) (s *dnsserver.ServerQUIC, addr *net.UDPAddr, err error) { conf := dnsserver.ConfigQUIC{ + TLSConfig: tlsConfig, ConfigBase: dnsserver.ConfigBase{ Name: "test", Addr: "127.0.0.1:0", Handler: h, }, - TLSConfig: tlsConfig, } s = dnsserver.NewServerQUIC(conf) @@ -209,7 +209,7 @@ func RunLocalQUICServer( addr, ok := s.LocalUDPAddr().(*net.UDPAddr) if !ok { - return nil, nil, fmt.Errorf("invalid listen addr: %s", addr) + return nil, nil, fmt.Errorf("invalid listen addr: %T(%[1]v)", s.LocalUDPAddr()) } return s, addr, nil diff --git a/internal/dnsserver/go.mod b/internal/dnsserver/go.mod index 8b529f7..5cbeb78 100644 --- a/internal/dnsserver/go.mod +++ b/internal/dnsserver/go.mod @@ -1,21 +1,21 @@ module github.com/AdguardTeam/AdGuardDNS/internal/dnsserver -go 1.21.5 +go 1.21.8 require ( - github.com/AdguardTeam/golibs v0.18.1 + github.com/AdguardTeam/golibs v0.20.1 github.com/ameshkov/dnscrypt/v2 v2.2.7 github.com/ameshkov/dnsstamps v1.0.3 github.com/bluele/gcache v0.0.2 - github.com/miekg/dns v1.1.56 - github.com/panjf2000/ants/v2 v2.8.2 + github.com/miekg/dns v1.1.58 + github.com/panjf2000/ants/v2 v2.9.0 github.com/patrickmn/go-cache v2.1.1-0.20191004192108-46f407853014+incompatible - github.com/prometheus/client_golang v1.17.0 - github.com/quic-go/quic-go v0.39.0 + github.com/prometheus/client_golang v1.18.0 + github.com/quic-go/quic-go v0.41.0 github.com/stretchr/testify v1.8.4 - golang.org/x/exp v0.0.0-20231006140011-7918f672742d - golang.org/x/net v0.17.0 - golang.org/x/sys v0.13.0 + golang.org/x/exp v0.0.0-20240213143201-ec583247a57a + golang.org/x/net v0.21.0 + golang.org/x/sys v0.17.0 ) require ( @@ -24,23 +24,21 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/go-logr/logr v1.4.1 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98 // indirect + github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 // indirect github.com/kr/text v0.2.0 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/onsi/ginkgo/v2 v2.13.0 // indirect + github.com/onsi/ginkgo/v2 v2.15.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.5.0 // indirect - github.com/prometheus/common v0.44.0 // indirect + github.com/prometheus/common v0.46.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/qtls-go1-20 v0.3.4 // indirect - go.uber.org/mock v0.3.0 // indirect - golang.org/x/crypto v0.14.0 // indirect - golang.org/x/mod v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/tools v0.14.0 // indirect - google.golang.org/protobuf v1.31.0 // indirect + go.uber.org/mock v0.4.0 // indirect + golang.org/x/crypto v0.19.0 // indirect + golang.org/x/mod v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/tools v0.18.0 // indirect + google.golang.org/protobuf v1.32.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/internal/dnsserver/go.sum b/internal/dnsserver/go.sum index 42abc22..6e91b7f 100644 --- a/internal/dnsserver/go.sum +++ b/internal/dnsserver/go.sum @@ -1,4 +1,5 @@ -github.com/AdguardTeam/golibs v0.18.1 h1:6u0fvrIj2qjUsRdbIGJ9AR0g5QRSWdKIo/DYl3tp5aM= +github.com/AdguardTeam/golibs v0.20.1 h1:ol8qLjWGZhU9paMMwN+OLWVTUigGsXa29iVTyd62VKY= +github.com/AdguardTeam/golibs v0.20.1/go.mod h1:bgcMgRviCKyU6mkrX+RtT/OsKPFzyppelfRsksMG3KU= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 h1:52m0LGchQBBVqJRyYYufQuIbVqRawmubW3OFGqK1ekw= @@ -17,48 +18,44 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98 h1:pUa4ghanp6q4IJHwE9RwLgmVFfReJN+KbQ8ExNEUUoQ= -github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 h1:E/LAvt58di64hlYjx7AsNS6C/ysHWYo+2qPCZKTQhRo= +github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.1.56 h1:5imZaSeoRNvpM9SzWNhEcP9QliKiz20/dA2QabIGVnE= -github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY= -github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= -github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= -github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= -github.com/panjf2000/ants/v2 v2.8.2 h1:D1wfANttg8uXhC9149gRt1PDQ+dLVFjNXkCEycMcvQQ= -github.com/panjf2000/ants/v2 v2.8.2/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I= +github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4= +github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY= +github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= +github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/panjf2000/ants/v2 v2.9.0 h1:SztCLkVxBRigbg+vt0S5QvF5vxAbxbKt09/YfAJ0tEo= +github.com/panjf2000/ants/v2 v2.9.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I= github.com/patrickmn/go-cache v2.1.1-0.20191004192108-46f407853014+incompatible h1:IWzUvJ72xMjmrjR9q3H1PF+jwdN0uNQiR2t1BLNalyo= github.com/patrickmn/go-cache v2.1.1-0.20191004192108-46f407853014+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.46.0 h1:doXzt5ybi1HBKpsZOL0sSkaNHJJqkyfEWZGGqqScV0Y= +github.com/prometheus/common v0.46.0/go.mod h1:Tp0qkxpb9Jsg54QMe+EAmqXkSV7Evdy1BTn+g2pa/hQ= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/qtls-go1-20 v0.3.4 h1:MfFAPULvst4yoMgY9QmtpYmfij/em7O8UUi+bNVm7Cg= -github.com/quic-go/qtls-go1-20 v0.3.4/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= -github.com/quic-go/quic-go v0.39.0 h1:AgP40iThFMY0bj8jGxROhw3S0FMGa8ryqsmi9tBH3So= -github.com/quic-go/quic-go v0.39.0/go.mod h1:T09QsDQWjLiQ74ZmacDfqZmhY/NLnw5BC40MANNNZ1Q= +github.com/quic-go/quic-go v0.41.0 h1:aD8MmHfgqTURWNJy48IYFg2OnxwHT3JL7ahGs73lb4k= +github.com/quic-go/quic-go v0.41.0/go.mod h1:qCkNjqczPEvgsOnxZ0eCD14lv+B2LHlFAB++CNOh9hA= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -70,31 +67,27 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -go.uber.org/mock v0.3.0 h1:3mUxI1No2/60yUYax92Pt8eNOEecx2D3lcXZh2NEZJo= -go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= -golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/exp v0.0.0-20240213143201-ec583247a57a h1:HinSgX1tJRX3KsL//Gxynpw5CTOAIPhgL4W8PNiIpVE= +golang.org/x/exp v0.0.0-20240213143201-ec583247a57a/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= +golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/internal/dnsserver/serverbase.go b/internal/dnsserver/serverbase.go index f23e09f..d3678ff 100644 --- a/internal/dnsserver/serverbase.go +++ b/internal/dnsserver/serverbase.go @@ -474,7 +474,7 @@ func (s *ServerBase) waitShutdown(ctx context.Context) (err error) { // isStarted returns true if the server is started. func (s *ServerBase) isStarted() (started bool) { s.lock.RLock() - started = s.started - s.lock.RUnlock() - return started + defer s.lock.RUnlock() + + return s.started } diff --git a/internal/dnsserver/serverbench_test.go b/internal/dnsserver/serverbench_test.go index 4d05ea5..aefe091 100644 --- a/internal/dnsserver/serverbench_test.go +++ b/internal/dnsserver/serverbench_test.go @@ -313,7 +313,7 @@ func BenchmarkServeQUIC(b *testing.B) { b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { - resp := sendQUICMessage(b, sess, req, false) + resp := requireSendQUICMessage(b, sess, req) require.NotNil(b, resp) require.True(b, resp.Response) } diff --git a/internal/dnsserver/serverdns.go b/internal/dnsserver/serverdns.go index 3734f1a..066e054 100644 --- a/internal/dnsserver/serverdns.go +++ b/internal/dnsserver/serverdns.go @@ -108,6 +108,8 @@ func NewServerDNS(conf ConfigDNS) (s *ServerDNS) { // server with a TLS layer on top of it. func newServerDNS(proto Protocol, conf ConfigDNS) (s *ServerDNS) { // Init default settings first. + // + // TODO(a.garipov): Use cmp.Or in Go 1.22. if conf.ReadTimeout == 0 { conf.ReadTimeout = DefaultReadTimeout } diff --git a/internal/dnsserver/serverhttps.go b/internal/dnsserver/serverhttps.go index 3684466..8ee3ddf 100644 --- a/internal/dnsserver/serverhttps.go +++ b/internal/dnsserver/serverhttps.go @@ -246,8 +246,16 @@ func (s *ServerHTTPS) shutdown(ctx context.Context) (err error) { s.started = false - // First step, close the active listener right away. - s.closeListeners() + // First step, close the active TCP listener right away. Don't close the + // UDP one, as if there is one, it is closed by closing the QUIC listener. + // + // TODO(a.garipov): Fix this mess. + if s.tcpListener != nil { + err = s.tcpListener.Close() + if err != nil { + log.Info("[%s]: Failed to close NetworkTCP listener: %v", s.Name(), err) + } + } // Second, shutdown the HTTP server. err = s.httpServer.Shutdown(ctx) diff --git a/internal/dnsserver/serverhttps_test.go b/internal/dnsserver/serverhttps_test.go index f258a40..f664420 100644 --- a/internal/dnsserver/serverhttps_test.go +++ b/internal/dnsserver/serverhttps_test.go @@ -597,7 +597,6 @@ func createJSONRequest( requestURL := fmt.Sprintf("%s://test.local%s?%s", proto, dnsserver.PathJSON, q.Encode()) r, err = http.NewRequest(method, requestURL, nil) - if err != nil { return nil, err } diff --git a/internal/dnsserver/serverquic.go b/internal/dnsserver/serverquic.go index 7e0d744..2af9816 100644 --- a/internal/dnsserver/serverquic.go +++ b/internal/dnsserver/serverquic.go @@ -66,11 +66,11 @@ var compatProtoDQ = []string{"doq-i00", "doq-i02", "doq-i03", "dq"} // ConfigQUIC is a struct that needs to be passed to NewServerQUIC to // initialize a new ServerQUIC instance. type ConfigQUIC struct { - ConfigBase - // TLSConfig is the TLS configuration for QUIC. TLSConfig *tls.Config + ConfigBase + // MaxStreamsPerPeer is the maximum number of concurrent streams that a peer // is allowed to open. MaxStreamsPerPeer int @@ -83,8 +83,6 @@ type ConfigQUIC struct { type ServerQUIC struct { *ServerBase - conf ConfigQUIC - // pool is a goroutine pool we use to process DNS queries. Complicated // logic may require growing the goroutine's stack and we experienced it // in AdGuard DNS. The easiest way to avoid spending extra time on this is @@ -100,6 +98,10 @@ type ServerQUIC struct { // quicListener is a listener that we use to accept DoQ connections. quicListener *quic.Listener + + // TODO(a.garipov): Remove this and only save the values a server actually + // uses. + conf ConfigQUIC } // quicBytePoolSize is the size for the QUIC byte pools. @@ -120,10 +122,10 @@ func NewServerQUIC(conf ConfigQUIC) (s *ServerQUIC) { s = &ServerQUIC{ ServerBase: newServerBase(ProtoDoQ, conf.ConfigBase), - conf: conf, pool: newPoolNonblocking(), reqPool: syncutil.NewSlicePool[byte](quicBytePoolSize), respPool: syncutil.NewSlicePool[byte](quicBytePoolSize), + conf: conf, } return s @@ -207,7 +209,6 @@ func (s *ServerQUIC) shutdown() (err error) { s.started = false // Now close all listeners - s.closeListeners() err = s.quicListener.Close() if err != nil { // Log this error but do not return it @@ -242,6 +243,12 @@ func (s *ServerQUIC) serveQUIC(ctx context.Context, l *quic.Listener) (err error // Wait until all conns are processed before exiting this method defer wg.Wait() + // Use a context that is canceled once this connection ends to mitigate + // quic-go's mishandling of contexts. See TODO in serveQUICConn. + var cancel context.CancelFunc + ctx, cancel = context.WithCancel(ctx) + defer cancel() + for s.isStarted() { err = s.acceptQUICConn(ctx, l, wg) if err != nil { @@ -251,7 +258,6 @@ func (s *ServerQUIC) serveQUIC(ctx context.Context, l *quic.Listener) (err error return err } - } return nil @@ -294,7 +300,7 @@ func (s *ServerQUIC) acceptQUICConn( } // serveQUICConnAsync wraps serveQUICConn call and handles all possible errors -// that might happen there. It also makes sure that the WaitGroup will be +// that might happen there. It also makes sure that the WaitGroup will be // decremented. func (s *ServerQUIC) serveQUICConnAsync( ctx context.Context, @@ -331,6 +337,21 @@ func (s *ServerQUIC) serveQUICConn(ctx context.Context, conn quic.Connection) (e // bidirectional stream. var stream quic.Stream acceptCtx, cancel := context.WithDeadline(ctx, time.Now().Add(maxQUICIdleTimeout)) + + // For some reason AcceptStream below seems to get stuck even when + // acceptCtx is canceled. As a mitigation, check the context manually + // right before feeding it into AcceptStream. + // + // TODO(a.garipov): Try to reproduce and report. + select { + case <-acceptCtx.Done(): + cancel() + + return fmt.Errorf("checking accept ctx: %w", acceptCtx.Err()) + default: + // Go on. + } + stream, err = conn.AcceptStream(acceptCtx) // Make sure to call the cancel function to avoid leaks. cancel() @@ -396,9 +417,7 @@ func (s *ServerQUIC) serveQUICStream( // that stream. defer log.OnCloserError(stream, log.DEBUG) - var msg *dns.Msg - var doqDraft bool - msg, doqDraft, err = s.readQUICMsg(ctx, stream) + msg, err := s.readQUICMsg(ctx, stream) if err != nil { closeQUICConn(conn, DOQCodeProtocolError) @@ -435,15 +454,7 @@ func (s *ServerQUIC) serveQUICStream( bufPtr := s.respPool.Get() defer s.respPool.Put(bufPtr) - // Depending on the DoQ version we either write a 2-bytes prefixed message - // or just write the message (for old draft versions). - var b []byte - if doqDraft { - // TODO(ameshkov): remove draft support in the late 2023. - b, err = resp.PackBuffer(*bufPtr) - } else { - b, err = packWithPrefix(resp, *bufPtr) - } + b, err := packWithPrefix(resp, *bufPtr) if err != nil { closeQUICConn(conn, DOQCodeProtocolError) @@ -464,7 +475,7 @@ func (s *ServerQUIC) serveQUICStream( func (s *ServerQUIC) readQUICMsg( ctx context.Context, stream quic.Stream, -) (m *dns.Msg, doqDraft bool, err error) { +) (m *dns.Msg, err error) { bufPtr := s.reqPool.Get() defer s.reqPool.Put(bufPtr) @@ -485,35 +496,29 @@ func (s *ServerQUIC) readQUICMsg( // received. if n < DNSHeaderSize { if err != nil { - return nil, false, fmt.Errorf("failed to read QUIC message: %w", err) + return nil, fmt.Errorf("failed to read QUIC message: %w", err) } s.metrics.OnInvalidMsg(ctx) - return nil, false, dns.ErrShortRead + return nil, dns.ErrShortRead } - // Note that we support both the old drafts and the new RFC. In the old - // draft DNS messages were not prefixed with the message length. + // TODO(a.garipov): DRY logic with the TCP one. m = &dns.Msg{} - - // We're checking if the first two bytes contain the length of the message. - // According to the spec, the DNS message ID is 0 so the first two bytes - // will be zero in the case of an old draft implementation so this check - // should be reliable. packetLen := binary.BigEndian.Uint16(buf[:2]) - if packetLen == uint16(n-2) { + wantLen := uint16(n - 2) + if packetLen == wantLen { err = m.Unpack(buf[2:]) } else { - err = m.Unpack(buf) - doqDraft = true + err = fmt.Errorf("bad buffer size %d, want %d", packetLen, wantLen) } - if err != nil { s.metrics.OnInvalidMsg(ctx) - return nil, false, err + + return nil, err } - return m, doqDraft, nil + return m, nil } // readAll reads from r until an error or io.EOF into the specified buffer buf. @@ -558,7 +563,10 @@ func (s *ServerQUIC) listenQUIC(ctx context.Context) (err error) { return err } + // Save this for s.LocalUDPAddr. Do not close it separately as ql closes + // the underlying connection. s.udpListener = conn + s.quicListener = ql return nil diff --git a/internal/dnsserver/serverquic_test.go b/internal/dnsserver/serverquic_test.go index 10e9879..834e790 100644 --- a/internal/dnsserver/serverquic_test.go +++ b/internal/dnsserver/serverquic_test.go @@ -4,6 +4,7 @@ import ( "context" "crypto/tls" "encoding/binary" + "fmt" "io" "net" "sync" @@ -30,7 +31,7 @@ func TestServerQUIC_integration_query(t *testing.T) { require.NoError(t, err) testutil.CleanupAndRequireSuccess(t, func() (err error) { - return srv.Shutdown(context.Background()) + return srv.Shutdown(contextWithTimeout(t, testTimeout)) }) // Open a QUIC connection. @@ -41,28 +42,29 @@ func TestServerQUIC_integration_query(t *testing.T) { return conn.CloseWithError(0, "") }) - // Send multiple queries to the DNS server in parallel + const queriesNum = 100 + wg := &sync.WaitGroup{} + wg.Add(queriesNum) - for i := 0; i < 100; i++ { - wg.Add(1) - - // Create a test message. + for i := 0; i < queriesNum; i++ { req := dnsservertest.NewReq("example.org.", dns.TypeA, dns.ClassINET) req.RecursionDesired = true - // Even requests are sent as if it's an old draft client. - doqDraft := i%2 == 0 go func() { defer wg.Done() - resp := sendQUICMessage(t, conn, req, doqDraft) - assert.NotNil(t, resp) + resp, reqErr := sendQUICMessage(conn, req) + // Do not use require, as this is a separate goroutine. + if !assert.NoError(t, reqErr) || !assert.NotNil(t, resp) { + return + } + assert.True(t, resp.Response) // EDNS0 padding is only present when request also has padding opt. paddingOpt := dnsservertest.FindEDNS0Option[*dns.EDNS0_PADDING](resp) - require.Nil(t, paddingOpt) + assert.Nil(t, paddingOpt) }() } @@ -78,7 +80,7 @@ func TestServerQUIC_integration_ENDS0Padding(t *testing.T) { require.NoError(t, err) testutil.CleanupAndRequireSuccess(t, func() (err error) { - return srv.Shutdown(context.Background()) + return srv.Shutdown(contextWithTimeout(t, testTimeout)) }) // Open a QUIC connection. @@ -92,7 +94,7 @@ func TestServerQUIC_integration_ENDS0Padding(t *testing.T) { req := dnsservertest.CreateMessage("example.org.", dns.TypeA) req.Extra = []dns.RR{dnsservertest.NewEDNS0Padding(req.Len(), dns.DefaultMsgSize)} - resp := sendQUICMessage(t, conn, req, false) + resp := requireSendQUICMessage(t, conn, req) require.NotNil(t, resp) require.Equal(t, dns.RcodeSuccess, resp.Rcode) require.True(t, resp.Response) @@ -112,7 +114,7 @@ func TestServerQUIC_integration_0RTT(t *testing.T) { require.NoError(t, err) testutil.CleanupAndRequireSuccess(t, func() (err error) { - return srv.Shutdown(context.Background()) + return srv.Shutdown(contextWithTimeout(t, testTimeout)) }) quicTracer := dnsservertest.NewQUICTracer() @@ -150,7 +152,7 @@ func TestServerQUIC_integration_largeQuery(t *testing.T) { require.NoError(t, err) testutil.CleanupAndRequireSuccess(t, func() (err error) { - return srv.Shutdown(context.Background()) + return srv.Shutdown(contextWithTimeout(t, testTimeout)) }) // Open a QUIC connection. @@ -174,7 +176,7 @@ func TestServerQUIC_integration_largeQuery(t *testing.T) { }, } - resp := sendQUICMessage(t, conn, req, false) + resp := requireSendQUICMessage(t, conn, req) require.NotNil(t, resp) require.True(t, resp.Response) } @@ -202,64 +204,77 @@ func testQUICExchange( req := dnsservertest.NewReq("example.org.", dns.TypeA, dns.ClassINET) req.RecursionDesired = true - resp := sendQUICMessage(t, conn, req, false) + resp := requireSendQUICMessage(t, conn, req) require.NotNil(t, resp) } // sendQUICMessage is a test helper that sends a test QUIC message. func sendQUICMessage( - t testing.TB, conn quic.Connection, req *dns.Msg, - doqDraft bool, -) (resp *dns.Msg) { - t.Helper() - +) (resp *dns.Msg, err error) { stream, err := conn.OpenStreamSync(context.Background()) - require.NoError(t, err) - - defer log.OnCloserError(stream, log.DEBUG) - - data, err := req.Pack() - require.NoError(t, err) - - var buf []byte - if doqDraft { - buf = data - } else { - buf = make([]byte, 2+len(data)) - binary.BigEndian.PutUint16(buf, uint16(len(data))) - copy(buf[2:], data) + if err != nil { + return nil, fmt.Errorf("opening stream: %w", err) } + defer log.OnCloserError(stream, log.ERROR) + + data, err := req.Pack() + if err != nil { + return nil, fmt.Errorf("packing: %w", err) + } + + buf := make([]byte, 2+len(data)) + binary.BigEndian.PutUint16(buf, uint16(len(data))) + copy(buf[2:], data) + err = writeQUICStream(buf, stream) - require.NoError(t, err) + if err != nil { + return nil, fmt.Errorf("writing: %w", err) + } // Closes the write-direction of the stream and sends a STREAM FIN packet. // A DoQ client MUST send a FIN packet to indicate that the query is // finished. err = stream.Close() - require.NoError(t, err) + if err != nil { + return nil, fmt.Errorf("closing stream: %w", err) + } - // Now read the response. respBytes := make([]byte, dns.MaxMsgSize) n, err := stream.Read(respBytes) - if !errors.Is(err, io.EOF) { - require.NoError(t, err) + if err != nil && !errors.Is(err, io.EOF) { + return nil, fmt.Errorf("reading stream: %w", err) } - require.GreaterOrEqual(t, n, dnsserver.DNSHeaderSize) + if n < dnsserver.DNSHeaderSize { + return nil, fmt.Errorf("read %d, want %d", n, dnsserver.DNSHeaderSize) + } - // Unpack the response. reply := &dns.Msg{} - if doqDraft { - err = reply.Unpack(respBytes[:n]) - } else { - err = reply.Unpack(respBytes[2:n]) + err = reply.Unpack(respBytes[2:n]) + if err != nil { + return nil, fmt.Errorf("unpacking: %w", err) } + + return reply, nil +} + +// requireSendQUICMessage is a test helper that sends a test QUIC message and +// requires it to succeed. It must not be used in a goroutine with the outer +// test's t. +func requireSendQUICMessage( + t testing.TB, + conn quic.Connection, + req *dns.Msg, +) (resp *dns.Msg) { + t.Helper() + + resp, err := sendQUICMessage(conn, req) require.NoError(t, err) - return reply + return resp } // writeQUICStream writes buf to the specified QUIC stream in chunks. This way diff --git a/internal/dnssvc/dnssvc.go b/internal/dnssvc/dnssvc.go index 1e97bdc..427988c 100644 --- a/internal/dnssvc/dnssvc.go +++ b/internal/dnssvc/dnssvc.go @@ -12,7 +12,6 @@ import ( "github.com/AdguardTeam/AdGuardDNS/internal/access" "github.com/AdguardTeam/AdGuardDNS/internal/agd" - "github.com/AdguardTeam/AdGuardDNS/internal/agdservice" "github.com/AdguardTeam/AdGuardDNS/internal/billstat" "github.com/AdguardTeam/AdGuardDNS/internal/connlimiter" "github.com/AdguardTeam/AdGuardDNS/internal/dnscheck" @@ -34,6 +33,7 @@ import ( "github.com/AdguardTeam/AdGuardDNS/internal/querylog" "github.com/AdguardTeam/AdGuardDNS/internal/rulestat" "github.com/AdguardTeam/golibs/errors" + "github.com/AdguardTeam/golibs/service" "github.com/miekg/dns" ) @@ -144,6 +144,10 @@ type Config struct { // used. UseECSCache bool + // ProfileDBEnabled is true, if user devices and profiles recognition is + // enabled. + ProfileDBEnabled bool + // ResearchMetrics controls whether research metrics are enabled or not. // This is a set of metrics that we may need temporary, so its collection is // controlled by a separate setting. @@ -267,10 +271,10 @@ func mustStartListener( } // type check -var _ agdservice.Interface = (*Service)(nil) +var _ service.Interface = (*Service)(nil) -// Start implements the [agdservice.Interface] interface for *Service. It -// panics if one of the listeners could not start. +// Start implements the [service.Interface] interface for *Service. It panics +// if one of the listeners could not start. func (svc *Service) Start(_ context.Context) (err error) { for _, g := range svc.groups { for _, s := range g.servers { @@ -298,7 +302,7 @@ func shutdownListeners(ctx context.Context, listeners []*listener) (err error) { return nil } -// Shutdown implements the [agdservice.Interface] interface for *Service. +// Shutdown implements the [service.Interface] interface for *Service. func (svc *Service) Shutdown(ctx context.Context) (err error) { var errs []error for _, g := range svc.groups { @@ -512,13 +516,14 @@ func newServers( }) imw := initial.New(&initial.Config{ - Messages: c.Messages, - FilteringGroup: fg, - ServerGroup: srvGrp, - Server: s, - ProfileDB: c.ProfileDB, - GeoIP: c.GeoIP, - ErrColl: c.ErrColl, + Messages: c.Messages, + FilteringGroup: fg, + ServerGroup: srvGrp, + Server: s, + ProfileDB: c.ProfileDB, + GeoIP: c.GeoIP, + ErrColl: c.ErrColl, + ProfileDBEnabled: c.ProfileDBEnabled, }) h := dnsserver.WithMiddlewares( diff --git a/internal/dnssvc/integration_test.go b/internal/dnssvc/integration_test.go index db198dc..0254c8b 100644 --- a/internal/dnssvc/integration_test.go +++ b/internal/dnssvc/integration_test.go @@ -101,8 +101,8 @@ func newTestService( OnIsBlockedHost: func(host string, qt uint16) (blocked bool) { return false }, - OnIsBlockedIP: func(ip netip.Addr) (blocked bool, rule string) { - return false, "" + OnIsBlockedIP: func(ip netip.Addr) (blocked bool) { + return false }, } @@ -228,16 +228,18 @@ func newTestService( }, }, ServerGroups: []*agd.ServerGroup{{ - TLS: &agd.TLS{ - DeviceIDWildcards: []string{dnssvctest.DeviceIDWildcard}, - }, + BlockPageRedirect: &agd.BlockPageRedirect{}, DDR: &agd.DDR{ Enabled: true, }, + TLS: &agd.TLS{ + DeviceIDWildcards: []string{dnssvctest.DeviceIDWildcard}, + }, Name: testSrvGrpName, FilteringGroup: testFltGrpID, Servers: []*agd.Server{srv}, }}, + ProfileDBEnabled: true, } svc, err := dnssvc.New(c) diff --git a/internal/dnssvc/internal/accessmw/access.go b/internal/dnssvc/internal/accessmw/access.go index ce8ab4f..4686a81 100644 --- a/internal/dnssvc/internal/accessmw/access.go +++ b/internal/dnssvc/internal/accessmw/access.go @@ -45,7 +45,7 @@ func (mw *Middleware) Wrap(next dnsserver.Handler) (wrapped dnsserver.Handler) { defer func() { err = errors.Annotate(err, "access mw: %w") }() rAddr := netutil.NetAddrToAddrPort(rw.RemoteAddr()).Addr() - if blocked, _ := mw.accessManager.IsBlockedIP(rAddr); blocked { + if blocked := mw.accessManager.IsBlockedIP(rAddr); blocked { metrics.AccessBlockedForSubnetTotal.Inc() return nil diff --git a/internal/dnssvc/internal/accessmw/access_test.go b/internal/dnssvc/internal/accessmw/access_test.go index 39534d6..b6c0fa4 100644 --- a/internal/dnssvc/internal/accessmw/access_test.go +++ b/internal/dnssvc/internal/accessmw/access_test.go @@ -25,9 +25,9 @@ func TestMiddleware_Wrap(t *testing.T) { "block.test", "UPPERCASE.test", "||block_aaaa.test^$dnstype=AAAA", - }, []string{ - "1.1.1.1", - "2.2.2.0/8", + }, []netip.Prefix{ + netip.MustParsePrefix("1.1.1.1/32"), + netip.MustParsePrefix("2.2.2.0/8"), }) require.NoError(t, accessErr) diff --git a/internal/dnssvc/internal/initial/initial.go b/internal/dnssvc/internal/initial/initial.go index b7e75d4..a77bd28 100644 --- a/internal/dnssvc/internal/initial/initial.go +++ b/internal/dnssvc/internal/initial/initial.go @@ -55,6 +55,10 @@ type Middleware struct { // errColl collects and reports the errors considered non-critical. errColl errcoll.Interface + + // profilesEnabled is true, if user devices and profiles recognition is + // enabled. + profilesEnabled bool } // Config is the configuration structure for the initial middleware. All fields @@ -80,6 +84,10 @@ type Config struct { // ErrColl collects and reports the errors considered non-critical. ErrColl errcoll.Interface + + // ProfileDBEnabled is true, if user devices and profiles recognition is + // enabled. + ProfileDBEnabled bool } // New returns a new initial middleware. c must not be nil. @@ -92,9 +100,10 @@ func New(c *Config) (mw *Middleware) { pool: syncutil.NewPool(func() (v *agd.RequestInfo) { return &agd.RequestInfo{} }), - db: c.ProfileDB, - geoIP: c.GeoIP, - errColl: c.ErrColl, + db: c.ProfileDB, + geoIP: c.GeoIP, + errColl: c.ErrColl, + profilesEnabled: c.ProfileDBEnabled, } } @@ -221,6 +230,10 @@ func (mw *Middleware) newRequestInfo( return nil, err } + if !mw.profilesEnabled { + return ri, nil + } + // Add the profile information, if any. localAddr := netutil.NetAddrToAddrPort(lAddr) err = mw.addProfile(ctx, ri, req, localAddr) diff --git a/internal/dnssvc/internal/initial/initial_test.go b/internal/dnssvc/internal/initial/initial_test.go index 9ae7088..64eb731 100644 --- a/internal/dnssvc/internal/initial/initial_test.go +++ b/internal/dnssvc/internal/initial/initial_test.go @@ -181,6 +181,7 @@ func TestMiddleware_Wrap(t *testing.T) { ErrColl: &agdtest.ErrorCollector{ OnCollect: func(_ context.Context, _ error) { panic("not implemented") }, }, + ProfileDBEnabled: true, }) ctx := context.Background() @@ -301,6 +302,7 @@ func TestMiddleware_Wrap_error(t *testing.T) { ErrColl: &agdtest.ErrorCollector{ OnCollect: func(_ context.Context, _ error) { panic("not implemented") }, }, + ProfileDBEnabled: true, }) ctx := context.Background() @@ -517,6 +519,7 @@ func TestMiddleware_Wrap_access(t *testing.T) { ErrColl: &agdtest.ErrorCollector{ OnCollect: func(_ context.Context, _ error) { panic("not implemented") }, }, + ProfileDBEnabled: true, }) ctx := context.Background() @@ -565,14 +568,15 @@ func newServers() (srvs map[agd.ServerName]*agd.Server) { func newServerGroup(srvs []*agd.Server) (srvGrp *agd.ServerGroup) { srvGrp = &agd.ServerGroup{ - TLS: &agd.TLS{ - DeviceIDWildcards: []string{"*.d." + resolverName}, - }, + BlockPageRedirect: &agd.BlockPageRedirect{}, DDR: &agd.DDR{ DeviceTargets: stringutil.NewSet(), PublicTargets: stringutil.NewSet(), Enabled: true, }, + TLS: &agd.TLS{ + DeviceIDWildcards: []string{"*.d." + resolverName}, + }, Name: "test_server_group", Servers: srvs, } @@ -605,14 +609,15 @@ var errSink error func BenchmarkMiddleware_Wrap(b *testing.B) { const devIDTarget = "dns.example.com" srvGrp := &agd.ServerGroup{ - TLS: &agd.TLS{ - DeviceIDWildcards: []string{"*." + devIDTarget}, - }, + BlockPageRedirect: &agd.BlockPageRedirect{}, DDR: &agd.DDR{ DeviceTargets: stringutil.NewSet(), PublicTargets: stringutil.NewSet(), Enabled: true, }, + TLS: &agd.TLS{ + DeviceIDWildcards: []string{"*." + devIDTarget}, + }, Name: agd.ServerGroupName("test_server_group"), Servers: []*agd.Server{ dnssvctest.NewServer("test_server_dot", agd.ProtoDoT, &agd.ServerBindData{ @@ -708,6 +713,7 @@ func BenchmarkMiddleware_Wrap(b *testing.B) { ErrColl: &agdtest.ErrorCollector{ OnCollect: func(_ context.Context, _ error) { panic("not implemented") }, }, + ProfileDBEnabled: true, }) h := mw.Wrap(handler) @@ -753,6 +759,7 @@ func BenchmarkMiddleware_Wrap(b *testing.B) { ErrColl: &agdtest.ErrorCollector{ OnCollect: func(_ context.Context, _ error) { panic("not implemented") }, }, + ProfileDBEnabled: true, }) h := mw.Wrap(handler) @@ -806,6 +813,7 @@ func BenchmarkMiddleware_Wrap(b *testing.B) { ErrColl: &agdtest.ErrorCollector{ OnCollect: func(_ context.Context, _ error) { panic("not implemented") }, }, + ProfileDBEnabled: true, }) h := mw.Wrap(handler) @@ -864,6 +872,7 @@ func BenchmarkMiddleware_Wrap(b *testing.B) { ErrColl: &agdtest.ErrorCollector{ OnCollect: func(_ context.Context, _ error) { panic("not implemented") }, }, + ProfileDBEnabled: true, }) h := mw.Wrap(handler) diff --git a/internal/dnssvc/internal/initial/profile_internal_test.go b/internal/dnssvc/internal/initial/profile_internal_test.go index 189b8a3..7417351 100644 --- a/internal/dnssvc/internal/initial/profile_internal_test.go +++ b/internal/dnssvc/internal/initial/profile_internal_test.go @@ -101,8 +101,9 @@ func TestMiddleware_profile(t *testing.T) { srv.LinkedIPEnabled = tc.linkedIPEnabled mw := New(&Config{ - Server: srv, - ProfileDB: newProfileDB(t, prof, dev, tc.wantByWhat), + Server: srv, + ProfileDB: newProfileDB(t, prof, dev, tc.wantByWhat), + ProfileDBEnabled: true, }) ctx := context.Background() @@ -196,8 +197,9 @@ func TestMiddleware_profileByAddrs(t *testing.T) { srv.LinkedIPEnabled = tc.linkedIPEnabled mw := New(&Config{ - Server: srv, - ProfileDB: newProfileDB(t, prof, dev, tc.wantByWhat), + Server: srv, + ProfileDB: newProfileDB(t, prof, dev, tc.wantByWhat), + ProfileDBEnabled: true, }) ctx := context.Background() diff --git a/internal/dnssvc/internal/initial/specialdomain_test.go b/internal/dnssvc/internal/initial/specialdomain_test.go index 943972d..9024f82 100644 --- a/internal/dnssvc/internal/initial/specialdomain_test.go +++ b/internal/dnssvc/internal/initial/specialdomain_test.go @@ -198,9 +198,10 @@ func TestMiddleware_ServeDNS_specialDomain(t *testing.T) { Protocol: agd.ProtoDNS, LinkedIPEnabled: true, }, - ProfileDB: db, - GeoIP: geoIP, - ErrColl: errColl, + ProfileDB: db, + GeoIP: geoIP, + ErrColl: errColl, + ProfileDBEnabled: true, }) h := mw.Wrap(handler) diff --git a/internal/ecscache/ecsblocklist.go b/internal/ecscache/ecsblocklist.go index 4455403..f1200ea 100644 --- a/internal/ecscache/ecsblocklist.go +++ b/internal/ecscache/ecsblocklist.go @@ -7,9 +7,7 @@ package ecscache var FakeECSFQDNs = map[string]struct{}{ "01.cofile.net.": {}, "011b2ef417d541e4b4a0753f94353476.pacloudflare.com.": {}, - "02.cofile.net.": {}, - "0217991b.akstat.io.": {}, - "0217991d.akstat.io.": {}, + "02.cofile.net.": {}, "0272ac85-5199-4024-a555-397c3d825d95.prmutv.co.": {}, "03.cofile.net.": {}, "04.cofile.net.": {}, @@ -19,26 +17,22 @@ var FakeECSFQDNs = map[string]struct{}{ "08.cofile.net.": {}, "09.cofile.net.": {}, "0cf.io.": {}, - "0cf17917-395b-4f25-91cc-db3bdd6044b0.prmutv.co.": {}, - "1-146-13451-3.b.cdn12.com.": {}, - "1-322-13451-3.b.cdn12.com.": {}, - "1-361-13451-3.b.cdn12.com.": {}, - "1-363-13451-3.b.cdn12.com.": {}, - "1-94-13451-3.b.cdn12.com.": {}, - "1-957-13451-3.b.cdn12.com.": {}, - "1-961-13451-3.b.cdn12.com.": {}, - "1.cn.pool.ntp.org.": {}, - "10.cofile.net.": {}, - "103.chtsite.com.": {}, - "10m.com.cn.": {}, - "11-alarm-mop.meshare.com.": {}, - "11.cofile.net.": {}, + "0cf17917-395b-4f25-91cc-db3bdd6044b0.prmutv.co.": {}, + "1.cn.pool.ntp.org.": {}, + "1.eu.dl.wireshark.org.": {}, + "10.cofile.net.": {}, + "103.chtsite.com.": {}, + "10m.com.cn.": {}, + "11-alarm-mop.meshare.com.": {}, + "11.cofile.net.": {}, "1184-ipv4v6e.clump.dprodmgd105.aa-rt.sharepoint.com.": {}, "12-alarm-mop.meshare.com.": {}, "12.cofile.net.": {}, "126.net.": {}, "13-alarm-mop.meshare.com.": {}, "13.cofile.net.": {}, + "1365538595.rsc.cdn77.org.": {}, + "1394501235.rsc.cdn77.org.": {}, "14-alarm-mop.meshare.com.": {}, "14.cofile.net.": {}, "15.cofile.net.": {}, @@ -47,39 +41,38 @@ var FakeECSFQDNs = map[string]struct{}{ "163yun.com.": {}, "1688.com.": {}, "17.cofile.net.": {}, - "173bf105.akstat.io.": {}, - "17de4c13.akstat.io.": {}, - "17de4c1f.akstat.io.": {}, + "17173sf.com.": {}, + "17de4c16.akstat.io.": {}, "18.cofile.net.": {}, - "1845588971.rsc.cdn77.org.": {}, - "19.cofile.net.": {}, + "18ea70d2d9a945cfb97d818ba71817dc.pacloudflare.com.": {}, + "19.cofile.net.": {}, "192667-ipv4v6e.farm.dprodmgd105.aa-rt.sharepoint.com.": {}, "192991-ipv4v6e.farm.dprodmgd105.aa-rt.sharepoint.com.": {}, "193119-ipv4v6e.farm.dprodmgd105.aa-rt.sharepoint.com.": {}, - "193253-ipv4v6e.farm.dprodmgd105.aa-rt.sharepoint.com.": {}, - "193562-ipv4v6e.farm.dprodmgd105.aa-rt.sharepoint.com.": {}, - "193592-ipv4v6e.farm.dprodmgd105.aa-rt.sharepoint.com.": {}, + "193259-ipv4v6e.farm.dprodmgd105.aa-rt.sharepoint.com.": {}, + "193522-ipv4v6e.farm.dprodmgd105.aa-rt.sharepoint.com.": {}, + "193597-ipv4v6e.farm.dprodmgd105.aa-rt.sharepoint.com.": {}, "1941-ipv4v6e.clump.dprodmgd105.aa-rt.sharepoint.com.": {}, "1weather.onelouder.com.": {}, + "2-01-49b5-0066.cdx.cedexis.net.": {}, "2.401402081.west-gcloud.codm.activision.com.": {}, "2.realtime.services.box.net.": {}, "20.cofile.net.": {}, "201205igp.gameloft.com.": {}, - "2345.cc.": {}, - "23andme.com.": {}, - "2442-ipv4v6e.clump.dprodmgd105.aa-rt.sharepoint.com.": {}, + "21cn.com.": {}, "2acdb9b66bb242618283aadb21ede6c1.pacloudflare.com.": {}, "2e4b93d1-a8ae-4a89-8885-6109135ac0de.prmutv.co.": {}, "2talk.com.": {}, + "2tx.com.": {}, "360.cn.": {}, "360os.com.": {}, "360safe.com.": {}, "365.kdocs.cn.": {}, "3a6b0682-f3e1-4576-a706-5eb4101b9cc3.prmutv.co.": {}, "3aba5292-ba75-422b-8715-bd21146f7836.prmutv.co.": {}, + "3bjjlx-cdn-settings.appsflyersdk.com.": {}, "3d2fb0bd-52fc-4b75-aaf5-2d436c172540.prmutv.co.": {}, - "3g.cn.": {}, - "4.401402081.west-gcloud.codm.activision.com.": {}, + "4.401402081.west-gcloud.codm.activision.com.": {}, "4.adsco.re.": {}, "401402081.west-gcloud.codm.activision.com.": {}, "4065-ipv4v6e.clump.dprodmgd105.aa-rt.sharepoint.com.": {}, @@ -87,34 +80,43 @@ var FakeECSFQDNs = map[string]struct{}{ "4974-ipv4v6e.clump.dprodmgd105.aa-rt.sharepoint.com.": {}, "507b28fb-2ef1-4c34-8bda-ba32030bb199.prmutv.co.": {}, "520.jp.": {}, - "6.401402081.west-gcloud.codm.activision.com.": {}, - "6093eccf-6734-4877-ac8b-83d6d0e27b46.prmutv.co.": {}, - "6c3e19e3-d05e-45d1-8f79-fcd6cb2f3a21.prmutv.co.": {}, - "733868e706dd40d3a4a0588fc39b3df8.pacloudflare.com.": {}, - "7c7b02d4bc3d48dd81a7c7738d4de1ab.pacloudflare.com.": {}, + "5d79bce7-5d2b-427e-a6c4-b89b6c7bf048.prmutv.co.": {}, + "6.401402081.west-gcloud.codm.activision.com.": {}, + "6093eccf-6734-4877-ac8b-83d6d0e27b46.prmutv.co.": {}, + "6536.apps.zdusercontent.com.": {}, + "68547f8f-2fd8-4ff3-9b63-51e86e2edee8.prmutv.co.": {}, + "6c3e19e3-d05e-45d1-8f79-fcd6cb2f3a21.prmutv.co.": {}, + "6o1s4z-launches.appsflyersdk.com.": {}, + "733868e706dd40d3a4a0588fc39b3df8.pacloudflare.com.": {}, + "789-ipv4v6e.clump.dprodmgd105.aa-rt.sharepoint.com.": {}, + "7c7b02d4bc3d48dd81a7c7738d4de1ab.pacloudflare.com.": {}, + "8686c.com.": {}, "88a66e5c-8fe8-48af-9c6c-3ec3f4983aad.prmutv.co.": {}, + "8fd3136c-39ae-4836-adeb-ea2f0db46980.prmutv.co.": {}, "8x8.com.cdn.cloudflare.net.": {}, "9pumbooc7hqedhjmeavbpmp5ik9u0ngr-data.customer.pendo.io.": {}, "a-m-p.xyz.": {}, - "a.ad.gt.cdn.cloudflare.net.": {}, - "a.beat3put.com.": {}, + "a.dtssrv.com.": {}, "a.fc.namequery.com.": {}, "a.nel.cloudflare.com.": {}, - "a.ns.c10r.facebook.com.": {}, - "a.ns.cdn.whatsapp.net.": {}, + "a.nitropay.com.": {}, "a.ns.xx.fbcdn.net.": {}, "a.tile.openstreetmap.org.": {}, "a.tile.osm.org.": {}, + "a010.casalemedia.com.": {}, "a011.casalemedia.com.": {}, + "a012.casalemedia.com.": {}, + "a013.casalemedia.com.": {}, "a014.casalemedia.com.": {}, + "a015.casalemedia.com.": {}, "a016.casalemedia.com.": {}, "a017.casalemedia.com.": {}, "a018.casalemedia.com.": {}, "a019.casalemedia.com.": {}, "a020.casalemedia.com.": {}, - "a021.casalemedia.com.": {}, "a022.casalemedia.com.": {}, "a023.casalemedia.com.": {}, + "a024.casalemedia.com.": {}, "a025.casalemedia.com.": {}, "a026.casalemedia.com.": {}, "a027.casalemedia.com.": {}, @@ -124,14 +126,14 @@ var FakeECSFQDNs = map[string]struct{}{ "a031.casalemedia.com.": {}, "a032.casalemedia.com.": {}, "a033.casalemedia.com.": {}, - "a034.casalemedia.com.": {}, "a035.casalemedia.com.": {}, - "a037.casalemedia.com.": {}, + "a036.casalemedia.com.": {}, "a038.casalemedia.com.": {}, "a039.casalemedia.com.": {}, "a040.casalemedia.com.": {}, "a041.casalemedia.com.": {}, "a042.casalemedia.com.": {}, + "a043.casalemedia.com.": {}, "a044.casalemedia.com.": {}, "a045.casalemedia.com.": {}, "a046.casalemedia.com.": {}, @@ -140,7 +142,6 @@ var FakeECSFQDNs = map[string]struct{}{ "a058.casalemedia.com.": {}, "a074.casalemedia.com.": {}, "a075.casalemedia.com.": {}, - "a080.casalemedia.com.": {}, "a088.casalemedia.com.": {}, "a091.casalemedia.com.": {}, "a095.casalemedia.com.": {}, @@ -148,6 +149,7 @@ var FakeECSFQDNs = map[string]struct{}{ "a097.casalemedia.com.": {}, "a098.casalemedia.com.": {}, "a099.casalemedia.com.": {}, + "a101.casalemedia.com.": {}, "a119.casalemedia.com.": {}, "a121.casalemedia.com.": {}, "a123.casalemedia.com.": {}, @@ -157,53 +159,33 @@ var FakeECSFQDNs = map[string]struct{}{ "a128.casalemedia.com.": {}, "a129.casalemedia.com.": {}, "a131.casalemedia.com.": {}, - "a132.casalemedia.com.": {}, "a133.casalemedia.com.": {}, "a134.casalemedia.com.": {}, + "a136.casalemedia.com.": {}, + "a137.casalemedia.com.": {}, "a138.casalemedia.com.": {}, - "a140.casalemedia.com.": {}, + "a139.casalemedia.com.": {}, "a141.casalemedia.com.": {}, "a143.casalemedia.com.": {}, "a144.casalemedia.com.": {}, "a145.casalemedia.com.": {}, - "a1462.casalemedia.com.": {}, - "a1463.casalemedia.com.": {}, - "a1467.casalemedia.com.": {}, + "a146.casalemedia.com.": {}, "a147.casalemedia.com.": {}, - "a1474.casalemedia.com.": {}, - "a1487.casalemedia.com.": {}, "a149.casalemedia.com.": {}, - "a1498.casalemedia.com.": {}, "a150.casalemedia.com.": {}, "a151.casalemedia.com.": {}, - "a1518.casalemedia.com.": {}, "a152.casalemedia.com.": {}, - "a1521.casalemedia.com.": {}, - "a1528.casalemedia.com.": {}, "a153.casalemedia.com.": {}, - "a1531.casalemedia.com.": {}, "a156.casalemedia.com.": {}, - "a1565.casalemedia.com.": {}, "a157.casalemedia.com.": {}, "a158.casalemedia.com.": {}, - "a1587.casalemedia.com.": {}, - "a159.casalemedia.com.": {}, - "a1590.casalemedia.com.": {}, - "a1591.casalemedia.com.": {}, - "a1598.casalemedia.com.": {}, "a160.casalemedia.com.": {}, "a161.casalemedia.com.": {}, - "a1649.casalemedia.com.": {}, - "a1660.casalemedia.com.": {}, - "a1671.casalemedia.com.": {}, - "a1675.casalemedia.com.": {}, - "a1676.casalemedia.com.": {}, + "a166.casalemedia.com.": {}, "a169.casalemedia.com.": {}, - "a1692.casalemedia.com.": {}, - "a1693.casalemedia.com.": {}, - "a1696.casalemedia.com.": {}, "a170.casalemedia.com.": {}, "a172.casalemedia.com.": {}, + "a178.casalemedia.com.": {}, "a179.casalemedia.com.": {}, "a182.casalemedia.com.": {}, "a186.casalemedia.com.": {}, @@ -212,6 +194,7 @@ var FakeECSFQDNs = map[string]struct{}{ "a189.casalemedia.com.": {}, "a190.casalemedia.com.": {}, "a192.casalemedia.com.": {}, + "a195.casalemedia.com.": {}, "a200.casalemedia.com.": {}, "a2001.casalemedia.com.": {}, "a2002.casalemedia.com.": {}, @@ -221,17 +204,13 @@ var FakeECSFQDNs = map[string]struct{}{ "a2006.casalemedia.com.": {}, "a2007.casalemedia.com.": {}, "a2008.casalemedia.com.": {}, - "a2009.casalemedia.com.": {}, "a201.casalemedia.com.": {}, "a2010.casalemedia.com.": {}, "a2011.casalemedia.com.": {}, "a2012.casalemedia.com.": {}, "a2013.casalemedia.com.": {}, - "a2014.casalemedia.com.": {}, "a2015.casalemedia.com.": {}, "a2016.casalemedia.com.": {}, - "a2017.casalemedia.com.": {}, - "a2018.casalemedia.com.": {}, "a2019.casalemedia.com.": {}, "a2020.casalemedia.com.": {}, "a2021.casalemedia.com.": {}, @@ -241,10 +220,8 @@ var FakeECSFQDNs = map[string]struct{}{ "a2025.casalemedia.com.": {}, "a2026.casalemedia.com.": {}, "a2027.casalemedia.com.": {}, - "a2028.casalemedia.com.": {}, "a2030.casalemedia.com.": {}, "a2031.casalemedia.com.": {}, - "a2032.casalemedia.com.": {}, "a2033.casalemedia.com.": {}, "a2034.casalemedia.com.": {}, "a2035.casalemedia.com.": {}, @@ -262,7 +239,9 @@ var FakeECSFQDNs = map[string]struct{}{ "a2047.casalemedia.com.": {}, "a2048.casalemedia.com.": {}, "a2049.casalemedia.com.": {}, + "a2050.casalemedia.com.": {}, "a2051.casalemedia.com.": {}, + "a2052.casalemedia.com.": {}, "a2053.casalemedia.com.": {}, "a2054.casalemedia.com.": {}, "a2055.casalemedia.com.": {}, @@ -270,14 +249,16 @@ var FakeECSFQDNs = map[string]struct{}{ "a2057.casalemedia.com.": {}, "a2058.casalemedia.com.": {}, "a2060.casalemedia.com.": {}, - "a21018620252.cdn.optimizely.com.": {}, "a2561.casalemedia.com.": {}, + "a2562.casalemedia.com.": {}, "a2563.casalemedia.com.": {}, + "a2564.casalemedia.com.": {}, + "a2565.casalemedia.com.": {}, "a2566.casalemedia.com.": {}, - "a2567.casalemedia.com.": {}, "a2568.casalemedia.com.": {}, "a2569.casalemedia.com.": {}, "a2570.casalemedia.com.": {}, + "a2571.casalemedia.com.": {}, "a2572.casalemedia.com.": {}, "a2573.casalemedia.com.": {}, "a2574.casalemedia.com.": {}, @@ -287,7 +268,6 @@ var FakeECSFQDNs = map[string]struct{}{ "a2578.casalemedia.com.": {}, "a2579.casalemedia.com.": {}, "a2580.casalemedia.com.": {}, - "a2581.casalemedia.com.": {}, "a2582.casalemedia.com.": {}, "a2583.casalemedia.com.": {}, "a2584.casalemedia.com.": {}, @@ -295,7 +275,6 @@ var FakeECSFQDNs = map[string]struct{}{ "a2587.casalemedia.com.": {}, "a2588.casalemedia.com.": {}, "a2589.casalemedia.com.": {}, - "a2590.casalemedia.com.": {}, "a2591.casalemedia.com.": {}, "a2592.casalemedia.com.": {}, "a2593.casalemedia.com.": {}, @@ -305,16 +284,13 @@ var FakeECSFQDNs = map[string]struct{}{ "a2597.casalemedia.com.": {}, "a2598.casalemedia.com.": {}, "a2599.casalemedia.com.": {}, - "a260.casalemedia.com.": {}, - "a2600.casalemedia.com.": {}, "a2601.casalemedia.com.": {}, - "a2602.casalemedia.com.": {}, "a2603.casalemedia.com.": {}, "a2605.casalemedia.com.": {}, "a2606.casalemedia.com.": {}, "a2607.casalemedia.com.": {}, + "a2608.casalemedia.com.": {}, "a2609.casalemedia.com.": {}, - "a2610.casalemedia.com.": {}, "a2611.casalemedia.com.": {}, "a2612.casalemedia.com.": {}, "a2613.casalemedia.com.": {}, @@ -339,29 +315,27 @@ var FakeECSFQDNs = map[string]struct{}{ "a2633.casalemedia.com.": {}, "a2634.casalemedia.com.": {}, "a2635.casalemedia.com.": {}, + "a2636.casalemedia.com.": {}, + "a2637.casalemedia.com.": {}, "a2638.casalemedia.com.": {}, "a2639.casalemedia.com.": {}, "a2640.casalemedia.com.": {}, "a2641.casalemedia.com.": {}, "a2642.casalemedia.com.": {}, "a2643.casalemedia.com.": {}, - "a2644.casalemedia.com.": {}, + "a2645.casalemedia.com.": {}, "a2646.casalemedia.com.": {}, "a2647.casalemedia.com.": {}, "a2648.casalemedia.com.": {}, "a2649.casalemedia.com.": {}, - "a2650.casalemedia.com.": {}, "a2a5c7f9-3fa0-4182-889a-15aa61acf59b.prmutv.co.": {}, "a3.tuyacn.com.": {}, - "a403.casalemedia.com.": {}, - "a461.casalemedia.com.": {}, - "a462.casalemedia.com.": {}, + "a314.gameloft.com.": {}, "a463.casalemedia.com.": {}, "a464.casalemedia.com.": {}, + "a465.casalemedia.com.": {}, "a466.casalemedia.com.": {}, "a467.casalemedia.com.": {}, - "a468.casalemedia.com.": {}, - "a469.casalemedia.com.": {}, "a470.casalemedia.com.": {}, "a471.casalemedia.com.": {}, "a472.casalemedia.com.": {}, @@ -373,16 +347,14 @@ var FakeECSFQDNs = map[string]struct{}{ "a478.casalemedia.com.": {}, "a479.casalemedia.com.": {}, "a480.casalemedia.com.": {}, + "a5551.casalemedia.com.": {}, "a5552.casalemedia.com.": {}, - "a5553.casalemedia.com.": {}, - "a5554.casalemedia.com.": {}, "a5555.casalemedia.com.": {}, "a5556.casalemedia.com.": {}, "a5557.casalemedia.com.": {}, "a5558.casalemedia.com.": {}, "a5559.casalemedia.com.": {}, "a5560.casalemedia.com.": {}, - "a5561.casalemedia.com.": {}, "a5562.casalemedia.com.": {}, "a5563.casalemedia.com.": {}, "a5564.casalemedia.com.": {}, @@ -390,15 +362,17 @@ var FakeECSFQDNs = map[string]struct{}{ "a5566.casalemedia.com.": {}, "a5567.casalemedia.com.": {}, "a5568.casalemedia.com.": {}, + "a5569.casalemedia.com.": {}, + "a5570.casalemedia.com.": {}, "a5571.casalemedia.com.": {}, "a5572.casalemedia.com.": {}, "a5573.casalemedia.com.": {}, - "a5574.casalemedia.com.": {}, "a5575.casalemedia.com.": {}, - "a5576.casalemedia.com.": {}, "a5577.casalemedia.com.": {}, "a5578.casalemedia.com.": {}, + "a5579.casalemedia.com.": {}, "a5580.casalemedia.com.": {}, + "a5581.casalemedia.com.": {}, "a5582.casalemedia.com.": {}, "a5583.casalemedia.com.": {}, "a5584.casalemedia.com.": {}, @@ -409,7 +383,6 @@ var FakeECSFQDNs = map[string]struct{}{ "a5589.casalemedia.com.": {}, "a5590.casalemedia.com.": {}, "a5591.casalemedia.com.": {}, - "a5592.casalemedia.com.": {}, "a5593.casalemedia.com.": {}, "a5594.casalemedia.com.": {}, "a5595.casalemedia.com.": {}, @@ -420,10 +393,9 @@ var FakeECSFQDNs = map[string]struct{}{ "a55a84b3-9632-4869-b625-3d8ef43ed18d.prmutv.co.": {}, "a5600.casalemedia.com.": {}, "a5602.casalemedia.com.": {}, + "a5603.casalemedia.com.": {}, "a5604.casalemedia.com.": {}, "a5605.casalemedia.com.": {}, - "a5606.casalemedia.com.": {}, - "a5607.casalemedia.com.": {}, "a5608.casalemedia.com.": {}, "a5609.casalemedia.com.": {}, "a5610.casalemedia.com.": {}, @@ -432,20 +404,21 @@ var FakeECSFQDNs = map[string]struct{}{ "a5613.casalemedia.com.": {}, "a5614.casalemedia.com.": {}, "a5615.casalemedia.com.": {}, + "a5616.casalemedia.com.": {}, "a5617.casalemedia.com.": {}, "a5618.casalemedia.com.": {}, "a5619.casalemedia.com.": {}, "a5620.casalemedia.com.": {}, "a5621.casalemedia.com.": {}, "a5622.casalemedia.com.": {}, - "a5623.casalemedia.com.": {}, "a5624.casalemedia.com.": {}, "a5625.casalemedia.com.": {}, "a5626.casalemedia.com.": {}, "a5627.casalemedia.com.": {}, "a5628.casalemedia.com.": {}, + "a5629.casalemedia.com.": {}, "a5630.casalemedia.com.": {}, - "a5631.casalemedia.com.": {}, + "a5632.casalemedia.com.": {}, "a5633.casalemedia.com.": {}, "a5634.casalemedia.com.": {}, "a5635.casalemedia.com.": {}, @@ -470,7 +443,6 @@ var FakeECSFQDNs = map[string]struct{}{ "a5655.casalemedia.com.": {}, "a5656.casalemedia.com.": {}, "a5657.casalemedia.com.": {}, - "a5658.casalemedia.com.": {}, "a5659.casalemedia.com.": {}, "a5660.casalemedia.com.": {}, "a5661.casalemedia.com.": {}, @@ -484,93 +456,91 @@ var FakeECSFQDNs = map[string]struct{}{ "a5669.casalemedia.com.": {}, "a5670.casalemedia.com.": {}, "a57.foxsports.com.": {}, - "a578.casalemedia.com.": {}, - "a5lng2-launches.appsflyersdk.com.": {}, + "a6.smartnews-ads.com.": {}, "a9695278-4085-40b3-9f02-8d4c38a6ff01.prmutv.co.": {}, "aa-sync.quantummetric.com.": {}, "aa.online-metrix.net.": {}, "aa.quantummetric.com.": {}, + "aaa.a-mo.net.": {}, "aaid.uyunad.com.": {}, - "aarpsharex-my.sharepoint.com.": {}, "ab.qq.com.": {}, "abcsinsights.com.": {}, "abmmscloud-my.sharepoint.com.": {}, "abmmscloud.sharepoint.com.": {}, "abroad-lzd.apilocate.amap.com.": {}, "abroad.apilocate.amap.com.": {}, - "academia.trendmd.com.": {}, + "abtest-aws-us-east-01.saas.sensorsdata.com.": {}, "accela.com.": {}, + "access.creditonebank.com.": {}, "access.mp.lura.live.": {}, "account.box.com.": {}, "accountapi.agoda.com.": {}, - "accounts.creditkarma.com.": {}, "accruent.com.": {}, "accscdn4public.m.taobao.com.": {}, "accurint.com.": {}, - "ace.naver.com.": {}, + "acdn.tinkoff.ru.": {}, "acgvideo.com.": {}, "achi.faceit.com.": {}, "acme-v02.api.letsencrypt.org.": {}, + "acrobits.cz.": {}, "acs4public.m.taobao.com.": {}, + "acsdk.gameyw.easebar.com.": {}, "activate.academy.com.": {}, "activation.cloud.techsmith.com.": {}, - "acxiomapac.com.": {}, - "ad.monetate.net.": {}, - "ad.tencentmusic.com.": {}, + "ad.sitemaji.com.": {}, + "adakami.id.": {}, "adapex.io.": {}, "adash-emas.cn-hangzhou.aliyuncs.com.": {}, "adash.man.aliyuncs.com.": {}, "adcell.com.": {}, "addictpodcast.com.": {}, - "adguard.com.": {}, "adi-sin-c-4.cico.com.": {}, "adidas.com.multicdn.cloudinary.com.": {}, + "aditude.io.": {}, "adlook.me.": {}, "adm.wsms.haplat.net.": {}, - "admatic.com.tr.": {}, "admbk.wsms.haplat.net.": {}, "admedo.com.": {}, - "admin-fts.threekit.com.": {}, + "adminmepcr-my.sharepoint.com.": {}, + "admitad.com.": {}, + "admixer.com.": {}, "adoric.com.": {}, "adquery.io.": {}, "adrs.org.cn.": {}, "adsco.re.": {}, "adtarget.market.": {}, + "adtarget.me.": {}, "advantage.purpleguys.com.": {}, "advantage2.purpleguys.com.": {}, "adventisthealthwest-my.sharepoint.com.": {}, "adventisthealthwest.sharepoint.com.": {}, "adview.com.": {}, + "advisorgroup-my.sharepoint.com.": {}, "advlion.com.": {}, "adx-sg-req.anythinktech.com.": {}, - "adxinspidsp.com.": {}, + "aee.myisolved.com.": {}, "aepenergy-my.sharepoint.com.": {}, "aepenergy.sharepoint.com.": {}, - "af.monetate.net.": {}, + "affyrtb.com.": {}, "afss.zhiqinyun.cn.": {}, + "agd2.p.360.cn.": {}, "agent.marketingcloudfx.com.": {}, "agoda-my.sharepoint.com.": {}, "agt.p.360.cn.": {}, - "agwp1.arbigo.com.": {}, "aicdn.com.": {}, "aid.send.microad.jp.": {}, "aidata.io.": {}, "aikenschools-my.sharepoint.com.": {}, "aikenschools.sharepoint.com.": {}, "ailunshenghuo.com.": {}, - "ain1-my.sharepoint.com.": {}, - "aiq-in.delish.com.": {}, - "aiq-in.goodhousekeeping.com.": {}, + "aiq-in.caranddriver.com.": {}, "airasia.com.": {}, "airasia.gw-dv.vip.": {}, - "aircanada.com.": {}, "airtame.com.": {}, "airtory.com.": {}, - "aisee.tv.": {}, "ajcloud.net.": {}, "akronchildrens-my.sharepoint.com.": {}, "akronchildrens.sharepoint.com.": {}, - "akulaku.com.": {}, "alarm.wsms.haplat.net.": {}, "alarmbk.wsms.haplat.net.": {}, "alarmnet.com.": {}, @@ -581,6 +551,7 @@ var FakeECSFQDNs = map[string]struct{}{ "alialarm-sgp.oss-ap-southeast-1.aliyuncs.com.": {}, "alibaba-inc.com.": {}, "alibabachengdun.com.": {}, + "alibabacloud.com.": {}, "alibabacorp.com.": {}, "alibabausercontent.com.": {}, "alicdn.com.": {}, @@ -588,11 +559,16 @@ var FakeECSFQDNs = map[string]struct{}{ "aliexpress.us.": {}, "alikunlun.com.": {}, "alikunlun.net.": {}, + "alive1.cloudbirds.cn.": {}, + "alive2.cloudbirds.cn.": {}, + "alive3.cloudbirds.cn.": {}, "aliyun.com.": {}, "aliyuncs.com.": {}, "allieduniversalservices-my.sharepoint.com.": {}, + "allieduniversalservices.sharepoint.com.": {}, "alog-default.umeng.com.": {}, - "am1.bumbcdn.com.": {}, + "aly.justuno.com.": {}, + "am1.ecdn2.bumbcdn.com.": {}, "am3pap002.storage.live.com.": {}, "am3pap003.storage.live.com.": {}, "am3pap004.storage.live.com.": {}, @@ -600,18 +576,17 @@ var FakeECSFQDNs = map[string]struct{}{ "am3pap006.storage.live.com.": {}, "am3pap007.storage.live.com.": {}, "am4pap001.storage.live.com.": {}, - "ama-app.quantummetric.com.": {}, "amap.com.": {}, "amc-theatres-res.cloudinary.com.": {}, - "amcore-ens.rest.gti.trellix.com.": {}, + "amc-theatres.multicdn.cloudinary.com.": {}, + "amcor-my.sharepoint.com.": {}, + "amcor.sharepoint.com.": {}, "amd.com.": {}, "amdc-wapa.lazada.com.": {}, "amdc.lazada.com.": {}, "amdcopen.m.taobao.com.": {}, "amdcopen.m.taobao.com.gds.alibabadns.com.": {}, "americanchemicalsociety-my.sharepoint.com.": {}, - "amp-account.apps.apple.com.": {}, - "amp.dsg.bio.": {}, "amp.namequery.com.": {}, "amp.permutive.com.": {}, "ams-itm-radar-testobject.citrix.com.": {}, @@ -623,20 +598,16 @@ var FakeECSFQDNs = map[string]struct{}{ "ams03pap005.storage.live.com.": {}, "ams06pap001.storage.live.com.": {}, "amsterdam.remotepc.com.": {}, - "an.apps.seabroadnet.com.": {}, + "amwinsusa-my.sharepoint.com.": {}, + "amwinsusa.sharepoint.com.": {}, "analytics-2.athome.com.": {}, "analytics-batch.blitz.gg.": {}, "analytics-debugger.com.": {}, "analytics-ingress-global.bitmovin.com.": {}, - "analytics.apps.seabroadnet.com.": {}, - "analytics.belk.com.": {}, "analytics.coachoutlet.com.": {}, "analytics.duluthtrading.com.": {}, - "analytics.fdown.net.": {}, "analytics.getshogun.com.": {}, "analytics.gnc.com.": {}, - "analytics.katespade.com.": {}, - "analytics.katespadeoutlet.com.": {}, "analytics.languagetoolplus.com.": {}, "analytics.qumucloud.com.": {}, "analytics.trovit.com.": {}, @@ -646,16 +617,18 @@ var FakeECSFQDNs = map[string]struct{}{ "announce.torrentsmd.com.": {}, "anonymous.ads.brave.com.": {}, "ansellhealthcare-my.sharepoint.com.": {}, + "ansys-my.sharepoint.com.": {}, "ansys.sharepoint.com.": {}, "anthem-app.quantummetric.com.": {}, "anthropic.com.": {}, "anxbrylkt.accounts.ondemand.com.": {}, - "anzuinfra.com.": {}, "aon.com.": {}, "ap-southeast-1.log.aliyuncs.com.": {}, "apcloud.xyz.": {}, + "api-analytics-us3.zepp.com.": {}, "api-asyncgw-gcc-teams.usgovtrafficmanager.net.": {}, "api-eu1.hubspot.com.": {}, + "api-ext.slickdeals.net.": {}, "api-glb-aapne1a.smoot.apple.com.": {}, "api-glb-aapne1c.smoot.apple.com.": {}, "api-glb-aaps1b.smoot.apple.com.": {}, @@ -665,7 +638,6 @@ var FakeECSFQDNs = map[string]struct{}{ "api-glb-aeuw1b.smoot.apple.com.": {}, "api-glb-aeuw3b.smoot.apple.com.": {}, "api-glb-aeuw3c.smoot.apple.com.": {}, - "api-glb-asae1b.smoot.apple.com.": {}, "api-glb-ause1a.smoot.apple.com.": {}, "api-glb-ause1b.smoot.apple.com.": {}, "api-glb-ause1c.smoot.apple.com.": {}, @@ -675,148 +647,151 @@ var FakeECSFQDNs = map[string]struct{}{ "api-glb-ausw2b.smoot.apple.com.": {}, "api-glb-ausw2c.smoot.apple.com.": {}, "api-mayi.django.t.taobao.com.": {}, + "api-mifit-us2.zepp.com.": {}, + "api-mifit-us3.zepp.com.": {}, + "api-mp.muslimpro.com.": {}, + "api-na1.hubspot.com.": {}, "api-php1-ovh.keepsolid.com.": {}, "api-php2-ovh.keepsolid.com.": {}, "api-php3-ovh.keepsolid.com.": {}, "api-php4-ovh.keepsolid.com.": {}, - "api-php8-ovh.keepsolid.com.": {}, "api-pos.titank12.com.": {}, "api-preview.luckyorange.com.": {}, - "api-sec-us.didiglobal.com.": {}, "api-sh.django.t.taobao.com.gds.alibabadns.com.": {}, - "api-v2.chimebank.com.": {}, - "api.abcsinsights.com.": {}, + "api-skytone-6-drcn.cloud.dbankcloud.cn.": {}, "api.adquery.io.": {}, "api.ams.gcc.teams.microsoft.com.": {}, "api.asm.skype.com.": {}, - "api.aty7j.com.": {}, + "api.bobble.ai.": {}, "api.bosch-wdw.com.": {}, "api.box.com.": {}, "api.btloader.com.": {}, - "api.bytello.com.": {}, "api.cloud.tenda.com.cn.": {}, - "api.cnxdserv.com.": {}, "api.config-security.com.": {}, "api.crobox.com.": {}, "api.crush.163.com.": {}, - "api.dashlane.com.": {}, + "api.dealersocket.com.": {}, "api.deepl.com.": {}, "api.do.buienalarm.nl.": {}, - "api.eagllwin.com.": {}, "api.easeus.com.": {}, - "api.foxnews.com.": {}, "api.gleap.io.": {}, "api.gravitec.media.": {}, "api.grow.me.": {}, + "api.hetangsmart.com.": {}, "api.icalendars.app.": {}, "api.inboxsdk.com.": {}, "api.k.163.com.": {}, + "api.kinogram.best.": {}, "api.lightboxcdn.com.": {}, + "api.lululemon.com.": {}, "api.lytics.io.": {}, + "api.mida.so.": {}, + "api.mintkeyboard.com.": {}, "api.moyoung.com.": {}, "api.mrg.agency.": {}, "api.my.jbi.global.": {}, "api.onedrive.com.": {}, - "api.oxcok.com.": {}, "api.permutive.app.": {}, "api.permutive.com.": {}, "api.pgf-asw0zz.com.": {}, + "api.pgf-thek63.com.": {}, "api.playlnk.io.": {}, "api.popin.cc.": {}, + "api.protonmail.ch.": {}, "api.pushbullet.com.": {}, + "api.qsg1h.com.": {}, "api.queryly.com.": {}, "api.rethinkad.com.": {}, "api.reverso.net.": {}, - "api.rewards.brave.com.": {}, "api.ringcentral.biz.": {}, "api.rollbar.com.": {}, - "api.sbz.vn.": {}, "api.smartdeploy.com.": {}, "api.snapchat.com.": {}, + "api.statsig.com.": {}, "api.streak.com.": {}, + "api.surfshark.com.": {}, "api.swishapps.ai.": {}, "api.t3be3280.pw.adn.cloud.": {}, - "api.trackpush.com.": {}, + "api.timehop.com.": {}, "api.transitapp.com.": {}, "api.tuisong.baidu.com.": {}, - "api.ultimaker.com.": {}, "api.ultimate-guitar.com.": {}, + "api.un41h.com.": {}, "api.unity.com.": {}, "api.userlike.com.": {}, - "api.vfipayna2.com.": {}, "api.vieon.vn.": {}, - "api.workjam.com.": {}, + "api.vivoglobal.com.": {}, "api000.backblazeb2.com.": {}, "api001.backblazeb2.com.": {}, "api002.backblazeb2.com.": {}, - "api004.backblazeb2.com.": {}, "api3.aoneroom.com.": {}, + "apigroupinc-my.sharepoint.com.": {}, "apiisgp.ezvizlife.com.": {}, "apiisgp.hik-connect.com.": {}, - "apis.discover.com.": {}, - "apituner.ecbsn.com.": {}, + "apis.halifax-online.co.uk.": {}, "apk.v-mate.mobi.": {}, "apk.vidmate.net.": {}, - "apne.pp.riotgames.com.": {}, "app-atl.five9.com.": {}, "app-eu1.hubspot.com.": {}, "app-goal.com.": {}, "app-scl.five9.com.": {}, + "app-sec-cn.heytapmobi.com.": {}, + "app-student.atitesting.com.": {}, "app.adoric-om.com.": {}, "app.box.com.": {}, "app.cart-bot.net.": {}, "app.cybba.solutions.": {}, - "app.exitbee.com.": {}, "app.grow.me.": {}, "app.paces.jbi.global.": {}, "app.pendo.qgenda.com.": {}, - "app.qbo.intuit.com.": {}, "app.retinavue.net.": {}, "app.sealsubscriptions.com.": {}, "app.snapchat.com.": {}, - "app.talkjs.com.": {}, + "app.sproutsocial.com.": {}, "app.trustev.com.": {}, + "app.updates.digicert.com.": {}, "app.wdesk.com.": {}, - "app.ynab.com.": {}, "app.zoom.us.": {}, "appcafe.gtm.starbucks.com.": {}, "appcafe.starbucks.com.": {}, "appconf.mail.163.com.": {}, - "appcontent.collegeboard.org.": {}, - "appgrowth.com.": {}, - "appicad.net.": {}, - "appleid.apple.com.": {}, + "appocean.media.": {}, "apponline.research.qq.com.": {}, + "appriver.com.": {}, + "apps.gov.powerapps.us.": {}, "apps.wix.com.": {}, "appstoreonrt-stsdk.vivo.com.cn.": {}, "appstoreort-stsdk.vivo.com.cn.": {}, - "apptrack.wrike.com.": {}, + "apse1-red.pp.sgp.pvp.net.": {}, "apv-launcher.minute.ly.": {}, "apv-static.minute.ly.": {}, "apv-static.tldw.me.": {}, "ar2fnu-launches.appsflyersdk.com.": {}, - "arbigo.com.": {}, + "aranera.com.": {}, + "ard.bmj.com.": {}, "ardenthealthservices-my.sharepoint.com.": {}, + "ardenthealthservices.sharepoint.com.": {}, "arenabg.com.": {}, "aristotleinsight.com.": {}, "arkdhs-my.sharepoint.com.": {}, - "arkrecode.ero-labs.website.": {}, + "arm1.maxhost.io.": {}, "armh-my.sharepoint.com.": {}, "armh.sharepoint.com.": {}, + "armmf.adobe.com.": {}, "arms-retcode-sg.aliyuncs.com.": {}, "arms-retcode.aliyuncs.com.": {}, + "arms.aliyuncs.com.": {}, "armstrongceilings-my.sharepoint.com.": {}, "arnoldclark1-my.sharepoint.com.": {}, "arthrex-my.sharepoint.com.": {}, "arup-my.sharepoint.com.": {}, + "arup.sharepoint.com.": {}, + "arupapc-my.sharepoint.com.": {}, "as-api.asm.skype.com.": {}, "as-prod.asyncgw.teams.microsoft.com.": {}, - "as.xiaohongshu.com.": {}, "asheville.remotepc.com.": {}, "asia-001.azure-apim.net.": {}, "asia-adlog.vivoglobal.com.": {}, - "asia-album-api.vivoglobal.com.": {}, - "asia-assistant-sports.vivoglobal.com.": {}, "asia-browser.vivoglobal.com.": {}, "asia-browserplat.vivoglobal.com.": {}, "asia-config-appstore.vivoglobal.com.": {}, @@ -846,6 +821,7 @@ var FakeECSFQDNs = map[string]struct{}{ "asia-vgcmdm-api-tha.vivoglobal.com.": {}, "asia-vnote.vivoglobal.com.": {}, "asia-vpushonrt-stsdk.vivoglobal.com.": {}, + "asia-vpushort-stsdk.vivoglobal.com.": {}, "asia-weather.vivoglobal.com.": {}, "asia-wifi.vivoglobal.com.": {}, "asia.remotepc.com.": {}, @@ -861,13 +837,10 @@ var FakeECSFQDNs = map[string]struct{}{ "aspect-upush.umeng.com.": {}, "asset.fwcdn3.com.": {}, "asset.fwpub1.com.": {}, - "assets.adobedtm.com.": {}, + "assets.a-mo.net.cdn.cloudflare.net.": {}, "assets.api.stairwell.com.": {}, "assets.apps.pa.gov.": {}, - "assets.bale.ai.": {}, - "assets.connatix.com.": {}, "assets.fastly.carvana.io.": {}, - "assets.staples-static.com.": {}, "assets.the-independent.com.": {}, "assets0.procore.com.": {}, "assets1.procore.com.": {}, @@ -885,24 +858,27 @@ var FakeECSFQDNs = map[string]struct{}{ "atlanta2.remotepc.com.": {}, "atlanta3.remotepc.com.": {}, "atlanta4.remotepc.com.": {}, + "atolin.ru.": {}, "atriaseniorliving-my.sharepoint.com.": {}, "au-prod.asyncgw.teams.microsoft.com.": {}, + "auburnschools-my.sharepoint.com.": {}, "auckland.remotepc.com.": {}, "audid.umeng.com.": {}, "audio.vivintsky.com.": {}, + "audioscrobbler.com.": {}, "audiostatlog.cc.easebar.com.": {}, "auth-asg-en.aliyuncs.com.": {}, + "auth.bereal.com.": {}, "auth.bereal.team.": {}, "auth.hulu.com.": {}, - "auth.ichano.cn.": {}, "auth.jbisumari.org.": {}, + "auth.riotgames.com.cdn.cloudflare.net.": {}, "automate.itsasap.com.": {}, "autonavi.com.": {}, + "autotrack.studyquicks.com.": {}, "avalanche.autotrader.co.uk.": {}, - "avn.innity.com.": {}, - "avs-alexa-14-na.amazon.com.": {}, - "axiom.co.": {}, - "az1.qualtrics.com.": {}, + "avatar-us-1.kwcdn.com.": {}, + "avis-app.quantummetric.com.": {}, "azchicago.remotepc.com.": {}, "azchicago2.remotepc.com.": {}, "azdcs-my.sharepoint.com.": {}, @@ -910,17 +886,18 @@ var FakeECSFQDNs = map[string]struct{}{ "azmatch.adsrvr.org.": {}, "azureford-my.sharepoint.com.": {}, "azureford.sharepoint.com.": {}, - "b.ns.c10r.facebook.com.": {}, - "b.ns.cdn.whatsapp.net.": {}, - "b.ns.xx.fbcdn.net.": {}, + "azwus1-client-s.gateway.messenger.live.com.": {}, + "b.fssta.com.": {}, + "b.tile.openstreetmap.org.": {}, "b.tile.osm.org.": {}, + "babico.name.tr.": {}, "bablosoft.com.": {}, "backend-l.deepl.com.": {}, "badambiz.com.": {}, "badoo.app.": {}, "bahrain.remotepc.com.": {}, + "baike.com.": {}, "baishan-cloud.net.": {}, - "bale.ai.": {}, "ballstate-my.sharepoint.com.": {}, "baltimore.remotepc.com.": {}, "bam.nr-data.net.cdn.cloudflare.net.": {}, @@ -935,17 +912,19 @@ var FakeECSFQDNs = map[string]struct{}{ "baptisthealth.sharepoint.com.": {}, "barstoolsports.com.": {}, "basised-my.sharepoint.com.": {}, - "basspro-app.quantummetric.com.": {}, - "basspro-my.sharepoint.com.": {}, - "basspro.sharepoint.com.": {}, "batch.pbisrewards.com.": {}, "bb.eight-cdn.com.": {}, - "bbw-app.quantummetric.com.": {}, "bd1cec50-00d1-4ce9-9572-785857419a1e.prmutv.co.": {}, + "bdpnt-my.sharepoint.com.": {}, + "bdpnt.sharepoint.com.": {}, + "bdreporting.com.": {}, + "be.nortic.ogtic.gob.do.": {}, "beacon-api.aliyuncs.com.": {}, + "beacon-sin1.rubiconproject.com.": {}, "beacon.qq.com.": {}, "beacons4.gvt2.com.": {}, "beacons5.gvt2.com.": {}, + "beam.vivintsky.com.": {}, "becn-my.sharepoint.com.": {}, "becn.sharepoint.com.": {}, "becpsn-my.sharepoint.com.": {}, @@ -954,8 +933,10 @@ var FakeECSFQDNs = map[string]struct{}{ "belgium.remotepc.com.": {}, "belgrad.remotepc.com.": {}, "bend.remotepc.com.": {}, - "bergankdv.com.": {}, + "berryglobal-my.sharepoint.com.": {}, + "betting-api.onefootball.com.": {}, "bgtfs.transitapp.com.": {}, + "bhsjaxinc0-my.sharepoint.com.": {}, "bidder.adquery.io.": {}, "bifrost.vivaldi.com.": {}, "bik.gov.tr.": {}, @@ -964,7 +945,7 @@ var FakeECSFQDNs = map[string]struct{}{ "bisdus-my.sharepoint.com.": {}, "bitwarden.com.": {}, "bkdllp-my.sharepoint.com.": {}, - "bl.listrakbi.com.cdn.cloudflare.net.": {}, + "bkdllp.sharepoint.com.": {}, "bl6pap003.storage.live.com.": {}, "bl6pap003files.storage.live.com.": {}, "bl6pap004.storage.live.com.": {}, @@ -972,37 +953,31 @@ var FakeECSFQDNs = map[string]struct{}{ "black-cat.crypto.com.": {}, "blackboard.com.": {}, "blackbox.dropbox-dns.com.": {}, - "blk-app.com.": {}, "blocksi-screenshots-us.s3.us-east-005.backblazeb2.com.": {}, "blooket.com.multicdn.cloudinary.com.": {}, - "bloombergdfpcw4670778881.s.moatpixel.com.": {}, + "blueshieldca-my.sharepoint.com.": {}, "blueshieldca.sharepoint.com.": {}, "bluffdale.remotepc.com.": {}, "blz04pap001.storage.live.com.": {}, "blz04pap001files.storage.live.com.": {}, "blz04pap002.storage.live.com.": {}, - "blz04pap002files.storage.live.com.": {}, "blz04pap003.storage.live.com.": {}, - "blz04pap003files.storage.live.com.": {}, "blz04pap004.storage.live.com.": {}, "blz04pap005.storage.live.com.": {}, - "blz04pap005files.storage.live.com.": {}, "blz04pap006.storage.live.com.": {}, - "blz04pap006files.storage.live.com.": {}, "bmaus.bumble.com.": {}, "bmoolbb-app.quantummetric.com.": {}, "bmrn-my.sharepoint.com.": {}, "bmrn.sharepoint.com.": {}, "bn02pap001.storage.live.com.": {}, "bn02pap001files.storage.live.com.": {}, - "bn02pap090files.storage.live.com.": {}, - "bn1ap000files.storage.live.com.": {}, "bn1files.storage.live.com.": {}, "bn3pap090files.storage.live.com.": {}, "bna365-my.sharepoint.com.": {}, "bnz05pap001.storage.live.com.": {}, "bnz05pap001files.storage.live.com.": {}, "bnz05pap002.storage.live.com.": {}, + "bnz05pap002files.storage.live.com.": {}, "bnz06pap001.storage.live.com.": {}, "bnz06pap001files.storage.live.com.": {}, "bnz06pap002.storage.live.com.": {}, @@ -1013,13 +988,12 @@ var FakeECSFQDNs = map[string]struct{}{ "bnz06pap004files.storage.live.com.": {}, "bnz07pap001.storage.live.com.": {}, "bnz07pap001files.storage.live.com.": {}, + "bobble.ai.": {}, "books-analytics-events.apple.com.": {}, - "books-personalization-server.apple.com.": {}, "booksy.com.": {}, "bootstrapcdn.com.": {}, "borgwarner-my.sharepoint.com.": {}, "borgwarner.sharepoint.com.": {}, - "bosecorp-my.sharepoint.com.": {}, "boston.remotepc.com.": {}, "boston2.remotepc.com.": {}, "bostonglobe.com.": {}, @@ -1033,14 +1007,14 @@ var FakeECSFQDNs = map[string]struct{}{ "brenntag01-my.sharepoint.com.": {}, "brenntag01.sharepoint.com.": {}, "brenntag01nam-my.sharepoint.com.": {}, + "brenntag01nam.sharepoint.com.": {}, "bridge2bwb.com.": {}, + "bridgetonorg-my.sharepoint.com.": {}, "broadstreetads.com.": {}, - "brocktonpublicschools-my.sharepoint.com.": {}, - "bryantu-my.sharepoint.com.": {}, "bscedge.com.": {}, - "bshr.ezodn.com.": {}, "bsprings.remotepc.com.": {}, "bt.moack.co.kr.": {}, + "bthfa.jenzabarcloud.com.": {}, "btrace.qq.com.": {}, "bucharest.remotepc.com.": {}, "bucharest1.remotepc.com.": {}, @@ -1050,33 +1024,29 @@ var FakeECSFQDNs = map[string]struct{}{ "bugreport.huorong.cn.": {}, "bundler.nice-team.net.": {}, "bunny.net.": {}, - "burningmay.info.": {}, + "burbankschooldistrict111-my.sharepoint.com.": {}, "burnsmcd-my.sharepoint.com.": {}, "burnsmcd.sharepoint.com.": {}, - "business.apple.com.": {}, + "businesswire.com.": {}, "bw1-my.sharepoint.com.": {}, "bw1.sharepoint.com.": {}, "bwatch.bergankdv.com.": {}, "bytecdn.cn.": {}, "bytedance.net.": {}, - "bytello.com.": {}, "c.4dex.io.": {}, "c.fakespot.io.": {}, "c.footprint.net.": {}, - "c.ns.c10r.facebook.com.": {}, - "c.ns.xx.fbcdn.net.": {}, "c.pub.network.": {}, "c.tile.openstreetmap.org.": {}, + "c.tile.osm.org.": {}, "c1.ttcache.com.": {}, - "c104216-dcdn.mp.lura.live.": {}, "c2.ttcache.com.": {}, "c2c.wechat.com.": {}, "c3.ttcache.com.": {}, "c4.ttcache.com.": {}, - "c4cfly.rbxcdn.com.": {}, - "c4cstatic.hana.ondemand.com.": {}, "c7l.cyberhaven.io.": {}, "ca-prod.asyncgw.teams.microsoft.com.": {}, + "ca-tor-anx-r005.router.teamviewer.com.": {}, "ca.gov.": {}, "ca000.backblaze.com.": {}, "ca001.backblaze.com.": {}, @@ -1084,93 +1054,81 @@ var FakeECSFQDNs = map[string]struct{}{ "ca80a1adb12a4fbdac5ffcbc944e9a61.pacloudflare.com.": {}, "cachenetworks.com.": {}, "cachingserviceapimpme.azure-api.net.": {}, - "caeportal-my.sharepoint.com.": {}, "cainiao.com.": {}, "caixa.gov.br.": {}, - "cajacr-my.sharepoint.com.": {}, - "cajacr.sharepoint.com.": {}, "california.remotepc.com.": {}, "california2.remotepc.com.": {}, "caltech.edu.": {}, - "camoe.cn.": {}, "camsoda.com.": {}, "canada.remotepc.com.": {}, "canberra.remotepc.com.": {}, "capetown.remotepc.com.": {}, - "car-cloud-cn.net.": {}, "cardiff.remotepc.com.": {}, "cardinalcorp-my.sharepoint.com.": {}, + "care.novaicare.com.": {}, "caridisini.site.": {}, "carystudio.com.": {}, "cat.hbwrapper.com.": {}, "cat2.hbwrapper.com.": {}, "cavai.com.": {}, - "cc.trendmd.co.": {}, "ccboemd-my.sharepoint.com.": {}, + "ccf.ivalua.com.": {}, "cchmc-my.sharepoint.com.": {}, "cchmc.sharepoint.com.": {}, "ccs.umeng.com.": {}, "ccsyncuuid.net.": {}, - "cd.xdplt.com.": {}, "cdn-audio-gcp-media.getepic.com.": {}, + "cdn-c.bereal.network.": {}, + "cdn-f.heylink.me.": {}, "cdn-gcp-media-drm.getepic.com.": {}, - "cdn-gcp.getepic.com.": {}, - "cdn-goo.bereal.com.": {}, - "cdn-resize.bereal.network.": {}, - "cdn-sic.33across.com.": {}, - "cdn-static.hulu.com.": {}, - "cdn-t.vb17123filippaaniketos.pw.": {}, + "cdn-gcp-media.getepic.com.": {}, + "cdn-league-logos.theathletic.com.": {}, + "cdn-mc-eu1-fd5f74b2.bereal.network.": {}, + "cdn-t.vb24131crasosnemesis.com.": {}, "cdn-us.algoliaradar.com.": {}, "cdn-us1.bereal.network.": {}, "cdn-video-gcp-media.getepic.com.": {}, - "cdn.adjust.com.": {}, - "cdn.adlook.me.": {}, - "cdn.arstechnica.net.": {}, "cdn.bereal.network.": {}, + "cdn.ckeditor.com.": {}, "cdn.conveythis.com.": {}, - "cdn.doubleverify.com.": {}, + "cdn.deepintent.com.": {}, "cdn.fera.ai.": {}, "cdn.ftd.agency.": {}, - "cdn.getambassador.com.": {}, "cdn.groupbycloud.com.": {}, - "cdn.hubblecontent.osi.office.net.": {}, + "cdn.hw.gcloudcs.com.": {}, "cdn.instapagemetrics.com.": {}, - "cdn.izooto.com.": {}, - "cdn.knightlab.com.": {}, - "cdn.md-ace-b.online.": {}, - "cdn.ndtv.com.": {}, + "cdn.overleaf.com.": {}, + "cdn.production.dochub.com.": {}, "cdn.qq.com.": {}, "cdn.rebuyengine.com.": {}, "cdn.sierrapacificgroup.com.": {}, - "cdn.skcrtxr.com.": {}, - "cdn.special-offers.online.": {}, - "cdn.support.services.microsoft.com.": {}, "cdn.tapdb-dev.com.": {}, - "cdn.theathletic.com.": {}, "cdn.uxfeedback.ru.": {}, - "cdn0.wixdns.net.": {}, - "cdn07.boxcdn.net.": {}, - "cdn1.iconfinder.com.": {}, - "cdn1.parksmedia.wdprapps.disney.com.": {}, "cdn1.wixdns.net.": {}, - "cdnbye.com.": {}, + "cdn140.picsart.com.": {}, + "cdn26.vizury.com.": {}, + "cdn271.picsart.com.": {}, "cdnetworks.net.": {}, - "cdngarenanow-a.akamaihd.net.": {}, + "cdngeneral.rentcafe.com.": {}, "cdngslb.com.": {}, + "cdns3.gigya.com.": {}, "cdntm.hsbc.co.uk.": {}, "cdnwidget.com.": {}, - "cds.apple.com.": {}, "cds.swishapps.ai.": {}, "cdt.ca.gov.": {}, + "cdtfa.ca.gov.": {}, + "cdxdns.com.": {}, + "cdxflare.com.": {}, "cedexis-test.com.": {}, "cedock.com.": {}, "centertime.ksyun.com.": {}, "centralmichigan-my.sharepoint.com.": {}, "centrexit.com.": {}, "cfa.fidelity.com.": {}, + "cform.loyalhealth.com.": {}, "changehealthcare.com.": {}, + "channel5.com.": {}, "charlotte.remotepc.com.": {}, - "chat.openai.com.": {}, "check.unity.cn.": {}, "check2.lloydsbank.co.uk.": {}, "chennai.remotepc.com.": {}, @@ -1180,14 +1138,14 @@ var FakeECSFQDNs = map[string]struct{}{ "chi01pap002files.storage.live.com.": {}, "chicago.remotepc.com.": {}, "chicago2.remotepc.com.": {}, + "childrensmercy-my.sharepoint.com.": {}, + "childrensmercy.sharepoint.com.": {}, "chinacache.net.": {}, "chinaccl-a.haplat.net.": {}, "chinaccl-b.haplat.net.": {}, "chinaccl-c.haplat.net.": {}, - "chippewavalley-my.sharepoint.com.": {}, - "chippewavalley.sharepoint.com.": {}, "choctawnationofoklahoma-my.sharepoint.com.": {}, - "chopo-my.sharepoint.com.": {}, + "choctawnationofoklahoma.sharepoint.com.": {}, "chtsite.com.": {}, "chubbgroup-my.sharepoint.com.": {}, "chubbgroup.sharepoint.com.": {}, @@ -1202,36 +1160,38 @@ var FakeECSFQDNs = map[string]struct{}{ "cisco.sharepoint.com.": {}, "citrix.com.": {}, "cityofelpaso-my.sharepoint.com.": {}, - "ckmap.mediav.com.": {}, + "cjfgob-my.sharepoint.com.": {}, "cl-data.ads.heytapmobi.com.": {}, "cl2009.com.": {}, "claude.ai.": {}, "clearesult5-my.sharepoint.com.": {}, "clearesult5.sharepoint.com.": {}, "cleveland.remotepc.com.": {}, - "click.e.petco.com.": {}, - "click.victoriassecret.com.": {}, + "clevelandclinic-my.sharepoint.com.": {}, + "clevelandclinic.sharepoint.com.": {}, "client-log.box.com.": {}, - "client-strings.xboxlive.com.": {}, "client-tracking.omiapp.me.": {}, "client-updates.lumu.io.": {}, + "cliftonlarsonallen-my.sharepoint.com.": {}, "cliftonlarsonallen.sharepoint.com.": {}, + "cloud-config-service.rtc.aliyuncs.com.": {}, "cloud-rest.lenovomm.com.": {}, "cloud.browser.360.cn.": {}, + "cloud.huawei.asia.": {}, "cloud.ibm.com.": {}, "cloud.typenetwork.com.": {}, "cloud.vmp.onezapp.com.": {}, "cloud.zoom.us.": {}, - "cloudauth-device.aliyuncs.com.": {}, + "cloudbirds.cn.": {}, "clouddata.turbowarp.org.": {}, "cloudlinks.cn.": {}, "cloudsvc.policypak.com.": {}, "cloverparksd-my.sharepoint.com.": {}, + "cloverparksd.sharepoint.com.": {}, "cm-x.mgid.com.": {}, "cmgate.vip.qq.com.": {}, "cmpassport.com.": {}, "cms.ejoyspace.com.": {}, - "cms.thescore.com.": {}, "cn-beijing.log.aliyuncs.com.": {}, "cn-hangzhou.log.aliyuncs.com.": {}, "cn-hangzhou.oss-cdn.aliyun-inc.com.": {}, @@ -1240,71 +1200,68 @@ var FakeECSFQDNs = map[string]struct{}{ "cn.gcloudcs.com.": {}, "cn.mvconf.50union.com.": {}, "cname.pendo.io.": {}, + "cnmc-my.sharepoint.com.": {}, "cnmc.sharepoint.com.": {}, "cnv2.mclean.50union.com.": {}, "cnzz.com.": {}, + "co-vcode-od.vivoglobal.com.": {}, "co.amx.rcs.telephony.goog.": {}, - "cocoapi.bmwgroup.com.": {}, - "cocoapi.bmwgroup.us.": {}, + "codacloud.net.": {}, "code.etracker.com.": {}, - "codepush.akulaku.net.": {}, "codis-bak.ngb.haplat.net.": {}, "codis.ngb.haplat.net.": {}, "cofile.net.": {}, + "cohnreznick-my.sharepoint.com.": {}, + "cohnreznick.sharepoint.com.": {}, "collect-v6.51.la.": {}, + "collect.trendyol.com.": {}, + "collector-api.frspecifics.com.": {}, "collector.wdp.brave.com.": {}, "colliervilleschools-my.sharepoint.com.": {}, "columbus.remotepc.com.": {}, "columbusk12oh-my.sharepoint.com.": {}, "columbusk12oh.sharepoint.com.": {}, - "com-healthgrade.netmng.com.": {}, "com.multicdn.cloudinary.com.": {}, "com.yangyi19.com.": {}, - "com.zjgslb.com.": {}, - "cometglobal.cf.t3cloud.pb.com.": {}, "cometservd1.pb.com.": {}, "commerce.safe.360.cn.": {}, "commercial.ocsp.identrust.com.": {}, "common-afd.fe.1drv.com.": {}, "common-afdrk.fe.1drv.com.": {}, "common.xshareapp.com.": {}, - "company.rt.ru.": {}, + "compass.corebridgefinancial.com.": {}, "compiles.overleafusercontent.com.": {}, - "computerhelpnj.com.": {}, - "comserver.eu1.mspa.n-able.com.": {}, "config-inmobi-comtm.trafficmanager.net.": {}, - "config-junion.jpush.cn.": {}, "config-security.com.": {}, "config.a-m-p.xyz.": {}, "config.inmobi.com.": {}, "config.office.net.": {}, - "config.reasonsecurity.com.": {}, "config.y5en.com.": {}, + "config2.cmpassport.com.": {}, "configdl.teamviewer.com.": {}, "conn-service-cn-03.allawntech.com.": {}, "connect.garenanow.com.": {}, - "consentcdn.cookiebot.com.": {}, + "connectivitycheck.unisoc.com.": {}, "consist.co.il.": {}, "constel1-my.sharepoint.com.": {}, + "constel1.sharepoint.com.": {}, + "consumer-pepsico.okta.com.": {}, + "content-management-files.canva.com.": {}, "content.citizensbankonline.com.": {}, "content.discover.com.": {}, "content.discovercard.com.": {}, "content.ebanking-services.com.": {}, "content.gap.com.": {}, - "content.ibanking-services.com.": {}, + "content.lloydsbankinggroup.com.": {}, "content.maxconnector.com.": {}, "content.production.cdn.art19.com.": {}, "content.ssctech.com.": {}, - "content.usaa.com.": {}, - "content22.bancanet.banamex.com.": {}, "content22.bmo.com.": {}, "content22.citibankonline.com.": {}, "content22.citicards.com.": {}, "content22.online.citi.com.": {}, "context.reverso.net.": {}, "control-out.mna.qq.com.": {}, - "conversion-assistant.apps.seabroadnet.com.": {}, - "conveythis.com.": {}, "cookie-sync.bidmyadz.com.": {}, "coolkit.cc.": {}, "copenhagen.remotepc.com.": {}, @@ -1313,8 +1270,12 @@ var FakeECSFQDNs = map[string]struct{}{ "core.gssv-play-prod.xboxlive.com.": {}, "core.iprom.net.": {}, "core.omiapp.me.": {}, - "coresite.mm.fcix.net.": {}, - "corndel.aptem.co.uk.": {}, + "corebridgefinancial-my.sharepoint.com.": {}, + "covers.vitalbook.com.": {}, + "coxauto.okta.com.": {}, + "cp.az.hmgroup.com.": {}, + "cp2.cloudflare.com.": {}, + "cpm.appocean.media.": {}, "cpm.aserve1.net.": {}, "cpm.qortex.ai.": {}, "cpm.vuukle.net.": {}, @@ -1332,7 +1293,6 @@ var FakeECSFQDNs = map[string]struct{}{ "crowd.transitapp.com.": {}, "crowncastle-my.sharepoint.com.": {}, "crowncastle.sharepoint.com.": {}, - "croxyproxy.com.": {}, "crush.163.com.": {}, "crutchfield.com.": {}, "cs.globalsun.io.": {}, @@ -1341,23 +1301,21 @@ var FakeECSFQDNs = map[string]struct{}{ "cstse02.ultipro.com.": {}, "cstsew02.ultipro.com.": {}, "cstsn02.ultipro.com.": {}, + "ct.pinterest.com.": {}, "cta-eu1.hubspot.com.": {}, - "ctm.server.absolute.com.": {}, "cuco.softi9.pt.": {}, + "cummins365-my.sharepoint.com.": {}, "cummins365.sharepoint.com.": {}, + "cunamutual-my.sharepoint.com.": {}, + "cunamutual.sharepoint.com.": {}, + "cust-dv.zentrick.com.": {}, "customer.homedepot.com.": {}, - "customerfeedback.superunlimited.com.": {}, - "cvs.quantummetric.com.": {}, "cwc-my.sharepoint.com.": {}, "cwc.sharepoint.com.": {}, "cx.soft.360.cn.": {}, - "cxcs.cdn.office.net.edgekey.net.": {}, + "cx732.com.": {}, "czechrepublic.remotepc.com.": {}, - "d.applvn.com.": {}, "d.docs.live.net.": {}, - "d.nativendo.de.": {}, - "d.ns.c10r.facebook.com.": {}, - "d.ns.xx.fbcdn.net.": {}, "d.pub.network.": {}, "d2fb08da-1c03-4c8a-978f-ad8a96b4c31f.partner.permutive.app.": {}, "d2fb08da-1c03-4c8a-978f-ad8a96b4c31f.prmutv.co.": {}, @@ -1367,6 +1325,8 @@ var FakeECSFQDNs = map[string]struct{}{ "d6691a17-6fdb-4d26-85d6-b3dd27f55f08.prmutv.co.": {}, "d82f7a30-751a-4689-b7e9-19336a89ab46.prmutv.co.": {}, "d837da8d.cloudsrv.minerva-labs.com.": {}, + "d9npma-inapps.appsflyersdk.com.": {}, + "da.toponadss.com.": {}, "daemon.nanoleaf.me.": {}, "daf.xp.apple.com.": {}, "dallas.remotepc.com.": {}, @@ -1380,7 +1340,6 @@ var FakeECSFQDNs = map[string]struct{}{ "dantri.com.vn.": {}, "darden-sync.quantummetric.com.": {}, "data-detect.nie.easebar.com.": {}, - "data-feed.flightradar24.com.": {}, "data.analytics.thomsonreuters.com.": {}, "data.analytics.ux.quickbase.com.": {}, "data.assist.chromeriver.com.": {}, @@ -1392,15 +1351,18 @@ var FakeECSFQDNs = map[string]struct{}{ "data.data.mheducation.com.": {}, "data.guide-app.zoominfo.co.": {}, "data.guides.oncoursesystems.com.": {}, - "data.guides.patreon.com.": {}, "data.guides.percipio.com.": {}, "data.guides.wdesk.com.": {}, "data.hockeystack.com.": {}, + "data.investing.com.": {}, "data.ipd.goto.com.": {}, "data.kuiniuca.com.": {}, "data.meitu.com.": {}, + "data.pendo-cdn.pluralsight.com.": {}, + "data.pendo-cobalt.westlaw.com.": {}, "data.pendo-tracking.seismic.com.": {}, "data.pendo.careporthealth.com.": {}, + "data.pendo.gomotive.com.": {}, "data.pendo.looker.app.": {}, "data.pendo.navimedix.com.": {}, "data.pendo.progresslearning.com.": {}, @@ -1411,85 +1373,82 @@ var FakeECSFQDNs = map[string]struct{}{ "data.tracking.billtrust.com.": {}, "data00.adlooxtracking.com.": {}, "datamma.guides.nelnet.com.": {}, - "datasec-kmsex-cn.heytapmobi.com.": {}, "datasite.com.": {}, + "datatechdrift.com.": {}, "datatheorem.com.": {}, - "datto.com.": {}, + "db.onlinewebfonts.com.": {}, "db3pap002.storage.live.com.": {}, "db3pap003.storage.live.com.": {}, "db3pap004.storage.live.com.": {}, - "db3pap005.storage.live.com.": {}, "db3pap006.storage.live.com.": {}, "db3pap007.storage.live.com.": {}, "db5pap001.storage.live.com.": {}, - "dc-o.api.leiniao.com.": {}, "dc.di.atlas.samsung.com.": {}, "dc.dqa.samsung.com.": {}, "dc.wondershare.com.": {}, - "dci.sophosupd.net.": {}, - "dcs-live-uc1.mp.lura.live.": {}, - "dcs-live-ue1.mp.lura.live.": {}, - "dcs-live-ue4.mp.lura.live.": {}, - "dcs-live-uw1.mp.lura.live.": {}, "dcs-live.mp.lura.live.": {}, - "dcs-mcdn.mp.lura.live.": {}, "dcs-png.mp.lura.live.": {}, "dcs-vod.mp.lura.live.": {}, - "dcs.mp.lura.live.": {}, + "dcs110-mcdn.mp.lura.live.": {}, "dd.browser.360.cn.": {}, + "dd.meituan.com.": {}, "ddata.huntingtonbank.com.": {}, - "de-core.iprom.net.": {}, + "dds.autodesk.com.": {}, "de-idm.api.io.mi.com.": {}, "de-prod.asyncgw.teams.microsoft.com.": {}, "de.dt.rcs.telephony.goog.": {}, + "dealer.autopartners.net.": {}, "dealmoon.com.": {}, + "decagon.ai.": {}, "deepl.com.": {}, - "deliver.feedify.org.": {}, - "delivery-integration.myq-cloud.com.": {}, + "deliveroo.com.": {}, + "delivery.api.getadmiral.com.": {}, "delivery.upremium.asia.": {}, - "deliveryhero.io.": {}, "dell-prod.actioniq.mr-in.com.": {}, - "delta-app.quantummetric.com.": {}, - "delta-sync.quantummetric.com.": {}, "delta.quantummetric.com.": {}, + "demant-my.sharepoint.com.": {}, "demant.sharepoint.com.": {}, + "demeter-int-ecom-collect.trendyol.com.": {}, "dentonstudent-my.sharepoint.com.": {}, "denver.remotepc.com.": {}, - "deploy.preveil.com.": {}, - "desmoines.remotepc.com.": {}, "dev2.keepsolid.com.": {}, "deviceops.hstgps.com.": {}, "dewmobile.net.": {}, "dfaklj.tech.": {}, + "dfamilk-my.sharepoint.com.": {}, "dfamilk.sharepoint.com.": {}, + "dfme.kleinanzeigen.de.": {}, + "dialpad.com.": {}, "dickssportinggoods-app.quantummetric.com.": {}, + "dickssportinggoods-sync.quantummetric.com.": {}, "dict.deepl.com.": {}, + "dict.ntes53.netease.com.": {}, + "dictvip-business.youdao.com.": {}, "digiapp.vietcombank.com.vn.": {}, "digiboy.ir.": {}, + "diligent.count.ly.": {}, "dingtalk.com.": {}, "dir.4.401402081.west-gcloud.codm.activision.com.": {}, + "direct.quic-proxy-gcpsg-v3.gcpsg.byteglb.com.": {}, "discovery.ringcentral.biz.": {}, - "dispatcher.factset.com.": {}, "dispatcher.omiapp.me.": {}, "dispatchosglobal.yuanshen.com.": {}, - "display.popt.in.": {}, - "displaynote.com.": {}, "distservp1.pb.com.": {}, - "dl.acronis.com.cdn.cloudflare.net.": {}, "dl.boxcloud.com.": {}, + "dl.gmx.ch.": {}, "dls-udc.dqa.samsung.com.": {}, + "dls.di.atlas.samsung.com.": {}, "dm-us.hybrid.ai.": {}, "dm1files.storage.live.com.": {}, "dm2pap090files.storage.live.com.": {}, - "dmp.nativendo.de.": {}, - "dmp.suntcontent.se.": {}, + "dmongo.adgrid.io.": {}, + "dns-e.ns4v.icu.": {}, "dns-tunnel-check.googlezip.net.": {}, "dns.alidns.com.": {}, - "dns.jdbcdn.net.": {}, "dns101.register.com.": {}, "dns23.llnwi.net.": {}, - "dns24.llnwi.net.": {}, "doceditor.wrike.com.": {}, + "docer-api.wps.cn.": {}, "docs.live.net.": {}, "document360.io.": {}, "domaincfg.vivoglobal.com.": {}, @@ -1498,11 +1457,13 @@ var FakeECSFQDNs = map[string]struct{}{ "donewyork1.remotepc.com.": {}, "donewyork2.remotepc.com.": {}, "donewyork3.remotepc.com.": {}, - "doppiocdn.net.": {}, + "dorchester2-my.sharepoint.com.": {}, + "dorchester2.sharepoint.com.": {}, "dosfo1.remotepc.com.": {}, "dosfo2.remotepc.com.": {}, "download.2.401402081.west-gcloud.codm.activision.com.": {}, - "download.autodesk.com.": {}, + "download.avira.com.": {}, + "download.teamviewer.com.": {}, "downloadcenter.genetec.com.": {}, "downloads.vivaldi.com.": {}, "dp.barclaysus.com.": {}, @@ -1512,14 +1473,12 @@ var FakeECSFQDNs = map[string]struct{}{ "dpool.sina.com.cn.": {}, "dprprod-my.sharepoint.com.": {}, "dprprod.sharepoint.com.": {}, - "dps.jp.cinarra.com.": {}, "dr.netease.im.": {}, + "dragate-cn.dc.heytapmobi.com.": {}, "drfdisvc.walmart.com.": {}, "drfirst.com.": {}, - "drm.mp.lura.live.": {}, - "drops-register.ubi.com.": {}, + "drsquatch.com.": {}, "dsa-eu.hybrid.ai.": {}, - "dsg.bio.": {}, "dsm01pap001.storage.live.com.": {}, "dsm01pap001files.storage.live.com.": {}, "dsm01pap002.storage.live.com.": {}, @@ -1545,6 +1504,7 @@ var FakeECSFQDNs = map[string]struct{}{ "dsm04pap002files.storage.live.com.": {}, "dsm04pap003.storage.live.com.": {}, "dsm04pap003files.storage.live.com.": {}, + "dsp.tec-do.cn.": {}, "dss.hybrid.ai.": {}, "dstillery.com.": {}, "dtscout.com.": {}, @@ -1555,19 +1515,16 @@ var FakeECSFQDNs = map[string]struct{}{ "dub06pap001.storage.live.com.": {}, "dub07pap001.storage.live.com.": {}, "dub07pap002.storage.live.com.": {}, - "dub07pap003.storage.live.com.": {}, "dubai.remotepc.com.": {}, "dublin.remotepc.com.": {}, "dun.163yun.com.": {}, - "dwhyn.top.": {}, - "dynaimage.cdn.cnn.com.": {}, + "dv.extremereach.com.": {}, "dypnsapi.aliyuncs.com.": {}, "dz.cyberhaven.io.": {}, + "e-10220.adzerk.net.": {}, "e-189.21cn.com.": {}, "e.189.cn.": {}, - "e.calibermind.com.": {}, "e.cdnwidget.com.": {}, - "e.petco.com.": {}, "e.userflow.com.": {}, "e.viously.com.": {}, "e1cef1f0-495f-4973-ba1c-880786e73a66.prmutv.co.": {}, @@ -1641,6 +1598,13 @@ var FakeECSFQDNs = map[string]struct{}{ "e2c70.gcp.gvt2.com.": {}, "e2c71.gcp.gvt2.com.": {}, "e2c72.gcp.gvt2.com.": {}, + "e2c73.gcp.gvt2.com.": {}, + "e2c74.gcp.gvt2.com.": {}, + "e2c75.gcp.gvt2.com.": {}, + "e2c76.gcp.gvt2.com.": {}, + "e2c77.gcp.gvt2.com.": {}, + "e2c78.gcp.gvt2.com.": {}, + "e2c79.gcp.gvt2.com.": {}, "e2c8.gcp.gvt2.com.": {}, "e2c9.gcp.gvt2.com.": {}, "e2cs01.gcp.gvt2.com.": {}, @@ -1707,21 +1671,20 @@ var FakeECSFQDNs = map[string]struct{}{ "eagle-my.sharepoint.com.": {}, "eagle.sharepoint.com.": {}, "eago9.cyberhaven.io.": {}, + "eap-log-cn.allawntech.com.": {}, + "easemob.com.": {}, "easeus.com.": {}, "eastmoney.com.": {}, "eastus2-gas.guestconfiguration.azure.com.": {}, - "eb.cently.com.": {}, "ebaypay-app.quantummetric.com.": {}, "ebaypay-sync.quantummetric.com.": {}, - "ec.instapagemetrics.com.": {}, "ecatholic.com.": {}, "ecom.wixapps.net.": {}, "ecommerce.iap.unity3d.com.": {}, "ecs-gallatin-c2s.trafficmanager.net.": {}, - "edge-iad.txryan.com.": {}, - "edge-pdx.txryan.com.": {}, + "edba.brealtime.com.": {}, "edge.api.brightcove.com.": {}, - "edge.zimperium.com.": {}, + "edge.txryan.com.": {}, "edgecdn.ru.": {}, "edgedl.me.gvt1.com.": {}, "edgelocation.ivanticloud.com.": {}, @@ -1729,6 +1692,8 @@ var FakeECSFQDNs = map[string]struct{}{ "edisonintl.sharepoint.com.": {}, "editor.wix.com.": {}, "editorial.femaledaily.com.": {}, + "education-certification.youdao.com.": {}, + "eduinsightacademy.com.": {}, "efercro.com.": {}, "efs.ultipro.com.": {}, "egateway.ultipro.com.": {}, @@ -1736,62 +1701,62 @@ var FakeECSFQDNs = map[string]struct{}{ "ehmc.sharepoint.com.": {}, "eisaihhc-my.sharepoint.com.": {}, "ejoyspace.com.": {}, - "ek6rpv-launches.appsflyersdk.com.": {}, + "ek6rpv-cdn-settings.appsflyersdk.com.": {}, "elal-service.consist.co.il.": {}, "elaracaring-my.sharepoint.com.": {}, "ele.me.": {}, "elemecdn.com.": {}, - "ellingtoncms.com.": {}, - "em.journeys.com.": {}, + "elonuniversity-my.sharepoint.com.": {}, + "em-tr4ck-settings.airtrfx.com.": {}, "email.plumbenefits.com.": {}, "email.ticketsatwork.com.": {}, "emailaptitude.com.": {}, - "emailsignatures365-addin.codetwo.com.": {}, "emerson-my.sharepoint.com.": {}, "emerson.sharepoint.com.": {}, "emo.v-mate.mobi.": {}, "empirecat-my.sharepoint.com.": {}, - "en.gifshow.com.": {}, "endpointprotector.com.": {}, "engage.wixapps.net.": {}, "engagementapi.skype.com.": {}, + "engine.monetate.net.": {}, "ent.box.com.": {}, "enterprise-app.quantummetric.com.": {}, "envoy-ios-prod.getepic.com.": {}, - "ep.bale.ai.": {}, + "envysion.com.": {}, "epic1-my.sharepoint.com.": {}, "epic1.sharepoint.com.": {}, - "eplists.xboxlive.com.": {}, + "epicmobile.ohsu.edu.": {}, "epoch.cloud.": {}, "eponesh.com.": {}, "eportal.fda.gov.ph.": {}, + "epsnj-my.sharepoint.com.": {}, "epsnj.sharepoint.com.": {}, "errlog.umeng.com.": {}, "errlogos.umeng.com.": {}, "errnewlog.umeng.com.": {}, "errnewlogos.umeng.com.": {}, "errortracking.deepl.com.": {}, + "esignlive.com.": {}, "esm.archive.org.": {}, "esosuite.net.": {}, + "estafetamx-my.sharepoint.com.": {}, "etracker.com.": {}, "etsv2.datalake.gameloft.com.": {}, "eu-aa.online-metrix.net.": {}, "eu-api.asm.skype.com.": {}, - "eu-device.ymcs.yealink.com.": {}, "eu-gamecenter.api.intl.miui.com.": {}, "eu-prod.asyncgw.teams.microsoft.com.": {}, "eu-push.api.intl.miui.com.": {}, "eu.galleryapi.micloud.xiaomi.net.": {}, - "eu.hismileteeth.com.": {}, - "eu.iceporn.xxx.": {}, + "eu.mvconf.50union.com.": {}, "eu.statusapi.micloud.xiaomi.net.": {}, "eu1.badoo.com.": {}, - "eu1.bumbcdn.com.": {}, "eu1.bumble.com.": {}, - "eu2a-excel-collab.officeapps.live.com.": {}, + "eu1.ecdn2.bumbcdn.com.": {}, + "eu1a-excel-collab.officeapps.live.com.": {}, "euc-excel-collab.officeapps.live.com.": {}, "euc-powerpoint-collab.officeapps.live.com.": {}, - "euc1-green.pp.sgp.pvp.net.": {}, + "europe-west6-sybogames-gke-prod.cloudfunctions.net.": {}, "europe.remotepc.com.": {}, "eus.his.arc.azure.com.": {}, "eus.his.hybridcompute.trafficmanager.net.": {}, @@ -1802,17 +1767,21 @@ var FakeECSFQDNs = map[string]struct{}{ "event-tracking-project.ap-southeast-1.log.aliyuncs.com.": {}, "event.evtm.53.com.": {}, "event.togothermany.com.": {}, + "events.paramount.tech.": {}, + "events.statsigapi.net.": {}, "events.swishapps.ai.": {}, - "evtrust.com.": {}, "exappupgrade.vivoglobal.com.": {}, "excel-collab.officeapps.live.com.": {}, "exodus.desync.com.": {}, + "exorigos.com.": {}, "exp.host.": {}, - "expedia-api.arkoselabs.com.": {}, "expedia-app.quantummetric.com.": {}, + "experian-my.sharepoint.com.": {}, "experimental-api.asm.skype.com.": {}, "explicit-explicit.bing.net.trafficmanager.net.": {}, "exponential.com.": {}, + "expresspros-my.sharepoint.com.": {}, + "expresspros.sharepoint.com.": {}, "extension.faro.speechify.dev.": {}, "external-ams2-1.xx.fbcdn.net.": {}, "external-ams4-1.xx.fbcdn.net.": {}, @@ -1821,7 +1790,7 @@ var FakeECSFQDNs = map[string]struct{}{ "external-ber1-1.xx.fbcdn.net.": {}, "external-bos5-1.xx.fbcdn.net.": {}, "external-bru2-1.xx.fbcdn.net.": {}, - "external-den4-1.xx.fbcdn.net.": {}, + "external-den2-1.xx.fbcdn.net.": {}, "external-dfw5-1.xx.fbcdn.net.": {}, "external-dfw5-2.xx.fbcdn.net.": {}, "external-dus1-1.xx.fbcdn.net.": {}, @@ -1852,28 +1821,29 @@ var FakeECSFQDNs = map[string]struct{}{ "external-sjc3-1.xx.fbcdn.net.": {}, "external-vie1-1.xx.fbcdn.net.": {}, "external-waw1-1.xx.fbcdn.net.": {}, - "external-yyz1-1.xx.fbcdn.net.": {}, "extranet-ipv4-pub-azams.alb.xiaomi.com.": {}, "ezcollab-my.sharepoint.com.": {}, - "ezmob.com.": {}, - "f35b59fc-90c6-428e-a9e4-494353d0f0e1.prmutv.co.": {}, - "fa000000068.resources.office.net.": {}, - "fa000000131.resources.office.net.": {}, + "ezcollab.sharepoint.com.": {}, + "f.hubspotusercontent00.net.": {}, + "fa000000076.resources.office.net.": {}, + "fa000000110.resources.office.net.": {}, + "fa1f96ab-b693-40e4-82d5-8698592ef9ac.prmutv.co.": {}, "faas.marktplaats.nl.": {}, "faceunity.com.": {}, "factor.reg.163.com.": {}, "factset.com.": {}, - "fandango-app.quantummetric.com.": {}, + "fanyiegg.youdao.com.": {}, + "fastformstax.prosystemfx.com.": {}, "fastly-cloud.typenetwork.com.": {}, "fastly.cedexis-test.com.": {}, + "fastquote.fidelity.com.": {}, "faves.grow.me.": {}, - "fb88d35d-3299-4a2e-bf5c-ebb4e5b5938a.resources.office.net.": {}, - "fbinsmi-my.sharepoint.com.": {}, "fbinsmi.sharepoint.com.": {}, "fdccpaadaptor.forddirectservices.com.": {}, "fe.xiaohongshu.com.": {}, + "featuregates.org.": {}, "fed.federate365.com.": {}, - "feed.podbean.com.": {}, + "feedbackify.com.": {}, "feeder.co.": {}, "feelinsonice.l.google.com.": {}, "fef.amsub0302.manage.microsoft.com.": {}, @@ -1883,22 +1853,23 @@ var FakeECSFQDNs = map[string]struct{}{ "fef.msub07.manage.microsoft.com.": {}, "femaledaily.com.": {}, "fengkongcloud.com.": {}, - "fenxi.com.": {}, "ferringgroup-my.sharepoint.com.": {}, "ferringgroup.sharepoint.com.": {}, - "ffs.thescore.com.": {}, + "festo-my.sharepoint.com.": {}, + "ff.nordcurrent.com.": {}, "fgwn01.ultipro.com.": {}, - "fhmc-my.sharepoint.com.": {}, "fi.telephony.goog.": {}, "field59.com.": {}, "files.jotform.com.": {}, + "files.zohopublic.eu.": {}, + "filters.adavoid.org.": {}, "finalsite.com.": {}, "finalsite.net.": {}, "firebase.sgp1.digitaloceanspaces.com.": {}, "fireeye.com.": {}, - "firefox.com.cn.": {}, - "fitchburg.remotepc.com.": {}, + "fiscal.treasury.gov.": {}, "five9.com.": {}, + "flashcards.vitalsource.com.": {}, "fleet.todyl.com.": {}, "flip.to.": {}, "flixcdn.com.": {}, @@ -1908,29 +1879,30 @@ var FakeECSFQDNs = map[string]struct{}{ "flyspirit.sharepoint.com.": {}, "fm.printaudit.com.": {}, "fmcna-my.sharepoint.com.": {}, - "fmcschedule.com.": {}, + "fmcna.sharepoint.com.": {}, "fn.us.ipqscdn.com.": {}, + "fo.iemiq.com.": {}, "forcesafesearch.google.com.": {}, "forksystems.mm.fcix.net.": {}, "form.jotform.com.": {}, "forms-eu1.hscollectedforms.net.": {}, "forms-eu1.hsforms.com.": {}, "forms-eu1.hubspot.com.": {}, - "forms.aweber.com.": {}, + "forthepeople0-my.sharepoint.com.": {}, "forthepeople0.sharepoint.com.": {}, + "fortisimperious.com.": {}, "fortworth.remotepc.com.": {}, + "foundation-ipv4.youdao.com.": {}, "fpbns.net.": {}, "fpdlp.applxweb.com.": {}, "fr-prod.asyncgw.teams.microsoft.com.": {}, - "fr1.bumbcdn.com.": {}, - "fragrancenet.com.": {}, + "fr1.ecdn2.bumbcdn.com.": {}, "fran.frvr.com.": {}, "franecki.net.": {}, "frankfurt.remotepc.com.": {}, "fremont.remotepc.com.": {}, "freseniusmedicalcare.com.": {}, "fresnocounty-my.sharepoint.com.": {}, - "friendly.io.": {}, "fs.ultiproworkplace.com.": {}, "fsu-my.sharepoint.com.": {}, "fsu.sharepoint.com.": {}, @@ -1940,70 +1912,66 @@ var FakeECSFQDNs = map[string]struct{}{ "ftkew02.ultipro.com.": {}, "ftkn01.ultipro.com.": {}, "ftkn02.ultipro.com.": {}, - "funshion.com.": {}, + "ftp.ext.hp.com.edgekey.net.": {}, + "ftpm.amd.com.": {}, + "fuk01.ps5.update.playstation.net.": {}, "fusd-my.sharepoint.com.": {}, - "g-zgroup.pstatic.net.": {}, + "fusd.sharepoint.com.": {}, + "fxltsbl.com.": {}, "g.fastcdn.co.": {}, - "g.tivan.naver.com.": {}, "g9hc4.cn.": {}, "ga.badambiz.com.": {}, - "ga.jspm.io.": {}, "galaxy.safe.360.cn.": {}, "galaxyappstore.com.": {}, + "galeapps.gale.com.": {}, "gameloft.com.": {}, "gamemonkey.org.": {}, "gamepigeon.net.": {}, - "games-dailycheckin.shopee.co.id.": {}, - "gamestop-app.quantummetric.com.": {}, + "gatag.it.": {}, + "gateway.costar.com.": {}, "gateway.ultiproworkplace.com.": {}, "gb.ee.rcs.telephony.goog.": {}, "gb.o2.rcs.telephony.goog.": {}, - "gbc-word-edit.officeapps.live.com.": {}, - "gc.apple.com.": {}, + "gbc-common.online.office.com.": {}, + "gbc-excel.officeapps.live.com.": {}, "gcash-api.pulseid.com.": {}, "gccmod.ecs.office.com.": {}, "gcdn.co.": {}, + "gce-beacons.gcp.gvt2.com.": {}, "gcloud.qq.com.": {}, "gcloudcs.com.": {}, "gcloudsdk.com.": {}, - "gcs.garmin.com.": {}, "gcs.sc-cdn.net.": {}, - "gdfpsec.gifshow.com.": {}, "gdid.datalake.gameloft.com.": {}, - "gdpr.loopme.com.": {}, - "gdsns1.alibabadns.com.": {}, + "geant.ocsp.sectigo.com.": {}, "geappl.io.": {}, "geappliances-my.sharepoint.com.": {}, "geappliances.sharepoint.com.": {}, "geico-app.quantummetric.com.": {}, "geico-sync.quantummetric.com.": {}, "geniusmonkey.com.": {}, - "geometrydashlite.co.": {}, + "geo-dra.platform.hicloud.com.": {}, "getadmiral.com.": {}, "getbutton.io.": {}, - "gettopple.com.": {}, + "getnitropack.com.": {}, + "getpremise.com.": {}, "getui.net.": {}, + "gfp.veta.naver.com.": {}, "giraff.io.": {}, - "githack.com.": {}, "gitlab.com.": {}, "gla.gameloft.com.": {}, "glic-my.sharepoint.com.": {}, "glic.sharepoint.com.": {}, "global-tokenserver-la.headline.uodoo.com.": {}, "global.datasite.com.": {}, - "globalcdn.co.": {}, "globalsigncdn.com.cdn.cloudflare.net.": {}, "globalsun.io.": {}, - "gme.qcloud.com.": {}, "gnc.com.": {}, "go.gale.com.": {}, - "go.hpyjmp.com.": {}, - "go.pdfforge.org.": {}, + "go.stripchatgirls.com.": {}, "goaffpro.com.": {}, "goconfluent-my.sharepoint.com.": {}, - "gohealthuc.okta.com.": {}, - "golf.com.": {}, - "goodrxcore-app.quantummetric.com.": {}, + "goconfluent.sharepoint.com.": {}, "google.org.": {}, "googledomains.com.": {}, "gosport.remotepc.com.": {}, @@ -2011,24 +1979,18 @@ var FakeECSFQDNs = map[string]struct{}{ "gov-bam.nr-data.net.cdn.cloudflare.net.": {}, "gowustl-my.sharepoint.com.": {}, "grab.zoom.us.": {}, - "grainger.com.": {}, "gravitec.net.": {}, - "gravityzone.bitdefender.com.": {}, - "graylog.com.": {}, - "greenhousegroup.com.": {}, "greenville.remotepc.com.": {}, "group-ib.com.": {}, + "groupon.attn.tv.": {}, "grouponeauto-my.sharepoint.com.": {}, "grpc.vivintsky.com.": {}, - "gsgrpt.adview.com.": {}, "gslb.finzfin.com.": {}, "gslb.sgw.shopeemobile.com.": {}, "gslb.xiaohongshu.com.": {}, - "gstbocessscta-my.sharepoint.com.": {}, - "gstbocessscta.sharepoint.com.": {}, "gtimg.cn.": {}, "guid.tpns.sgp.tencent.com.": {}, - "gut.bmj.com.": {}, + "gva.be.": {}, "gw5.push.mcp.weibo.cn.": {}, "gwadar.cn.": {}, "gx-api.geniex.com.": {}, @@ -2036,10 +1998,7 @@ var FakeECSFQDNs = map[string]struct{}{ "gz0.googleusercontent.com.": {}, "h-5h8i3ud8.online-metrix.net.": {}, "h-adp.online-metrix.net.": {}, - "h-citibankonline.online-metrix.net.": {}, - "h-citicards.online-metrix.net.": {}, "h-discover.online-metrix.net.": {}, - "h-e04kqxof.online-metrix.net.": {}, "h-ebay.online-metrix.net.": {}, "h-fisglobal.online-metrix.net.": {}, "h-homedepot.online-metrix.net.": {}, @@ -2053,6 +2012,7 @@ var FakeECSFQDNs = map[string]struct{}{ "h.app.wdesk.com.": {}, "h.online-metrix.net.": {}, "h107833-ecdn.mp.lura.live.": {}, + "h5sv6m.com.": {}, "haka.ruselabs.com.": {}, "hamina.remotepc.com.": {}, "handmadewithjoann.com.": {}, @@ -2066,46 +2026,54 @@ var FakeECSFQDNs = map[string]struct{}{ "hbopenbid-apac-v2.pubmnet.com.": {}, "hbwrapper.com.": {}, "hd-ext-v1.log.mgtv.com.": {}, + "hdi365-my.sharepoint.com.": {}, "hdi365.sharepoint.com.": {}, + "hdp-raw-log.cn-shanghai.log.aliyuncs.com.": {}, "hdsupplyinc-my.sharepoint.com.": {}, "hdsupplyinc.sharepoint.com.": {}, "healthequity-my.sharepoint.com.": {}, "healthequity.sharepoint.com.": {}, "hearst-prod.actioniq.mr-in.com.": {}, - "heatmap-events-collector.instapage.com.": {}, "hecheck.bitmyanmar.info.": {}, "helloid.com.": {}, - "help.ea.com.": {}, - "hengam.io.": {}, + "hellomedian.com.": {}, "hermes-us.inspidspad.com.": {}, "hetangsmart.com.": {}, + "hexanaut-centralserver.coolmathgames.com.": {}, "heytapdownload.com.": {}, "heytapmobi.com.": {}, "highwebmedia.com.": {}, "highwire.org.": {}, + "hillingdon-my.sharepoint.com.": {}, "hillsboroughcounty-my.sharepoint.com.": {}, "hilton-my.sharepoint.com.": {}, + "hilton.sharepoint.com.": {}, + "hindustantimes.com.": {}, "hisearch-dra.dt.dbankcloud.com.": {}, "hismarttv.com.": {}, "hismileteeth.com.": {}, "hits.getelevar.com.": {}, - "hiya.browser.360.cn.": {}, "hk.gcloudcs.com.": {}, "hk.voice.gcloudcs.com.": {}, "hk.wechat.com.": {}, - "hls-video-ynet.ynethd.com.": {}, + "hn1-cloud-entitlements.lol.qq.com.": {}, + "hn1-cloud-taas.lol.qq.com.": {}, + "hokgcloudv6.iegcom.com.": {}, + "holmeshelp.ucweb.com.": {}, "home.highwire.org.": {}, + "homedepot-app.quantummetric.com.": {}, "homedepot.quantummetric.com.": {}, "honeywell.com.": {}, "honeywellprod-my.sharepoint.com.": {}, + "honeywellprod.sharepoint.com.": {}, "hongkong.remotepc.com.": {}, - "hostedimages-cdn.aweber-static.com.": {}, + "houstonmethodist1-my.sharepoint.com.": {}, "houstonmethodist1.sharepoint.com.": {}, "houtx-my.sharepoint.com.": {}, - "houtx.sharepoint.com.": {}, "hpfalkaj.deepl.com.": {}, "hpkaj.deepl.com.": {}, "hpplay.cn.": {}, + "hrsa.gov.": {}, "hstgps.com.": {}, "html.it.": {}, "html5.qq.com.": {}, @@ -2113,13 +2081,13 @@ var FakeECSFQDNs = map[string]struct{}{ "httpdns.y5en.com.": {}, "huan.tv.": {}, "huaweicloud.com.": {}, - "hub.turbo.net.": {}, "hubble.netease.com.": {}, - "hubble.officeapps.live.com.": {}, "hubcloud.com.cn.": {}, "hubspotemail.net.": {}, "huion.cn.": {}, + "huntsvillecityschools-my.sharepoint.com.": {}, "huorong.cn.": {}, + "hw.gcloudcs.com.": {}, "hwapps-o.api.leiniao.com.": {}, "hysteryale-my.sharepoint.com.": {}, "hysteryale.sharepoint.com.": {}, @@ -2133,98 +2101,102 @@ var FakeECSFQDNs = map[string]struct{}{ "ibm.account.box.com.": {}, "ibm.box.com.": {}, "ibsrv.net.": {}, + "ic-pb-ah.xhcdn.com.": {}, + "ic-ph-ah.xhcdn.com.": {}, + "ic-vt-ah.fullxhcdn.com.": {}, "icalendars.app.": {}, + "iceholdings-my.sharepoint.com.": {}, + "iceholdings.sharepoint.com.": {}, "ichano.cn.": {}, "iconmonstr.com.": {}, "icons.bitwarden.net.": {}, "id-ooredoo.rcs.telephony.goog.": {}, "id-telkom.rcs.telephony.goog.": {}, "id-timer-appstore.vivoglobal.com.": {}, - "id.maxon.net.": {}, + "id.remoteutilities.com.": {}, "idahofalls.remotepc.com.": {}, - "idamsdm.remotepc.com.": {}, "idchicago1.remotepc.com.": {}, "iddallas1.remotepc.com.": {}, "iddenver.remotepc.com.": {}, "iddetroit.remotepc.com.": {}, + "identity.myisolved.com.": {}, + "idexonline-my.sharepoint.com.": {}, "idhw-my.sharepoint.com.": {}, "idhw.sharepoint.com.": {}, "idlondon.remotepc.com.": {}, "idmadrid.remotepc.com.": {}, - "idmsa.apple.com.": {}, "idnewyork1.remotepc.com.": {}, + "idpix.media6degrees.com.": {}, "idqqimg.com.": {}, "idr.cdnwidget.com.": {}, "ids.cdnwidget.com.": {}, - "ifconfig.io.": {}, + "iemiq.com.": {}, "igame.gcloudcs.com.": {}, "ijoysoftconnect.com.": {}, - "ikioenjm3e9.ioriveredge.net.": {}, "ilandcloud.com.": {}, "illinoisstateuniversity-my.sharepoint.com.": {}, + "illuminateed.com.": {}, "ilmn-my.sharepoint.com.": {}, "ilmn.sharepoint.com.": {}, "ilog-sea-aliyun.alipayplus.com.": {}, "im.bluevoox.com.": {}, - "image-us.samsung.com.": {}, - "image.e.affirm.com.": {}, - "image.myqcloud.com.": {}, - "image.online.adp.com.": {}, - "images.crazygames.com.": {}, - "images.getadmiral.com.": {}, - "images.twoplayergames.org.": {}, - "images.wixstatic.com.": {}, - "imagetrendelite.com.": {}, - "imanageshare.com.": {}, - "imap.163.com.": {}, - "imap.earthlink.net.": {}, - "imeffkdword.openspeech.cn.": {}, - "img.asuracomics.com.": {}, - "img.avery.com.": {}, - "img.stripcdn.com.": {}, - "img.washingtonpost.com.": {}, - "img1.od-cdn.com.": {}, - "img9.target.com.": {}, - "imghst-de.com.": {}, - "imgix.ranker.com.": {}, - "imgproxy.leaflets.schwarz.": {}, - "imgs.michaels.com.": {}, - "imgs.signifyd.com.": {}, - "imgsct.cookiebot.com.": {}, - "imoim.net.": {}, - "imolive2.com.": {}, + "image-auto-captioning-computer-vision.cognitiveservices.azure.com.": {}, + "image.cnbcfm.com.": {}, + "image.myqcloud.com.": {}, + "image.online.adp.com.": {}, + "images.axios.com.": {}, + "images.babylist.com.": {}, + "images.crazygames.com.": {}, + "images.dable.io.": {}, + "images.leadconnectorhq.com.": {}, + "images.onefootball.com.": {}, + "images.wixstatic.com.": {}, + "imagetrendelite.com.": {}, + "imap.earthlink.net.": {}, + "imeclient.openspeech.cn.": {}, + "img-1.kwcdn.com.cdn.cloudflare.net.": {}, + "img.grouponcdn.com.edgekey.net.": {}, + "img.newspapers.com.": {}, + "img.yana.upday.com.": {}, + "img9.target.com.": {}, + "imga.corporateperks.com.": {}, + "imghst-de.com.": {}, + "imgix.ranker.com.": {}, + "imgproxy.leaflets.schwarz.": {}, + "imgs.signifyd.com.": {}, + "imoim.net.": {}, + "imolive2.com.": {}, "imou-sg-ali-online-paas-private-cloud-picture.oss-ap-southeast-1.aliyuncs.com.": {}, "imou-sg3-ali-online-paas-private-picture.oss-ap-southeast-1.aliyuncs.com.": {}, "imoulife.com.": {}, - "imp.impdelivery.xyz.": {}, "impactify.media.": {}, - "impdesk.com.": {}, "imptrk.siteplug.com.": {}, "in-api.asm.skype.com.": {}, + "in-exmagazineunlock-proxy.vivoglobal.com.": {}, "in-prod.asyncgw.teams.microsoft.com.": {}, "in-vcode-od.vivoglobal.com.": {}, "in.gov.": {}, "in.visitors.live.": {}, - "inapp.gonitro.com.": {}, - "inbound.americanexpress.com.": {}, + "incitecpivotlimited-my.sharepoint.com.": {}, "indianapolis.remotepc.com.": {}, - "indoorloc.map.qq.com.": {}, "inf.miui.com.": {}, - "ingka.com.": {}, + "ingame.qq.com.": {}, + "ingesteu.quantummetric.com.": {}, "ingov-my.sharepoint.com.": {}, "ingov.sharepoint.com.": {}, "inneraudioms.cc.easebar.com.": {}, "innersloth.com.": {}, "innity.com.": {}, "innity.net.": {}, + "ino.qq.com.": {}, "inoreader.com.": {}, "ins-qw3q8ofk.ias.tencent-cloud.net.": {}, "inscr-my.sharepoint.com.": {}, "inscr.sharepoint.com.": {}, + "inside-graph.com.cdn.cloudflare.net.": {}, "insidemedia-my.sharepoint.com.": {}, "insidemedia.sharepoint.com.": {}, "insightgloballlc-my.sharepoint.com.": {}, - "insights.ovid.com.": {}, "inskinad.com.": {}, "inspidspad.com.": {}, "inspirebrands-app.quantummetric.com.": {}, @@ -2240,21 +2212,25 @@ var FakeECSFQDNs = map[string]struct{}{ "intel.sharepoint.com.": {}, "internetdownloadmanager.com.": {}, "intl-im-conn.iq.com.": {}, + "intuit.zoom.us.": {}, + "iorad.com.": {}, + "ios-informationplatform.wps.cn.": {}, "ios.crashsight.wetest.net.": {}, - "iot-as-http.cn-shanghai.aliyuncs.com.": {}, "iot.hillrom.com.": {}, "iowa.remotepc.com.": {}, "ip-api.com.": {}, "ip.acmeaom.com.": {}, "ipa-business-sg.ap-southeast-1.log.aliyuncs.com.": {}, "ipa-business.cn-hangzhou.log.aliyuncs.com.": {}, - "ipify.org.": {}, + "iphone-cdn-api.fitbit.com.": {}, "ipinyou.com.": {}, - "iplayer-web.files.bbci.co.uk.": {}, - "ipm.adblockplus.dev.": {}, "iprofiles.apple.com.": {}, "iprom.net.": {}, + "ipv4.cadc.absolute.com.": {}, "ipv4.tracker.harry.lu.": {}, + "iq.com.": {}, + "irltoolkit.mm.fcix.net.": {}, + "ironmountain.cyberhaven.io.": {}, "irvine.remotepc.com.": {}, "isap.inskinad.com.": {}, "iscorp.com.": {}, @@ -2267,12 +2243,13 @@ var FakeECSFQDNs = map[string]struct{}{ "itinfoalvarezandmarsal-my.sharepoint.com.": {}, "itinfoalvarezandmarsal.sharepoint.com.": {}, "itm.cloud.com.": {}, - "itoon.org.": {}, "itzmx.com.": {}, + "ivalua.com.": {}, "ive8im-inapps.appsflyersdk.com.": {}, "ivview.com.": {}, "ivview.net.": {}, "ivytechccofindiana-my.sharepoint.com.": {}, + "iwmapapi.americanexpress.com.": {}, "ixav-cse.avlyun.com.": {}, "izooto.com.": {}, "jabfm.org.": {}, @@ -2284,17 +2261,15 @@ var FakeECSFQDNs = map[string]struct{}{ "jdcloud.com.": {}, "jeldweninc1-my.sharepoint.com.": {}, "jeldweninc1.sharepoint.com.": {}, - "jgw-dra.jos.dbankcloud.cn.": {}, - "jjcloud.box.com.": {}, - "jjcloud.ent.box.com.": {}, "jjkeller-my.sharepoint.com.": {}, "jnj-my.sharepoint.com.": {}, + "jocombssd.aristotleinsight.com.": {}, "johannesburg.remotepc.com.": {}, - "johnmuirhealth-my.sharepoint.com.": {}, "johnmuirhealth.sharepoint.com.": {}, - "johnsmanville365-my.sharepoint.com.": {}, "joox.com.": {}, "jotfor.ms.": {}, + "journeymv.com.": {}, + "joynetgame.com.": {}, "jp-prod.asyncgw.teams.microsoft.com.": {}, "jp.cinarra.com.": {}, "jp1.chat.si.riotgames.com.": {}, @@ -2310,34 +2285,39 @@ var FakeECSFQDNs = map[string]struct{}{ "js-eu1.hsleadflows.net.": {}, "js-eu1.hubspot.com.": {}, "js-eu1.hubspotfeedback.com.": {}, - "js.hcaptcha.com.": {}, - "js.users.51.la.": {}, + "js.eruptr.io.": {}, + "jss.starbucks.com.": {}, + "jssprod-starbucks.trafficmanager.net.": {}, "junglefrog.com.": {}, - "k-aeu1.contentsquare.net.": {}, "k.163.com.": {}, "k8s1-event-tracker-am.indexexchange.com.": {}, "k8s1-event-tracker-la.indexexchange.com.": {}, "k8s1-event-tracker-ny.indexexchange.com.": {}, "k8s1-event-tracker-sj.indexexchange.com.": {}, "k8s1-event-tracker-va.indexexchange.com.": {}, - "k8svkbknrqzgecxff.ay.delivery.": {}, + "k8s1-la-ext-lb.indexexchange.com.": {}, + "k8s1-ny-ext-lb.indexexchange.com.": {}, + "k8s1-va-ext-lb.indexexchange.com.": {}, "kajicam.com.": {}, - "kaleidousercontent.com.": {}, "kameleoon.com.": {}, + "katespade.scene7.com.": {}, "kc1-my.sharepoint.com.": {}, "kc1.sharepoint.com.": {}, - "keells-my.sharepoint.com.": {}, - "kenh14.vn.": {}, "khsd-my.sharepoint.com.": {}, + "khsd.sharepoint.com.": {}, + "kic-ngfts.lge.com.": {}, "kiev.remotepc.com.": {}, - "kit-pro.fontawesome.com.": {}, + "kiprotect.com.": {}, + "kisd365-my.sharepoint.com.": {}, + "kisd365.sharepoint.com.": {}, + "kit-uploads.fontawesome.com.": {}, "kiwisizing.com.": {}, + "kjjinz-cdn-settings.appsflyersdk.com.": {}, "klagenfurt.remotepc.com.": {}, - "klikan.caridisini.site.": {}, - "kmovie.gifshow.com.": {}, "knightlab.com.": {}, "knock.app.": {}, "knoxville.remotepc.com.": {}, + "kohcloud.tgpa.qq.com.": {}, "komect.com.": {}, "kootenaihealth-my.sharepoint.com.": {}, "kornferry-my.sharepoint.com.": {}, @@ -2348,17 +2328,17 @@ var FakeECSFQDNs = map[string]struct{}{ "kunlunaq.com.": {}, "kunlunar.com.": {}, "kunluncan.com.": {}, - "kunlungem.com.": {}, "kunlungr.com.": {}, "kunlunhuf.com.": {}, "kunlunno.com.": {}, "kunlunsl.com.": {}, "kunlunso.com.": {}, - "kv801.prod.do.dsp.mp.microsoft.com.": {}, - "kw3qbu-cdn-settings.appsflyersdk.com.": {}, + "kv601.prod.do.dsp.mp.microsoft.com.edgekey.net.": {}, "kwimgs.com.": {}, "kzhi.tech.": {}, + "l.ec922003.com.": {}, "l1-1.anzu.io.": {}, + "la-ak.vg.ac.pvp.net.": {}, "la.remotepc.com.": {}, "la1.chat.si.riotgames.com.": {}, "la10.remotepc.com.": {}, @@ -2367,10 +2347,8 @@ var FakeECSFQDNs = map[string]struct{}{ "la2.remotepc.com.": {}, "la3.remotepc.com.": {}, "la4.remotepc.com.": {}, - "la4lbg.uae2grp.ucweb.com.": {}, "la8.remotepc.com.": {}, "la9.remotepc.com.": {}, - "labtech.iwsit.com.": {}, "lacounty-my.sharepoint.com.": {}, "lacounty.sharepoint.com.": {}, "lahuashanbx.com.": {}, @@ -2380,12 +2358,13 @@ var FakeECSFQDNs = map[string]struct{}{ "larksuite.com.": {}, "lasd-my.sharepoint.com.": {}, "lasd.sharepoint.com.": {}, + "lastwar-us.us-west-1.log.aliyuncs.com.": {}, "laureatelatammx-my.sharepoint.com.": {}, + "laureatelatammx.sharepoint.com.": {}, "lax.remotepc.com.": {}, "layerxsecurity.com.": {}, - "layouthub.com.": {}, - "lazada-mobile.oss-ap-southeast-1.aliyuncs.com.": {}, "lazada-msgacs.m.taobao.com.": {}, + "lazada-wallet.oss-ap-southeast-1.aliyuncs.com.": {}, "lazada.co.id.": {}, "lazada.co.th.": {}, "lazada.com.": {}, @@ -2396,48 +2375,48 @@ var FakeECSFQDNs = map[string]struct{}{ "lcmchealth-my.sharepoint.com.": {}, "lcmchealth.sharepoint.com.": {}, "ldap.google.com.": {}, - "ldcorp-my.sharepoint.com.": {}, "ldcorp.sharepoint.com.": {}, - "leaderboards.xboxlive.com.": {}, + "ldmnq.com.": {}, "leadmanagerfx.com.": {}, - "lebo.cn.": {}, + "leagueoflegends.com.": {}, "leiniao.com.": {}, "lenovomm.com.": {}, - "lenovosupport-app.quantummetric.com.": {}, "levect.com.": {}, + "level10gc.com.": {}, "leveldata.poki.io.": {}, "leviton-my.sharepoint.com.": {}, "lexicon.33across.com.": {}, - "lf16-geckocdn-offline.g-p-static.com.": {}, "lianmeng.360.cn.": {}, + "libertyuniv-my.sharepoint.com.": {}, + "libertyuniv.sharepoint.com.": {}, + "liblynx.com.": {}, + "libra22-normal-useast2a.tiktokv.com.": {}, "license.gonative.io.": {}, "license.litespeedtech.com.": {}, "license.unity3d.com.": {}, "licensing.bitmovin.com.": {}, - "licensing.microsoftcasualgames.com.": {}, - "licensing.sbullet.com.": {}, + "lichess.org.": {}, + "lightboxcdn.com.": {}, "lightwidget.com.": {}, - "like-video.com.": {}, "likr.tw.": {}, "lima.remotepc.com.": {}, "lincare-my.sharepoint.com.": {}, "lincare.sharepoint.com.": {}, "link-vision-picture-sgp.oss-ap-southeast-1.aliyuncs.com.": {}, - "link.storjshare.io.": {}, + "liquipedia.net.": {}, "lisbon.remotepc.com.": {}, "lissabon.remotepc.com.": {}, "list.tronlink.org.": {}, "lists-e.tm-rt.sharepoint.com.": {}, - "lit.connatix.com.cdn.cloudflare.net.": {}, - "lit.elements.video.": {}, + "lite.adakami.id.": {}, "litedev.sgp.hik-connect.com.": {}, - "litedev.us.hik-connect.com.": {}, "litespeedtech.com.": {}, "littler-my.sharepoint.com.": {}, "live.126.net.": {}, "live.ngb.haplat.net.": {}, "live3.ngb.haplat.net.": {}, "live5.ngb.haplat.net.": {}, + "live74dh3d6.airspace-a.cbsivideo.com.": {}, "livect.haplat.net.": {}, "livedmpsk12ia-my.sharepoint.com.": {}, "livedmpsk12ia.sharepoint.com.": {}, @@ -2446,30 +2425,25 @@ var FakeECSFQDNs = map[string]struct{}{ "liveutmb-my.sharepoint.com.": {}, "liveutmb.sharepoint.com.": {}, "ljubljana.remotepc.com.": {}, - "llbean-sync.quantummetric.com.": {}, - "load.fomo.com.": {}, "local.adguard.org.": {}, "local.info.g9hc4.cn.": {}, "log-api.newrelic.com.cdn.cloudflare.net.": {}, + "log-yex.youdao.com.": {}, "log.getadblock.com.": {}, "log.lscreenc.com.": {}, "log.umsns.com.": {}, - "log.voicecloud.cn.": {}, "log.zoom.us.": {}, - "log1.cmpassport.com.": {}, - "log2.cmpassport.com.": {}, "logger.moviead55.ru.": {}, "logging-service-prod.getepic.com.": {}, "logging.mp.lura.live.": {}, - "login.epm.cyberark.com.": {}, + "login.cbc.ca.": {}, + "login.steampowered.com.": {}, "login.teamviewer.com.": {}, - "login.ultipro.com.": {}, "loginradius.com.": {}, - "logrocket.io.": {}, - "logs-ingress.svc.vinted.com.": {}, + "logs2.sportslocalmedia.com.": {}, + "logu.hpplay.cn.": {}, "logus.xiaoyi.com.": {}, "logx.optimizely.com.": {}, - "loklok.tv.": {}, "london.remotepc.com.": {}, "london2.remotepc.com.": {}, "london3.remotepc.com.": {}, @@ -2479,7 +2453,6 @@ var FakeECSFQDNs = map[string]struct{}{ "london8.remotepc.com.": {}, "look.360.cn.": {}, "loopme.me.": {}, - "lp-03.chat.online.citi.com.": {}, "lptag-cdn.liveperson.net.": {}, "lsagentrelay.lansweeper.com.": {}, "lscreenc.com.": {}, @@ -2489,38 +2462,38 @@ var FakeECSFQDNs = map[string]struct{}{ "ltpnetwork-my.sharepoint.com.": {}, "luckyorange.com.": {}, "ludashi.com.": {}, - "lululemon-app.quantummetric.com.": {}, + "lufthansa-app.quantummetric.com.": {}, "lunamedia.live.": {}, "luxembourg.remotepc.com.": {}, "lycraservice-pa-cam-prod.googleapis.com.": {}, "lyric.alarmnet.com.": {}, - "m.du4yh.com.": {}, + "m.vidio.com.": {}, "m104216-ucdn.mp.lura.live.": {}, "m107833-mcdn.mp.lura.live.": {}, - "m5-zb.amap.com.": {}, + "m109771-ecdn.mp.lura.live.": {}, + "m3.twinredads.com.": {}, "macclog-as.rj.link.": {}, - "madisonschools-my.sharepoint.com.": {}, "madrid.remotepc.com.": {}, "maers.adrs.org.cn.": {}, "magichue.net.": {}, "maidenhead.remotepc.com.": {}, + "mail.proton.me.": {}, "mail.superhuman.com.": {}, "mailinblue.com.": {}, + "mailmissouri-my.sharepoint.com.": {}, + "mailmissouri.sharepoint.com.": {}, + "mailwsorg.zoho.com.": {}, + "maintenanceconnection.com.": {}, "majorel365-my.sharepoint.com.": {}, "malware-filter.gitlab.io.": {}, - "mam.netease.com.": {}, - "manage-dogfood.microsoft.com.": {}, + "manage-selfhost.microsoft.com.": {}, "manage.wix.com.": {}, - "manager.everbridge.net.": {}, - "manager.intelligentlocations.io.": {}, "manassas.remotepc.com.": {}, "manchester.remotepc.com.": {}, "manifest.prod.boltdns.net.": {}, - "marketing.beneplace.com.": {}, - "marketingassets.staples.com.": {}, + "maps.infoplaza.nl.": {}, "marmot-cloud.com.": {}, "marseille.remotepc.com.": {}, - "maserc-my.sharepoint.com.": {}, "masonitecloud-my.sharepoint.com.": {}, "masonitecloud.sharepoint.com.": {}, "master1.teamviewer.com.": {}, @@ -2539,20 +2512,24 @@ var FakeECSFQDNs = map[string]struct{}{ "master7.teamviewer.com.": {}, "master8.teamviewer.com.": {}, "master9.teamviewer.com.": {}, - "masterashley-my.sharepoint.com.": {}, - "mathematica-my.sharepoint.com.": {}, + "masterclass.com.": {}, + "masuk.store.": {}, + "matrix.netease.com.": {}, "mattressfirm-my.sharepoint.com.": {}, "max-l.mediav.com.": {}, + "maxpreps.com.": {}, "mbboauth-1c.prd.cn.vwg-connect.cn.": {}, "mcallen.remotepc.com.": {}, "mcdermottinc-my.sharepoint.com.": {}, "mcdermottinc.sharepoint.com.": {}, "mcdermottwillemery-my.sharepoint.com.": {}, "mcdermottwillemery.sharepoint.com.": {}, - "mclarenhealth.sharepoint.com.": {}, + "mcdn.podbean.com.": {}, + "mcpss-my.sharepoint.com.": {}, + "mcpss.sharepoint.com.": {}, "mdap.tngdigital.com.my.": {}, - "mdc-console.ifpserver.com.": {}, "mdp-upgrade-cn.heytapmobi.com.": {}, + "mdscpxchg.com.": {}, "meari-oss-us.oss-us-west-1.aliyuncs.com.": {}, "meari-us.oss-us-west-1.aliyuncs.com.": {}, "medellin.remotepc.com.": {}, @@ -2562,10 +2539,8 @@ var FakeECSFQDNs = map[string]struct{}{ "media-atl3-1.cdn.whatsapp.net.": {}, "media-atl3-2.cdn.whatsapp.net.": {}, "media-ber1-1.cdn.whatsapp.net.": {}, - "media-bog1-1.cdn.whatsapp.net.": {}, "media-bog2-1.cdn.whatsapp.net.": {}, - "media-bom1-1.cdn.whatsapp.net.": {}, - "media-bom1-2.cdn.whatsapp.net.": {}, + "media-bog2-2.cdn.whatsapp.net.": {}, "media-bos5-1.cdn.whatsapp.net.": {}, "media-bru2-1.cdn.whatsapp.net.": {}, "media-cdg4-1.cdn.whatsapp.net.": {}, @@ -2574,7 +2549,7 @@ var FakeECSFQDNs = map[string]struct{}{ "media-cgk1-1.cdn.whatsapp.net.": {}, "media-cgk1-2.cdn.whatsapp.net.": {}, "media-cgk1-3.cdn.whatsapp.net.": {}, - "media-den4-1.cdn.whatsapp.net.": {}, + "media-den2-1.cdn.whatsapp.net.": {}, "media-dfw5-1.cdn.whatsapp.net.": {}, "media-dfw5-2.cdn.whatsapp.net.": {}, "media-dus1-1.cdn.whatsapp.net.": {}, @@ -2585,8 +2560,6 @@ var FakeECSFQDNs = map[string]struct{}{ "media-gig4-1.cdn.whatsapp.net.": {}, "media-gru1-1.cdn.whatsapp.net.": {}, "media-gru1-2.cdn.whatsapp.net.": {}, - "media-gru2-1.cdn.whatsapp.net.": {}, - "media-gru2-2.cdn.whatsapp.net.": {}, "media-gua1-1.cdn.whatsapp.net.": {}, "media-ham3-1.cdn.whatsapp.net.": {}, "media-hel3-1.cdn.whatsapp.net.": {}, @@ -2626,7 +2599,6 @@ var FakeECSFQDNs = map[string]struct{}{ "media-ord5-1.cdn.whatsapp.net.": {}, "media-ord5-2.cdn.whatsapp.net.": {}, "media-otp1-1.cdn.whatsapp.net.": {}, - "media-prg1-1.cdn.whatsapp.net.": {}, "media-qro1-1.cdn.whatsapp.net.": {}, "media-qro1-2.cdn.whatsapp.net.": {}, "media-sea1-1.cdn.whatsapp.net.": {}, @@ -2643,26 +2615,18 @@ var FakeECSFQDNs = map[string]struct{}{ "media-xsp1-2.cdn.whatsapp.net.": {}, "media-xsp1-3.cdn.whatsapp.net.": {}, "media-xsp2-1.cdn.whatsapp.net.": {}, - "media-xxb1-1.cdn.whatsapp.net.": {}, "media-yyz1-1.cdn.whatsapp.net.": {}, - "media.defense.gov.": {}, "media.graphassets.com.": {}, "media.ringcentral.com.": {}, - "media.rockstargames.com.": {}, - "media.springernature.com.": {}, "media.superhuman.com.": {}, "mediadata.xboxlive.com.": {}, "mediadelivery.net.": {}, - "mediation-services.pubapp.network.": {}, "mediav.com.": {}, - "mediavine-res.cloudinary.com.": {}, + "medline0-my.sharepoint.com.": {}, "medline0.sharepoint.com.": {}, "melbourne.remotepc.com.": {}, "memphis.remotepc.com.": {}, - "mercadolivre.com.br.": {}, - "metric-api.newrelic.com.cdn.cloudflare.net.": {}, "metric.picodi.global.": {}, - "metrics-dre.data.dbankcloud.cn.": {}, "metrics-dre.dt.hihonorcloud.com.": {}, "metrics5.data.hicloud.com.": {}, "mexicocity.remotepc.com.": {}, @@ -2682,30 +2646,34 @@ var FakeECSFQDNs = map[string]struct{}{ "microsoft.sharepoint.com.": {}, "microvirt.com.": {}, "mid4.linkedin.com.": {}, + "mida.so.": {}, "mightytext.co.": {}, "milan.remotepc.com.": {}, "milestoneinternet.com.cdn.cloudflare.net.": {}, "milwaukeetool-my.sharepoint.com.": {}, - "milwaukeetool.com.": {}, + "milwaukeetool.sharepoint.com.": {}, "mimir.vivaldi.com.": {}, "min-api.cryptocompare.com.": {}, "mini.browser.360.cn.": {}, - "mirror.centos.iad1.serverforge.org.": {}, + "mintkeyboard.com.": {}, "mirror.fcix.net.": {}, + "mirror.lstn.net.": {}, "mirror.pit.teraswitch.com.": {}, + "mirror.steadfastnet.com.": {}, "mirrors.rockylinux.org.": {}, "mitek-my.sharepoint.com.": {}, "mixi.media.": {}, "mm-mm.bing.net.trafficmanager.net.": {}, "mms.mckesson.com.": {}, "mn31.ultipro.com.": {}, + "mn365-my.sharepoint.com.": {}, "mn365.sharepoint.com.": {}, - "moatpixel1.edgekey.net.": {}, + "mobile-bank.cdn-tinkoff.ru.": {}, + "mobile-collector.cell.nr-data.net.": {}, "mobile-collector.newrelic.com.cdn.cloudflare.net.": {}, + "mobile-nlp.vivo.com.cn.": {}, "mobile.bereal.com.": {}, "mobile.shuzilm.cn.": {}, - "mobileapi.us.afterpay.com.": {}, - "mobilecontent.costco.com.": {}, "mobiledataplan-pa.googleapis.com.": {}, "mobilelog.upqzfile.com.": {}, "mobilemaps-pa-gz.googleapis.com.": {}, @@ -2715,13 +2683,11 @@ var FakeECSFQDNs = map[string]struct{}{ "monitor.fraudblocker.com.": {}, "monitoring.getelevar.com.": {}, "monitoring.worksighted.com.": {}, - "monkeytype.com.": {}, "monsterenergycorp-my.sharepoint.com.": {}, "monsterenergycorp.sharepoint.com.": {}, "montage-updates.displaynote.com.": {}, "monticello.remotepc.com.": {}, "montreal.remotepc.com.": {}, - "moodmedia.com.": {}, "motiondetection-us-1d.oss-us-west-1.aliyuncs.com.": {}, "motiondetection-us.oss-us-west-1.aliyuncs.com.": {}, "mouser.com.": {}, @@ -2731,94 +2697,90 @@ var FakeECSFQDNs = map[string]struct{}{ "mpsaz-my.sharepoint.com.": {}, "mpsaz.sharepoint.com.": {}, "mpush-api.aliyun.com.": {}, - "mq1n25.com.": {}, "mr.homedepot.com.": {}, + "mrisoftware.com.": {}, "ms1app.pb.com.": {}, "msch.f.360.cn.": {}, "msdl.microsoft.com.": {}, "msf.3g.qq.com.": {}, "msg-img-hk.oss-cn-hongkong.aliyuncs.com.": {}, - "msmat1.itsupport247.net.": {}, "mstate-my.sharepoint.com.": {}, - "msync.tngdigital.com.my.": {}, + "msync-im1-sgp-ga.easemob.com.": {}, "mtb-app.quantummetric.com.": {}, - "mtncloud-my.sharepoint.com.": {}, "mtrace.qq.com.": {}, "mu.ariba.com.": {}, "mumbai.remotepc.com.": {}, "munich.remotepc.com.": {}, "musical.ly.": {}, + "musicmatch-ssl.xboxlive.com.": {}, "musicps.p2p.qq.com.": {}, "musicpunch.p2p.qq.com.": {}, "mvconf.f.360.cn.": {}, "mvconf.uk.cloud.360safe.com.": {}, "mvm.snapchat.com.": {}, + "mx-vcode-od.vivoglobal.com.": {}, "mx.amx.rcs.telephony.goog.": {}, "mxc-ios-app-logs-default.ap-southeast-1.log.aliyuncs.com.": {}, "mxc-logs-data-processing.ap-southeast-1.log.aliyuncs.com.": {}, "mxp-pusa01.app.blackbaud.net.": {}, + "mxptint.net.": {}, + "my.dealersocket.com.": {}, "my.getadmiral.com.": {}, "my.jbi.global.": {}, "my.microsoftpersonalcontent.com.": {}, "my.nalpeiron.com.": {}, + "my.pool.ntp.org.": {}, "myccmortgage-my.sharepoint.com.": {}, "mydigitalspace-my.sharepoint.com.": {}, + "mydigitalspace.sharepoint.com.": {}, "mydrive.connect.aig.": {}, "myisolved.com.": {}, "mylonestar-my.sharepoint.com.": {}, + "mylonestar.sharepoint.com.": {}, "myqcloud.com.": {}, - "mysat.collegeboard.org.": {}, + "myvscloud.com.": {}, "myweblogon.com.": {}, "myworkdaycdn.com.cn.": {}, - "n-1-la4x.ad-m.net.": {}, "n.gameads.io.": {}, - "n.nativendo.de.": {}, - "n13.ultipro.com.": {}, "n21.ultipro.com.": {}, - "n21c.ultipro.com.": {}, "n33.ultipro.com.": {}, - "na.lb.martianinc.co.": {}, - "na137.epm.cyberark.com.": {}, "na2.chat.si.riotgames.com.": {}, + "na2.docusign.net.": {}, "nagich.co.il.": {}, - "nagich.com.": {}, "najva.com.": {}, - "nam.veta.naver.com.": {}, "namequery.com.": {}, - "namiml.com.": {}, "naperville.remotepc.com.": {}, - "napps-2.com.": {}, "nashville.remotepc.com.": {}, - "nation.foxnews.com.": {}, "nationalheritageacademies-my.sharepoint.com.": {}, "nationalheritageacademies.sharepoint.com.": {}, + "nationalmap.gov.": {}, + "nationalreview.com.": {}, "nativecos.com.": {}, "nc-centos-mirror.iwebfusion.net.": {}, - "nc-pod4-smp-device.apple.com.": {}, "nc.com.": {}, - "nc.gifshow.com.": {}, "ncentral.centrexit.com.": {}, "ncjb-my.sharepoint.com.": {}, "nearme.com.cn.": {}, "nechicago.remotepc.com.": {}, "neonataltherapists.com.": {}, "netapp-my.sharepoint.com.": {}, + "netapp.com.": {}, "netapp.sharepoint.com.": {}, "netease.com.": {}, "netease.im.": {}, "netpop.app.": {}, + "netpresenter.com.": {}, "netsolssl.com.": {}, - "new-sentry-relay.xiaohongshu.com.": {}, "new.adblockplus.org.": {}, "newcontinuum.net.": {}, "newhanovercountyschools-my.sharepoint.com.": {}, + "newoldstamp.com.": {}, "neworleans.remotepc.com.": {}, "news-abroad.vivo.com.": {}, "news-af.feednews.com.": {}, "news-client.apple.com.": {}, "news-events.apple.com.": {}, "news-nar-aud.apple.com.": {}, - "news-notification-events.apple.com.": {}, "news-sports-events.apple.com.": {}, "newsletter-edge.apple.com.": {}, "newsroom.bi.": {}, @@ -2831,29 +2793,32 @@ var FakeECSFQDNs = map[string]struct{}{ "nexx360.io.": {}, "nfm365-my.sharepoint.com.": {}, "nfm365.sharepoint.com.": {}, + "ng1.angus.mrisoftware.com.": {}, "ngb.haplat.net.": {}, - "nhentai.net.": {}, + "nh.iz.do.": {}, "nhhospitals-my.sharepoint.com.": {}, "nhshumanservices423-my.sharepoint.com.": {}, - "nhshumanservices423.sharepoint.com.": {}, "nice-team.net.": {}, "nie.netease.com.": {}, "nieuwsblad.be.": {}, "nike.com.multicdn.cloudinary.com.": {}, + "ninjakiwi.com.": {}, "nio365-my.sharepoint.com.": {}, "nio365.sharepoint.com.": {}, "nitropay.com.": {}, + "nkcsd-my.sharepoint.com.": {}, "nmhealth-my.sharepoint.com.": {}, "nmhealth.sharepoint.com.": {}, "noc.computerhelpnj.com.": {}, "node.setupad.com.": {}, "nordcurrent.com.": {}, "norma-external-collect.meizu.com.": {}, + "nortic.ogtic.gob.do.": {}, "notes-analytics-events.apple.com.": {}, "notes.services.box.com.": {}, + "novaicare.com.": {}, "novel.itoon.org.": {}, "nps.gov.": {}, - "nrc.nl.": {}, "ns-cloud-a1.googledomains.com.": {}, "ns-cloud-a2.googledomains.com.": {}, "ns-cloud-a3.googledomains.com.": {}, @@ -2881,24 +2846,24 @@ var FakeECSFQDNs = map[string]struct{}{ "ns1.101domain.com.": {}, "ns1.bluehost.com.": {}, "ns1.cloudflare.net.": {}, - "ns1.digitalocean.com.": {}, "ns1.g.aaplimg.com.": {}, "ns1.google.com.": {}, "ns1.identrust.com.": {}, - "ns1dd441ab0.airspace-cdn.cbsivideo.com.": {}, "ns2.cloudflare.net.": {}, "ns2.g.aaplimg.com.": {}, "ns2.google.com.": {}, + "ns3.24shells.net.": {}, "ns3.cloudflare.net.": {}, "ns3.g.aaplimg.com.": {}, "ns3.google.com.": {}, - "ns35.worldnic.com.": {}, + "ns4.24shells.net.": {}, "ns4.cloudflare.net.": {}, "ns4.g.aaplimg.com.": {}, "ns4.google.com.": {}, "ns5.cloudflare.net.": {}, "nsa.nalpeiron.com.": {}, "nsatc.net.": {}, + "nsp-logserver-higeo-dre.obs.eu-west-101.myhuaweicloud.eu.": {}, "ntes53.netease.com.": {}, "ntp.aliyun.com.": {}, "ntp.arlo.com.": {}, @@ -2918,35 +2883,32 @@ var FakeECSFQDNs = map[string]struct{}{ "nzz.ch.": {}, "o15.officeredir.microsoft.com.": {}, "o300810.mp.lura.live.": {}, - "oasisit-my.sharepoint.com.": {}, - "oauth.ws.sonos.com.": {}, + "oauth-analytics.ascendlearning.com.": {}, "obe0-my.sharepoint.com.": {}, "obihai.telephony.goog.": {}, "obs.ap-southeast-3.myhuaweicloud.com.": {}, + "observability.bereal.com.": {}, "obsproject.com.": {}, "obus-dc2-cn.heytapmobi.com.": {}, "obus-dc20058-cn.heytapmobi.com.": {}, "obus-dc20123-cn.heytapmobi.com.": {}, - "obus-dc20157-cn.heytapmobi.com.": {}, "obus-dctech-cn.heytapmobi.com.": {}, "oc1.chat.si.riotgames.com.": {}, + "oclc.org.": {}, "ocloud.oppomobile.com.": {}, + "ocps-xfer.kronos.net.": {}, + "ocpsfl-my.sharepoint.com.": {}, "ocsa.office.microsoft.com.": {}, "ocsp.identrust.com.": {}, - "ocsp.usertrust.com.": {}, "ocsredir.officeapps.live.com.": {}, - "odsun.log.mgtv.com.": {}, "odw7bf.dood.video.": {}, - "oec22-normal-alisg.tiktokv.com.": {}, "office.microsoft.com.": {}, "officepreviewredir.microsoft.com.": {}, + "officeredir.microsoft.com.": {}, "offline.toc.shopeemobile.com.": {}, - "ohioix.mm.fcix.net.": {}, - "ok7-crtrs.oktaedge.okta.com.": {}, - "oklahomacity.remotepc.com.": {}, + "ogma.bereal.team.": {}, "olatheschoolsorg-my.sharepoint.com.": {}, - "oldnavy-us.attn.tv.": {}, - "om.ordergroove.com.": {}, + "olatheschoolsorg.sharepoint.com.": {}, "omats-my.sharepoint.com.": {}, "omats.sharepoint.com.": {}, "omiapp.me.": {}, @@ -2960,38 +2922,33 @@ var FakeECSFQDNs = map[string]struct{}{ "oneplus.net.": {}, "onethingpcs.com.": {}, "onezapp.com.": {}, - "online.citi.com.": {}, - "onlinepress24-7.com.": {}, + "online.americanexpress.com.edgekey.net.": {}, "onlinewebfonts.com.": {}, - "onsite-api.listrak.com.cdn.cloudflare.net.": {}, "op.mykonf.com.": {}, "opamarketplace.com.": {}, "open.acgnxtracker.com.": {}, "open.acgtracker.com.": {}, "open.demonii.com.": {}, "open.oppomobile.com.": {}, - "open.pixel.api.whale3.io.": {}, "opencmp.net.": {}, + "opencolo.mm.fcix.net.": {}, "opendsp.ru.": {}, "openrice.com.": {}, - "openvpn.net.": {}, "opex-service-cn.allawntech.com.": {}, "oppo.com.": {}, "oppomobile.com.": {}, - "optimize.ulinq.asia.": {}, - "optimize.urekamedia.com.": {}, "optimizely.com.": {}, + "optioncare-my.sharepoint.com.": {}, "optioncare.sharepoint.com.": {}, - "or-mirror.iwebfusion.net.": {}, + "orangeusdorg-my.sharepoint.com.": {}, "oregon.remotepc.com.": {}, - "orga.openrice.com.": {}, + "origin.fe-image-cache-ttp.useast8.byteglb.com.": {}, "orlando.remotepc.com.": {}, "osaka.remotepc.com.": {}, - "oslab.shalltry.com.": {}, - "oslab.transsion-os.com.": {}, "oss-ap-southeast-1.aliyuncs.com.": {}, "oss-ap-southeast-5.aliyuncs.com.": {}, "oss-cn-beijing.aliyuncs.com.": {}, + "oss-cn-hangzhou.aliyuncs.com.": {}, "oss-cn-hongkong.aliyuncs.com.": {}, "oss-cn-shanghai.aliyuncs.com.": {}, "oss-cn-shenzhen.aliyuncs.com.": {}, @@ -3001,39 +2958,44 @@ var FakeECSFQDNs = map[string]struct{}{ "oss-us-west-1.aliyuncs.com.": {}, "otc.t-systems.com.": {}, "otlp.nr-data.net.": {}, - "otto.my.onetrust.eu.": {}, - "ounion.api.mgtv.com.": {}, + "ott.deepl.com.": {}, "oursummit-my.sharepoint.com.": {}, - "oval.id.": {}, + "oursummit.sharepoint.com.": {}, + "overlay.ubisoft.com.": {}, "overleaf.com.": {}, "overleafusercontent.com.": {}, + "oversea-master-log.ap-southeast-1.log.aliyuncs.com.": {}, "overseasccl-a.haplat.net.": {}, "overseasccl-b.haplat.net.": {}, "overseasccl-c.haplat.net.": {}, "overseasccl-major-a.haplat.net.": {}, "overseasccl-major-b.haplat.net.": {}, "overseasccl-major-c.haplat.net.": {}, - "ovp.itv.com.": {}, + "ovh.maxhost.io.": {}, "oxmudr-launches.appsflyersdk.com.": {}, "oxyinc-my.sharepoint.com.": {}, + "p-wonderidea-rdr.us-east-1.log.aliyuncs.com.": {}, "p.adlooxtracking.com.": {}, "p.placed.com.": {}, "p.vivo.com.cn.": {}, + "p0-pu-private-useast8.tiktokv.com.": {}, "p107609.cedexis-test.com.": {}, "p107610.cedexis-test.com.": {}, "p107611.cedexis-test.com.": {}, "p109477.cedexis-test.com.": {}, - "p17652.citrix-itm-test.com.": {}, - "p17652.citrix-itm-test.com.c.footprint.net.": {}, + "p109522.cedexis-test.com.": {}, "p20304.cedexis-test.com.": {}, "p20305.cedexis-test.com.": {}, "p20306.cedexis-test.com.": {}, "p20307b.cedexis-test.com.": {}, "p20308b.cedexis-test.com.": {}, + "p20309.cedexis-test.com.": {}, "p20310.cedexis-test.com.": {}, "p20311.cedexis-test.com.": {}, "p20314.cedexis-test.com.": {}, "p20315.cedexis-test.com.": {}, + "p23-mailws.icloud.com.": {}, + "p25-mailws.icloud.com.": {}, "p2cdn.com.": {}, "p2p-cal-2.anker-in.com.": {}, "p2p-cal.anker-in.com.": {}, @@ -3042,28 +3004,56 @@ var FakeECSFQDNs = map[string]struct{}{ "p2p-sgp.anker-in.com.": {}, "p2p-vir.anker-in.com.": {}, "p2p.qq.com.": {}, + "p2p2.cloudbirds.cn.": {}, + "p2p3.cloudbirds.cn.": {}, "p2pm-ali.reolink.com.": {}, + "p2psy2.io.mi.com.": {}, + "p2psy3.io.mi.com.": {}, "p30605.cedexis-test.com.": {}, "p33-mailws.icloud.com.": {}, "p33231.cedexis-test.com.": {}, + "p33232.cedexis-test.com.": {}, + "p33233.cedexis-test.com.": {}, "p33234.cedexis-test.com.": {}, + "p33235.cedexis-test.com.": {}, "p33236.cedexis-test.com.": {}, + "p33237.cedexis-test.com.": {}, + "p33238.cedexis-test.com.": {}, + "p33239.cedexis-test.com.": {}, + "p33240.cedexis-test.com.": {}, + "p33241.cedexis-test.com.": {}, "p33242.cedexis-test.com.": {}, + "p33243.cedexis-test.com.": {}, + "p33244.cedexis-test.com.": {}, "p33245.cedexis-test.com.": {}, + "p33246.cedexis-test.com.": {}, + "p33247.cedexis-test.com.": {}, + "p33248.cedexis-test.com.": {}, "p33249.cedexis-test.com.": {}, + "p33250.cedexis-test.com.": {}, "p33251.cedexis-test.com.": {}, + "p33252.cedexis-test.com.": {}, + "p33253.cedexis-test.com.": {}, + "p33254.cedexis-test.com.": {}, + "p33255.cedexis-test.com.": {}, "p33256.cedexis-test.com.": {}, + "p33257.cedexis-test.com.": {}, + "p33258.cedexis-test.com.": {}, "p33259.cedexis-test.com.": {}, + "p33260.cedexis-test.com.": {}, "p34854.cedexis-test.com.": {}, + "p34855.cedexis-test.com.": {}, "p34856.cedexis-test.com.": {}, + "p34857.cedexis-test.com.": {}, "p34858.cedexis-test.com.": {}, - "p35399.cedexis-test.com.": {}, + "p34859.cedexis-test.com.": {}, + "p34860.cedexis-test.com.": {}, "p35883.cedexis-test.com.": {}, - "p39264.cedexis-test.com.": {}, + "p38635.cedexis-test.com.": {}, "p39604.cedexis-test.com.": {}, "p3a-creative.brave.com.": {}, "p3a-json.brave.com.": {}, - "p40232.cedexis-test.com.": {}, + "p40-mailws.icloud.com.": {}, "p40233.cedexis-test.com.": {}, "p40234.cedexis-test.com.": {}, "p40235.cedexis-test.com.": {}, @@ -3109,18 +3099,16 @@ var FakeECSFQDNs = map[string]struct{}{ "p43775.cedexis-test.com.": {}, "p43776.cedexis-test.com.": {}, "p43813.cedexis-test.com.": {}, + "p45-mailws.icloud.com.": {}, "p48434.cedexis-test.com.": {}, "p48435.cedexis-test.com.": {}, "p48436.cedexis-test.com.": {}, "p48437.cedexis-test.com.": {}, "p4p.arenabg.com.": {}, "p52066.cedexis-test.com.": {}, - "p55-mailws.icloud.com.": {}, "p56745.cedexis-test.com.": {}, "p56746.cedexis-test.com.": {}, "p56747.cedexis-test.com.": {}, - "p58-mailws.icloud.com.": {}, - "p65-mailws.icloud.com.": {}, "p76593.cedexis-test.com.": {}, "p86069.cedexis-test.com.": {}, "p86070.cedexis-test.com.": {}, @@ -3162,32 +3150,32 @@ var FakeECSFQDNs = map[string]struct{}{ "p95727.cedexis-test.com.": {}, "p95728.cedexis-test.com.": {}, "paccarnet.sharepoint.com.": {}, + "paducahix.mm.fcix.net.": {}, "pai.googlezip.net.": {}, "palermo.remotepc.com.": {}, "palm.tech.": {}, - "pandoraimavideo354813165505.s.moatpixel.com.": {}, "panorama.wixapps.net.": {}, - "papi.walkme.com.": {}, + "panthers-my.sharepoint.com.": {}, "paris.remotepc.com.": {}, + "parkhill1-my.sharepoint.com.": {}, "parkhill1.sharepoint.com.": {}, - "partiality.itunes.apple.com.": {}, - "partners.thepennyhoarder.com.cdn.cloudflare.net.": {}, + "partition.enterprise.com.": {}, + "partnerboost.com.": {}, "pasadena.remotepc.com.": {}, "passportalmsp.com.": {}, - "paulkitchendark.com.": {}, "pay.datatrans.com.": {}, - "pay.wps.cn.": {}, "paycorinc-my.sharepoint.com.": {}, "paylocity1-my.sharepoint.com.": {}, "paylocity1.sharepoint.com.": {}, - "payment.api.speechify.dev.": {}, - "pbc.vliplatform.com.": {}, + "payment.api.speechify.com.": {}, "pbe1.chat.si.riotgames.com.": {}, + "pbs.btloader.com.": {}, "pbsj.bricks-co.com.": {}, "pc-store.lenovomm.cn.": {}, "pcdn.brave.com.": {}, "pcs.baidu.com.": {}, "pd.cdnwidget.com.": {}, + "pd.eu.a.pvp.net.": {}, "pdengagementapi.trafficmanager.net.": {}, "pdfforge.org.": {}, "pdrnetwork-my.sharepoint.com.": {}, @@ -3200,18 +3188,19 @@ var FakeECSFQDNs = map[string]struct{}{ "pepsico.sharepoint.com.": {}, "pepsico.zoom.us.": {}, "perf-eu1.hsforms.com.": {}, - "perimeter-ingress.attentivemobile.com.cdn.cloudflare.net.": {}, "permutive.arstechnica.com.": {}, "permutive.businessinsider.com.": {}, "permutive.com.": {}, "permutive.newyorker.com.": {}, "permutive.wired.com.": {}, + "perr.brightvpn.com.": {}, "perrigo-my.sharepoint.com.": {}, + "perrigo.sharepoint.com.": {}, "pf.intuit.com.": {}, "pfgsales-my.sharepoint.com.": {}, "pfgsales.sharepoint.com.": {}, - "pgsth.kargo.com.": {}, "ph.globe.rcs.telephony.goog.": {}, + "pharos.studyquicks.com.": {}, "phoenix.remotepc.com.": {}, "phoenix2.remotepc.com.": {}, "phx02pap001.storage.live.com.": {}, @@ -3223,50 +3212,51 @@ var FakeECSFQDNs = map[string]struct{}{ "phx02pap007.storage.live.com.": {}, "pi2850.ci.managedwhitelisting.com.": {}, "piano.io.": {}, + "pie-api.io.": {}, "pikabu.ru.": {}, - "ping-oci-med-us-1.mediaverse.ai.": {}, "ping.getadblock.com.": {}, "pingler.com.": {}, "pingmesh.bigo.sg.": {}, + "pinimg.com.": {}, "piojm.tech.": {}, "pis.alicdn.com.": {}, "pittsburgh.remotepc.com.": {}, "pix.cdnwidget.com.": {}, "pixel-sync.trafficmanager.net.": {}, + "pixel.adlooxtracking.com.": {}, "pixel.gliacloud.com.": {}, "pjcr-my.sharepoint.com.": {}, - "pk-live.cn.": {}, + "pkgconnect-my.sharepoint.com.": {}, "pla-prod-scu-apim-01.azure-api.net.": {}, - "planconfig.openspeech.cn.": {}, - "platform.freedomadnetwork.com.": {}, - "player03.com.": {}, "playmatic.video.": {}, "playstream.media.": {}, "plrm.zone.": {}, - "pltw.org.": {}, + "plrsrvcs.com.": {}, "pm.geniusmonkey.com.": {}, - "pngwing.com.": {}, "pns.alicdn.com.": {}, - "pods.officeapps.live.com.": {}, + "pogothere.xyz.": {}, + "poizon.com.": {}, "polarisind-my.sharepoint.com.": {}, "polarisind.sharepoint.com.": {}, + "policy.www.tripadvisor.com.edge.tacdn.com.": {}, "polling.zoom.us.": {}, "polyfill.archive.org.": {}, "popt.in.": {}, - "portal.microsoftonline.com.": {}, + "portal.mypearson.com.": {}, "portal.myweblogon.com.": {}, "portals.mobi.": {}, "portland.remotepc.com.": {}, "portlandoregongov-my.sharepoint.com.": {}, "posthog.com.": {}, - "postholdings-my.sharepoint.com.": {}, "pov.spectrum.net.": {}, + "pow7.com.": {}, "powerpoint-collab.officeapps.live.com.": {}, + "powerpushsell.site.": {}, "ppgames.net.": {}, - "pr-pod1-smp-device.apple.com.": {}, - "pr-pod2-smp-device.apple.com.": {}, + "pr-pod3-smp-device.apple.com.": {}, "pr-pod5-smp-device.apple.com.": {}, "pragmaticplay.net.": {}, + "prebid-am.casalemedia.com.": {}, "prebid-la.casalemedia.com.": {}, "prebid-ny.casalemedia.com.": {}, "prebid-sj.casalemedia.com.": {}, @@ -3275,16 +3265,13 @@ var FakeECSFQDNs = map[string]struct{}{ "prebidserver.pixfuture.com.": {}, "precisionmedicinegroup-my.sharepoint.com.": {}, "precisionmedicinegroup.sharepoint.com.": {}, - "prediction-api-gateway-7igs62jc.uc.gateway.dev.": {}, "premierhealth-my.sharepoint.com.": {}, + "premierhealth.sharepoint.com.": {}, "premium.xvpn.io.": {}, - "preyproject.com.": {}, - "pringed.space.": {}, "printaudit.com.": {}, - "printfriendly.com.": {}, - "pro-blink-aks-tm.trafficmanager.net.": {}, "pro-swishapps-aks-tm.trafficmanager.net.": {}, "procore.com.": {}, + "prod-catalog-autosuggest-api.dickssportinggoods.com.": {}, "prod-client-api.v.aaplimg.com.": {}, "prod-default.lb.logrocket.network.": {}, "prod-event-relay-api.v.aaplimg.com.": {}, @@ -3295,40 +3282,41 @@ var FakeECSFQDNs = map[string]struct{}{ "prod-event-relay-weather-api.v.aaplimg.com.": {}, "prod-newsletter-edge.v.aaplimg.com.": {}, "prod-rso.lol.qq.com.": {}, + "prod-weather-widget-event-gateway.v.aaplimg.com.": {}, "prod.api.letsencrypt.org.": {}, "prod.uno.demonware.net.": {}, + "prodimage.images-bn.com.": {}, "production-login-assets0.cdn.procore.com.": {}, + "production-login-assets1.cdn.procore.com.": {}, "production-login-assets2.cdn.procore.com.": {}, + "production-login-assets3.cdn.procore.com.": {}, "production.kabutoservices.com.": {}, - "progressive-app.quantummetric.com.": {}, "promega-my.sharepoint.com.": {}, "prosperitybankusa.sharepoint.com.": {}, "protonvpn.com.": {}, "provaltech.com.": {}, "proxy-safebrowsing.googleapis.com.": {}, "proxy.mob.maps.yandex.net.": {}, - "prwn.lenovomm.com.": {}, "ps.namequery.com.": {}, "psav-my.sharepoint.com.": {}, "psav.sharepoint.com.": {}, "pshud.365lpodds.com.": {}, "pths209-my.sharepoint.com.": {}, - "ptingless.4d.silverbulletcloud.com.": {}, "pttor-my.sharepoint.com.": {}, "pttplc-my.sharepoint.com.": {}, "pub.affilimateapis.com.": {}, - "pub.headerlift.com.": {}, + "pub.network.": {}, "public.bn.files.1drv.com.": {}, "public.boxcloud.com.": {}, "public.dm.files.1drv.com.": {}, "publictracker.xyz.": {}, "publisher.liveperson.net.": {}, - "pubsub.checkvideo.net.": {}, - "pubtailer.com.": {}, "puffer.6.401402081.west-gcloud.codm.activision.com.": {}, + "puhsd210-my.sharepoint.com.": {}, "puhsd210.sharepoint.com.": {}, "pull-cmaf-f77-tt03.fcdn.eu.tiktokcdn.com.": {}, - "pull-cmaf-f77-tt03.tiktokcdn.com.": {}, + "pull-flv-l77-gcp01.eu.tiktokcdn.com.": {}, + "pull-flv-l77-va01.tiktokcdn.com.": {}, "punch.p2p.qq.com.": {}, "pusd11net-my.sharepoint.com.": {}, "pusd11net.sharepoint.com.": {}, @@ -3339,9 +3327,9 @@ var FakeECSFQDNs = map[string]struct{}{ "pushmart.net.": {}, "pushnetwork.com.": {}, "pushtrs7.push.hicloud.com.": {}, + "puswdsprmtprs.dealersocket.com.": {}, "puv.tt.browser.360.cn.": {}, "pwa.zoom.us.": {}, - "pwcgov-my.sharepoint.com.": {}, "px4.ads.linkedin.com.": {}, "pypestream.com.": {}, "qa.sockets.stackexchange.com.": {}, @@ -3356,26 +3344,27 @@ var FakeECSFQDNs = map[string]struct{}{ "qcloud.com.": {}, "qfp.intuit.com.": {}, "qikify.com.": {}, + "qm.progressive.com.": {}, "qookkagames.com.": {}, "qorvo-my.sharepoint.com.": {}, "qorvo.sharepoint.com.": {}, "qpic.cn.": {}, "qq.com.cn.": {}, - "qsdn-web.qtlcname.com.": {}, + "qsbr.cf2.quoracdn.net.cdn.cloudflare.net.": {}, "qualys.ca.": {}, "qualys.com.": {}, "qualys.eu.": {}, + "quantamagazine.org.": {}, "quebeccity.remotepc.com.": {}, "questdiagnostics.sharepoint.com.": {}, - "quickcep.com.": {}, "quotemedia.com.": {}, - "quotientcrisp913871380293ftp.s.moatpixel.com.": {}, "qurl.f.360.cn.": {}, + "qvc.com.": {}, "qwant.com.": {}, "qxwz.com.": {}, - "r.akulaku.net.": {}, "r.ingest-lr.com.": {}, "r.intake-lr.com.": {}, + "r.logr-ingest.com.": {}, "r.logrocket.io.": {}, "r.lr-hv-in.com.": {}, "r.lr-in-prod.com.": {}, @@ -3385,253 +3374,305 @@ var FakeECSFQDNs = map[string]struct{}{ "r.lr-intake.com.": {}, "r.office.microsoft.com.": {}, "r.superhuman.com.": {}, - "r1---sn-a5msenek.c.2mdn.net.": {}, + "r.turn.com.": {}, + "r1---sn-a5meknzk.c.2mdn.net.": {}, + "r1---sn-ab5l6nk6.c.2mdn.net.": {}, "r1---sn-ab5l6nkd.c.2mdn.net.": {}, "r1---sn-ab5l6nr6.c.2mdn.net.": {}, "r1---sn-ab5l6nrd.c.2mdn.net.": {}, "r1---sn-ab5l6nrk.c.2mdn.net.": {}, "r1---sn-ab5l6nrl.c.2mdn.net.": {}, - "r1---sn-ab5l6nrr.c.2mdn.net.": {}, "r1---sn-ab5l6nrs.c.2mdn.net.": {}, - "r1---sn-ab5l6nrz.c.2mdn.net.": {}, - "r1---sn-ab5sznld.c.2mdn.net.": {}, - "r1---sn-ab5sznly.c.2mdn.net.": {}, - "r1---sn-ab5sznz6.c.2mdn.net.": {}, + "r1---sn-ab5sznlk.c.2mdn.net.": {}, "r1---sn-ab5sznzd.c.2mdn.net.": {}, "r1---sn-ab5sznzk.c.2mdn.net.": {}, + "r1---sn-ab5sznzl.c.2mdn.net.": {}, "r1---sn-ab5sznzr.c.2mdn.net.": {}, "r1---sn-ab5sznzs.c.2mdn.net.": {}, - "r1---sn-ab5sznzy.c.2mdn.net.": {}, "r1---sn-ab5sznzz.c.2mdn.net.": {}, - "r1---sn-p5qddn76.c.2mdn.net.": {}, + "r1---sn-p5qddn7d.c.2mdn.net.": {}, + "r1---sn-p5qddn7k.c.2mdn.net.": {}, + "r1---sn-p5qddn7z.c.2mdn.net.": {}, + "r1---sn-p5qlsn7s.c.2mdn.net.": {}, "r1---sn-p5qs7nsk.c.2mdn.net.": {}, - "r1---sn-q4fl6nd6.c.2mdn.net.": {}, - "r1---sn-q4fl6nz6.c.2mdn.net.": {}, - "r1---sn-q4fzen7s.c.2mdn.net.": {}, + "r1---sn-p5qs7nzk.c.2mdn.net.": {}, + "r1---sn-q4fl6ndl.c.2mdn.net.": {}, + "r1---sn-q4fl6nss.c.2mdn.net.": {}, + "r1---sn-q4flrnl6.c.2mdn.net.": {}, + "r1---sn-q4flrnlz.c.2mdn.net.": {}, + "r1---sn-q4flrnsk.c.2mdn.net.": {}, + "r1---sn-q4fzen7y.c.2mdn.net.": {}, "r1---sn-vgqskn67.c.2mdn.net.": {}, "r1---sn-vgqskn6d.c.2mdn.net.": {}, - "r1---sn-vgqsknls.c.2mdn.net.": {}, + "r1---sn-vgqsknes.c.2mdn.net.": {}, + "r1---sn-vgqsknez.c.2mdn.net.": {}, + "r1---sn-vgqsknld.c.2mdn.net.": {}, + "r1---sn-vgqsknse.c.2mdn.net.": {}, "r1---sn-vgqsknsk.c.2mdn.net.": {}, + "r1---sn-vgqsknz6.c.2mdn.net.": {}, + "r1---sn-vgqsknz7.c.2mdn.net.": {}, "r1---sn-vgqsknzd.c.2mdn.net.": {}, "r1---sn-vgqsknze.c.2mdn.net.": {}, - "r1---sn-vgqsknzk.c.2mdn.net.": {}, "r1---sn-vgqsknzr.c.2mdn.net.": {}, + "r1---sn-vgqsrn66.c.2mdn.net.": {}, "r1---sn-vgqsrn67.c.2mdn.net.": {}, "r1---sn-vgqsrn6e.c.2mdn.net.": {}, "r1---sn-vgqsrn6l.c.2mdn.net.": {}, - "r1---sn-vgqsrnes.c.2mdn.net.": {}, + "r1---sn-vgqsrn6z.c.2mdn.net.": {}, + "r1---sn-vgqsrne6.c.2mdn.net.": {}, "r1---sn-vgqsrnld.c.2mdn.net.": {}, - "r1---sn-vgqsrnlz.c.2mdn.net.": {}, - "r1---sn-vgqsrns6.c.2mdn.net.": {}, - "r1---sn-vgqsrnsr.c.2mdn.net.": {}, + "r1---sn-vgqsrnlk.c.2mdn.net.": {}, + "r1---sn-vgqsrnsd.c.2mdn.net.": {}, "r1---sn-vgqsrnsy.c.2mdn.net.": {}, "r1---sn-vgqsrnz7.c.2mdn.net.": {}, - "r1---sn-vgqsrnzy.c.2mdn.net.": {}, - "r2---sn-a5mekndl.c.2mdn.net.": {}, - "r2---sn-a5mlrnl6.c.2mdn.net.": {}, - "r2---sn-ab5l6ndr.c.2mdn.net.": {}, + "r1---sn-vgqsrnzk.c.2mdn.net.": {}, + "r1---sn-vgqsrnzs.c.2mdn.net.": {}, + "r1---sn-vgqsrnzz.c.2mdn.net.": {}, + "r2---sn-a5mekn6l.c.2mdn.net.": {}, "r2---sn-ab5l6nk6.c.2mdn.net.": {}, "r2---sn-ab5l6nkd.c.2mdn.net.": {}, "r2---sn-ab5l6nr6.c.2mdn.net.": {}, "r2---sn-ab5l6nrd.c.2mdn.net.": {}, "r2---sn-ab5l6nrl.c.2mdn.net.": {}, - "r2---sn-ab5l6nrr.c.2mdn.net.": {}, - "r2---sn-ab5l6nrs.c.2mdn.net.": {}, "r2---sn-ab5l6nrz.c.2mdn.net.": {}, "r2---sn-ab5sznld.c.2mdn.net.": {}, - "r2---sn-ab5sznly.c.2mdn.net.": {}, "r2---sn-ab5sznz6.c.2mdn.net.": {}, - "r2---sn-ab5sznzd.c.2mdn.net.": {}, "r2---sn-ab5sznze.c.2mdn.net.": {}, "r2---sn-ab5sznzk.c.2mdn.net.": {}, "r2---sn-ab5sznzl.c.2mdn.net.": {}, "r2---sn-ab5sznzr.c.2mdn.net.": {}, - "r2---sn-ab5sznzs.c.2mdn.net.": {}, "r2---sn-ab5sznzy.c.2mdn.net.": {}, "r2---sn-ab5sznzz.c.2mdn.net.": {}, "r2---sn-p5qddn7k.c.2mdn.net.": {}, - "r2---sn-p5qlsn76.c.2mdn.net.": {}, + "r2---sn-p5qlsn7s.c.2mdn.net.": {}, + "r2---sn-p5qlsnrl.c.2mdn.net.": {}, "r2---sn-p5qlsnrr.c.2mdn.net.": {}, - "r2---sn-p5qlsny6.c.2mdn.net.": {}, - "r2---sn-p5qs7nzy.c.2mdn.net.": {}, - "r2---sn-q4fl6nsd.c.2mdn.net.": {}, - "r2---sn-q4flrnld.c.2mdn.net.": {}, + "r2---sn-p5qs7nsr.c.2mdn.net.": {}, + "r2---sn-q4fl6n66.c.2mdn.net.": {}, + "r2---sn-q4flrn7r.c.2mdn.net.": {}, + "r2---sn-q4flrney.c.2mdn.net.": {}, + "r2---sn-q4flrnle.c.2mdn.net.": {}, "r2---sn-q4flrnsd.c.2mdn.net.": {}, + "r2---sn-q4flrnsl.c.2mdn.net.": {}, + "r2---sn-q4flrnss.c.2mdn.net.": {}, + "r2---sn-q4fzen7y.c.2mdn.net.": {}, "r2---sn-q4fzene7.c.2mdn.net.": {}, - "r2---sn-q4fzenee.c.2mdn.net.": {}, "r2---sn-vgqskn66.c.2mdn.net.": {}, + "r2---sn-vgqskn67.c.2mdn.net.": {}, "r2---sn-vgqskn6d.c.2mdn.net.": {}, - "r2---sn-vgqsknes.c.2mdn.net.": {}, + "r2---sn-vgqsknld.c.2mdn.net.": {}, "r2---sn-vgqsknlk.c.2mdn.net.": {}, - "r2---sn-vgqsknz6.c.2mdn.net.": {}, - "r2---sn-vgqsknzd.c.2mdn.net.": {}, + "r2---sn-vgqsknlr.c.2mdn.net.": {}, + "r2---sn-vgqskns7.c.2mdn.net.": {}, + "r2---sn-vgqsknz7.c.2mdn.net.": {}, + "r2---sn-vgqsknzs.c.2mdn.net.": {}, "r2---sn-vgqsknzy.c.2mdn.net.": {}, "r2---sn-vgqsrn67.c.2mdn.net.": {}, - "r2---sn-vgqsrns6.c.2mdn.net.": {}, - "r2---sn-vgqsrnsy.c.2mdn.net.": {}, - "r2---sn-vgqsrnzd.c.2mdn.net.": {}, + "r2---sn-vgqsrn6l.c.2mdn.net.": {}, + "r2---sn-vgqsrnlz.c.2mdn.net.": {}, "r2---sn-vgqsrnzk.c.2mdn.net.": {}, - "r2---sn-vgqsrnzs.c.2mdn.net.": {}, - "r3---sn-ab5l6ndr.c.2mdn.net.": {}, + "r2---sn-vgqsrnzr.c.2mdn.net.": {}, + "r3---sn-a5m7lnld.c.2mdn.net.": {}, + "r3---sn-a5meknds.c.2mdn.net.": {}, + "r3---sn-a5mlrnls.c.2mdn.net.": {}, "r3---sn-ab5l6ndy.c.2mdn.net.": {}, "r3---sn-ab5l6nk6.c.2mdn.net.": {}, + "r3---sn-ab5l6nkd.c.2mdn.net.": {}, "r3---sn-ab5l6nr6.c.2mdn.net.": {}, "r3---sn-ab5l6nrk.c.2mdn.net.": {}, "r3---sn-ab5l6nrl.c.2mdn.net.": {}, "r3---sn-ab5l6nrr.c.2mdn.net.": {}, "r3---sn-ab5l6nrs.c.2mdn.net.": {}, "r3---sn-ab5l6nrz.c.2mdn.net.": {}, + "r3---sn-ab5sznld.c.2mdn.net.": {}, "r3---sn-ab5sznz6.c.2mdn.net.": {}, "r3---sn-ab5sznzd.c.2mdn.net.": {}, "r3---sn-ab5sznze.c.2mdn.net.": {}, "r3---sn-ab5sznzk.c.2mdn.net.": {}, "r3---sn-ab5sznzl.c.2mdn.net.": {}, - "r3---sn-ab5sznzr.c.2mdn.net.": {}, "r3---sn-ab5sznzs.c.2mdn.net.": {}, "r3---sn-ab5sznzy.c.2mdn.net.": {}, "r3---sn-ab5sznzz.c.2mdn.net.": {}, "r3---sn-p5qddn7d.c.2mdn.net.": {}, + "r3---sn-p5qddn7k.c.2mdn.net.": {}, "r3---sn-p5qlsn6l.c.2mdn.net.": {}, + "r3---sn-p5qlsn76.c.2mdn.net.": {}, + "r3---sn-p5qlsn7s.c.2mdn.net.": {}, + "r3---sn-p5qlsnrl.c.2mdn.net.": {}, + "r3---sn-p5qlsny6.c.2mdn.net.": {}, "r3---sn-p5qs7nzr.c.2mdn.net.": {}, + "r3---sn-p5qs7nzy.c.2mdn.net.": {}, + "r3---sn-q4fl6n6z.c.2mdn.net.": {}, + "r3---sn-q4fl6ndl.c.2mdn.net.": {}, + "r3---sn-q4fl6ndz.c.2mdn.net.": {}, "r3---sn-q4fl6ns6.c.2mdn.net.": {}, - "r3---sn-q4fl6nzy.c.2mdn.net.": {}, - "r3---sn-q4flrnes.c.2mdn.net.": {}, - "r3---sn-q4flrnlz.c.2mdn.net.": {}, + "r3---sn-q4flrnle.c.2mdn.net.": {}, "r3---sn-q4fzen7l.c.2mdn.net.": {}, - "r3---sn-vgqskn66.c.2mdn.net.": {}, - "r3---sn-vgqskn67.c.2mdn.net.": {}, - "r3---sn-vgqskn6d.c.2mdn.net.": {}, - "r3---sn-vgqskn6s.c.2mdn.net.": {}, + "r3---sn-q4fzen7y.c.2mdn.net.": {}, + "r3---sn-q4fzene7.c.2mdn.net.": {}, "r3---sn-vgqskn6z.c.2mdn.net.": {}, - "r3---sn-vgqsknes.c.2mdn.net.": {}, - "r3---sn-vgqsknsk.c.2mdn.net.": {}, - "r3---sn-vgqsknz6.c.2mdn.net.": {}, + "r3---sn-vgqsknez.c.2mdn.net.": {}, + "r3---sn-vgqsknld.c.2mdn.net.": {}, + "r3---sn-vgqsknlk.c.2mdn.net.": {}, + "r3---sn-vgqsknly.c.2mdn.net.": {}, + "r3---sn-vgqsknse.c.2mdn.net.": {}, + "r3---sn-vgqsknz7.c.2mdn.net.": {}, + "r3---sn-vgqsknzd.c.2mdn.net.": {}, "r3---sn-vgqsknzl.c.2mdn.net.": {}, "r3---sn-vgqsknzy.c.2mdn.net.": {}, - "r3---sn-vgqsrne6.c.2mdn.net.": {}, - "r3---sn-vgqsrnek.c.2mdn.net.": {}, - "r3---sn-vgqsrnld.c.2mdn.net.": {}, - "r3---sn-vgqsrnll.c.2mdn.net.": {}, - "r3---sn-vgqsrns6.c.2mdn.net.": {}, - "r3---sn-vgqsrnz7.c.2mdn.net.": {}, + "r3---sn-vgqsrn67.c.2mdn.net.": {}, + "r3---sn-vgqsrn6z.c.2mdn.net.": {}, + "r3---sn-vgqsrned.c.2mdn.net.": {}, + "r3---sn-vgqsrnsy.c.2mdn.net.": {}, "r3---sn-vgqsrnzd.c.2mdn.net.": {}, - "r3---sn-vgqsrnzr.c.2mdn.net.": {}, + "r3---sn-vgqsrnzk.c.2mdn.net.": {}, + "r3---sn-vgqsrnzs.c.2mdn.net.": {}, "r3---sn-vgqsrnzz.c.2mdn.net.": {}, + "r4---sn-a5mekn6s.c.2mdn.net.": {}, + "r4---sn-a5mlrnlz.c.2mdn.net.": {}, + "r4---sn-ab5l6ndr.c.2mdn.net.": {}, "r4---sn-ab5l6nk6.c.2mdn.net.": {}, "r4---sn-ab5l6nkd.c.2mdn.net.": {}, "r4---sn-ab5l6nr6.c.2mdn.net.": {}, + "r4---sn-ab5l6nrd.c.2mdn.net.": {}, "r4---sn-ab5l6nrk.c.2mdn.net.": {}, "r4---sn-ab5l6nrl.c.2mdn.net.": {}, "r4---sn-ab5l6nrr.c.2mdn.net.": {}, "r4---sn-ab5l6nrs.c.2mdn.net.": {}, "r4---sn-ab5l6nrz.c.2mdn.net.": {}, - "r4---sn-ab5sznld.c.2mdn.net.": {}, - "r4---sn-ab5sznly.c.2mdn.net.": {}, "r4---sn-ab5sznz6.c.2mdn.net.": {}, "r4---sn-ab5sznzd.c.2mdn.net.": {}, "r4---sn-ab5sznze.c.2mdn.net.": {}, - "r4---sn-ab5sznzk.c.2mdn.net.": {}, + "r4---sn-ab5sznzl.c.2mdn.net.": {}, "r4---sn-ab5sznzr.c.2mdn.net.": {}, "r4---sn-ab5sznzs.c.2mdn.net.": {}, "r4---sn-ab5sznzy.c.2mdn.net.": {}, - "r4---sn-ab5sznzz.c.2mdn.net.": {}, - "r4---sn-p5qlsn7s.c.2mdn.net.": {}, - "r4---sn-p5qlsnrr.c.2mdn.net.": {}, - "r4---sn-p5qs7n6d.c.2mdn.net.": {}, - "r4---sn-p5qs7nzr.c.2mdn.net.": {}, - "r4---sn-q4fl6n6s.c.2mdn.net.": {}, + "r4---sn-p5qddn7k.c.2mdn.net.": {}, + "r4---sn-p5qlsn76.c.2mdn.net.": {}, + "r4---sn-p5qlsn7l.c.2mdn.net.": {}, + "r4---sn-p5qlsnd6.c.2mdn.net.": {}, + "r4---sn-p5qlsnrl.c.2mdn.net.": {}, + "r4---sn-p5qlsny6.c.2mdn.net.": {}, + "r4---sn-p5qs7nsr.c.2mdn.net.": {}, + "r4---sn-q4fl6n6z.c.2mdn.net.": {}, + "r4---sn-q4fl6ndl.c.2mdn.net.": {}, "r4---sn-q4fl6nds.c.2mdn.net.": {}, - "r4---sn-q4flrnld.c.2mdn.net.": {}, - "r4---sn-q4flrnlz.c.2mdn.net.": {}, - "r4---sn-q4fzen7l.c.2mdn.net.": {}, + "r4---sn-q4fl6nsd.c.2mdn.net.": {}, + "r4---sn-q4fl6nsr.c.2mdn.net.": {}, + "r4---sn-q4fl6nz6.c.2mdn.net.": {}, + "r4---sn-q4flrnel.c.2mdn.net.": {}, + "r4---sn-q4flrney.c.2mdn.net.": {}, "r4---sn-q4fzen7y.c.2mdn.net.": {}, - "r4---sn-vgqskn6d.c.2mdn.net.": {}, - "r4---sn-vgqsknek.c.2mdn.net.": {}, + "r4---sn-vgqskn66.c.2mdn.net.": {}, + "r4---sn-vgqskn6s.c.2mdn.net.": {}, + "r4---sn-vgqskn6z.c.2mdn.net.": {}, "r4---sn-vgqsknld.c.2mdn.net.": {}, - "r4---sn-vgqsknlk.c.2mdn.net.": {}, "r4---sn-vgqsknlr.c.2mdn.net.": {}, - "r4---sn-vgqsknzd.c.2mdn.net.": {}, - "r4---sn-vgqsrn66.c.2mdn.net.": {}, + "r4---sn-vgqsknls.c.2mdn.net.": {}, + "r4---sn-vgqsknsk.c.2mdn.net.": {}, + "r4---sn-vgqsknze.c.2mdn.net.": {}, + "r4---sn-vgqsknzk.c.2mdn.net.": {}, + "r4---sn-vgqsrn67.c.2mdn.net.": {}, "r4---sn-vgqsrn6e.c.2mdn.net.": {}, - "r4---sn-vgqsrn6l.c.2mdn.net.": {}, - "r4---sn-vgqsrnsr.c.2mdn.net.": {}, - "r4---sn-vgqsrnzk.c.2mdn.net.": {}, + "r4---sn-vgqsrn6z.c.2mdn.net.": {}, + "r4---sn-vgqsrned.c.2mdn.net.": {}, + "r4---sn-vgqsrnl6.c.2mdn.net.": {}, + "r4---sn-vgqsrnld.c.2mdn.net.": {}, + "r4---sn-vgqsrnlk.c.2mdn.net.": {}, + "r4---sn-vgqsrnlz.c.2mdn.net.": {}, + "r4---sn-vgqsrns6.c.2mdn.net.": {}, + "r4---sn-vgqsrnsy.c.2mdn.net.": {}, + "r4---sn-vgqsrnz6.c.2mdn.net.": {}, + "r4---sn-vgqsrnzd.c.2mdn.net.": {}, "r4---sn-vgqsrnzs.c.2mdn.net.": {}, - "r4---sn-vgqsrnzz.c.2mdn.net.": {}, + "r5---sn-a5meknds.c.2mdn.net.": {}, + "r5---sn-ab5l6ndr.c.2mdn.net.": {}, "r5---sn-ab5l6nk6.c.2mdn.net.": {}, "r5---sn-ab5l6nkd.c.2mdn.net.": {}, "r5---sn-ab5l6nr6.c.2mdn.net.": {}, "r5---sn-ab5l6nrd.c.2mdn.net.": {}, "r5---sn-ab5l6nrk.c.2mdn.net.": {}, "r5---sn-ab5l6nrl.c.2mdn.net.": {}, - "r5---sn-ab5l6nrr.c.2mdn.net.": {}, "r5---sn-ab5l6nrs.c.2mdn.net.": {}, + "r5---sn-ab5l6nrz.c.2mdn.net.": {}, "r5---sn-ab5sznld.c.2mdn.net.": {}, + "r5---sn-ab5sznlk.c.2mdn.net.": {}, + "r5---sn-ab5sznz6.c.2mdn.net.": {}, "r5---sn-ab5sznzd.c.2mdn.net.": {}, - "r5---sn-ab5sznze.c.2mdn.net.": {}, - "r5---sn-ab5sznzk.c.2mdn.net.": {}, "r5---sn-ab5sznzl.c.2mdn.net.": {}, "r5---sn-ab5sznzr.c.2mdn.net.": {}, "r5---sn-ab5sznzs.c.2mdn.net.": {}, + "r5---sn-ab5sznzy.c.2mdn.net.": {}, "r5---sn-ab5sznzz.c.2mdn.net.": {}, - "r5---sn-nx57ynse.c.2mdn.net.": {}, - "r5---sn-nx5s7nel.c.2mdn.net.": {}, + "r5---sn-hp57ynl6.c.2mdn.net.": {}, + "r5---sn-p5qddn7d.c.2mdn.net.": {}, "r5---sn-p5qddn7z.c.2mdn.net.": {}, - "r5---sn-p5qlsndz.c.2mdn.net.": {}, - "r5---sn-p5qs7nsr.c.2mdn.net.": {}, + "r5---sn-p5qlsn6l.c.2mdn.net.": {}, + "r5---sn-p5qlsn76.c.2mdn.net.": {}, + "r5---sn-p5qlsn7s.c.2mdn.net.": {}, + "r5---sn-p5qlsnrr.c.2mdn.net.": {}, + "r5---sn-p5qs7n6d.c.2mdn.net.": {}, + "r5---sn-p5qs7nzk.c.2mdn.net.": {}, + "r5---sn-p5qs7nzr.c.2mdn.net.": {}, + "r5---sn-p5qs7nzy.c.2mdn.net.": {}, + "r5---sn-q4fl6ndl.c.2mdn.net.": {}, "r5---sn-q4fl6nsr.c.2mdn.net.": {}, - "r5---sn-q4fl6nz7.c.2mdn.net.": {}, - "r5---sn-q4flrnld.c.2mdn.net.": {}, - "r5---sn-q4flrnss.c.2mdn.net.": {}, - "r5---sn-q4fzene7.c.2mdn.net.": {}, - "r5---sn-vgqskn66.c.2mdn.net.": {}, + "r5---sn-q4flrnsd.c.2mdn.net.": {}, + "r5---sn-q4flrnsl.c.2mdn.net.": {}, "r5---sn-vgqskn67.c.2mdn.net.": {}, "r5---sn-vgqskn6d.c.2mdn.net.": {}, - "r5---sn-vgqskn6z.c.2mdn.net.": {}, - "r5---sn-vgqsknll.c.2mdn.net.": {}, + "r5---sn-vgqsknes.c.2mdn.net.": {}, + "r5---sn-vgqsknlk.c.2mdn.net.": {}, + "r5---sn-vgqsknlr.c.2mdn.net.": {}, + "r5---sn-vgqsknls.c.2mdn.net.": {}, "r5---sn-vgqsknly.c.2mdn.net.": {}, - "r5---sn-vgqskns7.c.2mdn.net.": {}, "r5---sn-vgqsknse.c.2mdn.net.": {}, "r5---sn-vgqsknsk.c.2mdn.net.": {}, - "r5---sn-vgqsknz6.c.2mdn.net.": {}, - "r5---sn-vgqsknzd.c.2mdn.net.": {}, + "r5---sn-vgqsknz7.c.2mdn.net.": {}, "r5---sn-vgqsknzl.c.2mdn.net.": {}, + "r5---sn-vgqsknzr.c.2mdn.net.": {}, "r5---sn-vgqsknzs.c.2mdn.net.": {}, + "r5---sn-vgqsknzz.c.2mdn.net.": {}, "r5---sn-vgqsrn66.c.2mdn.net.": {}, - "r5---sn-vgqsrn67.c.2mdn.net.": {}, + "r5---sn-vgqsrn6e.c.2mdn.net.": {}, "r5---sn-vgqsrn6l.c.2mdn.net.": {}, - "r5---sn-vgqsrnes.c.2mdn.net.": {}, + "r5---sn-vgqsrnez.c.2mdn.net.": {}, + "r5---sn-vgqsrnl6.c.2mdn.net.": {}, "r5---sn-vgqsrnld.c.2mdn.net.": {}, + "r5---sn-vgqsrnlk.c.2mdn.net.": {}, "r5---sn-vgqsrnlz.c.2mdn.net.": {}, + "r5---sn-vgqsrnsy.c.2mdn.net.": {}, + "r5---sn-vgqsrnz6.c.2mdn.net.": {}, + "r5---sn-vgqsrnzd.c.2mdn.net.": {}, + "r5---sn-vgqsrnzk.c.2mdn.net.": {}, + "r5---sn-vgqsrnzr.c.2mdn.net.": {}, + "r5---sn-vgqsrnzs.c.2mdn.net.": {}, "raccorp-my.sharepoint.com.": {}, + "raccorp.sharepoint.com.": {}, "radar.cedexis.com.": {}, "raleigh.remotepc.com.": {}, "randomhouse.app.box.com.": {}, "raspbian.raspberrypi.org.": {}, "rba-screen.healthsafe-id.com.": {}, "rba.onehealthcareid.com.": {}, - "rbm-us.storage.googleapis.com.": {}, + "rbmeuulvihtwm2eltjhwimi2.httpschecker.net.": {}, "rcs-acs-mcc510.jibe.google.com.": {}, "rcs-acs-tmobile-us.jibe.google.com.": {}, "rcs-copper-us.googleapis.com.": {}, "rcs-user-content-us.storage.googleapis.com.": {}, "rcs.telephony.goog.": {}, - "rctiplus.id.": {}, "rd.com.": {}, "realtime.luckyorange.com.": {}, "realtime.services.box.net.": {}, - "realtime2ws.nitrotype.com.": {}, "recharge-prod-apim.azure-api.net.": {}, "recombee.com.": {}, - "recorder.sessionstack.com.": {}, "recruiting.ultipro.com.": {}, "recruiting2.ultipro.com.": {}, + "redcoolmedia.net.": {}, "reedelsevier-my.sharepoint.com.": {}, "reedelsevier.sharepoint.com.": {}, "referconfigexternal.americanexpress.com.": {}, - "referee.xiaohongshu.com.": {}, "reflector.makerbot.com.": {}, - "regional.azure-api.net.": {}, "registration.prap01.cmdagent.trafficmanager.net.": {}, "registration.prau01.cmdagent.trafficmanager.net.": {}, "registration.preu01.cmdagent.trafficmanager.net.": {}, @@ -3640,71 +3681,75 @@ var FakeECSFQDNs = map[string]struct{}{ "regn.sharepoint.com.": {}, "reichelcormier.bid.": {}, "rejuvenation.com.": {}, - "relay.shhnowisnottheti.me.": {}, "remote.control4.com.": {}, "remote.melonhead.me.": {}, + "render.geozo.com.": {}, "renklitoplar.com.": {}, + "replit.dev.": {}, "repo.zabbix.com.": {}, "republicservices-my.sharepoint.com.": {}, "republicservices.sharepoint.com.": {}, "request-global.czilladx.com.": {}, + "resc.cloudinary.com.cdn.cloudflare.net.": {}, "resideo.com.": {}, "resource.digitalinsight.com.": {}, + "restproxy-analytics.ascendlearning.com.": {}, "restrict.youtube.com.": {}, "restrictmoderate.youtube.com.": {}, + "retail.rpay.roku.com.": {}, "retailrocket.net.": {}, "retailstarbucks1com-my.sharepoint.com.": {}, "retailstarbucks1com.sharepoint.com.": {}, - "retcode-sg-lazada.arms.aliyuncs.com.": {}, "retcode-us-west-1.arms.aliyuncs.com.": {}, "rethinkad.com.": {}, "retinavue.net.": {}, "reverso.net.": {}, - "revive-adserver.net.": {}, "rhmail-my.sharepoint.com.": {}, "rhmail.sharepoint.com.": {}, "ri9864.ci.managedwhitelisting.com.": {}, - "rich-content.thescore.com.": {}, "richrelevance.com.": {}, - "ridge.com.": {}, + "ridgewireless.mm.fcix.net.": {}, + "rivergame.net.": {}, "rivhs-my.sharepoint.com.": {}, + "rl.progressive.com.": {}, "rl.quantummetric.com.": {}, - "rlm.haokan.mobi.": {}, "rmm.acctek.com.": {}, "rmm.aunalytics.com.": {}, - "rms-dra.platform.dbankcloud.cn.": {}, - "rms-dre.platform.dbankcloud.cn.": {}, + "rms-dra.platform.dbankcloud.com.": {}, "rn-resource-app.xiaohongshu.com.": {}, "roberthalf-my.sharepoint.com.": {}, - "roblox-c5.cachefly.net.": {}, + "roberthalf.sharepoint.com.": {}, "roborock.com.": {}, "rocketsutoledo-my.sharepoint.com.": {}, + "rockhillssch.aristotleinsight.com.": {}, "rockwellautomation-my.sharepoint.com.": {}, "rockwellautomation.sharepoint.com.": {}, "rockylinux.org.": {}, "rogueone.aristotleinsight.com.": {}, - "rollbar.com.": {}, + "roieu.xyz.": {}, "romsp-unifyconfig.vivo.com.cn.": {}, "roninchain.com.": {}, "rottentomatoes-app.quantummetric.com.": {}, "router.teamviewer.com.": {}, "roxy.azurefd.net.": {}, + "rpiexchange-my.sharepoint.com.": {}, "rpt.cedexis.com.": {}, "rq.wh.cmcm.com.": {}, "rr1---sn-02o-ao3e.googlevideo.com.": {}, "rr1---sn-0nnpbo5a-bggl.googlevideo.com.": {}, "rr1---sn-0op8v4h5pox-cbgl.googlevideo.com.": {}, - "rr1---sn-2aqu-hoaly.googlevideo.com.": {}, "rr1---sn-2imern76.googlevideo.com.": {}, - "rr1---sn-2imern76.gvt1.com.": {}, "rr1---sn-2imern7d.googlevideo.com.": {}, - "rr1---sn-2imern7d.gvt1.com.": {}, "rr1---sn-2imeyn7k.googlevideo.com.": {}, - "rr1---sn-2imeyn7k.gvt1.com.": {}, "rr1---sn-2napbiu-p5ie.googlevideo.com.": {}, + "rr1---sn-2napbiu-p5ie.gvt1.com.": {}, + "rr1---sn-2pmxapm0n-gpje.googlevideo.com.": {}, + "rr1---sn-2pmxapm0n-gpjl.googlevideo.com.": {}, + "rr1---sn-2puupm-2pue.googlevideo.com.": {}, "rr1---sn-2vgu0b5auxaxjvh-apnd.googlevideo.com.": {}, "rr1---sn-2vgu0b5auxaxjvh-v2vd.googlevideo.com.": {}, "rr1---sn-2vgu0b5auxaxjvh-v2ve.googlevideo.com.": {}, + "rr1---sn-2vgu0b5auxaxjvh-v2vk.googlevideo.com.": {}, "rr1---sn-2vgu0b5auxaxjvh-v2vl.googlevideo.com.": {}, "rr1---sn-2vgu0b5auxaxjvh-v2vz.googlevideo.com.": {}, "rr1---sn-30a7rne6.googlevideo.com.": {}, @@ -3715,13 +3760,12 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-30a7yner.googlevideo.com.": {}, "rr1---sn-30a7yney.googlevideo.com.": {}, "rr1---sn-30a7ynl7.googlevideo.com.": {}, + "rr1---sn-3jpm-hjpe.googlevideo.com.": {}, + "rr1---sn-3jpm-hjpe.gvt1.com.": {}, "rr1---sn-3n4pcxg-pjul.googlevideo.com.": {}, - "rr1---sn-42u-nboze.googlevideo.com.": {}, - "rr1---sn-42u-nbozl.googlevideo.com.": {}, - "rr1---sn-42u-nbozz.googlevideo.com.": {}, + "rr1---sn-42a4pcxgoxu-hp5e.googlevideo.com.": {}, "rr1---sn-4g5e6ns6.googlevideo.com.": {}, "rr1---sn-4g5e6ns7.googlevideo.com.": {}, - "rr1---sn-4g5e6nsd.googlevideo.com.": {}, "rr1---sn-4g5e6nsk.googlevideo.com.": {}, "rr1---sn-4g5e6nsr.googlevideo.com.": {}, "rr1---sn-4g5e6nss.googlevideo.com.": {}, @@ -3753,8 +3797,8 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-4g5ednse.googlevideo.com.": {}, "rr1---sn-4g5ednsk.googlevideo.com.": {}, "rr1---sn-4g5ednsl.googlevideo.com.": {}, + "rr1---sn-4g5ednsr.googlevideo.com.": {}, "rr1---sn-4g5ednss.googlevideo.com.": {}, - "rr1---sn-4g5ednsy.googlevideo.com.": {}, "rr1---sn-4g5ednsz.googlevideo.com.": {}, "rr1---sn-4g5ednz7.googlevideo.com.": {}, "rr1---sn-4g5lzne6.googlevideo.com.": {}, @@ -3769,8 +3813,10 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-4g5lznls.googlevideo.com.": {}, "rr1---sn-4g5lznlz.googlevideo.com.": {}, "rr1---sn-4jjo-apnl.googlevideo.com.": {}, - "rr1---sn-4pgnuapbiu-5acs.googlevideo.com.": {}, "rr1---sn-4pgnuapbiu-hiue.googlevideo.com.": {}, + "rr1---sn-4pgnuapbiu-hiul.googlevideo.com.": {}, + "rr1---sn-5gxo-in8l.googlevideo.com.": {}, + "rr1---sn-5gxo-in8s.googlevideo.com.": {}, "rr1---sn-5hne6n6e.googlevideo.com.": {}, "rr1---sn-5hne6n6l.googlevideo.com.": {}, "rr1---sn-5hne6ns6.googlevideo.com.": {}, @@ -3786,6 +3832,7 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-5hne6nzy.googlevideo.com.": {}, "rr1---sn-5hnednss.googlevideo.com.": {}, "rr1---sn-5hnednsz.googlevideo.com.": {}, + "rr1---sn-5hnednsz.gvt1.com.": {}, "rr1---sn-5hnekn76.googlevideo.com.": {}, "rr1---sn-5hnekn7d.googlevideo.com.": {}, "rr1---sn-5hnekn7k.googlevideo.com.": {}, @@ -3800,6 +3847,7 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-5uaezndd.googlevideo.com.": {}, "rr1---sn-5uaezne6.googlevideo.com.": {}, "rr1---sn-5uaezned.googlevideo.com.": {}, + "rr1---sn-5uaeznes.googlevideo.com.": {}, "rr1---sn-5uaeznez.googlevideo.com.": {}, "rr1---sn-5uaeznl6.googlevideo.com.": {}, "rr1---sn-5uaeznld.googlevideo.com.": {}, @@ -3816,11 +3864,11 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-5uaeznyz.googlevideo.com.": {}, "rr1---sn-5uaeznze.googlevideo.com.": {}, "rr1---sn-5ualdnle.googlevideo.com.": {}, + "rr1---sn-5ualdnll.googlevideo.com.": {}, "rr1---sn-5ualdnlr.googlevideo.com.": {}, "rr1---sn-5ualdnls.googlevideo.com.": {}, "rr1---sn-5ualdns6.googlevideo.com.": {}, "rr1---sn-5ualdns7.googlevideo.com.": {}, - "rr1---sn-5ualdnsd.googlevideo.com.": {}, "rr1---sn-5ualdnse.googlevideo.com.": {}, "rr1---sn-5ualdnsk.googlevideo.com.": {}, "rr1---sn-5ualdnsl.googlevideo.com.": {}, @@ -3830,10 +3878,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-5ualdnsz.googlevideo.com.": {}, "rr1---sn-5ualdnz7.googlevideo.com.": {}, "rr1---sn-5ualdnze.googlevideo.com.": {}, - "rr1---sn-8qj-i5o6k.googlevideo.com.": {}, - "rr1---sn-8qj-i5okl.googlevideo.com.": {}, - "rr1---sn-8qj-i5ozd.googlevideo.com.": {}, - "rr1---sn-8qj-i5ozr.googlevideo.com.": {}, "rr1---sn-8qj-nbo66.googlevideo.com.": {}, "rr1---sn-8qj-nbo6y.googlevideo.com.": {}, "rr1---sn-8xgp1vo-2iae.googlevideo.com.": {}, @@ -3846,12 +3890,11 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-8xgp1vo-ab5l.googlevideo.com.": {}, "rr1---sn-8xgp1vo-ab5s.googlevideo.com.": {}, "rr1---sn-8xgp1vo-ab5z.googlevideo.com.": {}, - "rr1---sn-8xgp1vo-nh4e.googlevideo.com.": {}, + "rr1---sn-8xgp1vo-hjpl.googlevideo.com.": {}, "rr1---sn-8xgp1vo-p5ie.googlevideo.com.": {}, "rr1---sn-8xgp1vo-xfge.googlevideo.com.": {}, "rr1---sn-8xgp1vo-xfgl.googlevideo.com.": {}, "rr1---sn-8xgp1vo-xfgs.googlevideo.com.": {}, - "rr1---sn-9gv76n7e.googlevideo.com.": {}, "rr1---sn-9gv76n7l.googlevideo.com.": {}, "rr1---sn-9gv76n7s.googlevideo.com.": {}, "rr1---sn-9gv7ene6.googlevideo.com.": {}, @@ -3859,9 +3902,7 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-9gv7zn76.googlevideo.com.": {}, "rr1---sn-9gv7zn7e.googlevideo.com.": {}, "rr1---sn-9gv7zn7r.googlevideo.com.": {}, - "rr1---sn-9gv7zn7y.googlevideo.com.": {}, "rr1---sn-a5m7lnl6.googlevideo.com.": {}, - "rr1---sn-a5m7lnl6.gvt1.com.": {}, "rr1---sn-a5m7lnld.googlevideo.com.": {}, "rr1---sn-a5mekn6d.googlevideo.com.": {}, "rr1---sn-a5mekn6k.googlevideo.com.": {}, @@ -3869,57 +3910,40 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-a5mekn6r.googlevideo.com.": {}, "rr1---sn-a5mekn6s.googlevideo.com.": {}, "rr1---sn-a5mekn6z.googlevideo.com.": {}, - "rr1---sn-a5mekn6z.gvt1.com.": {}, + "rr1---sn-a5meknd6.googlevideo.com.": {}, "rr1---sn-a5meknde.googlevideo.com.": {}, "rr1---sn-a5meknde.gvt1.com.": {}, "rr1---sn-a5mekndl.googlevideo.com.": {}, - "rr1---sn-a5mekndl.gvt1.com.": {}, + "rr1---sn-a5meknds.googlevideo.com.": {}, "rr1---sn-a5mekndz.googlevideo.com.": {}, - "rr1---sn-a5meknsd.googlevideo.com.": {}, "rr1---sn-a5meknsy.googlevideo.com.": {}, "rr1---sn-a5meknzk.googlevideo.com.": {}, - "rr1---sn-a5meknzl.googlevideo.com.": {}, - "rr1---sn-a5meknzl.gvt1.com.": {}, "rr1---sn-a5meknzr.googlevideo.com.": {}, + "rr1---sn-a5meknzr.gvt1.com.": {}, "rr1---sn-a5mlrnek.googlevideo.com.": {}, - "rr1---sn-a5mlrnek.gvt1.com.": {}, "rr1---sn-a5mlrnl6.googlevideo.com.": {}, - "rr1---sn-a5mlrnl6.gvt1.com.": {}, "rr1---sn-a5mlrnll.googlevideo.com.": {}, - "rr1---sn-a5mlrnll.gvt1.com.": {}, "rr1---sn-a5mlrnls.googlevideo.com.": {}, - "rr1---sn-a5mlrnls.gvt1.com.": {}, "rr1---sn-a5mlrnlz.googlevideo.com.": {}, - "rr1---sn-a5mlrnlz.gvt1.com.": {}, - "rr1---sn-a5msen76.googlevideo.com.": {}, - "rr1---sn-a5msen76.gvt1.com.": {}, "rr1---sn-a5msen7l.googlevideo.com.": {}, "rr1---sn-a5msen7s.googlevideo.com.": {}, + "rr1---sn-a5msen7s.gvt1.com.": {}, "rr1---sn-a5msen7z.googlevideo.com.": {}, "rr1---sn-a5msenek.googlevideo.com.": {}, - "rr1---sn-a5msenek.gvt1.com.": {}, - "rr1---sn-a5msener.googlevideo.com.": {}, "rr1---sn-a5msenes.googlevideo.com.": {}, "rr1---sn-a5msenes.gvt1.com.": {}, "rr1---sn-a5msenl7.googlevideo.com.": {}, - "rr1---sn-a5msenl7.gvt1.com.": {}, "rr1---sn-a5msenle.googlevideo.com.": {}, "rr1---sn-a5msenle.gvt1.com.": {}, "rr1---sn-a5msenll.googlevideo.com.": {}, - "rr1---sn-a5oj5nuxg-hque.googlevideo.com.": {}, - "rr1---sn-a5oj5nuxg-hque.gvt1.com.": {}, + "rr1---sn-a5oj5nuxg-aone.googlevideo.com.": {}, "rr1---sn-ab5l6ndr.googlevideo.com.": {}, - "rr1---sn-ab5l6ndy.googlevideo.com.": {}, "rr1---sn-ab5l6nk6.googlevideo.com.": {}, - "rr1---sn-ab5l6nk6.gvt1.com.": {}, "rr1---sn-ab5l6nkd.googlevideo.com.": {}, - "rr1---sn-ab5l6nkd.gvt1.com.": {}, "rr1---sn-ab5l6nr6.googlevideo.com.": {}, - "rr1---sn-ab5l6nr6.gvt1.com.": {}, "rr1---sn-ab5l6nrd.googlevideo.com.": {}, "rr1---sn-ab5l6nrk.googlevideo.com.": {}, "rr1---sn-ab5l6nrl.googlevideo.com.": {}, - "rr1---sn-ab5l6nrl.gvt1.com.": {}, "rr1---sn-ab5l6nrr.googlevideo.com.": {}, "rr1---sn-ab5l6nrs.googlevideo.com.": {}, "rr1---sn-ab5l6nrz.googlevideo.com.": {}, @@ -3930,15 +3954,13 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-ab5sznzd.googlevideo.com.": {}, "rr1---sn-ab5sznze.googlevideo.com.": {}, "rr1---sn-ab5sznzk.googlevideo.com.": {}, - "rr1---sn-ab5sznzk.gvt1.com.": {}, "rr1---sn-ab5sznzl.googlevideo.com.": {}, "rr1---sn-ab5sznzr.googlevideo.com.": {}, - "rr1---sn-ab5sznzr.gvt1.com.": {}, "rr1---sn-ab5sznzs.googlevideo.com.": {}, - "rr1---sn-ab5sznzs.gvt1.com.": {}, "rr1---sn-ab5sznzy.googlevideo.com.": {}, "rr1---sn-ab5sznzz.googlevideo.com.": {}, "rr1---sn-aigl6n6s.googlevideo.com.": {}, + "rr1---sn-aigl6ned.googlevideo.com.": {}, "rr1---sn-aigl6nek.googlevideo.com.": {}, "rr1---sn-aigl6ner.googlevideo.com.": {}, "rr1---sn-aigl6ney.googlevideo.com.": {}, @@ -3961,17 +3983,15 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-aigzrn7s.googlevideo.com.": {}, "rr1---sn-aigzrn7z.googlevideo.com.": {}, "rr1---sn-aigzrne7.googlevideo.com.": {}, + "rr1---sn-aigzrnld.googlevideo.com.": {}, "rr1---sn-aigzrnse.googlevideo.com.": {}, "rr1---sn-aigzrnsl.googlevideo.com.": {}, "rr1---sn-aigzrnsr.googlevideo.com.": {}, "rr1---sn-aigzrnss.googlevideo.com.": {}, - "rr1---sn-aigzrnss.gvt1.com.": {}, "rr1---sn-aigzrnsz.googlevideo.com.": {}, "rr1---sn-aigzrnz7.googlevideo.com.": {}, "rr1---sn-aigzrnze.googlevideo.com.": {}, - "rr1---sn-apn7en7l.googlevideo.com.": {}, "rr1---sn-apn7en7s.googlevideo.com.": {}, - "rr1---sn-avbpj-cq5e.googlevideo.com.": {}, "rr1---sn-bg5oqxjvh-50nz.googlevideo.com.": {}, "rr1---sn-bg5oqxjvh-jg2s.googlevideo.com.": {}, "rr1---sn-bg5oqxjvh-xa2s.googlevideo.com.": {}, @@ -3983,50 +4003,52 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-cvb7lnlz.googlevideo.com.": {}, "rr1---sn-cvb7sn7k.googlevideo.com.": {}, "rr1---sn-cvb7sn7r.googlevideo.com.": {}, + "rr1---sn-fpnjoxu-h3xl.googlevideo.com.": {}, "rr1---sn-fpnjoxu-hnol.googlevideo.com.": {}, "rr1---sn-gpuuxg-hxhl.googlevideo.com.": {}, "rr1---sn-gpuuxg-hxhl.gvt1.com.": {}, "rr1---sn-gpuuxg-hxhs.googlevideo.com.": {}, "rr1---sn-gpuuxg-hxhs.gvt1.com.": {}, + "rr1---sn-gvbxgn-tvf6.googlevideo.com.": {}, + "rr1---sn-gvbxgn-tvfz.googlevideo.com.": {}, "rr1---sn-h0jeened.googlevideo.com.": {}, "rr1---sn-h0jeenek.googlevideo.com.": {}, "rr1---sn-h0jeener.googlevideo.com.": {}, "rr1---sn-h0jeenl6.googlevideo.com.": {}, "rr1---sn-h0jeenld.googlevideo.com.": {}, "rr1---sn-h0jeenle.googlevideo.com.": {}, + "rr1---sn-h0jeln7e.googlevideo.com.": {}, "rr1---sn-h0jeln7l.googlevideo.com.": {}, "rr1---sn-h0jelne6.googlevideo.com.": {}, "rr1---sn-h0jelne7.googlevideo.com.": {}, "rr1---sn-h0jelnez.googlevideo.com.": {}, + "rr1---sn-hjoj-jaul.googlevideo.com.": {}, "rr1---sn-hjoj-poul.googlevideo.com.": {}, "rr1---sn-hoa7kn76.googlevideo.com.": {}, "rr1---sn-hoa7kn7z.googlevideo.com.": {}, "rr1---sn-hoa7rn76.googlevideo.com.": {}, - "rr1---sn-hoa7rn7z.googlevideo.com.": {}, "rr1---sn-hp57kn6r.googlevideo.com.": {}, + "rr1---sn-hp57kn6r.gvt1.com.": {}, "rr1---sn-hp57kn6y.googlevideo.com.": {}, "rr1---sn-hp57knd6.googlevideo.com.": {}, "rr1---sn-hp57kndd.googlevideo.com.": {}, "rr1---sn-hp57kndk.googlevideo.com.": {}, "rr1---sn-hp57kndr.googlevideo.com.": {}, - "rr1---sn-hp57kndr.gvt1.com.": {}, - "rr1---sn-hp57knds.googlevideo.com.": {}, "rr1---sn-hp57kndy.googlevideo.com.": {}, "rr1---sn-hp57kndz.googlevideo.com.": {}, "rr1---sn-hp57kndz.gvt1.com.": {}, "rr1---sn-hp57yn7r.googlevideo.com.": {}, + "rr1---sn-hp57yn7r.gvt1.com.": {}, "rr1---sn-hp57yn7y.googlevideo.com.": {}, - "rr1---sn-hp57yne7.googlevideo.com.": {}, "rr1---sn-hp57ynl6.googlevideo.com.": {}, "rr1---sn-hp57ynl6.gvt1.com.": {}, - "rr1---sn-hp57ynlr.googlevideo.com.": {}, "rr1---sn-hp57ynly.googlevideo.com.": {}, "rr1---sn-hp57yns7.googlevideo.com.": {}, "rr1---sn-hp57ynse.googlevideo.com.": {}, "rr1---sn-hp57ynsl.googlevideo.com.": {}, "rr1---sn-hp57ynss.googlevideo.com.": {}, "rr1---sn-hp57ynss.gvt1.com.": {}, - "rr1---sn-hxugvoxupoj-poqz.googlevideo.com.": {}, + "rr1---sn-hxgpu-qufs.googlevideo.com.": {}, "rr1---sn-i3b7kn6s.googlevideo.com.": {}, "rr1---sn-i3b7knld.googlevideo.com.": {}, "rr1---sn-i3b7knlk.googlevideo.com.": {}, @@ -4035,7 +4057,7 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-i3b7knse.googlevideo.com.": {}, "rr1---sn-i3b7knsl.googlevideo.com.": {}, "rr1---sn-i3b7knzl.googlevideo.com.": {}, - "rr1---sn-i3belne6.googlevideo.com.": {}, + "rr1---sn-i3b7knzs.googlevideo.com.": {}, "rr1---sn-i3belney.googlevideo.com.": {}, "rr1---sn-i3belnl6.googlevideo.com.": {}, "rr1---sn-i3belnl7.googlevideo.com.": {}, @@ -4052,7 +4074,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-i5heen7d.googlevideo.com.": {}, "rr1---sn-i5heen7r.googlevideo.com.": {}, "rr1---sn-i5heen7s.googlevideo.com.": {}, - "rr1---sn-i5heen7z.googlevideo.com.": {}, "rr1---sn-jn2pgx4pcxg-w5os.googlevideo.com.": {}, "rr1---sn-jvhj5nu-2iae.googlevideo.com.": {}, "rr1---sn-jvhj5nu-2ial.googlevideo.com.": {}, @@ -4066,7 +4087,10 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-jvhj5nu-qufz.googlevideo.com.": {}, "rr1---sn-jxopj-n5oe.googlevideo.com.": {}, "rr1---sn-jxopj-n5oe.gvt1.com.": {}, + "rr1---sn-muxa-2iae.googlevideo.com.": {}, "rr1---sn-n0g45pg-ncoe.googlevideo.com.": {}, + "rr1---sn-n2uxaxjvh-j5xl.googlevideo.com.": {}, + "rr1---sn-n2uxaxjvh-j5xl.gvt1.com.": {}, "rr1---sn-n2uxaxjvh-j5xs.googlevideo.com.": {}, "rr1---sn-n2uxaxjvh-j5xs.gvt1.com.": {}, "rr1---sn-n4v7snee.googlevideo.com.": {}, @@ -4078,7 +4102,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-n4v7snly.googlevideo.com.": {}, "rr1---sn-n4v7sns7.googlevideo.com.": {}, "rr1---sn-n4v7snse.googlevideo.com.": {}, - "rr1---sn-n4v7snse.gvt1.com.": {}, "rr1---sn-nh5gujvh-h4xe.googlevideo.com.": {}, "rr1---sn-nh5gujvh-h4xe.gvt1.com.": {}, "rr1---sn-npoe7ndl.googlevideo.com.": {}, @@ -4107,11 +4130,11 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-npoeenee.googlevideo.com.": {}, "rr1---sn-npoeenek.googlevideo.com.": {}, "rr1---sn-npoeener.googlevideo.com.": {}, - "rr1---sn-npoeenez.googlevideo.com.": {}, + "rr1---sn-npoeeney.googlevideo.com.": {}, "rr1---sn-npoeenl7.googlevideo.com.": {}, "rr1---sn-npoeenle.googlevideo.com.": {}, + "rr1---sn-npoeenlk.googlevideo.com.": {}, "rr1---sn-npoeenll.googlevideo.com.": {}, - "rr1---sn-npoeenly.googlevideo.com.": {}, "rr1---sn-npoeens7.googlevideo.com.": {}, "rr1---sn-npoldn76.googlevideo.com.": {}, "rr1---sn-npoldn7d.googlevideo.com.": {}, @@ -4122,24 +4145,21 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-npoldn7z.googlevideo.com.": {}, "rr1---sn-npoldne7.googlevideo.com.": {}, "rr1---sn-nuagpm-nuae.googlevideo.com.": {}, - "rr1---sn-nv0ui4gvou-hape.googlevideo.com.": {}, + "rr1---sn-nv0uixgo-5ual.googlevideo.com.": {}, "rr1---sn-nv47ln6e.googlevideo.com.": {}, - "rr1---sn-nv47lns7.googlevideo.com.": {}, - "rr1---sn-nv47lnsd.googlevideo.com.": {}, "rr1---sn-nv47zn7r.googlevideo.com.": {}, "rr1---sn-nv47zn7y.googlevideo.com.": {}, "rr1---sn-nv47zne7.googlevideo.com.": {}, + "rr1---sn-nv47znee.googlevideo.com.": {}, "rr1---sn-nv47znel.googlevideo.com.": {}, + "rr1---sn-nx57ynlk.googlevideo.com.": {}, + "rr1---sn-nx57ynlk.gvt1.com.": {}, "rr1---sn-nx57ynsd.googlevideo.com.": {}, - "rr1---sn-nx57ynsd.gvt1.com.": {}, "rr1---sn-nx57ynse.googlevideo.com.": {}, - "rr1---sn-nx57ynse.gvt1.com.": {}, "rr1---sn-nx57ynsk.googlevideo.com.": {}, - "rr1---sn-nx57ynsk.gvt1.com.": {}, "rr1---sn-nx57ynsl.googlevideo.com.": {}, "rr1---sn-nx57ynsl.gvt1.com.": {}, "rr1---sn-nx57ynss.googlevideo.com.": {}, - "rr1---sn-nx57ynss.gvt1.com.": {}, "rr1---sn-nx57ynsz.googlevideo.com.": {}, "rr1---sn-nx57ynsz.gvt1.com.": {}, "rr1---sn-nx5s7n76.googlevideo.com.": {}, @@ -4147,15 +4167,12 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-nx5s7n7d.googlevideo.com.": {}, "rr1---sn-nx5s7n7d.gvt1.com.": {}, "rr1---sn-nx5s7n7s.googlevideo.com.": {}, - "rr1---sn-nx5s7n7s.gvt1.com.": {}, "rr1---sn-nx5s7n7y.googlevideo.com.": {}, "rr1---sn-nx5s7n7y.gvt1.com.": {}, "rr1---sn-nx5s7n7z.googlevideo.com.": {}, - "rr1---sn-nx5s7n7z.gvt1.com.": {}, "rr1---sn-nx5s7nee.googlevideo.com.": {}, "rr1---sn-nx5s7nee.gvt1.com.": {}, "rr1---sn-nx5s7nel.googlevideo.com.": {}, - "rr1---sn-nx5s7nel.gvt1.com.": {}, "rr1---sn-o097znsd.googlevideo.com.": {}, "rr1---sn-o097znse.googlevideo.com.": {}, "rr1---sn-o097znsk.googlevideo.com.": {}, @@ -4170,10 +4187,10 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-o097znzr.googlevideo.com.": {}, "rr1---sn-opnq-n5ue.googlevideo.com.": {}, "rr1---sn-ounjvhh-acce.googlevideo.com.": {}, - "rr1---sn-oxgpj-5ace.googlevideo.com.": {}, "rr1---sn-p5qddn76.googlevideo.com.": {}, "rr1---sn-p5qddn7d.googlevideo.com.": {}, "rr1---sn-p5qddn7k.googlevideo.com.": {}, + "rr1---sn-p5qddn7r.googlevideo.com.": {}, "rr1---sn-p5qddn7z.googlevideo.com.": {}, "rr1---sn-p5qlsn6l.googlevideo.com.": {}, "rr1---sn-p5qlsn76.googlevideo.com.": {}, @@ -4185,13 +4202,13 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-p5qlsndk.googlevideo.com.": {}, "rr1---sn-p5qlsndr.googlevideo.com.": {}, "rr1---sn-p5qlsndz.googlevideo.com.": {}, + "rr1---sn-p5qlsnrl.googlevideo.com.": {}, "rr1---sn-p5qlsnrr.googlevideo.com.": {}, "rr1---sn-p5qlsny6.googlevideo.com.": {}, "rr1---sn-p5qs7n6d.googlevideo.com.": {}, "rr1---sn-p5qs7nsk.googlevideo.com.": {}, "rr1---sn-p5qs7nsr.googlevideo.com.": {}, "rr1---sn-p5qs7nzk.googlevideo.com.": {}, - "rr1---sn-p5qs7nzk.gvt1.com.": {}, "rr1---sn-p5qs7nzr.googlevideo.com.": {}, "rr1---sn-p5qs7nzy.googlevideo.com.": {}, "rr1---sn-paapovpnjxou0gt-nual.googlevideo.com.": {}, @@ -4200,17 +4217,18 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-q4fl6n66.googlevideo.com.": {}, "rr1---sn-q4fl6n66.gvt1.com.": {}, "rr1---sn-q4fl6n6d.googlevideo.com.": {}, + "rr1---sn-q4fl6n6d.gvt1.com.": {}, "rr1---sn-q4fl6n6r.googlevideo.com.": {}, - "rr1---sn-q4fl6n6r.gvt1.com.": {}, "rr1---sn-q4fl6n6s.googlevideo.com.": {}, + "rr1---sn-q4fl6n6s.gvt1.com.": {}, "rr1---sn-q4fl6n6y.googlevideo.com.": {}, "rr1---sn-q4fl6n6z.googlevideo.com.": {}, + "rr1---sn-q4fl6n6z.gvt1.com.": {}, "rr1---sn-q4fl6nd6.googlevideo.com.": {}, "rr1---sn-q4fl6nd6.gvt1.com.": {}, "rr1---sn-q4fl6nd7.googlevideo.com.": {}, "rr1---sn-q4fl6nde.googlevideo.com.": {}, "rr1---sn-q4fl6ndl.googlevideo.com.": {}, - "rr1---sn-q4fl6ndl.gvt1.com.": {}, "rr1---sn-q4fl6nds.googlevideo.com.": {}, "rr1---sn-q4fl6nds.gvt1.com.": {}, "rr1---sn-q4fl6ndz.googlevideo.com.": {}, @@ -4227,12 +4245,10 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-q4fl6nsr.gvt1.com.": {}, "rr1---sn-q4fl6nss.googlevideo.com.": {}, "rr1---sn-q4fl6nsy.googlevideo.com.": {}, + "rr1---sn-q4fl6nsy.gvt1.com.": {}, "rr1---sn-q4fl6nz6.googlevideo.com.": {}, - "rr1---sn-q4fl6nz6.gvt1.com.": {}, "rr1---sn-q4fl6nz7.googlevideo.com.": {}, - "rr1---sn-q4fl6nz7.gvt1.com.": {}, "rr1---sn-q4fl6nzy.googlevideo.com.": {}, - "rr1---sn-q4fl6nzy.gvt1.com.": {}, "rr1---sn-q4flrn7k.googlevideo.com.": {}, "rr1---sn-q4flrn7r.googlevideo.com.": {}, "rr1---sn-q4flrn7y.googlevideo.com.": {}, @@ -4240,30 +4256,32 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-q4flrne7.googlevideo.com.": {}, "rr1---sn-q4flrne7.gvt1.com.": {}, "rr1---sn-q4flrnee.googlevideo.com.": {}, + "rr1---sn-q4flrnee.gvt1.com.": {}, "rr1---sn-q4flrnek.googlevideo.com.": {}, "rr1---sn-q4flrnek.gvt1.com.": {}, "rr1---sn-q4flrnel.googlevideo.com.": {}, + "rr1---sn-q4flrnel.gvt1.com.": {}, "rr1---sn-q4flrner.googlevideo.com.": {}, "rr1---sn-q4flrnes.googlevideo.com.": {}, "rr1---sn-q4flrney.googlevideo.com.": {}, "rr1---sn-q4flrnez.googlevideo.com.": {}, "rr1---sn-q4flrnl6.googlevideo.com.": {}, "rr1---sn-q4flrnl7.googlevideo.com.": {}, + "rr1---sn-q4flrnl7.gvt1.com.": {}, "rr1---sn-q4flrnld.googlevideo.com.": {}, + "rr1---sn-q4flrnld.gvt1.com.": {}, "rr1---sn-q4flrnle.googlevideo.com.": {}, - "rr1---sn-q4flrnle.gvt1.com.": {}, "rr1---sn-q4flrnlz.googlevideo.com.": {}, + "rr1---sn-q4flrnlz.gvt1.com.": {}, "rr1---sn-q4flrnsd.googlevideo.com.": {}, "rr1---sn-q4flrnsd.gvt1.com.": {}, "rr1---sn-q4flrnsk.googlevideo.com.": {}, - "rr1---sn-q4flrnsk.gvt1.com.": {}, "rr1---sn-q4flrnsl.googlevideo.com.": {}, + "rr1---sn-q4flrnsl.gvt1.com.": {}, "rr1---sn-q4flrnss.googlevideo.com.": {}, - "rr1---sn-q4flrnss.gvt1.com.": {}, "rr1---sn-q4fzen7e.googlevideo.com.": {}, "rr1---sn-q4fzen7e.gvt1.com.": {}, "rr1---sn-q4fzen7l.googlevideo.com.": {}, - "rr1---sn-q4fzen7l.gvt1.com.": {}, "rr1---sn-q4fzen7r.googlevideo.com.": {}, "rr1---sn-q4fzen7r.gvt1.com.": {}, "rr1---sn-q4fzen7s.googlevideo.com.": {}, @@ -4271,8 +4289,7 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-q4fzen7y.gvt1.com.": {}, "rr1---sn-q4fzene7.googlevideo.com.": {}, "rr1---sn-q4fzenee.googlevideo.com.": {}, - "rr1---sn-qpbp-30ar.googlevideo.com.": {}, - "rr1---sn-qpbp-30ay.googlevideo.com.": {}, + "rr1---sn-q4fzenee.gvt1.com.": {}, "rr1---sn-qxo7rn7k.googlevideo.com.": {}, "rr1---sn-qxo7rn7r.googlevideo.com.": {}, "rr1---sn-qxoedn7k.googlevideo.com.": {}, @@ -4281,87 +4298,61 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-u1hp55-5c.googlevideo.com.": {}, "rr1---sn-uhvcpaxoa-5hne.googlevideo.com.": {}, "rr1---sn-uhvcpaxoa-guhe.googlevideo.com.": {}, - "rr1---sn-v53a5oqnji-4oul.googlevideo.com.": {}, - "rr1---sn-v53a5oqnji-4oul.gvt1.com.": {}, "rr1---sn-v5goxu-jhi6.googlevideo.com.": {}, "rr1---sn-v5goxu-jhi6.gvt1.com.": {}, "rr1---sn-v5goxu-jhil.googlevideo.com.": {}, - "rr1---sn-v5goxu-jhil.gvt1.com.": {}, "rr1---sn-v5goxu-jhiz.googlevideo.com.": {}, - "rr1---sn-v5goxu-jhiz.gvt1.com.": {}, "rr1---sn-vgqskn66.googlevideo.com.": {}, "rr1---sn-vgqskn67.googlevideo.com.": {}, - "rr1---sn-vgqskn67.gvt1.com.": {}, "rr1---sn-vgqskn6d.googlevideo.com.": {}, "rr1---sn-vgqskn6s.googlevideo.com.": {}, "rr1---sn-vgqskn6z.googlevideo.com.": {}, - "rr1---sn-vgqskn6z.gvt1.com.": {}, "rr1---sn-vgqskne6.googlevideo.com.": {}, - "rr1---sn-vgqskne6.gvt1.com.": {}, "rr1---sn-vgqskned.googlevideo.com.": {}, "rr1---sn-vgqsknek.googlevideo.com.": {}, "rr1---sn-vgqsknes.googlevideo.com.": {}, "rr1---sn-vgqsknez.googlevideo.com.": {}, - "rr1---sn-vgqsknez.gvt1.com.": {}, "rr1---sn-vgqsknld.googlevideo.com.": {}, "rr1---sn-vgqsknlk.googlevideo.com.": {}, - "rr1---sn-vgqsknlk.gvt1.com.": {}, "rr1---sn-vgqsknll.googlevideo.com.": {}, + "rr1---sn-vgqsknlr.googlevideo.com.": {}, "rr1---sn-vgqsknls.googlevideo.com.": {}, - "rr1---sn-vgqsknls.gvt1.com.": {}, "rr1---sn-vgqsknlz.googlevideo.com.": {}, "rr1---sn-vgqsknse.googlevideo.com.": {}, "rr1---sn-vgqsknsk.googlevideo.com.": {}, - "rr1---sn-vgqsknsk.gvt1.com.": {}, "rr1---sn-vgqsknz6.googlevideo.com.": {}, - "rr1---sn-vgqsknz6.gvt1.com.": {}, "rr1---sn-vgqsknz7.googlevideo.com.": {}, - "rr1---sn-vgqsknz7.gvt1.com.": {}, "rr1---sn-vgqsknzd.googlevideo.com.": {}, - "rr1---sn-vgqsknzd.gvt1.com.": {}, "rr1---sn-vgqsknze.googlevideo.com.": {}, "rr1---sn-vgqsknzk.googlevideo.com.": {}, "rr1---sn-vgqsknzl.googlevideo.com.": {}, - "rr1---sn-vgqsknzl.gvt1.com.": {}, "rr1---sn-vgqsknzr.googlevideo.com.": {}, - "rr1---sn-vgqsknzr.gvt1.com.": {}, "rr1---sn-vgqsknzs.googlevideo.com.": {}, - "rr1---sn-vgqsknzs.gvt1.com.": {}, "rr1---sn-vgqsknzy.googlevideo.com.": {}, "rr1---sn-vgqsknzz.googlevideo.com.": {}, "rr1---sn-vgqsrn66.googlevideo.com.": {}, "rr1---sn-vgqsrn67.googlevideo.com.": {}, "rr1---sn-vgqsrn6e.googlevideo.com.": {}, - "rr1---sn-vgqsrn6e.gvt1.com.": {}, "rr1---sn-vgqsrn6l.googlevideo.com.": {}, "rr1---sn-vgqsrn6z.googlevideo.com.": {}, - "rr1---sn-vgqsrn6z.gvt1.com.": {}, "rr1---sn-vgqsrne6.googlevideo.com.": {}, - "rr1---sn-vgqsrne6.gvt1.com.": {}, "rr1---sn-vgqsrned.googlevideo.com.": {}, "rr1---sn-vgqsrnek.googlevideo.com.": {}, "rr1---sn-vgqsrnes.googlevideo.com.": {}, - "rr1---sn-vgqsrnes.gvt1.com.": {}, "rr1---sn-vgqsrnez.googlevideo.com.": {}, "rr1---sn-vgqsrnl6.googlevideo.com.": {}, "rr1---sn-vgqsrnld.googlevideo.com.": {}, + "rr1---sn-vgqsrnlk.googlevideo.com.": {}, "rr1---sn-vgqsrnll.googlevideo.com.": {}, "rr1---sn-vgqsrnls.googlevideo.com.": {}, - "rr1---sn-vgqsrnls.gvt1.com.": {}, - "rr1---sn-vgqsrnlz.googlevideo.com.": {}, "rr1---sn-vgqsrns6.googlevideo.com.": {}, "rr1---sn-vgqsrnsd.googlevideo.com.": {}, "rr1---sn-vgqsrnsr.googlevideo.com.": {}, - "rr1---sn-vgqsrnsr.gvt1.com.": {}, "rr1---sn-vgqsrnsy.googlevideo.com.": {}, "rr1---sn-vgqsrnz6.googlevideo.com.": {}, - "rr1---sn-vgqsrnz6.gvt1.com.": {}, "rr1---sn-vgqsrnz7.googlevideo.com.": {}, - "rr1---sn-vgqsrnz7.gvt1.com.": {}, "rr1---sn-vgqsrnzd.googlevideo.com.": {}, - "rr1---sn-vgqsrnzd.gvt1.com.": {}, "rr1---sn-vgqsrnzk.googlevideo.com.": {}, - "rr1---sn-vgqsrnzk.gvt1.com.": {}, "rr1---sn-vgqsrnzr.googlevideo.com.": {}, "rr1---sn-vgqsrnzs.googlevideo.com.": {}, "rr1---sn-vgqsrnzy.googlevideo.com.": {}, @@ -4370,45 +4361,36 @@ var FakeECSFQDNs = map[string]struct{}{ "rr1---sn-voxoxu-v3jl.googlevideo.com.": {}, "rr1---sn-voxoxu-v3js.googlevideo.com.": {}, "rr1---sn-xo5-co5l.googlevideo.com.": {}, - "rr1.sn-5hne6nsz.googlevideo.com.": {}, - "rr1.sn-5hneknek.googlevideo.com.": {}, - "rr1.sn-q4fl6ndl.googlevideo.com.": {}, - "rr1.sn-q4fl6ns7.googlevideo.com.": {}, - "rr1.sn-q4flrnsk.googlevideo.com.": {}, - "rr10---sn-8qj-i5ozd.googlevideo.com.": {}, - "rr10---sn-bvvbax-2ial.googlevideo.com.": {}, - "rr11---sn-bvvbax-2ial.googlevideo.com.": {}, - "rr12---sn-8qj-i5ozd.googlevideo.com.": {}, - "rr12---sn-bvvbax-2ial.googlevideo.com.": {}, + "rr1.sn-q4fl6n66.googlevideo.com.": {}, + "rr1.sn-q4fl6nds.googlevideo.com.": {}, + "rr1.sn-q4flrnsd.googlevideo.com.": {}, "rr2---sn-02o-ao3e.googlevideo.com.": {}, "rr2---sn-0nnpbo5a-bggl.googlevideo.com.": {}, "rr2---sn-0op8v4h5pox-cbgl.googlevideo.com.": {}, - "rr2---sn-2aqu-hoaly.googlevideo.com.": {}, - "rr2---sn-2aqu-hoas7.googlevideo.com.": {}, "rr2---sn-2imern76.googlevideo.com.": {}, - "rr2---sn-2imern76.gvt1.com.": {}, "rr2---sn-2imern7d.googlevideo.com.": {}, - "rr2---sn-2imern7d.gvt1.com.": {}, "rr2---sn-2imeyn7k.googlevideo.com.": {}, - "rr2---sn-2imeyn7k.gvt1.com.": {}, "rr2---sn-2napbiu-p5ie.googlevideo.com.": {}, + "rr2---sn-2napbiu-p5ie.gvt1.com.": {}, + "rr2---sn-2pmxapm0n-gpje.googlevideo.com.": {}, + "rr2---sn-2pmxapm0n-gpjl.googlevideo.com.": {}, + "rr2---sn-2puupm-2pue.googlevideo.com.": {}, "rr2---sn-2vgu0b5auxaxjvh-apnd.googlevideo.com.": {}, "rr2---sn-2vgu0b5auxaxjvh-v2vd.googlevideo.com.": {}, "rr2---sn-2vgu0b5auxaxjvh-v2ve.googlevideo.com.": {}, + "rr2---sn-2vgu0b5auxaxjvh-v2vk.googlevideo.com.": {}, "rr2---sn-2vgu0b5auxaxjvh-v2vl.googlevideo.com.": {}, "rr2---sn-2vgu0b5auxaxjvh-v2vz.googlevideo.com.": {}, "rr2---sn-30a7rne6.googlevideo.com.": {}, "rr2---sn-30a7rned.googlevideo.com.": {}, "rr2---sn-30a7rnek.googlevideo.com.": {}, "rr2---sn-30a7rner.googlevideo.com.": {}, - "rr2---sn-30a7ynek.googlevideo.com.": {}, "rr2---sn-30a7yner.googlevideo.com.": {}, "rr2---sn-30a7yney.googlevideo.com.": {}, "rr2---sn-30a7ynl7.googlevideo.com.": {}, + "rr2---sn-3jpm-hjpe.googlevideo.com.": {}, + "rr2---sn-3jpm-hjpe.gvt1.com.": {}, "rr2---sn-3n4pcxg-pjul.googlevideo.com.": {}, - "rr2---sn-42u-nboze.googlevideo.com.": {}, - "rr2---sn-42u-nbozl.googlevideo.com.": {}, - "rr2---sn-42u-nbozs.googlevideo.com.": {}, "rr2---sn-4g5e6ns6.googlevideo.com.": {}, "rr2---sn-4g5e6ns7.googlevideo.com.": {}, "rr2---sn-4g5e6nsd.googlevideo.com.": {}, @@ -4443,6 +4425,7 @@ var FakeECSFQDNs = map[string]struct{}{ "rr2---sn-4g5ednse.googlevideo.com.": {}, "rr2---sn-4g5ednsk.googlevideo.com.": {}, "rr2---sn-4g5ednsl.googlevideo.com.": {}, + "rr2---sn-4g5ednsr.googlevideo.com.": {}, "rr2---sn-4g5ednss.googlevideo.com.": {}, "rr2---sn-4g5ednsy.googlevideo.com.": {}, "rr2---sn-4g5ednsz.googlevideo.com.": {}, @@ -4452,7 +4435,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr2---sn-4g5lznek.googlevideo.com.": {}, "rr2---sn-4g5lzner.googlevideo.com.": {}, "rr2---sn-4g5lznes.googlevideo.com.": {}, - "rr2---sn-4g5lzney.googlevideo.com.": {}, "rr2---sn-4g5lznez.googlevideo.com.": {}, "rr2---sn-4g5lznl6.googlevideo.com.": {}, "rr2---sn-4g5lznl7.googlevideo.com.": {}, @@ -4460,8 +4442,10 @@ var FakeECSFQDNs = map[string]struct{}{ "rr2---sn-4g5lznls.googlevideo.com.": {}, "rr2---sn-4g5lznlz.googlevideo.com.": {}, "rr2---sn-4jjo-apnl.googlevideo.com.": {}, - "rr2---sn-4pgnuapbiu-5acs.googlevideo.com.": {}, "rr2---sn-4pgnuapbiu-hiue.googlevideo.com.": {}, + "rr2---sn-4pgnuapbiu-hiul.googlevideo.com.": {}, + "rr2---sn-5gxo-in8l.googlevideo.com.": {}, + "rr2---sn-5gxo-in8s.googlevideo.com.": {}, "rr2---sn-5hne6n6e.googlevideo.com.": {}, "rr2---sn-5hne6n6l.googlevideo.com.": {}, "rr2---sn-5hne6ns6.googlevideo.com.": {}, @@ -4484,7 +4468,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr2---sn-5hnekn7s.googlevideo.com.": {}, "rr2---sn-5hnekn7z.googlevideo.com.": {}, "rr2---sn-5hneknee.googlevideo.com.": {}, - "rr2---sn-5hneknee.gvt1.com.": {}, "rr2---sn-5hneknek.googlevideo.com.": {}, "rr2---sn-5hneknes.googlevideo.com.": {}, "rr2---sn-5pgnugx5h-hn2s.googlevideo.com.": {}, @@ -4492,6 +4475,7 @@ var FakeECSFQDNs = map[string]struct{}{ "rr2---sn-5uaezndd.googlevideo.com.": {}, "rr2---sn-5uaezne6.googlevideo.com.": {}, "rr2---sn-5uaezned.googlevideo.com.": {}, + "rr2---sn-5uaeznes.googlevideo.com.": {}, "rr2---sn-5uaeznez.googlevideo.com.": {}, "rr2---sn-5uaeznl6.googlevideo.com.": {}, "rr2---sn-5uaeznld.googlevideo.com.": {}, @@ -4523,9 +4507,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr2---sn-5ualdnsz.googlevideo.com.": {}, "rr2---sn-5ualdnz7.googlevideo.com.": {}, "rr2---sn-5ualdnze.googlevideo.com.": {}, - "rr2---sn-8qj-i5o6k.googlevideo.com.": {}, - "rr2---sn-8qj-i5okl.googlevideo.com.": {}, - "rr2---sn-8qj-i5ozr.googlevideo.com.": {}, "rr2---sn-8qj-nbo66.googlevideo.com.": {}, "rr2---sn-8qj-nbo6y.googlevideo.com.": {}, "rr2---sn-8xgp1vo-2iae.googlevideo.com.": {}, @@ -4539,7 +4520,7 @@ var FakeECSFQDNs = map[string]struct{}{ "rr2---sn-8xgp1vo-ab5l.googlevideo.com.": {}, "rr2---sn-8xgp1vo-ab5s.googlevideo.com.": {}, "rr2---sn-8xgp1vo-ab5z.googlevideo.com.": {}, - "rr2---sn-8xgp1vo-nh4e.googlevideo.com.": {}, + "rr2---sn-8xgp1vo-hjpl.googlevideo.com.": {}, "rr2---sn-8xgp1vo-p5ie.googlevideo.com.": {}, "rr2---sn-8xgp1vo-vgqe.googlevideo.com.": {}, "rr2---sn-8xgp1vo-xfge.googlevideo.com.": {}, @@ -4553,73 +4534,61 @@ var FakeECSFQDNs = map[string]struct{}{ "rr2---sn-9gv7zn7r.googlevideo.com.": {}, "rr2---sn-9gv7zn7y.googlevideo.com.": {}, "rr2---sn-a5m7lnl6.googlevideo.com.": {}, + "rr2---sn-a5m7lnl6.gvt1.com.": {}, "rr2---sn-a5m7lnld.googlevideo.com.": {}, "rr2---sn-a5mekn6d.googlevideo.com.": {}, - "rr2---sn-a5mekn6d.gvt1.com.": {}, "rr2---sn-a5mekn6k.googlevideo.com.": {}, - "rr2---sn-a5mekn6k.gvt1.com.": {}, "rr2---sn-a5mekn6l.googlevideo.com.": {}, - "rr2---sn-a5mekn6l.gvt1.com.": {}, "rr2---sn-a5mekn6r.googlevideo.com.": {}, "rr2---sn-a5mekn6s.googlevideo.com.": {}, "rr2---sn-a5mekn6z.googlevideo.com.": {}, "rr2---sn-a5meknd6.googlevideo.com.": {}, - "rr2---sn-a5meknd6.gvt1.com.": {}, "rr2---sn-a5meknde.googlevideo.com.": {}, - "rr2---sn-a5meknde.gvt1.com.": {}, "rr2---sn-a5mekndl.googlevideo.com.": {}, - "rr2---sn-a5mekndl.gvt1.com.": {}, "rr2---sn-a5meknds.googlevideo.com.": {}, "rr2---sn-a5meknds.gvt1.com.": {}, "rr2---sn-a5mekndz.googlevideo.com.": {}, "rr2---sn-a5meknsd.googlevideo.com.": {}, "rr2---sn-a5meknsy.googlevideo.com.": {}, "rr2---sn-a5meknzk.googlevideo.com.": {}, - "rr2---sn-a5meknzk.gvt1.com.": {}, "rr2---sn-a5meknzr.googlevideo.com.": {}, "rr2---sn-a5meknzs.googlevideo.com.": {}, - "rr2---sn-a5meknzs.gvt1.com.": {}, + "rr2---sn-a5mlrnek.googlevideo.com.": {}, "rr2---sn-a5mlrnl6.googlevideo.com.": {}, - "rr2---sn-a5mlrnl6.gvt1.com.": {}, "rr2---sn-a5mlrnll.googlevideo.com.": {}, + "rr2---sn-a5mlrnll.gvt1.com.": {}, "rr2---sn-a5mlrnls.googlevideo.com.": {}, "rr2---sn-a5mlrnlz.googlevideo.com.": {}, - "rr2---sn-a5mlrnlz.gvt1.com.": {}, "rr2---sn-a5msen76.googlevideo.com.": {}, - "rr2---sn-a5msen76.gvt1.com.": {}, "rr2---sn-a5msen7l.googlevideo.com.": {}, "rr2---sn-a5msen7s.googlevideo.com.": {}, "rr2---sn-a5msen7z.googlevideo.com.": {}, "rr2---sn-a5msenek.googlevideo.com.": {}, - "rr2---sn-a5msenek.gvt1.com.": {}, "rr2---sn-a5msener.googlevideo.com.": {}, "rr2---sn-a5msenes.googlevideo.com.": {}, + "rr2---sn-a5msenes.gvt1.com.": {}, "rr2---sn-a5msenl7.googlevideo.com.": {}, "rr2---sn-a5msenle.googlevideo.com.": {}, + "rr2---sn-a5msenle.gvt1.com.": {}, "rr2---sn-a5msenll.googlevideo.com.": {}, - "rr2---sn-a5oj5nuxg-hque.gvt1.com.": {}, + "rr2---sn-a5oj5nuxg-aone.googlevideo.com.": {}, "rr2---sn-ab5l6ndr.googlevideo.com.": {}, - "rr2---sn-ab5l6ndr.gvt1.com.": {}, "rr2---sn-ab5l6ndy.googlevideo.com.": {}, "rr2---sn-ab5l6nk6.googlevideo.com.": {}, "rr2---sn-ab5l6nkd.googlevideo.com.": {}, "rr2---sn-ab5l6nr6.googlevideo.com.": {}, - "rr2---sn-ab5l6nr6.gvt1.com.": {}, "rr2---sn-ab5l6nrd.googlevideo.com.": {}, "rr2---sn-ab5l6nrd.gvt1.com.": {}, "rr2---sn-ab5l6nrk.googlevideo.com.": {}, "rr2---sn-ab5l6nrl.googlevideo.com.": {}, "rr2---sn-ab5l6nrr.googlevideo.com.": {}, - "rr2---sn-ab5l6nrr.gvt1.com.": {}, "rr2---sn-ab5l6nrs.googlevideo.com.": {}, "rr2---sn-ab5l6nrz.googlevideo.com.": {}, - "rr2---sn-ab5l6nrz.gvt1.com.": {}, "rr2---sn-ab5sznld.googlevideo.com.": {}, "rr2---sn-ab5sznlk.googlevideo.com.": {}, "rr2---sn-ab5sznly.googlevideo.com.": {}, "rr2---sn-ab5sznz6.googlevideo.com.": {}, "rr2---sn-ab5sznzd.googlevideo.com.": {}, - "rr2---sn-ab5sznzd.gvt1.com.": {}, "rr2---sn-ab5sznze.googlevideo.com.": {}, "rr2---sn-ab5sznzk.googlevideo.com.": {}, "rr2---sn-ab5sznzl.googlevideo.com.": {}, @@ -4636,7 +4605,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr2---sn-aigl6ns6.googlevideo.com.": {}, "rr2---sn-aigl6nsd.googlevideo.com.": {}, "rr2---sn-aigl6nsk.googlevideo.com.": {}, - "rr2---sn-aigl6nsk.gvt1.com.": {}, "rr2---sn-aigl6nsr.googlevideo.com.": {}, "rr2---sn-aigl6nz7.googlevideo.com.": {}, "rr2---sn-aigl6nze.googlevideo.com.": {}, @@ -4660,43 +4628,49 @@ var FakeECSFQDNs = map[string]struct{}{ "rr2---sn-aigzrnsz.googlevideo.com.": {}, "rr2---sn-aigzrnz7.googlevideo.com.": {}, "rr2---sn-aigzrnze.googlevideo.com.": {}, + "rr2---sn-aj5ua5-5c.googlevideo.com.": {}, "rr2---sn-apn7en7e.googlevideo.com.": {}, "rr2---sn-apn7en7l.googlevideo.com.": {}, "rr2---sn-apn7en7s.googlevideo.com.": {}, - "rr2---sn-avbpj-cq5e.googlevideo.com.": {}, "rr2---sn-bg5oqxjvh-50nz.googlevideo.com.": {}, "rr2---sn-bg5oqxjvh-jg2s.googlevideo.com.": {}, "rr2---sn-bg5oqxjvh-xa2s.googlevideo.com.": {}, + "rr2---sn-bvvbax-2iae.googlevideo.com.": {}, "rr2---sn-c0q7lnz7.googlevideo.com.": {}, "rr2---sn-cvb7lne7.googlevideo.com.": {}, "rr2---sn-cvb7lnee.googlevideo.com.": {}, - "rr2---sn-cvb7lnl7.googlevideo.com.": {}, "rr2---sn-cvb7lnls.googlevideo.com.": {}, "rr2---sn-cvb7lnlz.googlevideo.com.": {}, "rr2---sn-cvb7sn7k.googlevideo.com.": {}, "rr2---sn-cvb7sn7r.googlevideo.com.": {}, + "rr2---sn-fpnjoxu-h3xl.googlevideo.com.": {}, "rr2---sn-fpnjoxu-hnol.googlevideo.com.": {}, "rr2---sn-gpuuxg-hxhl.googlevideo.com.": {}, "rr2---sn-gpuuxg-hxhl.gvt1.com.": {}, "rr2---sn-gpuuxg-hxhs.googlevideo.com.": {}, "rr2---sn-gpuuxg-hxhs.gvt1.com.": {}, + "rr2---sn-gvbxgn-tvf6.googlevideo.com.": {}, + "rr2---sn-gvbxgn-tvfz.googlevideo.com.": {}, + "rr2---sn-h0jeened.googlevideo.com.": {}, "rr2---sn-h0jeenek.googlevideo.com.": {}, - "rr2---sn-h0jeenl6.googlevideo.com.": {}, + "rr2---sn-h0jeener.googlevideo.com.": {}, "rr2---sn-h0jeenld.googlevideo.com.": {}, + "rr2---sn-h0jeenle.googlevideo.com.": {}, "rr2---sn-h0jeln7e.googlevideo.com.": {}, "rr2---sn-h0jeln7l.googlevideo.com.": {}, "rr2---sn-h0jelne6.googlevideo.com.": {}, - "rr2---sn-h0jelne7.googlevideo.com.": {}, "rr2---sn-h0jelnes.googlevideo.com.": {}, "rr2---sn-h0jelnez.googlevideo.com.": {}, "rr2---sn-hjoj-gq0l.googlevideo.com.": {}, "rr2---sn-hjoj-gq0l.gvt1.com.": {}, + "rr2---sn-hjoj-jaul.googlevideo.com.": {}, "rr2---sn-hjoj-poul.googlevideo.com.": {}, "rr2---sn-hoa7kn76.googlevideo.com.": {}, "rr2---sn-hoa7kn7z.googlevideo.com.": {}, "rr2---sn-hoa7rn76.googlevideo.com.": {}, "rr2---sn-hoa7rn7z.googlevideo.com.": {}, "rr2---sn-hp57kn6r.googlevideo.com.": {}, + "rr2---sn-hp57kn6r.gvt1.com.": {}, "rr2---sn-hp57kn6y.googlevideo.com.": {}, "rr2---sn-hp57knd6.googlevideo.com.": {}, "rr2---sn-hp57kndd.googlevideo.com.": {}, @@ -4704,7 +4678,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr2---sn-hp57kndr.googlevideo.com.": {}, "rr2---sn-hp57knds.googlevideo.com.": {}, "rr2---sn-hp57kndy.googlevideo.com.": {}, - "rr2---sn-hp57kndy.gvt1.com.": {}, "rr2---sn-hp57kndz.googlevideo.com.": {}, "rr2---sn-hp57yn7r.googlevideo.com.": {}, "rr2---sn-hp57yn7y.googlevideo.com.": {}, @@ -4716,12 +4689,14 @@ var FakeECSFQDNs = map[string]struct{}{ "rr2---sn-hp57ynly.googlevideo.com.": {}, "rr2---sn-hp57yns7.googlevideo.com.": {}, "rr2---sn-hp57ynse.googlevideo.com.": {}, + "rr2---sn-hp57ynsl.googlevideo.com.": {}, + "rr2---sn-hp57ynsl.gvt1.com.": {}, "rr2---sn-hp57ynss.googlevideo.com.": {}, - "rr2---sn-hp57ynss.gvt1.com.": {}, - "rr2---sn-hxugvoxupoj-poqz.googlevideo.com.": {}, + "rr2---sn-hxgpu-qufs.googlevideo.com.": {}, "rr2---sn-i3b7kn6s.googlevideo.com.": {}, "rr2---sn-i3b7knld.googlevideo.com.": {}, "rr2---sn-i3b7knlk.googlevideo.com.": {}, + "rr2---sn-i3b7kns6.googlevideo.com.": {}, "rr2---sn-i3b7knsd.googlevideo.com.": {}, "rr2---sn-i3b7knse.googlevideo.com.": {}, "rr2---sn-i3b7knsl.googlevideo.com.": {}, @@ -4732,7 +4707,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr2---sn-i3belnl6.googlevideo.com.": {}, "rr2---sn-i3belnl7.googlevideo.com.": {}, "rr2---sn-i3belnll.googlevideo.com.": {}, - "rr2---sn-i3belnls.googlevideo.com.": {}, "rr2---sn-i3belnlz.googlevideo.com.": {}, "rr2---sn-i3bssn7e.googlevideo.com.": {}, "rr2---sn-i5f5ppuxa-ioal.googlevideo.com.": {}, @@ -4758,6 +4732,7 @@ var FakeECSFQDNs = map[string]struct{}{ "rr2---sn-jxopj-n5oe.gvt1.com.": {}, "rr2---sn-jxopj-nh4e.googlevideo.com.": {}, "rr2---sn-jxopj-nh4e.gvt1.com.": {}, + "rr2---sn-muxa-2iae.googlevideo.com.": {}, "rr2---sn-n0g45pg-ncoe.googlevideo.com.": {}, "rr2---sn-n2uxaxjvh-j5xl.googlevideo.com.": {}, "rr2---sn-n2uxaxjvh-j5xl.gvt1.com.": {}, @@ -4765,13 +4740,11 @@ var FakeECSFQDNs = map[string]struct{}{ "rr2---sn-n2uxaxjvh-j5xs.gvt1.com.": {}, "rr2---sn-n4v7snee.googlevideo.com.": {}, "rr2---sn-n4v7sney.googlevideo.com.": {}, - "rr2---sn-n4v7snl7.googlevideo.com.": {}, "rr2---sn-n4v7snll.googlevideo.com.": {}, "rr2---sn-n4v7snlr.googlevideo.com.": {}, "rr2---sn-n4v7snls.googlevideo.com.": {}, "rr2---sn-n4v7snly.googlevideo.com.": {}, "rr2---sn-n4v7sns7.googlevideo.com.": {}, - "rr2---sn-n4v7sns7.gvt1.com.": {}, "rr2---sn-n4v7snse.googlevideo.com.": {}, "rr2---sn-nh5gujvh-h4xe.googlevideo.com.": {}, "rr2---sn-nh5gujvh-h4xe.gvt1.com.": {}, @@ -4791,7 +4764,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr2---sn-npoe7ns7.googlevideo.com.": {}, "rr2---sn-npoe7nsd.googlevideo.com.": {}, "rr2---sn-npoe7nsk.googlevideo.com.": {}, - "rr2---sn-npoe7nsk.gvt1.com.": {}, "rr2---sn-npoe7nsl.googlevideo.com.": {}, "rr2---sn-npoe7nsr.googlevideo.com.": {}, "rr2---sn-npoe7nss.googlevideo.com.": {}, @@ -4819,54 +4791,48 @@ var FakeECSFQDNs = map[string]struct{}{ "rr2---sn-npoldn7z.googlevideo.com.": {}, "rr2---sn-npoldne7.googlevideo.com.": {}, "rr2---sn-nuagpm-nuae.googlevideo.com.": {}, - "rr2---sn-nv0ui4gvou-hape.googlevideo.com.": {}, + "rr2---sn-nv0uixgo-5ual.googlevideo.com.": {}, "rr2---sn-nv47ln6e.googlevideo.com.": {}, - "rr2---sn-nv47lns6.googlevideo.com.": {}, - "rr2---sn-nv47lns7.googlevideo.com.": {}, - "rr2---sn-nv47lnsr.googlevideo.com.": {}, "rr2---sn-nv47zn7r.googlevideo.com.": {}, "rr2---sn-nv47zn7y.googlevideo.com.": {}, "rr2---sn-nv47zne7.googlevideo.com.": {}, "rr2---sn-nv47znee.googlevideo.com.": {}, "rr2---sn-nv47znel.googlevideo.com.": {}, + "rr2---sn-nx57ynlk.googlevideo.com.": {}, "rr2---sn-nx57ynsd.googlevideo.com.": {}, "rr2---sn-nx57ynsd.gvt1.com.": {}, "rr2---sn-nx57ynsk.googlevideo.com.": {}, - "rr2---sn-nx57ynsk.gvt1.com.": {}, "rr2---sn-nx57ynsl.googlevideo.com.": {}, - "rr2---sn-nx57ynsl.gvt1.com.": {}, "rr2---sn-nx57ynss.googlevideo.com.": {}, "rr2---sn-nx57ynss.gvt1.com.": {}, "rr2---sn-nx57ynsz.googlevideo.com.": {}, + "rr2---sn-nx57ynsz.gvt1.com.": {}, "rr2---sn-nx5s7n76.googlevideo.com.": {}, + "rr2---sn-nx5s7n7d.googlevideo.com.": {}, "rr2---sn-nx5s7n7y.googlevideo.com.": {}, - "rr2---sn-nx5s7n7y.gvt1.com.": {}, "rr2---sn-nx5s7n7z.googlevideo.com.": {}, - "rr2---sn-nx5s7n7z.gvt1.com.": {}, "rr2---sn-nx5s7nee.googlevideo.com.": {}, + "rr2---sn-nx5s7nee.gvt1.com.": {}, "rr2---sn-nx5s7nel.googlevideo.com.": {}, "rr2---sn-nx5s7nel.gvt1.com.": {}, "rr2---sn-o097znsd.googlevideo.com.": {}, - "rr2---sn-o097znsd.gvt1.com.": {}, "rr2---sn-o097znse.googlevideo.com.": {}, "rr2---sn-o097znsk.googlevideo.com.": {}, "rr2---sn-o097znsl.googlevideo.com.": {}, "rr2---sn-o097znsr.googlevideo.com.": {}, - "rr2---sn-o097znsr.gvt1.com.": {}, "rr2---sn-o097znss.googlevideo.com.": {}, "rr2---sn-o097znsz.googlevideo.com.": {}, "rr2---sn-o097znz7.googlevideo.com.": {}, "rr2---sn-o097znzd.googlevideo.com.": {}, "rr2---sn-o097znze.googlevideo.com.": {}, - "rr2---sn-o097znze.gvt1.com.": {}, "rr2---sn-o097znzk.googlevideo.com.": {}, "rr2---sn-o097znzr.googlevideo.com.": {}, "rr2---sn-opnq-n5ue.googlevideo.com.": {}, "rr2---sn-ounjvhh-acce.googlevideo.com.": {}, - "rr2---sn-oxgpj-5ace.googlevideo.com.": {}, "rr2---sn-p5qddn76.googlevideo.com.": {}, "rr2---sn-p5qddn7d.googlevideo.com.": {}, "rr2---sn-p5qddn7k.googlevideo.com.": {}, + "rr2---sn-p5qddn7r.googlevideo.com.": {}, "rr2---sn-p5qddn7z.googlevideo.com.": {}, "rr2---sn-p5qlsn6l.googlevideo.com.": {}, "rr2---sn-p5qlsn76.googlevideo.com.": {}, @@ -4875,13 +4841,13 @@ var FakeECSFQDNs = map[string]struct{}{ "rr2---sn-p5qlsn7s.googlevideo.com.": {}, "rr2---sn-p5qlsnd6.googlevideo.com.": {}, "rr2---sn-p5qlsndd.googlevideo.com.": {}, - "rr2---sn-p5qlsndr.googlevideo.com.": {}, "rr2---sn-p5qlsndz.googlevideo.com.": {}, "rr2---sn-p5qlsnrl.googlevideo.com.": {}, "rr2---sn-p5qlsnrr.googlevideo.com.": {}, "rr2---sn-p5qlsny6.googlevideo.com.": {}, "rr2---sn-p5qs7n6d.googlevideo.com.": {}, "rr2---sn-p5qs7nsk.googlevideo.com.": {}, + "rr2---sn-p5qs7nsr.googlevideo.com.": {}, "rr2---sn-p5qs7nzk.googlevideo.com.": {}, "rr2---sn-p5qs7nzr.googlevideo.com.": {}, "rr2---sn-p5qs7nzy.googlevideo.com.": {}, @@ -4890,23 +4856,20 @@ var FakeECSFQDNs = map[string]struct{}{ "rr2---sn-pobpb-poql.googlevideo.com.": {}, "rr2---sn-q4fl6n66.googlevideo.com.": {}, "rr2---sn-q4fl6n6d.googlevideo.com.": {}, - "rr2---sn-q4fl6n6d.gvt1.com.": {}, "rr2---sn-q4fl6n6r.googlevideo.com.": {}, "rr2---sn-q4fl6n6s.googlevideo.com.": {}, + "rr2---sn-q4fl6n6s.gvt1.com.": {}, "rr2---sn-q4fl6n6y.googlevideo.com.": {}, "rr2---sn-q4fl6n6z.googlevideo.com.": {}, "rr2---sn-q4fl6nd6.googlevideo.com.": {}, "rr2---sn-q4fl6nd7.googlevideo.com.": {}, - "rr2---sn-q4fl6nd7.gvt1.com.": {}, "rr2---sn-q4fl6nde.googlevideo.com.": {}, "rr2---sn-q4fl6ndl.googlevideo.com.": {}, - "rr2---sn-q4fl6ndl.gvt1.com.": {}, "rr2---sn-q4fl6nds.googlevideo.com.": {}, - "rr2---sn-q4fl6nds.gvt1.com.": {}, "rr2---sn-q4fl6ndz.googlevideo.com.": {}, - "rr2---sn-q4fl6ndz.gvt1.com.": {}, "rr2---sn-q4fl6nlz.googlevideo.com.": {}, "rr2---sn-q4fl6ns6.googlevideo.com.": {}, + "rr2---sn-q4fl6ns6.gvt1.com.": {}, "rr2---sn-q4fl6ns7.googlevideo.com.": {}, "rr2---sn-q4fl6ns7.gvt1.com.": {}, "rr2---sn-q4fl6nsd.googlevideo.com.": {}, @@ -4914,13 +4877,12 @@ var FakeECSFQDNs = map[string]struct{}{ "rr2---sn-q4fl6nsk.googlevideo.com.": {}, "rr2---sn-q4fl6nsk.gvt1.com.": {}, "rr2---sn-q4fl6nsl.googlevideo.com.": {}, - "rr2---sn-q4fl6nsl.gvt1.com.": {}, "rr2---sn-q4fl6nsr.googlevideo.com.": {}, "rr2---sn-q4fl6nss.googlevideo.com.": {}, "rr2---sn-q4fl6nsy.googlevideo.com.": {}, "rr2---sn-q4fl6nsy.gvt1.com.": {}, - "rr2---sn-q4fl6nz6.googlevideo.com.": {}, "rr2---sn-q4fl6nz7.googlevideo.com.": {}, + "rr2---sn-q4fl6nz7.gvt1.com.": {}, "rr2---sn-q4fl6nzy.googlevideo.com.": {}, "rr2---sn-q4flrn7k.googlevideo.com.": {}, "rr2---sn-q4flrn7r.googlevideo.com.": {}, @@ -4928,13 +4890,13 @@ var FakeECSFQDNs = map[string]struct{}{ "rr2---sn-q4flrn7y.gvt1.com.": {}, "rr2---sn-q4flrne6.googlevideo.com.": {}, "rr2---sn-q4flrne7.googlevideo.com.": {}, - "rr2---sn-q4flrne7.gvt1.com.": {}, "rr2---sn-q4flrnee.googlevideo.com.": {}, "rr2---sn-q4flrnek.googlevideo.com.": {}, "rr2---sn-q4flrnel.googlevideo.com.": {}, "rr2---sn-q4flrner.googlevideo.com.": {}, "rr2---sn-q4flrner.gvt1.com.": {}, "rr2---sn-q4flrnes.googlevideo.com.": {}, + "rr2---sn-q4flrnes.gvt1.com.": {}, "rr2---sn-q4flrney.googlevideo.com.": {}, "rr2---sn-q4flrnez.googlevideo.com.": {}, "rr2---sn-q4flrnl6.googlevideo.com.": {}, @@ -4942,133 +4904,113 @@ var FakeECSFQDNs = map[string]struct{}{ "rr2---sn-q4flrnld.googlevideo.com.": {}, "rr2---sn-q4flrnld.gvt1.com.": {}, "rr2---sn-q4flrnle.googlevideo.com.": {}, - "rr2---sn-q4flrnle.gvt1.com.": {}, - "rr2---sn-q4flrnlz.googlevideo.com.": {}, "rr2---sn-q4flrnsd.googlevideo.com.": {}, + "rr2---sn-q4flrnsd.gvt1.com.": {}, "rr2---sn-q4flrnsk.googlevideo.com.": {}, "rr2---sn-q4flrnsl.googlevideo.com.": {}, "rr2---sn-q4flrnsl.gvt1.com.": {}, "rr2---sn-q4flrnss.googlevideo.com.": {}, - "rr2---sn-q4flrnss.gvt1.com.": {}, "rr2---sn-q4fzen7e.googlevideo.com.": {}, "rr2---sn-q4fzen7l.googlevideo.com.": {}, "rr2---sn-q4fzen7r.googlevideo.com.": {}, - "rr2---sn-q4fzen7r.gvt1.com.": {}, "rr2---sn-q4fzen7s.googlevideo.com.": {}, - "rr2---sn-q4fzen7s.gvt1.com.": {}, "rr2---sn-q4fzen7y.googlevideo.com.": {}, "rr2---sn-q4fzene7.googlevideo.com.": {}, "rr2---sn-q4fzene7.gvt1.com.": {}, "rr2---sn-q4fzenee.googlevideo.com.": {}, - "rr2---sn-q4fzenee.gvt1.com.": {}, - "rr2---sn-qpbp-30ay.googlevideo.com.": {}, "rr2---sn-qxo7rn7k.googlevideo.com.": {}, "rr2---sn-qxo7rn7r.googlevideo.com.": {}, "rr2---sn-qxo7rn7y.googlevideo.com.": {}, + "rr2---sn-qxoedn7k.googlevideo.com.": {}, "rr2---sn-qxoedne7.googlevideo.com.": {}, "rr2---sn-qxoednee.googlevideo.com.": {}, + "rr2---sn-qxuxa-5xme.googlevideo.com.": {}, "rr2---sn-u1hp55-5c.googlevideo.com.": {}, "rr2---sn-uhvcpaxoa-5hne.googlevideo.com.": {}, "rr2---sn-uhvcpaxoa-guhe.googlevideo.com.": {}, - "rr2---sn-v53a5oqnji-4oul.googlevideo.com.": {}, - "rr2---sn-v53a5oqnji-4oul.gvt1.com.": {}, "rr2---sn-v5goxu-jhi6.googlevideo.com.": {}, "rr2---sn-v5goxu-jhi6.gvt1.com.": {}, "rr2---sn-v5goxu-jhil.googlevideo.com.": {}, "rr2---sn-v5goxu-jhiz.googlevideo.com.": {}, - "rr2---sn-v5goxu-jhiz.gvt1.com.": {}, "rr2---sn-vgqskn66.googlevideo.com.": {}, "rr2---sn-vgqskn67.googlevideo.com.": {}, - "rr2---sn-vgqskn67.gvt1.com.": {}, "rr2---sn-vgqskn6d.googlevideo.com.": {}, "rr2---sn-vgqskn6s.googlevideo.com.": {}, - "rr2---sn-vgqskn6s.gvt1.com.": {}, "rr2---sn-vgqskn6z.googlevideo.com.": {}, "rr2---sn-vgqskne6.googlevideo.com.": {}, - "rr2---sn-vgqskne6.gvt1.com.": {}, "rr2---sn-vgqskned.googlevideo.com.": {}, "rr2---sn-vgqsknek.googlevideo.com.": {}, "rr2---sn-vgqsknes.googlevideo.com.": {}, "rr2---sn-vgqsknez.googlevideo.com.": {}, "rr2---sn-vgqsknld.googlevideo.com.": {}, - "rr2---sn-vgqsknld.gvt1.com.": {}, "rr2---sn-vgqsknlk.googlevideo.com.": {}, "rr2---sn-vgqsknll.googlevideo.com.": {}, "rr2---sn-vgqsknlr.googlevideo.com.": {}, "rr2---sn-vgqsknlr.gvt1.com.": {}, "rr2---sn-vgqsknls.googlevideo.com.": {}, - "rr2---sn-vgqsknls.gvt1.com.": {}, "rr2---sn-vgqsknlz.googlevideo.com.": {}, - "rr2---sn-vgqsknlz.gvt1.com.": {}, + "rr2---sn-vgqskns7.googlevideo.com.": {}, + "rr2---sn-vgqsknse.googlevideo.com.": {}, "rr2---sn-vgqsknsk.googlevideo.com.": {}, - "rr2---sn-vgqsknsk.gvt1.com.": {}, "rr2---sn-vgqsknz6.googlevideo.com.": {}, - "rr2---sn-vgqsknz6.gvt1.com.": {}, "rr2---sn-vgqsknz7.googlevideo.com.": {}, "rr2---sn-vgqsknzd.googlevideo.com.": {}, "rr2---sn-vgqsknzd.gvt1.com.": {}, "rr2---sn-vgqsknze.googlevideo.com.": {}, - "rr2---sn-vgqsknze.gvt1.com.": {}, "rr2---sn-vgqsknzk.googlevideo.com.": {}, "rr2---sn-vgqsknzl.googlevideo.com.": {}, "rr2---sn-vgqsknzr.googlevideo.com.": {}, - "rr2---sn-vgqsknzr.gvt1.com.": {}, "rr2---sn-vgqsknzs.googlevideo.com.": {}, "rr2---sn-vgqsknzy.googlevideo.com.": {}, - "rr2---sn-vgqsknzy.gvt1.com.": {}, "rr2---sn-vgqsknzz.googlevideo.com.": {}, + "rr2---sn-vgqsknzz.gvt1.com.": {}, "rr2---sn-vgqsrn66.googlevideo.com.": {}, - "rr2---sn-vgqsrn66.gvt1.com.": {}, "rr2---sn-vgqsrn67.googlevideo.com.": {}, + "rr2---sn-vgqsrn67.gvt1.com.": {}, "rr2---sn-vgqsrn6e.googlevideo.com.": {}, "rr2---sn-vgqsrn6l.googlevideo.com.": {}, + "rr2---sn-vgqsrn6l.gvt1.com.": {}, "rr2---sn-vgqsrn6z.googlevideo.com.": {}, - "rr2---sn-vgqsrn6z.gvt1.com.": {}, "rr2---sn-vgqsrne6.googlevideo.com.": {}, "rr2---sn-vgqsrned.googlevideo.com.": {}, "rr2---sn-vgqsrnek.googlevideo.com.": {}, "rr2---sn-vgqsrnes.googlevideo.com.": {}, "rr2---sn-vgqsrnez.googlevideo.com.": {}, "rr2---sn-vgqsrnl6.googlevideo.com.": {}, - "rr2---sn-vgqsrnl6.gvt1.com.": {}, + "rr2---sn-vgqsrnld.googlevideo.com.": {}, "rr2---sn-vgqsrnlk.googlevideo.com.": {}, "rr2---sn-vgqsrnll.googlevideo.com.": {}, "rr2---sn-vgqsrnls.googlevideo.com.": {}, + "rr2---sn-vgqsrnls.gvt1.com.": {}, "rr2---sn-vgqsrnlz.googlevideo.com.": {}, "rr2---sn-vgqsrns6.googlevideo.com.": {}, "rr2---sn-vgqsrnsd.googlevideo.com.": {}, - "rr2---sn-vgqsrnsd.gvt1.com.": {}, "rr2---sn-vgqsrnsr.googlevideo.com.": {}, "rr2---sn-vgqsrnsr.gvt1.com.": {}, "rr2---sn-vgqsrnsy.googlevideo.com.": {}, - "rr2---sn-vgqsrnsy.gvt1.com.": {}, "rr2---sn-vgqsrnz6.googlevideo.com.": {}, "rr2---sn-vgqsrnz7.googlevideo.com.": {}, + "rr2---sn-vgqsrnz7.gvt1.com.": {}, "rr2---sn-vgqsrnzd.googlevideo.com.": {}, "rr2---sn-vgqsrnzk.googlevideo.com.": {}, "rr2---sn-vgqsrnzr.googlevideo.com.": {}, "rr2---sn-vgqsrnzr.gvt1.com.": {}, "rr2---sn-vgqsrnzs.googlevideo.com.": {}, "rr2---sn-vgqsrnzy.googlevideo.com.": {}, - "rr2---sn-vgqsrnzy.gvt1.com.": {}, "rr2---sn-vgqsrnzz.googlevideo.com.": {}, "rr2---sn-vnix5o-28ql.googlevideo.com.": {}, "rr2---sn-voxoxu-v3jl.googlevideo.com.": {}, "rr2---sn-voxoxu-v3js.googlevideo.com.": {}, "rr2---sn-xo5-co5l.googlevideo.com.": {}, - "rr2.sn-5hne6nz6.googlevideo.com.": {}, - "rr2.sn-5hnekn7d.googlevideo.com.": {}, - "rr2.sn-aigzrne7.googlevideo.com.": {}, - "rr2.sn-q4fl6n6d.googlevideo.com.": {}, + "rr2.sn-5hnednsz.googlevideo.com.": {}, + "rr2.sn-q4fl6n6s.googlevideo.com.": {}, + "rr2.sn-q4fl6nd6.googlevideo.com.": {}, + "rr2.sn-q4fl6ndl.googlevideo.com.": {}, "rr3---sn-0nnpbo5a-bggl.googlevideo.com.": {}, - "rr3---sn-2aqu-hoas7.googlevideo.com.": {}, "rr3---sn-2imern76.googlevideo.com.": {}, - "rr3---sn-2imern76.gvt1.com.": {}, - "rr3---sn-2imern7d.googlevideo.com.": {}, - "rr3---sn-2imern7d.gvt1.com.": {}, "rr3---sn-2imeyn7k.googlevideo.com.": {}, - "rr3---sn-2imeyn7k.gvt1.com.": {}, "rr3---sn-2napbiu-p5ie.googlevideo.com.": {}, + "rr3---sn-2napbiu-p5ie.gvt1.com.": {}, "rr3---sn-2vgu0b5auxaxjvh-apnd.googlevideo.com.": {}, "rr3---sn-2vgu0b5auxaxjvh-v2vd.googlevideo.com.": {}, "rr3---sn-2vgu0b5auxaxjvh-v2ve.googlevideo.com.": {}, @@ -5076,14 +5018,13 @@ var FakeECSFQDNs = map[string]struct{}{ "rr3---sn-2vgu0b5auxaxjvh-v2vz.googlevideo.com.": {}, "rr3---sn-30a7rne6.googlevideo.com.": {}, "rr3---sn-30a7rned.googlevideo.com.": {}, + "rr3---sn-30a7rnek.googlevideo.com.": {}, "rr3---sn-30a7rner.googlevideo.com.": {}, "rr3---sn-30a7ynek.googlevideo.com.": {}, "rr3---sn-30a7yner.googlevideo.com.": {}, "rr3---sn-30a7yney.googlevideo.com.": {}, "rr3---sn-30a7ynl7.googlevideo.com.": {}, - "rr3---sn-42u-nboze.googlevideo.com.": {}, - "rr3---sn-42u-nbozs.googlevideo.com.": {}, - "rr3---sn-42u-nbozz.googlevideo.com.": {}, + "rr3---sn-3jpm-hjpe.googlevideo.com.": {}, "rr3---sn-4g5e6ns6.googlevideo.com.": {}, "rr3---sn-4g5e6ns7.googlevideo.com.": {}, "rr3---sn-4g5e6nsd.googlevideo.com.": {}, @@ -5144,7 +5085,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr3---sn-5hne6nsz.googlevideo.com.": {}, "rr3---sn-5hne6nz6.googlevideo.com.": {}, "rr3---sn-5hne6nzd.googlevideo.com.": {}, - "rr3---sn-5hne6nzd.gvt1.com.": {}, "rr3---sn-5hne6nzk.googlevideo.com.": {}, "rr3---sn-5hne6nzs.googlevideo.com.": {}, "rr3---sn-5hne6nzy.googlevideo.com.": {}, @@ -5163,6 +5103,7 @@ var FakeECSFQDNs = map[string]struct{}{ "rr3---sn-5uaezndd.googlevideo.com.": {}, "rr3---sn-5uaezne6.googlevideo.com.": {}, "rr3---sn-5uaezned.googlevideo.com.": {}, + "rr3---sn-5uaeznes.googlevideo.com.": {}, "rr3---sn-5uaeznez.googlevideo.com.": {}, "rr3---sn-5uaeznl6.googlevideo.com.": {}, "rr3---sn-5uaeznld.googlevideo.com.": {}, @@ -5174,8 +5115,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr3---sn-5uaeznse.googlevideo.com.": {}, "rr3---sn-5uaeznsl.googlevideo.com.": {}, "rr3---sn-5uaeznss.googlevideo.com.": {}, - "rr3---sn-5uaezny6.googlevideo.com.": {}, - "rr3---sn-5uaeznys.googlevideo.com.": {}, "rr3---sn-5uaeznyz.googlevideo.com.": {}, "rr3---sn-5uaeznze.googlevideo.com.": {}, "rr3---sn-5ualdnle.googlevideo.com.": {}, @@ -5194,8 +5133,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr3---sn-5ualdnsz.googlevideo.com.": {}, "rr3---sn-5ualdnz7.googlevideo.com.": {}, "rr3---sn-5ualdnze.googlevideo.com.": {}, - "rr3---sn-8qj-i5o6k.googlevideo.com.": {}, - "rr3---sn-8qj-i5ozr.googlevideo.com.": {}, "rr3---sn-8qj-nbo66.googlevideo.com.": {}, "rr3---sn-8xgp1vo-2iae.googlevideo.com.": {}, "rr3---sn-8xgp1vo-2iae7.googlevideo.com.": {}, @@ -5208,7 +5145,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr3---sn-8xgp1vo-ab5l.googlevideo.com.": {}, "rr3---sn-8xgp1vo-ab5s.googlevideo.com.": {}, "rr3---sn-8xgp1vo-ab5z.googlevideo.com.": {}, - "rr3---sn-8xgp1vo-nh4e.googlevideo.com.": {}, "rr3---sn-8xgp1vo-p5ie.googlevideo.com.": {}, "rr3---sn-8xgp1vo-vgqe.googlevideo.com.": {}, "rr3---sn-8xgp1vo-xfge.googlevideo.com.": {}, @@ -5222,28 +5158,27 @@ var FakeECSFQDNs = map[string]struct{}{ "rr3---sn-9gv7zn76.googlevideo.com.": {}, "rr3---sn-9gv7zn7e.googlevideo.com.": {}, "rr3---sn-9gv7zn7r.googlevideo.com.": {}, + "rr3---sn-9gv7zn7y.googlevideo.com.": {}, "rr3---sn-a5m7lnld.googlevideo.com.": {}, - "rr3---sn-a5m7lnld.gvt1.com.": {}, "rr3---sn-a5mekn6d.googlevideo.com.": {}, "rr3---sn-a5mekn6d.gvt1.com.": {}, "rr3---sn-a5mekn6k.googlevideo.com.": {}, + "rr3---sn-a5mekn6k.gvt1.com.": {}, "rr3---sn-a5mekn6l.googlevideo.com.": {}, "rr3---sn-a5mekn6l.gvt1.com.": {}, "rr3---sn-a5mekn6r.googlevideo.com.": {}, "rr3---sn-a5mekn6s.googlevideo.com.": {}, "rr3---sn-a5meknd6.googlevideo.com.": {}, - "rr3---sn-a5meknd6.gvt1.com.": {}, "rr3---sn-a5meknde.googlevideo.com.": {}, "rr3---sn-a5mekndl.googlevideo.com.": {}, "rr3---sn-a5meknds.googlevideo.com.": {}, + "rr3---sn-a5meknds.gvt1.com.": {}, "rr3---sn-a5mekndz.googlevideo.com.": {}, "rr3---sn-a5meknsd.googlevideo.com.": {}, "rr3---sn-a5meknsy.googlevideo.com.": {}, - "rr3---sn-a5meknsy.gvt1.com.": {}, "rr3---sn-a5meknzk.googlevideo.com.": {}, - "rr3---sn-a5meknzl.googlevideo.com.": {}, - "rr3---sn-a5meknzl.gvt1.com.": {}, "rr3---sn-a5meknzr.googlevideo.com.": {}, + "rr3---sn-a5meknzr.gvt1.com.": {}, "rr3---sn-a5meknzs.googlevideo.com.": {}, "rr3---sn-a5mlrnek.googlevideo.com.": {}, "rr3---sn-a5mlrnl6.googlevideo.com.": {}, @@ -5256,55 +5191,43 @@ var FakeECSFQDNs = map[string]struct{}{ "rr3---sn-a5msen7l.googlevideo.com.": {}, "rr3---sn-a5msen7s.googlevideo.com.": {}, "rr3---sn-a5msen7z.googlevideo.com.": {}, + "rr3---sn-a5msen7z.gvt1.com.": {}, "rr3---sn-a5msenek.googlevideo.com.": {}, - "rr3---sn-a5msenek.gvt1.com.": {}, "rr3---sn-a5msener.googlevideo.com.": {}, "rr3---sn-a5msenes.googlevideo.com.": {}, "rr3---sn-a5msenl7.googlevideo.com.": {}, "rr3---sn-a5msenle.googlevideo.com.": {}, - "rr3---sn-a5msenle.gvt1.com.": {}, "rr3---sn-a5msenll.googlevideo.com.": {}, - "rr3---sn-a5msenll.gvt1.com.": {}, "rr3---sn-ab5l6ndr.googlevideo.com.": {}, "rr3---sn-ab5l6ndy.googlevideo.com.": {}, "rr3---sn-ab5l6nk6.googlevideo.com.": {}, - "rr3---sn-ab5l6nk6.gvt1.com.": {}, "rr3---sn-ab5l6nkd.googlevideo.com.": {}, "rr3---sn-ab5l6nr6.googlevideo.com.": {}, - "rr3---sn-ab5l6nr6.gvt1.com.": {}, "rr3---sn-ab5l6nrd.googlevideo.com.": {}, - "rr3---sn-ab5l6nrd.gvt1.com.": {}, "rr3---sn-ab5l6nrk.googlevideo.com.": {}, "rr3---sn-ab5l6nrl.googlevideo.com.": {}, - "rr3---sn-ab5l6nrl.gvt1.com.": {}, "rr3---sn-ab5l6nrr.googlevideo.com.": {}, "rr3---sn-ab5l6nrs.googlevideo.com.": {}, "rr3---sn-ab5l6nrz.googlevideo.com.": {}, "rr3---sn-ab5l6nrz.gvt1.com.": {}, "rr3---sn-ab5sznld.googlevideo.com.": {}, "rr3---sn-ab5sznlk.googlevideo.com.": {}, - "rr3---sn-ab5sznlk.gvt1.com.": {}, "rr3---sn-ab5sznly.googlevideo.com.": {}, "rr3---sn-ab5sznz6.googlevideo.com.": {}, - "rr3---sn-ab5sznz6.gvt1.com.": {}, "rr3---sn-ab5sznzd.googlevideo.com.": {}, - "rr3---sn-ab5sznzd.gvt1.com.": {}, "rr3---sn-ab5sznze.googlevideo.com.": {}, - "rr3---sn-ab5sznze.gvt1.com.": {}, "rr3---sn-ab5sznzk.googlevideo.com.": {}, "rr3---sn-ab5sznzl.googlevideo.com.": {}, "rr3---sn-ab5sznzr.googlevideo.com.": {}, "rr3---sn-ab5sznzs.googlevideo.com.": {}, - "rr3---sn-ab5sznzs.gvt1.com.": {}, "rr3---sn-ab5sznzy.googlevideo.com.": {}, "rr3---sn-ab5sznzz.googlevideo.com.": {}, "rr3---sn-aigl6n6s.googlevideo.com.": {}, - "rr3---sn-aigl6n6s.gvt1.com.": {}, "rr3---sn-aigl6ned.googlevideo.com.": {}, + "rr3---sn-aigl6nek.googlevideo.com.": {}, "rr3---sn-aigl6ner.googlevideo.com.": {}, "rr3---sn-aigl6ney.googlevideo.com.": {}, "rr3---sn-aigl6nl7.googlevideo.com.": {}, - "rr3---sn-aigl6nl7.gvt1.com.": {}, "rr3---sn-aigl6ns6.googlevideo.com.": {}, "rr3---sn-aigl6nsd.googlevideo.com.": {}, "rr3---sn-aigl6nsk.googlevideo.com.": {}, @@ -5317,7 +5240,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr3---sn-aigl6nzs.googlevideo.com.": {}, "rr3---sn-aigzrn76.googlevideo.com.": {}, "rr3---sn-aigzrn7d.googlevideo.com.": {}, - "rr3---sn-aigzrn7d.gvt1.com.": {}, "rr3---sn-aigzrn7e.googlevideo.com.": {}, "rr3---sn-aigzrn7k.googlevideo.com.": {}, "rr3---sn-aigzrn7l.googlevideo.com.": {}, @@ -5332,7 +5254,9 @@ var FakeECSFQDNs = map[string]struct{}{ "rr3---sn-aigzrnsz.googlevideo.com.": {}, "rr3---sn-aigzrnz7.googlevideo.com.": {}, "rr3---sn-aigzrnze.googlevideo.com.": {}, + "rr3---sn-aj5ua5-5c.googlevideo.com.": {}, "rr3---sn-apn7en7e.googlevideo.com.": {}, + "rr3---sn-apn7en7l.googlevideo.com.": {}, "rr3---sn-apn7en7s.googlevideo.com.": {}, "rr3---sn-bg5oqxjvh-50nz.googlevideo.com.": {}, "rr3---sn-c0q7lnz7.googlevideo.com.": {}, @@ -5345,51 +5269,55 @@ var FakeECSFQDNs = map[string]struct{}{ "rr3---sn-cvb7sn7r.googlevideo.com.": {}, "rr3---sn-gpuuxg-hxhl.googlevideo.com.": {}, "rr3---sn-gpuuxg-hxhl.gvt1.com.": {}, + "rr3---sn-gvbxgn-tvf6.googlevideo.com.": {}, + "rr3---sn-gvbxgn-tvfz.googlevideo.com.": {}, "rr3---sn-h0jeened.googlevideo.com.": {}, "rr3---sn-h0jeenek.googlevideo.com.": {}, "rr3---sn-h0jeener.googlevideo.com.": {}, "rr3---sn-h0jeenl6.googlevideo.com.": {}, "rr3---sn-h0jeenld.googlevideo.com.": {}, "rr3---sn-h0jeenle.googlevideo.com.": {}, + "rr3---sn-h0jeln7e.googlevideo.com.": {}, "rr3---sn-h0jeln7l.googlevideo.com.": {}, "rr3---sn-h0jelne6.googlevideo.com.": {}, "rr3---sn-h0jelne7.googlevideo.com.": {}, "rr3---sn-h0jelnes.googlevideo.com.": {}, "rr3---sn-h0jelnez.googlevideo.com.": {}, + "rr3---sn-hgn7rn7k.googlevideo.com.": {}, + "rr3---sn-hgn7rnls.googlevideo.com.": {}, "rr3---sn-hjoj-gq0l.googlevideo.com.": {}, - "rr3---sn-hjoj-gq0l.gvt1.com.": {}, + "rr3---sn-hjoj-jaul.googlevideo.com.": {}, "rr3---sn-hjoj-poul.googlevideo.com.": {}, "rr3---sn-hoa7kn76.googlevideo.com.": {}, "rr3---sn-hoa7kn7z.googlevideo.com.": {}, "rr3---sn-hoa7rn76.googlevideo.com.": {}, "rr3---sn-hoa7rn7z.googlevideo.com.": {}, + "rr3---sn-hp57kn6r.googlevideo.com.": {}, "rr3---sn-hp57kn6y.googlevideo.com.": {}, + "rr3---sn-hp57kn6y.gvt1.com.": {}, "rr3---sn-hp57knd6.googlevideo.com.": {}, "rr3---sn-hp57kndd.googlevideo.com.": {}, "rr3---sn-hp57kndk.googlevideo.com.": {}, "rr3---sn-hp57kndk.gvt1.com.": {}, "rr3---sn-hp57kndr.googlevideo.com.": {}, + "rr3---sn-hp57kndr.gvt1.com.": {}, "rr3---sn-hp57knds.googlevideo.com.": {}, - "rr3---sn-hp57knds.gvt1.com.": {}, "rr3---sn-hp57kndy.googlevideo.com.": {}, - "rr3---sn-hp57kndy.gvt1.com.": {}, "rr3---sn-hp57kndz.googlevideo.com.": {}, - "rr3---sn-hp57kndz.gvt1.com.": {}, "rr3---sn-hp57yn7r.googlevideo.com.": {}, "rr3---sn-hp57yn7y.googlevideo.com.": {}, - "rr3---sn-hp57yn7y.gvt1.com.": {}, "rr3---sn-hp57yne7.googlevideo.com.": {}, "rr3---sn-hp57ynee.googlevideo.com.": {}, "rr3---sn-hp57ynl6.googlevideo.com.": {}, - "rr3---sn-hp57ynl6.gvt1.com.": {}, "rr3---sn-hp57ynlr.googlevideo.com.": {}, "rr3---sn-hp57ynly.googlevideo.com.": {}, "rr3---sn-hp57ynly.gvt1.com.": {}, "rr3---sn-hp57yns7.googlevideo.com.": {}, "rr3---sn-hp57ynse.googlevideo.com.": {}, + "rr3---sn-hp57ynse.gvt1.com.": {}, "rr3---sn-hp57ynsl.googlevideo.com.": {}, + "rr3---sn-hp57ynsl.gvt1.com.": {}, "rr3---sn-hp57ynss.googlevideo.com.": {}, - "rr3---sn-hp57ynss.gvt1.com.": {}, "rr3---sn-i3b7kn6s.googlevideo.com.": {}, "rr3---sn-i3b7knld.googlevideo.com.": {}, "rr3---sn-i3b7knlk.googlevideo.com.": {}, @@ -5397,7 +5325,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr3---sn-i3b7knsd.googlevideo.com.": {}, "rr3---sn-i3b7knse.googlevideo.com.": {}, "rr3---sn-i3b7knsl.googlevideo.com.": {}, - "rr3---sn-i3b7knzl.googlevideo.com.": {}, "rr3---sn-i3b7knzs.googlevideo.com.": {}, "rr3---sn-i3belne6.googlevideo.com.": {}, "rr3---sn-i3belney.googlevideo.com.": {}, @@ -5408,7 +5335,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr3---sn-i3belnlz.googlevideo.com.": {}, "rr3---sn-i3bssn7e.googlevideo.com.": {}, "rr3---sn-i5f5ppuxa-ioal.googlevideo.com.": {}, - "rr3---sn-i5h7lner.googlevideo.com.": {}, "rr3---sn-i5h7lnl6.googlevideo.com.": {}, "rr3---sn-i5h7lnll.googlevideo.com.": {}, "rr3---sn-i5h7lnls.googlevideo.com.": {}, @@ -5429,11 +5355,10 @@ var FakeECSFQDNs = map[string]struct{}{ "rr3---sn-jxopj-n5oe.gvt1.com.": {}, "rr3---sn-jxopj-nh4e.googlevideo.com.": {}, "rr3---sn-jxopj-nh4e.gvt1.com.": {}, + "rr3---sn-muxa-2iae.googlevideo.com.": {}, "rr3---sn-n4v7snee.googlevideo.com.": {}, "rr3---sn-n4v7sney.googlevideo.com.": {}, - "rr3---sn-n4v7sney.gvt1.com.": {}, "rr3---sn-n4v7snl7.googlevideo.com.": {}, - "rr3---sn-n4v7snl7.gvt1.com.": {}, "rr3---sn-n4v7snll.googlevideo.com.": {}, "rr3---sn-n4v7snlr.googlevideo.com.": {}, "rr3---sn-n4v7snls.googlevideo.com.": {}, @@ -5470,6 +5395,9 @@ var FakeECSFQDNs = map[string]struct{}{ "rr3---sn-npoeenez.googlevideo.com.": {}, "rr3---sn-npoeenl7.googlevideo.com.": {}, "rr3---sn-npoeenle.googlevideo.com.": {}, + "rr3---sn-npoeenlk.googlevideo.com.": {}, + "rr3---sn-npoeenll.googlevideo.com.": {}, + "rr3---sn-npoeenly.googlevideo.com.": {}, "rr3---sn-npoeens7.googlevideo.com.": {}, "rr3---sn-npoldn76.googlevideo.com.": {}, "rr3---sn-npoldn7d.googlevideo.com.": {}, @@ -5479,36 +5407,31 @@ var FakeECSFQDNs = map[string]struct{}{ "rr3---sn-npoldn7y.googlevideo.com.": {}, "rr3---sn-npoldn7z.googlevideo.com.": {}, "rr3---sn-npoldne7.googlevideo.com.": {}, - "rr3---sn-nv0ui4gvou-hape.googlevideo.com.": {}, "rr3---sn-nv47ln6e.googlevideo.com.": {}, - "rr3---sn-nv47lnly.googlevideo.com.": {}, "rr3---sn-nv47lns6.googlevideo.com.": {}, - "rr3---sn-nv47lns7.googlevideo.com.": {}, - "rr3---sn-nv47lnsr.googlevideo.com.": {}, "rr3---sn-nv47zn7r.googlevideo.com.": {}, "rr3---sn-nv47zn7y.googlevideo.com.": {}, "rr3---sn-nv47zne7.googlevideo.com.": {}, "rr3---sn-nv47znee.googlevideo.com.": {}, "rr3---sn-nv47znel.googlevideo.com.": {}, + "rr3---sn-nx57ynlk.googlevideo.com.": {}, + "rr3---sn-nx57ynlk.gvt1.com.": {}, "rr3---sn-nx57ynsd.googlevideo.com.": {}, - "rr3---sn-nx57ynsd.gvt1.com.": {}, "rr3---sn-nx57ynse.googlevideo.com.": {}, - "rr3---sn-nx57ynse.gvt1.com.": {}, "rr3---sn-nx57ynsk.googlevideo.com.": {}, "rr3---sn-nx57ynsk.gvt1.com.": {}, "rr3---sn-nx57ynsl.googlevideo.com.": {}, - "rr3---sn-nx57ynsl.gvt1.com.": {}, "rr3---sn-nx57ynss.googlevideo.com.": {}, - "rr3---sn-nx57ynss.gvt1.com.": {}, "rr3---sn-nx57ynsz.googlevideo.com.": {}, "rr3---sn-nx5s7n76.googlevideo.com.": {}, + "rr3---sn-nx5s7n76.gvt1.com.": {}, "rr3---sn-nx5s7n7d.googlevideo.com.": {}, + "rr3---sn-nx5s7n7d.gvt1.com.": {}, "rr3---sn-nx5s7n7s.googlevideo.com.": {}, "rr3---sn-nx5s7n7y.googlevideo.com.": {}, "rr3---sn-nx5s7n7y.gvt1.com.": {}, "rr3---sn-nx5s7n7z.googlevideo.com.": {}, "rr3---sn-nx5s7nee.googlevideo.com.": {}, - "rr3---sn-nx5s7nee.gvt1.com.": {}, "rr3---sn-nx5s7nel.googlevideo.com.": {}, "rr3---sn-nx5s7nel.gvt1.com.": {}, "rr3---sn-o097znsd.googlevideo.com.": {}, @@ -5516,7 +5439,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr3---sn-o097znsk.googlevideo.com.": {}, "rr3---sn-o097znsl.googlevideo.com.": {}, "rr3---sn-o097znsr.googlevideo.com.": {}, - "rr3---sn-o097znsr.gvt1.com.": {}, "rr3---sn-o097znss.googlevideo.com.": {}, "rr3---sn-o097znsz.googlevideo.com.": {}, "rr3---sn-o097znz7.googlevideo.com.": {}, @@ -5528,37 +5450,39 @@ var FakeECSFQDNs = map[string]struct{}{ "rr3---sn-p5qddn76.googlevideo.com.": {}, "rr3---sn-p5qddn7d.googlevideo.com.": {}, "rr3---sn-p5qddn7k.googlevideo.com.": {}, - "rr3---sn-p5qddn7z.googlevideo.com.": {}, + "rr3---sn-p5qddn7r.googlevideo.com.": {}, "rr3---sn-p5qlsn6l.googlevideo.com.": {}, "rr3---sn-p5qlsn76.googlevideo.com.": {}, - "rr3---sn-p5qlsn76.gvt1.com.": {}, "rr3---sn-p5qlsn7d.googlevideo.com.": {}, "rr3---sn-p5qlsn7l.googlevideo.com.": {}, "rr3---sn-p5qlsn7s.googlevideo.com.": {}, - "rr3---sn-p5qlsn7s.gvt1.com.": {}, "rr3---sn-p5qlsnd6.googlevideo.com.": {}, "rr3---sn-p5qlsndd.googlevideo.com.": {}, "rr3---sn-p5qlsndk.googlevideo.com.": {}, + "rr3---sn-p5qlsndr.googlevideo.com.": {}, "rr3---sn-p5qlsndz.googlevideo.com.": {}, "rr3---sn-p5qlsnrl.googlevideo.com.": {}, - "rr3---sn-p5qlsnrr.googlevideo.com.": {}, "rr3---sn-p5qlsny6.googlevideo.com.": {}, "rr3---sn-p5qs7n6d.googlevideo.com.": {}, + "rr3---sn-p5qs7nsk.googlevideo.com.": {}, + "rr3---sn-p5qs7nsr.googlevideo.com.": {}, "rr3---sn-p5qs7nzk.googlevideo.com.": {}, "rr3---sn-p5qs7nzr.googlevideo.com.": {}, "rr3---sn-p5qs7nzy.googlevideo.com.": {}, "rr3---sn-pobpb-poql.googlevideo.com.": {}, "rr3---sn-q4fl6n66.googlevideo.com.": {}, "rr3---sn-q4fl6n6d.googlevideo.com.": {}, + "rr3---sn-q4fl6n6d.gvt1.com.": {}, "rr3---sn-q4fl6n6r.googlevideo.com.": {}, "rr3---sn-q4fl6n6s.googlevideo.com.": {}, + "rr3---sn-q4fl6n6s.gvt1.com.": {}, "rr3---sn-q4fl6n6y.googlevideo.com.": {}, - "rr3---sn-q4fl6n6y.gvt1.com.": {}, "rr3---sn-q4fl6n6z.googlevideo.com.": {}, + "rr3---sn-q4fl6n6z.gvt1.com.": {}, "rr3---sn-q4fl6nd6.googlevideo.com.": {}, - "rr3---sn-q4fl6nd6.gvt1.com.": {}, "rr3---sn-q4fl6nd7.googlevideo.com.": {}, "rr3---sn-q4fl6nde.googlevideo.com.": {}, + "rr3---sn-q4fl6nde.gvt1.com.": {}, "rr3---sn-q4fl6ndl.googlevideo.com.": {}, "rr3---sn-q4fl6ndl.gvt1.com.": {}, "rr3---sn-q4fl6nds.googlevideo.com.": {}, @@ -5575,21 +5499,23 @@ var FakeECSFQDNs = map[string]struct{}{ "rr3---sn-q4fl6nsr.googlevideo.com.": {}, "rr3---sn-q4fl6nss.googlevideo.com.": {}, "rr3---sn-q4fl6nsy.googlevideo.com.": {}, - "rr3---sn-q4fl6nsy.gvt1.com.": {}, "rr3---sn-q4fl6nz6.googlevideo.com.": {}, + "rr3---sn-q4fl6nz6.gvt1.com.": {}, "rr3---sn-q4fl6nz7.googlevideo.com.": {}, "rr3---sn-q4fl6nz7.gvt1.com.": {}, "rr3---sn-q4fl6nzy.googlevideo.com.": {}, + "rr3---sn-q4fl6nzy.gvt1.com.": {}, "rr3---sn-q4flrn7k.googlevideo.com.": {}, "rr3---sn-q4flrn7r.googlevideo.com.": {}, + "rr3---sn-q4flrn7r.gvt1.com.": {}, "rr3---sn-q4flrn7y.googlevideo.com.": {}, - "rr3---sn-q4flrn7y.gvt1.com.": {}, "rr3---sn-q4flrne6.googlevideo.com.": {}, "rr3---sn-q4flrne6.gvt1.com.": {}, "rr3---sn-q4flrne7.googlevideo.com.": {}, "rr3---sn-q4flrnee.googlevideo.com.": {}, "rr3---sn-q4flrnee.gvt1.com.": {}, "rr3---sn-q4flrnek.googlevideo.com.": {}, + "rr3---sn-q4flrnek.gvt1.com.": {}, "rr3---sn-q4flrnel.googlevideo.com.": {}, "rr3---sn-q4flrner.googlevideo.com.": {}, "rr3---sn-q4flrnes.googlevideo.com.": {}, @@ -5597,11 +5523,9 @@ var FakeECSFQDNs = map[string]struct{}{ "rr3---sn-q4flrney.gvt1.com.": {}, "rr3---sn-q4flrnez.googlevideo.com.": {}, "rr3---sn-q4flrnl6.googlevideo.com.": {}, - "rr3---sn-q4flrnl6.gvt1.com.": {}, "rr3---sn-q4flrnl7.googlevideo.com.": {}, "rr3---sn-q4flrnl7.gvt1.com.": {}, "rr3---sn-q4flrnld.googlevideo.com.": {}, - "rr3---sn-q4flrnld.gvt1.com.": {}, "rr3---sn-q4flrnle.googlevideo.com.": {}, "rr3---sn-q4flrnle.gvt1.com.": {}, "rr3---sn-q4flrnlz.googlevideo.com.": {}, @@ -5619,111 +5543,97 @@ var FakeECSFQDNs = map[string]struct{}{ "rr3---sn-q4fzen7s.googlevideo.com.": {}, "rr3---sn-q4fzen7y.googlevideo.com.": {}, "rr3---sn-q4fzene7.googlevideo.com.": {}, - "rr3---sn-q4fzene7.gvt1.com.": {}, "rr3---sn-q4fzenee.googlevideo.com.": {}, "rr3---sn-q4fzenee.gvt1.com.": {}, - "rr3---sn-qpbp-30ar.googlevideo.com.": {}, "rr3---sn-qxo7rn7k.googlevideo.com.": {}, "rr3---sn-qxo7rn7r.googlevideo.com.": {}, "rr3---sn-qxo7rn7y.googlevideo.com.": {}, "rr3---sn-qxoedn7k.googlevideo.com.": {}, "rr3---sn-qxoednee.googlevideo.com.": {}, - "rr3---sn-t0a7sn7d.googlevideo.com.": {}, "rr3---sn-u1hp55-5c.googlevideo.com.": {}, - "rr3---sn-u1hp55-5c.gvt1.com.": {}, "rr3---sn-uhvcpaxoa-5hne.googlevideo.com.": {}, "rr3---sn-uhvcpaxoa-guhe.googlevideo.com.": {}, "rr3---sn-v5goxu-jhil.googlevideo.com.": {}, - "rr3---sn-v5goxu-jhil.gvt1.com.": {}, "rr3---sn-vgqskn66.googlevideo.com.": {}, "rr3---sn-vgqskn67.googlevideo.com.": {}, - "rr3---sn-vgqskn67.gvt1.com.": {}, "rr3---sn-vgqskn6d.googlevideo.com.": {}, "rr3---sn-vgqskn6s.googlevideo.com.": {}, "rr3---sn-vgqskn6z.googlevideo.com.": {}, + "rr3---sn-vgqskn6z.gvt1.com.": {}, "rr3---sn-vgqskne6.googlevideo.com.": {}, - "rr3---sn-vgqskne6.gvt1.com.": {}, "rr3---sn-vgqskned.googlevideo.com.": {}, "rr3---sn-vgqsknek.googlevideo.com.": {}, - "rr3---sn-vgqsknes.googlevideo.com.": {}, "rr3---sn-vgqsknez.googlevideo.com.": {}, + "rr3---sn-vgqsknld.googlevideo.com.": {}, "rr3---sn-vgqsknlk.googlevideo.com.": {}, "rr3---sn-vgqsknll.googlevideo.com.": {}, "rr3---sn-vgqsknls.googlevideo.com.": {}, - "rr3---sn-vgqsknls.gvt1.com.": {}, "rr3---sn-vgqsknly.googlevideo.com.": {}, "rr3---sn-vgqsknlz.googlevideo.com.": {}, "rr3---sn-vgqskns7.googlevideo.com.": {}, "rr3---sn-vgqsknse.googlevideo.com.": {}, - "rr3---sn-vgqsknse.gvt1.com.": {}, "rr3---sn-vgqsknsk.googlevideo.com.": {}, "rr3---sn-vgqsknsk.gvt1.com.": {}, "rr3---sn-vgqsknz6.googlevideo.com.": {}, - "rr3---sn-vgqsknz6.gvt1.com.": {}, "rr3---sn-vgqsknz7.googlevideo.com.": {}, "rr3---sn-vgqsknzd.googlevideo.com.": {}, - "rr3---sn-vgqsknzd.gvt1.com.": {}, "rr3---sn-vgqsknze.googlevideo.com.": {}, "rr3---sn-vgqsknzk.googlevideo.com.": {}, "rr3---sn-vgqsknzl.googlevideo.com.": {}, "rr3---sn-vgqsknzr.googlevideo.com.": {}, - "rr3---sn-vgqsknzr.gvt1.com.": {}, "rr3---sn-vgqsknzs.googlevideo.com.": {}, - "rr3---sn-vgqsknzs.gvt1.com.": {}, "rr3---sn-vgqsknzy.googlevideo.com.": {}, + "rr3---sn-vgqsknzy.gvt1.com.": {}, "rr3---sn-vgqsknzz.googlevideo.com.": {}, "rr3---sn-vgqsrn66.googlevideo.com.": {}, - "rr3---sn-vgqsrn66.gvt1.com.": {}, "rr3---sn-vgqsrn67.googlevideo.com.": {}, "rr3---sn-vgqsrn6e.googlevideo.com.": {}, - "rr3---sn-vgqsrn6e.gvt1.com.": {}, "rr3---sn-vgqsrn6l.googlevideo.com.": {}, "rr3---sn-vgqsrn6z.googlevideo.com.": {}, - "rr3---sn-vgqsrn6z.gvt1.com.": {}, "rr3---sn-vgqsrne6.googlevideo.com.": {}, "rr3---sn-vgqsrned.googlevideo.com.": {}, - "rr3---sn-vgqsrned.gvt1.com.": {}, "rr3---sn-vgqsrnek.googlevideo.com.": {}, - "rr3---sn-vgqsrnek.gvt1.com.": {}, "rr3---sn-vgqsrnes.googlevideo.com.": {}, "rr3---sn-vgqsrnez.googlevideo.com.": {}, "rr3---sn-vgqsrnl6.googlevideo.com.": {}, "rr3---sn-vgqsrnld.googlevideo.com.": {}, "rr3---sn-vgqsrnlk.googlevideo.com.": {}, - "rr3---sn-vgqsrnlk.gvt1.com.": {}, "rr3---sn-vgqsrnll.googlevideo.com.": {}, + "rr3---sn-vgqsrnls.googlevideo.com.": {}, + "rr3---sn-vgqsrnls.gvt1.com.": {}, "rr3---sn-vgqsrnlz.googlevideo.com.": {}, "rr3---sn-vgqsrns6.googlevideo.com.": {}, - "rr3---sn-vgqsrns6.gvt1.com.": {}, "rr3---sn-vgqsrnsd.googlevideo.com.": {}, + "rr3---sn-vgqsrnsd.gvt1.com.": {}, "rr3---sn-vgqsrnsr.googlevideo.com.": {}, - "rr3---sn-vgqsrnsr.gvt1.com.": {}, "rr3---sn-vgqsrnsy.googlevideo.com.": {}, - "rr3---sn-vgqsrnsy.gvt1.com.": {}, "rr3---sn-vgqsrnz6.googlevideo.com.": {}, - "rr3---sn-vgqsrnz6.gvt1.com.": {}, "rr3---sn-vgqsrnz7.googlevideo.com.": {}, "rr3---sn-vgqsrnzd.googlevideo.com.": {}, - "rr3---sn-vgqsrnzd.gvt1.com.": {}, "rr3---sn-vgqsrnzk.googlevideo.com.": {}, "rr3---sn-vgqsrnzr.googlevideo.com.": {}, "rr3---sn-vgqsrnzs.googlevideo.com.": {}, + "rr3---sn-vgqsrnzs.gvt1.com.": {}, "rr3---sn-vgqsrnzy.googlevideo.com.": {}, + "rr3---sn-vgqsrnzy.gvt1.com.": {}, "rr3---sn-vgqsrnzz.googlevideo.com.": {}, "rr3---sn-vgqsrnzz.gvt1.com.": {}, - "rr3.sn-q4fl6nd6.googlevideo.com.": {}, - "rr3.sn-q4fl6ndz.googlevideo.com.": {}, - "rr3.sn-q4fl6nsd.googlevideo.com.": {}, + "rr3.sn-5hne6n6e.googlevideo.com.": {}, + "rr3.sn-hgn7rnls.googlevideo.com.": {}, + "rr3.sn-q4fl6n6r.googlevideo.com.": {}, + "rr3.sn-q4fl6nd7.googlevideo.com.": {}, + "rr3.sn-q4fl6nde.googlevideo.com.": {}, + "rr3.sn-q4fl6ns6.googlevideo.com.": {}, + "rr3.sn-q4flrn7r.googlevideo.com.": {}, "rr3.sn-q4flrne6.googlevideo.com.": {}, - "rr3.sn-q4flrne7.googlevideo.com.": {}, - "rr3.sn-t0a7sn7d.googlevideo.com.": {}, + "rr3.sn-q4flrnee.googlevideo.com.": {}, + "rr3.sn-q4flrnld.googlevideo.com.": {}, + "rr3.sn-q4flrnsd.googlevideo.com.": {}, + "rr3.sn-q4fzen7r.googlevideo.com.": {}, "rr4---sn-0nnpbo5a-bggl.googlevideo.com.": {}, - "rr4---sn-2aqu-hoas7.googlevideo.com.": {}, "rr4---sn-2imern76.googlevideo.com.": {}, - "rr4---sn-2imern76.gvt1.com.": {}, "rr4---sn-2imern7d.googlevideo.com.": {}, "rr4---sn-2imeyn7k.googlevideo.com.": {}, - "rr4---sn-2imeyn7k.gvt1.com.": {}, "rr4---sn-2vgu0b5auxaxjvh-apnd.googlevideo.com.": {}, "rr4---sn-2vgu0b5auxaxjvh-v2vd.googlevideo.com.": {}, "rr4---sn-2vgu0b5auxaxjvh-v2ve.googlevideo.com.": {}, @@ -5731,15 +5641,14 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-2vgu0b5auxaxjvh-v2vz.googlevideo.com.": {}, "rr4---sn-30a7rne6.googlevideo.com.": {}, "rr4---sn-30a7rned.googlevideo.com.": {}, + "rr4---sn-30a7rnek.googlevideo.com.": {}, "rr4---sn-30a7rner.googlevideo.com.": {}, "rr4---sn-30a7ynek.googlevideo.com.": {}, "rr4---sn-30a7yner.googlevideo.com.": {}, "rr4---sn-30a7yney.googlevideo.com.": {}, "rr4---sn-30a7ynl7.googlevideo.com.": {}, - "rr4---sn-42u-nboze.googlevideo.com.": {}, - "rr4---sn-42u-nbozl.googlevideo.com.": {}, - "rr4---sn-42u-nbozz.googlevideo.com.": {}, "rr4---sn-4g5e6ns6.googlevideo.com.": {}, + "rr4---sn-4g5e6ns7.googlevideo.com.": {}, "rr4---sn-4g5e6nsd.googlevideo.com.": {}, "rr4---sn-4g5e6nsk.googlevideo.com.": {}, "rr4---sn-4g5e6nsr.googlevideo.com.": {}, @@ -5776,6 +5685,7 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-4g5ednss.googlevideo.com.": {}, "rr4---sn-4g5ednsy.googlevideo.com.": {}, "rr4---sn-4g5ednsz.googlevideo.com.": {}, + "rr4---sn-4g5ednz7.googlevideo.com.": {}, "rr4---sn-4g5lzne6.googlevideo.com.": {}, "rr4---sn-4g5lzned.googlevideo.com.": {}, "rr4---sn-4g5lzner.googlevideo.com.": {}, @@ -5798,9 +5708,8 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-5hne6nz6.googlevideo.com.": {}, "rr4---sn-5hne6nzd.googlevideo.com.": {}, "rr4---sn-5hne6nzk.googlevideo.com.": {}, - "rr4---sn-5hne6nzk.gvt1.com.": {}, + "rr4---sn-5hne6nzs.googlevideo.com.": {}, "rr4---sn-5hne6nzy.googlevideo.com.": {}, - "rr4---sn-5hne6nzy.gvt1.com.": {}, "rr4---sn-5hnednss.googlevideo.com.": {}, "rr4---sn-5hnednsz.googlevideo.com.": {}, "rr4---sn-5hnekn76.googlevideo.com.": {}, @@ -5809,14 +5718,13 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-5hnekn7l.googlevideo.com.": {}, "rr4---sn-5hnekn7s.googlevideo.com.": {}, "rr4---sn-5hnekn7z.googlevideo.com.": {}, - "rr4---sn-5hneknee.googlevideo.com.": {}, "rr4---sn-5hneknek.googlevideo.com.": {}, "rr4---sn-5hneknes.googlevideo.com.": {}, - "rr4---sn-5hneknes.gvt1.com.": {}, "rr4---sn-5pgnugx5h-hn2z.googlevideo.com.": {}, "rr4---sn-5uaezndd.googlevideo.com.": {}, "rr4---sn-5uaezne6.googlevideo.com.": {}, "rr4---sn-5uaezned.googlevideo.com.": {}, + "rr4---sn-5uaeznes.googlevideo.com.": {}, "rr4---sn-5uaeznez.googlevideo.com.": {}, "rr4---sn-5uaeznl6.googlevideo.com.": {}, "rr4---sn-5uaeznld.googlevideo.com.": {}, @@ -5832,6 +5740,7 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-5uaeznys.googlevideo.com.": {}, "rr4---sn-5uaeznyz.googlevideo.com.": {}, "rr4---sn-5uaeznze.googlevideo.com.": {}, + "rr4---sn-5ualdnll.googlevideo.com.": {}, "rr4---sn-5ualdnlr.googlevideo.com.": {}, "rr4---sn-5ualdnls.googlevideo.com.": {}, "rr4---sn-5ualdns6.googlevideo.com.": {}, @@ -5846,8 +5755,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-5ualdnsz.googlevideo.com.": {}, "rr4---sn-5ualdnz7.googlevideo.com.": {}, "rr4---sn-5ualdnze.googlevideo.com.": {}, - "rr4---sn-8qj-i5o6k.googlevideo.com.": {}, - "rr4---sn-8qj-i5ozr.googlevideo.com.": {}, "rr4---sn-8qj-nbo66.googlevideo.com.": {}, "rr4---sn-8xgp1vo-2iae.googlevideo.com.": {}, "rr4---sn-8xgp1vo-2iae7.googlevideo.com.": {}, @@ -5860,7 +5767,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-8xgp1vo-ab5l.googlevideo.com.": {}, "rr4---sn-8xgp1vo-ab5s.googlevideo.com.": {}, "rr4---sn-8xgp1vo-ab5z.googlevideo.com.": {}, - "rr4---sn-8xgp1vo-nh4e.googlevideo.com.": {}, "rr4---sn-8xgp1vo-p5ie.googlevideo.com.": {}, "rr4---sn-8xgp1vo-vgqe.googlevideo.com.": {}, "rr4---sn-8xgp1vo-xfge.googlevideo.com.": {}, @@ -5869,6 +5775,7 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-9gv76n7e.googlevideo.com.": {}, "rr4---sn-9gv76n7l.googlevideo.com.": {}, "rr4---sn-9gv76n7s.googlevideo.com.": {}, + "rr4---sn-9gv76n7z.googlevideo.com.": {}, "rr4---sn-9gv7ene6.googlevideo.com.": {}, "rr4---sn-9gv7ened.googlevideo.com.": {}, "rr4---sn-9gv7zn76.googlevideo.com.": {}, @@ -5876,46 +5783,35 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-9gv7zn7r.googlevideo.com.": {}, "rr4---sn-a5m7lnl6.googlevideo.com.": {}, "rr4---sn-a5m7lnld.googlevideo.com.": {}, - "rr4---sn-a5m7lnld.gvt1.com.": {}, "rr4---sn-a5mekn6d.googlevideo.com.": {}, - "rr4---sn-a5mekn6d.gvt1.com.": {}, "rr4---sn-a5mekn6k.googlevideo.com.": {}, "rr4---sn-a5mekn6k.gvt1.com.": {}, "rr4---sn-a5mekn6l.googlevideo.com.": {}, - "rr4---sn-a5mekn6l.gvt1.com.": {}, "rr4---sn-a5mekn6r.googlevideo.com.": {}, "rr4---sn-a5mekn6r.gvt1.com.": {}, "rr4---sn-a5mekn6s.googlevideo.com.": {}, "rr4---sn-a5mekn6z.googlevideo.com.": {}, "rr4---sn-a5meknd6.googlevideo.com.": {}, - "rr4---sn-a5meknd6.gvt1.com.": {}, "rr4---sn-a5meknde.googlevideo.com.": {}, "rr4---sn-a5mekndl.googlevideo.com.": {}, + "rr4---sn-a5mekndl.gvt1.com.": {}, "rr4---sn-a5meknds.googlevideo.com.": {}, "rr4---sn-a5mekndz.googlevideo.com.": {}, - "rr4---sn-a5mekndz.gvt1.com.": {}, "rr4---sn-a5meknsd.googlevideo.com.": {}, "rr4---sn-a5meknsy.googlevideo.com.": {}, "rr4---sn-a5meknzk.googlevideo.com.": {}, - "rr4---sn-a5meknzk.gvt1.com.": {}, - "rr4---sn-a5meknzl.googlevideo.com.": {}, - "rr4---sn-a5meknzl.gvt1.com.": {}, "rr4---sn-a5meknzr.googlevideo.com.": {}, "rr4---sn-a5meknzs.googlevideo.com.": {}, - "rr4---sn-a5mlrnek.googlevideo.com.": {}, "rr4---sn-a5mlrnl6.googlevideo.com.": {}, "rr4---sn-a5mlrnll.googlevideo.com.": {}, - "rr4---sn-a5mlrnll.gvt1.com.": {}, "rr4---sn-a5mlrnls.googlevideo.com.": {}, "rr4---sn-a5mlrnlz.googlevideo.com.": {}, - "rr4---sn-a5mlrnlz.gvt1.com.": {}, "rr4---sn-a5msen7l.googlevideo.com.": {}, "rr4---sn-a5msen7s.googlevideo.com.": {}, "rr4---sn-a5msen7z.googlevideo.com.": {}, "rr4---sn-a5msenek.googlevideo.com.": {}, "rr4---sn-a5msenek.gvt1.com.": {}, "rr4---sn-a5msenes.googlevideo.com.": {}, - "rr4---sn-a5msenes.gvt1.com.": {}, "rr4---sn-a5msenl7.googlevideo.com.": {}, "rr4---sn-a5msenle.googlevideo.com.": {}, "rr4---sn-a5msenll.googlevideo.com.": {}, @@ -5927,42 +5823,30 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-ab5l6nr6.googlevideo.com.": {}, "rr4---sn-ab5l6nrd.googlevideo.com.": {}, "rr4---sn-ab5l6nrk.googlevideo.com.": {}, - "rr4---sn-ab5l6nrk.gvt1.com.": {}, "rr4---sn-ab5l6nrl.googlevideo.com.": {}, "rr4---sn-ab5l6nrr.googlevideo.com.": {}, - "rr4---sn-ab5l6nrr.gvt1.com.": {}, "rr4---sn-ab5l6nrs.googlevideo.com.": {}, - "rr4---sn-ab5l6nrs.gvt1.com.": {}, "rr4---sn-ab5l6nrz.googlevideo.com.": {}, "rr4---sn-ab5sznld.googlevideo.com.": {}, "rr4---sn-ab5sznlk.googlevideo.com.": {}, "rr4---sn-ab5sznly.googlevideo.com.": {}, "rr4---sn-ab5sznz6.googlevideo.com.": {}, - "rr4---sn-ab5sznz6.gvt1.com.": {}, "rr4---sn-ab5sznzd.googlevideo.com.": {}, - "rr4---sn-ab5sznzd.gvt1.com.": {}, "rr4---sn-ab5sznze.googlevideo.com.": {}, "rr4---sn-ab5sznzk.googlevideo.com.": {}, - "rr4---sn-ab5sznzk.gvt1.com.": {}, "rr4---sn-ab5sznzl.googlevideo.com.": {}, "rr4---sn-ab5sznzl.gvt1.com.": {}, "rr4---sn-ab5sznzr.googlevideo.com.": {}, "rr4---sn-ab5sznzs.googlevideo.com.": {}, - "rr4---sn-ab5sznzs.gvt1.com.": {}, "rr4---sn-ab5sznzy.googlevideo.com.": {}, - "rr4---sn-ab5sznzy.gvt1.com.": {}, "rr4---sn-ab5sznzz.googlevideo.com.": {}, - "rr4---sn-ab5sznzz.gvt1.com.": {}, "rr4---sn-aigl6n6s.googlevideo.com.": {}, "rr4---sn-aigl6ned.googlevideo.com.": {}, - "rr4---sn-aigl6nek.googlevideo.com.": {}, - "rr4---sn-aigl6ner.googlevideo.com.": {}, "rr4---sn-aigl6ney.googlevideo.com.": {}, "rr4---sn-aigl6nl7.googlevideo.com.": {}, "rr4---sn-aigl6ns6.googlevideo.com.": {}, "rr4---sn-aigl6nsd.googlevideo.com.": {}, "rr4---sn-aigl6nsk.googlevideo.com.": {}, - "rr4---sn-aigl6nsk.gvt1.com.": {}, "rr4---sn-aigl6nsr.googlevideo.com.": {}, "rr4---sn-aigl6nz7.googlevideo.com.": {}, "rr4---sn-aigl6nze.googlevideo.com.": {}, @@ -5977,15 +5861,16 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-aigzrn7l.googlevideo.com.": {}, "rr4---sn-aigzrn7s.googlevideo.com.": {}, "rr4---sn-aigzrn7z.googlevideo.com.": {}, + "rr4---sn-aigzrne7.googlevideo.com.": {}, "rr4---sn-aigzrnld.googlevideo.com.": {}, "rr4---sn-aigzrnse.googlevideo.com.": {}, "rr4---sn-aigzrnsl.googlevideo.com.": {}, "rr4---sn-aigzrnsr.googlevideo.com.": {}, "rr4---sn-aigzrnss.googlevideo.com.": {}, "rr4---sn-aigzrnsz.googlevideo.com.": {}, - "rr4---sn-aigzrnsz.gvt1.com.": {}, "rr4---sn-aigzrnz7.googlevideo.com.": {}, "rr4---sn-aigzrnze.googlevideo.com.": {}, + "rr4---sn-aj5ua5-5c.googlevideo.com.": {}, "rr4---sn-apn7en7e.googlevideo.com.": {}, "rr4---sn-apn7en7l.googlevideo.com.": {}, "rr4---sn-apn7en7s.googlevideo.com.": {}, @@ -5998,7 +5883,11 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-cvb7lnlz.googlevideo.com.": {}, "rr4---sn-cvb7sn7k.googlevideo.com.": {}, "rr4---sn-cvb7sn7r.googlevideo.com.": {}, + "rr4---sn-gvbxgn-tvf6.googlevideo.com.": {}, + "rr4---sn-gvbxgn-tvfz.googlevideo.com.": {}, "rr4---sn-h0jeened.googlevideo.com.": {}, + "rr4---sn-h0jeenek.googlevideo.com.": {}, + "rr4---sn-h0jeener.googlevideo.com.": {}, "rr4---sn-h0jeenl6.googlevideo.com.": {}, "rr4---sn-h0jeenld.googlevideo.com.": {}, "rr4---sn-h0jeenle.googlevideo.com.": {}, @@ -6006,8 +5895,8 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-h0jeln7l.googlevideo.com.": {}, "rr4---sn-h0jelne6.googlevideo.com.": {}, "rr4---sn-h0jelne7.googlevideo.com.": {}, + "rr4---sn-h0jelnes.googlevideo.com.": {}, "rr4---sn-h0jelnez.googlevideo.com.": {}, - "rr4---sn-hgn7rn7y.googlevideo.com.": {}, "rr4---sn-hjoj-gq0l.googlevideo.com.": {}, "rr4---sn-hjoj-gq0l.gvt1.com.": {}, "rr4---sn-hoa7kn76.googlevideo.com.": {}, @@ -6016,37 +5905,32 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-hoa7rn7z.googlevideo.com.": {}, "rr4---sn-hp57kn6r.googlevideo.com.": {}, "rr4---sn-hp57kn6y.googlevideo.com.": {}, - "rr4---sn-hp57knd6.googlevideo.com.": {}, "rr4---sn-hp57kndd.googlevideo.com.": {}, "rr4---sn-hp57kndd.gvt1.com.": {}, "rr4---sn-hp57kndk.googlevideo.com.": {}, "rr4---sn-hp57kndr.googlevideo.com.": {}, "rr4---sn-hp57knds.googlevideo.com.": {}, "rr4---sn-hp57kndy.googlevideo.com.": {}, - "rr4---sn-hp57kndz.googlevideo.com.": {}, - "rr4---sn-hp57kndz.gvt1.com.": {}, + "rr4---sn-hp57kndy.gvt1.com.": {}, "rr4---sn-hp57yn7r.googlevideo.com.": {}, - "rr4---sn-hp57yn7r.gvt1.com.": {}, "rr4---sn-hp57yn7y.googlevideo.com.": {}, "rr4---sn-hp57yne7.googlevideo.com.": {}, - "rr4---sn-hp57ynee.googlevideo.com.": {}, "rr4---sn-hp57ynl6.googlevideo.com.": {}, "rr4---sn-hp57ynl6.gvt1.com.": {}, "rr4---sn-hp57ynlr.googlevideo.com.": {}, "rr4---sn-hp57ynly.googlevideo.com.": {}, "rr4---sn-hp57yns7.googlevideo.com.": {}, "rr4---sn-hp57ynse.googlevideo.com.": {}, - "rr4---sn-hp57ynse.gvt1.com.": {}, "rr4---sn-hp57ynsl.googlevideo.com.": {}, "rr4---sn-hp57ynss.googlevideo.com.": {}, "rr4---sn-hp57ynss.gvt1.com.": {}, "rr4---sn-i3b7kn6s.googlevideo.com.": {}, "rr4---sn-i3b7knld.googlevideo.com.": {}, + "rr4---sn-i3b7knlk.googlevideo.com.": {}, "rr4---sn-i3b7kns6.googlevideo.com.": {}, "rr4---sn-i3b7knsd.googlevideo.com.": {}, "rr4---sn-i3b7knse.googlevideo.com.": {}, "rr4---sn-i3b7knsl.googlevideo.com.": {}, - "rr4---sn-i3b7knzl.googlevideo.com.": {}, "rr4---sn-i3b7knzs.googlevideo.com.": {}, "rr4---sn-i3belne6.googlevideo.com.": {}, "rr4---sn-i3belney.googlevideo.com.": {}, @@ -6075,13 +5959,12 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-jvhj5nu-qufs.googlevideo.com.": {}, "rr4---sn-jvhj5nu-qufz.googlevideo.com.": {}, "rr4---sn-jxopj-n5oe.googlevideo.com.": {}, - "rr4---sn-jxopj-n5oe.gvt1.com.": {}, "rr4---sn-jxopj-nh4e.googlevideo.com.": {}, "rr4---sn-jxopj-nh4e.gvt1.com.": {}, + "rr4---sn-muxa-2iae.googlevideo.com.": {}, "rr4---sn-n4v7snee.googlevideo.com.": {}, "rr4---sn-n4v7sney.googlevideo.com.": {}, "rr4---sn-n4v7snl7.googlevideo.com.": {}, - "rr4---sn-n4v7snl7.gvt1.com.": {}, "rr4---sn-n4v7snll.googlevideo.com.": {}, "rr4---sn-n4v7snlr.googlevideo.com.": {}, "rr4---sn-n4v7snls.googlevideo.com.": {}, @@ -6092,9 +5975,9 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-npoe7nds.googlevideo.com.": {}, "rr4---sn-npoe7ne6.googlevideo.com.": {}, "rr4---sn-npoe7ne7.googlevideo.com.": {}, + "rr4---sn-npoe7ned.googlevideo.com.": {}, "rr4---sn-npoe7nek.googlevideo.com.": {}, "rr4---sn-npoe7ner.googlevideo.com.": {}, - "rr4---sn-npoe7nes.googlevideo.com.": {}, "rr4---sn-npoe7ney.googlevideo.com.": {}, "rr4---sn-npoe7nez.googlevideo.com.": {}, "rr4---sn-npoe7nl6.googlevideo.com.": {}, @@ -6119,7 +6002,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-npoeenle.googlevideo.com.": {}, "rr4---sn-npoeenlk.googlevideo.com.": {}, "rr4---sn-npoeenll.googlevideo.com.": {}, - "rr4---sn-npoeenly.googlevideo.com.": {}, "rr4---sn-npoeens7.googlevideo.com.": {}, "rr4---sn-npoldn76.googlevideo.com.": {}, "rr4---sn-npoldn7d.googlevideo.com.": {}, @@ -6129,52 +6011,49 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-npoldn7y.googlevideo.com.": {}, "rr4---sn-npoldn7z.googlevideo.com.": {}, "rr4---sn-npoldne7.googlevideo.com.": {}, - "rr4---sn-nv0ui4gvou-hape.googlevideo.com.": {}, + "rr4---sn-ntqe6n7r.googlevideo.com.": {}, "rr4---sn-nv47ln6e.googlevideo.com.": {}, "rr4---sn-nv47lns6.googlevideo.com.": {}, - "rr4---sn-nv47lns7.googlevideo.com.": {}, - "rr4---sn-nv47lnsy.googlevideo.com.": {}, "rr4---sn-nv47zn7r.googlevideo.com.": {}, - "rr4---sn-nv47zne7.googlevideo.com.": {}, "rr4---sn-nv47znee.googlevideo.com.": {}, "rr4---sn-nv47znel.googlevideo.com.": {}, + "rr4---sn-nx57ynlk.googlevideo.com.": {}, + "rr4---sn-nx57ynsd.googlevideo.com.": {}, "rr4---sn-nx57ynse.googlevideo.com.": {}, + "rr4---sn-nx57ynse.gvt1.com.": {}, "rr4---sn-nx57ynsk.googlevideo.com.": {}, + "rr4---sn-nx57ynsk.gvt1.com.": {}, "rr4---sn-nx57ynsl.googlevideo.com.": {}, + "rr4---sn-nx57ynsl.gvt1.com.": {}, "rr4---sn-nx57ynss.googlevideo.com.": {}, "rr4---sn-nx57ynss.gvt1.com.": {}, "rr4---sn-nx57ynsz.googlevideo.com.": {}, "rr4---sn-nx5s7n76.googlevideo.com.": {}, - "rr4---sn-nx5s7n76.gvt1.com.": {}, "rr4---sn-nx5s7n7d.googlevideo.com.": {}, "rr4---sn-nx5s7n7d.gvt1.com.": {}, "rr4---sn-nx5s7n7s.googlevideo.com.": {}, - "rr4---sn-nx5s7n7s.gvt1.com.": {}, "rr4---sn-nx5s7n7y.googlevideo.com.": {}, + "rr4---sn-nx5s7n7y.gvt1.com.": {}, "rr4---sn-nx5s7n7z.googlevideo.com.": {}, - "rr4---sn-nx5s7n7z.gvt1.com.": {}, "rr4---sn-nx5s7nee.googlevideo.com.": {}, "rr4---sn-nx5s7nee.gvt1.com.": {}, "rr4---sn-nx5s7nel.googlevideo.com.": {}, - "rr4---sn-nx5s7nel.gvt1.com.": {}, "rr4---sn-o097znsd.googlevideo.com.": {}, "rr4---sn-o097znse.googlevideo.com.": {}, "rr4---sn-o097znsk.googlevideo.com.": {}, "rr4---sn-o097znsl.googlevideo.com.": {}, "rr4---sn-o097znsr.googlevideo.com.": {}, - "rr4---sn-o097znsr.gvt1.com.": {}, "rr4---sn-o097znss.googlevideo.com.": {}, "rr4---sn-o097znsz.googlevideo.com.": {}, "rr4---sn-o097znz7.googlevideo.com.": {}, "rr4---sn-o097znzd.googlevideo.com.": {}, - "rr4---sn-o097znzd.gvt1.com.": {}, "rr4---sn-o097znze.googlevideo.com.": {}, "rr4---sn-o097znzk.googlevideo.com.": {}, "rr4---sn-o097znzr.googlevideo.com.": {}, "rr4---sn-p5qddn76.googlevideo.com.": {}, "rr4---sn-p5qddn7d.googlevideo.com.": {}, - "rr4---sn-p5qddn7d.gvt1.com.": {}, "rr4---sn-p5qddn7k.googlevideo.com.": {}, + "rr4---sn-p5qddn7r.googlevideo.com.": {}, "rr4---sn-p5qddn7z.googlevideo.com.": {}, "rr4---sn-p5qlsn6l.googlevideo.com.": {}, "rr4---sn-p5qlsn76.googlevideo.com.": {}, @@ -6182,8 +6061,10 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-p5qlsn7l.googlevideo.com.": {}, "rr4---sn-p5qlsn7s.googlevideo.com.": {}, "rr4---sn-p5qlsnd6.googlevideo.com.": {}, + "rr4---sn-p5qlsndk.googlevideo.com.": {}, "rr4---sn-p5qlsndr.googlevideo.com.": {}, "rr4---sn-p5qlsndz.googlevideo.com.": {}, + "rr4---sn-p5qlsnrl.googlevideo.com.": {}, "rr4---sn-p5qlsnrr.googlevideo.com.": {}, "rr4---sn-p5qlsny6.googlevideo.com.": {}, "rr4---sn-p5qs7n6d.googlevideo.com.": {}, @@ -6195,40 +6076,40 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-q4fl6n66.googlevideo.com.": {}, "rr4---sn-q4fl6n66.gvt1.com.": {}, "rr4---sn-q4fl6n6d.googlevideo.com.": {}, - "rr4---sn-q4fl6n6d.gvt1.com.": {}, "rr4---sn-q4fl6n6r.googlevideo.com.": {}, + "rr4---sn-q4fl6n6r.gvt1.com.": {}, "rr4---sn-q4fl6n6s.googlevideo.com.": {}, + "rr4---sn-q4fl6n6s.gvt1.com.": {}, "rr4---sn-q4fl6n6y.googlevideo.com.": {}, - "rr4---sn-q4fl6n6y.gvt1.com.": {}, "rr4---sn-q4fl6n6z.googlevideo.com.": {}, "rr4---sn-q4fl6nd6.googlevideo.com.": {}, "rr4---sn-q4fl6nd7.googlevideo.com.": {}, - "rr4---sn-q4fl6nd7.gvt1.com.": {}, "rr4---sn-q4fl6nde.googlevideo.com.": {}, + "rr4---sn-q4fl6nde.gvt1.com.": {}, "rr4---sn-q4fl6ndl.googlevideo.com.": {}, - "rr4---sn-q4fl6ndl.gvt1.com.": {}, "rr4---sn-q4fl6nds.googlevideo.com.": {}, "rr4---sn-q4fl6nds.gvt1.com.": {}, "rr4---sn-q4fl6ndz.googlevideo.com.": {}, "rr4---sn-q4fl6nlz.googlevideo.com.": {}, - "rr4---sn-q4fl6nlz.gvt1.com.": {}, "rr4---sn-q4fl6ns6.googlevideo.com.": {}, + "rr4---sn-q4fl6ns6.gvt1.com.": {}, "rr4---sn-q4fl6ns7.googlevideo.com.": {}, "rr4---sn-q4fl6nsd.googlevideo.com.": {}, "rr4---sn-q4fl6nsd.gvt1.com.": {}, "rr4---sn-q4fl6nsk.googlevideo.com.": {}, - "rr4---sn-q4fl6nsk.gvt1.com.": {}, "rr4---sn-q4fl6nsl.googlevideo.com.": {}, "rr4---sn-q4fl6nsr.googlevideo.com.": {}, "rr4---sn-q4fl6nss.googlevideo.com.": {}, + "rr4---sn-q4fl6nss.gvt1.com.": {}, "rr4---sn-q4fl6nsy.googlevideo.com.": {}, + "rr4---sn-q4fl6nsy.gvt1.com.": {}, "rr4---sn-q4fl6nz6.googlevideo.com.": {}, "rr4---sn-q4fl6nz7.googlevideo.com.": {}, + "rr4---sn-q4fl6nz7.gvt1.com.": {}, "rr4---sn-q4fl6nzy.googlevideo.com.": {}, "rr4---sn-q4flrn7k.googlevideo.com.": {}, "rr4---sn-q4flrn7r.googlevideo.com.": {}, "rr4---sn-q4flrn7y.googlevideo.com.": {}, - "rr4---sn-q4flrn7y.gvt1.com.": {}, "rr4---sn-q4flrne6.googlevideo.com.": {}, "rr4---sn-q4flrne7.googlevideo.com.": {}, "rr4---sn-q4flrnee.googlevideo.com.": {}, @@ -6237,6 +6118,7 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-q4flrnel.googlevideo.com.": {}, "rr4---sn-q4flrnel.gvt1.com.": {}, "rr4---sn-q4flrner.googlevideo.com.": {}, + "rr4---sn-q4flrner.gvt1.com.": {}, "rr4---sn-q4flrnes.googlevideo.com.": {}, "rr4---sn-q4flrney.googlevideo.com.": {}, "rr4---sn-q4flrney.gvt1.com.": {}, @@ -6247,20 +6129,19 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-q4flrnld.googlevideo.com.": {}, "rr4---sn-q4flrnld.gvt1.com.": {}, "rr4---sn-q4flrnle.googlevideo.com.": {}, - "rr4---sn-q4flrnle.gvt1.com.": {}, "rr4---sn-q4flrnlz.googlevideo.com.": {}, + "rr4---sn-q4flrnlz.gvt1.com.": {}, "rr4---sn-q4flrnsd.googlevideo.com.": {}, "rr4---sn-q4flrnsk.googlevideo.com.": {}, "rr4---sn-q4flrnsl.googlevideo.com.": {}, "rr4---sn-q4flrnsl.gvt1.com.": {}, "rr4---sn-q4flrnss.googlevideo.com.": {}, - "rr4---sn-q4flrnss.gvt1.com.": {}, "rr4---sn-q4fzen7e.googlevideo.com.": {}, "rr4---sn-q4fzen7e.gvt1.com.": {}, "rr4---sn-q4fzen7l.googlevideo.com.": {}, - "rr4---sn-q4fzen7l.gvt1.com.": {}, "rr4---sn-q4fzen7r.googlevideo.com.": {}, "rr4---sn-q4fzen7s.googlevideo.com.": {}, + "rr4---sn-q4fzen7s.gvt1.com.": {}, "rr4---sn-q4fzen7y.googlevideo.com.": {}, "rr4---sn-q4fzene7.googlevideo.com.": {}, "rr4---sn-q4fzene7.gvt1.com.": {}, @@ -6270,7 +6151,7 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-qxo7rn7y.googlevideo.com.": {}, "rr4---sn-qxoedn7k.googlevideo.com.": {}, "rr4---sn-qxoedne7.googlevideo.com.": {}, - "rr4---sn-qxoednee.googlevideo.com.": {}, + "rr4---sn-t0a7ln7d.googlevideo.com.": {}, "rr4---sn-u1hp55-5c.googlevideo.com.": {}, "rr4---sn-uhvcpaxoa-5hne.googlevideo.com.": {}, "rr4---sn-uhvcpaxoa-guhe.googlevideo.com.": {}, @@ -6280,63 +6161,51 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-vgqskn67.googlevideo.com.": {}, "rr4---sn-vgqskn67.gvt1.com.": {}, "rr4---sn-vgqskn6d.googlevideo.com.": {}, - "rr4---sn-vgqskn6d.gvt1.com.": {}, "rr4---sn-vgqskn6s.googlevideo.com.": {}, "rr4---sn-vgqskn6z.googlevideo.com.": {}, "rr4---sn-vgqskne6.googlevideo.com.": {}, - "rr4---sn-vgqskne6.gvt1.com.": {}, "rr4---sn-vgqskned.googlevideo.com.": {}, "rr4---sn-vgqsknek.googlevideo.com.": {}, "rr4---sn-vgqsknes.googlevideo.com.": {}, "rr4---sn-vgqsknez.googlevideo.com.": {}, + "rr4---sn-vgqsknez.gvt1.com.": {}, "rr4---sn-vgqsknld.googlevideo.com.": {}, - "rr4---sn-vgqsknlk.googlevideo.com.": {}, - "rr4---sn-vgqsknlk.gvt1.com.": {}, "rr4---sn-vgqsknll.googlevideo.com.": {}, + "rr4---sn-vgqsknll.gvt1.com.": {}, "rr4---sn-vgqsknlr.googlevideo.com.": {}, - "rr4---sn-vgqsknlr.gvt1.com.": {}, "rr4---sn-vgqsknls.googlevideo.com.": {}, - "rr4---sn-vgqsknls.gvt1.com.": {}, "rr4---sn-vgqsknly.googlevideo.com.": {}, "rr4---sn-vgqsknlz.googlevideo.com.": {}, "rr4---sn-vgqskns7.googlevideo.com.": {}, "rr4---sn-vgqsknse.googlevideo.com.": {}, - "rr4---sn-vgqsknse.gvt1.com.": {}, "rr4---sn-vgqsknsk.googlevideo.com.": {}, "rr4---sn-vgqsknz6.googlevideo.com.": {}, "rr4---sn-vgqsknz7.googlevideo.com.": {}, "rr4---sn-vgqsknzd.googlevideo.com.": {}, - "rr4---sn-vgqsknzd.gvt1.com.": {}, "rr4---sn-vgqsknze.googlevideo.com.": {}, "rr4---sn-vgqsknzk.googlevideo.com.": {}, - "rr4---sn-vgqsknzk.gvt1.com.": {}, + "rr4---sn-vgqsknzl.googlevideo.com.": {}, "rr4---sn-vgqsknzr.googlevideo.com.": {}, - "rr4---sn-vgqsknzr.gvt1.com.": {}, "rr4---sn-vgqsknzs.googlevideo.com.": {}, + "rr4---sn-vgqsknzs.gvt1.com.": {}, "rr4---sn-vgqsknzy.googlevideo.com.": {}, - "rr4---sn-vgqsknzy.gvt1.com.": {}, "rr4---sn-vgqsknzz.googlevideo.com.": {}, "rr4---sn-vgqsrn66.googlevideo.com.": {}, - "rr4---sn-vgqsrn66.gvt1.com.": {}, "rr4---sn-vgqsrn67.googlevideo.com.": {}, - "rr4---sn-vgqsrn67.gvt1.com.": {}, "rr4---sn-vgqsrn6e.googlevideo.com.": {}, "rr4---sn-vgqsrn6l.googlevideo.com.": {}, "rr4---sn-vgqsrn6z.googlevideo.com.": {}, - "rr4---sn-vgqsrn6z.gvt1.com.": {}, "rr4---sn-vgqsrne6.googlevideo.com.": {}, - "rr4---sn-vgqsrne6.gvt1.com.": {}, "rr4---sn-vgqsrned.googlevideo.com.": {}, "rr4---sn-vgqsrnek.googlevideo.com.": {}, - "rr4---sn-vgqsrnek.gvt1.com.": {}, "rr4---sn-vgqsrnes.googlevideo.com.": {}, "rr4---sn-vgqsrnez.googlevideo.com.": {}, "rr4---sn-vgqsrnl6.googlevideo.com.": {}, "rr4---sn-vgqsrnld.googlevideo.com.": {}, - "rr4---sn-vgqsrnld.gvt1.com.": {}, "rr4---sn-vgqsrnlk.googlevideo.com.": {}, "rr4---sn-vgqsrnll.googlevideo.com.": {}, "rr4---sn-vgqsrnls.googlevideo.com.": {}, + "rr4---sn-vgqsrnlz.googlevideo.com.": {}, "rr4---sn-vgqsrns6.googlevideo.com.": {}, "rr4---sn-vgqsrnsr.googlevideo.com.": {}, "rr4---sn-vgqsrnsy.googlevideo.com.": {}, @@ -6345,21 +6214,17 @@ var FakeECSFQDNs = map[string]struct{}{ "rr4---sn-vgqsrnzd.googlevideo.com.": {}, "rr4---sn-vgqsrnzk.googlevideo.com.": {}, "rr4---sn-vgqsrnzr.googlevideo.com.": {}, - "rr4---sn-vgqsrnzr.gvt1.com.": {}, "rr4---sn-vgqsrnzs.googlevideo.com.": {}, "rr4---sn-vgqsrnzy.googlevideo.com.": {}, "rr4---sn-vgqsrnzz.googlevideo.com.": {}, - "rr4.sn-hgn7rn7y.googlevideo.com.": {}, - "rr4.sn-q4fl6nd6.googlevideo.com.": {}, - "rr4.sn-q4fl6nz7.googlevideo.com.": {}, - "rr4.sn-q4flrnl7.googlevideo.com.": {}, + "rr4.sn-5hne6nzd.googlevideo.com.": {}, + "rr4.sn-q4fl6n6s.googlevideo.com.": {}, + "rr4.sn-q4fl6n6y.googlevideo.com.": {}, + "rr4.sn-q4flrner.googlevideo.com.": {}, "rr5---sn-0nnpbo5a-bggl.googlevideo.com.": {}, "rr5---sn-2imern76.googlevideo.com.": {}, - "rr5---sn-2imern76.gvt1.com.": {}, "rr5---sn-2imern7d.googlevideo.com.": {}, - "rr5---sn-2imern7d.gvt1.com.": {}, "rr5---sn-2imeyn7k.googlevideo.com.": {}, - "rr5---sn-2imeyn7k.gvt1.com.": {}, "rr5---sn-2vgu0b5auxaxjvh-apnd.googlevideo.com.": {}, "rr5---sn-2vgu0b5auxaxjvh-v2vd.googlevideo.com.": {}, "rr5---sn-2vgu0b5auxaxjvh-v2ve.googlevideo.com.": {}, @@ -6372,7 +6237,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-30a7yner.googlevideo.com.": {}, "rr5---sn-30a7yney.googlevideo.com.": {}, "rr5---sn-30a7ynl7.googlevideo.com.": {}, - "rr5---sn-42u-nbozs.googlevideo.com.": {}, "rr5---sn-4g5e6ns6.googlevideo.com.": {}, "rr5---sn-4g5e6ns7.googlevideo.com.": {}, "rr5---sn-4g5e6nsd.googlevideo.com.": {}, @@ -6387,7 +6251,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-4g5e6nzs.googlevideo.com.": {}, "rr5---sn-4g5e6nzz.googlevideo.com.": {}, "rr5---sn-4g5edn6k.googlevideo.com.": {}, - "rr5---sn-4g5edn6r.googlevideo.com.": {}, "rr5---sn-4g5edn6y.googlevideo.com.": {}, "rr5---sn-4g5ednd7.googlevideo.com.": {}, "rr5---sn-4g5edndd.googlevideo.com.": {}, @@ -6408,6 +6271,7 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-4g5ednsk.googlevideo.com.": {}, "rr5---sn-4g5ednsl.googlevideo.com.": {}, "rr5---sn-4g5ednsr.googlevideo.com.": {}, + "rr5---sn-4g5ednss.googlevideo.com.": {}, "rr5---sn-4g5ednsy.googlevideo.com.": {}, "rr5---sn-4g5ednsz.googlevideo.com.": {}, "rr5---sn-4g5ednz7.googlevideo.com.": {}, @@ -6430,7 +6294,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-5hne6nsk.googlevideo.com.": {}, "rr5---sn-5hne6nsr.googlevideo.com.": {}, "rr5---sn-5hne6nsy.googlevideo.com.": {}, - "rr5---sn-5hne6nsy.gvt1.com.": {}, "rr5---sn-5hne6nsz.googlevideo.com.": {}, "rr5---sn-5hne6nz6.googlevideo.com.": {}, "rr5---sn-5hne6nzd.googlevideo.com.": {}, @@ -6441,18 +6304,17 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-5hnednsz.googlevideo.com.": {}, "rr5---sn-5hnekn76.googlevideo.com.": {}, "rr5---sn-5hnekn7d.googlevideo.com.": {}, - "rr5---sn-5hnekn7k.googlevideo.com.": {}, "rr5---sn-5hnekn7l.googlevideo.com.": {}, "rr5---sn-5hnekn7s.googlevideo.com.": {}, "rr5---sn-5hnekn7z.googlevideo.com.": {}, "rr5---sn-5hneknee.googlevideo.com.": {}, "rr5---sn-5hneknek.googlevideo.com.": {}, - "rr5---sn-5hneknek.gvt1.com.": {}, "rr5---sn-5hneknes.googlevideo.com.": {}, "rr5---sn-5pgnugx5h-hn2z.googlevideo.com.": {}, "rr5---sn-5uaezndd.googlevideo.com.": {}, "rr5---sn-5uaezne6.googlevideo.com.": {}, "rr5---sn-5uaezned.googlevideo.com.": {}, + "rr5---sn-5uaeznes.googlevideo.com.": {}, "rr5---sn-5uaeznez.googlevideo.com.": {}, "rr5---sn-5uaeznl6.googlevideo.com.": {}, "rr5---sn-5uaeznld.googlevideo.com.": {}, @@ -6466,7 +6328,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-5uaeznss.googlevideo.com.": {}, "rr5---sn-5uaezny6.googlevideo.com.": {}, "rr5---sn-5uaeznys.googlevideo.com.": {}, - "rr5---sn-5uaeznyz.googlevideo.com.": {}, "rr5---sn-5uaeznze.googlevideo.com.": {}, "rr5---sn-5ualdnll.googlevideo.com.": {}, "rr5---sn-5ualdnlr.googlevideo.com.": {}, @@ -6475,6 +6336,7 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-5ualdns7.googlevideo.com.": {}, "rr5---sn-5ualdnsd.googlevideo.com.": {}, "rr5---sn-5ualdnse.googlevideo.com.": {}, + "rr5---sn-5ualdnsk.googlevideo.com.": {}, "rr5---sn-5ualdnsl.googlevideo.com.": {}, "rr5---sn-5ualdnsr.googlevideo.com.": {}, "rr5---sn-5ualdnss.googlevideo.com.": {}, @@ -6482,9 +6344,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-5ualdnsz.googlevideo.com.": {}, "rr5---sn-5ualdnz7.googlevideo.com.": {}, "rr5---sn-5ualdnze.googlevideo.com.": {}, - "rr5---sn-8qj-i5o6k.googlevideo.com.": {}, - "rr5---sn-8qj-i5ozd.googlevideo.com.": {}, - "rr5---sn-8qj-i5ozr.googlevideo.com.": {}, "rr5---sn-8qj-nbo66.googlevideo.com.": {}, "rr5---sn-8xgp1vo-2iae.googlevideo.com.": {}, "rr5---sn-8xgp1vo-2iae7.googlevideo.com.": {}, @@ -6497,50 +6356,44 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-8xgp1vo-ab5l.googlevideo.com.": {}, "rr5---sn-8xgp1vo-ab5s.googlevideo.com.": {}, "rr5---sn-8xgp1vo-ab5z.googlevideo.com.": {}, - "rr5---sn-8xgp1vo-nh4e.googlevideo.com.": {}, "rr5---sn-8xgp1vo-p5ie.googlevideo.com.": {}, "rr5---sn-8xgp1vo-vgqe.googlevideo.com.": {}, "rr5---sn-8xgp1vo-xfge.googlevideo.com.": {}, "rr5---sn-8xgp1vo-xfgl.googlevideo.com.": {}, "rr5---sn-9gv76n7e.googlevideo.com.": {}, + "rr5---sn-9gv76n7l.googlevideo.com.": {}, "rr5---sn-9gv76n7s.googlevideo.com.": {}, - "rr5---sn-9gv76n7z.googlevideo.com.": {}, "rr5---sn-9gv7ene6.googlevideo.com.": {}, "rr5---sn-9gv7ened.googlevideo.com.": {}, + "rr5---sn-9gv7zn76.googlevideo.com.": {}, "rr5---sn-9gv7zn7e.googlevideo.com.": {}, "rr5---sn-9gv7zn7r.googlevideo.com.": {}, + "rr5---sn-9gv7zn7y.googlevideo.com.": {}, "rr5---sn-a5m7lnl6.googlevideo.com.": {}, - "rr5---sn-a5m7lnl6.gvt1.com.": {}, "rr5---sn-a5m7lnld.googlevideo.com.": {}, "rr5---sn-a5mekn6d.googlevideo.com.": {}, "rr5---sn-a5mekn6k.googlevideo.com.": {}, - "rr5---sn-a5mekn6l.googlevideo.com.": {}, "rr5---sn-a5mekn6r.googlevideo.com.": {}, - "rr5---sn-a5mekn6r.gvt1.com.": {}, "rr5---sn-a5mekn6s.googlevideo.com.": {}, "rr5---sn-a5mekn6z.googlevideo.com.": {}, - "rr5---sn-a5mekn6z.gvt1.com.": {}, "rr5---sn-a5meknd6.googlevideo.com.": {}, "rr5---sn-a5meknd6.gvt1.com.": {}, "rr5---sn-a5meknde.googlevideo.com.": {}, "rr5---sn-a5mekndl.googlevideo.com.": {}, - "rr5---sn-a5mekndl.gvt1.com.": {}, + "rr5---sn-a5meknds.googlevideo.com.": {}, + "rr5---sn-a5meknds.gvt1.com.": {}, "rr5---sn-a5mekndz.googlevideo.com.": {}, "rr5---sn-a5mekndz.gvt1.com.": {}, "rr5---sn-a5meknsd.googlevideo.com.": {}, - "rr5---sn-a5meknsd.gvt1.com.": {}, "rr5---sn-a5meknsy.googlevideo.com.": {}, - "rr5---sn-a5meknsy.gvt1.com.": {}, "rr5---sn-a5meknzk.googlevideo.com.": {}, - "rr5---sn-a5meknzl.googlevideo.com.": {}, "rr5---sn-a5meknzr.googlevideo.com.": {}, "rr5---sn-a5meknzs.googlevideo.com.": {}, "rr5---sn-a5mlrnek.googlevideo.com.": {}, "rr5---sn-a5mlrnl6.googlevideo.com.": {}, - "rr5---sn-a5mlrnl6.gvt1.com.": {}, "rr5---sn-a5mlrnll.googlevideo.com.": {}, - "rr5---sn-a5mlrnll.gvt1.com.": {}, "rr5---sn-a5mlrnls.googlevideo.com.": {}, + "rr5---sn-a5mlrnls.gvt1.com.": {}, "rr5---sn-a5mlrnlz.googlevideo.com.": {}, "rr5---sn-a5mlrnlz.gvt1.com.": {}, "rr5---sn-a5msen76.googlevideo.com.": {}, @@ -6548,47 +6401,33 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-a5msen7s.googlevideo.com.": {}, "rr5---sn-a5msen7z.googlevideo.com.": {}, "rr5---sn-a5msenek.googlevideo.com.": {}, - "rr5---sn-a5msenek.gvt1.com.": {}, "rr5---sn-a5msener.googlevideo.com.": {}, - "rr5---sn-a5msener.gvt1.com.": {}, "rr5---sn-a5msenes.googlevideo.com.": {}, "rr5---sn-a5msenl7.googlevideo.com.": {}, - "rr5---sn-a5msenl7.gvt1.com.": {}, "rr5---sn-a5msenle.googlevideo.com.": {}, - "rr5---sn-a5msenle.gvt1.com.": {}, "rr5---sn-a5msenll.googlevideo.com.": {}, "rr5---sn-ab5l6ndr.googlevideo.com.": {}, "rr5---sn-ab5l6ndy.googlevideo.com.": {}, "rr5---sn-ab5l6nk6.googlevideo.com.": {}, - "rr5---sn-ab5l6nk6.gvt1.com.": {}, "rr5---sn-ab5l6nkd.googlevideo.com.": {}, "rr5---sn-ab5l6nr6.googlevideo.com.": {}, - "rr5---sn-ab5l6nr6.gvt1.com.": {}, "rr5---sn-ab5l6nrd.googlevideo.com.": {}, "rr5---sn-ab5l6nrk.googlevideo.com.": {}, "rr5---sn-ab5l6nrl.googlevideo.com.": {}, - "rr5---sn-ab5l6nrl.gvt1.com.": {}, "rr5---sn-ab5l6nrr.googlevideo.com.": {}, "rr5---sn-ab5l6nrs.googlevideo.com.": {}, - "rr5---sn-ab5l6nrs.gvt1.com.": {}, "rr5---sn-ab5l6nrz.googlevideo.com.": {}, - "rr5---sn-ab5l6nrz.gvt1.com.": {}, "rr5---sn-ab5sznld.googlevideo.com.": {}, - "rr5---sn-ab5sznld.gvt1.com.": {}, "rr5---sn-ab5sznlk.googlevideo.com.": {}, "rr5---sn-ab5sznly.googlevideo.com.": {}, "rr5---sn-ab5sznz6.googlevideo.com.": {}, "rr5---sn-ab5sznz6.gvt1.com.": {}, "rr5---sn-ab5sznzd.googlevideo.com.": {}, "rr5---sn-ab5sznze.googlevideo.com.": {}, - "rr5---sn-ab5sznze.gvt1.com.": {}, "rr5---sn-ab5sznzk.googlevideo.com.": {}, "rr5---sn-ab5sznzl.googlevideo.com.": {}, - "rr5---sn-ab5sznzl.gvt1.com.": {}, "rr5---sn-ab5sznzr.googlevideo.com.": {}, - "rr5---sn-ab5sznzr.gvt1.com.": {}, "rr5---sn-ab5sznzs.googlevideo.com.": {}, - "rr5---sn-ab5sznzs.gvt1.com.": {}, "rr5---sn-ab5sznzy.googlevideo.com.": {}, "rr5---sn-ab5sznzz.googlevideo.com.": {}, "rr5---sn-aigl6n6s.googlevideo.com.": {}, @@ -6597,10 +6436,8 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-aigl6ner.googlevideo.com.": {}, "rr5---sn-aigl6ney.googlevideo.com.": {}, "rr5---sn-aigl6nl7.googlevideo.com.": {}, - "rr5---sn-aigl6nl7.gvt1.com.": {}, "rr5---sn-aigl6ns6.googlevideo.com.": {}, "rr5---sn-aigl6nsd.googlevideo.com.": {}, - "rr5---sn-aigl6nsd.gvt1.com.": {}, "rr5---sn-aigl6nsk.googlevideo.com.": {}, "rr5---sn-aigl6nsr.googlevideo.com.": {}, "rr5---sn-aigl6nz7.googlevideo.com.": {}, @@ -6623,10 +6460,9 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-aigzrnsr.googlevideo.com.": {}, "rr5---sn-aigzrnss.googlevideo.com.": {}, "rr5---sn-aigzrnsz.googlevideo.com.": {}, - "rr5---sn-aigzrnsz.gvt1.com.": {}, "rr5---sn-aigzrnz7.googlevideo.com.": {}, - "rr5---sn-aigzrnz7.gvt1.com.": {}, "rr5---sn-aigzrnze.googlevideo.com.": {}, + "rr5---sn-aj5ua5-5c.googlevideo.com.": {}, "rr5---sn-apn7en7e.googlevideo.com.": {}, "rr5---sn-apn7en7l.googlevideo.com.": {}, "rr5---sn-apn7en7s.googlevideo.com.": {}, @@ -6642,7 +6478,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-h0jeener.googlevideo.com.": {}, "rr5---sn-h0jeenl6.googlevideo.com.": {}, "rr5---sn-h0jeenld.googlevideo.com.": {}, - "rr5---sn-h0jeenle.googlevideo.com.": {}, "rr5---sn-h0jeln7e.googlevideo.com.": {}, "rr5---sn-h0jeln7l.googlevideo.com.": {}, "rr5---sn-h0jelne6.googlevideo.com.": {}, @@ -6654,30 +6489,28 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-hoa7rn76.googlevideo.com.": {}, "rr5---sn-hoa7rn7z.googlevideo.com.": {}, "rr5---sn-hp57kn6r.googlevideo.com.": {}, - "rr5---sn-hp57kn6r.gvt1.com.": {}, "rr5---sn-hp57kn6y.googlevideo.com.": {}, "rr5---sn-hp57kn6y.gvt1.com.": {}, "rr5---sn-hp57knd6.googlevideo.com.": {}, "rr5---sn-hp57knd6.gvt1.com.": {}, "rr5---sn-hp57kndd.googlevideo.com.": {}, + "rr5---sn-hp57kndd.gvt1.com.": {}, "rr5---sn-hp57kndk.googlevideo.com.": {}, "rr5---sn-hp57kndr.googlevideo.com.": {}, "rr5---sn-hp57knds.googlevideo.com.": {}, + "rr5---sn-hp57knds.gvt1.com.": {}, "rr5---sn-hp57kndy.googlevideo.com.": {}, - "rr5---sn-hp57kndy.gvt1.com.": {}, "rr5---sn-hp57kndz.googlevideo.com.": {}, "rr5---sn-hp57yn7y.googlevideo.com.": {}, "rr5---sn-hp57yne7.googlevideo.com.": {}, "rr5---sn-hp57ynee.googlevideo.com.": {}, "rr5---sn-hp57ynl6.googlevideo.com.": {}, "rr5---sn-hp57ynlr.googlevideo.com.": {}, + "rr5---sn-hp57ynlr.gvt1.com.": {}, "rr5---sn-hp57ynly.googlevideo.com.": {}, - "rr5---sn-hp57ynly.gvt1.com.": {}, "rr5---sn-hp57yns7.googlevideo.com.": {}, - "rr5---sn-hp57yns7.gvt1.com.": {}, "rr5---sn-hp57ynse.googlevideo.com.": {}, "rr5---sn-hp57ynsl.googlevideo.com.": {}, - "rr5---sn-hp57ynsl.gvt1.com.": {}, "rr5---sn-hp57ynss.googlevideo.com.": {}, "rr5---sn-i3b7kn6s.googlevideo.com.": {}, "rr5---sn-i3b7knld.googlevideo.com.": {}, @@ -6686,19 +6519,20 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-i3b7knse.googlevideo.com.": {}, "rr5---sn-i3b7knsl.googlevideo.com.": {}, "rr5---sn-i3b7knzl.googlevideo.com.": {}, + "rr5---sn-i3b7knzs.googlevideo.com.": {}, "rr5---sn-i3belne6.googlevideo.com.": {}, - "rr5---sn-i3belney.googlevideo.com.": {}, "rr5---sn-i3belnl6.googlevideo.com.": {}, "rr5---sn-i3belnl7.googlevideo.com.": {}, "rr5---sn-i3belnll.googlevideo.com.": {}, "rr5---sn-i3belnls.googlevideo.com.": {}, - "rr5---sn-i3belnlz.googlevideo.com.": {}, "rr5---sn-i3bssn7e.googlevideo.com.": {}, "rr5---sn-i5h7lner.googlevideo.com.": {}, + "rr5---sn-i5h7lnl6.googlevideo.com.": {}, "rr5---sn-i5h7lnll.googlevideo.com.": {}, "rr5---sn-i5h7lnls.googlevideo.com.": {}, "rr5---sn-i5heen7r.googlevideo.com.": {}, "rr5---sn-i5heen7s.googlevideo.com.": {}, + "rr5---sn-jn2pgx4pcxg-w5os.googlevideo.com.": {}, "rr5---sn-jvhj5nu-2iae.googlevideo.com.": {}, "rr5---sn-jvhj5nu-2ias.googlevideo.com.": {}, "rr5---sn-jvhj5nu-nh4e.googlevideo.com.": {}, @@ -6708,18 +6542,16 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-jvhj5nu-qufl.googlevideo.com.": {}, "rr5---sn-jvhj5nu-qufs.googlevideo.com.": {}, "rr5---sn-jxopj-n5oe.googlevideo.com.": {}, - "rr5---sn-jxopj-n5oe.gvt1.com.": {}, "rr5---sn-jxopj-nh4e.googlevideo.com.": {}, "rr5---sn-jxopj-nh4e.gvt1.com.": {}, + "rr5---sn-muxa-2iae.googlevideo.com.": {}, "rr5---sn-n4v7snee.googlevideo.com.": {}, "rr5---sn-n4v7sney.googlevideo.com.": {}, - "rr5---sn-n4v7snl7.googlevideo.com.": {}, "rr5---sn-n4v7snll.googlevideo.com.": {}, "rr5---sn-n4v7snlr.googlevideo.com.": {}, "rr5---sn-n4v7snls.googlevideo.com.": {}, "rr5---sn-n4v7snly.googlevideo.com.": {}, "rr5---sn-n4v7sns7.googlevideo.com.": {}, - "rr5---sn-n4v7sns7.gvt1.com.": {}, "rr5---sn-n4v7snse.googlevideo.com.": {}, "rr5---sn-npoe7ndl.googlevideo.com.": {}, "rr5---sn-npoe7nds.googlevideo.com.": {}, @@ -6748,10 +6580,10 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-npoeener.googlevideo.com.": {}, "rr5---sn-npoeeney.googlevideo.com.": {}, "rr5---sn-npoeenez.googlevideo.com.": {}, - "rr5---sn-npoeenl7.googlevideo.com.": {}, "rr5---sn-npoeenle.googlevideo.com.": {}, "rr5---sn-npoeenlk.googlevideo.com.": {}, "rr5---sn-npoeenll.googlevideo.com.": {}, + "rr5---sn-npoeenly.googlevideo.com.": {}, "rr5---sn-npoeens7.googlevideo.com.": {}, "rr5---sn-npoldn76.googlevideo.com.": {}, "rr5---sn-npoldn7d.googlevideo.com.": {}, @@ -6761,42 +6593,40 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-npoldn7y.googlevideo.com.": {}, "rr5---sn-npoldn7z.googlevideo.com.": {}, "rr5---sn-npoldne7.googlevideo.com.": {}, - "rr5---sn-nv0ui4gvou-hape.googlevideo.com.": {}, + "rr5---sn-ntq7yns7.googlevideo.com.": {}, "rr5---sn-nv47ln6e.googlevideo.com.": {}, - "rr5---sn-nv47lnly.googlevideo.com.": {}, "rr5---sn-nv47lns6.googlevideo.com.": {}, + "rr5---sn-nv47lnsr.googlevideo.com.": {}, "rr5---sn-nv47zn7r.googlevideo.com.": {}, "rr5---sn-nv47zn7y.googlevideo.com.": {}, "rr5---sn-nv47zne7.googlevideo.com.": {}, "rr5---sn-nv47znee.googlevideo.com.": {}, "rr5---sn-nv47znel.googlevideo.com.": {}, "rr5---sn-nx57ynsd.googlevideo.com.": {}, - "rr5---sn-nx57ynsd.gvt1.com.": {}, "rr5---sn-nx57ynse.googlevideo.com.": {}, + "rr5---sn-nx57ynse.gvt1.com.": {}, "rr5---sn-nx57ynsk.googlevideo.com.": {}, + "rr5---sn-nx57ynsk.gvt1.com.": {}, "rr5---sn-nx57ynsl.googlevideo.com.": {}, "rr5---sn-nx57ynss.googlevideo.com.": {}, - "rr5---sn-nx57ynss.gvt1.com.": {}, "rr5---sn-nx57ynsz.googlevideo.com.": {}, - "rr5---sn-nx57ynsz.gvt1.com.": {}, "rr5---sn-nx5s7n76.googlevideo.com.": {}, "rr5---sn-nx5s7n76.gvt1.com.": {}, "rr5---sn-nx5s7n7d.googlevideo.com.": {}, - "rr5---sn-nx5s7n7d.gvt1.com.": {}, "rr5---sn-nx5s7n7s.googlevideo.com.": {}, + "rr5---sn-nx5s7n7s.gvt1.com.": {}, "rr5---sn-nx5s7n7y.googlevideo.com.": {}, "rr5---sn-nx5s7n7y.gvt1.com.": {}, "rr5---sn-nx5s7n7z.googlevideo.com.": {}, + "rr5---sn-nx5s7n7z.gvt1.com.": {}, "rr5---sn-nx5s7nee.googlevideo.com.": {}, "rr5---sn-nx5s7nee.gvt1.com.": {}, "rr5---sn-nx5s7nel.googlevideo.com.": {}, - "rr5---sn-nx5s7nel.gvt1.com.": {}, "rr5---sn-o097znsd.googlevideo.com.": {}, "rr5---sn-o097znse.googlevideo.com.": {}, "rr5---sn-o097znsk.googlevideo.com.": {}, "rr5---sn-o097znsl.googlevideo.com.": {}, "rr5---sn-o097znsr.googlevideo.com.": {}, - "rr5---sn-o097znsr.gvt1.com.": {}, "rr5---sn-o097znss.googlevideo.com.": {}, "rr5---sn-o097znsz.googlevideo.com.": {}, "rr5---sn-o097znz7.googlevideo.com.": {}, @@ -6807,8 +6637,8 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-p5qddn76.googlevideo.com.": {}, "rr5---sn-p5qddn7d.googlevideo.com.": {}, "rr5---sn-p5qddn7k.googlevideo.com.": {}, + "rr5---sn-p5qddn7r.googlevideo.com.": {}, "rr5---sn-p5qddn7z.googlevideo.com.": {}, - "rr5---sn-p5qddn7z.gvt1.com.": {}, "rr5---sn-p5qlsn6l.googlevideo.com.": {}, "rr5---sn-p5qlsn76.googlevideo.com.": {}, "rr5---sn-p5qlsn7d.googlevideo.com.": {}, @@ -6817,9 +6647,10 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-p5qlsnd6.googlevideo.com.": {}, "rr5---sn-p5qlsndd.googlevideo.com.": {}, "rr5---sn-p5qlsndz.googlevideo.com.": {}, + "rr5---sn-p5qlsnrl.googlevideo.com.": {}, + "rr5---sn-p5qlsnrr.googlevideo.com.": {}, "rr5---sn-p5qlsny6.googlevideo.com.": {}, "rr5---sn-p5qs7n6d.googlevideo.com.": {}, - "rr5---sn-p5qs7nsk.googlevideo.com.": {}, "rr5---sn-p5qs7nsr.googlevideo.com.": {}, "rr5---sn-p5qs7nzk.googlevideo.com.": {}, "rr5---sn-p5qs7nzr.googlevideo.com.": {}, @@ -6830,51 +6661,45 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-q4fl6n6d.gvt1.com.": {}, "rr5---sn-q4fl6n6s.googlevideo.com.": {}, "rr5---sn-q4fl6n6y.googlevideo.com.": {}, - "rr5---sn-q4fl6n6y.gvt1.com.": {}, "rr5---sn-q4fl6n6z.googlevideo.com.": {}, "rr5---sn-q4fl6n6z.gvt1.com.": {}, "rr5---sn-q4fl6nd6.googlevideo.com.": {}, - "rr5---sn-q4fl6nd6.gvt1.com.": {}, "rr5---sn-q4fl6nd7.googlevideo.com.": {}, "rr5---sn-q4fl6nd7.gvt1.com.": {}, "rr5---sn-q4fl6nde.googlevideo.com.": {}, "rr5---sn-q4fl6ndl.googlevideo.com.": {}, - "rr5---sn-q4fl6ndl.gvt1.com.": {}, "rr5---sn-q4fl6nds.googlevideo.com.": {}, - "rr5---sn-q4fl6nds.gvt1.com.": {}, "rr5---sn-q4fl6ndz.googlevideo.com.": {}, "rr5---sn-q4fl6nlz.googlevideo.com.": {}, "rr5---sn-q4fl6ns6.googlevideo.com.": {}, "rr5---sn-q4fl6ns6.gvt1.com.": {}, "rr5---sn-q4fl6ns7.googlevideo.com.": {}, - "rr5---sn-q4fl6ns7.gvt1.com.": {}, "rr5---sn-q4fl6nsd.googlevideo.com.": {}, "rr5---sn-q4fl6nsd.gvt1.com.": {}, "rr5---sn-q4fl6nsk.googlevideo.com.": {}, "rr5---sn-q4fl6nsk.gvt1.com.": {}, "rr5---sn-q4fl6nsl.googlevideo.com.": {}, + "rr5---sn-q4fl6nsl.gvt1.com.": {}, "rr5---sn-q4fl6nsr.googlevideo.com.": {}, "rr5---sn-q4fl6nss.googlevideo.com.": {}, + "rr5---sn-q4fl6nss.gvt1.com.": {}, "rr5---sn-q4fl6nsy.googlevideo.com.": {}, - "rr5---sn-q4fl6nsy.gvt1.com.": {}, "rr5---sn-q4fl6nz6.googlevideo.com.": {}, "rr5---sn-q4fl6nz7.googlevideo.com.": {}, "rr5---sn-q4fl6nzy.googlevideo.com.": {}, - "rr5---sn-q4fl6nzy.gvt1.com.": {}, "rr5---sn-q4flrn7k.googlevideo.com.": {}, "rr5---sn-q4flrn7r.googlevideo.com.": {}, "rr5---sn-q4flrn7y.googlevideo.com.": {}, "rr5---sn-q4flrne6.googlevideo.com.": {}, "rr5---sn-q4flrne7.googlevideo.com.": {}, "rr5---sn-q4flrnee.googlevideo.com.": {}, - "rr5---sn-q4flrnee.gvt1.com.": {}, "rr5---sn-q4flrnek.googlevideo.com.": {}, "rr5---sn-q4flrnel.googlevideo.com.": {}, "rr5---sn-q4flrnel.gvt1.com.": {}, "rr5---sn-q4flrner.googlevideo.com.": {}, + "rr5---sn-q4flrner.gvt1.com.": {}, "rr5---sn-q4flrnes.googlevideo.com.": {}, "rr5---sn-q4flrney.googlevideo.com.": {}, - "rr5---sn-q4flrney.gvt1.com.": {}, "rr5---sn-q4flrnez.googlevideo.com.": {}, "rr5---sn-q4flrnl6.googlevideo.com.": {}, "rr5---sn-q4flrnl6.gvt1.com.": {}, @@ -6883,37 +6708,31 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-q4flrnld.googlevideo.com.": {}, "rr5---sn-q4flrnld.gvt1.com.": {}, "rr5---sn-q4flrnle.googlevideo.com.": {}, - "rr5---sn-q4flrnle.gvt1.com.": {}, "rr5---sn-q4flrnlz.googlevideo.com.": {}, - "rr5---sn-q4flrnlz.gvt1.com.": {}, "rr5---sn-q4flrnsd.googlevideo.com.": {}, "rr5---sn-q4flrnsk.googlevideo.com.": {}, - "rr5---sn-q4flrnsk.gvt1.com.": {}, "rr5---sn-q4flrnsl.googlevideo.com.": {}, "rr5---sn-q4flrnss.googlevideo.com.": {}, "rr5---sn-q4flrnss.gvt1.com.": {}, "rr5---sn-q4fzen7e.googlevideo.com.": {}, - "rr5---sn-q4fzen7e.gvt1.com.": {}, "rr5---sn-q4fzen7l.googlevideo.com.": {}, "rr5---sn-q4fzen7r.googlevideo.com.": {}, + "rr5---sn-q4fzen7r.gvt1.com.": {}, "rr5---sn-q4fzen7s.googlevideo.com.": {}, + "rr5---sn-q4fzen7s.gvt1.com.": {}, "rr5---sn-q4fzen7y.googlevideo.com.": {}, - "rr5---sn-q4fzen7y.gvt1.com.": {}, "rr5---sn-q4fzene7.googlevideo.com.": {}, - "rr5---sn-q4fzene7.gvt1.com.": {}, "rr5---sn-q4fzenee.googlevideo.com.": {}, - "rr5---sn-q4fzenee.gvt1.com.": {}, "rr5---sn-qxo7rn7k.googlevideo.com.": {}, "rr5---sn-qxo7rn7r.googlevideo.com.": {}, "rr5---sn-qxo7rn7y.googlevideo.com.": {}, "rr5---sn-qxoedn7k.googlevideo.com.": {}, "rr5---sn-qxoedne7.googlevideo.com.": {}, "rr5---sn-qxoednee.googlevideo.com.": {}, + "rr5---sn-t0a7ln7d.googlevideo.com.": {}, "rr5---sn-u1hp55-5c.googlevideo.com.": {}, "rr5---sn-vgqskn66.googlevideo.com.": {}, - "rr5---sn-vgqskn66.gvt1.com.": {}, "rr5---sn-vgqskn67.googlevideo.com.": {}, - "rr5---sn-vgqskn67.gvt1.com.": {}, "rr5---sn-vgqskn6d.googlevideo.com.": {}, "rr5---sn-vgqskn6s.googlevideo.com.": {}, "rr5---sn-vgqskn6z.googlevideo.com.": {}, @@ -6921,12 +6740,9 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-vgqskned.googlevideo.com.": {}, "rr5---sn-vgqsknek.googlevideo.com.": {}, "rr5---sn-vgqsknes.googlevideo.com.": {}, - "rr5---sn-vgqsknes.gvt1.com.": {}, "rr5---sn-vgqsknez.googlevideo.com.": {}, "rr5---sn-vgqsknez.gvt1.com.": {}, - "rr5---sn-vgqsknld.googlevideo.com.": {}, "rr5---sn-vgqsknlk.googlevideo.com.": {}, - "rr5---sn-vgqsknll.googlevideo.com.": {}, "rr5---sn-vgqsknlr.googlevideo.com.": {}, "rr5---sn-vgqsknlr.gvt1.com.": {}, "rr5---sn-vgqsknls.googlevideo.com.": {}, @@ -6939,66 +6755,57 @@ var FakeECSFQDNs = map[string]struct{}{ "rr5---sn-vgqsknz6.googlevideo.com.": {}, "rr5---sn-vgqsknz7.googlevideo.com.": {}, "rr5---sn-vgqsknzd.googlevideo.com.": {}, - "rr5---sn-vgqsknzd.gvt1.com.": {}, "rr5---sn-vgqsknze.googlevideo.com.": {}, - "rr5---sn-vgqsknze.gvt1.com.": {}, "rr5---sn-vgqsknzk.googlevideo.com.": {}, - "rr5---sn-vgqsknzk.gvt1.com.": {}, "rr5---sn-vgqsknzl.googlevideo.com.": {}, "rr5---sn-vgqsknzr.googlevideo.com.": {}, - "rr5---sn-vgqsknzr.gvt1.com.": {}, "rr5---sn-vgqsknzs.googlevideo.com.": {}, - "rr5---sn-vgqsknzs.gvt1.com.": {}, "rr5---sn-vgqsknzy.googlevideo.com.": {}, "rr5---sn-vgqsknzz.googlevideo.com.": {}, "rr5---sn-vgqsrn66.googlevideo.com.": {}, - "rr5---sn-vgqsrn67.googlevideo.com.": {}, "rr5---sn-vgqsrn6e.googlevideo.com.": {}, - "rr5---sn-vgqsrn6e.gvt1.com.": {}, "rr5---sn-vgqsrn6l.googlevideo.com.": {}, "rr5---sn-vgqsrn6z.googlevideo.com.": {}, "rr5---sn-vgqsrn6z.gvt1.com.": {}, "rr5---sn-vgqsrne6.googlevideo.com.": {}, "rr5---sn-vgqsrnek.googlevideo.com.": {}, - "rr5---sn-vgqsrnek.gvt1.com.": {}, "rr5---sn-vgqsrnes.googlevideo.com.": {}, "rr5---sn-vgqsrnez.googlevideo.com.": {}, - "rr5---sn-vgqsrnez.gvt1.com.": {}, "rr5---sn-vgqsrnl6.googlevideo.com.": {}, "rr5---sn-vgqsrnld.googlevideo.com.": {}, + "rr5---sn-vgqsrnlk.googlevideo.com.": {}, "rr5---sn-vgqsrnll.googlevideo.com.": {}, "rr5---sn-vgqsrnls.googlevideo.com.": {}, "rr5---sn-vgqsrnlz.googlevideo.com.": {}, - "rr5---sn-vgqsrnlz.gvt1.com.": {}, "rr5---sn-vgqsrns6.googlevideo.com.": {}, "rr5---sn-vgqsrns6.gvt1.com.": {}, "rr5---sn-vgqsrnsd.googlevideo.com.": {}, - "rr5---sn-vgqsrnsd.gvt1.com.": {}, "rr5---sn-vgqsrnsr.googlevideo.com.": {}, - "rr5---sn-vgqsrnsr.gvt1.com.": {}, "rr5---sn-vgqsrnsy.googlevideo.com.": {}, + "rr5---sn-vgqsrnsy.gvt1.com.": {}, "rr5---sn-vgqsrnz6.googlevideo.com.": {}, "rr5---sn-vgqsrnz7.googlevideo.com.": {}, "rr5---sn-vgqsrnzd.googlevideo.com.": {}, - "rr5---sn-vgqsrnzd.gvt1.com.": {}, "rr5---sn-vgqsrnzk.googlevideo.com.": {}, "rr5---sn-vgqsrnzr.googlevideo.com.": {}, "rr5---sn-vgqsrnzs.googlevideo.com.": {}, "rr5---sn-vgqsrnzy.googlevideo.com.": {}, "rr5---sn-vgqsrnzz.googlevideo.com.": {}, "rr5---sn-vgqsrnzz.gvt1.com.": {}, - "rr5.sn-q4fl6nsd.googlevideo.com.": {}, - "rr6---sn-2aqu-hoas7.googlevideo.com.": {}, + "rr5.sn-ntq7yns7.googlevideo.com.": {}, + "rr5.sn-q4fl6nd7.googlevideo.com.": {}, + "rr5.sn-q4fl6nde.googlevideo.com.": {}, + "rr5.sn-q4flrne6.googlevideo.com.": {}, + "rr5.sn-q4flrnl6.googlevideo.com.": {}, + "rr5.sn-q4flrnl7.googlevideo.com.": {}, + "rr5.sn-q4flrnld.googlevideo.com.": {}, + "rr5.sn-q4fzen7e.googlevideo.com.": {}, + "rr5.sn-q4fzen7s.googlevideo.com.": {}, "rr6---sn-2vgu0b5auxaxjvh-apnd.googlevideo.com.": {}, "rr6---sn-2vgu0b5auxaxjvh-v2vd.googlevideo.com.": {}, "rr6---sn-2vgu0b5auxaxjvh-v2ve.googlevideo.com.": {}, "rr6---sn-2vgu0b5auxaxjvh-v2vl.googlevideo.com.": {}, - "rr6---sn-42u-nbozl.googlevideo.com.": {}, - "rr6---sn-42u-nbozz.googlevideo.com.": {}, "rr6---sn-5pgnugx5h-hn2z.googlevideo.com.": {}, - "rr6---sn-8qj-i5o6k.googlevideo.com.": {}, - "rr6---sn-8qj-i5ozd.googlevideo.com.": {}, - "rr6---sn-8qj-i5ozr.googlevideo.com.": {}, "rr6---sn-8qj-nbo66.googlevideo.com.": {}, "rr6---sn-8xgp1vo-2iae.googlevideo.com.": {}, "rr6---sn-8xgp1vo-2iae7.googlevideo.com.": {}, @@ -7012,10 +6819,8 @@ var FakeECSFQDNs = map[string]struct{}{ "rr6---sn-8xgp1vo-ab5z.googlevideo.com.": {}, "rr6---sn-8xgp1vo-p5ie.googlevideo.com.": {}, "rr6---sn-8xgp1vo-vgqe.googlevideo.com.": {}, - "rr6---sn-8xgp1vo-xfge.googlevideo.com.": {}, "rr6---sn-8xgp1vo-xfgl.googlevideo.com.": {}, "rr6---sn-8xgp1vo-xfgs.googlevideo.com.": {}, - "rr6---sn-bvvbax-2ial.googlevideo.com.": {}, "rr6---sn-i5f5ppuxa-ioal.googlevideo.com.": {}, "rr6---sn-jvhj5nu-2iae.googlevideo.com.": {}, "rr6---sn-jvhj5nu-2ial.googlevideo.com.": {}, @@ -7037,12 +6842,6 @@ var FakeECSFQDNs = map[string]struct{}{ "rr7---sn-2vgu0b5auxaxjvh-v2vd.googlevideo.com.": {}, "rr7---sn-2vgu0b5auxaxjvh-v2ve.googlevideo.com.": {}, "rr7---sn-2vgu0b5auxaxjvh-v2vl.googlevideo.com.": {}, - "rr7---sn-42u-nboze.googlevideo.com.": {}, - "rr7---sn-42u-nbozz.googlevideo.com.": {}, - "rr7---sn-8qj-i5o6k.googlevideo.com.": {}, - "rr7---sn-8qj-i5ody.googlevideo.com.": {}, - "rr7---sn-8qj-i5ozd.googlevideo.com.": {}, - "rr7---sn-8qj-i5ozr.googlevideo.com.": {}, "rr7---sn-8qj-nbo66.googlevideo.com.": {}, "rr7---sn-8xgp1vo-2iae.googlevideo.com.": {}, "rr7---sn-8xgp1vo-2ial.googlevideo.com.": {}, @@ -7056,12 +6855,9 @@ var FakeECSFQDNs = map[string]struct{}{ "rr7---sn-8xgp1vo-p5ie.googlevideo.com.": {}, "rr7---sn-8xgp1vo-vgqe.googlevideo.com.": {}, "rr7---sn-8xgp1vo-xfge.googlevideo.com.": {}, - "rr7---sn-8xgp1vo-xfgl.googlevideo.com.": {}, - "rr7---sn-bvvbax-2ial.googlevideo.com.": {}, "rr7---sn-jvhj5nu-nh4e.googlevideo.com.": {}, "rr7---sn-jvhj5nu-nh4l.googlevideo.com.": {}, "rr7---sn-jvhj5nu-nh4z.googlevideo.com.": {}, - "rr7---sn-jvhj5nu-qufe.googlevideo.com.": {}, "rr7---sn-jvhj5nu-qufl.googlevideo.com.": {}, "rr7---sn-jvhj5nu-qufs.googlevideo.com.": {}, "rr7---sn-jvhj5nu-qufz.googlevideo.com.": {}, @@ -7070,9 +6866,7 @@ var FakeECSFQDNs = map[string]struct{}{ "rr8---sn-2vgu0b5auxaxjvh-apnd.googlevideo.com.": {}, "rr8---sn-2vgu0b5auxaxjvh-v2vd.googlevideo.com.": {}, "rr8---sn-2vgu0b5auxaxjvh-v2ve.googlevideo.com.": {}, - "rr8---sn-42u-nbozz.googlevideo.com.": {}, - "rr8---sn-8qj-i5o6k.googlevideo.com.": {}, - "rr8---sn-8qj-i5ozr.googlevideo.com.": {}, + "rr8---sn-2vgu0b5auxaxjvh-v2vl.googlevideo.com.": {}, "rr8---sn-8xgp1vo-2iae.googlevideo.com.": {}, "rr8---sn-8xgp1vo-2ial.googlevideo.com.": {}, "rr8---sn-8xgp1vo-ab56.googlevideo.com.": {}, @@ -7087,14 +6881,11 @@ var FakeECSFQDNs = map[string]struct{}{ "rr8---sn-8xgp1vo-xfgl.googlevideo.com.": {}, "rr8---sn-bvvbax-2iae.googlevideo.com.": {}, "rr8---sn-bvvbax-2ial.googlevideo.com.": {}, - "rr9---sn-8qj-i5ozd.googlevideo.com.": {}, - "rs.cricketwireless.com.": {}, + "rs-stripe.alm.com.": {}, "rs1.qq.com.": {}, "rs2.qq.com.": {}, - "rsfhealth-my.sharepoint.com.": {}, "rsx.afterpay.com.": {}, "rt.teramind.co.": {}, - "rt3055.infolinks.com.": {}, "rtb-apac.rtbserve.io.": {}, "rtb-eu.rtbserve.io.": {}, "rtb-useast.creativedot.net.": {}, @@ -7108,8 +6899,7 @@ var FakeECSFQDNs = map[string]struct{}{ "rtbasia.com.": {}, "rtbsuperhub.com.": {}, "rtbwave.com.": {}, - "rtc.platform.dbankcloud.com.": {}, - "rtp-static.marketo.com.": {}, + "rtlog22-normal-alisg.tiktokv.com.": {}, "rttf.citrix.com.": {}, "ru1.chat.si.riotgames.com.": {}, "ruijienetworks.com.": {}, @@ -7121,35 +6911,30 @@ var FakeECSFQDNs = map[string]struct{}{ "rxsafeway.sharepoint.com.": {}, "s-cs.send.microad.jp.": {}, "s-rtb-pb.send.microad.jp.": {}, - "s.ccsyncuuid.net.": {}, "s.dblks.net.": {}, "s.deepl.com.": {}, + "s.dualspaceapi.com.": {}, "s.exitbee.com.": {}, "s.optifine.net.": {}, + "s.q.easebar.com.": {}, "s.seedtag.com.": {}, "s1.thcdn.com.": {}, - "s13emagst.akamaized.net.": {}, "s3.us-east-005.backblazeb2.com.": {}, - "s3.us-west-004.backblazeb2.com.": {}, - "s8.addthis.com.": {}, + "s7d6.scene7.com.": {}, "sa1.chat.si.riotgames.com.": {}, "sa2.chat.si.riotgames.com.": {}, "sa3.chat.si.riotgames.com.": {}, "sabre-app.quantummetric.com.": {}, "sabre-sync.quantummetric.com.": {}, + "safelitegroup-my.sharepoint.com.": {}, "saintasaph.remotepc.com.": {}, "salesbridge-my.sharepoint.com.": {}, "salesbridge.sharepoint.com.": {}, "saltlakecity.remotepc.com.": {}, - "samhealthanon.genetec.com.": {}, - "samip.genetec.com.": {}, - "sampkac.genetec.com.": {}, - "sams-checkin.mobile.walmart.com.": {}, "samsclub.quantummetric.com.": {}, - "san.foxsports.com.edgekey.net.": {}, "san.support.hp.com.edgekey.net.": {}, "sanantonio.remotepc.com.": {}, - "sandbox.wdesk.com.": {}, + "sanctionssearch.ofac.treas.gov.": {}, "sandboxclient.retinavue.net.": {}, "sandboxregister.retinavue.net.": {}, "sandiego.remotepc.com.": {}, @@ -7159,10 +6944,10 @@ var FakeECSFQDNs = map[string]struct{}{ "santandernet-my.sharepoint.com.": {}, "santandernet.sharepoint.com.": {}, "santiago.remotepc.com.": {}, + "sanxia.studyquicks.com.": {}, "saopaulo.remotepc.com.": {}, "saopaulo1.remotepc.com.": {}, "saskpower-my.sharepoint.com.": {}, - "sasoffice365-my.sharepoint.com.": {}, "saspeed.igamecj.com.": {}, "sat02pap001.storage.live.com.": {}, "sat02pap001files.storage.live.com.": {}, @@ -7175,11 +6960,14 @@ var FakeECSFQDNs = map[string]struct{}{ "sat02pap005.storage.live.com.": {}, "sat02pap005files.storage.live.com.": {}, "sav.cynet.com.": {}, + "sc.cnbc.com.": {}, "sc.zoom.us.": {}, "scasurgery-my.sharepoint.com.": {}, "scasurgery.sharepoint.com.": {}, + "scdss-my.sharepoint.com.": {}, "schneidercorp.com.": {}, "sciener.cn.": {}, + "sconf.f.360.cn.": {}, "scontent-ams2-1.cdninstagram.com.": {}, "scontent-ams2-1.xx.fbcdn.net.": {}, "scontent-ams4-1.cdninstagram.com.": {}, @@ -7192,10 +6980,12 @@ var FakeECSFQDNs = map[string]struct{}{ "scontent-atl3-2.xx.fbcdn.net.": {}, "scontent-ber1-1.cdninstagram.com.": {}, "scontent-ber1-1.xx.fbcdn.net.": {}, - "scontent-bog1-1.cdninstagram.com.": {}, - "scontent-bog1-1.xx.fbcdn.net.": {}, + "scontent-bkk1-1.xx.fbcdn.net.": {}, + "scontent-bkk1-2.xx.fbcdn.net.": {}, "scontent-bog2-1.cdninstagram.com.": {}, "scontent-bog2-1.xx.fbcdn.net.": {}, + "scontent-bog2-2.cdninstagram.com.": {}, + "scontent-bog2-2.xx.fbcdn.net.": {}, "scontent-bos5-1.cdninstagram.com.": {}, "scontent-bos5-1.xx.fbcdn.net.": {}, "scontent-bru2-1.cdninstagram.com.": {}, @@ -7210,16 +7000,14 @@ var FakeECSFQDNs = map[string]struct{}{ "scontent-cgk1-1.xx.fbcdn.net.": {}, "scontent-cgk1-2.cdninstagram.com.": {}, "scontent-cgk1-2.xx.fbcdn.net.": {}, - "scontent-den4-1.cdninstagram.com.": {}, - "scontent-den4-1.xx.fbcdn.net.": {}, + "scontent-den2-1.cdninstagram.com.": {}, + "scontent-den2-1.xx.fbcdn.net.": {}, "scontent-dfw5-1.cdninstagram.com.": {}, "scontent-dfw5-1.xx.fbcdn.net.": {}, "scontent-dfw5-2.cdninstagram.com.": {}, "scontent-dfw5-2.xx.fbcdn.net.": {}, "scontent-dus1-1.cdninstagram.com.": {}, "scontent-dus1-1.xx.fbcdn.net.": {}, - "scontent-fml20-1.cdninstagram.com.": {}, - "scontent-fml20-1.xx.fbcdn.net.": {}, "scontent-fra3-1.cdninstagram.com.": {}, "scontent-fra3-1.xx.fbcdn.net.": {}, "scontent-fra3-2.cdninstagram.com.": {}, @@ -7229,14 +7017,6 @@ var FakeECSFQDNs = map[string]struct{}{ "scontent-fra5-2.cdninstagram.com.": {}, "scontent-fra5-2.xx.fbcdn.net.": {}, "scontent-gmp1-1.cdninstagram.com.": {}, - "scontent-gru1-1.cdninstagram.com.": {}, - "scontent-gru1-1.xx.fbcdn.net.": {}, - "scontent-gru1-2.cdninstagram.com.": {}, - "scontent-gru1-2.xx.fbcdn.net.": {}, - "scontent-gru2-1.cdninstagram.com.": {}, - "scontent-gru2-1.xx.fbcdn.net.": {}, - "scontent-gru2-2.cdninstagram.com.": {}, - "scontent-gru2-2.xx.fbcdn.net.": {}, "scontent-ham3-1.cdninstagram.com.": {}, "scontent-ham3-1.xx.fbcdn.net.": {}, "scontent-hel3-1.cdninstagram.com.": {}, @@ -7281,7 +7061,9 @@ var FakeECSFQDNs = map[string]struct{}{ "scontent-mia3-2.xx.fbcdn.net.": {}, "scontent-mnl1-1.xx.fbcdn.net.": {}, "scontent-mnl1-2.xx.fbcdn.net.": {}, + "scontent-mrs2-1.cdninstagram.com.": {}, "scontent-mrs2-1.xx.fbcdn.net.": {}, + "scontent-mrs2-2.cdninstagram.com.": {}, "scontent-mrs2-2.xx.fbcdn.net.": {}, "scontent-msp1-1.cdninstagram.com.": {}, "scontent-msp1-1.xx.fbcdn.net.": {}, @@ -7289,12 +7071,10 @@ var FakeECSFQDNs = map[string]struct{}{ "scontent-mty2-1.xx.fbcdn.net.": {}, "scontent-muc2-1.cdninstagram.com.": {}, "scontent-muc2-1.xx.fbcdn.net.": {}, - "scontent-nrt1-2.cdninstagram.com.": {}, "scontent-ord5-1.cdninstagram.com.": {}, "scontent-ord5-1.xx.fbcdn.net.": {}, "scontent-ord5-2.cdninstagram.com.": {}, "scontent-ord5-2.xx.fbcdn.net.": {}, - "scontent-pmo1-1.xx.fbcdn.net.": {}, "scontent-prg1-1.cdninstagram.com.": {}, "scontent-prg1-1.xx.fbcdn.net.": {}, "scontent-qro1-1.cdninstagram.com.": {}, @@ -7313,6 +7093,7 @@ var FakeECSFQDNs = map[string]struct{}{ "scontent-sin6-4.xx.fbcdn.net.": {}, "scontent-sjc3-1.cdninstagram.com.": {}, "scontent-sjc3-1.xx.fbcdn.net.": {}, + "scontent-sof1-1.xx.fbcdn.net.": {}, "scontent-ssn1-1.cdninstagram.com.": {}, "scontent-vie1-1.cdninstagram.com.": {}, "scontent-vie1-1.xx.fbcdn.net.": {}, @@ -7328,18 +7109,20 @@ var FakeECSFQDNs = map[string]struct{}{ "scontent-xsp2-1.xx.fbcdn.net.": {}, "scontent-yyz1-1.cdninstagram.com.": {}, "scontent-yyz1-1.xx.fbcdn.net.": {}, + "scotiabank.com.": {}, "scraper2.onlineradiobox.com.": {}, "scus.his.arc.azure.com.": {}, "scus.his.hybridcompute.trafficmanager.net.": {}, + "sd-suggestions.operacdn.com.": {}, "sdeconfig.kaspersky-labs.com.": {}, - "sdk.51.la.": {}, "sdk.beizi.biz.": {}, + "sdk.canva.com.": {}, + "sdk.iad-04.braze.com.cdn.cloudflare.net.": {}, + "sdk.jetbluevacations.com.": {}, "sdk.qcloud.com.": {}, "sdkgate.pushv3.easebar.com.": {}, "sdktmp.hubcloud.com.cn.": {}, "sdn.lxdns.com.": {}, - "sdn.qtlcname.com.": {}, - "seabroadnet.com.": {}, "seagate.com.": {}, "seagullscientific.com.": {}, "sealsubscriptions.com.": {}, @@ -7347,31 +7130,22 @@ var FakeECSFQDNs = map[string]struct{}{ "search.namequery.com.": {}, "search.us.namequery.com.": {}, "searchanise.com.": {}, - "searchnews-dre.dt.dbankcloud.com.": {}, + "searchfeed.adssquared.com.": {}, "searchserverapi.com.": {}, "seattle.remotepc.com.": {}, - "seattle2.remotepc.com.": {}, - "seattle3.remotepc.com.": {}, "secaucus.remotepc.com.": {}, + "secure-web.cisco.com.": {}, "secure.accurint.com.": {}, - "secure.appex-rf.msn.com.edgekey.net.": {}, - "secure.channel4.com.edgekey.net.": {}, + "secure.skypeassets.com.": {}, "secure.syndetics.com.": {}, "secure5.arcot.com.": {}, "securelink.rivhs.com.": {}, "securelink.valleywisehealth.org.": {}, "securityapi.d3-pr-tm.com.": {}, "securitybankcorporation-my.sharepoint.com.": {}, + "securitybankcorporation.sharepoint.com.": {}, "seedtag.com.": {}, - "select1.notoldrb.monster.": {}, - "select10.notoldrb.monster.": {}, - "select3.notoldrb.monster.": {}, - "select4.notoldrb.monster.": {}, - "select5.notoldrb.monster.": {}, - "select6.notoldrb.monster.": {}, - "select7.notoldrb.monster.": {}, - "select9.notoldrb.monster.": {}, - "selectmedia.asia.": {}, + "segway.prod.k8s.onepeloton.com.": {}, "send.microad.jp.": {}, "sendibt3.com.": {}, "sensei.ruselabs.com.": {}, @@ -7381,6 +7155,9 @@ var FakeECSFQDNs = map[string]struct{}{ "sentry.archive.org.": {}, "sentry.ksztone.com.": {}, "sentry.quillbot.com.": {}, + "sentry.wrike.com.": {}, + "seoul.remotepc.com.": {}, + "sephora-live.inside-graph.com.cdn.cloudflare.net.": {}, "serv.vuukle.com.": {}, "serve.pubapp.network.": {}, "served-by.pixfuture.com.": {}, @@ -7388,75 +7165,93 @@ var FakeECSFQDNs = map[string]struct{}{ "server.bidstack.com.": {}, "serverforge.org.": {}, "service.minute.ly.": {}, + "service.weather.microsoft.com.": {}, + "service2.ultipro.com.": {}, + "servicebus101.myconnectsecure.com.": {}, + "servicebus102.myconnectsecure.com.": {}, + "servicebus103.myconnectsecure.com.": {}, + "servicebus104.myconnectsecure.com.": {}, + "services-mob.panerabread.com.": {}, "services.lego.com.": {}, "services.starfinanz.de.": {}, "services.ucp.kaspersky-labs.com.": {}, "servicetitan.com.": {}, "servt.vuukle.com.": {}, "servx.opamarketplace.com.": {}, - "sessionstack.com.": {}, + "servx.playstream.media.": {}, "settings.live.net.": {}, "settings.luckyorange.com.": {}, + "sewjn80htn-1.algolianet.com.": {}, + "sewjn80htn-2.algolianet.com.": {}, "sewjn80htn-3.algolianet.com.": {}, "sf-express.com.": {}, "sg.api.translator.voice.gcloudsdk.com.": {}, - "sg.mmstat.com.": {}, - "sg.rr2.internet-intl.spanner.alipaydns.com.": {}, + "sg1a-excel-collab.officeapps.live.com.": {}, "sgmbocast.com.": {}, "sgpcas.ezvizlife.com.": {}, - "sgtm.journeys.com.": {}, - "shaka.ruselabs.com.": {}, + "shappify.com.": {}, "share.connect.aig.": {}, - "shared.tournament.a.pvp.net.": {}, - "sharkninja-prd-cus-001.azure-api.net.": {}, + "sharenotes.co.": {}, "sharpschool.com.": {}, "shc6.y.qq.com.": {}, + "shop.mango.com.": {}, "shopify-gtm-suite.getelevar.com.": {}, "shoplazza.com.": {}, + "shortintl.push.oppomobile.com.": {}, "shortpixel.ai.": {}, "shoutout.wix.com.": {}, - "shp.ee.": {}, - "shutterfly-app.quantummetric.com.": {}, - "shutterfly-sync.quantummetric.com.": {}, + "shredder-us.osi.office.net.": {}, "shuzilm.cn.": {}, - "signet.groupbycloud.com.": {}, "signin.ultipro.com.": {}, - "simpshopifyapps.com.": {}, - "sin-itm-radar-testobject.citrix.com.": {}, "sina.com.": {}, "sinaimg.cn.": {}, + "sip-backup.phonepower.com.": {}, + "sip-primary.phonepower.com.": {}, "sip.ringcentral.com.": {}, + "sip112-1121.ringcentral.com.": {}, + "sip112-1131.ringcentral.com.": {}, + "sip112-1141.ringcentral.com.": {}, "sip113-1121.ringcentral.com.": {}, "sip113-1131.ringcentral.com.": {}, "sip113-1141.ringcentral.com.": {}, "sip121-1121.ringcentral.com.": {}, "sip121-1131.ringcentral.com.": {}, + "sip121-1141.ringcentral.com.": {}, + "sip121-1241.ringcentral.com.": {}, "sip123-1121.ringcentral.com.": {}, "sip123-1131.ringcentral.com.": {}, + "sip123-1141.ringcentral.com.": {}, + "sip131-1121.ringcentral.com.": {}, "sip131-1131.ringcentral.com.": {}, + "sip131-1141.ringcentral.com.": {}, + "sip132-1121.ringcentral.com.": {}, "sip132-1131.ringcentral.com.": {}, "sip132-1141.ringcentral.com.": {}, "sip421-121.ringcentral.biz.": {}, - "sisense.com.": {}, + "sipis.acrobits.cz.": {}, + "sis-ipv6.jpush.cn.": {}, "sitemaji.com.": {}, + "situsamc365-my.sharepoint.com.": {}, "sjc.zoom.us.": {}, "sjc04pap001.storage.live.com.": {}, "sjc04pap001files.storage.live.com.": {}, "sjc04pap002.storage.live.com.": {}, "sjc04pap002files.storage.live.com.": {}, + "skanska-my.sharepoint.com.": {}, "skims.com.": {}, "skybet.com.": {}, + "skyglobal.sharepoint.com.": {}, "skyward-lisdprod.iscorp.com.": {}, "skyward-ocprod.iscorp.com.": {}, "skyward.iscorp.com.": {}, - "sl.streamhub.tech.": {}, "slb.cynet.com.": {}, - "slickdealscdn.com.cdn.cloudflare.net.": {}, - "sling-app.quantummetric.com.": {}, + "slickdealscdn.com.": {}, "sm.cn.": {}, "sm1.selectmedia.asia.": {}, "smartcloudcon.com.": {}, - "smartcommunications.cloud.": {}, + "smarthome.ctdevice.ott4china.com.": {}, + "smartpay.profitstars.com.": {}, + "smetrics.att.com.": {}, "smoot-searchv2-aapse1c.v.aaplimg.com.": {}, "smoot-searchv2-aeuc1a.v.aaplimg.com.": {}, "smoot-searchv2-aeuc1b.v.aaplimg.com.": {}, @@ -7473,25 +7268,23 @@ var FakeECSFQDNs = map[string]struct{}{ "smoot-searchv2-ausw2c.v.aaplimg.com.": {}, "smrcy-my.sharepoint.com.": {}, "smrcy.sharepoint.com.": {}, + "sms-sg.ads.heytapmobile.com.": {}, "sms.ads.heytapmobi.com.": {}, - "sn2files.storage.live.com.": {}, - "sn3301files.storage.live.com.": {}, + "sn.api.np.km.playstation.net.": {}, "snap-storage-cdn.l.google.com.": {}, "snippet.affilimatejs.com.": {}, + "snokido.com.": {}, "snz04pap001.storage.live.com.": {}, "snz04pap001files.storage.live.com.": {}, "snz04pap002.storage.live.com.": {}, "snz04pap002files.storage.live.com.": {}, - "socialize.us1.gigya.com.": {}, + "social.thescore.com.": {}, + "socialchain.app.": {}, "sockets.stackexchange.com.": {}, "sofia.remotepc.com.": {}, - "sogoucdn.com.": {}, "sohu.com.": {}, "sohucs.com.": {}, "solid.preyproject.com.": {}, - "solitaireevents.microsoftcasualgames.com.": {}, - "solve-api.forethought.ai.": {}, - "somplo.com.": {}, "sonar-akl1-1.xx.fbcdn.net.": {}, "sonar-ams2-1.xx.fbcdn.net.": {}, "sonar-ams4-1.xx.fbcdn.net.": {}, @@ -7502,10 +7295,12 @@ var FakeECSFQDNs = map[string]struct{}{ "sonar-ber1-1.xx.fbcdn.net.": {}, "sonar-bkk1-1.xx.fbcdn.net.": {}, "sonar-bkk1-2.xx.fbcdn.net.": {}, - "sonar-bog1-1.xx.fbcdn.net.": {}, "sonar-bog2-1.xx.fbcdn.net.": {}, + "sonar-bog2-2.xx.fbcdn.net.": {}, "sonar-bom1-1.xx.fbcdn.net.": {}, "sonar-bom1-2.xx.fbcdn.net.": {}, + "sonar-bom2-1.xx.fbcdn.net.": {}, + "sonar-bom2-2.xx.fbcdn.net.": {}, "sonar-bos5-1.xx.fbcdn.net.": {}, "sonar-bru2-1.xx.fbcdn.net.": {}, "sonar-ccu1-1.xx.fbcdn.net.": {}, @@ -7522,7 +7317,7 @@ var FakeECSFQDNs = map[string]struct{}{ "sonar-del1-2.xx.fbcdn.net.": {}, "sonar-del2-1.xx.fbcdn.net.": {}, "sonar-del2-2.xx.fbcdn.net.": {}, - "sonar-den4-1.xx.fbcdn.net.": {}, + "sonar-den2-1.xx.fbcdn.net.": {}, "sonar-dfw5-1.xx.fbcdn.net.": {}, "sonar-dfw5-2.xx.fbcdn.net.": {}, "sonar-doh1-1.xx.fbcdn.net.": {}, @@ -7530,6 +7325,7 @@ var FakeECSFQDNs = map[string]struct{}{ "sonar-dus1-1.xx.fbcdn.net.": {}, "sonar-eze1-1.xx.fbcdn.net.": {}, "sonar-fco2-1.xx.fbcdn.net.": {}, + "sonar-fml1-1.xx.fbcdn.net.": {}, "sonar-fml20-1.xx.fbcdn.net.": {}, "sonar-for1-1.xx.fbcdn.net.": {}, "sonar-fra3-1.xx.fbcdn.net.": {}, @@ -7559,7 +7355,6 @@ var FakeECSFQDNs = map[string]struct{}{ "sonar-iev1-1.xx.fbcdn.net.": {}, "sonar-ist1-1.xx.fbcdn.net.": {}, "sonar-itm1-1.xx.fbcdn.net.": {}, - "sonar-jnb1-1.xx.fbcdn.net.": {}, "sonar-jnb2-1.xx.fbcdn.net.": {}, "sonar-kul2-1.xx.fbcdn.net.": {}, "sonar-kul2-2.xx.fbcdn.net.": {}, @@ -7624,64 +7419,52 @@ var FakeECSFQDNs = map[string]struct{}{ "sonar-xsp1-2.xx.fbcdn.net.": {}, "sonar-xsp1-3.xx.fbcdn.net.": {}, "sonar-xsp2-1.xx.fbcdn.net.": {}, - "sonar-xxb1-1.xx.fbcdn.net.": {}, "sonar-yyz1-1.xx.fbcdn.net.": {}, "sonar-zrh1-1.xx.fbcdn.net.": {}, "sonar.viously.com.": {}, "sooners-my.sharepoint.com.": {}, "sound-ai-stream.alibaba.com.": {}, "southcarolina.remotepc.com.": {}, + "southfront.mm.fcix.net.": {}, "sp.replit.com.": {}, "sparteo.com.": {}, "spc2com-my.sharepoint.com.": {}, "spcdn.incartupsell.com.": {}, "spectrumhealth-my.sharepoint.com.": {}, "spectrumhealth.sharepoint.com.": {}, - "speechify.com.": {}, + "speedtest.gcore.com.": {}, "spiny.ai.": {}, "spion.savvy.security.": {}, "splash-online-decision.xiaohongshu.com.": {}, "splash.unity.cn.": {}, - "sportsmans.com.": {}, - "sportsuggest-dre.things.dbankcloud.cn.": {}, "springfieldclinic-my.sharepoint.com.": {}, "springfieldclinic.sharepoint.com.": {}, "src.ebay-us.com.": {}, + "srv1.maxhost.io.": {}, "ssafp.samsclub.com.": {}, "ssc.independent.co.uk.": {}, "ssctech.com.": {}, - "ssl.microsofttranslator.com.": {}, + "ssimn.org.": {}, + "sso.dealersocket.com.": {}, "sso.services.box.net.": {}, "ssp.hbrd.io.": {}, "ssp.hybrid.ai.": {}, "sstatic.net.": {}, + "ssxd.mediav.com.": {}, "st-sysupgrade.vivo.com.cn.": {}, "staffbase.com.": {}, - "standaard.be.": {}, - "staples.com.": {}, "stardustgod.com.": {}, "starfinanz.de.": {}, "startssl.com.": {}, - "stat.360safe.com.": {}, - "stat.flashtalking.com.edgekey.net.": {}, - "stat.lianmeng.360.cn.": {}, "stat.mixi.media.": {}, "stat.pdfforge.org.": {}, - "stat2.notoldrb.monster.": {}, - "stat3.notoldrb.monster.": {}, - "stat4.notoldrb.monster.": {}, - "stat5.notoldrb.monster.": {}, - "stat6.notoldrb.monster.": {}, - "stat7.notoldrb.monster.": {}, "statad.ru.": {}, - "stathome.org.": {}, "static-ams2-1.xx.fbcdn.net.": {}, "static-ams4-1.xx.fbcdn.net.": {}, - "static-assets.highwebmedia.com.": {}, "static-atl3-1.xx.fbcdn.net.": {}, "static-atl3-2.xx.fbcdn.net.": {}, "static-bos5-1.xx.fbcdn.net.": {}, - "static-den4-1.xx.fbcdn.net.": {}, + "static-den2-1.xx.fbcdn.net.": {}, "static-dfw5-1.xx.fbcdn.net.": {}, "static-dfw5-2.xx.fbcdn.net.": {}, "static-hou1-1.xx.fbcdn.net.": {}, @@ -7702,88 +7485,80 @@ var FakeECSFQDNs = map[string]struct{}{ "static-ord5-2.xx.fbcdn.net.": {}, "static-sea1-1.xx.fbcdn.net.": {}, "static-sjc3-1.xx.fbcdn.net.": {}, + "static-vie1-1.xx.fbcdn.net.": {}, "static-waw1-1.xx.fbcdn.net.": {}, - "static.chewy.com.": {}, - "static.dable.io.": {}, - "static.etracker.com.": {}, "static.fastly.carvana.io.": {}, + "static.foxnews.com.edgekey.net.": {}, "static.independent.co.uk.": {}, - "static.mobilkoy.ru.": {}, - "static.rgpub.io.": {}, + "static.mixi.media.": {}, + "static.nortoncdn.com.": {}, + "static.springbuilder.site.": {}, "static.standard.co.uk.": {}, "static.thcdn.com.": {}, - "static1.mixi.media.": {}, - "static3.mixi.media.": {}, + "static.writable.com.": {}, + "static2.mixi.media.": {}, "static4.mixi.media.": {}, "static7.mixi.media.": {}, "static8.mixi.media.": {}, - "staticw2.yotpo.com-v1.edgekey.net.": {}, "statistic.live.126.net.": {}, + "stats.adinplay.com.": {}, "stats.aeries.com.": {}, "stats.bannernow.com.": {}, + "stats.dell.com.": {}, "stats.mightytext.co.": {}, + "stats.norton.com.": {}, "stats.rip.": {}, + "stats.studyquicks.com.": {}, "stats.transitapp.com.": {}, "statsig.anthropic.com.": {}, + "statsigapi.net.": {}, "stblaw0-my.sharepoint.com.": {}, "stcdn.leadconnectorhq.com.": {}, "stcharleshealthsystem-my.sharepoint.com.": {}, + "steelseries.com.": {}, + "stemchristie.rome2rio.com.": {}, "stericyclecorp-my.sharepoint.com.": {}, - "stevemadden.com.": {}, "stg-data.ads.heytapmobi.com.": {}, - "stlouis.remotepc.com.": {}, "stockholm.remotepc.com.": {}, "stocks-analytics-events.apple.com.": {}, "stockx-app.quantummetric.com.": {}, "storagecraft.com.": {}, - "store-dra-hispace-dbankcloud-cn-dra.appacc.dbankedge.net.": {}, "store-dra.hispace.dbankcloud.cn.": {}, - "store.epicgames.com.": {}, "store.qq.com.": {}, "streamhub.tech.": {}, "streetviewpixels-pa.googleapis.com.": {}, "stse02.ultipro.com.": {}, "stsew02.ultipro.com.": {}, "stsn02.ultipro.com.": {}, + "student.atitesting.com.": {}, + "studentjths-my.sharepoint.com.": {}, + "studentjths.sharepoint.com.": {}, "studentsecisd-my.sharepoint.com.": {}, "studentsecuedu66932-my.sharepoint.com.": {}, "studentsecuedu66932.sharepoint.com.": {}, "studenttuhsd-my.sharepoint.com.": {}, "studenttuhsd.sharepoint.com.": {}, + "studyquicks.com.": {}, "stun.2talk.com.": {}, "stun.cdnbye.com.": {}, "stun1.ringcentral.com.": {}, - "stun101.signon.gravityshavings.net.": {}, - "stun102.signon.gravityshavings.net.": {}, - "stun103.signon.gravityshavings.net.": {}, - "stun104.signon.gravityshavings.net.": {}, - "stun105.signon.gravityshavings.net.": {}, - "stun106.signon.gravityshavings.net.": {}, - "stun107.signon.gravityshavings.net.": {}, - "stun108.signon.gravityshavings.net.": {}, "stun2.ringcentral.com.": {}, - "styx.data.dashlane.com.": {}, + "subs.theepochtimes.com.": {}, "subway-sync.quantummetric.com.": {}, - "suggest.v-mate.mobi.": {}, "sumari-prod-1.srv.jbisumari.org.": {}, - "sumari.jbi.global.": {}, "sumologic.com.": {}, "sunamerica.com.": {}, "sunmedia.tv.": {}, "sunmi.com.": {}, "sunocoinc-my.sharepoint.com.": {}, "sunocoinc.sharepoint.com.": {}, - "suntcontent.se.": {}, "supl.qxwz.com.": {}, - "support.microsoft.com.": {}, "support.powerschool.com.": {}, "sutterhealth-my.sharepoint.com.": {}, - "sv-ookla.geolinks.com.": {}, + "sutterhealth.sharepoint.com.": {}, "sv8.cyberhaven.io.": {}, "svlive.serraview.com.": {}, - "sweatco.in.": {}, "switch.babybus.com.": {}, - "swsim.stamps.com.": {}, "sydney-sydney-bing-com.trafficmanager.net.": {}, "sydney.bing.com.": {}, "sydney.remotepc.com.": {}, @@ -7796,28 +7571,20 @@ var FakeECSFQDNs = map[string]struct{}{ "syndetics.com.": {}, "sysdk.cl2009.com.": {}, "systemreportservices.genetec.com.": {}, - "t-apil2.mythad.com.": {}, "t-odx.op-mobile.opera.com.": {}, "t.adcell.com.": {}, "t.marketingcloudfx.com.": {}, "t.mookie1.com.": {}, "t.nit.ro.": {}, "t.poki.io.": {}, - "t.wepay.com.": {}, - "t1.ssl.ak.dynamic.tiles.virtualearth.net.": {}, - "t2.nativendo.de.": {}, - "t24469.featuretv.live.": {}, - "t2711.featuretv.live.": {}, + "t.ssl.ak.dynamic.tiles.virtualearth.net.": {}, + "t1.tiles.virtualearth.net.": {}, "t3.xiaohongshu.com.": {}, - "t9638.featuretv.live.": {}, - "t97182.featuretv.live.": {}, - "t9790.featuretv.live.": {}, - "tafaop.xiazaisoft111.com.": {}, "tag.winister.app.": {}, - "tagcommander.com.": {}, - "tags.johnlewis.com.": {}, + "tags.adsafety.net.": {}, "tags.natwest.com.": {}, "taipei.remotepc.com.": {}, + "tamersunion.org.": {}, "tampa.remotepc.com.": {}, "tanx.com.": {}, "tao.barstoolsports.com.": {}, @@ -7826,8 +7593,8 @@ var FakeECSFQDNs = map[string]struct{}{ "tapestry-app.quantummetric.com.": {}, "tarrantcounty-my.sharepoint.com.": {}, "tasteofhome.com.": {}, + "tatracker-us.rivergame.net.": {}, "taylorfarms1com-my.sharepoint.com.": {}, - "tb.sb-cd.com.": {}, "tbcache.com.": {}, "tccprod01.honeywell.com.": {}, "tccprod02.honeywell.com.": {}, @@ -7836,28 +7603,30 @@ var FakeECSFQDNs = map[string]struct{}{ "tclclouds.com.": {}, "tdcservices.tandemdiabetes.com.": {}, "tdm.qq.com.": {}, + "teachingstrategies.com.": {}, + "teams.microsoft.com.": {}, "teams.office.com.": {}, "teamviewer.com.": {}, "tec-do.cn.": {}, - "techgus.com.": {}, "teddymobile.cn.": {}, - "tegna.profiles.tagger.opecloud.com.": {}, "telaviv.remotepc.com.": {}, "telecom.shuzilm.cn.": {}, "telemetry-sdk-inmobi-comtm.trafficmanager.net.": {}, + "telemetry.docusign.net.": {}, "telemetry.savvy.security.": {}, + "telemetry.sdk.inmobi.com.": {}, "telephony.goog.": {}, - "teleport.media.": {}, "tencent-cloud.com.": {}, "tencent-cloud.net.": {}, "tencent.com.": {}, "tencentmusic.com.": {}, "tenda.com.cn.": {}, - "tenpay.com.": {}, + "tepoch.finzfin.com.": {}, "teraswitch.com.": {}, "terms3.hicloud.com.": {}, - "test.internetdownloadmanager.com.": {}, "testnjjhb.com.": {}, + "text.com.": {}, + "tfl-staticscdn.trafficmanager.net.": {}, "tgp.qq.com.": {}, "tgpa.qq.com.": {}, "thanhnien.vn.": {}, @@ -7865,13 +7634,16 @@ var FakeECSFQDNs = map[string]struct{}{ "thenewsbox.net.": {}, "theoks.net.": {}, "thetracker.org.": {}, + "think12stg.wpengine.com.": {}, "thinkific.com.": {}, "thinkingdata.cn.": {}, "thm.visa.com.": {}, "thm12.visa.com.": {}, + "thumb-v4.xhcdn.com.": {}, "tigermailauburn-my.sharepoint.com.": {}, + "tigermailauburn.sharepoint.com.": {}, + "tile.openstreetmap.org.": {}, "tile.osm.org.": {}, - "time.akamai.com.edgekey.net.": {}, "time.ecansol.net.": {}, "time.lmtlabs.com.": {}, "time.nest.com.": {}, @@ -7886,14 +7658,13 @@ var FakeECSFQDNs = map[string]struct{}{ "time4.google.com.": {}, "timi-esports.qq.com.": {}, "timken-my.sharepoint.com.": {}, + "tivan.naver.com.": {}, "tkx.mp.lura.live.": {}, "tlivecdn.com.": {}, "tlivesource.com.": {}, - "tloxp.tlo.com.": {}, "tls-amap.dingtalk.com.": {}, "tls12.eu01.nr-data.net.cdn.cloudflare.net.": {}, "tls12.newrelic.com.cdn.cloudflare.net.": {}, - "tlsext.com.": {}, "tm.barclays.co.uk.": {}, "tm.bdc-cdn.com.": {}, "tm.cybersource.com.": {}, @@ -7901,35 +7672,34 @@ var FakeECSFQDNs = map[string]struct{}{ "tmall.com.": {}, "tmbbank-my.sharepoint.com.": {}, "tmbbank.sharepoint.com.": {}, - "tmbi.com.": {}, "tmc-g2.tm-4.office.com.": {}, + "tmdeviceapi.tclking.com.": {}, "tmfp.klarna.com.": {}, "tmga.qq.com.": {}, "tmge.alicdn.com.": {}, "tmobile-app.quantummetric.com.": {}, "tmobile-sync.quantummetric.com.": {}, - "tmx.bestbuy.com.": {}, - "tmx.monzo.co.uk.": {}, + "tmx.td.com.": {}, "tmx.tdbank.com.": {}, "tmx.uptodate.com.": {}, "tngdigital.com.my.": {}, - "tocoding.com.": {}, - "together.plex.tv.": {}, + "today.line.me.": {}, + "tokyo.remotepc.com.": {}, "tollbrothersinc-my.sharepoint.com.": {}, "tollbrothersinc.sharepoint.com.": {}, "top-widgets-va.us-east-1.log.aliyuncs.com.": {}, "toronto.remotepc.com.": {}, - "tos-d-maliva16-up.byteoversea.net.": {}, - "tosee-upg.tocoding.com.": {}, + "tos-prd-api-mgmt.azure-api.net.": {}, "towerhealth-my.sharepoint.com.": {}, "towerhealth.sharepoint.com.": {}, "tplay.qq.com.": {}, - "tpns.gz2.tencent.com.": {}, "tpns.sgp.tencent.com.": {}, "tpns.sh.tencent.com.": {}, "tpns.tencent.com.": {}, "tpsservice-files-inner.cn-hangzhou.oss-cdn.aliyun-inc.com.": {}, + "tqtli1-inapps.appsflyersdk.com.": {}, "tr-tmc-geo.office.com.": {}, + "tr.p.360.cn.": {}, "tr1.chat.si.riotgames.com.": {}, "tra-ac-ae.apktorrents.com.": {}, "tra-ac-ae.best82.com.": {}, @@ -7965,33 +7735,31 @@ var FakeECSFQDNs = map[string]struct{}{ "track.sendlane.com.": {}, "track.ultimate-guitar.com.": {}, "tracker-udp.gbitt.info.": {}, + "tracker.4.babico.name.tr.": {}, "tracker.best61.com.": {}, - "tracker.bitsearch.to.": {}, "tracker.ccp.ovh.": {}, "tracker.files.fm.": {}, "tracker.grepler.com.": {}, "tracker.hyper-torrent.com.": {}, "tracker.moeking.me.": {}, - "tracker.newtvcdn.com.": {}, - "tracker.openwebtorrent.com.": {}, + "tracker.nwps.ws.": {}, "tracker.theoks.net.": {}, "tracker1.bt.moack.co.kr.": {}, "tracker2.dler.org.": {}, "tracking.eu.antskre.com.": {}, + "tracking.g2crowd.com.": {}, "tracking.ksztone.com.": {}, "tradplusad.com.": {}, - "traffic.omny.fm.": {}, - "transec.usbank.com.": {}, + "trafficbass.com.": {}, "transplace-my.sharepoint.com.": {}, "traversal.syncromsp.com.": {}, "treas.gov.": {}, "treasury.gov.": {}, + "treasurydirect.gov.": {}, "tribalfusion.com.": {}, - "trophy.ww.np.community.playstation.net.": {}, "trovit.com.": {}, "ts1.qq.com.": {}, "ts2.qq.com.": {}, - "tsa.gov.": {}, "tse1.explicit.bing.net.": {}, "tse1.mm.bing.net.": {}, "tse2.explicit.bing.net.": {}, @@ -8000,45 +7768,36 @@ var FakeECSFQDNs = map[string]struct{}{ "tse3.mm.bing.net.": {}, "tse4.explicit.bing.net.": {}, "tse4.mm.bing.net.": {}, - "tsms-dre.security.dbankcloud.cn.": {}, + "tsms-dre.security.dbankcloud.com.": {}, "tt.browser.360.cn.": {}, "ttcache.com.": {}, "ttigroup-my.sharepoint.com.": {}, "ttigroup.sharepoint.com.": {}, "tubecup.net.": {}, "tuhsdk12azus-my.sharepoint.com.": {}, + "tuhsdk12azus.sharepoint.com.": {}, "tunnel.googlezip.net.": {}, "tuoitre.vn.": {}, - "turn.aristotleinsight.com.": {}, - "turnerusd202org-my.sharepoint.com.": {}, - "tusd1-my.sharepoint.com.": {}, - "tusd1.sharepoint.com.": {}, "tuya.com.": {}, "tw.ntp.org.cn.": {}, "twcgov-my.sharepoint.com.": {}, "twcgov.sharepoint.com.": {}, - "tx-mirror.tier.net.": {}, - "txcmmov.a.etoote.com.": {}, "txdot-my.sharepoint.com.": {}, "txdot.sharepoint.com.": {}, + "txoag-my.sharepoint.com.": {}, "txoag.sharepoint.com.": {}, - "txqcmmov.a.etoote.com.": {}, - "txryan.com.": {}, + "tyjr-fgj.aliyun.com.vipgds.alibabadns.com.": {}, + "typenetwork.com.": {}, "u.4dex.io.": {}, "uapi.mp.360.cn.": {}, "uber.zoom.us.": {}, - "uc.chatra-usercontent.com.": {}, "uc.cn.": {}, - "uci.edog.cdn.office.net.edgekey.net.": {}, "ucweb.com.": {}, + "ud.reasonsecurity.com.": {}, "udemycdn.com.": {}, - "ue.lenovomm.cn.": {}, - "ugc.bazaarvoice.com.": {}, - "uhabo.com.": {}, - "ui5.sap.com.": {}, + "udesk.cn.": {}, "uk-api.asm.skype.com.": {}, "uk-prod.asyncgw.teams.microsoft.com.": {}, - "uk3-word-collab.officeapps.live.com.": {}, "ukc-excel-collab.officeapps.live.com.": {}, "ukg.com.": {}, "uks.his.arc.azure.com.": {}, @@ -8046,67 +7805,68 @@ var FakeECSFQDNs = map[string]struct{}{ "ukyuh.tech.": {}, "ulikecam.com.": {}, "uline-app.quantummetric.com.": {}, - "uline-sync.quantummetric.com.": {}, - "ulinq.asia.": {}, + "ulmoyc.com.": {}, "ulta-app.quantummetric.com.": {}, "ulta-sync.quantummetric.com.": {}, - "ulta.com.": {}, "ulta.quantummetric.com.": {}, "ultipro.com.": {}, "ultiprotime.com.": {}, "ultiproworkplace.com.": {}, "umainesystem-my.sharepoint.com.": {}, "umeng.com.": {}, - "ums-telemetry-cn.heytapmobi.com.": {}, + "unbxd.io.": {}, "uncw4-my.sharepoint.com.": {}, + "uncw4.sharepoint.com.": {}, "unicom.shuzilm.cn.": {}, "unified-inbox-1-gw.ultipro.com.": {}, "unified-inbox-2-gw.ultipro.com.": {}, "union.barstoolsports.com.": {}, "union.ucweb.com.": {}, "unipay.qq.com.": {}, + "unisoc.com.": {}, "united.quantummetric.com.": {}, - "unitrends.com.": {}, "unity.cn.": {}, - "unity3d.com.": {}, "universityofwieauclaire-my.sharepoint.com.": {}, - "up.cfxdewifi.top.": {}, "update-master.ixsystems.com.": {}, "update.360safe.com.": {}, "update.huorong.cn.": {}, "update.kingsoftstore.com.": {}, + "update.norton.securebrowser.com.": {}, "update.pdfforge.org.": {}, "update.vivaldi.com.": {}, "updatechannel.sharegate.com.": {}, - "updater.techsmith.com.": {}, "updaterservices.genetec.com.": {}, "updatesnl.macrium.com.": {}, "upload.app.box.com.": {}, "upload.box.com.": {}, "upload.ent.box.com.": {}, "upload.gifshow.com.": {}, + "upload.ksapisrv.com.": {}, "uploads.gamecoast.net.": {}, "upravel.com.": {}, + "upremium.asia.": {}, "upscore.com.": {}, - "upselling.apps.seabroadnet.com.": {}, - "upstart.com.": {}, "upyun.com.": {}, "urekamedia.com.": {}, - "url.cn.": {}, "us-api.asm.skype.com.": {}, + "us-atl-anx-r001.router.teamviewer.com.": {}, + "us-atl-anx-r002.router.teamviewer.com.": {}, + "us-atl-anx-r003.router.teamviewer.com.": {}, + "us-atl-anx-r004.router.teamviewer.com.": {}, + "us-atl-anx-r010.router.teamviewer.com.": {}, "us-central1-adaptive-growth.cloudfunctions.net.": {}, "us-central1-addshoppers-data-production.cloudfunctions.net.": {}, - "us-central1-aeo-datasci-microsrv-pr-afe8.cloudfunctions.net.": {}, "us-central1-affilimate.cloudfunctions.net.": {}, "us-central1-amp-error-reporting.cloudfunctions.net.": {}, "us-central1-blaze-today.cloudfunctions.net.": {}, + "us-central1-blazing-fire-8445.cloudfunctions.net.": {}, "us-central1-bps-oi-production.cloudfunctions.net.": {}, + "us-central1-buzz-3eeb8.cloudfunctions.net.": {}, "us-central1-castify-notifications-prod.cloudfunctions.net.": {}, - "us-central1-clubroom-prod.cloudfunctions.net.": {}, "us-central1-cohinc-146020.cloudfunctions.net.": {}, - "us-central1-custom-site-analytics.cloudfunctions.net.": {}, "us-central1-digitalproducts-gabbo.cloudfunctions.net.": {}, "us-central1-ds-specials-dev.cloudfunctions.net.": {}, + "us-central1-esi-consumer.cloudfunctions.net.": {}, "us-central1-fsgenergy-shared.cloudfunctions.net.": {}, "us-central1-gaggle-staging.cloudfunctions.net.": {}, "us-central1-justbuild-cdb86.cloudfunctions.net.": {}, @@ -8117,15 +7877,54 @@ var FakeECSFQDNs = map[string]struct{}{ "us-central1-noteit-4dca3.cloudfunctions.net.": {}, "us-central1-royal-match-prod-cce6d.cloudfunctions.net.": {}, "us-central1-shopify-instrumentat-ff788286.cloudfunctions.net.": {}, + "us-central1-speechifymobile.cloudfunctions.net.": {}, "us-central1-sq-sgtm-prod.cloudfunctions.net.": {}, "us-central1-teach-monster.cloudfunctions.net.": {}, "us-central1-webgltest-17af1.cloudfunctions.net.": {}, "us-central1-wetterapp-1.cloudfunctions.net.": {}, - "us-den-anx-r008.router.teamviewer.com.": {}, + "us-central1-wrapper-analytics-prod.cloudfunctions.net.": {}, + "us-dal-anx-r003.router.teamviewer.com.": {}, + "us-dal-anx-r006.router.teamviewer.com.": {}, + "us-dal-anx-r008.router.teamviewer.com.": {}, + "us-dal-anx-r010.router.teamviewer.com.": {}, + "us-den-anx-r001.router.teamviewer.com.": {}, + "us-den-anx-r004.router.teamviewer.com.": {}, + "us-den-anx-r005.router.teamviewer.com.": {}, + "us-den-anx-r006.router.teamviewer.com.": {}, + "us-den-anx-r007.router.teamviewer.com.": {}, + "us-den-anx-r010.router.teamviewer.com.": {}, + "us-east-1.console.aws.amazon.com.": {}, "us-east-1.log.aliyuncs.com.": {}, + "us-east-2.console.cname-proxy.amazon.com.": {}, "us-east4-chkp-gcp-rnd-threat-hunt-box.cloudfunctions.net.": {}, - "us-las-gcp-r001.router.teamviewer.com.": {}, - "us-lax-anx-r013.router.teamviewer.com.": {}, + "us-lax-anx-r006.router.teamviewer.com.": {}, + "us-lax-anx-r014.router.teamviewer.com.": {}, + "us-mia-anx-r003.router.teamviewer.com.": {}, + "us-mia-anx-r005.router.teamviewer.com.": {}, + "us-mia-anx-r009.router.teamviewer.com.": {}, + "us-mia-anx-r010.router.teamviewer.com.": {}, + "us-mia-anx-r011.router.teamviewer.com.": {}, + "us-mia-anx-r014.router.teamviewer.com.": {}, + "us-mia-anx-r015.router.teamviewer.com.": {}, + "us-njc-anx-r001.router.teamviewer.com.": {}, + "us-njc-anx-r002.router.teamviewer.com.": {}, + "us-njc-anx-r003.router.teamviewer.com.": {}, + "us-njc-anx-r004.router.teamviewer.com.": {}, + "us-njc-anx-r006.router.teamviewer.com.": {}, + "us-njc-anx-r007.router.teamviewer.com.": {}, + "us-njc-anx-r008.router.teamviewer.com.": {}, + "us-njc-anx-r009.router.teamviewer.com.": {}, + "us-njc-anx-r010.router.teamviewer.com.": {}, + "us-njc-anx-r011.router.teamviewer.com.": {}, + "us-njc-anx-r012.router.teamviewer.com.": {}, + "us-njc-anx-r013.router.teamviewer.com.": {}, + "us-njc-anx-r014.router.teamviewer.com.": {}, + "us-njc-anx-r015.router.teamviewer.com.": {}, + "us-njc-anx-r016.router.teamviewer.com.": {}, + "us-njc-anx-r017.router.teamviewer.com.": {}, + "us-njc-anx-r018.router.teamviewer.com.": {}, + "us-njc-anx-r019.router.teamviewer.com.": {}, + "us-njc-anx-r020.router.teamviewer.com.": {}, "us-pftk-temu-com.trafficmanager.net.": {}, "us-prod.asyncgw.teams.microsoft.com.": {}, "us-sea-anx-r001.router.teamviewer.com.": {}, @@ -8133,17 +7932,27 @@ var FakeECSFQDNs = map[string]struct{}{ "us-sea-anx-r003.router.teamviewer.com.": {}, "us-sea-anx-r004.router.teamviewer.com.": {}, "us-sea-anx-r005.router.teamviewer.com.": {}, + "us-sea-anx-r006.router.teamviewer.com.": {}, "us-sea-anx-r007.router.teamviewer.com.": {}, "us-sea-anx-r008.router.teamviewer.com.": {}, "us-spectrum.rcs.telephony.goog.": {}, + "us-was-anx-r001.router.teamviewer.com.": {}, + "us-was-anx-r004.router.teamviewer.com.": {}, + "us-was-anx-r005.router.teamviewer.com.": {}, + "us-was-anx-r009.router.teamviewer.com.": {}, + "us-was-anx-r012.router.teamviewer.com.": {}, + "us-was-anx-r017.router.teamviewer.com.": {}, + "us-was-anx-r020.router.teamviewer.com.": {}, "us-west-1.log.aliyuncs.com.": {}, "us.att.rcs.telephony.goog.": {}, + "us.evidation.com.": {}, "us.peerhub.net.": {}, "us.pftk.temu.com.": {}, - "us.rtbsystem.org.": {}, + "us.studyquicks.com.": {}, "us.tmobile.rcs.telephony.goog.": {}, "us.tracfone.rcs.telephony.goog.": {}, "us.uscc.rcs.telephony.goog.": {}, + "us.v-cdn.net.": {}, "us.xfinity.rcs.telephony.goog.": {}, "us01.ws-api.ringcentral.com.": {}, "us02.ws-api.ringcentral.com.": {}, @@ -8161,19 +7970,20 @@ var FakeECSFQDNs = map[string]struct{}{ "us06polling.zoom.us.": {}, "us06web.zoom.us.": {}, "us06www3.zoom.us.": {}, + "us1.ecdn2.badoocdn.com.": {}, "us1.ecdn2.bumbcdn.com.": {}, - "us2-live.inside-graph.com.": {}, "us2.rtbsystem.org.": {}, - "us3a-excel-collab.officeapps.live.com.": {}, - "us4-wms.zoho.com.": {}, + "us20.list-manage.com.": {}, + "us3a-powerpoint-collab.officeapps.live.com.": {}, + "us4a-powerpoint-collab.officeapps.live.com.": {}, "us4b-excel-collab.officeapps.live.com.": {}, - "us4b-word-collab.officeapps.live.com.": {}, - "us4s-excel-collab.officeapps.live.com.": {}, - "us8.list-manage.com.": {}, + "us4b-powerpoint-collab.officeapps.live.com.": {}, + "us8-excel-collab.officeapps.live.com.": {}, "usbank.quantummetric.com.": {}, "usc-excel-collab.officeapps.live.com.": {}, "usc-powerpoint-collab.officeapps.live.com.": {}, "usc-word-collab.officeapps.live.com.": {}, + "user.auth.xboxlive.com.": {}, "userexperience.thehut.net.": {}, "userflow.com.": {}, "userlike.com.": {}, @@ -8185,51 +7995,61 @@ var FakeECSFQDNs = map[string]struct{}{ "uslbm-my.sharepoint.com.": {}, "ussav.cynet.com.": {}, "usslb.cynet.com.": {}, + "uswest-beacon.deepintent.com.": {}, "uu.qq.com.": {}, "uuidksinc.net.": {}, - "ux.21cn.com.": {}, + "uvermont.mm.fcix.net.": {}, + "uvu365-my.sharepoint.com.": {}, "uxfeedback.ru.": {}, "uyunad.com.": {}, "v.streaming.qq.com.": {}, "v.vivintsky.com.": {}, + "v16-img.djvod.ndcimgs.com.": {}, "v2-zj-shxcm.kwaicdn.com.": {}, + "v34.tiktokcdn.com.": {}, "v39-as.tiktokcdn.com.": {}, "v39-ca.tiktokcdn.com.": {}, "v39-id.gts.byteoversea.net.": {}, "v39-id.tiktokcdn.com.": {}, - "v39-my.tiktokcdn.com.": {}, - "v39-tr.tiktokcdn.com.": {}, + "v39-my.gts.byteoversea.net.": {}, + "v39-row.gts.byteoversea.net.": {}, + "v39-row.tiktokcdn.com.": {}, "v39-us.gts.byteoversea.net.": {}, "v39-us.tiktokcdn.com.": {}, + "v39-vn-vnpt.tiktokcdn.com.": {}, "v39.byteicdn.com.": {}, + "v45-ph-globe.tiktokcdn.com.": {}, "v6-gdvod.kwaicdn.com.": {}, "v8.analytics.pinsightmedia.com.": {}, "v8engine.pinsightmedia.com.": {}, - "v9-iq.tiktokcdn.com.": {}, - "v9-th.tiktokcdn.com.": {}, - "va.v.liveperson.net.": {}, + "vadesecure.com.": {}, "vador.com.": {}, - "vak345.com.": {}, + "vancitycu-my.sharepoint.com.": {}, "vancitycu.sharepoint.com.": {}, + "varify.io.": {}, "vast.playmatic.video.": {}, "vb17123filippaaniketos.pw.": {}, + "vb24131crasosnemesis.com.": {}, "vbw.vivoglobal.com.": {}, - "vcdn.cloud.": {}, - "vclient-api.smoothwall.com.": {}, "vconf.f.360.cn.": {}, "verifone365-my.sharepoint.com.": {}, + "verifypass.com.": {}, "verticals.wix.com.": {}, + "veteransunited-my.sharepoint.com.": {}, "veteransunited.sharepoint.com.": {}, "vexgateway.fastly.carvana.io.": {}, + "vfa.hpplay.cn.": {}, "vgorigin.hakunaymatata.com.": {}, + "vhq.verifone.com.": {}, "viadcorp-my.sharepoint.com.": {}, + "viadcorp.sharepoint.com.": {}, "vibe.co.": {}, "vibeaconstr.onezapp.com.": {}, "vicoo.tech.": {}, "video-atl3-1.xx.fbcdn.net.": {}, "video-atl3-2.xx.fbcdn.net.": {}, "video-bos5-1.xx.fbcdn.net.": {}, - "video-den4-1.xx.fbcdn.net.": {}, + "video-den2-1.xx.fbcdn.net.": {}, "video-dfw5-1.xx.fbcdn.net.": {}, "video-dfw5-2.xx.fbcdn.net.": {}, "video-hou1-1.xx.fbcdn.net.": {}, @@ -8252,26 +8072,27 @@ var FakeECSFQDNs = map[string]struct{}{ "video-sjc3-1.xx.fbcdn.net.": {}, "video.dailymail.co.uk.": {}, "videocloud.cn-hangzhou.log.aliyuncs.com.": {}, + "videocontent-dra.himovie.dbankcloud.com.": {}, + "videoeditor-api-dra.cloud.huawei.com.": {}, "videoqoe-fastly.stvidtest.net.": {}, - "videos.dailymail.co.uk.": {}, + "videowalldirect.com.": {}, "vidmate.net.": {}, "vieon.vn.": {}, "view2fa.prosourcehosted.com.": {}, "vik-ca.moonactive.net.": {}, - "vintagemonster.onefootball.com.": {}, "viously.com.": {}, + "vip-chinanet.ynuf.aliapp.org.": {}, "vipads.live.": {}, "virusinfo-cloudscan-cn.heytapmobi.com.": {}, "visainc-my.sharepoint.com.": {}, "visainc.sharepoint.com.": {}, "visionserviceplan-my.sharepoint.com.": {}, "visionserviceplan.sharepoint.com.": {}, - "visit-prod-us.occa.ocs.oraclecloud.com.": {}, "visitor.fiftyt.com.": {}, "visitors.live.": {}, "vitalant-my.sharepoint.com.": {}, "vividseats.com.": {}, - "vlscppe.microsoft.com.": {}, + "vivoglobal.com.": {}, "vms-videos.minutemediaservices.com.": {}, "vn-viettel.rcs.telephony.goog.": {}, "vn.pool.ntp.org.": {}, @@ -8281,20 +8102,18 @@ var FakeECSFQDNs = map[string]struct{}{ "voe.sx.": {}, "voice.gcloudcs.com.": {}, "voice.telephony.goog.": {}, - "voicecloud.cn.": {}, - "void.omiapp.me.": {}, "volusiastudents-my.sharepoint.com.": {}, - "vox.amp.permutive.com.": {}, + "volusiastudents.sharepoint.com.": {}, + "vour.io.": {}, "vpn.cshealthforlife.com.": {}, "vpn.garypools.com.": {}, "vpp-license-proxy.aliyuncs.com.": {}, "vzuu.com.": {}, "w.deepl.com.": {}, + "w24.cf.2ksports.com.": {}, "w3.mp.lura.live.": {}, - "w3.org.cdn.cloudflare.net.": {}, - "w3dist.mp.lura.live.": {}, - "w3id-ns.sso.ibm.com.edgekey.net.": {}, - "wallpaperflare.com.": {}, + "wallet.omiapp.me.": {}, + "walletconnect.com.": {}, "walmart.quantummetric.com.": {}, "walshgroup-my.sharepoint.com.": {}, "wap.cmpassport.com.": {}, @@ -8302,57 +8121,70 @@ var FakeECSFQDNs = map[string]struct{}{ "washoeschools-my.sharepoint.com.": {}, "washoeschools.sharepoint.com.": {}, "waynek12inus-my.sharepoint.com.": {}, + "wbte.drcedirect.com.": {}, "wcpss-my.sharepoint.com.": {}, "wcpss.sharepoint.com.": {}, + "wcsdpaorg-my.sharepoint.com.": {}, + "wct-2.com.": {}, "weather-analytics-events.apple.com.": {}, "weather-server-sg.allawnos.com.": {}, + "weather-server.allawntech.com.": {}, "weather-widget-events.apple.com.": {}, "weather.swishapps.ai.": {}, "weathercn.com.": {}, "weatheroffer.com.": {}, + "web-extract.constantcontact.com.": {}, "web-g.kontiki.com.": {}, + "web.archive.org.": {}, "web.fe.1drv.com.": {}, + "web.pypestream.com.": {}, "web.voice.telephony.goog.": {}, "web.wg1.kontiki.com.": {}, "web1.remotepc.com.": {}, "web3.drfirst.com.": {}, "webapi.teamviewer.com.": {}, + "webapp.src.discover.com.": {}, + "webcast22-ws-alisg.tiktokv.com.": {}, "webmd.com.": {}, "weborama-tech.ru.": {}, + "webql-redesign.cnbcfm.com.": {}, "webrad.io.": {}, + "websocket-01.app.pdq.com.": {}, + "websocket-04.app.pdq.com.": {}, "wechatos.net.": {}, "weibocdn.com.": {}, + "welcome.ultipro.com.": {}, "wellspan-my.sharepoint.com.": {}, "wellspan.sharepoint.com.": {}, + "wemuslim.com.": {}, "wesingapp.com.": {}, - "wesingcdn.com.": {}, "westerngovernorsuniversity-my.sharepoint.com.": {}, "westpalm.remotepc.com.": {}, "westrockco-my.sharepoint.com.": {}, "westrockco.sharepoint.com.": {}, "wetype.weixin.qq.com.": {}, "weu.his.arc.azure.com.": {}, + "wewjyw.qb6ges.com.": {}, "wf-proxy-01.algolia.com.": {}, "wf-proxy-02.algolia.com.": {}, "wf-proxy-03.algolia.com.": {}, - "whatismyip.akamai.com.": {}, - "whatismyipaddress.com.": {}, + "whitingturner-my.sharepoint.com.": {}, + "whitingturner.sharepoint.com.": {}, "whizzco.com.": {}, - "widebundle.com.": {}, + "wida-insight.drcedirect.com.": {}, "widgets.leadconnectorhq.com.": {}, + "widgets.sociablekit.com.": {}, "wifispot.io.": {}, "wildcard.cdn.optimizely.com.edgekey.net.": {}, - "wildcard.marketo.net.edgekey.net.": {}, - "wildcard.scene7.com.edgekey.net.": {}, + "wildcard.dayforcehcm.com.edgekey.net.": {}, + "wildcard.ntv.io.edgekey.net.": {}, "williamssonomainc-app.quantummetric.com.": {}, - "win-rtb2-useast.xaprio.net.": {}, - "win1807.ipv6.microsoft.com.": {}, - "win1910.ipv6.microsoft.com.": {}, "winscp.net.": {}, + "wizzair.com.": {}, "wkhpe.com.": {}, + "wl.hpyrdr.com.": {}, "wlgore-my.sharepoint.com.": {}, "wlgore.sharepoint.com.": {}, - "wmg-my.sharepoint.com.": {}, "word-collab.officeapps.live.com.": {}, "workdaycdn.com.cn.": {}, "worldnic.com.": {}, @@ -8360,19 +8192,16 @@ var FakeECSFQDNs = map[string]struct{}{ "worldwideexpress2323-my.sharepoint.com.": {}, "wosign.com.": {}, "wp.safe.360.cn.": {}, + "wpcmdat.itsupport247.net.": {}, "wpk-auth.ucweb.com.": {}, "wpp.net.": {}, + "wpp.okta.com.": {}, "wr.moyoung.com.": {}, "wr.pvp.net.": {}, - "ws-assets.zoominfo.com.": {}, - "ws-school.v.aaplimg.com.": {}, - "ws.business.apple.com.": {}, "ws.gleap.io.": {}, "ws.mybib.com.": {}, - "ws.qualified.com.": {}, - "ws.reamaze.com.": {}, - "ws.school.apple.com.": {}, "ws.tildacdn.com.": {}, + "ws1seg.rwjbh.org.": {}, "wsfcsk12nc-my.sharepoint.com.": {}, "wsfsbank-my.sharepoint.com.": {}, "wsfsbank.sharepoint.com.": {}, @@ -8380,152 +8209,101 @@ var FakeECSFQDNs = map[string]struct{}{ "wsoversea.com.": {}, "wtpsnj-my.sharepoint.com.": {}, "wtsparadigm.com.": {}, - "wunderground.com.": {}, + "wtzw.com.": {}, "wus2.his.arc.azure.com.": {}, + "wwt-my.sharepoint.com.": {}, "wwt.sharepoint.com.": {}, - "www.agoda.com.": {}, + "www.2tx.com.": {}, "www.aigconnect.aig.": {}, + "www.atitesting.com.": {}, "www.automizely-analytics.com.": {}, - "www.basspro.com.": {}, "www.bbc.co.uk.": {}, "www.bbc.co.uk.pri.bbc.co.uk.": {}, "www.bbc.com.": {}, "www.bbc.com.pri.bbc.com.": {}, "www.bbthat.com.": {}, - "www.bose.com.": {}, + "www.bleepingcomputer.com.": {}, "www.box.com.": {}, "www.breitbart.com.": {}, "www.bridge2bwb.com.": {}, - "www.canva.com.": {}, - "www.chewy.com.": {}, + "www.calottery.com.": {}, + "www.cdn.viber.com.": {}, + "www.clearblue.com.": {}, "www.cmpassport.com.": {}, - "www.cnbc.com.": {}, - "www.croxyproxy.com.": {}, - "www.currys.co.uk.": {}, - "www.dashlane.com.": {}, - "www.directv.com.": {}, - "www.discover.com.": {}, + "www.dickssportinggoods.com.": {}, "www.docusign.com.": {}, + "www.drugs.com.": {}, + "www.emjcd.com.": {}, "www.esosuite.net.": {}, "www.etsy.com.": {}, - "www.evtrust.com.": {}, - "www.fmcschedule.com.": {}, + "www.expedia.com.": {}, + "www.futbin.org.": {}, "www.gbnews.com.": {}, + "www.gmc.com.": {}, "www.google.org.": {}, - "www.greatschools.org.": {}, "www.handmadewithjoann.com.": {}, - "www.ifconfig.io.": {}, - "www.imanageshare.com.": {}, "www.in.gov.": {}, "www.independent.co.uk.": {}, "www.inoreader.com.": {}, + "www.internetdownloadmanager.com.": {}, + "www.iorad.com.": {}, "www.jimmyjohns.com.": {}, - "www.landsend.com.": {}, - "www.lexisnexis.com.": {}, - "www.life360.com.cdn.cloudflare.net.": {}, - "www.llbean.net.": {}, - "www.logmeininc.com.": {}, - "www.loopnet.com.": {}, - "www.macys.com.": {}, - "www.mediamarkt.de.": {}, - "www.mendeley.com.": {}, - "www.menti.com.": {}, - "www.myquickcloud.com.": {}, + "www.libertymutual.com.": {}, + "www.maintenanceconnection.com.": {}, + "www.mobileiron.com.": {}, + "www.nationalreview.com.": {}, "www.nativecos.com.": {}, + "www.nba.com.": {}, "www.nzz.ch.": {}, + "www.officedepot.com.": {}, "www.overleaf.com.": {}, "www.pingler.com.": {}, + "www.pnc.com.": {}, "www.pool.ntp.org.": {}, - "www.printfriendly.com.": {}, "www.rawstory.com.": {}, + "www.regions.com.": {}, + "www.scholastic.com.": {}, + "www.sciencedirect.com.": {}, "www.searchanise.com.": {}, - "www.sephora.com.edgekey.net.": {}, "www.sevenrooms.com.": {}, - "www.shopdisney.com.": {}, - "www.snokido.com.": {}, - "www.soso.com.": {}, - "www.standard.co.uk.": {}, + "www.startribune.com.": {}, "www.startssl.com.": {}, - "www.tomodoko.com.": {}, - "www.uber-assets.com.": {}, - "www.usbank.com.": {}, "www.users.storage.live.com.": {}, - "www.usnews.com.": {}, "www.vipads.live.": {}, "www.virustotal.com.": {}, "www.wifispot.io.": {}, "www.wix.com.": {}, "www.worldtimeserver.com.": {}, - "www.yext-pixel.com.": {}, "www.zoom.us.": {}, "www1.remotepc.com.": {}, "www2.deepl.com.": {}, "www3.zoom.us.": {}, - "wwwtvcdn.com.": {}, - "wxliaotian.top.": {}, + "wx.huion.cn.": {}, "wxqcloud.qq.com.": {}, "wxqcloud.qq.com.cn.": {}, "wyze.com.": {}, "x-flow.app.": {}, + "x.netease.com.": {}, "x.research.qq.com.": {}, - "xapads.com.": {}, - "xbox-guide-public.rec.mp.microsoft.com.": {}, - "xfs-hd01.batcg.org.": {}, - "xfs-hd03.batcg.org.": {}, - "xfs-hd04.batcg.org.": {}, - "xfs-hd06.batcg.org.": {}, - "xfs-hd07.batcg.org.": {}, - "xfs-hd08.batcg.org.": {}, - "xfs-hd09.batcg.org.": {}, - "xfs-hd10.batcg.org.": {}, - "xfs-s100.batcg.org.": {}, - "xfs-s101.batcg.org.": {}, - "xfs-s102.batcg.org.": {}, - "xfs-s103.batcg.org.": {}, - "xfs-s104.batcg.org.": {}, - "xfs-s105.batcg.org.": {}, - "xfs-s106.batcg.org.": {}, - "xfs-s107.batcg.org.": {}, - "xfs-s108.batcg.org.": {}, - "xfs-s109.batcg.org.": {}, - "xfs-s110.batcg.org.": {}, - "xfs-s111.batcg.org.": {}, - "xfs-s112.batcg.org.": {}, - "xfs-s113.batcg.org.": {}, - "xfs-s114.batcg.org.": {}, - "xfs-s115.batcg.org.": {}, - "xfs-s116.batcg.org.": {}, - "xfs-s117.batcg.org.": {}, - "xfs-s118.batcg.org.": {}, - "xfs-s119.batcg.org.": {}, - "xfs-s120.batcg.org.": {}, - "xfs-s121.batcg.org.": {}, - "xfs-s122.batcg.org.": {}, - "xfs-s123.batcg.org.": {}, - "xfs-s124.batcg.org.": {}, - "xfs-s125.batcg.org.": {}, - "xfs-s126.batcg.org.": {}, - "xfs-s127.batcg.org.": {}, - "xfs-s128.batcg.org.": {}, - "xfs-s129.batcg.org.": {}, - "xfs-s130.batcg.org.": {}, - "xfs-uh00.batcg.org.": {}, + "xfs-s108.xfsbb.com.": {}, + "xfs-s118.xfsbb.com.": {}, + "xfs-s127.xfsbb.com.": {}, + "xhcdn.com.": {}, "xiaoyi-css-us-15d.oss-us-west-1.aliyuncs.com.": {}, "xiaoyi-css-us-7d.oss-us-west-1.aliyuncs.com.": {}, "xiaoyi.com.": {}, + "xintaicz.cn.": {}, "xjp-msgacs.m.taobao.com.": {}, - "xlivesex.com.": {}, "xmcsrv.net.": {}, "xml-eu-v4.ezmob.com.": {}, "xml-v4.ezmob.com.": {}, + "xml-v4.rtxfeed.com.": {}, "xml.acertb.com.": {}, - "xml.cow-timerbudder.org.": {}, + "xml.blue-biddingz.org.": {}, "xml.ezmob.com.": {}, - "xml.green-resultsbid.com.": {}, "xml.popmonetizer.net.": {}, - "xml.yellow-resultsbidder.com.": {}, + "xml.xmlking.com.": {}, "xml.zeusadx.com.": {}, - "xnet.da.mgtv.com.": {}, "xp002.itsupport247.net.": {}, "xp004.itsupport247.net.": {}, "xp005.itsupport247.net.": {}, @@ -8540,27 +8318,34 @@ var FakeECSFQDNs = map[string]struct{}{ "xp019.itsupport247.net.": {}, "xpdrwp.itsupport247.net.": {}, "xtom.com.": {}, - "yalla.live.": {}, "yealink.com.": {}, + "yeezy.com.": {}, "ymmobi.com.": {}, + "ynuf.aliapp.org.": {}, + "ynuf.aliapp.org.gds.alibabadns.com.": {}, "yomedia.vn.": {}, "yomeno.xyz.": {}, "youngjoygame.com.": {}, "yp.cdnstream1.com.": {}, + "ys7.com.": {}, "yunxindns.com.": {}, + "yunxinfw.com.": {}, "z-m-scontent-lis1-1.xx.fbcdn.net.": {}, - "z-m-scontent-ord5-2.xx.fbcdn.net.": {}, "z.cdn.adpool.bet.": {}, "z.cdn.ftd.agency.": {}, "z.cdn.trafficbass.com.": {}, "zego.im.": {}, "zemanta.com.": {}, + "zeotap.com.": {}, + "zhaohf.com.": {}, + "zigpoll.com.": {}, "zimgs.cn.": {}, + "ziply.mm.fcix.net.": {}, "zjcdn.com.yangyi19.com.": {}, "zmedia.vn.": {}, - "zohopublic.eu.": {}, "zoom.us.": {}, "ztoken.uyunad.com.": {}, "zui.com.": {}, "zurich.remotepc.com.": {}, + "zybooks.com.": {}, } diff --git a/internal/filter/internal/internal.go b/internal/filter/internal/internal.go index 1faddec..9549afe 100644 --- a/internal/filter/internal/internal.go +++ b/internal/filter/internal/internal.go @@ -1,7 +1,5 @@ // Package internal contains common constants, types, and utilities shared by // other subpackages of package filter/. -// -// TODO(a.garipov): Move more code to subpackages, see AGDNS-824. package internal import ( diff --git a/internal/geoip/asntops.go b/internal/geoip/asntops.go index ce956a6..59bd5e2 100644 --- a/internal/geoip/asntops.go +++ b/internal/geoip/asntops.go @@ -5,13 +5,13 @@ package geoip // DefaultTopASNs contains all specially handled ASNs. var DefaultTopASNs = map[ASN]struct{}{ 2: {}, - 3: {}, 174: {}, 209: {}, 224: {}, 577: {}, 701: {}, 719: {}, + 786: {}, 803: {}, 812: {}, 834: {}, @@ -26,14 +26,14 @@ var DefaultTopASNs = map[ASN]struct{}{ 1299: {}, 1403: {}, 1547: {}, - 1659: {}, 1680: {}, - 1741: {}, + 1756: {}, 1759: {}, - 1764: {}, 1835: {}, 1836: {}, 1901: {}, + 1955: {}, + 2018: {}, 2108: {}, 2110: {}, 2116: {}, @@ -49,22 +49,20 @@ var DefaultTopASNs = map[ASN]struct{}{ 2602: {}, 2607: {}, 2609: {}, - 2614: {}, + 2611: {}, 2740: {}, - 2764: {}, 2847: {}, 2852: {}, 2856: {}, 2860: {}, 3132: {}, - 3177: {}, 3178: {}, - 3194: {}, 3209: {}, 3212: {}, 3215: {}, 3216: {}, 3221: {}, + 3223: {}, 3225: {}, 3238: {}, 3243: {}, @@ -86,7 +84,6 @@ var DefaultTopASNs = map[ASN]struct{}{ 3549: {}, 3605: {}, 3695: {}, - 3737: {}, 3741: {}, 3758: {}, 3786: {}, @@ -94,9 +91,9 @@ var DefaultTopASNs = map[ASN]struct{}{ 3855: {}, 4007: {}, 4134: {}, - 4181: {}, 4230: {}, 4515: {}, + 4528: {}, 4538: {}, 4540: {}, 4609: {}, @@ -129,13 +126,16 @@ var DefaultTopASNs = map[ASN]struct{}{ 5384: {}, 5390: {}, 5391: {}, + 5408: {}, 5410: {}, 5413: {}, 5416: {}, 5432: {}, 5466: {}, 5483: {}, + 5504: {}, 5518: {}, + 5532: {}, 5578: {}, 5603: {}, 5607: {}, @@ -151,11 +151,11 @@ var DefaultTopASNs = map[ASN]struct{}{ 6128: {}, 6147: {}, 6167: {}, - 6181: {}, 6306: {}, 6327: {}, 6400: {}, 6407: {}, + 6461: {}, 6535: {}, 6568: {}, 6639: {}, @@ -169,7 +169,7 @@ var DefaultTopASNs = map[ASN]struct{}{ 6739: {}, 6752: {}, 6758: {}, - 6762: {}, + 6769: {}, 6772: {}, 6799: {}, 6805: {}, @@ -195,20 +195,18 @@ var DefaultTopASNs = map[ASN]struct{}{ 7438: {}, 7470: {}, 7482: {}, + 7497: {}, 7522: {}, 7524: {}, 7545: {}, 7552: {}, 7565: {}, - 7582: {}, - 7590: {}, 7642: {}, 7679: {}, 7713: {}, 7727: {}, 7738: {}, 7794: {}, - 7862: {}, 7922: {}, 7979: {}, 7992: {}, @@ -223,6 +221,7 @@ var DefaultTopASNs = map[ASN]struct{}{ 8251: {}, 8257: {}, 8273: {}, + 8290: {}, 8301: {}, 8339: {}, 8346: {}, @@ -241,22 +240,22 @@ var DefaultTopASNs = map[ASN]struct{}{ 8449: {}, 8452: {}, 8462: {}, + 8468: {}, 8473: {}, 8544: {}, 8551: {}, 8560: {}, - 8562: {}, 8585: {}, 8612: {}, 8632: {}, 8661: {}, - 8670: {}, 8680: {}, 8681: {}, 8697: {}, 8708: {}, 8717: {}, 8728: {}, + 8744: {}, 8758: {}, 8764: {}, 8767: {}, @@ -265,15 +264,16 @@ var DefaultTopASNs = map[ASN]struct{}{ 8781: {}, 8818: {}, 8821: {}, + 8829: {}, 8847: {}, 8849: {}, 8866: {}, 8881: {}, + 8887: {}, 8926: {}, 8948: {}, 8953: {}, 8966: {}, - 8978: {}, 8990: {}, 9002: {}, 9008: {}, @@ -285,7 +285,6 @@ var DefaultTopASNs = map[ASN]struct{}{ 9051: {}, 9063: {}, 9070: {}, - 9085: {}, 9105: {}, 9119: {}, 9121: {}, @@ -303,6 +302,7 @@ var DefaultTopASNs = map[ASN]struct{}{ 9260: {}, 9269: {}, 9299: {}, + 9303: {}, 9304: {}, 9316: {}, 9318: {}, @@ -314,6 +314,7 @@ var DefaultTopASNs = map[ASN]struct{}{ 9365: {}, 9381: {}, 9416: {}, + 9431: {}, 9443: {}, 9471: {}, 9484: {}, @@ -324,7 +325,6 @@ var DefaultTopASNs = map[ASN]struct{}{ 9595: {}, 9605: {}, 9617: {}, - 9622: {}, 9644: {}, 9674: {}, 9694: {}, @@ -340,8 +340,8 @@ var DefaultTopASNs = map[ASN]struct{}{ 9902: {}, 9908: {}, 9919: {}, + 9922: {}, 9924: {}, - 9929: {}, 9930: {}, 9931: {}, 9934: {}, @@ -354,10 +354,10 @@ var DefaultTopASNs = map[ASN]struct{}{ 10036: {}, 10066: {}, 10075: {}, - 10076: {}, 10094: {}, 10099: {}, 10101: {}, + 10103: {}, 10118: {}, 10131: {}, 10139: {}, @@ -370,9 +370,10 @@ var DefaultTopASNs = map[ASN]struct{}{ 10299: {}, 10396: {}, 10474: {}, - 10569: {}, + 10617: {}, 10620: {}, 10796: {}, + 11014: {}, 11081: {}, 11139: {}, 11172: {}, @@ -382,12 +383,12 @@ var DefaultTopASNs = map[ASN]struct{}{ 11290: {}, 11315: {}, 11351: {}, - 11404: {}, 11426: {}, 11427: {}, 11492: {}, 11556: {}, 11562: {}, + 11580: {}, 11594: {}, 11664: {}, 11721: {}, @@ -399,6 +400,7 @@ var DefaultTopASNs = map[ASN]struct{}{ 11888: {}, 12066: {}, 12083: {}, + 12127: {}, 12252: {}, 12271: {}, 12297: {}, @@ -407,16 +409,14 @@ var DefaultTopASNs = map[ASN]struct{}{ 12322: {}, 12334: {}, 12338: {}, - 12350: {}, 12353: {}, + 12361: {}, 12365: {}, 12389: {}, 12390: {}, 12392: {}, 12400: {}, - 12406: {}, 12414: {}, - 12426: {}, 12430: {}, 12436: {}, 12455: {}, @@ -427,11 +427,11 @@ var DefaultTopASNs = map[ASN]struct{}{ 12570: {}, 12576: {}, 12578: {}, + 12590: {}, 12605: {}, - 12620: {}, 12638: {}, - 12660: {}, 12668: {}, + 12684: {}, 12709: {}, 12714: {}, 12716: {}, @@ -454,7 +454,6 @@ var DefaultTopASNs = map[ASN]struct{}{ 12969: {}, 12975: {}, 12978: {}, - 12993: {}, 12997: {}, 13000: {}, 13030: {}, @@ -462,7 +461,7 @@ var DefaultTopASNs = map[ASN]struct{}{ 13037: {}, 13045: {}, 13046: {}, - 13070: {}, + 13092: {}, 13099: {}, 13101: {}, 13110: {}, @@ -489,6 +488,7 @@ var DefaultTopASNs = map[ASN]struct{}{ 14434: {}, 14522: {}, 14593: {}, + 14618: {}, 14638: {}, 14709: {}, 14754: {}, @@ -497,7 +497,6 @@ var DefaultTopASNs = map[ASN]struct{}{ 14979: {}, 14988: {}, 15146: {}, - 15321: {}, 15344: {}, 15366: {}, 15377: {}, @@ -509,7 +508,6 @@ var DefaultTopASNs = map[ASN]struct{}{ 15405: {}, 15433: {}, 15435: {}, - 15440: {}, 15457: {}, 15474: {}, 15480: {}, @@ -545,20 +543,19 @@ var DefaultTopASNs = map[ASN]struct{}{ 15958: {}, 15962: {}, 15964: {}, - 15975: {}, + 15965: {}, 15994: {}, - 16006: {}, 16010: {}, 16019: {}, 16028: {}, - 16030: {}, 16058: {}, 16086: {}, + 16095: {}, 16116: {}, 16117: {}, 16135: {}, 16178: {}, - 16190: {}, + 16185: {}, 16202: {}, 16223: {}, 16229: {}, @@ -572,6 +569,7 @@ var DefaultTopASNs = map[ASN]struct{}{ 16342: {}, 16345: {}, 16367: {}, + 16413: {}, 16437: {}, 16509: {}, 16591: {}, @@ -582,7 +580,6 @@ var DefaultTopASNs = map[ASN]struct{}{ 16735: {}, 16814: {}, 16906: {}, - 16929: {}, 16960: {}, 17072: {}, 17079: {}, @@ -598,19 +595,18 @@ var DefaultTopASNs = map[ASN]struct{}{ 17506: {}, 17511: {}, 17529: {}, + 17539: {}, 17547: {}, 17552: {}, 17557: {}, 17621: {}, 17622: {}, 17623: {}, - 17638: {}, 17639: {}, 17665: {}, 17670: {}, 17676: {}, 17698: {}, - 17705: {}, 17716: {}, 17726: {}, 17806: {}, @@ -618,10 +614,8 @@ var DefaultTopASNs = map[ASN]struct{}{ 17816: {}, 17828: {}, 17839: {}, - 17849: {}, 17853: {}, 17858: {}, - 17864: {}, 17882: {}, 17893: {}, 17924: {}, @@ -630,7 +624,6 @@ var DefaultTopASNs = map[ASN]struct{}{ 18001: {}, 18004: {}, 18013: {}, - 18015: {}, 18024: {}, 18049: {}, 18053: {}, @@ -642,11 +635,11 @@ var DefaultTopASNs = map[ASN]struct{}{ 18199: {}, 18200: {}, 18209: {}, + 18278: {}, 18371: {}, 18390: {}, 18399: {}, 18403: {}, - 18412: {}, 18419: {}, 18734: {}, 18747: {}, @@ -661,16 +654,15 @@ var DefaultTopASNs = map[ASN]struct{}{ 19180: {}, 19182: {}, 19246: {}, - 19318: {}, 19422: {}, 19429: {}, - 19437: {}, 19447: {}, 19624: {}, + 19626: {}, 19711: {}, 19863: {}, + 19889: {}, 20001: {}, - 20055: {}, 20057: {}, 20115: {}, 20207: {}, @@ -684,20 +676,19 @@ var DefaultTopASNs = map[ASN]struct{}{ 20634: {}, 20661: {}, 20676: {}, + 20719: {}, 20723: {}, - 20746: {}, 20771: {}, 20776: {}, 20804: {}, 20845: {}, 20846: {}, - 20874: {}, + 20860: {}, 20875: {}, 20880: {}, 20904: {}, 20910: {}, 20911: {}, - 20960: {}, 20963: {}, 20978: {}, 21001: {}, @@ -705,8 +696,6 @@ var DefaultTopASNs = map[ASN]struct{}{ 21021: {}, 21040: {}, 21050: {}, - 21069: {}, - 21100: {}, 21107: {}, 21183: {}, 21211: {}, @@ -744,6 +733,7 @@ var DefaultTopASNs = map[ASN]struct{}{ 22394: {}, 22423: {}, 22581: {}, + 22690: {}, 22724: {}, 22773: {}, 22869: {}, @@ -751,11 +741,11 @@ var DefaultTopASNs = map[ASN]struct{}{ 22927: {}, 22933: {}, 22995: {}, - 23031: {}, 23114: {}, 23201: {}, 23243: {}, 23383: {}, + 23470: {}, 23487: {}, 23520: {}, 23655: {}, @@ -777,17 +767,18 @@ var DefaultTopASNs = map[ASN]struct{}{ 23956: {}, 23959: {}, 23969: {}, + 24016: {}, 24033: {}, 24086: {}, 24157: {}, 24158: {}, 24163: {}, 24164: {}, + 24165: {}, 24186: {}, 24203: {}, 24309: {}, 24323: {}, - 24334: {}, 24337: {}, 24378: {}, 24389: {}, @@ -796,7 +787,6 @@ var DefaultTopASNs = map[ASN]struct{}{ 24439: {}, 24444: {}, 24445: {}, - 24482: {}, 24492: {}, 24499: {}, 24547: {}, @@ -805,36 +795,38 @@ var DefaultTopASNs = map[ASN]struct{}{ 24560: {}, 24589: {}, 24608: {}, - 24645: {}, + 24631: {}, + 24641: {}, 24651: {}, 24691: {}, 24722: {}, + 24743: {}, + 24751: {}, 24757: {}, - 24792: {}, 24800: {}, 24812: {}, 24822: {}, 24835: {}, + 24851: {}, 24852: {}, 24863: {}, 24875: {}, - 24877: {}, - 24889: {}, 24921: {}, 24940: {}, - 24953: {}, 24955: {}, + 24961: {}, + 25003: {}, 25019: {}, 25106: {}, 25117: {}, - 25124: {}, + 25129: {}, 25133: {}, 25135: {}, 25139: {}, 25144: {}, 25159: {}, + 25184: {}, 25190: {}, - 25198: {}, 25229: {}, 25248: {}, 25250: {}, @@ -848,11 +840,13 @@ var DefaultTopASNs = map[ASN]struct{}{ 25424: {}, 25429: {}, 25441: {}, + 25447: {}, 25454: {}, 25467: {}, 25471: {}, 25472: {}, 25491: {}, + 25496: {}, 25512: {}, 25513: {}, 25543: {}, @@ -860,6 +854,8 @@ var DefaultTopASNs = map[ASN]struct{}{ 25607: {}, 25620: {}, 25668: {}, + 25695: {}, + 25820: {}, 26130: {}, 26210: {}, 26383: {}, @@ -888,16 +884,17 @@ var DefaultTopASNs = map[ASN]struct{}{ 27742: {}, 27745: {}, 27747: {}, - 27751: {}, 27757: {}, 27759: {}, 27773: {}, 27775: {}, 27781: {}, 27789: {}, + 27796: {}, 27800: {}, 27813: {}, 27831: {}, + 27833: {}, 27837: {}, 27839: {}, 27843: {}, @@ -913,13 +910,12 @@ var DefaultTopASNs = map[ASN]struct{}{ 27923: {}, 27924: {}, 27927: {}, + 27928: {}, 27932: {}, 27947: {}, 27951: {}, - 27953: {}, 27983: {}, 27984: {}, - 27988: {}, 27995: {}, 28005: {}, 28006: {}, @@ -932,24 +928,24 @@ var DefaultTopASNs = map[ASN]struct{}{ 28048: {}, 28075: {}, 28080: {}, - 28088: {}, 28094: {}, + 28103: {}, 28104: {}, - 28110: {}, 28118: {}, 28126: {}, 28146: {}, + 28171: {}, 28182: {}, 28186: {}, 28198: {}, 28201: {}, - 28202: {}, 28210: {}, 28220: {}, 28258: {}, 28343: {}, 28398: {}, 28403: {}, + 28432: {}, 28458: {}, 28469: {}, 28481: {}, @@ -970,7 +966,9 @@ var DefaultTopASNs = map[ASN]struct{}{ 28580: {}, 28598: {}, 28649: {}, + 28656: {}, 28668: {}, + 28669: {}, 28683: {}, 28685: {}, 28698: {}, @@ -981,18 +979,18 @@ var DefaultTopASNs = map[ASN]struct{}{ 28787: {}, 28812: {}, 28840: {}, - 28849: {}, - 28851: {}, 28854: {}, + 28858: {}, 28884: {}, 28885: {}, 28909: {}, - 28919: {}, 28952: {}, 28964: {}, 28972: {}, 29027: {}, 29030: {}, + 29031: {}, + 29039: {}, 29049: {}, 29061: {}, 29070: {}, @@ -1001,6 +999,7 @@ var DefaultTopASNs = map[ASN]struct{}{ 29119: {}, 29124: {}, 29170: {}, + 29194: {}, 29208: {}, 29238: {}, 29244: {}, @@ -1011,19 +1010,18 @@ var DefaultTopASNs = map[ASN]struct{}{ 29314: {}, 29355: {}, 29357: {}, - 29384: {}, 29405: {}, 29447: {}, 29465: {}, 29485: {}, + 29492: {}, 29497: {}, 29518: {}, 29544: {}, 29555: {}, 29571: {}, 29580: {}, - 29582: {}, - 29584: {}, + 29600: {}, 29614: {}, 29667: {}, 29687: {}, @@ -1031,21 +1029,21 @@ var DefaultTopASNs = map[ASN]struct{}{ 29975: {}, 30036: {}, 30058: {}, - 30272: {}, 30526: {}, 30600: {}, 30619: {}, 30689: {}, 30722: {}, 30764: {}, - 30838: {}, 30844: {}, + 30860: {}, 30873: {}, + 30896: {}, + 30929: {}, 30969: {}, 30982: {}, 30985: {}, 30986: {}, - 30987: {}, 30990: {}, 30992: {}, 30999: {}, @@ -1053,7 +1051,6 @@ var DefaultTopASNs = map[ASN]struct{}{ 31027: {}, 31037: {}, 31042: {}, - 31115: {}, 31117: {}, 31122: {}, 31126: {}, @@ -1071,7 +1068,6 @@ var DefaultTopASNs = map[ASN]struct{}{ 31224: {}, 31242: {}, 31246: {}, - 31250: {}, 31252: {}, 31272: {}, 31287: {}, @@ -1083,14 +1079,15 @@ var DefaultTopASNs = map[ASN]struct{}{ 31510: {}, 31543: {}, 31549: {}, + 31608: {}, 31615: {}, 31642: {}, 31655: {}, + 31689: {}, 31721: {}, 31725: {}, - 31736: {}, - 31856: {}, 31898: {}, + 31960: {}, 32020: {}, 32098: {}, 32398: {}, @@ -1108,26 +1105,29 @@ var DefaultTopASNs = map[ASN]struct{}{ 33788: {}, 33796: {}, 33874: {}, + 33883: {}, 33885: {}, 33915: {}, 33922: {}, - 33943: {}, 33983: {}, 34001: {}, 34058: {}, 34087: {}, + 34113: {}, 34120: {}, 34170: {}, 34187: {}, 34224: {}, 34244: {}, + 34245: {}, 34263: {}, 34295: {}, 34296: {}, + 34347: {}, 34362: {}, - 34410: {}, 34447: {}, 34471: {}, + 34515: {}, 34525: {}, 34533: {}, 34547: {}, @@ -1135,7 +1135,9 @@ var DefaultTopASNs = map[ASN]struct{}{ 34569: {}, 34577: {}, 34594: {}, + 34636: {}, 34661: {}, + 34666: {}, 34700: {}, 34702: {}, 34705: {}, @@ -1148,15 +1150,17 @@ var DefaultTopASNs = map[ASN]struct{}{ 34781: {}, 34797: {}, 34803: {}, + 34814: {}, 34857: {}, 34876: {}, 34916: {}, - 34917: {}, 34918: {}, 34977: {}, 34984: {}, + 34989: {}, 35046: {}, 35047: {}, + 35063: {}, 35091: {}, 35104: {}, 35132: {}, @@ -1170,7 +1174,6 @@ var DefaultTopASNs = map[ASN]struct{}{ 35244: {}, 35297: {}, 35311: {}, - 35313: {}, 35320: {}, 35328: {}, 35346: {}, @@ -1182,19 +1185,20 @@ var DefaultTopASNs = map[ASN]struct{}{ 35457: {}, 35467: {}, 35518: {}, + 35546: {}, 35549: {}, 35566: {}, 35567: {}, 35568: {}, 35612: {}, 35613: {}, - 35656: {}, 35699: {}, 35706: {}, 35725: {}, 35729: {}, 35732: {}, 35753: {}, + 35765: {}, 35790: {}, 35805: {}, 35807: {}, @@ -1202,27 +1206,32 @@ var DefaultTopASNs = map[ASN]struct{}{ 35892: {}, 35900: {}, 35911: {}, + 35913: {}, + 35916: {}, 36040: {}, 36290: {}, 36352: {}, + 36445: {}, 36492: {}, 36511: {}, 36549: {}, + 36599: {}, 36864: {}, 36865: {}, 36866: {}, 36873: {}, 36874: {}, - 36877: {}, 36884: {}, 36890: {}, 36892: {}, 36902: {}, 36903: {}, + 36905: {}, 36907: {}, 36908: {}, 36909: {}, 36912: {}, + 36913: {}, 36914: {}, 36920: {}, 36923: {}, @@ -1234,20 +1243,20 @@ var DefaultTopASNs = map[ASN]struct{}{ 36937: {}, 36939: {}, 36947: {}, - 36955: {}, 36958: {}, 36962: {}, 36963: {}, - 36972: {}, + 36969: {}, 36974: {}, 36977: {}, + 36986: {}, 36988: {}, 36992: {}, 36994: {}, 36996: {}, - 36998: {}, 36999: {}, 37002: {}, + 37004: {}, 37006: {}, 37009: {}, 37014: {}, @@ -1283,11 +1292,13 @@ var DefaultTopASNs = map[ASN]struct{}{ 37133: {}, 37136: {}, 37141: {}, + 37143: {}, 37148: {}, 37154: {}, 37164: {}, 37168: {}, 37173: {}, + 37182: {}, 37183: {}, 37184: {}, 37187: {}, @@ -1298,6 +1309,7 @@ var DefaultTopASNs = map[ASN]struct{}{ 37204: {}, 37205: {}, 37208: {}, + 37215: {}, 37223: {}, 37228: {}, 37229: {}, @@ -1313,33 +1325,33 @@ var DefaultTopASNs = map[ASN]struct{}{ 37313: {}, 37315: {}, 37323: {}, + 37326: {}, 37334: {}, 37336: {}, 37337: {}, 37340: {}, 37342: {}, 37343: {}, - 37347: {}, 37349: {}, - 37350: {}, 37358: {}, 37371: {}, - 37376: {}, 37385: {}, + 37395: {}, 37406: {}, 37410: {}, - 37414: {}, 37424: {}, 37425: {}, - 37429: {}, + 37427: {}, + 37430: {}, 37440: {}, 37447: {}, + 37449: {}, 37451: {}, 37453: {}, 37457: {}, 37460: {}, 37461: {}, - 37468: {}, + 37463: {}, 37473: {}, 37487: {}, 37492: {}, @@ -1352,30 +1364,28 @@ var DefaultTopASNs = map[ASN]struct{}{ 37531: {}, 37532: {}, 37541: {}, - 37542: {}, - 37545: {}, 37550: {}, 37552: {}, - 37558: {}, 37559: {}, 37563: {}, - 37566: {}, 37575: {}, 37577: {}, - 37580: {}, 37584: {}, - 37586: {}, 37594: {}, + 37604: {}, 37611: {}, 37612: {}, 37614: {}, 37616: {}, 37621: {}, 37622: {}, + 37637: {}, + 37638: {}, 37642: {}, 37645: {}, 37649: {}, 37654: {}, + 37662: {}, 37665: {}, 37671: {}, 37678: {}, @@ -1384,18 +1394,22 @@ var DefaultTopASNs = map[ASN]struct{}{ 37693: {}, 37697: {}, 37705: {}, + 37713: {}, 37721: {}, 37963: {}, 38008: {}, 38009: {}, + 38019: {}, 38067: {}, 38077: {}, 38136: {}, 38186: {}, + 38193: {}, 38195: {}, 38198: {}, 38201: {}, 38203: {}, + 38209: {}, 38227: {}, 38235: {}, 38247: {}, @@ -1405,14 +1419,14 @@ var DefaultTopASNs = map[ASN]struct{}{ 38442: {}, 38466: {}, 38511: {}, + 38527: {}, 38553: {}, 38565: {}, - 38584: {}, 38600: {}, 38623: {}, + 38710: {}, 38742: {}, 38800: {}, - 38805: {}, 38819: {}, 38841: {}, 38875: {}, @@ -1422,32 +1436,34 @@ var DefaultTopASNs = map[ASN]struct{}{ 38999: {}, 39007: {}, 39010: {}, + 39013: {}, 39032: {}, 39067: {}, - 39093: {}, + 39120: {}, + 39122: {}, 39184: {}, 39216: {}, 39232: {}, 39251: {}, 39273: {}, - 39279: {}, 39280: {}, 39344: {}, + 39351: {}, 39354: {}, 39375: {}, 39386: {}, 39397: {}, - 39401: {}, 39402: {}, - 39440: {}, + 39455: {}, 39501: {}, 39507: {}, - 39572: {}, + 39544: {}, 39574: {}, 39603: {}, 39608: {}, 39611: {}, 39642: {}, + 39647: {}, 39650: {}, 39699: {}, 39737: {}, @@ -1455,32 +1471,33 @@ var DefaultTopASNs = map[ASN]struct{}{ 39798: {}, 39823: {}, 39824: {}, - 39878: {}, + 39826: {}, 39891: {}, - 39912: {}, 40029: {}, + 40065: {}, 40788: {}, 40945: {}, 40980: {}, + 41011: {}, 41032: {}, 41046: {}, - 41068: {}, - 41088: {}, + 41096: {}, 41124: {}, 41164: {}, 41202: {}, + 41228: {}, 41230: {}, + 41273: {}, 41275: {}, 41313: {}, 41329: {}, 41330: {}, - 41354: {}, 41371: {}, 41378: {}, 41435: {}, - 41436: {}, 41454: {}, 41496: {}, + 41549: {}, 41557: {}, 41563: {}, 41564: {}, @@ -1490,7 +1507,6 @@ var DefaultTopASNs = map[ASN]struct{}{ 41704: {}, 41733: {}, 41738: {}, - 41745: {}, 41750: {}, 41798: {}, 41820: {}, @@ -1500,6 +1516,7 @@ var DefaultTopASNs = map[ASN]struct{}{ 41897: {}, 41937: {}, 41956: {}, + 41966: {}, 41997: {}, 41998: {}, 42003: {}, @@ -1514,8 +1531,8 @@ var DefaultTopASNs = map[ASN]struct{}{ 42313: {}, 42334: {}, 42337: {}, - 42343: {}, 42437: {}, + 42455: {}, 42525: {}, 42532: {}, 42541: {}, @@ -1537,47 +1554,48 @@ var DefaultTopASNs = map[ASN]struct{}{ 42828: {}, 42837: {}, 42841: {}, - 42844: {}, 42863: {}, 42864: {}, 42908: {}, 42912: {}, 42925: {}, + 42947: {}, + 42956: {}, + 42960: {}, 42961: {}, 42991: {}, 43019: {}, - 43028: {}, 43060: {}, + 43094: {}, 43139: {}, 43197: {}, 43205: {}, 43242: {}, 43248: {}, - 43256: {}, - 43289: {}, + 43341: {}, 43350: {}, 43447: {}, 43451: {}, 43452: {}, + 43456: {}, 43513: {}, 43529: {}, 43533: {}, 43557: {}, + 43568: {}, 43612: {}, 43627: {}, - 43633: {}, 43653: {}, - 43656: {}, 43700: {}, 43708: {}, 43733: {}, 43754: {}, 43766: {}, - 43791: {}, - 43811: {}, 43824: {}, 43870: {}, 43883: {}, + 43892: {}, + 43905: {}, 43925: {}, 43939: {}, 43940: {}, @@ -1588,17 +1606,18 @@ var DefaultTopASNs = map[ASN]struct{}{ 44087: {}, 44134: {}, 44143: {}, + 44208: {}, + 44213: {}, 44217: {}, - 44234: {}, 44244: {}, 44247: {}, 44272: {}, - 44313: {}, + 44285: {}, 44327: {}, 44377: {}, - 44384: {}, 44391: {}, 44395: {}, + 44436: {}, 44477: {}, 44483: {}, 44489: {}, @@ -1610,7 +1629,6 @@ var DefaultTopASNs = map[ASN]struct{}{ 44725: {}, 44735: {}, 44869: {}, - 44894: {}, 44901: {}, 44925: {}, 45007: {}, @@ -1620,15 +1638,13 @@ var DefaultTopASNs = map[ASN]struct{}{ 45177: {}, 45178: {}, 45193: {}, - 45224: {}, + 45230: {}, 45245: {}, - 45267: {}, 45271: {}, 45305: {}, 45345: {}, 45355: {}, 45356: {}, - 45361: {}, 45410: {}, 45430: {}, 45458: {}, @@ -1639,6 +1655,7 @@ var DefaultTopASNs = map[ASN]struct{}{ 45588: {}, 45609: {}, 45629: {}, + 45637: {}, 45650: {}, 45669: {}, 45727: {}, @@ -1658,13 +1675,16 @@ var DefaultTopASNs = map[ASN]struct{}{ 45960: {}, 46198: {}, 46408: {}, + 46562: {}, + 46573: {}, 46650: {}, 46868: {}, - 46941: {}, + 47116: {}, 47132: {}, 47139: {}, 47159: {}, 47169: {}, + 47217: {}, 47232: {}, 47237: {}, 47253: {}, @@ -1672,62 +1692,68 @@ var DefaultTopASNs = map[ASN]struct{}{ 47331: {}, 47377: {}, 47394: {}, + 47402: {}, 47485: {}, + 47499: {}, 47524: {}, + 47583: {}, 47588: {}, 47589: {}, - 47719: {}, 47782: {}, 47790: {}, + 47798: {}, + 47881: {}, 47883: {}, 47887: {}, 47898: {}, 47956: {}, + 47959: {}, 47962: {}, 48092: {}, - 48101: {}, - 48147: {}, 48161: {}, 48190: {}, 48206: {}, - 48239: {}, 48252: {}, 48288: {}, + 48359: {}, 48431: {}, 48437: {}, - 48480: {}, 48492: {}, 48503: {}, 48506: {}, + 48551: {}, 48629: {}, 48675: {}, + 48685: {}, 48695: {}, - 48715: {}, 48728: {}, - 48803: {}, 48830: {}, 48832: {}, 48847: {}, 48887: {}, 48917: {}, 48926: {}, - 48945: {}, + 48953: {}, 48966: {}, + 49040: {}, 49044: {}, 49056: {}, - 49091: {}, 49100: {}, 49101: {}, + 49103: {}, 49115: {}, 49117: {}, 49129: {}, 49183: {}, + 49221: {}, 49223: {}, 49242: {}, 49273: {}, - 49472: {}, + 49282: {}, + 49392: {}, 49528: {}, 49561: {}, + 49567: {}, 49628: {}, 49724: {}, 49770: {}, @@ -1735,7 +1761,6 @@ var DefaultTopASNs = map[ASN]struct{}{ 49800: {}, 49808: {}, 49826: {}, - 49870: {}, 49889: {}, 49902: {}, 49914: {}, @@ -1743,64 +1768,69 @@ var DefaultTopASNs = map[ASN]struct{}{ 49985: {}, 50010: {}, 50025: {}, + 50084: {}, 50181: {}, + 50186: {}, 50223: {}, 50231: {}, + 50242: {}, 50251: {}, 50266: {}, 50274: {}, - 50294: {}, 50304: {}, - 50360: {}, + 50316: {}, + 50334: {}, + 50349: {}, 50411: {}, 50463: {}, 50467: {}, 50500: {}, 50581: {}, + 50593: {}, 50597: {}, - 50606: {}, 50613: {}, 50616: {}, + 50627: {}, 50635: {}, 50648: {}, 50670: {}, 50673: {}, 50685: {}, - 50698: {}, 50710: {}, + 50718: {}, 50749: {}, 50767: {}, 50810: {}, 50821: {}, 50825: {}, - 50923: {}, 50925: {}, + 50953: {}, 50959: {}, + 50962: {}, 50973: {}, 50979: {}, 51018: {}, - 51069: {}, + 51056: {}, + 51074: {}, 51110: {}, 51167: {}, 51175: {}, 51184: {}, 51207: {}, 51265: {}, + 51319: {}, 51336: {}, - 51341: {}, 51342: {}, 51346: {}, - 51371: {}, 51375: {}, 51395: {}, - 51399: {}, 51407: {}, 51430: {}, - 51469: {}, 51495: {}, 51504: {}, 51582: {}, 51604: {}, + 51615: {}, 51653: {}, 51684: {}, 51765: {}, @@ -1811,10 +1841,8 @@ var DefaultTopASNs = map[ASN]struct{}{ 51896: {}, 52075: {}, 52145: {}, - 52173: {}, 52195: {}, 52228: {}, - 52232: {}, 52233: {}, 52238: {}, 52242: {}, @@ -1823,17 +1851,20 @@ var DefaultTopASNs = map[ASN]struct{}{ 52260: {}, 52262: {}, 52263: {}, + 52286: {}, 52312: {}, + 52322: {}, 52323: {}, 52341: {}, 52361: {}, 52362: {}, 52363: {}, 52373: {}, + 52381: {}, 52398: {}, 52405: {}, + 52409: {}, 52412: {}, - 52423: {}, 52433: {}, 52436: {}, 52444: {}, @@ -1845,12 +1876,13 @@ var DefaultTopASNs = map[ASN]struct{}{ 52783: {}, 52974: {}, 53006: {}, - 53363: {}, 53667: {}, 53764: {}, 53913: {}, 54198: {}, + 54252: {}, 54614: {}, + 54825: {}, 54994: {}, 55330: {}, 55391: {}, @@ -1858,6 +1890,7 @@ var DefaultTopASNs = map[ASN]struct{}{ 55424: {}, 55427: {}, 55430: {}, + 55501: {}, 55577: {}, 55685: {}, 55699: {}, @@ -1899,16 +1932,14 @@ var DefaultTopASNs = map[ASN]struct{}{ 56491: {}, 56497: {}, 56568: {}, - 56630: {}, - 56642: {}, 56653: {}, 56655: {}, - 56656: {}, 56665: {}, 56696: {}, + 56704: {}, 56747: {}, - 56803: {}, 56902: {}, + 57013: {}, 57016: {}, 57043: {}, 57070: {}, @@ -1916,6 +1947,7 @@ var DefaultTopASNs = map[ASN]struct{}{ 57133: {}, 57134: {}, 57218: {}, + 57223: {}, 57248: {}, 57256: {}, 57269: {}, @@ -1925,37 +1957,32 @@ var DefaultTopASNs = map[ASN]struct{}{ 57374: {}, 57388: {}, 57389: {}, - 57443: {}, + 57491: {}, 57513: {}, 57564: {}, 57566: {}, 57588: {}, - 57606: {}, + 57608: {}, 57630: {}, + 57722: {}, 57728: {}, - 57743: {}, 57760: {}, + 57761: {}, 57764: {}, - 57776: {}, - 57778: {}, 57794: {}, - 57826: {}, 57852: {}, - 57858: {}, 57869: {}, 57888: {}, 58056: {}, 58061: {}, 58065: {}, 58098: {}, - 58118: {}, + 58130: {}, 58224: {}, - 58243: {}, + 58254: {}, 58264: {}, - 58321: {}, 58322: {}, 58328: {}, - 58424: {}, 58453: {}, 58460: {}, 58461: {}, @@ -1971,16 +1998,20 @@ var DefaultTopASNs = map[ASN]struct{}{ 58717: {}, 58731: {}, 58821: {}, + 58893: {}, 58895: {}, 58945: {}, 58952: {}, - 59108: {}, + 59078: {}, 59125: {}, 59126: {}, 59127: {}, 59253: {}, 59257: {}, 59362: {}, + 59371: {}, + 59381: {}, + 59443: {}, 59497: {}, 59588: {}, 59625: {}, @@ -1990,71 +2021,56 @@ var DefaultTopASNs = map[ASN]struct{}{ 59847: {}, 59861: {}, 59890: {}, - 59912: {}, 59931: {}, 59989: {}, + 60016: {}, 60068: {}, - 60111: {}, 60258: {}, 60294: {}, - 60304: {}, 60352: {}, 60367: {}, 60372: {}, 60377: {}, 60398: {}, 60471: {}, - 60485: {}, 60517: {}, 60636: {}, 60725: {}, - 60754: {}, 60757: {}, 60781: {}, 60806: {}, - 60876: {}, - 60966: {}, + 60895: {}, 60999: {}, 61010: {}, 61071: {}, 61135: {}, 61143: {}, - 61174: {}, + 61154: {}, 61189: {}, - 61208: {}, - 61211: {}, 61272: {}, 61275: {}, + 61287: {}, 61307: {}, 61317: {}, - 61345: {}, - 61367: {}, - 61390: {}, - 61449: {}, 61461: {}, 61466: {}, 61478: {}, - 61490: {}, 61512: {}, - 61588: {}, + 61996: {}, 62005: {}, 62013: {}, - 62023: {}, - 62059: {}, 62099: {}, - 62129: {}, 62161: {}, 62179: {}, 62183: {}, 62211: {}, + 62212: {}, 62240: {}, - 62281: {}, - 62282: {}, - 62336: {}, + 62250: {}, + 62337: {}, 62563: {}, 63023: {}, 63199: {}, - 63473: {}, 63526: {}, 63852: {}, 63859: {}, @@ -2063,34 +2079,31 @@ var DefaultTopASNs = map[ASN]struct{}{ 63969: {}, 63991: {}, 63996: {}, - 63998: {}, + 64022: {}, 64043: {}, 64073: {}, 64098: {}, 64105: {}, + 64126: {}, 64134: {}, - 64139: {}, 64270: {}, 64286: {}, - 64300: {}, 64443: {}, 64466: {}, 131090: {}, 131111: {}, - 131149: {}, 131178: {}, 131207: {}, 131267: {}, 131284: {}, - 131322: {}, 131429: {}, 131445: {}, 131464: {}, 131471: {}, - 131584: {}, 131591: {}, 131596: {}, 131627: {}, + 131706: {}, 131769: {}, 132045: {}, 132061: {}, @@ -2101,10 +2114,11 @@ var DefaultTopASNs = map[ASN]struct{}{ 132173: {}, 132199: {}, 132203: {}, - 132255: {}, + 132222: {}, 132298: {}, 132429: {}, 132447: {}, + 132449: {}, 132462: {}, 132468: {}, 132471: {}, @@ -2112,31 +2126,27 @@ var DefaultTopASNs = map[ASN]struct{}{ 132525: {}, 132618: {}, 132686: {}, - 132825: {}, 132831: {}, + 132857: {}, 133012: {}, 133076: {}, - 133137: {}, - 133159: {}, 133206: {}, 133287: {}, 133334: {}, 133384: {}, 133385: {}, - 133440: {}, - 133480: {}, 133481: {}, 133524: {}, + 133533: {}, 133579: {}, 133606: {}, 133612: {}, - 133613: {}, 133623: {}, 133661: {}, + 133748: {}, 133752: {}, 133875: {}, 133894: {}, - 133957: {}, 133982: {}, 134090: {}, 134113: {}, @@ -2144,13 +2154,12 @@ var DefaultTopASNs = map[ASN]struct{}{ 134204: {}, 134356: {}, 134467: {}, - 134550: {}, + 134489: {}, 134562: {}, 134651: {}, 134674: {}, 134697: {}, 134707: {}, - 134711: {}, 134714: {}, 134715: {}, 134732: {}, @@ -2163,14 +2172,12 @@ var DefaultTopASNs = map[ASN]struct{}{ 134972: {}, 134995: {}, 135043: {}, - 135059: {}, 135069: {}, 135126: {}, 135298: {}, 135300: {}, + 135327: {}, 135341: {}, - 135345: {}, - 135371: {}, 135375: {}, 135376: {}, 135377: {}, @@ -2187,6 +2194,7 @@ var DefaultTopASNs = map[ASN]struct{}{ 136039: {}, 136093: {}, 136119: {}, + 136141: {}, 136167: {}, 136210: {}, 136224: {}, @@ -2198,13 +2206,13 @@ var DefaultTopASNs = map[ASN]struct{}{ 136400: {}, 136442: {}, 136454: {}, + 136477: {}, 136479: {}, 136480: {}, 136515: {}, 136525: {}, 136538: {}, 136557: {}, - 136780: {}, 136787: {}, 136873: {}, 136897: {}, @@ -2215,6 +2223,7 @@ var DefaultTopASNs = map[ASN]struct{}{ 137047: {}, 137080: {}, 137226: {}, + 137236: {}, 137409: {}, 137412: {}, 137424: {}, @@ -2222,37 +2231,31 @@ var DefaultTopASNs = map[ASN]struct{}{ 137453: {}, 137477: {}, 137526: {}, - 137549: {}, 137561: {}, + 137811: {}, 137824: {}, + 137853: {}, 137872: {}, - 137880: {}, + 137891: {}, 137895: {}, 137959: {}, 137967: {}, - 137982: {}, 137989: {}, + 138064: {}, 138089: {}, - 138167: {}, - 138168: {}, 138179: {}, 138197: {}, - 138322: {}, - 138346: {}, 138368: {}, 138384: {}, 138423: {}, - 138500: {}, 138529: {}, 138590: {}, + 138606: {}, + 138634: {}, 138655: {}, 138754: {}, 138886: {}, - 138902: {}, - 138915: {}, - 138934: {}, 138997: {}, - 139003: {}, 139009: {}, 139029: {}, 139043: {}, @@ -2262,7 +2265,6 @@ var DefaultTopASNs = map[ASN]struct{}{ 139580: {}, 139609: {}, 139628: {}, - 139651: {}, 139741: {}, 139759: {}, 139831: {}, @@ -2270,24 +2272,24 @@ var DefaultTopASNs = map[ASN]struct{}{ 139879: {}, 139898: {}, 139922: {}, - 139952: {}, + 139967: {}, + 139981: {}, 139994: {}, 140045: {}, 140061: {}, 140072: {}, - 140096: {}, 140100: {}, + 140210: {}, 140220: {}, + 140265: {}, 140292: {}, + 140330: {}, 140401: {}, - 140443: {}, 140499: {}, 140504: {}, - 140594: {}, - 140608: {}, - 140635: {}, - 140686: {}, + 140726: {}, 140900: {}, + 140989: {}, 141015: {}, 141024: {}, 141031: {}, @@ -2295,143 +2297,148 @@ var DefaultTopASNs = map[ASN]struct{}{ 141145: {}, 141212: {}, 141216: {}, - 141361: {}, + 141224: {}, + 141226: {}, 141421: {}, 141607: {}, 141680: {}, 141681: {}, 141711: {}, 141767: {}, - 141778: {}, 141995: {}, + 142032: {}, 142065: {}, 142120: {}, - 142295: {}, - 142300: {}, 142352: {}, - 142403: {}, 142552: {}, - 142647: {}, 147049: {}, 147184: {}, 149024: {}, 149034: {}, - 149521: {}, - 149645: {}, + 149360: {}, 149660: {}, + 149707: {}, 149768: {}, 149771: {}, 149866: {}, 150131: {}, 150153: {}, - 150359: {}, + 150155: {}, + 150371: {}, 150683: {}, 150692: {}, 150750: {}, + 150774: {}, 151080: {}, 151396: {}, + 196640: {}, 196735: {}, 196838: {}, 196874: {}, 196925: {}, 196961: {}, + 197071: {}, 197077: {}, + 197119: {}, 197207: {}, - 197212: {}, 197225: {}, + 197248: {}, 197296: {}, 197301: {}, 197350: {}, 197398: {}, 197423: {}, - 197470: {}, - 197540: {}, 197556: {}, 197623: {}, - 197637: {}, - 197648: {}, + 197663: {}, 197674: {}, 197704: {}, 197706: {}, 197830: {}, + 197862: {}, 197882: {}, 197897: {}, 198068: {}, 198252: {}, + 198259: {}, 198265: {}, 198279: {}, 198288: {}, 198440: {}, 198441: {}, + 198471: {}, 198589: {}, 198605: {}, + 198632: {}, + 198651: {}, 198668: {}, 198735: {}, + 198785: {}, 198820: {}, 198961: {}, 198966: {}, - 199061: {}, 199128: {}, 199140: {}, 199274: {}, 199276: {}, 199284: {}, - 199468: {}, + 199346: {}, 199469: {}, + 199490: {}, 199493: {}, 199524: {}, 199620: {}, + 199636: {}, 199698: {}, 199731: {}, 199739: {}, 199995: {}, - 200019: {}, 200088: {}, 200134: {}, 200154: {}, 200313: {}, + 200436: {}, 200446: {}, - 200565: {}, 200590: {}, - 200612: {}, 200640: {}, 200651: {}, 200665: {}, 200697: {}, - 200698: {}, 200724: {}, 200736: {}, 200740: {}, 200742: {}, - 200796: {}, 200845: {}, 200865: {}, 201019: {}, + 201073: {}, 201150: {}, 201167: {}, + 201187: {}, 201241: {}, 201249: {}, + 201290: {}, 201411: {}, + 201476: {}, + 201502: {}, 201505: {}, 201603: {}, 201749: {}, 201767: {}, 201776: {}, - 201814: {}, - 201817: {}, 201838: {}, 201884: {}, 201890: {}, - 201898: {}, 201986: {}, 201997: {}, - 202050: {}, + 202085: {}, 202087: {}, 202098: {}, 202103: {}, 202204: {}, 202254: {}, 202293: {}, + 202354: {}, 202422: {}, 202433: {}, 202441: {}, @@ -2440,15 +2447,15 @@ var DefaultTopASNs = map[ASN]struct{}{ 202498: {}, 202561: {}, 202613: {}, - 202618: {}, 202632: {}, - 202635: {}, 202662: {}, + 202672: {}, 202699: {}, 202870: {}, + 202914: {}, 202921: {}, + 202931: {}, 202940: {}, - 202943: {}, 202987: {}, 203020: {}, 203136: {}, @@ -2460,12 +2467,11 @@ var DefaultTopASNs = map[ASN]struct{}{ 203448: {}, 203451: {}, 203459: {}, + 203561: {}, 203622: {}, - 203653: {}, 203675: {}, 203680: {}, 203735: {}, - 203744: {}, 203811: {}, 203877: {}, 203912: {}, @@ -2473,66 +2479,72 @@ var DefaultTopASNs = map[ASN]struct{}{ 203964: {}, 203971: {}, 203995: {}, + 203999: {}, 204106: {}, 204108: {}, - 204141: {}, 204151: {}, 204165: {}, 204170: {}, 204171: {}, - 204209: {}, - 204249: {}, + 204267: {}, 204274: {}, 204279: {}, - 204317: {}, 204342: {}, 204356: {}, + 204390: {}, 204393: {}, 204403: {}, - 204457: {}, - 204548: {}, - 204565: {}, + 204429: {}, + 204467: {}, + 204566: {}, 204595: {}, - 204601: {}, 204649: {}, - 204716: {}, + 204731: {}, + 204802: {}, 204804: {}, - 204814: {}, + 204873: {}, + 204894: {}, 204902: {}, + 204918: {}, 204957: {}, - 204997: {}, 205015: {}, - 205090: {}, 205110: {}, 205119: {}, 205168: {}, 205244: {}, 205254: {}, - 205277: {}, 205278: {}, + 205285: {}, 205293: {}, 205362: {}, 205367: {}, 205368: {}, + 205371: {}, + 205400: {}, 205473: {}, - 205521: {}, 205547: {}, + 205619: {}, 205638: {}, 205647: {}, 205714: {}, + 205832: {}, 205889: {}, + 205984: {}, 206026: {}, 206065: {}, 206067: {}, - 206092: {}, 206119: {}, + 206194: {}, 206206: {}, 206238: {}, 206262: {}, + 206283: {}, + 206358: {}, 206375: {}, 206406: {}, + 206446: {}, 206471: {}, - 206519: {}, + 206485: {}, 206557: {}, 206610: {}, 206611: {}, @@ -2540,97 +2552,98 @@ var DefaultTopASNs = map[ASN]struct{}{ 206666: {}, 206774: {}, 206783: {}, - 206912: {}, 206920: {}, + 206977: {}, 207044: {}, 207081: {}, 207097: {}, 207137: {}, 207154: {}, 207164: {}, + 207187: {}, 207192: {}, + 207251: {}, + 207348: {}, 207355: {}, 207369: {}, 207375: {}, - 207459: {}, - 207464: {}, - 207502: {}, + 207493: {}, + 207541: {}, 207569: {}, 207589: {}, 207651: {}, 207713: {}, 207728: {}, - 207766: {}, + 207782: {}, + 207786: {}, 207790: {}, 207810: {}, 207876: {}, 207980: {}, + 207990: {}, 207991: {}, - 208149: {}, 208286: {}, - 208306: {}, 208320: {}, 208339: {}, - 208448: {}, + 208365: {}, 208555: {}, - 208570: {}, 208592: {}, - 208668: {}, + 208645: {}, 208670: {}, - 208671: {}, 208730: {}, 208734: {}, - 208857: {}, + 208888: {}, 208905: {}, + 208909: {}, 208972: {}, 208997: {}, + 209001: {}, + 209012: {}, 209046: {}, 209049: {}, - 209196: {}, 209240: {}, 209262: {}, 209277: {}, - 209302: {}, 209360: {}, 209424: {}, 209442: {}, - 209531: {}, - 209743: {}, - 209835: {}, + 209491: {}, + 209641: {}, 209839: {}, 209854: {}, - 209984: {}, 210003: {}, 210021: {}, 210079: {}, 210095: {}, + 210125: {}, + 210147: {}, 210150: {}, 210218: {}, + 210273: {}, 210278: {}, 210315: {}, - 210392: {}, 210402: {}, 210616: {}, 210625: {}, 210644: {}, - 210693: {}, + 210748: {}, 210808: {}, 210964: {}, 210974: {}, 211028: {}, 211057: {}, - 211147: {}, + 211098: {}, 211210: {}, 211211: {}, - 211322: {}, 211356: {}, 211385: {}, - 211458: {}, + 211450: {}, 211468: {}, + 211504: {}, 211555: {}, 211559: {}, - 211689: {}, 211790: {}, + 211913: {}, 211995: {}, 212046: {}, 212183: {}, @@ -2646,12 +2659,16 @@ var DefaultTopASNs = map[ASN]struct{}{ 212655: {}, 212661: {}, 212752: {}, + 212766: {}, 212865: {}, + 212897: {}, 212898: {}, 212910: {}, - 212974: {}, 212999: {}, 213155: {}, + 213250: {}, + 213261: {}, + 213295: {}, 213373: {}, 213398: {}, 213402: {}, @@ -2661,25 +2678,29 @@ var DefaultTopASNs = map[ASN]struct{}{ 262179: {}, 262181: {}, 262186: {}, + 262188: {}, 262191: {}, 262197: {}, 262202: {}, 262210: {}, - 262220: {}, + 262215: {}, + 262221: {}, 262223: {}, 262234: {}, 262239: {}, + 262241: {}, 262253: {}, 262262: {}, 262354: {}, 262378: {}, + 262459: {}, 262468: {}, 262481: {}, 262589: {}, + 262663: {}, 262753: {}, 262773: {}, 262916: {}, - 262928: {}, 262932: {}, 263073: {}, 263170: {}, @@ -2687,12 +2708,10 @@ var DefaultTopASNs = map[ASN]struct{}{ 263189: {}, 263210: {}, 263222: {}, - 263223: {}, 263224: {}, 263238: {}, 263242: {}, 263245: {}, - 263292: {}, 263327: {}, 263686: {}, 263689: {}, @@ -2706,21 +2725,18 @@ var DefaultTopASNs = map[ASN]struct{}{ 263749: {}, 263750: {}, 263751: {}, - 263759: {}, - 263760: {}, 263761: {}, 263762: {}, 263763: {}, 263765: {}, - 263767: {}, 263781: {}, 263783: {}, 263791: {}, 263792: {}, 263793: {}, 263805: {}, + 263809: {}, 263824: {}, - 263834: {}, 263980: {}, 264605: {}, 264609: {}, @@ -2733,22 +2749,24 @@ var DefaultTopASNs = map[ASN]struct{}{ 264646: {}, 264663: {}, 264668: {}, + 264681: {}, 264685: {}, - 264686: {}, 264694: {}, 264696: {}, 264731: {}, 264733: {}, 264738: {}, 264744: {}, + 264746: {}, 264750: {}, 264756: {}, - 264758: {}, 264770: {}, 264778: {}, 264779: {}, 264780: {}, 264783: {}, + 264796: {}, + 264800: {}, 264814: {}, 264821: {}, 264825: {}, @@ -2756,69 +2774,73 @@ var DefaultTopASNs = map[ASN]struct{}{ 264838: {}, 264844: {}, 264847: {}, - 264984: {}, + 265509: {}, 265540: {}, - 265561: {}, 265594: {}, - 265608: {}, + 265605: {}, 265631: {}, 265632: {}, + 265633: {}, 265636: {}, 265675: {}, 265684: {}, - 265686: {}, 265688: {}, 265691: {}, - 265695: {}, 265698: {}, + 265706: {}, 265711: {}, 265721: {}, + 265724: {}, 265727: {}, - 265741: {}, - 265745: {}, + 265767: {}, 265780: {}, 265798: {}, 265799: {}, + 265816: {}, 265818: {}, 265822: {}, - 265823: {}, 265855: {}, + 265862: {}, 265867: {}, 266445: {}, 266668: {}, 266673: {}, + 266677: {}, + 266698: {}, + 266725: {}, + 266730: {}, 266734: {}, 266742: {}, 266755: {}, - 266757: {}, - 266762: {}, + 266779: {}, 266783: {}, 266792: {}, + 266802: {}, 266809: {}, - 266812: {}, 266814: {}, 266815: {}, - 266830: {}, - 266831: {}, + 266832: {}, 266841: {}, 266853: {}, + 266858: {}, 266860: {}, + 266870: {}, 266880: {}, 266893: {}, 266894: {}, 266904: {}, - 267587: {}, 267684: {}, 267685: {}, 267699: {}, - 267700: {}, 267705: {}, 267708: {}, 267713: {}, 267749: {}, 267761: {}, 267765: {}, + 267790: {}, 267795: {}, + 267797: {}, 267803: {}, 267809: {}, 267828: {}, @@ -2828,14 +2850,17 @@ var DefaultTopASNs = map[ASN]struct{}{ 267882: {}, 267883: {}, 267904: {}, - 267916: {}, + 267917: {}, 268323: {}, 268976: {}, - 269194: {}, + 269725: {}, 269729: {}, 269730: {}, 269733: {}, 269734: {}, + 269736: {}, + 269738: {}, + 269748: {}, 269749: {}, 269750: {}, 269763: {}, @@ -2844,29 +2869,27 @@ var DefaultTopASNs = map[ASN]struct{}{ 269782: {}, 269783: {}, 269788: {}, - 269794: {}, 269797: {}, + 269804: {}, 269806: {}, 269816: {}, 269820: {}, 269822: {}, - 269829: {}, 269831: {}, 269832: {}, 269838: {}, 269840: {}, + 269843: {}, + 269846: {}, 269853: {}, 269857: {}, 269862: {}, 269894: {}, - 269898: {}, 269901: {}, 269908: {}, - 269909: {}, - 269918: {}, 269919: {}, 269921: {}, - 269928: {}, + 269927: {}, 269931: {}, 269934: {}, 269936: {}, @@ -2875,12 +2898,9 @@ var DefaultTopASNs = map[ASN]struct{}{ 269950: {}, 269953: {}, 269955: {}, - 269964: {}, 269965: {}, - 269973: {}, + 269974: {}, 269976: {}, - 269981: {}, - 270007: {}, 270026: {}, 270029: {}, 270035: {}, @@ -2896,75 +2916,71 @@ var DefaultTopASNs = map[ASN]struct{}{ 270161: {}, 270814: {}, 271773: {}, + 271785: {}, 271791: {}, 271793: {}, 271795: {}, + 271799: {}, + 271806: {}, + 271808: {}, 271812: {}, 271814: {}, 271819: {}, 271822: {}, 271835: {}, 271837: {}, - 271846: {}, 271855: {}, 271868: {}, 271874: {}, - 271898: {}, 271899: {}, 271907: {}, 271909: {}, 271911: {}, 271929: {}, 271930: {}, - 271931: {}, - 271932: {}, 271935: {}, - 271936: {}, 271942: {}, 271965: {}, 271971: {}, + 271978: {}, 271985: {}, - 271996: {}, + 271988: {}, 272011: {}, 272015: {}, - 272018: {}, - 272019: {}, + 272025: {}, 272026: {}, - 272055: {}, 272057: {}, - 272073: {}, + 272062: {}, 272083: {}, 272102: {}, - 272106: {}, 272110: {}, 272112: {}, + 272120: {}, 272122: {}, 272134: {}, 272809: {}, 272818: {}, - 272832: {}, 272836: {}, - 272851: {}, - 272868: {}, + 272853: {}, + 272867: {}, 272882: {}, 272916: {}, - 272943: {}, 272946: {}, - 272954: {}, + 272955: {}, 327687: {}, 327693: {}, 327697: {}, - 327700: {}, 327707: {}, 327712: {}, 327714: {}, + 327716: {}, 327724: {}, 327725: {}, + 327728: {}, 327738: {}, 327747: {}, 327750: {}, 327756: {}, - 327760: {}, 327765: {}, 327768: {}, 327769: {}, @@ -2972,14 +2988,13 @@ var DefaultTopASNs = map[ASN]struct{}{ 327776: {}, 327782: {}, 327786: {}, - 327794: {}, - 327795: {}, 327799: {}, 327802: {}, 327819: {}, 327828: {}, - 327829: {}, 327830: {}, + 327862: {}, + 327864: {}, 327871: {}, 327879: {}, 327885: {}, @@ -2987,14 +3002,15 @@ var DefaultTopASNs = map[ASN]struct{}{ 327901: {}, 327903: {}, 327931: {}, + 327932: {}, 327934: {}, + 327947: {}, + 327956: {}, 327972: {}, 327975: {}, - 327990: {}, + 327987: {}, 327991: {}, - 327992: {}, 327996: {}, - 328015: {}, 328061: {}, 328073: {}, 328075: {}, @@ -3005,8 +3021,7 @@ var DefaultTopASNs = map[ASN]struct{}{ 328140: {}, 328144: {}, 328169: {}, - 328182: {}, - 328187: {}, + 328178: {}, 328191: {}, 328196: {}, 328198: {}, @@ -3018,18 +3033,18 @@ var DefaultTopASNs = map[ASN]struct{}{ 328250: {}, 328253: {}, 328258: {}, - 328259: {}, + 328271: {}, 328286: {}, 328297: {}, 328304: {}, 328309: {}, 328310: {}, + 328316: {}, 328319: {}, 328331: {}, 328341: {}, 328358: {}, 328411: {}, - 328432: {}, 328436: {}, 328442: {}, 328469: {}, @@ -3041,19 +3056,22 @@ var DefaultTopASNs = map[ASN]struct{}{ 328488: {}, 328490: {}, 328494: {}, + 328500: {}, + 328509: {}, 328510: {}, 328514: {}, 328535: {}, 328539: {}, 328546: {}, 328549: {}, - 328576: {}, - 328578: {}, + 328566: {}, + 328570: {}, 328581: {}, 328586: {}, 328590: {}, 328594: {}, 328605: {}, + 328608: {}, 328610: {}, 328611: {}, 328614: {}, @@ -3061,59 +3079,63 @@ var DefaultTopASNs = map[ASN]struct{}{ 328636: {}, 328638: {}, 328652: {}, + 328659: {}, + 328676: {}, 328679: {}, 328697: {}, 328702: {}, 328708: {}, - 328717: {}, 328727: {}, 328733: {}, 328734: {}, 328753: {}, 328755: {}, 328770: {}, - 328777: {}, - 328808: {}, 328817: {}, + 328835: {}, 328844: {}, + 328850: {}, 328856: {}, 328858: {}, + 328880: {}, 328887: {}, + 328891: {}, 328895: {}, - 328939: {}, + 328919: {}, + 328923: {}, + 328941: {}, 328943: {}, 328954: {}, + 328959: {}, 328961: {}, + 328965: {}, 328975: {}, 328977: {}, - 328983: {}, 328987: {}, 328988: {}, - 328989: {}, 328993: {}, 328997: {}, 329014: {}, 329027: {}, + 329028: {}, 329029: {}, 329044: {}, 329048: {}, + 329074: {}, 329078: {}, 329082: {}, - 329094: {}, 329101: {}, 329103: {}, - 329110: {}, 329129: {}, 329135: {}, - 329140: {}, 329167: {}, + 329170: {}, 329174: {}, - 329179: {}, + 329177: {}, 329183: {}, + 329192: {}, 329205: {}, 329211: {}, - 329219: {}, - 329288: {}, 393275: {}, 393629: {}, 393894: {}, @@ -3122,23 +3144,19 @@ var DefaultTopASNs = map[ASN]struct{}{ 395561: {}, 395570: {}, 395965: {}, - 396082: {}, 396304: {}, + 396338: {}, 396357: {}, - 396420: {}, - 397470: {}, - 397545: {}, + 396982: {}, 397563: {}, 397961: {}, 398228: {}, - 398326: {}, 398721: {}, - 398901: {}, 399382: {}, + 399674: {}, 399686: {}, 399724: {}, 400266: {}, - 400618: {}, } // DefaultCountryTopASNs is a mapping of a country to their top ASNs. @@ -3147,11 +3165,10 @@ var DefaultCountryTopASNs = map[Country]ASN{ CountryAE: 5384, CountryAF: 55330, CountryAG: 11594, - CountryAI: 2740, - CountryAL: 21183, - CountryAM: 12297, + CountryAI: 396304, + CountryAL: 50616, + CountryAM: 44395, CountryAO: 37119, - CountryAQ: 13335, CountryAR: 7303, CountryAS: 9751, CountryAT: 8412, @@ -3161,14 +3178,14 @@ var DefaultCountryTopASNs = map[Country]ASN{ CountryAZ: 28787, CountryBA: 9146, CountryBB: 14813, - CountryBD: 24389, + CountryBD: 24432, CountryBE: 5432, - CountryBF: 37577, + CountryBF: 36924, CountryBG: 8866, CountryBH: 5416, CountryBI: 327799, CountryBJ: 37424, - CountryBM: 32020, + CountryBM: 3855, CountryBN: 10094, CountryBO: 6568, CountryBQ: 27745, @@ -3202,7 +3219,7 @@ var DefaultCountryTopASNs = map[Country]ASN{ CountryDO: 6400, CountryDZ: 36947, CountryEC: 27947, - CountryEE: 44477, + CountryEE: 2586, CountryEG: 8452, CountryER: 24757, CountryES: 3352, @@ -3222,10 +3239,10 @@ var DefaultCountryTopASNs = map[Country]ASN{ CountryGH: 30986, CountryGI: 8301, CountryGL: 8818, - CountryGM: 37309, + CountryGM: 37552, CountryGN: 37461, CountryGP: 3215, - CountryGQ: 37529, + CountryGQ: 37173, CountryGR: 6799, CountryGT: 14754, CountryGU: 9246, @@ -3238,12 +3255,12 @@ var DefaultCountryTopASNs = map[Country]ASN{ CountryHU: 5483, CountryID: 7713, CountryIE: 15502, - CountryIL: 1680, + CountryIL: 12400, CountryIM: 13122, CountryIN: 55836, CountryIO: 17458, CountryIQ: 203214, - CountryIR: 44244, + CountryIR: 197207, CountryIS: 44735, CountryIT: 1267, CountryJE: 8680, @@ -3253,23 +3270,22 @@ var DefaultCountryTopASNs = map[Country]ASN{ CountryKE: 33771, CountryKG: 50223, CountryKH: 38623, - CountryKI: 134783, - CountryKM: 36939, - CountryKN: 11139, - CountryKP: 198605, + CountryKI: 135409, + CountryKM: 328061, + CountryKN: 14813, CountryKR: 4766, CountryKW: 29357, - CountryKY: 16705, + CountryKY: 6639, CountryKZ: 206026, CountryLA: 131267, CountryLB: 42003, CountryLC: 15344, - CountryLI: 56653, + CountryLI: 20634, CountryLK: 18001, CountryLR: 37094, - CountryLS: 33567, + CountryLS: 37057, CountryLT: 8764, - CountryLU: 6661, + CountryLU: 53667, CountryLV: 24921, CountryLY: 21003, CountryMA: 36903, @@ -3281,14 +3297,14 @@ var DefaultCountryTopASNs = map[Country]ASN{ CountryMH: 24439, CountryMK: 6821, CountryML: 30985, - CountryMM: 136255, + CountryMM: 13335, CountryMN: 17882, CountryMO: 4609, CountryMP: 7131, CountryMQ: 3215, CountryMR: 29544, CountryMS: 396304, - CountryMT: 12709, + CountryMT: 15735, CountryMU: 23889, CountryMV: 7642, CountryMW: 37440, @@ -3301,7 +3317,7 @@ var DefaultCountryTopASNs = map[Country]ASN{ CountryNG: 29465, CountryNI: 14754, CountryNL: 1136, - CountryNO: 29695, + CountryNO: 2119, CountryNP: 17501, CountryNR: 140504, CountryNZ: 9790, @@ -3329,10 +3345,10 @@ var DefaultCountryTopASNs = map[Country]ASN{ CountrySB: 45891, CountrySC: 36958, CountrySD: 15706, - CountrySE: 1257, + CountrySE: 3301, CountrySG: 4773, CountrySH: 33763, - CountrySI: 3212, + CountrySI: 5603, CountrySK: 6855, CountrySL: 36988, CountrySM: 15433, @@ -3352,7 +3368,7 @@ var DefaultCountryTopASNs = map[Country]ASN{ CountryTJ: 43197, CountryTL: 58731, CountryTM: 20661, - CountryTN: 37693, + CountryTN: 37705, CountryTO: 38201, CountryTR: 47331, CountryTT: 27800, @@ -3363,13 +3379,12 @@ var DefaultCountryTopASNs = map[Country]ASN{ CountryUS: 7922, CountryUY: 6057, CountryUZ: 8193, - CountryVA: 8978, CountryVC: 46408, CountryVE: 8048, - CountryVG: 396357, + CountryVG: 11139, CountryVI: 14434, CountryVN: 7552, - CountryVU: 9249, + CountryVU: 45355, CountryWF: 45879, CountryWS: 38800, CountryXK: 21246, diff --git a/internal/metrics/backend.go b/internal/metrics/backend.go index 2d70f8a..fe36b5e 100644 --- a/internal/metrics/backend.go +++ b/internal/metrics/backend.go @@ -23,6 +23,15 @@ var DevicesNewCountGauge = promauto.NewGauge(prometheus.GaugeOpts{ Help: "The number of user devices that were changed or added since the previous sync.", }) +// DevicesInvalidTotal is a gauge with the number of invalid user devices loaded +// from the backend. +var DevicesInvalidTotal = promauto.NewCounter(prometheus.CounterOpts{ + Name: "devices_invalid_total", + Subsystem: subsystemBackend, + Namespace: namespace, + Help: "The total number of invalid user devices loaded from the backend.", +}) + // ProfilesCountGauge is a gauge with the total number of user profiles loaded // from the backend. var ProfilesCountGauge = promauto.NewGauge(prometheus.GaugeOpts{ diff --git a/internal/metrics/dnssvc.go b/internal/metrics/dnssvc.go index 6afecd6..0228201 100644 --- a/internal/metrics/dnssvc.go +++ b/internal/metrics/dnssvc.go @@ -21,6 +21,9 @@ var DNSSvcRequestByASNTotal = promauto.NewCounterVec(prometheus.CounterOpts{ Namespace: namespace, Subsystem: subsystemDNSSvc, Help: "The number of processed DNS requests labeled by country and ASN.", + ConstLabels: prometheus.Labels{ + dontStoreLabel: dontStoreLabelValue, + }, }, []string{"country", "asn"}) // DNSSvcRequestByFilterTotal is a counter with the total number of queries diff --git a/internal/metrics/metrics.go b/internal/metrics/metrics.go index 9e86d28..110013c 100644 --- a/internal/metrics/metrics.go +++ b/internal/metrics/metrics.go @@ -35,6 +35,16 @@ const ( subsystemWebSvc = "websvc" ) +const ( + // dontStoreLabel is a label that signals that the metric should not be + // stored in the long-term storage. + dontStoreLabel = "do_not_store_metric" + + // dontStoreLabelValue is a positive value of the [dontStoreLabel] label to + // avoid calling [BoolString] every time. + dontStoreLabelValue = "1" +) + // SetUpGauge signals that the server has been started. Use a function here to // avoid circular dependencies. func SetUpGauge(version, buildtime, branch, revision, goversion string) { diff --git a/internal/profiledb/profiledb.go b/internal/profiledb/profiledb.go index 8557852..0991127 100644 --- a/internal/profiledb/profiledb.go +++ b/internal/profiledb/profiledb.go @@ -39,6 +39,39 @@ type Interface interface { ProfileByLinkedIP(ctx context.Context, ip netip.Addr) (p *agd.Profile, d *agd.Device, err error) } +// type check +var _ Interface = (*Disabled)(nil) + +// Disabled is a profile database that panics on any call. +type Disabled struct{} + +// profilesDBUnexpectedCall is a panic message template for lookup methods when +// profiles database is disabled. +const profilesDBUnexpectedCall string = "profiles db: unexpected call to %s" + +// ProfileByDeviceID implements the [Interface] interface for *Disabled. +func (d *Disabled) ProfileByDeviceID( + _ context.Context, + _ agd.DeviceID, +) (_ *agd.Profile, _ *agd.Device, _ error) { + panic(fmt.Errorf(profilesDBUnexpectedCall, "ProfileByDeviceID")) +} + +// ProfileByDedicatedIP implements the [Interface] interface for *Disabled. +func (d *Disabled) ProfileByDedicatedIP( + _ context.Context, _ netip.Addr, +) (_ *agd.Profile, _ *agd.Device, _ error) { + panic(fmt.Errorf(profilesDBUnexpectedCall, "ProfileByDedicatedIP")) +} + +// ProfileByLinkedIP implements the [Interface] interface for *Disabled. +func (d *Disabled) ProfileByLinkedIP( + _ context.Context, + _ netip.Addr, +) (_ *agd.Profile, _ *agd.Device, _ error) { + panic(fmt.Errorf(profilesDBUnexpectedCall, "ProfileByLinkedIP")) +} + // Config represents the profile database configuration. type Config struct { // Storage returns the data for this profile DB. diff --git a/internal/tools/go.mod b/internal/tools/go.mod index 3c698ff..8bbc4b1 100644 --- a/internal/tools/go.mod +++ b/internal/tools/go.mod @@ -1,38 +1,36 @@ module github.com/AdguardTeam/AdGuardDNS/internal/tools -go 1.21.5 +go 1.21.8 require ( github.com/fzipp/gocyclo v0.6.0 github.com/golangci/misspell v0.4.1 github.com/gordonklaus/ineffassign v0.1.0 - github.com/kisielk/errcheck v1.6.3 + github.com/kisielk/errcheck v1.7.0 github.com/kyoh86/looppointer v0.2.1 - github.com/securego/gosec/v2 v2.18.2 - // TODO(a.garipov): Return to latest once the release is tagged - // correctly. See uudashr/gocognit#31. + github.com/securego/gosec/v2 v2.19.0 github.com/uudashr/gocognit v1.1.2 - golang.org/x/tools v0.16.0 - golang.org/x/vuln v1.0.1 + golang.org/x/tools v0.18.0 + golang.org/x/vuln v1.0.4 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 - google.golang.org/protobuf v1.31.0 - honnef.co/go/tools v0.4.6 - mvdan.cc/gofumpt v0.5.0 - mvdan.cc/unparam v0.0.0-20230917202934-3ee2d22f45fb + google.golang.org/protobuf v1.32.0 + honnef.co/go/tools v0.4.7 + mvdan.cc/gofumpt v0.6.0 + mvdan.cc/unparam v0.0.0-20240104100049-c549a3470d14 ) require ( github.com/BurntSushi/toml v1.3.2 // indirect - github.com/ccojocar/zxcvbn-go v1.0.1 // indirect + github.com/ccojocar/zxcvbn-go v1.0.2 // indirect github.com/google/go-cmp v0.6.0 // indirect - github.com/google/uuid v1.4.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gookit/color v1.5.4 // indirect github.com/kyoh86/nolint v0.0.1 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect golang.org/x/exp v0.0.0-20230307190834-24139beb5833 // indirect - golang.org/x/exp/typeparams v0.0.0-20231127185646-65229373498e // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/exp/typeparams v0.0.0-20240222234643-814bf88cf225 // indirect + golang.org/x/mod v0.15.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.17.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/internal/tools/go.sum b/internal/tools/go.sum index 3865de6..907222a 100644 --- a/internal/tools/go.sum +++ b/internal/tools/go.sum @@ -1,37 +1,35 @@ github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/ccojocar/zxcvbn-go v1.0.1 h1:+sxrANSCj6CdadkcMnvde/GWU1vZiiXRbqYSCalV4/4= -github.com/ccojocar/zxcvbn-go v1.0.1/go.mod h1:g1qkXtUSvHP8lhHp5GrSmTz6uWALGRMQdw6Qnz/hi60= +github.com/ccojocar/zxcvbn-go v1.0.2 h1:na/czXU8RrhXO4EZme6eQJLR4PzcGsahsBOAwU6I3Vg= +github.com/ccojocar/zxcvbn-go v1.0.2/go.mod h1:g1qkXtUSvHP8lhHp5GrSmTz6uWALGRMQdw6Qnz/hi60= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golangci/misspell v0.4.1 h1:+y73iSicVy2PqyX7kmUefHusENlrP9YwuHZHPLGQj/g= github.com/golangci/misspell v0.4.1/go.mod h1:9mAN1quEo3DlpbaIKKyEvRxK1pwqR9s/Sea1bJCtlNI= github.com/google/go-cmdtest v0.4.1-0.20220921163831-55ab3332a786 h1:rcv+Ippz6RAtvaGgKxc+8FQIpxHgsF+HBzPyYL2cyVU= github.com/google/go-cmdtest v0.4.1-0.20220921163831-55ab3332a786/go.mod h1:apVn/GCasLZUVpAJ6oWAuyP7Ne7CEsQbTnc0plM3m+o= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= github.com/gordonklaus/ineffassign v0.1.0 h1:y2Gd/9I7MdY1oEIt+n+rowjBNDcLQq3RsH5hwJd0f9s= github.com/gordonklaus/ineffassign v0.1.0/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= -github.com/kisielk/errcheck v1.6.3 h1:dEKh+GLHcWm2oN34nMvDzn1sqI0i0WxPvrgiJA5JuM8= -github.com/kisielk/errcheck v1.6.3/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= +github.com/kisielk/errcheck v1.7.0 h1:+SbscKmWJ5mOK/bO1zS60F5I9WwZDWOfRsC4RwfwRV0= +github.com/kisielk/errcheck v1.7.0/go.mod h1:1kLL+jV4e+CFfueBmI1dSK2ADDyQnlrnrY/FqKluHJQ= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -40,16 +38,16 @@ github.com/kyoh86/looppointer v0.2.1 h1:Jx9fnkBj/JrIryBLMTYNTj9rvc2SrPS98Dg0w7fx github.com/kyoh86/looppointer v0.2.1/go.mod h1:q358WcM8cMWU+5vzqukvaZtnJi1kw/MpRHQm3xvTrjw= github.com/kyoh86/nolint v0.0.1 h1:GjNxDEkVn2wAxKHtP7iNTrRxytRZ1wXxLV5j4XzGfRU= github.com/kyoh86/nolint v0.0.1/go.mod h1:1ZiZZ7qqrZ9dZegU96phwVcdQOMKIqRzFJL3ewq9gtI= -github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= -github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= -github.com/onsi/gomega v1.28.1 h1:MijcGUbfYuznzK/5R4CPNoUP/9Xvuo20sXfEm6XxoTA= -github.com/onsi/gomega v1.28.1/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= +github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= +github.com/onsi/gomega v1.31.1 h1:KYppCUK+bUgAZwHOu7EXVBKyQA6ILvOESHkn/tgoqvo= +github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYGyAy0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/securego/gosec/v2 v2.18.2 h1:DkDt3wCiOtAHf1XkiXZBhQ6m6mK/b9T/wD257R3/c+I= -github.com/securego/gosec/v2 v2.18.2/go.mod h1:xUuqSF6i0So56Y2wwohWAmB07EdBkUN6crbLlHwbyJs= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/securego/gosec/v2 v2.19.0 h1:gl5xMkOI0/E6Hxx0XCY2XujA3V7SNSefA8sC+3f1gnk= +github.com/securego/gosec/v2 v2.19.0/go.mod h1:hOkDcHz9J/XIgIlPDXalxjeVYsHxoWUc5zJSHxcB8YM= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/uudashr/gocognit v1.1.2 h1:l6BAEKJqQH2UpKAPKdMfZf5kE4W/2xk8pfU1OVLvniI= @@ -65,27 +63,26 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20230307190834-24139beb5833 h1:SChBja7BCQewoTAU7IgvucQKMIXrEpFxNMs0spT3/5s= golang.org/x/exp v0.0.0-20230307190834-24139beb5833/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/exp/typeparams v0.0.0-20231127185646-65229373498e h1:Iel2aGgaO80fSb1N54L7SE6XMeVvYy6caKt8u/5LvR8= -golang.org/x/exp/typeparams v0.0.0-20231127185646-65229373498e/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20240222234643-814bf88cf225 h1:BzKNaIRXh1bD+1557OcFIHlpYBiVbK4zEyn8zBHi1SE= +golang.org/x/exp/typeparams v0.0.0-20240222234643-814bf88cf225/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -96,41 +93,38 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220702020025-31831981b65f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201007032633-0806396f153e/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= -golang.org/x/tools v0.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM= -golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= -golang.org/x/vuln v1.0.1 h1:KUas02EjQK5LTuIx1OylBQdKKZ9jeugs+HiqO5HormU= -golang.org/x/vuln v1.0.1/go.mod h1:bb2hMwln/tqxg32BNY4CcxHWtHXuYa3SbIBmtsyjxtM= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= +golang.org/x/vuln v1.0.4 h1:SP0mPeg2PmGCu03V+61EcQiOjmpri2XijexKdzv8Z1I= +golang.org/x/vuln v1.0.4/go.mod h1:NbJdUQhX8jY++FtuhrXs2Eyx0yePo9pF7nPlIjo9aaQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 h1:rNBFJjBCOgVr9pWD7rs/knKL4FRTKgpZmsRfV214zcA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0/go.mod h1:Dk1tviKTvMCz5tvh7t+fh94dhmQVHuCt2OzJB3CTW9Y= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.4.6 h1:oFEHCKeID7to/3autwsWfnuv69j3NsfcXbvJKuIcep8= -honnef.co/go/tools v0.4.6/go.mod h1:+rnGS1THNh8zMwnd2oVOTL9QF6vmfyG6ZXBULae2uc0= -mvdan.cc/gofumpt v0.5.0 h1:0EQ+Z56k8tXjj/6TQD25BFNKQXpCvT0rnansIc7Ug5E= -mvdan.cc/gofumpt v0.5.0/go.mod h1:HBeVDtMKRZpXyxFciAirzdKklDlGu8aAy1wEbH5Y9js= -mvdan.cc/unparam v0.0.0-20230917202934-3ee2d22f45fb h1:xiF91GJnDSbyPdiZB5d52N2VpZfGhjM4Ji75cjzuooQ= -mvdan.cc/unparam v0.0.0-20230917202934-3ee2d22f45fb/go.mod h1:ZzZjEpJDOmx8TdVU6umamY3Xy0UAQUI2DHbf05USVbI= +honnef.co/go/tools v0.4.7 h1:9MDAWxMoSnB6QoSqiVr7P5mtkT9pOc1kSxchzPCnqJs= +honnef.co/go/tools v0.4.7/go.mod h1:+rnGS1THNh8zMwnd2oVOTL9QF6vmfyG6ZXBULae2uc0= +mvdan.cc/gofumpt v0.6.0 h1:G3QvahNDmpD+Aek/bNOLrFR2XC6ZAdo62dZu65gmwGo= +mvdan.cc/gofumpt v0.6.0/go.mod h1:4L0wf+kgIPZtcCWXynNS2e6bhmj73umwnuXSZarixzA= +mvdan.cc/unparam v0.0.0-20240104100049-c549a3470d14 h1:zCr3iRRgdk5eIikZNDphGcM6KGVTx3Yu+/Uu9Es254w= +mvdan.cc/unparam v0.0.0-20240104100049-c549a3470d14/go.mod h1:ZzZjEpJDOmx8TdVU6umamY3Xy0UAQUI2DHbf05USVbI= diff --git a/internal/websvc/websvc.go b/internal/websvc/websvc.go index 1d1edbc..253aa27 100644 --- a/internal/websvc/websvc.go +++ b/internal/websvc/websvc.go @@ -10,10 +10,10 @@ import ( "net/url" "time" - "github.com/AdguardTeam/AdGuardDNS/internal/agdservice" "github.com/AdguardTeam/AdGuardDNS/internal/errcoll" "github.com/AdguardTeam/golibs/errors" "github.com/AdguardTeam/golibs/log" + "github.com/AdguardTeam/golibs/service" ) // Config is the AdGuard DNS web service configuration structure. @@ -201,11 +201,16 @@ func blockPageServers( } // type check -var _ agdservice.Interface = (*Service)(nil) +var _ service.Interface = (*Service)(nil) -// Start implements the [agdservice.Interface] interface for *Service. svc may -// be nil. It panics if one of the servers could not start. -func (svc *Service) Start(ctx context.Context) (err error) { +// Start implements the [service.Interface] interface for *Service. It starts +// serving all endpoints but does not wait for them to actually go online. svc +// may be nil. err is always nil; if any endpoint fails to start, it panics. +// +// TODO(a.garipov): Wait for the services to go online. +// +// TODO(a.garipov): Use the context for cancelation. +func (svc *Service) Start(_ context.Context) (err error) { if svc == nil { return nil } @@ -261,8 +266,8 @@ func mustStartServer(srv *http.Server) { } } -// Shutdown implements the [agdservice.Interface] interface for *Service. svc -// may be nil. +// Shutdown implements the [service.Interface] interface for *Service. svc may +// be nil. func (svc *Service) Shutdown(ctx context.Context) (err error) { if svc == nil { return nil diff --git a/scripts/backend/main.go b/scripts/backend/main.go index b3449ac..c946a21 100644 --- a/scripts/backend/main.go +++ b/scripts/backend/main.go @@ -95,11 +95,11 @@ func mockDNSProfile() (dp *backendpb.DNSProfile) { } devices := []*backendpb.DeviceSettings{{ - Id: "118ffe93", - Name: "118ffe93-name", + Id: "test", + Name: "test-name", FilteringEnabled: false, LinkedIp: []byte{1, 1, 1, 1}, - DedicatedIps: [][]byte{{1, 1, 1, 2}}, + DedicatedIps: [][]byte{{127, 0, 0, 1}}, }} return &backendpb.DNSProfile{ diff --git a/scripts/make/go-upd-tools.sh b/scripts/make/go-upd-tools.sh new file mode 100644 index 0000000..7486661 --- /dev/null +++ b/scripts/make/go-upd-tools.sh @@ -0,0 +1,33 @@ +#!/bin/sh + +# This comment is used to simplify checking local copies of the script. Bump +# this number every time a significant change is made to this script. +# +# AdGuard-Project-Version: 1 + +verbose="${VERBOSE:-0}" +readonly verbose + +if [ "$verbose" -gt '1' ] +then + env + set -x + x_flags='-x=1' +elif [ "$verbose" -gt '0' ] +then + set -x + x_flags='-x=0' +else + set +x + x_flags='-x=0' +fi +readonly x_flags + +set -e -f -u + +go="${GO:-go}" +readonly go + +cd ./internal/tools/ +"$go" get -u +"$go" mod tidy