diff --git a/go.mod b/go.mod index d34af5046..08da158c6 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( github.com/forPelevin/gomoji v1.1.2 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.3 - github.com/google/uuid v1.3.0 + github.com/google/uuid v1.4.0 github.com/hashicorp/go-version v1.2.0 github.com/imdario/mergo v0.3.12 github.com/ipfs/go-cid v0.4.1 @@ -35,11 +35,11 @@ require ( github.com/keighl/metabolize v0.0.0-20150915210303-97ab655d4034 github.com/kilic/bls12-381 v0.0.0-20200607163746-32e1441c8a9f github.com/lib/pq v1.10.4 - github.com/libp2p/go-libp2p v0.32.2 - github.com/libp2p/go-libp2p-pubsub v0.10.1 + github.com/libp2p/go-libp2p v0.35.0 + github.com/libp2p/go-libp2p-pubsub v0.11.0 github.com/lucasb-eyer/go-colorful v1.0.3 github.com/mat/besticon v0.0.0-20210314201728-1579f269edb7 - github.com/multiformats/go-multiaddr v0.12.3 + github.com/multiformats/go-multiaddr v0.12.4 github.com/multiformats/go-multibase v0.2.0 github.com/multiformats/go-multihash v0.2.3 github.com/multiformats/go-varint v0.0.7 @@ -48,7 +48,7 @@ require ( github.com/oliamb/cutter v0.2.2 github.com/pborman/uuid v1.2.0 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.16.0 + github.com/prometheus/client_golang v1.19.1 github.com/russolsen/transit v0.0.0-20180705123435-0794b4c4505a github.com/status-im/doubleratchet v3.0.0+incompatible github.com/status-im/markdown v0.0.0-20240404192634-b7e33c6ac3d4 @@ -66,9 +66,9 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 github.com/zenthangplus/goccm v0.0.0-20211005163543-2f2e522aca15 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.18.0 + golang.org/x/crypto v0.23.0 golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb - google.golang.org/protobuf v1.31.0 + google.golang.org/protobuf v1.34.1 gopkg.in/go-playground/assert.v1 v1.2.1 // indirect gopkg.in/go-playground/validator.v9 v9.31.0 gopkg.in/natefinch/lumberjack.v2 v2.0.0 @@ -93,15 +93,15 @@ require ( github.com/schollz/peerdiscovery v1.7.0 github.com/siphiuel/lc-proxy-wrapper v0.0.0-20230516150924-246507cee8c7 github.com/urfave/cli/v2 v2.27.2 - github.com/waku-org/go-waku v0.8.1-0.20240528125047-269417c5e979 + github.com/waku-org/go-waku v0.8.1-0.20240605190333-d2d2f5672ebd github.com/wk8/go-ordered-map/v2 v2.1.7 github.com/yeqown/go-qrcode/v2 v2.2.1 github.com/yeqown/go-qrcode/writer/standard v1.2.1 go.uber.org/multierr v1.11.0 - golang.org/x/exp v0.0.0-20231006140011-7918f672742d - golang.org/x/net v0.17.0 - golang.org/x/text v0.14.0 - golang.org/x/time v0.0.0-20220922220347-f3bd1da661af + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 + golang.org/x/net v0.25.0 + golang.org/x/text v0.15.0 + golang.org/x/time v0.5.0 ) require ( @@ -142,13 +142,13 @@ require ( github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect github.com/cruxic/go-hmac-drbg v0.0.0-20170206035330-84c46983886d // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/edsrzf/mmap-go v1.0.0 // indirect github.com/elastic/gosigar v0.14.2 // indirect github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 // indirect - github.com/flynn/noise v1.0.0 // indirect + github.com/flynn/noise v1.1.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect github.com/go-ole/go-ole v1.2.6 // indirect @@ -165,30 +165,29 @@ require ( github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.0.1 // indirect github.com/google/gopacket v1.1.19 // indirect - github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b // indirect + github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 // indirect github.com/gorilla/securecookie v1.1.1 // indirect - github.com/gorilla/websocket v1.5.0 // indirect + github.com/gorilla/websocket v1.5.1 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-bexpr v0.1.10 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect - github.com/hashicorp/golang-lru/v2 v2.0.5 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.2.0 // indirect github.com/huandu/xstrings v1.3.2 // indirect github.com/huin/goupnp v1.3.0 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect - github.com/klauspost/compress v1.17.2 // indirect + github.com/klauspost/compress v1.17.8 // indirect github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/koron/go-ssdp v0.0.4 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect github.com/leodido/go-urn v1.2.1 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/libp2p/go-cidranger v1.1.0 // indirect github.com/libp2p/go-flow-metrics v0.1.0 // indirect - github.com/libp2p/go-libp2p-asn-util v0.3.0 // indirect + github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect github.com/libp2p/go-msgio v0.3.0 // indirect github.com/libp2p/go-nat v0.2.0 // indirect github.com/libp2p/go-netroute v0.2.1 // indirect @@ -199,8 +198,7 @@ require ( github.com/mattn/go-colorable v0.1.8 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/miekg/dns v1.1.56 // indirect + github.com/miekg/dns v1.1.58 // indirect github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/minio/sha256-simd v1.0.1 // indirect @@ -215,34 +213,33 @@ require ( github.com/multiformats/go-multicodec v0.9.0 // indirect github.com/multiformats/go-multistream v0.5.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/onsi/ginkgo/v2 v2.13.0 // indirect - github.com/opencontainers/runtime-spec v1.1.0 // indirect + github.com/onsi/ginkgo/v2 v2.15.0 // indirect + github.com/opencontainers/runtime-spec v1.2.0 // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect - github.com/pion/datachannel v1.5.5 // indirect - github.com/pion/dtls/v2 v2.2.7 // indirect - github.com/pion/ice/v2 v2.3.6 // indirect - github.com/pion/interceptor v0.1.17 // indirect + github.com/pion/datachannel v1.5.6 // indirect + github.com/pion/dtls/v2 v2.2.11 // indirect + github.com/pion/ice/v2 v2.3.24 // indirect + github.com/pion/interceptor v0.1.29 // indirect github.com/pion/logging v0.2.2 // indirect - github.com/pion/mdns v0.0.7 // indirect + github.com/pion/mdns v0.0.12 // indirect github.com/pion/randutil v0.1.0 // indirect - github.com/pion/rtcp v1.2.10 // indirect - github.com/pion/rtp v1.7.13 // indirect - github.com/pion/sctp v1.8.7 // indirect - github.com/pion/sdp/v3 v3.0.6 // indirect - github.com/pion/srtp/v2 v2.0.15 // indirect - github.com/pion/stun v0.6.0 // indirect - github.com/pion/transport/v2 v2.2.1 // indirect - github.com/pion/turn/v2 v2.1.0 // indirect - github.com/pion/webrtc/v3 v3.2.9 // indirect + github.com/pion/rtcp v1.2.14 // indirect + github.com/pion/rtp v1.8.6 // indirect + github.com/pion/sctp v1.8.16 // indirect + github.com/pion/sdp/v3 v3.0.9 // indirect + github.com/pion/srtp/v2 v2.0.18 // indirect + github.com/pion/stun v0.6.1 // indirect + github.com/pion/transport/v2 v2.2.5 // indirect + github.com/pion/turn/v2 v2.1.6 // indirect + github.com/pion/webrtc/v3 v3.2.40 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.4.0 // indirect - github.com/prometheus/common v0.42.0 // indirect - github.com/prometheus/procfs v0.10.1 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.48.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/prometheus/tsdb v0.10.0 // indirect github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/qtls-go1-20 v0.3.4 // indirect - github.com/quic-go/quic-go v0.39.4 // indirect - github.com/quic-go/webtransport-go v0.6.0 // indirect + github.com/quic-go/quic-go v0.44.0 // indirect + github.com/quic-go/webtransport-go v0.8.0 // indirect github.com/raulk/go-watchdog v1.3.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect github.com/rivo/uniseg v0.2.0 // indirect @@ -276,13 +273,13 @@ require ( go.etcd.io/bbolt v1.3.6 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/dig v1.17.1 // indirect - go.uber.org/fx v1.20.1 // indirect - go.uber.org/mock v0.3.0 // indirect - golang.org/x/mod v0.13.0 // indirect - golang.org/x/sync v0.4.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/term v0.16.0 // indirect - golang.org/x/tools v0.14.0 // indirect + go.uber.org/fx v1.21.1 // indirect + go.uber.org/mock v0.4.0 // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/term v0.20.0 // indirect + golang.org/x/tools v0.21.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/blake3 v1.2.1 // indirect diff --git a/go.sum b/go.sum index 7e59b36a5..4254fbdec 100644 --- a/go.sum +++ b/go.sum @@ -671,8 +671,8 @@ github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsP github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= @@ -761,8 +761,8 @@ github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSw github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= -github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= +github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg= +github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= @@ -833,8 +833,8 @@ github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTg github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -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-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= @@ -998,8 +998,8 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/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/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-github/v39 v39.2.0/go.mod h1:C1s8C5aCC9L+JXIYpJM5GYytdX52vC1bLvHEF1IhBrE= @@ -1030,16 +1030,18 @@ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b h1:RMpPgZTSApbPf7xaVel+QkoGPRLFLrwFO89uDUHEGf0= -github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +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 v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -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.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +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/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= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -1070,8 +1072,8 @@ github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/z github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/gosuri/uilive v0.0.0-20170323041506-ac356e6e42cd/go.mod h1:qkLSc0A5EXSP6B04TrN4oQoxqFI7A8XvoXSlJi8cwk8= github.com/gosuri/uilive v0.0.3/go.mod h1:qkLSc0A5EXSP6B04TrN4oQoxqFI7A8XvoXSlJi8cwk8= github.com/gosuri/uiprogress v0.0.0-20170224063937-d0567a9d84a1/go.mod h1:C1RTYn4Sc7iEyf6j8ft5dyoZ4212h8G1ol9QQluh5+0= @@ -1120,8 +1122,8 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4= -github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= @@ -1173,8 +1175,6 @@ github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9 github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= -github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= -github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= @@ -1299,8 +1299,8 @@ github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdY github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= -github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= +github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= @@ -1354,16 +1354,14 @@ github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk= github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= -github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= -github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= -github.com/libp2p/go-libp2p v0.32.2 h1:s8GYN4YJzgUoyeYNPdW7JZeZ5Ee31iNaIBfGYMAY4FQ= -github.com/libp2p/go-libp2p v0.32.2/go.mod h1:E0LKe+diV/ZVJVnOJby8VC5xzHF0660osg71skcxJvk= -github.com/libp2p/go-libp2p-asn-util v0.3.0 h1:gMDcMyYiZKkocGXDQ5nsUQyquC9+H+iLEQHwOCZ7s8s= -github.com/libp2p/go-libp2p-asn-util v0.3.0/go.mod h1:B1mcOrKUE35Xq/ASTmQ4tN3LNzVVaMNmq2NACuqyB9w= -github.com/libp2p/go-libp2p-pubsub v0.10.1 h1:/RqOZpEtAolsr8/9CC8KqROJSOZeu7lK7fPftn4MwNg= -github.com/libp2p/go-libp2p-pubsub v0.10.1/go.mod h1:1OxbaT/pFRO5h+Dpze8hdHQ63R0ke55XTs6b6NwLLkw= +github.com/libp2p/go-libp2p v0.35.0 h1:1xS1Bkr9X7GtdvV6ntLnDV9xB1kNjHK1lZ0eaO6gnhc= +github.com/libp2p/go-libp2p v0.35.0/go.mod h1:snyJQix4ET6Tj+LeI0VPjjxTtdWpeOhYt5lEY0KirkQ= +github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= +github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= +github.com/libp2p/go-libp2p-pubsub v0.11.0 h1:+JvS8Kty0OiyUiN0i8H5JbaCgjnJTRnTHe4rU88dLFc= +github.com/libp2p/go-libp2p-pubsub v0.11.0/go.mod h1:QEb+hEV9WL9wCiUAnpY29FZR6W3zK8qYlaml8R4q6gQ= github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= @@ -1459,16 +1457,14 @@ github.com/mattn/go-sqlite3 v2.0.2+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -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/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= github.com/meirf/gopart v0.0.0-20180520194036-37e9492a85a8 h1:7TJiWD1knYDpOAPyFBoKqoyvlsa+UwDw0kv0jVN5Mrk= github.com/meirf/gopart v0.0.0-20180520194036-37e9492a85a8/go.mod h1:Uz8uoD6o+eQN19hr6Yro/qKvW+KP6olFq+PK/Nn7gCE= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -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/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/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= @@ -1535,8 +1531,8 @@ github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u0xW5UouOmQQrn6a3Y= github.com/multiformats/go-multiaddr v0.3.2/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= -github.com/multiformats/go-multiaddr v0.12.3 h1:hVBXvPRcKG0w80VinQ23P5t7czWgg65BmIvQKjDydU8= -github.com/multiformats/go-multiaddr v0.12.3/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII= +github.com/multiformats/go-multiaddr v0.12.4 h1:rrKqpY9h+n80EwhhC/kkcunCZZ7URIF8yN1WEUt2Hvc= +github.com/multiformats/go-multiaddr v0.12.4/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII= github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= @@ -1581,8 +1577,9 @@ github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a github.com/neo4j/neo4j-go-driver v1.8.1-0.20200803113522-b626aa943eba/go.mod h1:ncO5VaFWh0Nrt+4KT4mOZboaczBZcLuHrG+/sUeP8gI= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= +github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -1611,8 +1608,8 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -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/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 v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= @@ -1627,8 +1624,8 @@ github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQ github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +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/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -1654,8 +1651,8 @@ github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.m github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.1.0 h1:HHUyrt9mwHUjtasSbXSMvs4cyFxh+Bll4AjJ9odEGpg= -github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk= +github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= @@ -1696,8 +1693,8 @@ github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pion/datachannel v1.4.21/go.mod h1:oiNyP4gHx2DIwRzX/MFyH0Rz/Gz05OgBlayAI2hAWjg= github.com/pion/datachannel v1.5.2/go.mod h1:FTGQWaHrdCwIJ1rw6xBIfZVkslikjShim5yr05XFuCQ= -github.com/pion/datachannel v1.5.5 h1:10ef4kwdjije+M9d7Xm9im2Y3O6A6ccQb0zcqZcJew8= -github.com/pion/datachannel v1.5.5/go.mod h1:iMz+lECmfdCMqFRhXhcA/219B0SQlbpoR2V118yimL0= +github.com/pion/datachannel v1.5.6 h1:1IxKJntfSlYkpUj8LlYRSWpYiTTC02nUrOE8T3DqGeg= +github.com/pion/datachannel v1.5.6/go.mod h1:1eKT6Q85pRnr2mHiWHxJwO50SfZRtWHTsNIVb/NfGW4= github.com/pion/dtls/v2 v2.0.1/go.mod h1:uMQkz2W0cSqY00xav7WByQ4Hb+18xeQh2oH2fRezr5U= github.com/pion/dtls/v2 v2.0.2/go.mod h1:27PEO3MDdaCfo21heT59/vsdmZc0zMt9wQPcSlLu/1I= github.com/pion/dtls/v2 v2.0.4/go.mod h1:qAkFscX0ZHoI1E07RfYPoRw3manThveu+mlTDdOxoGI= @@ -1705,29 +1702,30 @@ github.com/pion/dtls/v2 v2.0.7/go.mod h1:QuDII+8FVvk9Dp5t5vYIMTo7hh7uBkra+8QIm7Q github.com/pion/dtls/v2 v2.0.9/go.mod h1:O0Wr7si/Zj5/EBFlDzDd6UtVxx25CE1r7XM7BQKYQho= github.com/pion/dtls/v2 v2.1.1/go.mod h1:qG3gA7ZPZemBqpEFqRKyURYdKEwFZQCGb7gv9T3ON3Y= github.com/pion/dtls/v2 v2.1.2/go.mod h1:o6+WvyLDAlXF7YiPB/RlskRoeK+/JtuaZa5emwQcWus= -github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= +github.com/pion/dtls/v2 v2.2.11 h1:9U/dpCYl1ySttROPWJgqWKEylUdT0fXp/xst6JwY5Ks= +github.com/pion/dtls/v2 v2.2.11/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= github.com/pion/ice v0.7.18/go.mod h1:+Bvnm3nYC6Nnp7VV6glUkuOfToB/AtMRZpOU8ihuf4c= github.com/pion/ice/v2 v2.0.15/go.mod h1:ZIiVGevpgAxF/cXiIVmuIUtCb3Xs4gCzCbXB6+nFkSI= github.com/pion/ice/v2 v2.1.7/go.mod h1:kV4EODVD5ux2z8XncbLHIOtcXKtYXVgLVCeVqnpoeP0= github.com/pion/ice/v2 v2.1.10/go.mod h1:kV4EODVD5ux2z8XncbLHIOtcXKtYXVgLVCeVqnpoeP0= github.com/pion/ice/v2 v2.1.12/go.mod h1:ovgYHUmwYLlRvcCLI67PnQ5YGe+upXZbGgllBDG/ktU= github.com/pion/ice/v2 v2.1.20/go.mod h1:hEAldRzBhTtAfvlU1V/2/nLCMvveQWFKPNCop+63/Iw= -github.com/pion/ice/v2 v2.3.6 h1:Jgqw36cAud47iD+N6rNX225uHvrgWtAlHfVyOQc3Heg= -github.com/pion/ice/v2 v2.3.6/go.mod h1:9/TzKDRwBVAPsC+YOrKH/e3xDrubeTRACU9/sHQarsU= +github.com/pion/ice/v2 v2.3.24 h1:RYgzhH/u5lH0XO+ABatVKCtRd+4U1GEaCXSMjNr13tI= +github.com/pion/ice/v2 v2.3.24/go.mod h1:KXJJcZK7E8WzrBEYnV4UtqEZsGeWfHxsNqhVcVvgjxw= github.com/pion/interceptor v0.0.9/go.mod h1:dHgEP5dtxOTf21MObuBAjJeAayPxLUAZjerGH8Xr07c= github.com/pion/interceptor v0.0.12/go.mod h1:qzeuWuD/ZXvPqOnxNcnhWfkCZ2e1kwwslicyyPnhoK4= github.com/pion/interceptor v0.0.13/go.mod h1:svsW2QoLHLoGLUr4pDoSopGBEWk8FZwlfxId/OKRKzo= github.com/pion/interceptor v0.0.15/go.mod h1:pg3J253eGi5bqyKzA74+ej5Y19ez2jkWANVnF+Z9Dfk= github.com/pion/interceptor v0.1.7/go.mod h1:Lh3JSl/cbJ2wP8I3ccrjh1K/deRGRn3UlSPuOTiHb6U= -github.com/pion/interceptor v0.1.17 h1:prJtgwFh/gB8zMqGZoOgJPHivOwVAp61i2aG61Du/1w= -github.com/pion/interceptor v0.1.17/go.mod h1:SY8kpmfVBvrbUzvj2bsXz7OJt5JvmVNZ+4Kjq7FcwrI= +github.com/pion/interceptor v0.1.29 h1:39fsnlP1U8gw2JzOFWdfCU82vHvhW9o0rZnZF56wF+M= +github.com/pion/interceptor v0.1.29/go.mod h1:ri+LGNjRUc5xUNtDEPzfdkmSqISixVTBF/z/Zms/6T4= github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= github.com/pion/mdns v0.0.4/go.mod h1:R1sL0p50l42S5lJs91oNdUL58nm0QHrhxnSegr++qC0= github.com/pion/mdns v0.0.5/go.mod h1:UgssrvdD3mxpi8tMxAXbsppL3vJ4Jipw1mTCW+al01g= -github.com/pion/mdns v0.0.7 h1:P0UB4Sr6xDWEox0kTVxF0LmQihtCbSAdW0H2nEgkA3U= -github.com/pion/mdns v0.0.7/go.mod h1:4iP2UbeFhLI/vWju/bw6ZfwjJzk0z8DNValjGxR/dD8= +github.com/pion/mdns v0.0.12 h1:CiMYlY+O0azojWDmxdNr7ADGrnZ+V6Ilfner+6mSVK8= +github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYFbk= github.com/pion/quic v0.1.1/go.mod h1:zEU51v7ru8Mp4AUBJvj6psrSth5eEFNnVQK5K48oV3k= github.com/pion/quic v0.1.4/go.mod h1:dBhNvkLoQqRwfi6h3Vqj3IcPLgiW7rkZxBbRdp7Vzvk= github.com/pion/randutil v0.0.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= @@ -1737,8 +1735,9 @@ github.com/pion/rtcp v1.2.3/go.mod h1:zGhIv0RPRF0Z1Wiij22pUt5W/c9fevqSzT4jje/oK7 github.com/pion/rtcp v1.2.4/go.mod h1:52rMNPWFsjr39z9B9MhnkqhPLoeHTv1aN63o/42bWE0= github.com/pion/rtcp v1.2.6/go.mod h1:52rMNPWFsjr39z9B9MhnkqhPLoeHTv1aN63o/42bWE0= github.com/pion/rtcp v1.2.9/go.mod h1:qVPhiCzAm4D/rxb6XzKeyZiQK69yJpbUDJSF7TgrqNo= -github.com/pion/rtcp v1.2.10 h1:nkr3uj+8Sp97zyItdN60tE/S6vk4al5CPRR6Gejsdjc= -github.com/pion/rtcp v1.2.10/go.mod h1:ztfEwXZNLGyF1oQDttz/ZKIBaeeg/oWbRYqzBM9TL1I= +github.com/pion/rtcp v1.2.12/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= +github.com/pion/rtcp v1.2.14 h1:KCkGV3vJ+4DAJmvP0vaQShsb0xkRfWkO540Gy102KyE= +github.com/pion/rtcp v1.2.14/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= github.com/pion/rtp v1.6.0/go.mod h1:QgfogHsMBVE/RFNno467U/KBqfUywEH+HK+0rtnwsdI= github.com/pion/rtp v1.6.1/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko= github.com/pion/rtp v1.6.2/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko= @@ -1746,31 +1745,31 @@ github.com/pion/rtp v1.6.5/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko github.com/pion/rtp v1.7.0/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko= github.com/pion/rtp v1.7.2/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko= github.com/pion/rtp v1.7.4/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko= -github.com/pion/rtp v1.7.13 h1:qcHwlmtiI50t1XivvoawdCGTP4Uiypzfrsap+bijcoA= -github.com/pion/rtp v1.7.13/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko= +github.com/pion/rtp v1.8.3/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= +github.com/pion/rtp v1.8.6 h1:MTmn/b0aWWsAzux2AmP8WGllusBVw4NPYPVFFd7jUPw= +github.com/pion/rtp v1.8.6/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= github.com/pion/sctp v1.7.10/go.mod h1:EhpTUQu1/lcK3xI+eriS6/96fWetHGCvBi9MSsnaBN0= github.com/pion/sctp v1.7.11/go.mod h1:EhpTUQu1/lcK3xI+eriS6/96fWetHGCvBi9MSsnaBN0= github.com/pion/sctp v1.7.12/go.mod h1:xFe9cLMZ5Vj6eOzpyiKjT9SwGM4KpK/8Jbw5//jc+0s= github.com/pion/sctp v1.8.0/go.mod h1:xFe9cLMZ5Vj6eOzpyiKjT9SwGM4KpK/8Jbw5//jc+0s= github.com/pion/sctp v1.8.2/go.mod h1:xFe9cLMZ5Vj6eOzpyiKjT9SwGM4KpK/8Jbw5//jc+0s= -github.com/pion/sctp v1.8.5/go.mod h1:SUFFfDpViyKejTAdwD1d/HQsCu+V/40cCs2nZIvC3s0= -github.com/pion/sctp v1.8.7 h1:JnABvFakZueGAn4KU/4PSKg+GWbF6QWbKTWZOSGJjXw= -github.com/pion/sctp v1.8.7/go.mod h1:g1Ul+ARqZq5JEmoFy87Q/4CePtKnTJ1QCL9dBBdN6AU= +github.com/pion/sctp v1.8.13/go.mod h1:YKSgO/bO/6aOMP9LCie1DuD7m+GamiK2yIiPM6vH+GA= +github.com/pion/sctp v1.8.16 h1:PKrMs+o9EMLRvFfXq59WFsC+V8mN1wnKzqrv+3D/gYY= +github.com/pion/sctp v1.8.16/go.mod h1:P6PbDVA++OJMrVNg2AL3XtYHV4uD6dvfyOovCgMs0PE= github.com/pion/sdp/v2 v2.4.0/go.mod h1:L2LxrOpSTJbAns244vfPChbciR/ReU1KWfG04OpkR7E= github.com/pion/sdp/v3 v3.0.4/go.mod h1:bNiSknmJE0HYBprTHXKPQ3+JjacTv5uap92ueJZKsRk= -github.com/pion/sdp/v3 v3.0.6 h1:WuDLhtuFUUVpTfus9ILC4HRyHsW6TdugjEX/QY9OiUw= -github.com/pion/sdp/v3 v3.0.6/go.mod h1:iiFWFpQO8Fy3S5ldclBkpXqmWy02ns78NOKoLLL0YQw= +github.com/pion/sdp/v3 v3.0.9 h1:pX++dCHoHUwq43kuwf3PyJfHlwIj4hXA7Vrifiq0IJY= +github.com/pion/sdp/v3 v3.0.9/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M= github.com/pion/srtp v1.5.1/go.mod h1:B+QgX5xPeQTNc1CJStJPHzOlHK66ViMDWTT0HZTCkcA= github.com/pion/srtp v1.5.2/go.mod h1:NiBff/MSxUwMUwx/fRNyD/xGE+dVvf8BOCeXhjCXZ9U= github.com/pion/srtp/v2 v2.0.1/go.mod h1:c8NWHhhkFf/drmHTAblkdu8++lsISEBBdAuiyxgqIsE= github.com/pion/srtp/v2 v2.0.2/go.mod h1:VEyLv4CuxrwGY8cxM+Ng3bmVy8ckz/1t6A0q/msKOw0= github.com/pion/srtp/v2 v2.0.5/go.mod h1:8k6AJlal740mrZ6WYxc4Dg6qDqqhxoRG2GSjlUhDF0A= -github.com/pion/srtp/v2 v2.0.15 h1:+tqRtXGsGwHC0G0IUIAzRmdkHvriF79IHVfZGfHrQoA= -github.com/pion/srtp/v2 v2.0.15/go.mod h1:b/pQOlDrbB0HEH5EUAQXzSYxikFbNcNuKmF8tM0hCtw= +github.com/pion/srtp/v2 v2.0.18 h1:vKpAXfawO9RtTRKZJbG4y0v1b11NZxQnxRl85kGuUlo= +github.com/pion/srtp/v2 v2.0.18/go.mod h1:0KJQjA99A6/a0DOVTu1PhDSw0CXF2jTkqOoMg3ODqdA= github.com/pion/stun v0.3.5/go.mod h1:gDMim+47EeEtfWogA37n6qXZS88L5V6LqFcf+DZA2UA= -github.com/pion/stun v0.4.0/go.mod h1:QPsh1/SbXASntw3zkkrIk3ZJVKz4saBY2G7S10P3wCw= -github.com/pion/stun v0.6.0 h1:JHT/2iyGDPrFWE8NNC15wnddBN8KifsEDw8swQmrEmU= -github.com/pion/stun v0.6.0/go.mod h1:HPqcfoeqQn9cuaet7AOmB5e5xkObu9DwBdurwLKO9oA= +github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= +github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= github.com/pion/transport v0.6.0/go.mod h1:iWZ07doqOosSLMhZ+FXUTq+TamDoXSllxpbGcfkCmbE= github.com/pion/transport v0.8.10/go.mod h1:tBmha/UCjpum5hqTWhfAEs3CO4/tHSg0MYRhSzR+CZ8= github.com/pion/transport v0.10.0/go.mod h1:BnHnUipd0rZQyTVB2SBGojFHT9CBt5C5TcsJSQGkvSE= @@ -1778,19 +1777,23 @@ github.com/pion/transport v0.10.1/go.mod h1:PBis1stIILMiis0PewDw91WJeLJkyIMcEk+D github.com/pion/transport v0.12.1/go.mod h1:N3+vZQD9HlDP5GWkZ85LohxNsDcNgofQmyL6ojX5d8Q= github.com/pion/transport v0.12.2/go.mod h1:N3+vZQD9HlDP5GWkZ85LohxNsDcNgofQmyL6ojX5d8Q= github.com/pion/transport v0.12.3/go.mod h1:OViWW9SP2peE/HbwBvARicmAVnesphkNkCVZIWJ6q9A= +github.com/pion/transport v0.13.0 h1:KWTA5ZrQogizzYwPEciGtHPLwpAjE91FgXnyu+Hv2uY= github.com/pion/transport v0.13.0/go.mod h1:yxm9uXpK9bpBBWkITk13cLo1y5/ur5VQpG22ny6EP7g= -github.com/pion/transport v0.14.1 h1:XSM6olwW+o8J4SCmOBb/BpwZypkHeyM0PGFCxNQBr40= -github.com/pion/transport v0.14.1/go.mod h1:4tGmbk00NeYA3rUa9+n+dzCCoKkcy3YlYb99Jn2fNnI= -github.com/pion/transport/v2 v2.0.0/go.mod h1:HS2MEBJTwD+1ZI2eSXSvHJx/HnzQqRy2/LXxt6eVMHc= -github.com/pion/transport/v2 v2.1.0/go.mod h1:AdSw4YBZVDkZm8fpoz+fclXyQwANWmZAlDuQdctTThQ= -github.com/pion/transport/v2 v2.2.0/go.mod h1:AdSw4YBZVDkZm8fpoz+fclXyQwANWmZAlDuQdctTThQ= -github.com/pion/transport/v2 v2.2.1 h1:7qYnCBlpgSJNYMbLCKuSY9KbQdBFoETvPNETv0y4N7c= github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= +github.com/pion/transport/v2 v2.2.2/go.mod h1:OJg3ojoBJopjEeECq2yJdXH9YVrUJ1uQ++NjXLOUorc= +github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v2 v2.2.5 h1:iyi25i/21gQck4hfRhomF6SktmUQjRsRW4WJdhfc3Kc= +github.com/pion/transport/v2 v2.2.5/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= +github.com/pion/transport/v3 v3.0.2 h1:r+40RJR25S9w3jbA6/5uEPTzcdn7ncyU44RWCbHkLg4= +github.com/pion/transport/v3 v3.0.2/go.mod h1:nIToODoOlb5If2jF9y2Igfx3PFYWfuXi37m0IlWa/D0= github.com/pion/turn/v2 v2.0.4/go.mod h1:1812p4DcGVbYVBTiraUmP50XoKye++AMkbfp+N27mog= github.com/pion/turn/v2 v2.0.5/go.mod h1:APg43CFyt/14Uy7heYUOGWdkem/Wu4PhCO/bjyrTqMw= github.com/pion/turn/v2 v2.0.6/go.mod h1:+y7xl719J8bAEVpSXBXvTxStjJv3hbz9YFflvkpcGPw= -github.com/pion/turn/v2 v2.1.0 h1:5wGHSgGhJhP/RpabkUb/T9PdsAjkGLS6toYz5HNzoSI= -github.com/pion/turn/v2 v2.1.0/go.mod h1:yrT5XbXSGX1VFSF31A3c1kCNB5bBZgk/uu5LET162qs= +github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= +github.com/pion/turn/v2 v2.1.6 h1:Xr2niVsiPTB0FPtt+yAWKFUkU1eotQbGgpTIld4x1Gc= +github.com/pion/turn/v2 v2.1.6/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= github.com/pion/udp v0.1.0/go.mod h1:BPELIjbwE9PRbd/zxI/KYBnbo7B6+oA6YuEaNE8lths= github.com/pion/udp v0.1.1/go.mod h1:6AFo+CMdKQm7UiA0eUPA8/eVCTx8jBIITLZHc9DWX5M= github.com/pion/webrtc/v2 v2.2.26/go.mod h1:XMZbZRNHyPDe1gzTIHFcQu02283YO45CbiwFgKvXnmc= @@ -1798,8 +1801,8 @@ github.com/pion/webrtc/v3 v3.0.11/go.mod h1:WEvXneGTeqNmiR59v5jTsxMc4yXQyOQcRsrd github.com/pion/webrtc/v3 v3.0.27/go.mod h1:QpLDmsU5a/a05n230gRtxZRvfHhFzn9ukGUL2x4G5ic= github.com/pion/webrtc/v3 v3.0.32/go.mod h1:wX3V5dQQUGCifhT1mYftC2kCrDQX6ZJ3B7Yad0R9JK0= github.com/pion/webrtc/v3 v3.1.24-0.20220208053747-94262c1b2b38/go.mod h1:L5S/oAhL0Fzt/rnftVQRrP80/j5jygY7XRZzWwFx6P4= -github.com/pion/webrtc/v3 v3.2.9 h1:U8NSjQDlZZ+Iy/hg42Q/u6mhEVSXYvKrOIZiZwYTfLc= -github.com/pion/webrtc/v3 v3.2.9/go.mod h1:gjQLMZeyN3jXBGdxGmUYCyKjOuYX/c99BDjGqmadq0A= +github.com/pion/webrtc/v3 v3.2.40 h1:Wtfi6AZMQg+624cvCXUuSmrKWepSB7zfgYDOYqsSOVU= +github.com/pion/webrtc/v3 v3.2.40/go.mod h1:M1RAe3TNTD1tzyvqHrbVODfwdPGSXOUo/OgpoGGJqFY= github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -1827,8 +1830,8 @@ github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3O github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= +github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -1836,8 +1839,8 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1: github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= @@ -1852,8 +1855,8 @@ github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16 github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= -github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= +github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -1871,19 +1874,17 @@ github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.2/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= -github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/prometheus/tsdb v0.10.0 h1:If5rVCMTp6W2SiRAQFlbpJNgVlgMEd+U2GZckwK38ic= github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4= 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.4 h1:PelfiuG7wXEffUT2yceiqz5V6Pc0TA5ruOd1LcmFc1s= -github.com/quic-go/quic-go v0.39.4/go.mod h1:T09QsDQWjLiQ74ZmacDfqZmhY/NLnw5BC40MANNNZ1Q= -github.com/quic-go/webtransport-go v0.6.0 h1:CvNsKqc4W2HljHJnoT+rMmbRJybShZ0YPFDD3NxaZLY= -github.com/quic-go/webtransport-go v0.6.0/go.mod h1:9KjU4AEBqEQidGHNDkZrb8CAa1abRaosM2yGOyiikEc= +github.com/quic-go/quic-go v0.44.0 h1:So5wOr7jyO4vzL2sd8/pD9Kesciv91zSk8BoFngItQ0= +github.com/quic-go/quic-go v0.44.0/go.mod h1:z4cx/9Ny9UtGITIPzmPTXh1ULfOyWh4qGQlpnPcWmek= +github.com/quic-go/webtransport-go v0.8.0 h1:HxSrwun11U+LlmwpgM1kEqIqH90IT4N8auv/cD7QFJg= +github.com/quic-go/webtransport-go v0.8.0/go.mod h1:N99tjprW432Ut5ONql/aUhSLT0YVSlwHohQsuac9WaM= github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -2074,8 +2075,6 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= @@ -2138,8 +2137,8 @@ github.com/waku-org/go-discover v0.0.0-20240506173252-4912704efdc5 h1:4K3IS97Jry github.com/waku-org/go-discover v0.0.0-20240506173252-4912704efdc5/go.mod h1:eBHgM6T4EG0RZzxpxKy+rGz/6Dw2Nd8DWxS0lm9ESDw= github.com/waku-org/go-libp2p-rendezvous v0.0.0-20240110193335-a67d1cc760a0 h1:R4YYx2QamhBRl/moIxkDCNW+OP7AHbyWLBygDc/xIMo= github.com/waku-org/go-libp2p-rendezvous v0.0.0-20240110193335-a67d1cc760a0/go.mod h1:EhZP9fee0DYjKH/IOQvoNSy1tSHp2iZadsHGphcAJgY= -github.com/waku-org/go-waku v0.8.1-0.20240528125047-269417c5e979 h1:31upWxN0XWBA+bcS0aCJ9jR8HzBNtCg8zKAj+Jvre08= -github.com/waku-org/go-waku v0.8.1-0.20240528125047-269417c5e979/go.mod h1:yXnWChXRKTb+NhALbFysluxgSwuxeTF2rhanDJkIx+k= +github.com/waku-org/go-waku v0.8.1-0.20240605190333-d2d2f5672ebd h1:g5EneT88eHOakr8Zukx4RP1JICgrSl9ZtmgGS+wQbC8= +github.com/waku-org/go-waku v0.8.1-0.20240605190333-d2d2f5672ebd/go.mod h1:biffO55kWbvfO8jdu/aAPiWcmozrfFKPum4EMFDib+k= github.com/waku-org/go-zerokit-rln v0.1.14-0.20240102145250-fa738c0bdf59 h1:jisj+OCI6QydLtFq3Pyhu49wl9ytPN7oAHjMfepHDrA= github.com/waku-org/go-zerokit-rln v0.1.14-0.20240102145250-fa738c0bdf59/go.mod h1:1PdBdPzyTaKt3VnpAHk3zj+r9dXPFOr3IHZP9nFle6E= github.com/waku-org/go-zerokit-rln-apple v0.0.0-20230916172309-ee0ee61dde2b h1:KgZVhsLkxsj5gb/FfndSCQu6VYwALrCOgYI3poR95yE= @@ -2263,15 +2262,15 @@ go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/dig v1.17.1 h1:Tga8Lz8PcYNsWsyHMZ1Vm0OQOUaJNDyvPImgbAu9YSc= go.uber.org/dig v1.17.1/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= -go.uber.org/fx v1.20.1 h1:zVwVQGS8zYvhh9Xxcu4w1M6ESyeMzebzj2NbSayZ4Mk= -go.uber.org/fx v1.20.1/go.mod h1:iSYNbHf2y55acNCwCXKx7LbWb5WG1Bnue5RDXz1OREg= +go.uber.org/fx v1.21.1 h1:RqBh3cYdzZS0uqwVeEjOX2p73dddLpym315myy/Bpb0= +go.uber.org/fx v1.21.1/go.mod h1:HT2M7d7RHo+ebKGh9NRcrsrHHfpZ60nW3QRubMRfv48= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/mock v0.3.0 h1:3mUxI1No2/60yUYax92Pt8eNOEecx2D3lcXZh2NEZJo= -go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= @@ -2334,9 +2333,13 @@ golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2351,8 +2354,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -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/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -2391,8 +2394,8 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -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/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2482,16 +2485,18 @@ golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.0.0-20180227000427-d7d64896b5ff/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2528,8 +2533,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180224232135-f6cff0780e54/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2685,30 +2690,35 @@ golang.org/x/sys v0.0.0-20220317061510-51cd9980dadf/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +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.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +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.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 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= @@ -2718,14 +2728,14 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/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.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2736,8 +2746,8 @@ golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af h1:Yx9k8YCG3dvF87UAn2tu2HQLf2dt/eR1bXxpLMWeH+Y= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +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.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2826,8 +2836,8 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -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/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= +golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -3024,8 +3034,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba 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.27.1/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.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/LICENSE b/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/LICENSE index d2d1dd933..fdf6d8822 100644 --- a/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/LICENSE +++ b/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/LICENSE @@ -1,7 +1,7 @@ ISC License Copyright (c) 2013-2017 The btcsuite developers -Copyright (c) 2015-2020 The Decred developers +Copyright (c) 2015-2024 The Decred developers Copyright (c) 2017 The Lightning Network Developers Permission to use, copy, modify, and distribute this software for any diff --git a/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/curve.go b/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/curve.go index c9d47f307..410050073 100644 --- a/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/curve.go +++ b/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/curve.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015-2022 The Decred developers +// Copyright (c) 2015-2024 The Decred developers // Copyright 2013-2014 The btcsuite developers // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. @@ -1221,6 +1221,25 @@ func ScalarMultNonConst(k *ModNScalar, point, result *JacobianPoint) { // // NOTE: The resulting point will be normalized. func ScalarBaseMultNonConst(k *ModNScalar, result *JacobianPoint) { + scalarBaseMultNonConst(k, result) +} + +// jacobianG is the secp256k1 base point converted to Jacobian coordinates and +// is defined here to avoid repeatedly converting it. +var jacobianG = func() JacobianPoint { + var G JacobianPoint + bigAffineToJacobian(curveParams.Gx, curveParams.Gy, &G) + return G +}() + +// scalarBaseMultNonConstSlow computes k*G through ScalarMultNonConst. +func scalarBaseMultNonConstSlow(k *ModNScalar, result *JacobianPoint) { + ScalarMultNonConst(k, &jacobianG, result) +} + +// scalarBaseMultNonConstFast computes k*G through the precomputed lookup +// tables. +func scalarBaseMultNonConstFast(k *ModNScalar, result *JacobianPoint) { bytePoints := s256BytePoints() // Start with the point at infinity. diff --git a/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/curve_embedded.go b/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/curve_embedded.go new file mode 100644 index 000000000..16288318c --- /dev/null +++ b/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/curve_embedded.go @@ -0,0 +1,14 @@ +// Copyright (c) 2024 The Decred developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +//go:build tinygo + +package secp256k1 + +// This file contains the variants suitable for +// memory or storage constrained environments. + +func scalarBaseMultNonConst(k *ModNScalar, result *JacobianPoint) { + scalarBaseMultNonConstSlow(k, result) +} diff --git a/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/curve_precompute.go b/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/curve_precompute.go new file mode 100644 index 000000000..cf84f770e --- /dev/null +++ b/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/curve_precompute.go @@ -0,0 +1,14 @@ +// Copyright (c) 2024 The Decred developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +//go:build !tinygo + +package secp256k1 + +// This file contains the variants that don't fit in +// memory or storage constrained environments. + +func scalarBaseMultNonConst(k *ModNScalar, result *JacobianPoint) { + scalarBaseMultNonConstFast(k, result) +} diff --git a/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/ecdsa/doc.go b/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/ecdsa/doc.go index 6a1c070ac..18d12c526 100644 --- a/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/ecdsa/doc.go +++ b/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/ecdsa/doc.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 The Decred developers +// Copyright (c) 2020-2023 The Decred developers // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. @@ -32,11 +32,11 @@ key without actually revealing it. # Errors -Errors returned by this package are of type ecdsa.Error and fully support the -standard library errors.Is and errors.As functions. This allows the caller to -programmatically determine the specific error by examining the ErrorKind field -of the type asserted ecdsa.Error while still providing rich error messages with -contextual information. See ErrorKind in the package documentation for a full -list. +The errors returned by this package are of type ecdsa.Error and fully support +the standard library errors.Is and errors.As functions. This allows the caller +to programmatically determine the specific error by examining the ErrorKind +field of the type asserted ecdsa.Error while still providing rich error messages +with contextual information. See ErrorKind in the package documentation for a +full list. */ package ecdsa diff --git a/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/ecdsa/signature.go b/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/ecdsa/signature.go index cfa7a4877..dfee489e7 100644 --- a/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/ecdsa/signature.go +++ b/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/ecdsa/signature.go @@ -59,6 +59,16 @@ func NewSignature(r, s *secp256k1.ModNScalar) *Signature { return &Signature{*r, *s} } +// R returns the r value of the signature. +func (sig *Signature) R() secp256k1.ModNScalar { + return sig.r +} + +// S returns the s value of the signature. +func (sig *Signature) S() secp256k1.ModNScalar { + return sig.s +} + // Serialize returns the ECDSA signature in the Distinguished Encoding Rules // (DER) format per section 10 of [ISO/IEC 8825-1] and such that the S component // of the signature is less than or equal to the half order of the group. diff --git a/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/field.go b/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/field.go index 8d9ac74d5..494b209bd 100644 --- a/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/field.go +++ b/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/field.go @@ -1,6 +1,6 @@ // Copyright (c) 2013-2014 The btcsuite developers -// Copyright (c) 2015-2022 The Decred developers -// Copyright (c) 2013-2022 Dave Collins +// Copyright (c) 2015-2023 The Decred developers +// Copyright (c) 2013-2023 Dave Collins // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. @@ -435,7 +435,7 @@ func (f *FieldVal) Normalize() *FieldVal { // PutBytesUnchecked unpacks the field value to a 32-byte big-endian value // directly into the passed byte slice in constant time. The target slice must -// must have at least 32 bytes available or it will panic. +// have at least 32 bytes available or it will panic. // // There is a similar function, PutBytes, which unpacks the field value into a // 32-byte array directly. This version is provided since it can be useful @@ -816,11 +816,10 @@ func (f *FieldVal) Mul(val *FieldVal) *FieldVal { return f.Mul2(f, val) } -// Mul2 multiplies the passed two field values together and stores the result -// result in f in constant time. Note that this function can overflow if -// multiplying any of the individual words exceeds a max uint32. In practice, -// this means the magnitude of either value involved in the multiplication must -// be a max of 8. +// Mul2 multiplies the passed two field values together and stores the result in +// f in constant time. Note that this function can overflow if multiplying any +// of the individual words exceeds a max uint32. In practice, this means the +// magnitude of either value involved in the multiplication must be a max of 8. // // The field value is returned to support chaining. This enables syntax like: // f3.Mul2(f, f2).AddInt(1) so that f3 = (f * f2) + 1. @@ -1510,8 +1509,8 @@ func (f *FieldVal) SquareVal(val *FieldVal) *FieldVal { // Output Max Magnitude: 1 func (f *FieldVal) Inverse() *FieldVal { // Fermat's little theorem states that for a nonzero number a and prime - // prime p, a^(p-1) = 1 (mod p). Since the multiplicative inverse is - // a*b = 1 (mod p), it follows that b = a*a^(p-2) = a^(p-1) = 1 (mod p). + // p, a^(p-1) ≡ 1 (mod p). Since the multiplicative inverse is + // a*b ≡ 1 (mod p), it follows that b ≡ a*a^(p-2) ≡ a^(p-1) ≡ 1 (mod p). // Thus, a^(p-2) is the multiplicative inverse. // // In order to efficiently compute a^(p-2), p-2 needs to be split into diff --git a/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/modnscalar.go b/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/modnscalar.go index f66496ed5..91940b15a 100644 --- a/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/modnscalar.go +++ b/vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/modnscalar.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020-2022 The Decred developers +// Copyright (c) 2020-2023 The Decred developers // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. @@ -46,6 +46,8 @@ const ( // // The group order of the curve per [SECG] is: // 0xffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141 + // + // nolint: dupword orderWordZero uint32 = 0xd0364141 orderWordOne uint32 = 0xbfd25e8c orderWordTwo uint32 = 0xaf48a03b @@ -76,6 +78,8 @@ const ( // // The half order of the secp256k1 curve group is: // 0x7fffffff ffffffff ffffffff ffffffff 5d576e73 57a4501d dfe92f46 681b20a0 + // + // nolint: dupword halfOrderWordZero uint32 = 0x681b20a0 halfOrderWordOne uint32 = 0xdfe92f46 halfOrderWordTwo uint32 = 0x57a4501d @@ -364,8 +368,8 @@ func (s *ModNScalar) SetByteSlice(b []byte) bool { } // PutBytesUnchecked unpacks the scalar to a 32-byte big-endian value directly -// into the passed byte slice in constant time. The target slice must must have -// at least 32 bytes available or it will panic. +// into the passed byte slice in constant time. The target slice must have at +// least 32 bytes available or it will panic. // // There is a similar function, PutBytes, which unpacks the scalar into a // 32-byte array directly. This version is provided since it can be useful to diff --git a/vendor/github.com/flynn/noise/state.go b/vendor/github.com/flynn/noise/state.go index 6e9577fa9..00d6b9663 100644 --- a/vendor/github.com/flynn/noise/state.go +++ b/vendor/github.com/flynn/noise/state.go @@ -32,6 +32,18 @@ const MaxNonce = uint64(math.MaxUint64) - 1 var ErrMaxNonce = errors.New("noise: cipherstate has reached maximum n, a new handshake must be performed") var ErrCipherSuiteCopied = errors.New("noise: CipherSuite has been copied, state is invalid") +// UnsafeNewCipherState reconstructs a CipherState from exported components. +// It is important that, when resuming from an exported state, care is taken +// to synchronize the nonce state and not allow rollbacks. +func UnsafeNewCipherState(cs CipherSuite, k [32]byte, n uint64) *CipherState { + return &CipherState{ + cs: cs, + c: cs.Cipher(k), + k: k, + n: n, + } +} + // Encrypt encrypts the plaintext and then appends the ciphertext and an // authentication tag across the ciphertext and optional authenticated data to // out. This method automatically increments the nonce after every call, so @@ -86,6 +98,18 @@ func (s *CipherState) Nonce() uint64 { return s.n } +// SetNonce sets the current value of n. +func (s *CipherState) SetNonce(n uint64) { + s.n = n +} + +// UnsafeKey returns the current value of k. This exports the current key for the +// CipherState. Intended to be used alongside UnsafeNewCipherState to resume a +// CipherState at a later point. +func (s *CipherState) UnsafeKey() [32]byte { + return s.k +} + func (s *CipherState) Rekey() { var zeros [32]byte var out []byte @@ -236,6 +260,7 @@ type HandshakeState struct { rs []byte // remote party's static public key re []byte // remote party's ephemeral public key psk []byte // preshared key, maybe zero length + willPsk bool // indicates if preshared key will be used (even if not yet set) messagePatterns [][]MessagePattern shouldWrite bool initiator bool @@ -294,7 +319,6 @@ func NewHandshakeState(c Config) (*HandshakeState, error) { s: c.StaticKeypair, e: c.EphemeralKeypair, rs: c.PeerStatic, - psk: c.PresharedKey, messagePatterns: c.Pattern.Messages, shouldWrite: c.Initiator, initiator: c.Initiator, @@ -308,11 +332,18 @@ func NewHandshakeState(c Config) (*HandshakeState, error) { copy(hs.re, c.PeerEphemeral) } hs.ss.cs = c.CipherSuite + pskModifier := "" - if len(hs.psk) > 0 { - if len(hs.psk) != 32 { - return nil, errors.New("noise: specification mandates 256-bit preshared keys") + // NB: for psk{0,1} we must have preshared key set in configuration as its needed in the first + // message. For psk{2+} we may not know the correct psk yet so it might not be set. + if len(c.PresharedKey) > 0 || c.PresharedKeyPlacement >= 2 { + hs.willPsk = true + if len(c.PresharedKey) > 0 { + if err := hs.SetPresharedKey(c.PresharedKey); err != nil { + return nil, err + } } + pskModifier = fmt.Sprintf("psk%d", c.PresharedKeyPlacement) hs.messagePatterns = append([][]MessagePattern(nil), hs.messagePatterns...) if c.PresharedKeyPlacement == 0 { @@ -321,6 +352,7 @@ func NewHandshakeState(c Config) (*HandshakeState, error) { hs.messagePatterns[c.PresharedKeyPlacement-1] = append(hs.messagePatterns[c.PresharedKeyPlacement-1], MessagePatternPSK) } } + hs.ss.InitializeSymmetric([]byte("Noise_" + c.Pattern.Name + pskModifier + "_" + string(hs.ss.cs.Name()))) hs.ss.MixHash(c.Prologue) for _, m := range c.Pattern.InitiatorPreMessages { @@ -378,7 +410,7 @@ func (s *HandshakeState) WriteMessage(out, payload []byte) ([]byte, *CipherState s.e = e out = append(out, s.e.Public...) s.ss.MixHash(s.e.Public) - if len(s.psk) > 0 { + if s.willPsk { s.ss.MixKey(s.e.Public) } case MessagePatternS: @@ -430,6 +462,9 @@ func (s *HandshakeState) WriteMessage(out, payload []byte) ([]byte, *CipherState } s.ss.MixKey(dh) case MessagePatternPSK: + if len(s.psk) == 0 { + return nil, nil, nil, errors.New("noise: cannot send psk message without psk set") + } s.ss.MixKeyAndHash(s.psk) } } @@ -451,6 +486,15 @@ func (s *HandshakeState) WriteMessage(out, payload []byte) ([]byte, *CipherState // ErrShortMessage is returned by ReadMessage if a message is not as long as it should be. var ErrShortMessage = errors.New("noise: message is too short") +func (s *HandshakeState) SetPresharedKey(psk []byte) error { + if len(psk) != 32 { + return errors.New("noise: specification mandates 256-bit preshared keys") + } + s.psk = make([]byte, 32) + copy(s.psk, psk) + return nil +} + // ReadMessage processes a received handshake message and appends the payload, // if any to out. If the handshake is completed by the call, two CipherStates // will be returned, one is used for encryption of messages to the remote peer, @@ -486,7 +530,7 @@ func (s *HandshakeState) ReadMessage(out, message []byte) ([]byte, *CipherState, s.re = s.re[:s.ss.cs.DHLen()] copy(s.re, message) s.ss.MixHash(s.re) - if len(s.psk) > 0 { + if s.willPsk { s.ss.MixKey(s.re) } case MessagePatternS: diff --git a/vendor/github.com/google/pprof/profile/encode.go b/vendor/github.com/google/pprof/profile/encode.go index 182c926b9..860bb304c 100644 --- a/vendor/github.com/google/pprof/profile/encode.go +++ b/vendor/github.com/google/pprof/profile/encode.go @@ -530,6 +530,7 @@ func (p *Line) decoder() []decoder { func (p *Line) encode(b *buffer) { encodeUint64Opt(b, 1, p.functionIDX) encodeInt64Opt(b, 2, p.Line) + encodeInt64Opt(b, 3, p.Column) } var lineDecoder = []decoder{ @@ -538,6 +539,8 @@ var lineDecoder = []decoder{ func(b *buffer, m message) error { return decodeUint64(b, &m.(*Line).functionIDX) }, // optional int64 line = 2 func(b *buffer, m message) error { return decodeInt64(b, &m.(*Line).Line) }, + // optional int64 column = 3 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Line).Column) }, } func (p *Function) decoder() []decoder { diff --git a/vendor/github.com/google/pprof/profile/legacy_java_profile.go b/vendor/github.com/google/pprof/profile/legacy_java_profile.go index 91f45e53c..4580bab18 100644 --- a/vendor/github.com/google/pprof/profile/legacy_java_profile.go +++ b/vendor/github.com/google/pprof/profile/legacy_java_profile.go @@ -56,7 +56,7 @@ func javaCPUProfile(b []byte, period int64, parse func(b []byte) (uint64, []byte } // Strip out addresses for better merge. - if err = p.Aggregate(true, true, true, true, false); err != nil { + if err = p.Aggregate(true, true, true, true, false, false); err != nil { return nil, err } @@ -99,7 +99,7 @@ func parseJavaProfile(b []byte) (*Profile, error) { } // Strip out addresses for better merge. - if err = p.Aggregate(true, true, true, true, false); err != nil { + if err = p.Aggregate(true, true, true, true, false, false); err != nil { return nil, err } diff --git a/vendor/github.com/google/pprof/profile/merge.go b/vendor/github.com/google/pprof/profile/merge.go index 4b66282cb..eee0132e7 100644 --- a/vendor/github.com/google/pprof/profile/merge.go +++ b/vendor/github.com/google/pprof/profile/merge.go @@ -326,12 +326,13 @@ func (l *Location) key() locationKey { key.addr -= l.Mapping.Start key.mappingID = l.Mapping.ID } - lines := make([]string, len(l.Line)*2) + lines := make([]string, len(l.Line)*3) for i, line := range l.Line { if line.Function != nil { lines[i*2] = strconv.FormatUint(line.Function.ID, 16) } lines[i*2+1] = strconv.FormatInt(line.Line, 16) + lines[i*2+2] = strconv.FormatInt(line.Column, 16) } key.lines = strings.Join(lines, "|") return key @@ -418,6 +419,7 @@ func (pm *profileMerger) mapLine(src Line) Line { ln := Line{ Function: pm.mapFunction(src.Function), Line: src.Line, + Column: src.Column, } return ln } diff --git a/vendor/github.com/google/pprof/profile/profile.go b/vendor/github.com/google/pprof/profile/profile.go index 60ef7e926..62df80a55 100644 --- a/vendor/github.com/google/pprof/profile/profile.go +++ b/vendor/github.com/google/pprof/profile/profile.go @@ -145,6 +145,7 @@ type Location struct { type Line struct { Function *Function Line int64 + Column int64 functionIDX uint64 } @@ -436,7 +437,7 @@ func (p *Profile) CheckValid() error { // Aggregate merges the locations in the profile into equivalence // classes preserving the request attributes. It also updates the // samples to point to the merged locations. -func (p *Profile) Aggregate(inlineFrame, function, filename, linenumber, address bool) error { +func (p *Profile) Aggregate(inlineFrame, function, filename, linenumber, columnnumber, address bool) error { for _, m := range p.Mapping { m.HasInlineFrames = m.HasInlineFrames && inlineFrame m.HasFunctions = m.HasFunctions && function @@ -458,7 +459,7 @@ func (p *Profile) Aggregate(inlineFrame, function, filename, linenumber, address } // Aggregate locations - if !inlineFrame || !address || !linenumber { + if !inlineFrame || !address || !linenumber || !columnnumber { for _, l := range p.Location { if !inlineFrame && len(l.Line) > 1 { l.Line = l.Line[len(l.Line)-1:] @@ -466,6 +467,12 @@ func (p *Profile) Aggregate(inlineFrame, function, filename, linenumber, address if !linenumber { for i := range l.Line { l.Line[i].Line = 0 + l.Line[i].Column = 0 + } + } + if !columnnumber { + for i := range l.Line { + l.Line[i].Column = 0 } } if !address { @@ -627,10 +634,11 @@ func (l *Location) string() string { for li := range l.Line { lnStr := "??" if fn := l.Line[li].Function; fn != nil { - lnStr = fmt.Sprintf("%s %s:%d s=%d", + lnStr = fmt.Sprintf("%s %s:%d:%d s=%d", fn.Name, fn.Filename, l.Line[li].Line, + l.Line[li].Column, fn.StartLine) if fn.Name != fn.SystemName { lnStr = lnStr + "(" + fn.SystemName + ")" diff --git a/vendor/github.com/google/uuid/.travis.yml b/vendor/github.com/google/uuid/.travis.yml deleted file mode 100644 index d8156a60b..000000000 --- a/vendor/github.com/google/uuid/.travis.yml +++ /dev/null @@ -1,9 +0,0 @@ -language: go - -go: - - 1.4.3 - - 1.5.3 - - tip - -script: - - go test -v ./... diff --git a/vendor/github.com/google/uuid/CHANGELOG.md b/vendor/github.com/google/uuid/CHANGELOG.md new file mode 100644 index 000000000..7ed347d3a --- /dev/null +++ b/vendor/github.com/google/uuid/CHANGELOG.md @@ -0,0 +1,21 @@ +# Changelog + +## [1.4.0](https://github.com/google/uuid/compare/v1.3.1...v1.4.0) (2023-10-26) + + +### Features + +* UUIDs slice type with Strings() convenience method ([#133](https://github.com/google/uuid/issues/133)) ([cd5fbbd](https://github.com/google/uuid/commit/cd5fbbdd02f3e3467ac18940e07e062be1f864b4)) + +### Fixes + +* Clarify that Parse's job is to parse but not necessarily validate strings. (Documents current behavior) + +## [1.3.1](https://github.com/google/uuid/compare/v1.3.0...v1.3.1) (2023-08-18) + + +### Bug Fixes + +* Use .EqualFold() to parse urn prefixed UUIDs ([#118](https://github.com/google/uuid/issues/118)) ([574e687](https://github.com/google/uuid/commit/574e6874943741fb99d41764c705173ada5293f0)) + +## Changelog diff --git a/vendor/github.com/google/uuid/CONTRIBUTING.md b/vendor/github.com/google/uuid/CONTRIBUTING.md index 04fdf09f1..a502fdc51 100644 --- a/vendor/github.com/google/uuid/CONTRIBUTING.md +++ b/vendor/github.com/google/uuid/CONTRIBUTING.md @@ -2,6 +2,22 @@ We definitely welcome patches and contribution to this project! +### Tips + +Commits must be formatted according to the [Conventional Commits Specification](https://www.conventionalcommits.org). + +Always try to include a test case! If it is not possible or not necessary, +please explain why in the pull request description. + +### Releasing + +Commits that would precipitate a SemVer change, as described in the Conventional +Commits Specification, will trigger [`release-please`](https://github.com/google-github-actions/release-please-action) +to create a release candidate pull request. Once submitted, `release-please` +will create a release. + +For tips on how to work with `release-please`, see its documentation. + ### Legal requirements In order to protect both you and ourselves, you will need to sign the diff --git a/vendor/github.com/google/uuid/README.md b/vendor/github.com/google/uuid/README.md index f765a46f9..3e9a61889 100644 --- a/vendor/github.com/google/uuid/README.md +++ b/vendor/github.com/google/uuid/README.md @@ -1,6 +1,6 @@ -# uuid ![build status](https://travis-ci.org/google/uuid.svg?branch=master) +# uuid The uuid package generates and inspects UUIDs based on -[RFC 4122](http://tools.ietf.org/html/rfc4122) +[RFC 4122](https://datatracker.ietf.org/doc/html/rfc4122) and DCE 1.1: Authentication and Security Services. This package is based on the github.com/pborman/uuid package (previously named @@ -9,10 +9,12 @@ a UUID is a 16 byte array rather than a byte slice. One loss due to this change is the ability to represent an invalid UUID (vs a NIL UUID). ###### Install -`go get github.com/google/uuid` +```sh +go get github.com/google/uuid +``` ###### Documentation -[![GoDoc](https://godoc.org/github.com/google/uuid?status.svg)](http://godoc.org/github.com/google/uuid) +[![Go Reference](https://pkg.go.dev/badge/github.com/google/uuid.svg)](https://pkg.go.dev/github.com/google/uuid) Full `go doc` style documentation for the package can be viewed online without installing this package by using the GoDoc site here: diff --git a/vendor/github.com/google/uuid/node_js.go b/vendor/github.com/google/uuid/node_js.go index 24b78edc9..b2a0bc871 100644 --- a/vendor/github.com/google/uuid/node_js.go +++ b/vendor/github.com/google/uuid/node_js.go @@ -7,6 +7,6 @@ package uuid // getHardwareInterface returns nil values for the JS version of the code. -// This remvoves the "net" dependency, because it is not used in the browser. +// This removes the "net" dependency, because it is not used in the browser. // Using the "net" library inflates the size of the transpiled JS code by 673k bytes. func getHardwareInterface(name string) (string, []byte) { return "", nil } diff --git a/vendor/github.com/google/uuid/uuid.go b/vendor/github.com/google/uuid/uuid.go index a57207aeb..dc75f7d99 100644 --- a/vendor/github.com/google/uuid/uuid.go +++ b/vendor/github.com/google/uuid/uuid.go @@ -56,11 +56,15 @@ func IsInvalidLengthError(err error) bool { return ok } -// Parse decodes s into a UUID or returns an error. Both the standard UUID -// forms of xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and -// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx are decoded as well as the -// Microsoft encoding {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} and the raw hex -// encoding: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. +// Parse decodes s into a UUID or returns an error if it cannot be parsed. Both +// the standard UUID forms defined in RFC 4122 +// (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and +// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) are decoded. In addition, +// Parse accepts non-standard strings such as the raw hex encoding +// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx and 38 byte "Microsoft style" encodings, +// e.g. {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}. Only the middle 36 bytes are +// examined in the latter case. Parse should not be used to validate strings as +// it parses non-standard encodings as indicated above. func Parse(s string) (UUID, error) { var uuid UUID switch len(s) { @@ -69,7 +73,7 @@ func Parse(s string) (UUID, error) { // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx case 36 + 9: - if strings.ToLower(s[:9]) != "urn:uuid:" { + if !strings.EqualFold(s[:9], "urn:uuid:") { return uuid, fmt.Errorf("invalid urn prefix: %q", s[:9]) } s = s[9:] @@ -101,7 +105,8 @@ func Parse(s string) (UUID, error) { 9, 11, 14, 16, 19, 21, - 24, 26, 28, 30, 32, 34} { + 24, 26, 28, 30, 32, 34, + } { v, ok := xtob(s[x], s[x+1]) if !ok { return uuid, errors.New("invalid UUID format") @@ -117,7 +122,7 @@ func ParseBytes(b []byte) (UUID, error) { switch len(b) { case 36: // xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx case 36 + 9: // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - if !bytes.Equal(bytes.ToLower(b[:9]), []byte("urn:uuid:")) { + if !bytes.EqualFold(b[:9], []byte("urn:uuid:")) { return uuid, fmt.Errorf("invalid urn prefix: %q", b[:9]) } b = b[9:] @@ -145,7 +150,8 @@ func ParseBytes(b []byte) (UUID, error) { 9, 11, 14, 16, 19, 21, - 24, 26, 28, 30, 32, 34} { + 24, 26, 28, 30, 32, 34, + } { v, ok := xtob(b[x], b[x+1]) if !ok { return uuid, errors.New("invalid UUID format") @@ -292,3 +298,15 @@ func DisableRandPool() { poolMu.Lock() poolPos = randPoolSize } + +// UUIDs is a slice of UUID types. +type UUIDs []UUID + +// Strings returns a string slice containing the string form of each UUID in uuids. +func (uuids UUIDs) Strings() []string { + var uuidStrs = make([]string, len(uuids)) + for i, uuid := range uuids { + uuidStrs[i] = uuid.String() + } + return uuidStrs +} diff --git a/vendor/github.com/gorilla/websocket/.editorconfig b/vendor/github.com/gorilla/websocket/.editorconfig new file mode 100644 index 000000000..2940ec92a --- /dev/null +++ b/vendor/github.com/gorilla/websocket/.editorconfig @@ -0,0 +1,20 @@ +; https://editorconfig.org/ + +root = true + +[*] +insert_final_newline = true +charset = utf-8 +trim_trailing_whitespace = true +indent_style = space +indent_size = 2 + +[{Makefile,go.mod,go.sum,*.go,.gitmodules}] +indent_style = tab +indent_size = 4 + +[*.md] +indent_size = 4 +trim_trailing_whitespace = false + +eclint_indent_style = unset diff --git a/vendor/github.com/gorilla/websocket/.gitignore b/vendor/github.com/gorilla/websocket/.gitignore index cd3fcd1ef..84039fec6 100644 --- a/vendor/github.com/gorilla/websocket/.gitignore +++ b/vendor/github.com/gorilla/websocket/.gitignore @@ -1,25 +1 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe - -.idea/ -*.iml +coverage.coverprofile diff --git a/vendor/github.com/gorilla/websocket/.golangci.yml b/vendor/github.com/gorilla/websocket/.golangci.yml new file mode 100644 index 000000000..34882139e --- /dev/null +++ b/vendor/github.com/gorilla/websocket/.golangci.yml @@ -0,0 +1,3 @@ +run: + skip-dirs: + - examples/*.go diff --git a/vendor/github.com/gorilla/websocket/AUTHORS b/vendor/github.com/gorilla/websocket/AUTHORS deleted file mode 100644 index 1931f4006..000000000 --- a/vendor/github.com/gorilla/websocket/AUTHORS +++ /dev/null @@ -1,9 +0,0 @@ -# This is the official list of Gorilla WebSocket authors for copyright -# purposes. -# -# Please keep the list sorted. - -Gary Burd -Google LLC (https://opensource.google.com/) -Joachim Bauch - diff --git a/vendor/github.com/gorilla/websocket/LICENSE b/vendor/github.com/gorilla/websocket/LICENSE index 9171c9722..bb9d80bc9 100644 --- a/vendor/github.com/gorilla/websocket/LICENSE +++ b/vendor/github.com/gorilla/websocket/LICENSE @@ -1,22 +1,27 @@ -Copyright (c) 2013 The Gorilla WebSocket Authors. All rights reserved. +Copyright (c) 2023 The Gorilla Authors. All rights reserved. Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +modification, are permitted provided that the following conditions are +met: - Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/gorilla/websocket/Makefile b/vendor/github.com/gorilla/websocket/Makefile new file mode 100644 index 000000000..603a63f50 --- /dev/null +++ b/vendor/github.com/gorilla/websocket/Makefile @@ -0,0 +1,34 @@ +GO_LINT=$(shell which golangci-lint 2> /dev/null || echo '') +GO_LINT_URI=github.com/golangci/golangci-lint/cmd/golangci-lint@latest + +GO_SEC=$(shell which gosec 2> /dev/null || echo '') +GO_SEC_URI=github.com/securego/gosec/v2/cmd/gosec@latest + +GO_VULNCHECK=$(shell which govulncheck 2> /dev/null || echo '') +GO_VULNCHECK_URI=golang.org/x/vuln/cmd/govulncheck@latest + +.PHONY: golangci-lint +golangci-lint: + $(if $(GO_LINT), ,go install $(GO_LINT_URI)) + @echo "##### Running golangci-lint" + golangci-lint run -v + +.PHONY: gosec +gosec: + $(if $(GO_SEC), ,go install $(GO_SEC_URI)) + @echo "##### Running gosec" + gosec -exclude-dir examples ./... + +.PHONY: govulncheck +govulncheck: + $(if $(GO_VULNCHECK), ,go install $(GO_VULNCHECK_URI)) + @echo "##### Running govulncheck" + govulncheck ./... + +.PHONY: verify +verify: golangci-lint gosec govulncheck + +.PHONY: test +test: + @echo "##### Running tests" + go test -race -cover -coverprofile=coverage.coverprofile -covermode=atomic -v ./... diff --git a/vendor/github.com/gorilla/websocket/README.md b/vendor/github.com/gorilla/websocket/README.md index 2517a2871..1fd5e9c4e 100644 --- a/vendor/github.com/gorilla/websocket/README.md +++ b/vendor/github.com/gorilla/websocket/README.md @@ -1,17 +1,14 @@ -# Gorilla WebSocket +# gorilla/websocket -[![GoDoc](https://godoc.org/github.com/gorilla/websocket?status.svg)](https://godoc.org/github.com/gorilla/websocket) -[![CircleCI](https://circleci.com/gh/gorilla/websocket.svg?style=svg)](https://circleci.com/gh/gorilla/websocket) +![testing](https://github.com/gorilla/websocket/actions/workflows/test.yml/badge.svg) +[![codecov](https://codecov.io/github/gorilla/websocket/branch/main/graph/badge.svg)](https://codecov.io/github/gorilla/websocket) +[![godoc](https://godoc.org/github.com/gorilla/websocket?status.svg)](https://godoc.org/github.com/gorilla/websocket) +[![sourcegraph](https://sourcegraph.com/github.com/gorilla/websocket/-/badge.svg)](https://sourcegraph.com/github.com/gorilla/websocket?badge) -Gorilla WebSocket is a [Go](http://golang.org/) implementation of the -[WebSocket](http://www.rfc-editor.org/rfc/rfc6455.txt) protocol. +Gorilla WebSocket is a [Go](http://golang.org/) implementation of the [WebSocket](http://www.rfc-editor.org/rfc/rfc6455.txt) protocol. +![Gorilla Logo](https://github.com/gorilla/.github/assets/53367916/d92caabf-98e0-473e-bfbf-ab554ba435e5) ---- - -⚠️ **[The Gorilla WebSocket Package is looking for a new maintainer](https://github.com/gorilla/websocket/issues/370)** - ---- ### Documentation @@ -20,6 +17,7 @@ Gorilla WebSocket is a [Go](http://golang.org/) implementation of the * [Command example](https://github.com/gorilla/websocket/tree/master/examples/command) * [Client and server example](https://github.com/gorilla/websocket/tree/master/examples/echo) * [File watch example](https://github.com/gorilla/websocket/tree/master/examples/filewatch) +* [Write buffer pool example](https://github.com/gorilla/websocket/tree/master/examples/bufferpool) ### Status @@ -36,4 +34,3 @@ package API is stable. The Gorilla WebSocket package passes the server tests in the [Autobahn Test Suite](https://github.com/crossbario/autobahn-testsuite) using the application in the [examples/autobahn subdirectory](https://github.com/gorilla/websocket/tree/master/examples/autobahn). - diff --git a/vendor/github.com/gorilla/websocket/client.go b/vendor/github.com/gorilla/websocket/client.go index 2efd83555..815b0ca5c 100644 --- a/vendor/github.com/gorilla/websocket/client.go +++ b/vendor/github.com/gorilla/websocket/client.go @@ -9,14 +9,18 @@ import ( "context" "crypto/tls" "errors" + "fmt" "io" - "io/ioutil" + "log" + "net" "net/http" "net/http/httptrace" "net/url" "strings" "time" + + "golang.org/x/net/proxy" ) // ErrBadHandshake is returned when the server response to opening handshake is @@ -224,6 +228,7 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h k == "Connection" || k == "Sec-Websocket-Key" || k == "Sec-Websocket-Version" || + //#nosec G101 (CWE-798): Potential HTTP request smuggling via parameter pollution k == "Sec-Websocket-Extensions" || (k == "Sec-Websocket-Protocol" && len(d.Subprotocols) > 0): return nil, nil, errors.New("websocket: duplicate header not allowed: " + k) @@ -289,7 +294,9 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h } err = c.SetDeadline(deadline) if err != nil { - c.Close() + if err := c.Close(); err != nil { + log.Printf("websocket: failed to close network connection: %v", err) + } return nil, err } return c, nil @@ -303,7 +310,7 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h return nil, nil, err } if proxyURL != nil { - dialer, err := proxy_FromURL(proxyURL, netDialerFunc(netDial)) + dialer, err := proxy.FromURL(proxyURL, netDialerFunc(netDial)) if err != nil { return nil, nil, err } @@ -318,18 +325,20 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h } netConn, err := netDial("tcp", hostPort) + if err != nil { + return nil, nil, err + } if trace != nil && trace.GotConn != nil { trace.GotConn(httptrace.GotConnInfo{ Conn: netConn, }) } - if err != nil { - return nil, nil, err - } defer func() { if netConn != nil { - netConn.Close() + if err := netConn.Close(); err != nil { + log.Printf("websocket: failed to close network connection: %v", err) + } } }() @@ -370,6 +379,17 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h resp, err := http.ReadResponse(conn.br, req) if err != nil { + if d.TLSClientConfig != nil { + for _, proto := range d.TLSClientConfig.NextProtos { + if proto != "http/1.1" { + return nil, nil, fmt.Errorf( + "websocket: protocol %q was given but is not supported;"+ + "sharing tls.Config with net/http Transport can cause this error: %w", + proto, err, + ) + } + } + } return nil, nil, err } @@ -388,7 +408,7 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h // debugging. buf := make([]byte, 1024) n, _ := io.ReadFull(resp.Body, buf) - resp.Body = ioutil.NopCloser(bytes.NewReader(buf[:n])) + resp.Body = io.NopCloser(bytes.NewReader(buf[:n])) return nil, resp, ErrBadHandshake } @@ -406,17 +426,19 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h break } - resp.Body = ioutil.NopCloser(bytes.NewReader([]byte{})) + resp.Body = io.NopCloser(bytes.NewReader([]byte{})) conn.subprotocol = resp.Header.Get("Sec-Websocket-Protocol") - netConn.SetDeadline(time.Time{}) + if err := netConn.SetDeadline(time.Time{}); err != nil { + return nil, nil, err + } netConn = nil // to avoid close in defer. return conn, resp, nil } func cloneTLSConfig(cfg *tls.Config) *tls.Config { if cfg == nil { - return &tls.Config{} + return &tls.Config{MinVersion: tls.VersionTLS12} } return cfg.Clone() } diff --git a/vendor/github.com/gorilla/websocket/compression.go b/vendor/github.com/gorilla/websocket/compression.go index 813ffb1e8..9fed0ef52 100644 --- a/vendor/github.com/gorilla/websocket/compression.go +++ b/vendor/github.com/gorilla/websocket/compression.go @@ -8,6 +8,7 @@ import ( "compress/flate" "errors" "io" + "log" "strings" "sync" ) @@ -33,7 +34,9 @@ func decompressNoContextTakeover(r io.Reader) io.ReadCloser { "\x01\x00\x00\xff\xff" fr, _ := flateReaderPool.Get().(io.ReadCloser) - fr.(flate.Resetter).Reset(io.MultiReader(r, strings.NewReader(tail)), nil) + if err := fr.(flate.Resetter).Reset(io.MultiReader(r, strings.NewReader(tail)), nil); err != nil { + panic(err) + } return &flateReadWrapper{fr} } @@ -132,7 +135,9 @@ func (r *flateReadWrapper) Read(p []byte) (int, error) { // Preemptively place the reader back in the pool. This helps with // scenarios where the application does not call NextReader() soon after // this final read. - r.Close() + if err := r.Close(); err != nil { + log.Printf("websocket: flateReadWrapper.Close() returned error: %v", err) + } } return n, err } diff --git a/vendor/github.com/gorilla/websocket/conn.go b/vendor/github.com/gorilla/websocket/conn.go index 331eebc85..221e6cf79 100644 --- a/vendor/github.com/gorilla/websocket/conn.go +++ b/vendor/github.com/gorilla/websocket/conn.go @@ -6,11 +6,11 @@ package websocket import ( "bufio" + "crypto/rand" "encoding/binary" "errors" "io" - "io/ioutil" - "math/rand" + "log" "net" "strconv" "strings" @@ -181,13 +181,20 @@ var ( errInvalidControlFrame = errors.New("websocket: invalid control frame") ) +// maskRand is an io.Reader for generating mask bytes. The reader is initialized +// to crypto/rand Reader. Tests swap the reader to a math/rand reader for +// reproducible results. +var maskRand = rand.Reader + +// newMaskKey returns a new 32 bit value for masking client frames. func newMaskKey() [4]byte { - n := rand.Uint32() - return [4]byte{byte(n), byte(n >> 8), byte(n >> 16), byte(n >> 24)} + var k [4]byte + _, _ = io.ReadFull(maskRand, k[:]) + return k } func hideTempErr(err error) error { - if e, ok := err.(net.Error); ok && e.Temporary() { + if e, ok := err.(net.Error); ok { err = &netError{msg: e.Error(), timeout: e.Timeout()} } return err @@ -372,7 +379,9 @@ func (c *Conn) read(n int) ([]byte, error) { if err == io.EOF { err = errUnexpectedEOF } - c.br.Discard(len(p)) + if _, err := c.br.Discard(len(p)); err != nil { + return p, err + } return p, err } @@ -387,7 +396,9 @@ func (c *Conn) write(frameType int, deadline time.Time, buf0, buf1 []byte) error return err } - c.conn.SetWriteDeadline(deadline) + if err := c.conn.SetWriteDeadline(deadline); err != nil { + return c.writeFatal(err) + } if len(buf1) == 0 { _, err = c.conn.Write(buf0) } else { @@ -397,7 +408,7 @@ func (c *Conn) write(frameType int, deadline time.Time, buf0, buf1 []byte) error return c.writeFatal(err) } if frameType == CloseMessage { - c.writeFatal(ErrCloseSent) + _ = c.writeFatal(ErrCloseSent) } return nil } @@ -438,7 +449,7 @@ func (c *Conn) WriteControl(messageType int, data []byte, deadline time.Time) er d := 1000 * time.Hour if !deadline.IsZero() { - d = deadline.Sub(time.Now()) + d = time.Until(deadline) if d < 0 { return errWriteTimeout } @@ -460,13 +471,15 @@ func (c *Conn) WriteControl(messageType int, data []byte, deadline time.Time) er return err } - c.conn.SetWriteDeadline(deadline) + if err := c.conn.SetWriteDeadline(deadline); err != nil { + return c.writeFatal(err) + } _, err = c.conn.Write(buf) if err != nil { return c.writeFatal(err) } if messageType == CloseMessage { - c.writeFatal(ErrCloseSent) + _ = c.writeFatal(ErrCloseSent) } return err } @@ -477,7 +490,9 @@ func (c *Conn) beginMessage(mw *messageWriter, messageType int) error { // probably better to return an error in this situation, but we cannot // change this without breaking existing applications. if c.writer != nil { - c.writer.Close() + if err := c.writer.Close(); err != nil { + log.Printf("websocket: discarding writer close error: %v", err) + } c.writer = nil } @@ -630,7 +645,7 @@ func (w *messageWriter) flushFrame(final bool, extra []byte) error { } if final { - w.endMessage(errWriteClosed) + _ = w.endMessage(errWriteClosed) return nil } @@ -795,7 +810,7 @@ func (c *Conn) advanceFrame() (int, error) { // 1. Skip remainder of previous frame. if c.readRemaining > 0 { - if _, err := io.CopyN(ioutil.Discard, c.br, c.readRemaining); err != nil { + if _, err := io.CopyN(io.Discard, c.br, c.readRemaining); err != nil { return noFrame, err } } @@ -817,7 +832,9 @@ func (c *Conn) advanceFrame() (int, error) { rsv2 := p[0]&rsv2Bit != 0 rsv3 := p[0]&rsv3Bit != 0 mask := p[1]&maskBit != 0 - c.setReadRemaining(int64(p[1] & 0x7f)) + if err := c.setReadRemaining(int64(p[1] & 0x7f)); err != nil { + return noFrame, err + } c.readDecompress = false if rsv1 { @@ -922,7 +939,9 @@ func (c *Conn) advanceFrame() (int, error) { } if c.readLimit > 0 && c.readLength > c.readLimit { - c.WriteControl(CloseMessage, FormatCloseMessage(CloseMessageTooBig, ""), time.Now().Add(writeWait)) + if err := c.WriteControl(CloseMessage, FormatCloseMessage(CloseMessageTooBig, ""), time.Now().Add(writeWait)); err != nil { + return noFrame, err + } return noFrame, ErrReadLimit } @@ -934,7 +953,9 @@ func (c *Conn) advanceFrame() (int, error) { var payload []byte if c.readRemaining > 0 { payload, err = c.read(int(c.readRemaining)) - c.setReadRemaining(0) + if err := c.setReadRemaining(0); err != nil { + return noFrame, err + } if err != nil { return noFrame, err } @@ -981,7 +1002,9 @@ func (c *Conn) handleProtocolError(message string) error { if len(data) > maxControlFramePayloadSize { data = data[:maxControlFramePayloadSize] } - c.WriteControl(CloseMessage, data, time.Now().Add(writeWait)) + if err := c.WriteControl(CloseMessage, data, time.Now().Add(writeWait)); err != nil { + return err + } return errors.New("websocket: " + message) } @@ -998,7 +1021,9 @@ func (c *Conn) handleProtocolError(message string) error { func (c *Conn) NextReader() (messageType int, r io.Reader, err error) { // Close previous reader, only relevant for decompression. if c.reader != nil { - c.reader.Close() + if err := c.reader.Close(); err != nil { + log.Printf("websocket: discarding reader close error: %v", err) + } c.reader = nil } @@ -1054,7 +1079,9 @@ func (r *messageReader) Read(b []byte) (int, error) { } rem := c.readRemaining rem -= int64(n) - c.setReadRemaining(rem) + if err := c.setReadRemaining(rem); err != nil { + return 0, err + } if c.readRemaining > 0 && c.readErr == io.EOF { c.readErr = errUnexpectedEOF } @@ -1094,7 +1121,7 @@ func (c *Conn) ReadMessage() (messageType int, p []byte, err error) { if err != nil { return messageType, nil, err } - p, err = ioutil.ReadAll(r) + p, err = io.ReadAll(r) return messageType, p, err } @@ -1136,7 +1163,9 @@ func (c *Conn) SetCloseHandler(h func(code int, text string) error) { if h == nil { h = func(code int, text string) error { message := FormatCloseMessage(code, "") - c.WriteControl(CloseMessage, message, time.Now().Add(writeWait)) + if err := c.WriteControl(CloseMessage, message, time.Now().Add(writeWait)); err != nil { + return err + } return nil } } @@ -1161,7 +1190,7 @@ func (c *Conn) SetPingHandler(h func(appData string) error) { err := c.WriteControl(PongMessage, []byte(message), time.Now().Add(writeWait)) if err == ErrCloseSent { return nil - } else if e, ok := err.(net.Error); ok && e.Temporary() { + } else if _, ok := err.(net.Error); ok { return nil } return err @@ -1189,8 +1218,16 @@ func (c *Conn) SetPongHandler(h func(appData string) error) { c.handlePong = h } +// NetConn returns the underlying connection that is wrapped by c. +// Note that writing to or reading from this connection directly will corrupt the +// WebSocket connection. +func (c *Conn) NetConn() net.Conn { + return c.conn +} + // UnderlyingConn returns the internal net.Conn. This can be used to further // modifications to connection specific flags. +// Deprecated: Use the NetConn method. func (c *Conn) UnderlyingConn() net.Conn { return c.conn } diff --git a/vendor/github.com/gorilla/websocket/mask.go b/vendor/github.com/gorilla/websocket/mask.go index d0742bf2a..67d0968be 100644 --- a/vendor/github.com/gorilla/websocket/mask.go +++ b/vendor/github.com/gorilla/websocket/mask.go @@ -9,6 +9,7 @@ package websocket import "unsafe" +// #nosec G103 -- (CWE-242) Has been audited const wordSize = int(unsafe.Sizeof(uintptr(0))) func maskBytes(key [4]byte, pos int, b []byte) int { @@ -22,6 +23,7 @@ func maskBytes(key [4]byte, pos int, b []byte) int { } // Mask one byte at a time to word boundary. + //#nosec G103 -- (CWE-242) Has been audited if n := int(uintptr(unsafe.Pointer(&b[0]))) % wordSize; n != 0 { n = wordSize - n for i := range b[:n] { @@ -36,11 +38,13 @@ func maskBytes(key [4]byte, pos int, b []byte) int { for i := range k { k[i] = key[(pos+i)&3] } + //#nosec G103 -- (CWE-242) Has been audited kw := *(*uintptr)(unsafe.Pointer(&k)) // Mask one word at a time. n := (len(b) / wordSize) * wordSize for i := 0; i < n; i += wordSize { + //#nosec G103 -- (CWE-242) Has been audited *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&b[0])) + uintptr(i))) ^= kw } diff --git a/vendor/github.com/gorilla/websocket/proxy.go b/vendor/github.com/gorilla/websocket/proxy.go index e0f466b72..80f55d1ea 100644 --- a/vendor/github.com/gorilla/websocket/proxy.go +++ b/vendor/github.com/gorilla/websocket/proxy.go @@ -8,10 +8,13 @@ import ( "bufio" "encoding/base64" "errors" + "log" "net" "net/http" "net/url" "strings" + + "golang.org/x/net/proxy" ) type netDialerFunc func(network, addr string) (net.Conn, error) @@ -21,7 +24,7 @@ func (fn netDialerFunc) Dial(network, addr string) (net.Conn, error) { } func init() { - proxy_RegisterDialerType("http", func(proxyURL *url.URL, forwardDialer proxy_Dialer) (proxy_Dialer, error) { + proxy.RegisterDialerType("http", func(proxyURL *url.URL, forwardDialer proxy.Dialer) (proxy.Dialer, error) { return &httpProxyDialer{proxyURL: proxyURL, forwardDial: forwardDialer.Dial}, nil }) } @@ -55,7 +58,9 @@ func (hpd *httpProxyDialer) Dial(network string, addr string) (net.Conn, error) } if err := connectReq.Write(conn); err != nil { - conn.Close() + if err := conn.Close(); err != nil { + log.Printf("httpProxyDialer: failed to close connection: %v", err) + } return nil, err } @@ -64,12 +69,16 @@ func (hpd *httpProxyDialer) Dial(network string, addr string) (net.Conn, error) br := bufio.NewReader(conn) resp, err := http.ReadResponse(br, connectReq) if err != nil { - conn.Close() + if err := conn.Close(); err != nil { + log.Printf("httpProxyDialer: failed to close connection: %v", err) + } return nil, err } if resp.StatusCode != 200 { - conn.Close() + if err := conn.Close(); err != nil { + log.Printf("httpProxyDialer: failed to close connection: %v", err) + } f := strings.SplitN(resp.Status, " ", 2) return nil, errors.New(f[1]) } diff --git a/vendor/github.com/gorilla/websocket/server.go b/vendor/github.com/gorilla/websocket/server.go index 24d53b38a..1e720e1da 100644 --- a/vendor/github.com/gorilla/websocket/server.go +++ b/vendor/github.com/gorilla/websocket/server.go @@ -8,6 +8,7 @@ import ( "bufio" "errors" "io" + "log" "net/http" "net/url" "strings" @@ -154,8 +155,8 @@ func (u *Upgrader) Upgrade(w http.ResponseWriter, r *http.Request, responseHeade } challengeKey := r.Header.Get("Sec-Websocket-Key") - if challengeKey == "" { - return u.returnError(w, r, http.StatusBadRequest, "websocket: not a websocket handshake: 'Sec-WebSocket-Key' header is missing or blank") + if !isValidChallengeKey(challengeKey) { + return u.returnError(w, r, http.StatusBadRequest, "websocket: not a websocket handshake: 'Sec-WebSocket-Key' header must be Base64 encoded value of 16-byte in length") } subprotocol := u.selectSubprotocol(r, responseHeader) @@ -183,7 +184,9 @@ func (u *Upgrader) Upgrade(w http.ResponseWriter, r *http.Request, responseHeade } if brw.Reader.Buffered() > 0 { - netConn.Close() + if err := netConn.Close(); err != nil { + log.Printf("websocket: failed to close network connection: %v", err) + } return nil, errors.New("websocket: client sent data before handshake is complete") } @@ -248,17 +251,34 @@ func (u *Upgrader) Upgrade(w http.ResponseWriter, r *http.Request, responseHeade p = append(p, "\r\n"...) // Clear deadlines set by HTTP server. - netConn.SetDeadline(time.Time{}) + if err := netConn.SetDeadline(time.Time{}); err != nil { + if err := netConn.Close(); err != nil { + log.Printf("websocket: failed to close network connection: %v", err) + } + return nil, err + } if u.HandshakeTimeout > 0 { - netConn.SetWriteDeadline(time.Now().Add(u.HandshakeTimeout)) + if err := netConn.SetWriteDeadline(time.Now().Add(u.HandshakeTimeout)); err != nil { + if err := netConn.Close(); err != nil { + log.Printf("websocket: failed to close network connection: %v", err) + } + return nil, err + } } if _, err = netConn.Write(p); err != nil { - netConn.Close() + if err := netConn.Close(); err != nil { + log.Printf("websocket: failed to close network connection: %v", err) + } return nil, err } if u.HandshakeTimeout > 0 { - netConn.SetWriteDeadline(time.Time{}) + if err := netConn.SetWriteDeadline(time.Time{}); err != nil { + if err := netConn.Close(); err != nil { + log.Printf("websocket: failed to close network connection: %v", err) + } + return nil, err + } } return c, nil @@ -356,8 +376,12 @@ func bufioWriterBuffer(originalWriter io.Writer, bw *bufio.Writer) []byte { // bufio.Writer's underlying writer. var wh writeHook bw.Reset(&wh) - bw.WriteByte(0) - bw.Flush() + if err := bw.WriteByte(0); err != nil { + panic(err) + } + if err := bw.Flush(); err != nil { + log.Printf("websocket: bufioWriterBuffer: Flush: %v", err) + } bw.Reset(originalWriter) diff --git a/vendor/github.com/gorilla/websocket/tls_handshake.go b/vendor/github.com/gorilla/websocket/tls_handshake.go index a62b68ccb..7f3864534 100644 --- a/vendor/github.com/gorilla/websocket/tls_handshake.go +++ b/vendor/github.com/gorilla/websocket/tls_handshake.go @@ -1,6 +1,3 @@ -//go:build go1.17 -// +build go1.17 - package websocket import ( diff --git a/vendor/github.com/gorilla/websocket/tls_handshake_116.go b/vendor/github.com/gorilla/websocket/tls_handshake_116.go deleted file mode 100644 index e1b2b44f6..000000000 --- a/vendor/github.com/gorilla/websocket/tls_handshake_116.go +++ /dev/null @@ -1,21 +0,0 @@ -//go:build !go1.17 -// +build !go1.17 - -package websocket - -import ( - "context" - "crypto/tls" -) - -func doHandshake(ctx context.Context, tlsConn *tls.Conn, cfg *tls.Config) error { - if err := tlsConn.Handshake(); err != nil { - return err - } - if !cfg.InsecureSkipVerify { - if err := tlsConn.VerifyHostname(cfg.ServerName); err != nil { - return err - } - } - return nil -} diff --git a/vendor/github.com/gorilla/websocket/util.go b/vendor/github.com/gorilla/websocket/util.go index 7bf2f66c6..9b1a629bf 100644 --- a/vendor/github.com/gorilla/websocket/util.go +++ b/vendor/github.com/gorilla/websocket/util.go @@ -6,7 +6,7 @@ package websocket import ( "crypto/rand" - "crypto/sha1" + "crypto/sha1" //#nosec G505 -- (CWE-327) https://datatracker.ietf.org/doc/html/rfc6455#page-54 "encoding/base64" "io" "net/http" @@ -17,7 +17,7 @@ import ( var keyGUID = []byte("258EAFA5-E914-47DA-95CA-C5AB0DC85B11") func computeAcceptKey(challengeKey string) string { - h := sha1.New() + h := sha1.New() //#nosec G401 -- (CWE-326) https://datatracker.ietf.org/doc/html/rfc6455#page-54 h.Write([]byte(challengeKey)) h.Write(keyGUID) return base64.StdEncoding.EncodeToString(h.Sum(nil)) @@ -281,3 +281,18 @@ headers: } return result } + +// isValidChallengeKey checks if the argument meets RFC6455 specification. +func isValidChallengeKey(s string) bool { + // From RFC6455: + // + // A |Sec-WebSocket-Key| header field with a base64-encoded (see + // Section 4 of [RFC4648]) value that, when decoded, is 16 bytes in + // length. + + if s == "" { + return false + } + decoded, err := base64.StdEncoding.DecodeString(s) + return err == nil && len(decoded) == 16 +} diff --git a/vendor/github.com/gorilla/websocket/x_net_proxy.go b/vendor/github.com/gorilla/websocket/x_net_proxy.go deleted file mode 100644 index 2e668f6b8..000000000 --- a/vendor/github.com/gorilla/websocket/x_net_proxy.go +++ /dev/null @@ -1,473 +0,0 @@ -// Code generated by golang.org/x/tools/cmd/bundle. DO NOT EDIT. -//go:generate bundle -o x_net_proxy.go golang.org/x/net/proxy - -// Package proxy provides support for a variety of protocols to proxy network -// data. -// - -package websocket - -import ( - "errors" - "io" - "net" - "net/url" - "os" - "strconv" - "strings" - "sync" -) - -type proxy_direct struct{} - -// Direct is a direct proxy: one that makes network connections directly. -var proxy_Direct = proxy_direct{} - -func (proxy_direct) Dial(network, addr string) (net.Conn, error) { - return net.Dial(network, addr) -} - -// A PerHost directs connections to a default Dialer unless the host name -// requested matches one of a number of exceptions. -type proxy_PerHost struct { - def, bypass proxy_Dialer - - bypassNetworks []*net.IPNet - bypassIPs []net.IP - bypassZones []string - bypassHosts []string -} - -// NewPerHost returns a PerHost Dialer that directs connections to either -// defaultDialer or bypass, depending on whether the connection matches one of -// the configured rules. -func proxy_NewPerHost(defaultDialer, bypass proxy_Dialer) *proxy_PerHost { - return &proxy_PerHost{ - def: defaultDialer, - bypass: bypass, - } -} - -// Dial connects to the address addr on the given network through either -// defaultDialer or bypass. -func (p *proxy_PerHost) Dial(network, addr string) (c net.Conn, err error) { - host, _, err := net.SplitHostPort(addr) - if err != nil { - return nil, err - } - - return p.dialerForRequest(host).Dial(network, addr) -} - -func (p *proxy_PerHost) dialerForRequest(host string) proxy_Dialer { - if ip := net.ParseIP(host); ip != nil { - for _, net := range p.bypassNetworks { - if net.Contains(ip) { - return p.bypass - } - } - for _, bypassIP := range p.bypassIPs { - if bypassIP.Equal(ip) { - return p.bypass - } - } - return p.def - } - - for _, zone := range p.bypassZones { - if strings.HasSuffix(host, zone) { - return p.bypass - } - if host == zone[1:] { - // For a zone ".example.com", we match "example.com" - // too. - return p.bypass - } - } - for _, bypassHost := range p.bypassHosts { - if bypassHost == host { - return p.bypass - } - } - return p.def -} - -// AddFromString parses a string that contains comma-separated values -// specifying hosts that should use the bypass proxy. Each value is either an -// IP address, a CIDR range, a zone (*.example.com) or a host name -// (localhost). A best effort is made to parse the string and errors are -// ignored. -func (p *proxy_PerHost) AddFromString(s string) { - hosts := strings.Split(s, ",") - for _, host := range hosts { - host = strings.TrimSpace(host) - if len(host) == 0 { - continue - } - if strings.Contains(host, "/") { - // We assume that it's a CIDR address like 127.0.0.0/8 - if _, net, err := net.ParseCIDR(host); err == nil { - p.AddNetwork(net) - } - continue - } - if ip := net.ParseIP(host); ip != nil { - p.AddIP(ip) - continue - } - if strings.HasPrefix(host, "*.") { - p.AddZone(host[1:]) - continue - } - p.AddHost(host) - } -} - -// AddIP specifies an IP address that will use the bypass proxy. Note that -// this will only take effect if a literal IP address is dialed. A connection -// to a named host will never match an IP. -func (p *proxy_PerHost) AddIP(ip net.IP) { - p.bypassIPs = append(p.bypassIPs, ip) -} - -// AddNetwork specifies an IP range that will use the bypass proxy. Note that -// this will only take effect if a literal IP address is dialed. A connection -// to a named host will never match. -func (p *proxy_PerHost) AddNetwork(net *net.IPNet) { - p.bypassNetworks = append(p.bypassNetworks, net) -} - -// AddZone specifies a DNS suffix that will use the bypass proxy. A zone of -// "example.com" matches "example.com" and all of its subdomains. -func (p *proxy_PerHost) AddZone(zone string) { - if strings.HasSuffix(zone, ".") { - zone = zone[:len(zone)-1] - } - if !strings.HasPrefix(zone, ".") { - zone = "." + zone - } - p.bypassZones = append(p.bypassZones, zone) -} - -// AddHost specifies a host name that will use the bypass proxy. -func (p *proxy_PerHost) AddHost(host string) { - if strings.HasSuffix(host, ".") { - host = host[:len(host)-1] - } - p.bypassHosts = append(p.bypassHosts, host) -} - -// A Dialer is a means to establish a connection. -type proxy_Dialer interface { - // Dial connects to the given address via the proxy. - Dial(network, addr string) (c net.Conn, err error) -} - -// Auth contains authentication parameters that specific Dialers may require. -type proxy_Auth struct { - User, Password string -} - -// FromEnvironment returns the dialer specified by the proxy related variables in -// the environment. -func proxy_FromEnvironment() proxy_Dialer { - allProxy := proxy_allProxyEnv.Get() - if len(allProxy) == 0 { - return proxy_Direct - } - - proxyURL, err := url.Parse(allProxy) - if err != nil { - return proxy_Direct - } - proxy, err := proxy_FromURL(proxyURL, proxy_Direct) - if err != nil { - return proxy_Direct - } - - noProxy := proxy_noProxyEnv.Get() - if len(noProxy) == 0 { - return proxy - } - - perHost := proxy_NewPerHost(proxy, proxy_Direct) - perHost.AddFromString(noProxy) - return perHost -} - -// proxySchemes is a map from URL schemes to a function that creates a Dialer -// from a URL with such a scheme. -var proxy_proxySchemes map[string]func(*url.URL, proxy_Dialer) (proxy_Dialer, error) - -// RegisterDialerType takes a URL scheme and a function to generate Dialers from -// a URL with that scheme and a forwarding Dialer. Registered schemes are used -// by FromURL. -func proxy_RegisterDialerType(scheme string, f func(*url.URL, proxy_Dialer) (proxy_Dialer, error)) { - if proxy_proxySchemes == nil { - proxy_proxySchemes = make(map[string]func(*url.URL, proxy_Dialer) (proxy_Dialer, error)) - } - proxy_proxySchemes[scheme] = f -} - -// FromURL returns a Dialer given a URL specification and an underlying -// Dialer for it to make network requests. -func proxy_FromURL(u *url.URL, forward proxy_Dialer) (proxy_Dialer, error) { - var auth *proxy_Auth - if u.User != nil { - auth = new(proxy_Auth) - auth.User = u.User.Username() - if p, ok := u.User.Password(); ok { - auth.Password = p - } - } - - switch u.Scheme { - case "socks5": - return proxy_SOCKS5("tcp", u.Host, auth, forward) - } - - // If the scheme doesn't match any of the built-in schemes, see if it - // was registered by another package. - if proxy_proxySchemes != nil { - if f, ok := proxy_proxySchemes[u.Scheme]; ok { - return f(u, forward) - } - } - - return nil, errors.New("proxy: unknown scheme: " + u.Scheme) -} - -var ( - proxy_allProxyEnv = &proxy_envOnce{ - names: []string{"ALL_PROXY", "all_proxy"}, - } - proxy_noProxyEnv = &proxy_envOnce{ - names: []string{"NO_PROXY", "no_proxy"}, - } -) - -// envOnce looks up an environment variable (optionally by multiple -// names) once. It mitigates expensive lookups on some platforms -// (e.g. Windows). -// (Borrowed from net/http/transport.go) -type proxy_envOnce struct { - names []string - once sync.Once - val string -} - -func (e *proxy_envOnce) Get() string { - e.once.Do(e.init) - return e.val -} - -func (e *proxy_envOnce) init() { - for _, n := range e.names { - e.val = os.Getenv(n) - if e.val != "" { - return - } - } -} - -// SOCKS5 returns a Dialer that makes SOCKSv5 connections to the given address -// with an optional username and password. See RFC 1928 and RFC 1929. -func proxy_SOCKS5(network, addr string, auth *proxy_Auth, forward proxy_Dialer) (proxy_Dialer, error) { - s := &proxy_socks5{ - network: network, - addr: addr, - forward: forward, - } - if auth != nil { - s.user = auth.User - s.password = auth.Password - } - - return s, nil -} - -type proxy_socks5 struct { - user, password string - network, addr string - forward proxy_Dialer -} - -const proxy_socks5Version = 5 - -const ( - proxy_socks5AuthNone = 0 - proxy_socks5AuthPassword = 2 -) - -const proxy_socks5Connect = 1 - -const ( - proxy_socks5IP4 = 1 - proxy_socks5Domain = 3 - proxy_socks5IP6 = 4 -) - -var proxy_socks5Errors = []string{ - "", - "general failure", - "connection forbidden", - "network unreachable", - "host unreachable", - "connection refused", - "TTL expired", - "command not supported", - "address type not supported", -} - -// Dial connects to the address addr on the given network via the SOCKS5 proxy. -func (s *proxy_socks5) Dial(network, addr string) (net.Conn, error) { - switch network { - case "tcp", "tcp6", "tcp4": - default: - return nil, errors.New("proxy: no support for SOCKS5 proxy connections of type " + network) - } - - conn, err := s.forward.Dial(s.network, s.addr) - if err != nil { - return nil, err - } - if err := s.connect(conn, addr); err != nil { - conn.Close() - return nil, err - } - return conn, nil -} - -// connect takes an existing connection to a socks5 proxy server, -// and commands the server to extend that connection to target, -// which must be a canonical address with a host and port. -func (s *proxy_socks5) connect(conn net.Conn, target string) error { - host, portStr, err := net.SplitHostPort(target) - if err != nil { - return err - } - - port, err := strconv.Atoi(portStr) - if err != nil { - return errors.New("proxy: failed to parse port number: " + portStr) - } - if port < 1 || port > 0xffff { - return errors.New("proxy: port number out of range: " + portStr) - } - - // the size here is just an estimate - buf := make([]byte, 0, 6+len(host)) - - buf = append(buf, proxy_socks5Version) - if len(s.user) > 0 && len(s.user) < 256 && len(s.password) < 256 { - buf = append(buf, 2 /* num auth methods */, proxy_socks5AuthNone, proxy_socks5AuthPassword) - } else { - buf = append(buf, 1 /* num auth methods */, proxy_socks5AuthNone) - } - - if _, err := conn.Write(buf); err != nil { - return errors.New("proxy: failed to write greeting to SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - if _, err := io.ReadFull(conn, buf[:2]); err != nil { - return errors.New("proxy: failed to read greeting from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - if buf[0] != 5 { - return errors.New("proxy: SOCKS5 proxy at " + s.addr + " has unexpected version " + strconv.Itoa(int(buf[0]))) - } - if buf[1] == 0xff { - return errors.New("proxy: SOCKS5 proxy at " + s.addr + " requires authentication") - } - - // See RFC 1929 - if buf[1] == proxy_socks5AuthPassword { - buf = buf[:0] - buf = append(buf, 1 /* password protocol version */) - buf = append(buf, uint8(len(s.user))) - buf = append(buf, s.user...) - buf = append(buf, uint8(len(s.password))) - buf = append(buf, s.password...) - - if _, err := conn.Write(buf); err != nil { - return errors.New("proxy: failed to write authentication request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - if _, err := io.ReadFull(conn, buf[:2]); err != nil { - return errors.New("proxy: failed to read authentication reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - if buf[1] != 0 { - return errors.New("proxy: SOCKS5 proxy at " + s.addr + " rejected username/password") - } - } - - buf = buf[:0] - buf = append(buf, proxy_socks5Version, proxy_socks5Connect, 0 /* reserved */) - - if ip := net.ParseIP(host); ip != nil { - if ip4 := ip.To4(); ip4 != nil { - buf = append(buf, proxy_socks5IP4) - ip = ip4 - } else { - buf = append(buf, proxy_socks5IP6) - } - buf = append(buf, ip...) - } else { - if len(host) > 255 { - return errors.New("proxy: destination host name too long: " + host) - } - buf = append(buf, proxy_socks5Domain) - buf = append(buf, byte(len(host))) - buf = append(buf, host...) - } - buf = append(buf, byte(port>>8), byte(port)) - - if _, err := conn.Write(buf); err != nil { - return errors.New("proxy: failed to write connect request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - if _, err := io.ReadFull(conn, buf[:4]); err != nil { - return errors.New("proxy: failed to read connect reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - failure := "unknown error" - if int(buf[1]) < len(proxy_socks5Errors) { - failure = proxy_socks5Errors[buf[1]] - } - - if len(failure) > 0 { - return errors.New("proxy: SOCKS5 proxy at " + s.addr + " failed to connect: " + failure) - } - - bytesToDiscard := 0 - switch buf[3] { - case proxy_socks5IP4: - bytesToDiscard = net.IPv4len - case proxy_socks5IP6: - bytesToDiscard = net.IPv6len - case proxy_socks5Domain: - _, err := io.ReadFull(conn, buf[:1]) - if err != nil { - return errors.New("proxy: failed to read domain length from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - bytesToDiscard = int(buf[0]) - default: - return errors.New("proxy: got unknown address type " + strconv.Itoa(int(buf[3])) + " from SOCKS5 proxy at " + s.addr) - } - - if cap(buf) < bytesToDiscard { - buf = make([]byte, bytesToDiscard) - } else { - buf = buf[:bytesToDiscard] - } - if _, err := io.ReadFull(conn, buf); err != nil { - return errors.New("proxy: failed to read address from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - // Also need to discard the port number - if _, err := io.ReadFull(conn, buf[:2]); err != nil { - return errors.New("proxy: failed to read port from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - return nil -} diff --git a/vendor/github.com/hashicorp/golang-lru/v2/2q.go b/vendor/github.com/hashicorp/golang-lru/v2/2q.go index 5e00d9a7d..8c95252b6 100644 --- a/vendor/github.com/hashicorp/golang-lru/v2/2q.go +++ b/vendor/github.com/hashicorp/golang-lru/v2/2q.go @@ -30,8 +30,10 @@ const ( // head. The ARCCache is similar, but does not require setting any // parameters. type TwoQueueCache[K comparable, V any] struct { - size int - recentSize int + size int + recentSize int + recentRatio float64 + ghostRatio float64 recent simplelru.LRUCache[K, V] frequent simplelru.LRUCache[K, V] @@ -80,6 +82,8 @@ func New2QParams[K comparable, V any](size int, recentRatio, ghostRatio float64) c := &TwoQueueCache[K, V]{ size: size, recentSize: recentSize, + recentRatio: recentRatio, + ghostRatio: ghostRatio, recent: recent, frequent: frequent, recentEvict: recentEvict, @@ -171,6 +175,34 @@ func (c *TwoQueueCache[K, V]) Len() int { return c.recent.Len() + c.frequent.Len() } +// Resize changes the cache size. +func (c *TwoQueueCache[K, V]) Resize(size int) (evicted int) { + c.lock.Lock() + defer c.lock.Unlock() + + // Recalculate the sub-sizes + recentSize := int(float64(size) * c.recentRatio) + evictSize := int(float64(size) * c.ghostRatio) + c.size = size + c.recentSize = recentSize + + // ensureSpace + diff := c.recent.Len() + c.frequent.Len() - size + if diff < 0 { + diff = 0 + } + for i := 0; i < diff; i++ { + c.ensureSpace(true) + } + + // Reallocate the LRUs + c.recent.Resize(size) + c.frequent.Resize(size) + c.recentEvict.Resize(evictSize) + + return diff +} + // Keys returns a slice of the keys in the cache. // The frequently used keys are first in the returned slice. func (c *TwoQueueCache[K, V]) Keys() []K { diff --git a/vendor/github.com/hashicorp/golang-lru/v2/simplelru/lru.go b/vendor/github.com/hashicorp/golang-lru/v2/simplelru/lru.go index 408239c45..f69792388 100644 --- a/vendor/github.com/hashicorp/golang-lru/v2/simplelru/lru.go +++ b/vendor/github.com/hashicorp/golang-lru/v2/simplelru/lru.go @@ -51,9 +51,6 @@ func (c *LRU[K, V]) Add(key K, value V) (evicted bool) { // Check for existing item if ent, ok := c.items[key]; ok { c.evictList.MoveToFront(ent) - if c.onEvict != nil { - c.onEvict(key, ent.Value) - } ent.Value = value return false } diff --git a/vendor/github.com/klauspost/compress/.goreleaser.yml b/vendor/github.com/klauspost/compress/.goreleaser.yml index 4c28dff46..a22953805 100644 --- a/vendor/github.com/klauspost/compress/.goreleaser.yml +++ b/vendor/github.com/klauspost/compress/.goreleaser.yml @@ -3,7 +3,6 @@ before: hooks: - ./gen.sh - - go install mvdan.cc/garble@v0.10.1 builds: - @@ -32,7 +31,6 @@ builds: - mips64le goarm: - 7 - gobinary: garble - id: "s2d" binary: s2d @@ -59,7 +57,6 @@ builds: - mips64le goarm: - 7 - gobinary: garble - id: "s2sx" binary: s2sx @@ -87,7 +84,6 @@ builds: - mips64le goarm: - 7 - gobinary: garble archives: - diff --git a/vendor/github.com/klauspost/compress/README.md b/vendor/github.com/klauspost/compress/README.md index 43de48677..05c7359e4 100644 --- a/vendor/github.com/klauspost/compress/README.md +++ b/vendor/github.com/klauspost/compress/README.md @@ -16,6 +16,38 @@ This package provides various compression algorithms. # changelog +* Feb 5th, 2024 - [1.17.6](https://github.com/klauspost/compress/releases/tag/v1.17.6) + * zstd: Fix incorrect repeat coding in best mode https://github.com/klauspost/compress/pull/923 + * s2: Fix DecodeConcurrent deadlock on errors https://github.com/klauspost/compress/pull/925 + +* Jan 26th, 2024 - [v1.17.5](https://github.com/klauspost/compress/releases/tag/v1.17.5) + * flate: Fix reset with dictionary on custom window encodes https://github.com/klauspost/compress/pull/912 + * zstd: Add Frame header encoding and stripping https://github.com/klauspost/compress/pull/908 + * zstd: Limit better/best default window to 8MB https://github.com/klauspost/compress/pull/913 + * zstd: Speed improvements by @greatroar in https://github.com/klauspost/compress/pull/896 https://github.com/klauspost/compress/pull/910 + * s2: Fix callbacks for skippable blocks and disallow 0xfe (Padding) by @Jille in https://github.com/klauspost/compress/pull/916 https://github.com/klauspost/compress/pull/917 +https://github.com/klauspost/compress/pull/919 https://github.com/klauspost/compress/pull/918 + +* Dec 1st, 2023 - [v1.17.4](https://github.com/klauspost/compress/releases/tag/v1.17.4) + * huff0: Speed up symbol counting by @greatroar in https://github.com/klauspost/compress/pull/887 + * huff0: Remove byteReader by @greatroar in https://github.com/klauspost/compress/pull/886 + * gzhttp: Allow overriding decompression on transport https://github.com/klauspost/compress/pull/892 + * gzhttp: Clamp compression level https://github.com/klauspost/compress/pull/890 + * gzip: Error out if reserved bits are set https://github.com/klauspost/compress/pull/891 + +* Nov 15th, 2023 - [v1.17.3](https://github.com/klauspost/compress/releases/tag/v1.17.3) + * fse: Fix max header size https://github.com/klauspost/compress/pull/881 + * zstd: Improve better/best compression https://github.com/klauspost/compress/pull/877 + * gzhttp: Fix missing content type on Close https://github.com/klauspost/compress/pull/883 + +* Oct 22nd, 2023 - [v1.17.2](https://github.com/klauspost/compress/releases/tag/v1.17.2) + * zstd: Fix rare *CORRUPTION* output in "best" mode. See https://github.com/klauspost/compress/pull/876 + +* Oct 14th, 2023 - [v1.17.1](https://github.com/klauspost/compress/releases/tag/v1.17.1) + * s2: Fix S2 "best" dictionary wrong encoding by @klauspost in https://github.com/klauspost/compress/pull/871 + * flate: Reduce allocations in decompressor and minor code improvements by @fakefloordiv in https://github.com/klauspost/compress/pull/869 + * s2: Fix EstimateBlockSize on 6&7 length input by @klauspost in https://github.com/klauspost/compress/pull/867 + * Sept 19th, 2023 - [v1.17.0](https://github.com/klauspost/compress/releases/tag/v1.17.0) * Add experimental dictionary builder https://github.com/klauspost/compress/pull/853 * Add xerial snappy read/writer https://github.com/klauspost/compress/pull/838 @@ -23,6 +55,10 @@ This package provides various compression algorithms. * s2: Do 2 overlapping match checks https://github.com/klauspost/compress/pull/839 * flate: Add amd64 assembly matchlen https://github.com/klauspost/compress/pull/837 * gzip: Copy bufio.Reader on Reset by @thatguystone in https://github.com/klauspost/compress/pull/860 + +
+ See changes to v1.16.x + * July 1st, 2023 - [v1.16.7](https://github.com/klauspost/compress/releases/tag/v1.16.7) * zstd: Fix default level first dictionary encode https://github.com/klauspost/compress/pull/829 @@ -61,6 +97,7 @@ This package provides various compression algorithms. * s2: Add LZ4 block converter. https://github.com/klauspost/compress/pull/748 * s2: Support io.ReaderAt in ReadSeeker. https://github.com/klauspost/compress/pull/747 * s2c/s2sx: Use concurrent decoding. https://github.com/klauspost/compress/pull/746 +
See changes to v1.15.x @@ -528,6 +565,8 @@ the stateless compress described below. For compression performance, see: [this spreadsheet](https://docs.google.com/spreadsheets/d/1nuNE2nPfuINCZJRMt6wFWhKpToF95I47XjSsc-1rbPQ/edit?usp=sharing). +To disable all assembly add `-tags=noasm`. This works across all packages. + # Stateless compression This package offers stateless compression as a special option for gzip/deflate. @@ -546,7 +585,7 @@ For direct deflate use, NewStatelessWriter and StatelessDeflate are available. S A `bufio.Writer` can of course be used to control write sizes. For example, to use a 4KB buffer: -``` +```go // replace 'ioutil.Discard' with your output. gzw, err := gzip.NewWriterLevel(ioutil.Discard, gzip.StatelessCompression) if err != nil { diff --git a/vendor/github.com/klauspost/compress/fse/compress.go b/vendor/github.com/klauspost/compress/fse/compress.go index 65d777357..074018d8f 100644 --- a/vendor/github.com/klauspost/compress/fse/compress.go +++ b/vendor/github.com/klauspost/compress/fse/compress.go @@ -212,7 +212,7 @@ func (s *Scratch) writeCount() error { previous0 bool charnum uint16 - maxHeaderSize = ((int(s.symbolLen) * int(tableLog)) >> 3) + 3 + maxHeaderSize = ((int(s.symbolLen)*int(tableLog) + 4 + 2) >> 3) + 3 // Write Table Size bitStream = uint32(tableLog - minTablelog) diff --git a/vendor/github.com/klauspost/compress/huff0/bytereader.go b/vendor/github.com/klauspost/compress/huff0/bytereader.go deleted file mode 100644 index 4dcab8d23..000000000 --- a/vendor/github.com/klauspost/compress/huff0/bytereader.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2018 Klaus Post. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. -// Based on work Copyright (c) 2013, Yann Collet, released under BSD License. - -package huff0 - -// byteReader provides a byte reader that reads -// little endian values from a byte stream. -// The input stream is manually advanced. -// The reader performs no bounds checks. -type byteReader struct { - b []byte - off int -} - -// init will initialize the reader and set the input. -func (b *byteReader) init(in []byte) { - b.b = in - b.off = 0 -} - -// Int32 returns a little endian int32 starting at current offset. -func (b byteReader) Int32() int32 { - v3 := int32(b.b[b.off+3]) - v2 := int32(b.b[b.off+2]) - v1 := int32(b.b[b.off+1]) - v0 := int32(b.b[b.off]) - return (v3 << 24) | (v2 << 16) | (v1 << 8) | v0 -} - -// Uint32 returns a little endian uint32 starting at current offset. -func (b byteReader) Uint32() uint32 { - v3 := uint32(b.b[b.off+3]) - v2 := uint32(b.b[b.off+2]) - v1 := uint32(b.b[b.off+1]) - v0 := uint32(b.b[b.off]) - return (v3 << 24) | (v2 << 16) | (v1 << 8) | v0 -} - -// remain will return the number of bytes remaining. -func (b byteReader) remain() int { - return len(b.b) - b.off -} diff --git a/vendor/github.com/klauspost/compress/huff0/compress.go b/vendor/github.com/klauspost/compress/huff0/compress.go index 518436cf3..84aa3d12f 100644 --- a/vendor/github.com/klauspost/compress/huff0/compress.go +++ b/vendor/github.com/klauspost/compress/huff0/compress.go @@ -350,6 +350,7 @@ func (s *Scratch) compress4Xp(src []byte) ([]byte, error) { // Does not update s.clearCount. func (s *Scratch) countSimple(in []byte) (max int, reuse bool) { reuse = true + _ = s.count // Assert that s != nil to speed up the following loop. for _, v := range in { s.count[v]++ } @@ -415,7 +416,7 @@ func (s *Scratch) validateTable(c cTable) bool { // minTableLog provides the minimum logSize to safely represent a distribution. func (s *Scratch) minTableLog() uint8 { - minBitsSrc := highBit32(uint32(s.br.remain())) + 1 + minBitsSrc := highBit32(uint32(s.srcLen)) + 1 minBitsSymbols := highBit32(uint32(s.symbolLen-1)) + 2 if minBitsSrc < minBitsSymbols { return uint8(minBitsSrc) @@ -427,7 +428,7 @@ func (s *Scratch) minTableLog() uint8 { func (s *Scratch) optimalTableLog() { tableLog := s.TableLog minBits := s.minTableLog() - maxBitsSrc := uint8(highBit32(uint32(s.br.remain()-1))) - 1 + maxBitsSrc := uint8(highBit32(uint32(s.srcLen-1))) - 1 if maxBitsSrc < tableLog { // Accuracy can be reduced tableLog = maxBitsSrc diff --git a/vendor/github.com/klauspost/compress/huff0/huff0.go b/vendor/github.com/klauspost/compress/huff0/huff0.go index e8ad17ad0..77ecd68e0 100644 --- a/vendor/github.com/klauspost/compress/huff0/huff0.go +++ b/vendor/github.com/klauspost/compress/huff0/huff0.go @@ -88,7 +88,7 @@ type Scratch struct { // Decoders will return ErrMaxDecodedSizeExceeded is this limit is exceeded. MaxDecodedSize int - br byteReader + srcLen int // MaxSymbolValue will override the maximum symbol value of the next block. MaxSymbolValue uint8 @@ -170,7 +170,7 @@ func (s *Scratch) prepare(in []byte) (*Scratch, error) { if s.fse == nil { s.fse = &fse.Scratch{} } - s.br.init(in) + s.srcLen = len(in) return s, nil } diff --git a/vendor/github.com/klauspost/compress/internal/snapref/encode_other.go b/vendor/github.com/klauspost/compress/internal/snapref/encode_other.go index 2aa6a95a0..2754bac6f 100644 --- a/vendor/github.com/klauspost/compress/internal/snapref/encode_other.go +++ b/vendor/github.com/klauspost/compress/internal/snapref/encode_other.go @@ -51,7 +51,7 @@ func emitCopy(dst []byte, offset, length int) int { i := 0 // The maximum length for a single tagCopy1 or tagCopy2 op is 64 bytes. The // threshold for this loop is a little higher (at 68 = 64 + 4), and the - // length emitted down below is is a little lower (at 60 = 64 - 4), because + // length emitted down below is a little lower (at 60 = 64 - 4), because // it's shorter to encode a length 67 copy as a length 60 tagCopy2 followed // by a length 7 tagCopy1 (which encodes as 3+2 bytes) than to encode it as // a length 64 tagCopy2 followed by a length 3 tagCopy2 (which encodes as diff --git a/vendor/github.com/klauspost/compress/s2sx.mod b/vendor/github.com/klauspost/compress/s2sx.mod index 2263853fc..5a4412f90 100644 --- a/vendor/github.com/klauspost/compress/s2sx.mod +++ b/vendor/github.com/klauspost/compress/s2sx.mod @@ -1,4 +1,4 @@ module github.com/klauspost/compress -go 1.16 +go 1.19 diff --git a/vendor/github.com/klauspost/compress/zstd/README.md b/vendor/github.com/klauspost/compress/zstd/README.md index bdd49c8b2..92e2347bb 100644 --- a/vendor/github.com/klauspost/compress/zstd/README.md +++ b/vendor/github.com/klauspost/compress/zstd/README.md @@ -259,7 +259,7 @@ nyc-taxi-data-10M.csv gzkp 1 3325605752 922273214 13929 227.68 ## Decompressor -Staus: STABLE - there may still be subtle bugs, but a wide variety of content has been tested. +Status: STABLE - there may still be subtle bugs, but a wide variety of content has been tested. This library is being continuously [fuzz-tested](https://github.com/klauspost/compress-fuzz), kindly supplied by [fuzzit.dev](https://fuzzit.dev/). diff --git a/vendor/github.com/klauspost/compress/zstd/blockdec.go b/vendor/github.com/klauspost/compress/zstd/blockdec.go index 9f17ce601..03744fbc7 100644 --- a/vendor/github.com/klauspost/compress/zstd/blockdec.go +++ b/vendor/github.com/klauspost/compress/zstd/blockdec.go @@ -554,6 +554,9 @@ func (b *blockDec) prepareSequences(in []byte, hist *history) (err error) { if debugDecoder { printf("Compression modes: 0b%b", compMode) } + if compMode&3 != 0 { + return errors.New("corrupt block: reserved bits not zero") + } for i := uint(0); i < 3; i++ { mode := seqCompMode((compMode >> (6 - i*2)) & 3) if debugDecoder { diff --git a/vendor/github.com/klauspost/compress/zstd/blockenc.go b/vendor/github.com/klauspost/compress/zstd/blockenc.go index 2cfe925ad..32a7f401d 100644 --- a/vendor/github.com/klauspost/compress/zstd/blockenc.go +++ b/vendor/github.com/klauspost/compress/zstd/blockenc.go @@ -427,6 +427,16 @@ func (b *blockEnc) encodeLits(lits []byte, raw bool) error { return nil } +// encodeRLE will encode an RLE block. +func (b *blockEnc) encodeRLE(val byte, length uint32) { + var bh blockHeader + bh.setLast(b.last) + bh.setSize(length) + bh.setType(blockTypeRLE) + b.output = bh.appendTo(b.output) + b.output = append(b.output, val) +} + // fuzzFseEncoder can be used to fuzz the FSE encoder. func fuzzFseEncoder(data []byte) int { if len(data) > maxSequences || len(data) < 2 { @@ -479,6 +489,16 @@ func (b *blockEnc) encode(org []byte, raw, rawAllLits bool) error { if len(b.sequences) == 0 { return b.encodeLits(b.literals, rawAllLits) } + if len(b.sequences) == 1 && len(org) > 0 && len(b.literals) <= 1 { + // Check common RLE cases. + seq := b.sequences[0] + if seq.litLen == uint32(len(b.literals)) && seq.offset-3 == 1 { + // Offset == 1 and 0 or 1 literals. + b.encodeRLE(org[0], b.sequences[0].matchLen+zstdMinMatch+seq.litLen) + return nil + } + } + // We want some difference to at least account for the headers. saved := b.size - len(b.literals) - (b.size >> 6) if saved < 16 { diff --git a/vendor/github.com/klauspost/compress/zstd/decodeheader.go b/vendor/github.com/klauspost/compress/zstd/decodeheader.go index f6a240970..6a5a2988b 100644 --- a/vendor/github.com/klauspost/compress/zstd/decodeheader.go +++ b/vendor/github.com/klauspost/compress/zstd/decodeheader.go @@ -95,42 +95,54 @@ type Header struct { // If there isn't enough input, io.ErrUnexpectedEOF is returned. // The FirstBlock.OK will indicate if enough information was available to decode the first block header. func (h *Header) Decode(in []byte) error { + _, err := h.DecodeAndStrip(in) + return err +} + +// DecodeAndStrip will decode the header from the beginning of the stream +// and on success return the remaining bytes. +// This will decode the frame header and the first block header if enough bytes are provided. +// It is recommended to provide at least HeaderMaxSize bytes. +// If the frame header cannot be read an error will be returned. +// If there isn't enough input, io.ErrUnexpectedEOF is returned. +// The FirstBlock.OK will indicate if enough information was available to decode the first block header. +func (h *Header) DecodeAndStrip(in []byte) (remain []byte, err error) { *h = Header{} if len(in) < 4 { - return io.ErrUnexpectedEOF + return nil, io.ErrUnexpectedEOF } h.HeaderSize += 4 b, in := in[:4], in[4:] if string(b) != frameMagic { if string(b[1:4]) != skippableFrameMagic || b[0]&0xf0 != 0x50 { - return ErrMagicMismatch + return nil, ErrMagicMismatch } if len(in) < 4 { - return io.ErrUnexpectedEOF + return nil, io.ErrUnexpectedEOF } h.HeaderSize += 4 h.Skippable = true h.SkippableID = int(b[0] & 0xf) h.SkippableSize = binary.LittleEndian.Uint32(in) - return nil + return in[4:], nil } // Read Window_Descriptor // https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#window_descriptor if len(in) < 1 { - return io.ErrUnexpectedEOF + return nil, io.ErrUnexpectedEOF } fhd, in := in[0], in[1:] h.HeaderSize++ h.SingleSegment = fhd&(1<<5) != 0 h.HasCheckSum = fhd&(1<<2) != 0 if fhd&(1<<3) != 0 { - return errors.New("reserved bit set on frame header") + return nil, errors.New("reserved bit set on frame header") } if !h.SingleSegment { if len(in) < 1 { - return io.ErrUnexpectedEOF + return nil, io.ErrUnexpectedEOF } var wd byte wd, in = in[0], in[1:] @@ -148,7 +160,7 @@ func (h *Header) Decode(in []byte) error { size = 4 } if len(in) < int(size) { - return io.ErrUnexpectedEOF + return nil, io.ErrUnexpectedEOF } b, in = in[:size], in[size:] h.HeaderSize += int(size) @@ -178,7 +190,7 @@ func (h *Header) Decode(in []byte) error { if fcsSize > 0 { h.HasFCS = true if len(in) < fcsSize { - return io.ErrUnexpectedEOF + return nil, io.ErrUnexpectedEOF } b, in = in[:fcsSize], in[fcsSize:] h.HeaderSize += int(fcsSize) @@ -199,7 +211,7 @@ func (h *Header) Decode(in []byte) error { // Frame Header done, we will not fail from now on. if len(in) < 3 { - return nil + return in, nil } tmp := in[:3] bh := uint32(tmp[0]) | (uint32(tmp[1]) << 8) | (uint32(tmp[2]) << 16) @@ -209,7 +221,7 @@ func (h *Header) Decode(in []byte) error { cSize := int(bh >> 3) switch blockType { case blockTypeReserved: - return nil + return in, nil case blockTypeRLE: h.FirstBlock.Compressed = true h.FirstBlock.DecompressedSize = cSize @@ -225,5 +237,25 @@ func (h *Header) Decode(in []byte) error { } h.FirstBlock.OK = true - return nil + return in, nil +} + +// AppendTo will append the encoded header to the dst slice. +// There is no error checking performed on the header values. +func (h *Header) AppendTo(dst []byte) ([]byte, error) { + if h.Skippable { + magic := [4]byte{0x50, 0x2a, 0x4d, 0x18} + magic[0] |= byte(h.SkippableID & 0xf) + dst = append(dst, magic[:]...) + f := h.SkippableSize + return append(dst, uint8(f), uint8(f>>8), uint8(f>>16), uint8(f>>24)), nil + } + f := frameHeader{ + ContentSize: h.FrameContentSize, + WindowSize: uint32(h.WindowSize), + SingleSegment: h.SingleSegment, + Checksum: h.HasCheckSum, + DictID: h.DictionaryID, + } + return f.appendTo(dst), nil } diff --git a/vendor/github.com/klauspost/compress/zstd/decoder.go b/vendor/github.com/klauspost/compress/zstd/decoder.go index f04aaa21e..bbca17234 100644 --- a/vendor/github.com/klauspost/compress/zstd/decoder.go +++ b/vendor/github.com/klauspost/compress/zstd/decoder.go @@ -82,7 +82,7 @@ var ( // can run multiple concurrent stateless decodes. It is even possible to // use stateless decodes while a stream is being decoded. // -// The Reset function can be used to initiate a new stream, which is will considerably +// The Reset function can be used to initiate a new stream, which will considerably // reduce the allocations normally caused by NewReader. func NewReader(r io.Reader, opts ...DOption) (*Decoder, error) { initPredefined() diff --git a/vendor/github.com/klauspost/compress/zstd/enc_best.go b/vendor/github.com/klauspost/compress/zstd/enc_best.go index 858f8f43a..4613724e9 100644 --- a/vendor/github.com/klauspost/compress/zstd/enc_best.go +++ b/vendor/github.com/klauspost/compress/zstd/enc_best.go @@ -43,7 +43,7 @@ func (m *match) estBits(bitsPerByte int32) { if m.rep < 0 { ofc = ofCode(uint32(m.s-m.offset) + 3) } else { - ofc = ofCode(uint32(m.rep)) + ofc = ofCode(uint32(m.rep) & 3) } // Cost, excluding ofTT, mlTT := fsePredefEnc[tableOffsets].ct.symbolTT[ofc], fsePredefEnc[tableMatchLengths].ct.symbolTT[mlc] @@ -135,8 +135,20 @@ func (e *bestFastEncoder) Encode(blk *blockEnc, src []byte) { break } + // Add block to history s := e.addBlock(src) blk.size = len(src) + + // Check RLE first + if len(src) > zstdMinMatch { + ml := matchLen(src[1:], src) + if ml == len(src)-1 { + blk.literals = append(blk.literals, src[0]) + blk.sequences = append(blk.sequences, seq{litLen: 1, matchLen: uint32(len(src)-1) - zstdMinMatch, offset: 1 + 3}) + return + } + } + if len(src) < minNonLiteralBlockSize { blk.extraLits = len(src) blk.literals = blk.literals[:len(src)] @@ -201,14 +213,6 @@ encodeLoop: if delta >= e.maxMatchOff || delta <= 0 || load3232(src, offset) != first { return } - if debugAsserts { - if offset >= s { - panic(fmt.Sprintf("offset: %d - s:%d - rep: %d - cur :%d - max: %d", offset, s, rep, e.cur, e.maxMatchOff)) - } - if !bytes.Equal(src[s:s+4], src[offset:offset+4]) { - panic(fmt.Sprintf("first match mismatch: %v != %v, first: %08x", src[s:s+4], src[offset:offset+4], first)) - } - } // Try to quick reject if we already have a long match. if m.length > 16 { left := len(src) - int(m.s+m.length) @@ -227,8 +231,10 @@ encodeLoop: } } l := 4 + e.matchlen(s+4, offset+4, src) - if rep < 0 { + if m.rep <= 0 { // Extend candidate match backwards as far as possible. + // Do not extend repeats as we can assume they are optimal + // and offsets change if s == nextEmit. tMin := s - e.maxMatchOff if tMin < 0 { tMin = 0 @@ -239,7 +245,14 @@ encodeLoop: l++ } } - + if debugAsserts { + if offset >= s { + panic(fmt.Sprintf("offset: %d - s:%d - rep: %d - cur :%d - max: %d", offset, s, rep, e.cur, e.maxMatchOff)) + } + if !bytes.Equal(src[s:s+l], src[offset:offset+l]) { + panic(fmt.Sprintf("second match mismatch: %v != %v, first: %08x", src[s:s+4], src[offset:offset+4], first)) + } + } cand := match{offset: offset, s: s, length: l, rep: rep} cand.estBits(bitsPerByte) if m.est >= highScore || cand.est-m.est+(cand.s-m.s)*bitsPerByte>>10 < 0 { @@ -282,6 +295,7 @@ encodeLoop: // Load next and check... e.longTable[nextHashL] = prevEntry{offset: s + e.cur, prev: candidateL.offset} e.table[nextHashS] = prevEntry{offset: s + e.cur, prev: candidateS.offset} + index0 := s + 1 // Look far ahead, unless we have a really long match already... if best.length < goodEnough { @@ -335,41 +349,45 @@ encodeLoop: } if debugAsserts { + if best.offset >= best.s { + panic(fmt.Sprintf("best.offset > s: %d >= %d", best.offset, best.s)) + } + if best.s < nextEmit { + panic(fmt.Sprintf("s %d < nextEmit %d", best.s, nextEmit)) + } + if best.offset < s-e.maxMatchOff { + panic(fmt.Sprintf("best.offset < s-e.maxMatchOff: %d < %d", best.offset, s-e.maxMatchOff)) + } if !bytes.Equal(src[best.s:best.s+best.length], src[best.offset:best.offset+best.length]) { panic(fmt.Sprintf("match mismatch: %v != %v", src[best.s:best.s+best.length], src[best.offset:best.offset+best.length])) } } // We have a match, we can store the forward value + s = best.s if best.rep > 0 { var seq seq seq.matchLen = uint32(best.length - zstdMinMatch) - if debugAsserts && s < nextEmit { - panic("s < nextEmit") - } addLiterals(&seq, best.s) // Repeat. If bit 4 is set, this is a non-lit repeat. seq.offset = uint32(best.rep & 3) if debugSequences { - println("repeat sequence", seq, "next s:", s) + println("repeat sequence", seq, "next s:", best.s, "off:", best.s-best.offset) } blk.sequences = append(blk.sequences, seq) // Index old s + 1 -> s - 1 - index0 := s + 1 s = best.s + best.length - nextEmit = s - if s >= sLimit { - if debugEncoder { - println("repeat ended", s, best.length) - } - break encodeLoop - } + // Index skipped... + end := s + if s > sLimit+4 { + end = sLimit + 4 + } off := index0 + e.cur - for index0 < s { + for index0 < end { cv0 := load6432(src, index0) h0 := hashLen(cv0, bestLongTableBits, bestLongLen) h1 := hashLen(cv0, bestShortTableBits, bestShortLen) @@ -378,6 +396,7 @@ encodeLoop: off++ index0++ } + switch best.rep { case 2, 4 | 1: offset1, offset2 = offset2, offset1 @@ -386,13 +405,17 @@ encodeLoop: case 4 | 3: offset1, offset2, offset3 = offset1-1, offset1, offset2 } + if s >= sLimit { + if debugEncoder { + println("repeat ended", s, best.length) + } + break encodeLoop + } continue } // A 4-byte match has been found. Update recent offsets. // We'll later see if more than 4 bytes. - index0 := s + 1 - s = best.s t := best.offset offset1, offset2, offset3 = s-t, offset1, offset2 @@ -419,19 +442,25 @@ encodeLoop: } blk.sequences = append(blk.sequences, seq) nextEmit = s - if s >= sLimit { - break encodeLoop + + // Index old s + 1 -> s - 1 or sLimit + end := s + if s > sLimit-4 { + end = sLimit - 4 } - // Index old s + 1 -> s - 1 - for index0 < s { + off := index0 + e.cur + for index0 < end { cv0 := load6432(src, index0) h0 := hashLen(cv0, bestLongTableBits, bestLongLen) h1 := hashLen(cv0, bestShortTableBits, bestShortLen) - off := index0 + e.cur e.longTable[h0] = prevEntry{offset: off, prev: e.longTable[h0].offset} e.table[h1] = prevEntry{offset: off, prev: e.table[h1].offset} index0++ + off++ + } + if s >= sLimit { + break encodeLoop } } diff --git a/vendor/github.com/klauspost/compress/zstd/enc_better.go b/vendor/github.com/klauspost/compress/zstd/enc_better.go index 8582f31a7..a4f5bf91f 100644 --- a/vendor/github.com/klauspost/compress/zstd/enc_better.go +++ b/vendor/github.com/klauspost/compress/zstd/enc_better.go @@ -102,9 +102,20 @@ func (e *betterFastEncoder) Encode(blk *blockEnc, src []byte) { e.cur = e.maxMatchOff break } - + // Add block to history s := e.addBlock(src) blk.size = len(src) + + // Check RLE first + if len(src) > zstdMinMatch { + ml := matchLen(src[1:], src) + if ml == len(src)-1 { + blk.literals = append(blk.literals, src[0]) + blk.sequences = append(blk.sequences, seq{litLen: 1, matchLen: uint32(len(src)-1) - zstdMinMatch, offset: 1 + 3}) + return + } + } + if len(src) < minNonLiteralBlockSize { blk.extraLits = len(src) blk.literals = blk.literals[:len(src)] @@ -145,7 +156,7 @@ encodeLoop: var t int32 // We allow the encoder to optionally turn off repeat offsets across blocks canRepeat := len(blk.sequences) > 2 - var matched int32 + var matched, index0 int32 for { if debugAsserts && canRepeat && offset1 == 0 { @@ -162,6 +173,7 @@ encodeLoop: off := s + e.cur e.longTable[nextHashL] = prevEntry{offset: off, prev: candidateL.offset} e.table[nextHashS] = tableEntry{offset: off, val: uint32(cv)} + index0 = s + 1 if canRepeat { if repIndex >= 0 && load3232(src, repIndex) == uint32(cv>>(repOff*8)) { @@ -258,7 +270,6 @@ encodeLoop: } blk.sequences = append(blk.sequences, seq) - index0 := s + repOff2 s += lenght + repOff2 nextEmit = s if s >= sLimit { @@ -498,15 +509,15 @@ encodeLoop: } // Index match start+1 (long) -> s - 1 - index0 := s - l + 1 + off := index0 + e.cur for index0 < s-1 { cv0 := load6432(src, index0) cv1 := cv0 >> 8 h0 := hashLen(cv0, betterLongTableBits, betterLongLen) - off := index0 + e.cur e.longTable[h0] = prevEntry{offset: off, prev: e.longTable[h0].offset} e.table[hashLen(cv1, betterShortTableBits, betterShortLen)] = tableEntry{offset: off + 1, val: uint32(cv1)} index0 += 2 + off += 2 } cv = load6432(src, s) @@ -672,7 +683,7 @@ encodeLoop: var t int32 // We allow the encoder to optionally turn off repeat offsets across blocks canRepeat := len(blk.sequences) > 2 - var matched int32 + var matched, index0 int32 for { if debugAsserts && canRepeat && offset1 == 0 { @@ -691,6 +702,7 @@ encodeLoop: e.markLongShardDirty(nextHashL) e.table[nextHashS] = tableEntry{offset: off, val: uint32(cv)} e.markShortShardDirty(nextHashS) + index0 = s + 1 if canRepeat { if repIndex >= 0 && load3232(src, repIndex) == uint32(cv>>(repOff*8)) { @@ -726,7 +738,6 @@ encodeLoop: blk.sequences = append(blk.sequences, seq) // Index match start+1 (long) -> s - 1 - index0 := s + repOff s += lenght + repOff nextEmit = s @@ -790,7 +801,6 @@ encodeLoop: } blk.sequences = append(blk.sequences, seq) - index0 := s + repOff2 s += lenght + repOff2 nextEmit = s if s >= sLimit { @@ -1024,18 +1034,18 @@ encodeLoop: } // Index match start+1 (long) -> s - 1 - index0 := s - l + 1 + off := index0 + e.cur for index0 < s-1 { cv0 := load6432(src, index0) cv1 := cv0 >> 8 h0 := hashLen(cv0, betterLongTableBits, betterLongLen) - off := index0 + e.cur e.longTable[h0] = prevEntry{offset: off, prev: e.longTable[h0].offset} e.markLongShardDirty(h0) h1 := hashLen(cv1, betterShortTableBits, betterShortLen) e.table[h1] = tableEntry{offset: off + 1, val: uint32(cv1)} e.markShortShardDirty(h1) index0 += 2 + off += 2 } cv = load6432(src, s) diff --git a/vendor/github.com/klauspost/compress/zstd/encoder_options.go b/vendor/github.com/klauspost/compress/zstd/encoder_options.go index faaf81921..20671dcb9 100644 --- a/vendor/github.com/klauspost/compress/zstd/encoder_options.go +++ b/vendor/github.com/klauspost/compress/zstd/encoder_options.go @@ -94,7 +94,7 @@ func WithEncoderConcurrency(n int) EOption { // The value must be a power of two between MinWindowSize and MaxWindowSize. // A larger value will enable better compression but allocate more memory and, // for above-default values, take considerably longer. -// The default value is determined by the compression level. +// The default value is determined by the compression level and max 8MB. func WithWindowSize(n int) EOption { return func(o *encoderOptions) error { switch { @@ -232,9 +232,9 @@ func WithEncoderLevel(l EncoderLevel) EOption { case SpeedDefault: o.windowSize = 8 << 20 case SpeedBetterCompression: - o.windowSize = 16 << 20 + o.windowSize = 8 << 20 case SpeedBestCompression: - o.windowSize = 32 << 20 + o.windowSize = 8 << 20 } } if !o.customALEntropy { diff --git a/vendor/github.com/klauspost/compress/zstd/frameenc.go b/vendor/github.com/klauspost/compress/zstd/frameenc.go index 2f5d5ed45..667ca0679 100644 --- a/vendor/github.com/klauspost/compress/zstd/frameenc.go +++ b/vendor/github.com/klauspost/compress/zstd/frameenc.go @@ -76,7 +76,7 @@ func (f frameHeader) appendTo(dst []byte) []byte { if f.SingleSegment { dst = append(dst, uint8(f.ContentSize)) } - // Unless SingleSegment is set, framessizes < 256 are nto stored. + // Unless SingleSegment is set, framessizes < 256 are not stored. case 1: f.ContentSize -= 256 dst = append(dst, uint8(f.ContentSize), uint8(f.ContentSize>>8)) diff --git a/vendor/github.com/klauspost/compress/zstd/fse_decoder_generic.go b/vendor/github.com/klauspost/compress/zstd/fse_decoder_generic.go index 332e51fe4..8adfebb02 100644 --- a/vendor/github.com/klauspost/compress/zstd/fse_decoder_generic.go +++ b/vendor/github.com/klauspost/compress/zstd/fse_decoder_generic.go @@ -20,10 +20,9 @@ func (s *fseDecoder) buildDtable() error { if v == -1 { s.dt[highThreshold].setAddBits(uint8(i)) highThreshold-- - symbolNext[i] = 1 - } else { - symbolNext[i] = uint16(v) + v = 1 } + symbolNext[i] = uint16(v) } } @@ -35,10 +34,12 @@ func (s *fseDecoder) buildDtable() error { for ss, v := range s.norm[:s.symbolLen] { for i := 0; i < int(v); i++ { s.dt[position].setAddBits(uint8(ss)) - position = (position + step) & tableMask - for position > highThreshold { + for { // lowprob area position = (position + step) & tableMask + if position <= highThreshold { + break + } } } } diff --git a/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.s b/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.s index 974b99725..5b06174b8 100644 --- a/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.s +++ b/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.s @@ -157,8 +157,7 @@ sequenceDecs_decode_amd64_ll_update_zero: // Update Literal Length State MOVBQZX DI, R14 - SHRQ $0x10, DI - MOVWQZX DI, DI + SHRL $0x10, DI LEAQ (BX)(R14*1), CX MOVQ DX, R15 MOVQ CX, BX @@ -177,8 +176,7 @@ sequenceDecs_decode_amd64_ll_update_zero: // Update Match Length State MOVBQZX R8, R14 - SHRQ $0x10, R8 - MOVWQZX R8, R8 + SHRL $0x10, R8 LEAQ (BX)(R14*1), CX MOVQ DX, R15 MOVQ CX, BX @@ -197,8 +195,7 @@ sequenceDecs_decode_amd64_ll_update_zero: // Update Offset State MOVBQZX R9, R14 - SHRQ $0x10, R9 - MOVWQZX R9, R9 + SHRL $0x10, R9 LEAQ (BX)(R14*1), CX MOVQ DX, R15 MOVQ CX, BX @@ -459,8 +456,7 @@ sequenceDecs_decode_56_amd64_ll_update_zero: // Update Literal Length State MOVBQZX DI, R14 - SHRQ $0x10, DI - MOVWQZX DI, DI + SHRL $0x10, DI LEAQ (BX)(R14*1), CX MOVQ DX, R15 MOVQ CX, BX @@ -479,8 +475,7 @@ sequenceDecs_decode_56_amd64_ll_update_zero: // Update Match Length State MOVBQZX R8, R14 - SHRQ $0x10, R8 - MOVWQZX R8, R8 + SHRL $0x10, R8 LEAQ (BX)(R14*1), CX MOVQ DX, R15 MOVQ CX, BX @@ -499,8 +494,7 @@ sequenceDecs_decode_56_amd64_ll_update_zero: // Update Offset State MOVBQZX R9, R14 - SHRQ $0x10, R9 - MOVWQZX R9, R9 + SHRL $0x10, R9 LEAQ (BX)(R14*1), CX MOVQ DX, R15 MOVQ CX, BX @@ -772,11 +766,10 @@ sequenceDecs_decode_bmi2_fill_2_end: BZHIQ R14, R15, R15 // Update Offset State - BZHIQ R8, R15, CX - SHRXQ R8, R15, R15 - MOVQ $0x00001010, R14 - BEXTRQ R14, R8, R8 - ADDQ CX, R8 + BZHIQ R8, R15, CX + SHRXQ R8, R15, R15 + SHRL $0x10, R8 + ADDQ CX, R8 // Load ctx.ofTable MOVQ ctx+16(FP), CX @@ -784,11 +777,10 @@ sequenceDecs_decode_bmi2_fill_2_end: MOVQ (CX)(R8*8), R8 // Update Match Length State - BZHIQ DI, R15, CX - SHRXQ DI, R15, R15 - MOVQ $0x00001010, R14 - BEXTRQ R14, DI, DI - ADDQ CX, DI + BZHIQ DI, R15, CX + SHRXQ DI, R15, R15 + SHRL $0x10, DI + ADDQ CX, DI // Load ctx.mlTable MOVQ ctx+16(FP), CX @@ -796,10 +788,9 @@ sequenceDecs_decode_bmi2_fill_2_end: MOVQ (CX)(DI*8), DI // Update Literal Length State - BZHIQ SI, R15, CX - MOVQ $0x00001010, R14 - BEXTRQ R14, SI, SI - ADDQ CX, SI + BZHIQ SI, R15, CX + SHRL $0x10, SI + ADDQ CX, SI // Load ctx.llTable MOVQ ctx+16(FP), CX @@ -1032,11 +1023,10 @@ sequenceDecs_decode_56_bmi2_fill_end: BZHIQ R14, R15, R15 // Update Offset State - BZHIQ R8, R15, CX - SHRXQ R8, R15, R15 - MOVQ $0x00001010, R14 - BEXTRQ R14, R8, R8 - ADDQ CX, R8 + BZHIQ R8, R15, CX + SHRXQ R8, R15, R15 + SHRL $0x10, R8 + ADDQ CX, R8 // Load ctx.ofTable MOVQ ctx+16(FP), CX @@ -1044,11 +1034,10 @@ sequenceDecs_decode_56_bmi2_fill_end: MOVQ (CX)(R8*8), R8 // Update Match Length State - BZHIQ DI, R15, CX - SHRXQ DI, R15, R15 - MOVQ $0x00001010, R14 - BEXTRQ R14, DI, DI - ADDQ CX, DI + BZHIQ DI, R15, CX + SHRXQ DI, R15, R15 + SHRL $0x10, DI + ADDQ CX, DI // Load ctx.mlTable MOVQ ctx+16(FP), CX @@ -1056,10 +1045,9 @@ sequenceDecs_decode_56_bmi2_fill_end: MOVQ (CX)(DI*8), DI // Update Literal Length State - BZHIQ SI, R15, CX - MOVQ $0x00001010, R14 - BEXTRQ R14, SI, SI - ADDQ CX, SI + BZHIQ SI, R15, CX + SHRL $0x10, SI + ADDQ CX, SI // Load ctx.llTable MOVQ ctx+16(FP), CX @@ -1967,8 +1955,7 @@ sequenceDecs_decodeSync_amd64_ll_update_zero: // Update Literal Length State MOVBQZX DI, R13 - SHRQ $0x10, DI - MOVWQZX DI, DI + SHRL $0x10, DI LEAQ (BX)(R13*1), CX MOVQ DX, R14 MOVQ CX, BX @@ -1987,8 +1974,7 @@ sequenceDecs_decodeSync_amd64_ll_update_zero: // Update Match Length State MOVBQZX R8, R13 - SHRQ $0x10, R8 - MOVWQZX R8, R8 + SHRL $0x10, R8 LEAQ (BX)(R13*1), CX MOVQ DX, R14 MOVQ CX, BX @@ -2007,8 +1993,7 @@ sequenceDecs_decodeSync_amd64_ll_update_zero: // Update Offset State MOVBQZX R9, R13 - SHRQ $0x10, R9 - MOVWQZX R9, R9 + SHRL $0x10, R9 LEAQ (BX)(R13*1), CX MOVQ DX, R14 MOVQ CX, BX @@ -2514,11 +2499,10 @@ sequenceDecs_decodeSync_bmi2_fill_2_end: BZHIQ R13, R14, R14 // Update Offset State - BZHIQ R8, R14, CX - SHRXQ R8, R14, R14 - MOVQ $0x00001010, R13 - BEXTRQ R13, R8, R8 - ADDQ CX, R8 + BZHIQ R8, R14, CX + SHRXQ R8, R14, R14 + SHRL $0x10, R8 + ADDQ CX, R8 // Load ctx.ofTable MOVQ ctx+16(FP), CX @@ -2526,11 +2510,10 @@ sequenceDecs_decodeSync_bmi2_fill_2_end: MOVQ (CX)(R8*8), R8 // Update Match Length State - BZHIQ DI, R14, CX - SHRXQ DI, R14, R14 - MOVQ $0x00001010, R13 - BEXTRQ R13, DI, DI - ADDQ CX, DI + BZHIQ DI, R14, CX + SHRXQ DI, R14, R14 + SHRL $0x10, DI + ADDQ CX, DI // Load ctx.mlTable MOVQ ctx+16(FP), CX @@ -2538,10 +2521,9 @@ sequenceDecs_decodeSync_bmi2_fill_2_end: MOVQ (CX)(DI*8), DI // Update Literal Length State - BZHIQ SI, R14, CX - MOVQ $0x00001010, R13 - BEXTRQ R13, SI, SI - ADDQ CX, SI + BZHIQ SI, R14, CX + SHRL $0x10, SI + ADDQ CX, SI // Load ctx.llTable MOVQ ctx+16(FP), CX @@ -3055,8 +3037,7 @@ sequenceDecs_decodeSync_safe_amd64_ll_update_zero: // Update Literal Length State MOVBQZX DI, R13 - SHRQ $0x10, DI - MOVWQZX DI, DI + SHRL $0x10, DI LEAQ (BX)(R13*1), CX MOVQ DX, R14 MOVQ CX, BX @@ -3075,8 +3056,7 @@ sequenceDecs_decodeSync_safe_amd64_ll_update_zero: // Update Match Length State MOVBQZX R8, R13 - SHRQ $0x10, R8 - MOVWQZX R8, R8 + SHRL $0x10, R8 LEAQ (BX)(R13*1), CX MOVQ DX, R14 MOVQ CX, BX @@ -3095,8 +3075,7 @@ sequenceDecs_decodeSync_safe_amd64_ll_update_zero: // Update Offset State MOVBQZX R9, R13 - SHRQ $0x10, R9 - MOVWQZX R9, R9 + SHRL $0x10, R9 LEAQ (BX)(R13*1), CX MOVQ DX, R14 MOVQ CX, BX @@ -3704,11 +3683,10 @@ sequenceDecs_decodeSync_safe_bmi2_fill_2_end: BZHIQ R13, R14, R14 // Update Offset State - BZHIQ R8, R14, CX - SHRXQ R8, R14, R14 - MOVQ $0x00001010, R13 - BEXTRQ R13, R8, R8 - ADDQ CX, R8 + BZHIQ R8, R14, CX + SHRXQ R8, R14, R14 + SHRL $0x10, R8 + ADDQ CX, R8 // Load ctx.ofTable MOVQ ctx+16(FP), CX @@ -3716,11 +3694,10 @@ sequenceDecs_decodeSync_safe_bmi2_fill_2_end: MOVQ (CX)(R8*8), R8 // Update Match Length State - BZHIQ DI, R14, CX - SHRXQ DI, R14, R14 - MOVQ $0x00001010, R13 - BEXTRQ R13, DI, DI - ADDQ CX, DI + BZHIQ DI, R14, CX + SHRXQ DI, R14, R14 + SHRL $0x10, DI + ADDQ CX, DI // Load ctx.mlTable MOVQ ctx+16(FP), CX @@ -3728,10 +3705,9 @@ sequenceDecs_decodeSync_safe_bmi2_fill_2_end: MOVQ (CX)(DI*8), DI // Update Literal Length State - BZHIQ SI, R14, CX - MOVQ $0x00001010, R13 - BEXTRQ R13, SI, SI - ADDQ CX, SI + BZHIQ SI, R14, CX + SHRL $0x10, SI + ADDQ CX, SI // Load ctx.llTable MOVQ ctx+16(FP), CX diff --git a/vendor/github.com/libp2p/go-cidranger/.gitignore b/vendor/github.com/libp2p/go-cidranger/.gitignore deleted file mode 100644 index 22d0d82f8..000000000 --- a/vendor/github.com/libp2p/go-cidranger/.gitignore +++ /dev/null @@ -1 +0,0 @@ -vendor diff --git a/vendor/github.com/libp2p/go-cidranger/.travis.yml b/vendor/github.com/libp2p/go-cidranger/.travis.yml deleted file mode 100644 index 23775ec6e..000000000 --- a/vendor/github.com/libp2p/go-cidranger/.travis.yml +++ /dev/null @@ -1,31 +0,0 @@ -os: - - linux - -language: go - -go: - - 1.14.x - - 1.15.x - -env: - global: - - GOTFLAGS="-race" - matrix: - - BUILD_DEPTYPE=gomod - - -# disable travis install -install: - - true - -script: - - bash <(curl -s https://raw.githubusercontent.com/ipfs/ci-helpers/master/travis-ci/run-standard-tests.sh) - - -cache: - directories: - - $GOPATH/pkg/mod - - $HOME/.cache/go-build - -notifications: - email: false diff --git a/vendor/github.com/libp2p/go-cidranger/Gopkg.lock b/vendor/github.com/libp2p/go-cidranger/Gopkg.lock deleted file mode 100644 index 507a4972b..000000000 --- a/vendor/github.com/libp2p/go-cidranger/Gopkg.lock +++ /dev/null @@ -1,33 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - digest = "1:a2c1d0e43bd3baaa071d1b9ed72c27d78169b2b269f71c105ac4ba34b1be4a39" - name = "github.com/davecgh/go-spew" - packages = ["spew"] - pruneopts = "UT" - revision = "346938d642f2ec3594ed81d874461961cd0faa76" - version = "v1.1.0" - -[[projects]] - digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe" - name = "github.com/pmezard/go-difflib" - packages = ["difflib"] - pruneopts = "UT" - revision = "792786c7400a136282c1664665ae0a8db921c6c2" - version = "v1.0.0" - -[[projects]] - digest = "1:f85e109eda8f6080877185d1c39e98dd8795e1780c08beca28304b87fd855a1c" - name = "github.com/stretchr/testify" - packages = ["assert"] - pruneopts = "UT" - revision = "12b6f73e6084dad08a7c6e575284b177ecafbc71" - version = "v1.2.1" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - input-imports = ["github.com/stretchr/testify/assert"] - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/vendor/github.com/libp2p/go-cidranger/Gopkg.toml b/vendor/github.com/libp2p/go-cidranger/Gopkg.toml deleted file mode 100644 index 55dbd3b23..000000000 --- a/vendor/github.com/libp2p/go-cidranger/Gopkg.toml +++ /dev/null @@ -1,34 +0,0 @@ -# Gopkg.toml example -# -# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md -# for detailed Gopkg.toml documentation. -# -# required = ["github.com/user/thing/cmd/thing"] -# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] -# -# [[constraint]] -# name = "github.com/user/project" -# version = "1.0.0" -# -# [[constraint]] -# name = "github.com/user/project2" -# branch = "dev" -# source = "github.com/myfork/project2" -# -# [[override]] -# name = "github.com/x/y" -# version = "2.4.0" -# -# [prune] -# non-go = false -# go-tests = true -# unused-packages = true - - -[[constraint]] - name = "github.com/stretchr/testify" - version = "1.2.1" - -[prune] - go-tests = true - unused-packages = true diff --git a/vendor/github.com/libp2p/go-cidranger/LICENSE b/vendor/github.com/libp2p/go-cidranger/LICENSE deleted file mode 100644 index c41c62239..000000000 --- a/vendor/github.com/libp2p/go-cidranger/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Yulin - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/github.com/libp2p/go-cidranger/README.md b/vendor/github.com/libp2p/go-cidranger/README.md deleted file mode 100644 index 7050a5547..000000000 --- a/vendor/github.com/libp2p/go-cidranger/README.md +++ /dev/null @@ -1,110 +0,0 @@ -# cidranger - -Fast IP to CIDR block(s) lookup using trie in Golang, inspired by [IPv4 route lookup linux](https://vincent.bernat.im/en/blog/2017-ipv4-route-lookup-linux). Possible use cases include detecting if a IP address is from published cloud provider CIDR blocks (e.g. 52.95.110.1 is contained in published AWS Route53 CIDR 52.95.110.0/24), IP routing rules, etc. - -Forked from https://github.com/yl2chen/cidranger due to upstream inactivity. - -[![GoDoc Reference](https://img.shields.io/badge/godoc-reference-5272B4.svg?style=flat-square)](https://godoc.org/github.com/libp2p/go-cidranger) -[![Build Status](https://img.shields.io/travis/libp2p/go-cidranger.svg?branch=master&style=flat-square)](https://travis-ci.org/libp2p/go-cidranger) -[![Coverage Status](https://img.shields.io/coveralls/libp2p/go-cidranger.svg?branch=master&style=flat-square)](https://coveralls.io/github/libp2p/go-cidranger?branch=master) -[![Go Report Card](https://goreportcard.com/badge/github.com/libp2p/go-cidranger?&style=flat-square)](https://goreportcard.com/report/github.com/libp2p/go-cidranger) - -This is visualization of a trie storing CIDR blocks `128.0.0.0/2` `192.0.0.0/2` `200.0.0.0/5` without path compression, the 0/1 number on the path indicates the bit value of the IP address at specified bit position, hence the path from root node to a child node represents a CIDR block that contains all IP ranges of its children, and children's children. -

- -Visualization of trie storing same CIDR blocks with path compression, improving both lookup speed and memory footprint. -

- -## Getting Started -Configure imports. -```go -import ( - "net" - - "github.com/libp2p/go-cidranger" -) -``` -Create a new ranger implemented using Path-Compressed prefix trie. -```go -ranger := NewPCTrieRanger() -``` -Inserts CIDR blocks. -```go -_, network1, _ := net.ParseCIDR("192.168.1.0/24") -_, network2, _ := net.ParseCIDR("128.168.1.0/24") -ranger.Insert(NewBasicRangerEntry(*network1)) -ranger.Insert(NewBasicRangerEntry(*network2)) -``` -To attach any additional value(s) to the entry, simply create custom struct -storing the desired value(s) that implements the RangerEntry interface: -```go -type RangerEntry interface { - Network() net.IPNet -} -``` -The prefix trie can be visualized as: -``` -0.0.0.0/0 (target_pos:31:has_entry:false) -| 1--> 128.0.0.0/1 (target_pos:30:has_entry:false) -| | 0--> 128.168.1.0/24 (target_pos:7:has_entry:true) -| | 1--> 192.168.1.0/24 (target_pos:7:has_entry:true) -``` -To test if given IP is contained in constructed ranger, -```go -contains, err = ranger.Contains(net.ParseIP("128.168.1.0")) // returns true, nil -contains, err = ranger.Contains(net.ParseIP("192.168.2.0")) // returns false, nil -``` -To get all the networks given is contained in, -```go -containingNetworks, err = ranger.ContainingNetworks(net.ParseIP("128.168.1.0")) -``` -To get all networks in ranger, -```go -entries, err := ranger.CoveredNetworks(*AllIPv4) // for IPv4 -entries, err := ranger.CoveredNetworks(*AllIPv6) // for IPv6 -``` - -## Benchmark -Compare hit/miss case for IPv4/IPv6 using PC trie vs brute force implementation, Ranger is initialized with published AWS ip ranges (889 IPv4 CIDR blocks and 360 IPv6) -```go -// Ipv4 lookup hit scenario -BenchmarkPCTrieHitIPv4UsingAWSRanges-4 5000000 353 ns/op -BenchmarkBruteRangerHitIPv4UsingAWSRanges-4 100000 13719 ns/op - -// Ipv6 lookup hit scenario, counter-intuitively faster then IPv4 due to less IPv6 CIDR -// blocks in the AWS dataset, hence the constructed trie has less path splits and depth. -BenchmarkPCTrieHitIPv6UsingAWSRanges-4 10000000 143 ns/op -BenchmarkBruteRangerHitIPv6UsingAWSRanges-4 300000 5178 ns/op - -// Ipv4 lookup miss scenario -BenchmarkPCTrieMissIPv4UsingAWSRanges-4 20000000 96.5 ns/op -BenchmarkBruteRangerMissIPv4UsingAWSRanges-4 50000 24781 ns/op - -// Ipv6 lookup miss scenario -BenchmarkPCTrieHMissIPv6UsingAWSRanges-4 10000000 115 ns/op -BenchmarkBruteRangerMissIPv6UsingAWSRanges-4 100000 10824 ns/op -``` - -## Example of IPv6 trie: -``` -::/0 (target_pos:127:has_entry:false) -| 0--> 2400::/14 (target_pos:113:has_entry:false) -| | 0--> 2400:6400::/22 (target_pos:105:has_entry:false) -| | | 0--> 2400:6500::/32 (target_pos:95:has_entry:false) -| | | | 0--> 2400:6500::/39 (target_pos:88:has_entry:false) -| | | | | 0--> 2400:6500:0:7000::/53 (target_pos:74:has_entry:false) -| | | | | | 0--> 2400:6500:0:7000::/54 (target_pos:73:has_entry:false) -| | | | | | | 0--> 2400:6500:0:7000::/55 (target_pos:72:has_entry:false) -| | | | | | | | 0--> 2400:6500:0:7000::/56 (target_pos:71:has_entry:true) -| | | | | | | | 1--> 2400:6500:0:7100::/56 (target_pos:71:has_entry:true) -| | | | | | | 1--> 2400:6500:0:7200::/56 (target_pos:71:has_entry:true) -| | | | | | 1--> 2400:6500:0:7400::/55 (target_pos:72:has_entry:false) -| | | | | | | 0--> 2400:6500:0:7400::/56 (target_pos:71:has_entry:true) -| | | | | | | 1--> 2400:6500:0:7500::/56 (target_pos:71:has_entry:true) -| | | | | 1--> 2400:6500:100:7000::/54 (target_pos:73:has_entry:false) -| | | | | | 0--> 2400:6500:100:7100::/56 (target_pos:71:has_entry:true) -| | | | | | 1--> 2400:6500:100:7200::/56 (target_pos:71:has_entry:true) -| | | | 1--> 2400:6500:ff00::/64 (target_pos:63:has_entry:true) -| | | 1--> 2400:6700:ff00::/64 (target_pos:63:has_entry:true) -| | 1--> 2403:b300:ff00::/64 (target_pos:63:has_entry:true) -``` diff --git a/vendor/github.com/libp2p/go-cidranger/brute.go b/vendor/github.com/libp2p/go-cidranger/brute.go deleted file mode 100644 index f72b62f89..000000000 --- a/vendor/github.com/libp2p/go-cidranger/brute.go +++ /dev/null @@ -1,124 +0,0 @@ -package cidranger - -import ( - "net" - - rnet "github.com/libp2p/go-cidranger/net" -) - -// bruteRanger is a brute force implementation of Ranger. Insertion and -// deletion of networks is performed on an internal storage in the form of -// map[string]net.IPNet (constant time operations). However, inclusion tests are -// always performed linearly at no guaranteed traversal order of recorded networks, -// so one can assume a worst case performance of O(N). The performance can be -// boosted many ways, e.g. changing usage of net.IPNet.Contains() to using masked -// bits equality checking, but the main purpose of this implementation is for -// testing because the correctness of this implementation can be easily guaranteed, -// and used as the ground truth when running a wider range of 'random' tests on -// other more sophisticated implementations. -type bruteRanger struct { - ipV4Entries map[string]RangerEntry - ipV6Entries map[string]RangerEntry -} - -// newBruteRanger returns a new Ranger. -func newBruteRanger() Ranger { - return &bruteRanger{ - ipV4Entries: make(map[string]RangerEntry), - ipV6Entries: make(map[string]RangerEntry), - } -} - -// Insert inserts a RangerEntry into ranger. -func (b *bruteRanger) Insert(entry RangerEntry) error { - network := entry.Network() - key := network.String() - if _, found := b.ipV4Entries[key]; !found { - entries, err := b.getEntriesByVersion(entry.Network().IP) - if err != nil { - return err - } - entries[key] = entry - } - return nil -} - -// Remove removes a RangerEntry identified by given network from ranger. -func (b *bruteRanger) Remove(network net.IPNet) (RangerEntry, error) { - networks, err := b.getEntriesByVersion(network.IP) - if err != nil { - return nil, err - } - key := network.String() - if networkToDelete, found := networks[key]; found { - delete(networks, key) - return networkToDelete, nil - } - return nil, nil -} - -// Contains returns bool indicating whether given ip is contained by any -// network in ranger. -func (b *bruteRanger) Contains(ip net.IP) (bool, error) { - entries, err := b.getEntriesByVersion(ip) - if err != nil { - return false, err - } - for _, entry := range entries { - network := entry.Network() - if network.Contains(ip) { - return true, nil - } - } - return false, nil -} - -// ContainingNetworks returns all RangerEntry(s) that given ip contained in. -func (b *bruteRanger) ContainingNetworks(ip net.IP) ([]RangerEntry, error) { - entries, err := b.getEntriesByVersion(ip) - if err != nil { - return nil, err - } - results := []RangerEntry{} - for _, entry := range entries { - network := entry.Network() - if network.Contains(ip) { - results = append(results, entry) - } - } - return results, nil -} - -// CoveredNetworks returns the list of RangerEntry(s) the given ipnet -// covers. That is, the networks that are completely subsumed by the -// specified network. -func (b *bruteRanger) CoveredNetworks(network net.IPNet) ([]RangerEntry, error) { - entries, err := b.getEntriesByVersion(network.IP) - if err != nil { - return nil, err - } - var results []RangerEntry - testNetwork := rnet.NewNetwork(network) - for _, entry := range entries { - entryNetwork := rnet.NewNetwork(entry.Network()) - if testNetwork.Covers(entryNetwork) { - results = append(results, entry) - } - } - return results, nil -} - -// Len returns number of networks in ranger. -func (b *bruteRanger) Len() int { - return len(b.ipV4Entries) + len(b.ipV6Entries) -} - -func (b *bruteRanger) getEntriesByVersion(ip net.IP) (map[string]RangerEntry, error) { - if ip.To4() != nil { - return b.ipV4Entries, nil - } - if ip.To16() != nil { - return b.ipV6Entries, nil - } - return nil, ErrInvalidNetworkInput -} diff --git a/vendor/github.com/libp2p/go-cidranger/cidranger.go b/vendor/github.com/libp2p/go-cidranger/cidranger.go deleted file mode 100644 index f638eedf3..000000000 --- a/vendor/github.com/libp2p/go-cidranger/cidranger.go +++ /dev/null @@ -1,99 +0,0 @@ -/* -Package cidranger provides utility to store CIDR blocks and perform ip -inclusion tests against it. - -To create a new instance of the path-compressed trie: - - ranger := NewPCTrieRanger() - -To insert or remove an entry (any object that satisfies the RangerEntry -interface): - - _, network, _ := net.ParseCIDR("192.168.0.0/24") - ranger.Insert(NewBasicRangerEntry(*network)) - ranger.Remove(network) - -If you desire for any value to be attached to the entry, simply -create custom struct that satisfies the RangerEntry interface: - - type RangerEntry interface { - Network() net.IPNet - } - -To test whether an IP is contained in the constructed networks ranger: - - // returns bool, error - containsBool, err := ranger.Contains(net.ParseIP("192.168.0.1")) - -To get a list of CIDR blocks in constructed ranger that contains IP: - - // returns []RangerEntry, error - entries, err := ranger.ContainingNetworks(net.ParseIP("192.168.0.1")) - -To get a list of all IPv4/IPv6 rangers respectively: - - // returns []RangerEntry, error - entries, err := ranger.CoveredNetworks(*AllIPv4) - entries, err := ranger.CoveredNetworks(*AllIPv6) - -*/ -package cidranger - -import ( - "fmt" - "net" -) - -// ErrInvalidNetworkInput is returned upon invalid network input. -var ErrInvalidNetworkInput = fmt.Errorf("Invalid network input") - -// ErrInvalidNetworkNumberInput is returned upon invalid network input. -var ErrInvalidNetworkNumberInput = fmt.Errorf("Invalid network number input") - -// AllIPv4 is a IPv4 CIDR that contains all networks -var AllIPv4 = parseCIDRUnsafe("0.0.0.0/0") - -// AllIPv6 is a IPv6 CIDR that contains all networks -var AllIPv6 = parseCIDRUnsafe("0::0/0") - -func parseCIDRUnsafe(s string) *net.IPNet { - _, cidr, _ := net.ParseCIDR(s) - return cidr -} - -// RangerEntry is an interface for insertable entry into a Ranger. -type RangerEntry interface { - Network() net.IPNet -} - -type basicRangerEntry struct { - ipNet net.IPNet -} - -func (b *basicRangerEntry) Network() net.IPNet { - return b.ipNet -} - -// NewBasicRangerEntry returns a basic RangerEntry that only stores the network -// itself. -func NewBasicRangerEntry(ipNet net.IPNet) RangerEntry { - return &basicRangerEntry{ - ipNet: ipNet, - } -} - -// Ranger is an interface for cidr block containment lookups. -type Ranger interface { - Insert(entry RangerEntry) error - Remove(network net.IPNet) (RangerEntry, error) - Contains(ip net.IP) (bool, error) - ContainingNetworks(ip net.IP) ([]RangerEntry, error) - CoveredNetworks(network net.IPNet) ([]RangerEntry, error) - Len() int -} - -// NewPCTrieRanger returns a versionedRanger that supports both IPv4 and IPv6 -// using the path compressed trie implemention. -func NewPCTrieRanger() Ranger { - return newVersionedRanger(newRanger) -} diff --git a/vendor/github.com/libp2p/go-cidranger/net/ip.go b/vendor/github.com/libp2p/go-cidranger/net/ip.go deleted file mode 100644 index f00ec208f..000000000 --- a/vendor/github.com/libp2p/go-cidranger/net/ip.go +++ /dev/null @@ -1,300 +0,0 @@ -/* -Package net provides utility functions for working with IPs (net.IP). -*/ -package net - -import ( - "encoding/binary" - "fmt" - "math" - "net" -) - -// IPVersion is version of IP address. -type IPVersion string - -// Helper constants. -const ( - IPv4Uint32Count = 1 - IPv6Uint32Count = 4 - - BitsPerUint32 = 32 - BytePerUint32 = 4 - - IPv4 IPVersion = "IPv4" - IPv6 IPVersion = "IPv6" -) - -// ErrInvalidBitPosition is returned when bits requested is not valid. -var ErrInvalidBitPosition = fmt.Errorf("bit position not valid") - -// ErrVersionMismatch is returned upon mismatch in network input versions. -var ErrVersionMismatch = fmt.Errorf("Network input version mismatch") - -// ErrNoGreatestCommonBit is an error returned when no greatest common bit -// exists for the cidr ranges. -var ErrNoGreatestCommonBit = fmt.Errorf("No greatest common bit") - -// NetworkNumber represents an IP address using uint32 as internal storage. -// IPv4 usings 1 uint32, while IPv6 uses 4 uint32. -type NetworkNumber []uint32 - -// NewNetworkNumber returns a equivalent NetworkNumber to given IP address, -// return nil if ip is neither IPv4 nor IPv6. -func NewNetworkNumber(ip net.IP) NetworkNumber { - if ip == nil { - return nil - } - coercedIP := ip.To4() - parts := 1 - if coercedIP == nil { - coercedIP = ip.To16() - parts = 4 - } - if coercedIP == nil { - return nil - } - nn := make(NetworkNumber, parts) - for i := 0; i < parts; i++ { - idx := i * net.IPv4len - nn[i] = binary.BigEndian.Uint32(coercedIP[idx : idx+net.IPv4len]) - } - return nn -} - -// ToV4 returns ip address if ip is IPv4, returns nil otherwise. -func (n NetworkNumber) ToV4() NetworkNumber { - if len(n) != IPv4Uint32Count { - return nil - } - return n -} - -// ToV6 returns ip address if ip is IPv6, returns nil otherwise. -func (n NetworkNumber) ToV6() NetworkNumber { - if len(n) != IPv6Uint32Count { - return nil - } - return n -} - -// ToIP returns equivalent net.IP. -func (n NetworkNumber) ToIP() net.IP { - ip := make(net.IP, len(n)*BytePerUint32) - for i := 0; i < len(n); i++ { - idx := i * net.IPv4len - binary.BigEndian.PutUint32(ip[idx:idx+net.IPv4len], n[i]) - } - if len(ip) == net.IPv4len { - ip = net.IPv4(ip[0], ip[1], ip[2], ip[3]) - } - return ip -} - -// Equal is the equality test for 2 network numbers. -func (n NetworkNumber) Equal(n1 NetworkNumber) bool { - if len(n) != len(n1) { - return false - } - if n[0] != n1[0] { - return false - } - if len(n) == IPv6Uint32Count { - return n[1] == n1[1] && n[2] == n1[2] && n[3] == n1[3] - } - return true -} - -// Next returns the next logical network number. -func (n NetworkNumber) Next() NetworkNumber { - newIP := make(NetworkNumber, len(n)) - copy(newIP, n) - for i := len(newIP) - 1; i >= 0; i-- { - newIP[i]++ - if newIP[i] > 0 { - break - } - } - return newIP -} - -// Previous returns the previous logical network number. -func (n NetworkNumber) Previous() NetworkNumber { - newIP := make(NetworkNumber, len(n)) - copy(newIP, n) - for i := len(newIP) - 1; i >= 0; i-- { - newIP[i]-- - if newIP[i] < math.MaxUint32 { - break - } - } - return newIP -} - -// Bit returns uint32 representing the bit value at given position, e.g., -// "128.0.0.0" has bit value of 1 at position 31, and 0 for positions 30 to 0. -func (n NetworkNumber) Bit(position uint) (uint32, error) { - if int(position) > len(n)*BitsPerUint32-1 { - return 0, ErrInvalidBitPosition - } - idx := len(n) - 1 - int(position/BitsPerUint32) - // Mod 31 to get array index. - rShift := position & (BitsPerUint32 - 1) - return (n[idx] >> rShift) & 1, nil -} - -// LeastCommonBitPosition returns the smallest position of the preceding common -// bits of the 2 network numbers, and returns an error ErrNoGreatestCommonBit -// if the two network number diverges from the first bit. -// e.g., if the network number diverges after the 1st bit, it returns 131 for -// IPv6 and 31 for IPv4 . -func (n NetworkNumber) LeastCommonBitPosition(n1 NetworkNumber) (uint, error) { - if len(n) != len(n1) { - return 0, ErrVersionMismatch - } - for i := 0; i < len(n); i++ { - mask := uint32(1) << 31 - pos := uint(31) - for ; mask > 0; mask >>= 1 { - if n[i]&mask != n1[i]&mask { - if i == 0 && pos == 31 { - return 0, ErrNoGreatestCommonBit - } - return (pos + 1) + uint(BitsPerUint32)*uint(len(n)-i-1), nil - } - pos-- - } - } - return 0, nil -} - -// Network represents a block of network numbers, also known as CIDR. -type Network struct { - Number NetworkNumber - Mask NetworkNumberMask -} - -// NewNetwork returns Network built using given net.IPNet. -func NewNetwork(ipNet net.IPNet) Network { - ones, _ := ipNet.Mask.Size() - return Network{ - Number: NewNetworkNumber(ipNet.IP), - Mask: NetworkNumberMask(ones), - } -} - -// Masked returns a new network conforming to new mask. -func (n Network) Masked(ones int) Network { - mask := NetworkNumberMask(ones) - return Network{ - Number: mask.Mask(n.Number), - Mask: mask, - } -} - -func sub(a, b uint8) uint8 { - res := a - b - if res > a { - res = 0 - } - return res -} - -func mask(m NetworkNumberMask) (mask1, mask2, mask3, mask4 uint32) { - // We're relying on overflow here. - const ones uint32 = 0xFFFFFFFF - mask1 = ones << sub(1*32, uint8(m)) - mask2 = ones << sub(2*32, uint8(m)) - mask3 = ones << sub(3*32, uint8(m)) - mask4 = ones << sub(4*32, uint8(m)) - return -} - -// Contains returns true if NetworkNumber is in range of Network, false -// otherwise. -func (n Network) Contains(nn NetworkNumber) bool { - if len(n.Number) != len(nn) { - return false - } - const ones uint32 = 0xFFFFFFFF - - mask1, mask2, mask3, mask4 := mask(n.Mask) - switch len(n.Number) { - case IPv4Uint32Count: - return nn[0]&mask1 == n.Number[0] - case IPv6Uint32Count: - return nn[0]&mask1 == n.Number[0] && - nn[1]&mask2 == n.Number[1] && - nn[2]&mask3 == n.Number[2] && - nn[3]&mask4 == n.Number[3] - default: - return false - } -} - -// Contains returns true if Network covers o, false otherwise -func (n Network) Covers(o Network) bool { - return n.Contains(o.Number) && n.Mask <= o.Mask -} - -// LeastCommonBitPosition returns the smallest position of the preceding common -// bits of the 2 networks, and returns an error ErrNoGreatestCommonBit -// if the two network number diverges from the first bit. -func (n Network) LeastCommonBitPosition(n1 Network) (uint, error) { - maskSize := n.Mask - if n1.Mask < n.Mask { - maskSize = n1.Mask - } - maskPosition := len(n1.Number)*BitsPerUint32 - int(maskSize) - lcb, err := n.Number.LeastCommonBitPosition(n1.Number) - if err != nil { - return 0, err - } - return uint(math.Max(float64(maskPosition), float64(lcb))), nil -} - -// Equal is the equality test for 2 networks. -func (n Network) Equal(n1 Network) bool { - return n.Number.Equal(n1.Number) && n.Mask == n1.Mask -} - -func (n Network) String() string { - return fmt.Sprintf("%s/%d", n.Number.ToIP(), n.Mask) -} - -func (n Network) IPNet() net.IPNet { - return net.IPNet{ - IP: n.Number.ToIP(), - Mask: net.CIDRMask(int(n.Mask), len(n.Number)*32), - } -} - -// NetworkNumberMask is an IP address. -type NetworkNumberMask int - -// Mask returns a new masked NetworkNumber from given NetworkNumber. -func (m NetworkNumberMask) Mask(n NetworkNumber) NetworkNumber { - mask1, mask2, mask3, mask4 := mask(m) - - result := make(NetworkNumber, len(n)) - switch len(n) { - case IPv4Uint32Count: - result[0] = n[0] & mask1 - case IPv6Uint32Count: - result[0] = n[0] & mask1 - result[1] = n[1] & mask2 - result[2] = n[2] & mask3 - result[3] = n[3] & mask4 - } - return result -} - -// NextIP returns the next sequential ip. -func NextIP(ip net.IP) net.IP { - return NewNetworkNumber(ip).Next().ToIP() -} - -// PreviousIP returns the previous sequential ip. -func PreviousIP(ip net.IP) net.IP { - return NewNetworkNumber(ip).Previous().ToIP() -} diff --git a/vendor/github.com/libp2p/go-cidranger/trie.go b/vendor/github.com/libp2p/go-cidranger/trie.go deleted file mode 100644 index eaed9e731..000000000 --- a/vendor/github.com/libp2p/go-cidranger/trie.go +++ /dev/null @@ -1,404 +0,0 @@ -package cidranger - -import ( - "fmt" - "net" - "strings" - - rnet "github.com/libp2p/go-cidranger/net" -) - -// prefixTrie is a path-compressed (PC) trie implementation of the -// ranger interface inspired by this blog post: -// https://vincent.bernat.im/en/blog/2017-ipv4-route-lookup-linux -// -// CIDR blocks are stored using a prefix tree structure where each node has its -// parent as prefix, and the path from the root node represents current CIDR -// block. -// -// For IPv4, the trie structure guarantees max depth of 32 as IPv4 addresses are -// 32 bits long and each bit represents a prefix tree starting at that bit. This -// property also guarantees constant lookup time in Big-O notation. -// -// Path compression compresses a string of node with only 1 child into a single -// node, decrease the amount of lookups necessary during containment tests. -// -// Level compression dictates the amount of direct children of a node by -// allowing it to handle multiple bits in the path. The heuristic (based on -// children population) to decide when the compression and decompression happens -// is outlined in the prior linked blog, and will be experimented with in more -// depth in this project in the future. -// -// Note: Can not insert both IPv4 and IPv6 network addresses into the same -// prefix trie, use versionedRanger wrapper instead. -// -// TODO: Implement level-compressed component of the LPC trie. -type prefixTrie struct { - parent *prefixTrie - children [2]*prefixTrie - - numBitsSkipped uint - numBitsHandled uint - - network rnet.Network - entry RangerEntry - - size int // This is only maintained in the root trie. -} - -var ip4ZeroCIDR, ip6ZeroCIDR net.IPNet - -func init() { - _, v4, _ := net.ParseCIDR("0.0.0.0/0") - _, v6, _ := net.ParseCIDR("0::0/0") - ip4ZeroCIDR = *v4 - ip6ZeroCIDR = *v6 -} - -func newRanger(version rnet.IPVersion) Ranger { - return newPrefixTree(version) -} - -// newPrefixTree creates a new prefixTrie. -func newPrefixTree(version rnet.IPVersion) *prefixTrie { - rootNet := ip4ZeroCIDR - if version == rnet.IPv6 { - rootNet = ip6ZeroCIDR - } - return &prefixTrie{ - numBitsSkipped: 0, - numBitsHandled: 1, - network: rnet.NewNetwork(rootNet), - } -} - -func newPathprefixTrie(network rnet.Network, numBitsSkipped uint) *prefixTrie { - version := rnet.IPv4 - if len(network.Number) == rnet.IPv6Uint32Count { - version = rnet.IPv6 - } - path := newPrefixTree(version) - path.numBitsSkipped = numBitsSkipped - path.network = network.Masked(int(numBitsSkipped)) - return path -} - -func newEntryTrie(network rnet.Network, entry RangerEntry) *prefixTrie { - leaf := newPathprefixTrie(network, uint(network.Mask)) - leaf.entry = entry - return leaf -} - -// Insert inserts a RangerEntry into prefix trie. -func (p *prefixTrie) Insert(entry RangerEntry) error { - network := entry.Network() - sizeIncreased, err := p.insert(rnet.NewNetwork(network), entry) - if sizeIncreased { - p.size++ - } - return err -} - -// Remove removes RangerEntry identified by given network from trie. -func (p *prefixTrie) Remove(network net.IPNet) (RangerEntry, error) { - entry, err := p.remove(rnet.NewNetwork(network)) - if entry != nil { - p.size-- - } - return entry, err -} - -// Contains returns boolean indicating whether given ip is contained in any -// of the inserted networks. -func (p *prefixTrie) Contains(ip net.IP) (bool, error) { - nn := rnet.NewNetworkNumber(ip) - if nn == nil { - return false, ErrInvalidNetworkNumberInput - } - return p.contains(nn) -} - -// ContainingNetworks returns the list of RangerEntry(s) the given ip is -// contained in in ascending prefix order. -func (p *prefixTrie) ContainingNetworks(ip net.IP) ([]RangerEntry, error) { - nn := rnet.NewNetworkNumber(ip) - if nn == nil { - return nil, ErrInvalidNetworkNumberInput - } - return p.containingNetworks(nn) -} - -// CoveredNetworks returns the list of RangerEntry(s) the given ipnet -// covers. That is, the networks that are completely subsumed by the -// specified network. -func (p *prefixTrie) CoveredNetworks(network net.IPNet) ([]RangerEntry, error) { - net := rnet.NewNetwork(network) - return p.coveredNetworks(net) -} - -// Len returns number of networks in ranger. -func (p *prefixTrie) Len() int { - return p.size -} - -// String returns string representation of trie, mainly for visualization and -// debugging. -func (p *prefixTrie) String() string { - children := []string{} - padding := strings.Repeat("| ", p.level()+1) - for bits, child := range p.children { - if child == nil { - continue - } - childStr := fmt.Sprintf("\n%s%d--> %s", padding, bits, child.String()) - children = append(children, childStr) - } - return fmt.Sprintf("%s (target_pos:%d:has_entry:%t)%s", p.network, - p.targetBitPosition(), p.hasEntry(), strings.Join(children, "")) -} - -func (p *prefixTrie) contains(number rnet.NetworkNumber) (bool, error) { - if !p.network.Contains(number) { - return false, nil - } - if p.hasEntry() { - return true, nil - } - if p.targetBitPosition() < 0 { - return false, nil - } - bit, err := p.targetBitFromIP(number) - if err != nil { - return false, err - } - child := p.children[bit] - if child != nil { - return child.contains(number) - } - return false, nil -} - -func (p *prefixTrie) containingNetworks(number rnet.NetworkNumber) ([]RangerEntry, error) { - results := []RangerEntry{} - if !p.network.Contains(number) { - return results, nil - } - if p.hasEntry() { - results = []RangerEntry{p.entry} - } - if p.targetBitPosition() < 0 { - return results, nil - } - bit, err := p.targetBitFromIP(number) - if err != nil { - return nil, err - } - child := p.children[bit] - if child != nil { - ranges, err := child.containingNetworks(number) - if err != nil { - return nil, err - } - if len(ranges) > 0 { - if len(results) > 0 { - results = append(results, ranges...) - } else { - results = ranges - } - } - } - return results, nil -} - -func (p *prefixTrie) coveredNetworks(network rnet.Network) ([]RangerEntry, error) { - var results []RangerEntry - if network.Covers(p.network) { - for entry := range p.walkDepth() { - results = append(results, entry) - } - } else if p.targetBitPosition() >= 0 { - bit, err := p.targetBitFromIP(network.Number) - if err != nil { - return results, err - } - child := p.children[bit] - if child != nil { - return child.coveredNetworks(network) - } - } - return results, nil -} - -func (p *prefixTrie) insert(network rnet.Network, entry RangerEntry) (bool, error) { - if p.network.Equal(network) { - sizeIncreased := p.entry == nil - p.entry = entry - return sizeIncreased, nil - } - - bit, err := p.targetBitFromIP(network.Number) - if err != nil { - return false, err - } - existingChild := p.children[bit] - - // No existing child, insert new leaf trie. - if existingChild == nil { - p.appendTrie(bit, newEntryTrie(network, entry)) - return true, nil - } - - // Check whether it is necessary to insert additional path prefix between current trie and existing child, - // in the case that inserted network diverges on its path to existing child. - lcb, err := network.LeastCommonBitPosition(existingChild.network) - divergingBitPos := int(lcb) - 1 - if divergingBitPos > existingChild.targetBitPosition() { - pathPrefix := newPathprefixTrie(network, p.totalNumberOfBits()-lcb) - err := p.insertPrefix(bit, pathPrefix, existingChild) - if err != nil { - return false, err - } - // Update new child - existingChild = pathPrefix - } - return existingChild.insert(network, entry) -} - -func (p *prefixTrie) appendTrie(bit uint32, prefix *prefixTrie) { - p.children[bit] = prefix - prefix.parent = p -} - -func (p *prefixTrie) insertPrefix(bit uint32, pathPrefix, child *prefixTrie) error { - // Set parent/child relationship between current trie and inserted pathPrefix - p.children[bit] = pathPrefix - pathPrefix.parent = p - - // Set parent/child relationship between inserted pathPrefix and original child - pathPrefixBit, err := pathPrefix.targetBitFromIP(child.network.Number) - if err != nil { - return err - } - pathPrefix.children[pathPrefixBit] = child - child.parent = pathPrefix - return nil -} - -func (p *prefixTrie) remove(network rnet.Network) (RangerEntry, error) { - if p.hasEntry() && p.network.Equal(network) { - entry := p.entry - p.entry = nil - - err := p.compressPathIfPossible() - if err != nil { - return nil, err - } - return entry, nil - } - bit, err := p.targetBitFromIP(network.Number) - if err != nil { - return nil, err - } - child := p.children[bit] - if child != nil { - return child.remove(network) - } - return nil, nil -} - -func (p *prefixTrie) qualifiesForPathCompression() bool { - // Current prefix trie can be path compressed if it meets all following. - // 1. records no CIDR entry - // 2. has single or no child - // 3. is not root trie - return !p.hasEntry() && p.childrenCount() <= 1 && p.parent != nil -} - -func (p *prefixTrie) compressPathIfPossible() error { - if !p.qualifiesForPathCompression() { - // Does not qualify to be compressed - return nil - } - - // Find lone child. - var loneChild *prefixTrie - for _, child := range p.children { - if child != nil { - loneChild = child - break - } - } - - // Find root of currnt single child lineage. - parent := p.parent - for ; parent.qualifiesForPathCompression(); parent = parent.parent { - } - parentBit, err := parent.targetBitFromIP(p.network.Number) - if err != nil { - return err - } - parent.children[parentBit] = loneChild - - // Attempts to furthur apply path compression at current lineage parent, in case current lineage - // compressed into parent. - return parent.compressPathIfPossible() -} - -func (p *prefixTrie) childrenCount() int { - count := 0 - for _, child := range p.children { - if child != nil { - count++ - } - } - return count -} - -func (p *prefixTrie) totalNumberOfBits() uint { - return rnet.BitsPerUint32 * uint(len(p.network.Number)) -} - -func (p *prefixTrie) targetBitPosition() int { - return int(p.totalNumberOfBits()-p.numBitsSkipped) - 1 -} - -func (p *prefixTrie) targetBitFromIP(n rnet.NetworkNumber) (uint32, error) { - // This is a safe uint boxing of int since we should never attempt to get - // target bit at a negative position. - return n.Bit(uint(p.targetBitPosition())) -} - -func (p *prefixTrie) hasEntry() bool { - return p.entry != nil -} - -func (p *prefixTrie) level() int { - if p.parent == nil { - return 0 - } - return p.parent.level() + 1 -} - -// walkDepth walks the trie in depth order, for unit testing. -func (p *prefixTrie) walkDepth() <-chan RangerEntry { - entries := make(chan RangerEntry) - go func() { - if p.hasEntry() { - entries <- p.entry - } - childEntriesList := []<-chan RangerEntry{} - for _, trie := range p.children { - if trie == nil { - continue - } - childEntriesList = append(childEntriesList, trie.walkDepth()) - } - for _, childEntries := range childEntriesList { - for entry := range childEntries { - entries <- entry - } - } - close(entries) - }() - return entries -} diff --git a/vendor/github.com/libp2p/go-cidranger/version.go b/vendor/github.com/libp2p/go-cidranger/version.go deleted file mode 100644 index 8bb6b33c9..000000000 --- a/vendor/github.com/libp2p/go-cidranger/version.go +++ /dev/null @@ -1,77 +0,0 @@ -package cidranger - -import ( - "net" - - rnet "github.com/libp2p/go-cidranger/net" -) - -type rangerFactory func(rnet.IPVersion) Ranger - -type versionedRanger struct { - ipV4Ranger Ranger - ipV6Ranger Ranger -} - -func newVersionedRanger(factory rangerFactory) Ranger { - return &versionedRanger{ - ipV4Ranger: factory(rnet.IPv4), - ipV6Ranger: factory(rnet.IPv6), - } -} - -func (v *versionedRanger) Insert(entry RangerEntry) error { - network := entry.Network() - ranger, err := v.getRangerForIP(network.IP) - if err != nil { - return err - } - return ranger.Insert(entry) -} - -func (v *versionedRanger) Remove(network net.IPNet) (RangerEntry, error) { - ranger, err := v.getRangerForIP(network.IP) - if err != nil { - return nil, err - } - return ranger.Remove(network) -} - -func (v *versionedRanger) Contains(ip net.IP) (bool, error) { - ranger, err := v.getRangerForIP(ip) - if err != nil { - return false, err - } - return ranger.Contains(ip) -} - -func (v *versionedRanger) ContainingNetworks(ip net.IP) ([]RangerEntry, error) { - ranger, err := v.getRangerForIP(ip) - if err != nil { - return nil, err - } - return ranger.ContainingNetworks(ip) -} - -func (v *versionedRanger) CoveredNetworks(network net.IPNet) ([]RangerEntry, error) { - ranger, err := v.getRangerForIP(network.IP) - if err != nil { - return nil, err - } - return ranger.CoveredNetworks(network) -} - -// Len returns number of networks in ranger. -func (v *versionedRanger) Len() int { - return v.ipV4Ranger.Len() + v.ipV6Ranger.Len() -} - -func (v *versionedRanger) getRangerForIP(ip net.IP) (Ranger, error) { - if ip.To4() != nil { - return v.ipV4Ranger, nil - } - if ip.To16() != nil { - return v.ipV6Ranger, nil - } - return nil, ErrInvalidNetworkNumberInput -} diff --git a/vendor/github.com/libp2p/go-libp2p-asn-util/README.md b/vendor/github.com/libp2p/go-libp2p-asn-util/README.md index 13555bb12..1e33c7cb2 100644 --- a/vendor/github.com/libp2p/go-libp2p-asn-util/README.md +++ b/vendor/github.com/libp2p/go-libp2p-asn-util/README.md @@ -1,5 +1,4 @@ # go-libp2p-asn-util -=== [![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://protocol.ai) [![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](http://github.com/libp2p/libp2p) @@ -45,4 +44,4 @@ This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/c MIT ---- \ No newline at end of file +--- diff --git a/vendor/github.com/libp2p/go-libp2p-asn-util/asn.go b/vendor/github.com/libp2p/go-libp2p-asn-util/asn.go index 490b4a296..9a25c7c72 100644 --- a/vendor/github.com/libp2p/go-libp2p-asn-util/asn.go +++ b/vendor/github.com/libp2p/go-libp2p-asn-util/asn.go @@ -1,95 +1,93 @@ package asnutil import ( + _ "embed" + "encoding/binary" "errors" - "fmt" + "math" "net" - "sync" - - "github.com/libp2p/go-cidranger" + "strconv" ) -var Store *lazyAsnStore +//go:embed sorted-network-list.bin +var dataset string + +const entrySize = 8*2 + 4 // start, end 8 bytes; asn 4 bytes + +func readEntry(index uint) (start, end uint64, asn uint32) { + base := entrySize * index + b := dataset[base : base+entrySize] + start = uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + b = b[8:] + end = uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + b = b[8:] + asn = uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + return +} + +// AsnForIPv6 returns the AS number for the given IPv6 address. +// If no mapping exists for the given network, this function will return a zero ASN number. +func AsnForIPv6(ip net.IP) (asn uint32) { + ip = ip.To16() + if ip == nil { + return + } + return AsnForIPv6Network(binary.BigEndian.Uint64(ip)) +} func init() { - Store = &lazyAsnStore{} + if len(dataset) > math.MaxUint/2 { + panic("list is too big and would overflow in binary search") + } } -type networkWithAsn struct { - nn net.IPNet - asn string +// AsnForIPv6Network returns the AS number for the given IPv6 network. +// If no mapping exists for the given network, this function will return a zero ASN number. +// network is the first 64 bits of the ip address interpreted as big endian. +func AsnForIPv6Network(network uint64) (asn uint32) { + n := uint(len(dataset)) / entrySize + var i, j uint = 0, n + for i < j { + h := (i + j) / 2 // wont overflow since the list can't be that large + start, end, asn := readEntry(h) + if start <= network { + if network <= end { + return asn + } + i = h + 1 + } else { + j = h + } + } + if i >= n { + return 0 + } + start, end, asn := readEntry(i) + if start <= network && network <= end { + return asn + } + return 0 } -func (e *networkWithAsn) Network() net.IPNet { - return e.nn -} +// Deprecated: use [AsnForIPv6] or [AsnForIPv6Network], they do not allocate. +var Store backwardCompat -type asnStore struct { - cr cidranger.Ranger -} +type backwardCompat struct{} // AsnForIPv6 returns the AS number for the given IPv6 address. // If no mapping exists for the given IP, this function will // return an empty ASN and a nil error. -func (a *asnStore) AsnForIPv6(ip net.IP) (string, error) { - if ip.To16() == nil { - return "", errors.New("ONLY IPv6 addresses supported for now") +func (backwardCompat) AsnForIPv6(ip net.IP) (string, error) { + ip = ip.To16() + if ip == nil { + return "", errors.New("ONLY IPv6 addresses supported") } - ns, err := a.cr.ContainingNetworks(ip) - if err != nil { - return "", fmt.Errorf("failed to find matching networks for the given ip: %w", err) - } - - if len(ns) == 0 { + asn := AsnForIPv6Network(binary.BigEndian.Uint64(ip)) + if asn == 0 { return "", nil } - - // longest prefix match - n := ns[len(ns)-1].(*networkWithAsn) - return n.asn, nil + return strconv.FormatUint(uint64(asn), 10), nil } -func newAsnStore() (*asnStore, error) { - cr := cidranger.NewPCTrieRanger() - - for _, v := range ipv6CidrToAsnPairList { - _, nn, err := net.ParseCIDR(v.cidr) - if err != nil { - return nil, fmt.Errorf("failed to parse CIDR %s: %w", v.cidr, err) - } - - if err := cr.Insert(&networkWithAsn{*nn, v.asn}); err != nil { - return nil, fmt.Errorf("failed to insert CIDR %s in Trie store: %w", v.cidr, err) - } - } - - return &asnStore{cr}, nil -} - -// lazyAsnStore builds the underlying trie on first call to AsnForIPv6. -// Alternatively, Init can be called to manually trigger initialization. -type lazyAsnStore struct { - store *asnStore - once sync.Once -} - -// AsnForIPv6 returns the AS number for the given IPv6 address. -// If no mapping exists for the given IP, this function will -// return an empty ASN and a nil error. -func (a *lazyAsnStore) AsnForIPv6(ip net.IP) (string, error) { - a.once.Do(a.init) - return a.store.AsnForIPv6(ip) -} - -func (a *lazyAsnStore) Init() { - a.once.Do(a.init) -} - -func (a *lazyAsnStore) init() { - store, err := newAsnStore() - if err != nil { - panic(err) - } - a.store = store -} +func (backwardCompat) Init() {} diff --git a/vendor/github.com/libp2p/go-libp2p-asn-util/doc.go b/vendor/github.com/libp2p/go-libp2p-asn-util/doc.go index 33d557f22..ede29827a 100644 --- a/vendor/github.com/libp2p/go-libp2p-asn-util/doc.go +++ b/vendor/github.com/libp2p/go-libp2p-asn-util/doc.go @@ -2,4 +2,3 @@ package asnutil //go:generate go run ./generate/ -//go:generate go fmt ./... diff --git a/vendor/github.com/libp2p/go-libp2p-asn-util/ipv6_asn_map.gen.go b/vendor/github.com/libp2p/go-libp2p-asn-util/ipv6_asn_map.gen.go deleted file mode 100644 index 936595f22..000000000 --- a/vendor/github.com/libp2p/go-libp2p-asn-util/ipv6_asn_map.gen.go +++ /dev/null @@ -1,79014 +0,0 @@ -package asnutil - -// Code generated by generate/main.go DO NOT EDIT -var ipv6CidrToAsnPairList = [...]struct{ cidr, asn string }{ - {"2600:1407:3001::/37", "20940"}, - {"2400:a980:5900::/37", "133111"}, - {"2409:8710::/34", "9808"}, - {"240e:7c0::/20", "4134"}, - {"2402:800:3701::/44", "7552"}, - {"2406:daa0:10c0::/44", "16509"}, - {"2001:559:8511::/48", "7015"}, - {"2a02:26f7:33::/48", "20940"}, - {"2a03:3680::/32", "33824"}, - {"2400:dc00:4100::/46", "131111"}, - {"2409:8052:2802::/38", "56047"}, - {"2a02:26f7:db85::/46", "20940"}, - {"240a:aab8::/32", "145394"}, - {"2605:bc80::/32", "3701"}, - {"2607:7c80:56::/48", "64260"}, - {"2800:160:1378::/45", "14259"}, - {"2804:204:212::/45", "28186"}, - {"2a02:29b8::/32", "51852"}, - {"2a06:e044:10::/48", "198507"}, - {"2001:dce:8400::/48", "45285"}, - {"240e:db:8801::/35", "4134"}, - {"2800:160:1818::/42", "14259"}, - {"2806:230:602c::/48", "265594"}, - {"2a01:280:318::/48", "206320"}, - {"2a01:5200::/32", "48304"}, - {"2a03:7380:5400::/40", "13188"}, - {"2401:2280::/32", "56294"}, - {"2401:c240:4100::/35", "132847"}, - {"2406:f280:8000::/33", "31972"}, - {"2600:1488:6191::/38", "20940"}, - {"2806:2f0:31c1::/46", "17072"}, - {"2a01:b960:230d::/48", "208136"}, - {"2001:559:828e::/48", "33491"}, - {"2001:559:c1e8::/48", "7015"}, - {"2001:678:e20::/48", "210882"}, - {"2409:8087:5c0d::/40", "9808"}, - {"240a:a1fe::/32", "143160"}, - {"240a:ab19::/32", "145491"}, - {"2607:fd78:702::/36", "26677"}, - {"2804:5640:1100::/32", "267986"}, - {"2a02:26f7:b740::/48", "36183"}, - {"2a0a:ec02:a01::/48", "42692"}, - {"2001:579:c1c::/42", "22773"}, - {"240a:a4b3::/32", "143853"}, - {"2803:96e0::/32", "269964"}, - {"2804:73c0::/32", "270935"}, - {"2001:14d8::/32", "12371"}, - {"2001:67c:830::/48", "57964"}, - {"2800:160:2a4a::/39", "14259"}, - {"2804:58e8::/32", "268157"}, - {"2a02:26f7:c1c0::/48", "36183"}, - {"2a02:f1c0::/29", "6846"}, - {"2a0f:1840::/29", "60262"}, - {"2001:67c:2b34::/48", "8220"}, - {"240e:438:3220::/43", "140647"}, - {"2602:feb4:10::/42", "25961"}, - {"2606:26c0::/32", "63033"}, - {"2804:14c:da00::/40", "28573"}, - {"2804:2538::/39", "28183"}, - {"2a03:f85:2::/48", "60781"}, - {"2a0f:e80::/29", "42926"}, - {"2402:800:3d63::/43", "7552"}, - {"2600:1000:9e00::/44", "6167"}, - {"2a0a:4680::/29", "206737"}, - {"240a:a95a::/32", "145044"}, - {"2610:b0:401a::/45", "21433"}, - {"2620:1ec:1d::/48", "8068"}, - {"2804:8674::/32", "272644"}, - {"2a02:26f7:c240::/48", "36183"}, - {"2a06:e881:8400::/44", "149422"}, - {"2a0b:7e40::/32", "206894"}, - {"2602:feda:f0d0::/42", "396303"}, - {"2620:92::/44", "1970"}, - {"2a02:26f7:c68c::/48", "36183"}, - {"2a0d:5ec0::/29", "208861"}, - {"2607:f978:5::/48", "32475"}, - {"2620:0:28a0::/46", "33522"}, - {"2620:119:5071::/46", "13443"}, - {"2804:4618::/34", "266968"}, - {"2a04:4e40:2000::/48", "54113"}, - {"2001:ac8:51::/46", "9009"}, - {"2402:800:530f::/43", "7552"}, - {"2806:230:102a::/48", "265594"}, - {"2a02:2058::/32", "44512"}, - {"2a09:fd40::/48", "16376"}, - {"2a0f:1ac0::/29", "60262"}, - {"2a0f:f140::/29", "41776"}, - {"2602:10d:8000::/36", "33588"}, - {"2606:5000:2200::/36", "209"}, - {"2804:14c:b300::/40", "28573"}, - {"2a03:5d40::/32", "20926"}, - {"2401:4900:1f24::/43", "24560"}, - {"240e:37a:ac00::/33", "4134"}, - {"2804:7d5c::/32", "271556"}, - {"2a04:4e40:3000::/48", "54113"}, - {"2a0d:d000::/29", "204790"}, - {"2001:dce:5100::/48", "38064"}, - {"2001:4de8::/32", "29208"}, - {"2400:cb00:308::/48", "13335"}, - {"2401:7400:801:d::/35", "4773"}, - {"240e:438:420::/43", "140647"}, - {"2a01:ce83:1000::/34", "51964"}, - {"2a02:1398::/32", "16350"}, - {"2a0b:7380::/29", "31617"}, - {"2001:1900:23ad::/46", "202818"}, - {"2804:42b4::/32", "267520"}, - {"2a02:26f7:dd88::/48", "36183"}, - {"2404:bf40:e002::/48", "139084"}, - {"240a:aa43::/32", "145277"}, - {"2804:59c8::/32", "268725"}, - {"2001:4b20:100:668::/48", "34288"}, - {"2405:5940:b000::/33", "17473"}, - {"2607:fc48:428::/48", "40009"}, - {"2804:f84::/32", "263589"}, - {"2804:2cd4::/42", "265246"}, - {"2a00:65e0::/32", "198947"}, - {"2a01:d0::/42", "29632"}, - {"2406:6040::/32", "138257"}, - {"2a00:ad00::/34", "41897"}, - {"2001:e48::/42", "9583"}, - {"2405:7f00:91a0::/38", "133414"}, - {"2408:840c:8f00::/40", "17621"}, - {"2803:9800:9507::/36", "11664"}, - {"2804:5740::/32", "268054"}, - {"2a00:ab20::/29", "60530"}, - {"2001:fb0:109f:800a::/61", "7470"}, - {"2001:1980:4445::/35", "29838"}, - {"2001:4288:8009::/33", "6713"}, - {"2403:45c0::/32", "137989"}, - {"2408:8256:2d8b::/48", "17623"}, - {"2409:871a::/29", "132525"}, - {"2409:8979::/30", "9808"}, - {"240a:a94b::/32", "145029"}, - {"2804:14c:dc00::/40", "28573"}, - {"2804:2664::/32", "52721"}, - {"2804:71f8::/32", "270823"}, - {"2a03:ecc0::/32", "199277"}, - {"2a0f:c080::/32", "44582"}, - {"2001:67c:21e8::/48", "51944"}, - {"2001:df5:7980::/48", "132513"}, - {"2401:d800:5330::/41", "7552"}, - {"2403:2e40:10::/48", "137959"}, - {"2800:b20:2000::/30", "14754"}, - {"2620:10a:80e7::/48", "394354"}, - {"2620:11e:f001::/44", "27644"}, - {"2804:6ff4::/32", "270697"}, - {"2804:7f08::/43", "271662"}, - {"2a02:26f7:d1cc::/48", "36183"}, - {"2a02:26f7:fac9::/46", "20940"}, - {"240a:a308::/32", "143426"}, - {"2804:788c::/32", "271250"}, - {"2001:4888:801c::/47", "22394"}, - {"240a:af1f::/32", "146521"}, - {"2600:1408:2c01::/35", "20940"}, - {"2620:3c:c040::/48", "395063"}, - {"2803:5c80:6507::/48", "64114"}, - {"2a04:4e40:c200::/48", "54113"}, - {"2a07:a40:d::/29", "48821"}, - {"2001:678:41c::/48", "42563"}, - {"2001:4878:a048::/48", "12222"}, - {"2407:2e00::/32", "24436"}, - {"2600:6c62::/29", "20115"}, - {"2a01:a8::/32", "39122"}, - {"2406:26c0::/32", "134040"}, - {"240a:a0b9::/32", "142835"}, - {"2804:7648::/32", "271101"}, - {"2a02:2578:1a30::/32", "51375"}, - {"2a0b:c640::/29", "205473"}, - {"2409:8904:8640::/39", "24547"}, - {"2402:8100:21e0::/43", "45271"}, - {"240a:ad6d::/32", "146087"}, - {"2001:250:3081::/38", "23910"}, - {"2001:559:84b7::/44", "7922"}, - {"2404:f4c0:200::/46", "146961"}, - {"2408:8256:3399::/48", "17816"}, - {"2804:632c::/32", "269343"}, - {"2a02:8c8::/32", "20860"}, - {"2a02:26f7:b9cd::/46", "20940"}, - {"2a05:e580:fd00::/38", "134521"}, - {"2001:67c:2d34::/48", "207583"}, - {"240a:aa07::/32", "145217"}, - {"2804:2f90::/32", "264899"}, - {"2a0e:f080:1::/48", "12363"}, - {"2409:803d:2900::/38", "24444"}, - {"2409:8f04::/32", "24547"}, - {"2600:380:dc00::/44", "20057"}, - {"2801:80:1bc0::/48", "266511"}, - {"2408:8956:f1c0::/42", "17622"}, - {"240a:a6b8::/32", "144370"}, - {"2804:58fc:6000::/32", "268162"}, - {"2a03:aa80::/32", "48479"}, - {"2001:250:6817::/48", "23910"}, - {"2001:559:87ed::/48", "7922"}, - {"2001:13c7:6014::/48", "52500"}, - {"2403:2c00:7:2::4/44", "4058"}, - {"2800:800:a12::/42", "26611"}, - {"2402:800:5c71::/40", "7552"}, - {"2403:2400::/32", "9729"}, - {"2407:f140::/48", "140826"}, - {"2408:8459:5810::/42", "17623"}, - {"2803:5de0::/32", "270054"}, - {"2806:2f0:32a1::/46", "17072"}, - {"2a02:27ac::/32", "50979"}, - {"2a11:b1c1::/32", "35913"}, - {"2001:550:5605::/44", "174"}, - {"2600:370f:7162::/47", "32261"}, - {"2620:119:5000::/46", "13443"}, - {"2001:559:8795::/48", "33489"}, - {"2404:85c0::/32", "59110"}, - {"2408:8256:3196::/48", "17816"}, - {"240a:a463::/32", "143773"}, - {"2604:6600:a4::/39", "40676"}, - {"2605:7940:1000::/44", "30456"}, - {"2001:250:1400::/45", "24354"}, - {"2001:559:861d::/48", "7015"}, - {"2800:160:1b0f::/43", "14259"}, - {"2a01:7ae0::/32", "49182"}, - {"2a05:1083:fc00::/44", "209870"}, - {"2804:314:4015::/44", "61568"}, - {"2a02:26f7:cfc1::/46", "20940"}, - {"2001:559:2cc::/47", "7015"}, - {"2001:67c:15dc::/48", "43284"}, - {"2402:800:592b::/43", "7552"}, - {"2403:e200:805::/32", "45543"}, - {"2404:4d40::/32", "138575"}, - {"2406:e000:346::/42", "23655"}, - {"2408:8957:bb00::/40", "17816"}, - {"2804:3e90:4264::/32", "266606"}, - {"2001:559:8638::/48", "33491"}, - {"2607:f348:3595::/48", "16626"}, - {"2a02:70:200::/32", "3326"}, - {"2001:4220:3::/45", "36935"}, - {"2400:3ce0::/32", "132752"}, - {"2606:f40:1001::/48", "16509"}, - {"2606:6c00:c000::/48", "32787"}, - {"2804:3994:4000::/34", "266037"}, - {"2806:2f0:8063::/40", "17072"}, - {"2a00:1dc0::/29", "43289"}, - {"2001:67c:2608::/48", "197422"}, - {"2602:fc52:30d::/48", "399888"}, - {"2803:de20::/32", "265879"}, - {"2804:62dc::/32", "269323"}, - {"2804:6fb0::/32", "270677"}, - {"2806:2f0:9ba1::/46", "17072"}, - {"2a02:26f0:bd01::/38", "20940"}, - {"2a10:4646:12::/47", "47157"}, - {"2408:80f0:4000::/32", "4808"}, - {"2409:875c:4e00::/26", "9808"}, - {"240a:ac54::/32", "145806"}, - {"2600:6c7f:9170::/44", "20115"}, - {"2a07:7ec0::/29", "59441"}, - {"240a:a47f::/32", "143801"}, - {"2804:7c58::/32", "271490"}, - {"2a01:6e00::/44", "43142"}, - {"2a03:e600:101::/32", "1764"}, - {"2a0e:fd45:bef::/37", "44103"}, - {"2a0f:1800::/29", "51711"}, - {"2001:4408:7f10::/32", "4758"}, - {"240a:af66::/32", "146592"}, - {"240e:44d:1600::/41", "140345"}, - {"2803:cd80::/33", "264811"}, - {"2a0c:4c00::/29", "205260"}, - {"2001:559:8449::/48", "33659"}, - {"2402:800:75e0::/38", "7552"}, - {"2804:5d80:8580::/33", "268976"}, - {"2a02:26f7:f814::/48", "36183"}, - {"2a0a:9040::/29", "25486"}, - {"2001:559:700::/48", "33287"}, - {"2804:d38::/32", "53158"}, - {"2804:590c::/32", "268166"}, - {"2001:df0:2b7::/48", "9555"}, - {"2620:149:74::/40", "714"}, - {"2620:149:a1f::/42", "714"}, - {"2001:559:81ca::/48", "33657"}, - {"2605:a401:805e::/42", "33363"}, - {"2806:2f0:8221::/46", "17072"}, - {"240a:aad5::/32", "145423"}, - {"240a:aff2::/32", "146732"}, - {"2604:cf00::/32", "40230"}, - {"2806:2f0:52c3::/37", "17072"}, - {"240a:a2a3::/32", "143325"}, - {"2620:0:d30::/48", "22920"}, - {"2a03:2887:ff19::/48", "63293"}, - {"2001:559:286::/48", "22909"}, - {"2409:0:1::/40", "38620"}, - {"240e:438:a840::/38", "4134"}, - {"2a01:538::/32", "8518"}, - {"240a:a7e2::/32", "144668"}, - {"240a:aa38::/32", "145266"}, - {"2a02:2e02:da0::/38", "12479"}, - {"2a0d:5642:107::/48", "35487"}, - {"2600:1419:8001::/37", "20940"}, - {"2602:806::/40", "16904"}, - {"2a02:2af8:409::/45", "702"}, - {"2a0b:d780::/29", "16019"}, - {"2001:559:532::/48", "7015"}, - {"2804:3200::/32", "265050"}, - {"2a03:8900::/32", "1197"}, - {"2a0d:f407:1017::/48", "212448"}, - {"2001:470:83::/48", "26110"}, - {"2001:559:8321::/48", "7015"}, - {"2408:80ea:6800::/41", "17816"}, - {"2600:6c10:52::/44", "20115"}, - {"2606:2800:7a0c::/48", "15133"}, - {"2a02:26f7:f1::/46", "20940"}, - {"2401:5100::/32", "38442"}, - {"240e:44d:2100::/42", "140345"}, - {"2600:6c38:161::/45", "20115"}, - {"2a0f:cc87:d000::/34", "208861"}, - {"2001:579:2702::/33", "22773"}, - {"2402:800:f3e0::/37", "7552"}, - {"2406:de00:100::/38", "18225"}, - {"240a:afbd::/32", "146679"}, - {"2a01:8f80:100::/40", "62168"}, - {"2a07:2fc0::/29", "41337"}, - {"2a0d:180::/31", "204668"}, - {"2a02:26f7:fa84::/48", "36183"}, - {"2a06:c003::/32", "45027"}, - {"2001:559:c3ba::/48", "33659"}, - {"2600:6c38:f30::/45", "20115"}, - {"2a04:5900::/29", "60304"}, - {"2001:559:448::/48", "7725"}, - {"2001:44c8:41fe::/38", "131445"}, - {"2404:3d00:40a3::/45", "3573"}, - {"2804:24c4::/34", "264241"}, - {"2a02:26f7:c348::/46", "36183"}, - {"2a03:9180:4::/32", "199422"}, - {"2001:559:7ab::/48", "33659"}, - {"2001:78a::/31", "6893"}, - {"240a:adcc::/32", "146182"}, - {"2001:559:117::/44", "7922"}, - {"2a02:cb80:4200::/45", "43766"}, - {"2001:559:46f::/48", "33287"}, - {"2001:67c:2124::/48", "39526"}, - {"2602:fd46::/36", "398328"}, - {"2604:1a00:b::/32", "46887"}, - {"2a03:94a0::/32", "203752"}, - {"2a10:7fc0::/29", "202505"}, - {"2403:c000::/35", "4741"}, - {"2405:6e00:2220::/43", "18291"}, - {"2408:8956:f00::/40", "17816"}, - {"240a:afdd::/32", "146711"}, - {"2602:fdba::/36", "40676"}, - {"2620:0:167e::/48", "7046"}, - {"2804:846c::/32", "272260"}, - {"2a03:8480::/32", "47394"}, - {"2401:d800:d480::/42", "7552"}, - {"240a:abe5::/32", "145695"}, - {"2605:6640::/32", "397797"}, - {"2800:320:8408::/45", "27882"}, - {"2804:5ed8::/32", "269060"}, - {"2a02:26f7:f981::/46", "20940"}, - {"2001:67c:25a8::/48", "8218"}, - {"2401:4900:4790::/42", "45609"}, - {"240a:a3e5::/32", "143647"}, - {"2605:a401:8929::/43", "33363"}, - {"2c0f:fb40::/32", "37315"}, - {"2001:4490:d040::/46", "9829"}, - {"2401:d800:f7b0::/41", "7552"}, - {"2803:5260::/32", "267870"}, - {"2804:f8c:8090::/41", "263591"}, - {"2a0a:2180::/29", "2119"}, - {"240a:a228::/32", "143202"}, - {"240a:ae99::/32", "146387"}, - {"2407:bf40::/32", "142450"}, - {"2600:4402:c004::/29", "6130"}, - {"2a02:b60:2000::/35", "41032"}, - {"2a07:6240::/29", "34290"}, - {"2c0f:4880::/32", "328964"}, - {"2001:678:84c::/48", "57007"}, - {"240a:a137::/32", "142961"}, - {"2804:728:6040::/32", "53201"}, - {"2804:4c50::/32", "267363"}, - {"2a02:26f7:f181::/46", "20940"}, - {"2a03:1f40::/32", "199588"}, - {"2a04:4720::/30", "31511"}, - {"2001:49f0:d0dc::/42", "174"}, - {"2404:69c0::/32", "132129"}, - {"2600:1009:f100::/44", "6167"}, - {"2600:1480:800::/48", "21342"}, - {"2804:7f8c::/43", "271695"}, - {"2001:559:823e::/48", "7922"}, - {"2400:7940::/32", "59126"}, - {"2402:1280::/32", "63931"}, - {"2402:2000:7001::/32", "24350"}, - {"2402:2000:9001::/33", "24350"}, - {"2403:fbc0:3000::/48", "23959"}, - {"2804:26b0::/32", "263849"}, - {"2001:468:2806::/44", "396961"}, - {"2400:6b00::/32", "63997"}, - {"240e:109:8028::/48", "133775"}, - {"2806:2f0:52c1::/46", "17072"}, - {"2001:67c:2550::/48", "39870"}, - {"2406:840:edd0::/48", "38173"}, - {"240e:e9:8000::/37", "137702"}, - {"2800:440:1a00::/42", "27738"}, - {"2a09:ed80::/29", "203959"}, - {"2600:140f:4600::/48", "9498"}, - {"2600:1414:1::/31", "20940"}, - {"2602:fe30::/36", "394752"}, - {"2804:24b0::/38", "264238"}, - {"2a00:c280::/39", "50463"}, - {"2a01:6500:a054::/29", "42925"}, - {"2a07:8144::/36", "203926"}, - {"2c0f:f320::/32", "37126"}, - {"2001:df5:5c00::/48", "9649"}, - {"2804:1774::/32", "263145"}, - {"2a04:4e40:5440::/44", "54113"}, - {"2001:146b::/35", "49183"}, - {"2603:f8d0::/26", "397165"}, - {"2408:8a21:4000::/35", "4837"}, - {"2603:90f5:800::/40", "20115"}, - {"2603:f980::/25", "397165"}, - {"2800:68:c0c1::/35", "61468"}, - {"2803:d480::/32", "8053"}, - {"2a0b:2bc0::/29", "13023"}, - {"2404:f780:b::/48", "206607"}, - {"2406:f00:3::/48", "55824"}, - {"2408:8957:9700::/40", "17816"}, - {"240e:97a:2d02::/40", "23650"}, - {"2600:1003:b870::/40", "22394"}, - {"2600:100d:bf0e::/33", "22394"}, - {"2607:f330:9400::/40", "25996"}, - {"2a04:9540::/29", "51265"}, - {"2001:418:1456:b20::/62", "397601"}, - {"2402:3a80:1800::/42", "38266"}, - {"240a:a2e4::/32", "143390"}, - {"240e:3bb:7a00::/32", "140313"}, - {"2600:6c38:d7::/44", "20115"}, - {"2606:3980::/48", "55229"}, - {"2804:35f4::/33", "266317"}, - {"2a0c:6b00::/32", "21473"}, - {"2001:1af0:9021::/29", "13046"}, - {"2401:d800:e92::/41", "7552"}, - {"2804:30c4::/35", "264973"}, - {"2804:775c::/32", "271173"}, - {"2a00:1488::/32", "1887"}, - {"2001:559:834c::/48", "33657"}, - {"2a09:c540::/32", "209231"}, - {"2a0a:4587:2014::/32", "29670"}, - {"2001:43f8:1f5::/48", "37668"}, - {"2804:4a50::/32", "267232"}, - {"2a00:16e0::/32", "3249"}, - {"2001:4410:2012::/40", "132040"}, - {"2405:9800:c911::/45", "45430"}, - {"2a06:e881:121::/48", "202313"}, - {"2405:2300:ff43::/45", "13443"}, - {"2406:d500:12::/48", "136557"}, - {"2602:fe74::/36", "393996"}, - {"2c0f:e820::/32", "328575"}, - {"2001:559:8651::/48", "33489"}, - {"2600:1000:9100::/44", "6167"}, - {"2600:1406:d401::/38", "20940"}, - {"2804:37a8:1205::/48", "65002"}, - {"2001:4878:136::/48", "12222"}, - {"2604:3d80:804::/48", "394302"}, - {"2606:2800:6038::/48", "15133"}, - {"2606:6880::/32", "63470"}, - {"2800:150:7::/32", "22047"}, - {"2806:2ed::/32", "28398"}, - {"2001:678:164::/48", "39345"}, - {"2401:d800:7190::/42", "7552"}, - {"2600:2:d20::/40", "1239"}, - {"2600:1002:f000::/44", "6167"}, - {"2806:2f0:32c1::/46", "17072"}, - {"2a02:930::/32", "44237"}, - {"2001:4998:14::/48", "14777"}, - {"2405:4000:801::/61", "7470"}, - {"2408:8406:a800::/39", "4808"}, - {"2804:45b8::/32", "266945"}, - {"2804:5928::/32", "268172"}, - {"2a0c:ca40::/29", "42598"}, - {"2001:559:8067::/48", "33287"}, - {"2001:67c:2214::/48", "3301"}, - {"2001:67c:26b4::/48", "57672"}, - {"2401:4900:1680::/39", "45609"}, - {"2401:d800:dba0::/41", "7552"}, - {"2402:c000:3801::/32", "9230"}, - {"240e:3bc:9c00::/34", "140310"}, - {"2806:20d:1d47::/34", "32098"}, - {"2806:2f0:3381::/46", "17072"}, - {"2a02:26f7:5a::/48", "36183"}, - {"2a04:f580:9220::/48", "4809"}, - {"2a0e:aa00:210::/47", "41378"}, - {"2001:44b8:30b1::/48", "4739"}, - {"240a:aed0::/32", "146442"}, - {"2603:3:6000::/39", "398101"}, - {"2800:70::/32", "27789"}, - {"2804:ad8:828a::/33", "262494"}, - {"2804:69dc:8000::/33", "270296"}, - {"2402:800:3e20::/43", "7552"}, - {"2408:8956:8700::/40", "17816"}, - {"2604:86c0:f000::/40", "61003"}, - {"2804:4510::/32", "267670"}, - {"2a00:c70::/32", "21409"}, - {"2001:df2:6780::/48", "134340"}, - {"240a:a12a::/32", "142948"}, - {"2804:2a00:c000::/34", "264050"}, - {"2a01:388::/29", "42689"}, - {"2a02:88d:8300::/48", "48695"}, - {"2408:805c:5000::/32", "17816"}, - {"2408:8256:316b::/48", "17623"}, - {"2600:1405:1801::/34", "20940"}, - {"2602:fc1c::/43", "53356"}, - {"2803:f300::/32", "52405"}, - {"2a02:44a0:ffff::/48", "61955"}, - {"2401:d800:b740::/42", "7552"}, - {"240e:44d:2400::/41", "140345"}, - {"2800:48::/32", "27898"}, - {"2a01:61c0::/40", "20860"}, - {"2a02:2e02:d50::/42", "12479"}, - {"2a0d:c680::/29", "204467"}, - {"2001:43e0::/32", "37074"}, - {"2407:7d00:1::/48", "138915"}, - {"2604:b440::/47", "19738"}, - {"2606:2800:4025::/44", "15133"}, - {"2606:3380::/48", "53334"}, - {"2804:ea0::/33", "52968"}, - {"2a02:26f0:9301::/37", "20940"}, - {"2a04:2300::/29", "197623"}, - {"2401:d800:b1e0::/38", "7552"}, - {"2804:1c04::/33", "61633"}, - {"2804:4c30::/32", "267355"}, - {"2a00:11f8::/29", "24875"}, - {"2a04:bb80::/29", "62040"}, - {"240e:bf:b8e8::/46", "138635"}, - {"240e:3b6:7a00::/32", "140313"}, - {"2600:1015:b130::/40", "6167"}, - {"2a00:c50::/29", "49289"}, - {"2a00:4100::/32", "12460"}, - {"2a02:26f7:41::/48", "20940"}, - {"2a02:47a0:a::/48", "49673"}, - {"2a0c:f480::/29", "328543"}, - {"2401:3c0:10b::/48", "45528"}, - {"2406:2000:efa5::/48", "45501"}, - {"2603:90f5:14::/40", "11426"}, - {"2620:100:c::/48", "19637"}, - {"2620:10a:4003::/45", "17394"}, - {"2804:9d4::/39", "262996"}, - {"2a02:26f7:b941::/46", "20940"}, - {"2a02:26f7:b78d::/42", "20940"}, - {"2a11:9d80::/29", "49396"}, - {"2804:7778::/32", "271180"}, - {"2a04:e240::/29", "35617"}, - {"240a:a521::/32", "143963"}, - {"2600:370f:352a::/45", "32261"}, - {"2607:fb58::/47", "36086"}, - {"2620:10:e000::/48", "55228"}, - {"2409:f:f2::/48", "142502"}, - {"2804:224c::/32", "262769"}, - {"2804:72f8::/32", "270887"}, - {"2804:4f50::/32", "268319"}, - {"2804:6dcc::/32", "270556"}, - {"2a02:2aa0::/39", "702"}, - {"2a09:4e07:8000::/36", "210625"}, - {"2c0f:f020:10::/48", "327907"}, - {"2401:d800:2490::/42", "7552"}, - {"2600:6c10:8e::/43", "20115"}, - {"2606:2800:7a10::/48", "15133"}, - {"2a11:7400:f2::/48", "50518"}, - {"240a:a939::/32", "145011"}, - {"2600:5c01:34b7::/44", "11351"}, - {"2a02:d8c0::/29", "2119"}, - {"2a03:2880:f020::/47", "32934"}, - {"2a11:7347::/33", "33171"}, - {"2001:da8:210::/48", "23910"}, - {"2001:df0:5800::/48", "55660"}, - {"2409:8c14::/40", "56044"}, - {"2606:5dc0:8a00::/39", "395561"}, - {"2804:db8::/32", "28335"}, - {"2804:11cc::/32", "263440"}, - {"2001:4878:2220::/48", "12222"}, - {"2409:8a1a::/35", "132525"}, - {"2602:fd4e::/36", "13465"}, - {"2a03:5a07::/32", "51028"}, - {"2a0b:e45:1::/48", "205809"}, - {"2001:c20:48a4::/48", "9255"}, - {"2001:44b8:30c7::/48", "7545"}, - {"2403:8ec0::/32", "134098"}, - {"2604:880:d::/46", "29802"}, - {"2604:4480::/32", "22552"}, - {"2804:41e8::/32", "267464"}, - {"2a00:f080::/42", "13030"}, - {"2a06:e381::/32", "206970"}, - {"2a0c:b641:600::/44", "210356"}, - {"2001:559:78b::/48", "7015"}, - {"2001:559:c23e::/48", "33491"}, - {"2001:67c:3e8::/47", "39358"}, - {"2406:a400::/32", "10024"}, - {"2610:58::/46", "111"}, - {"2620:11a:b000::/44", "12276"}, - {"2804:28e4:e022::/44", "28260"}, - {"2a04:4e40:2230::/44", "54113"}, - {"2001:480:502::/41", "668"}, - {"2400:e501::/32", "138322"}, - {"2409:8904:cf40::/42", "24547"}, - {"240e:9f:c000::/35", "134420"}, - {"2803:3620::/32", "265867"}, - {"2a02:88d:220::/44", "48695"}, - {"2a05:b680::/48", "33823"}, - {"2404:e900:8000::/33", "46062"}, - {"2408:8000:c000::/45", "140726"}, - {"240a:a93c::/32", "145014"}, - {"240e:44d:4e80::/41", "4134"}, - {"2620:82:a000::/48", "207563"}, - {"2001:559:4ad::/48", "7016"}, - {"2408:8256:2e61::/40", "17623"}, - {"240a:a3d1::/32", "143627"}, - {"240a:a5fe::/32", "144184"}, - {"240a:a7f5::/32", "144687"}, - {"240a:a7fb::/32", "144693"}, - {"2604:c4c0::/32", "11635"}, - {"2607:c980::/32", "399092"}, - {"2804:449c::/40", "267642"}, - {"2a0a:e5c0:2::/48", "207996"}, - {"2001:4870:a24f::/48", "10596"}, - {"2620:4d:a000::/48", "32995"}, - {"2a00:4802:2d0::/44", "8717"}, - {"2a0b:b87:ffd7::/48", "206804"}, - {"2408:8956:200::/40", "17622"}, - {"240e:980:4d00::/40", "4134"}, - {"2604:d600:1c23::/39", "32098"}, - {"2a02:26f7:24::/48", "36183"}, - {"2a09:5cc0::/29", "199163"}, - {"2404:e7:210::/28", "703"}, - {"2607:280::/32", "32365"}, - {"2406:3000:11:1013::/60", "4657"}, - {"2605:3380:4dfe::/47", "395174"}, - {"2a02:26f7:bc41::/46", "20940"}, - {"2a03:6083:9000::/33", "16285"}, - {"2a0d:2080::/29", "204646"}, - {"2402:800:5a47::/43", "7552"}, - {"2402:800:7120::/41", "7552"}, - {"2408:8256:2f7c::/46", "17623"}, - {"2620:119:500b::/43", "13443"}, - {"2a02:26f7:eb80::/48", "36183"}, - {"2001:678:808::/48", "210316"}, - {"2001:978:6408::/38", "174"}, - {"2402:800:3c55::/42", "7552"}, - {"2603:f220::/25", "397165"}, - {"2803:e0e0:1ff::/48", "269852"}, - {"2a02:26f0:a200::/48", "34164"}, - {"2a0b:2200::/29", "39806"}, - {"2a0e:b107:9da::/48", "213262"}, - {"2600:6c38:549::/43", "20115"}, - {"2a00:1728:25::/44", "34224"}, - {"2a01:c50f:b540::/38", "12479"}, - {"2001:559:7e::/47", "33491"}, - {"2001:559:c340::/48", "7922"}, - {"2001:67c:2b40::/48", "198235"}, - {"2001:da8:257::/48", "4538"}, - {"2803:2f80::/32", "61503"}, - {"2a03:a600::/29", "44600"}, - {"2404:3a80::/32", "135063"}, - {"2407:7a80:14::/42", "132384"}, - {"2804:5558::/32", "263102"}, - {"2a02:26f7:c100::/48", "36183"}, - {"2a05:e200::/32", "39767"}, - {"2001:559:823f::/48", "7015"}, - {"2001:43d8:c001::/34", "15022"}, - {"2804:cb8::/32", "53213"}, - {"2804:821c::/32", "272499"}, - {"2405:2300:ff00::/46", "13443"}, - {"240a:ab70::/32", "145578"}, - {"2606:6680:20::/48", "27323"}, - {"2a07:5940::/32", "43915"}, - {"2607:f4a0:5010::/48", "396926"}, - {"2800:bf0:30::/46", "52257"}, - {"2a00:e440::/32", "56876"}, - {"2001:4408:7d00::/38", "4758"}, - {"2603:c022:8000::/35", "31898"}, - {"2804:cac::/32", "262748"}, - {"2804:7028::/32", "270709"}, - {"2a01:4c01::/32", "58291"}, - {"2001:559:289::/48", "7016"}, - {"2001:559:310::/48", "7922"}, - {"2001:559:81b8::/48", "33287"}, - {"240e:947:2000::/36", "4134"}, - {"2605:3dc0:8::/48", "397952"}, - {"2620:149:5b6::/41", "714"}, - {"2804:5a30::/34", "268754"}, - {"2a0c:b641:455::/48", "208333"}, - {"2a0d:4cc0::/29", "30823"}, - {"2a10:d9c0::/29", "34907"}, - {"2403:7000:4100::/32", "45179"}, - {"2606:2800:20c::/46", "15133"}, - {"2a02:26f7:ec88::/48", "36183"}, - {"2a06:b080:a001::/48", "203776"}, - {"240a:ae57::/32", "146321"}, - {"2605:e540::/32", "13370"}, - {"2a02:26f7:cd48::/48", "36183"}, - {"2001:1248:9813::/45", "11172"}, - {"2401:d6c0::/32", "137199"}, - {"2804:204:2dc::/39", "28186"}, - {"2001:cb0::/38", "4637"}, - {"2605:5c0:c105::/44", "28885"}, - {"2804:14d:90ab::/45", "28573"}, - {"2806:230:402b::/48", "11888"}, - {"2a02:26f7:e850::/48", "36183"}, - {"2401:e980::/32", "64006"}, - {"2406:3d80::/32", "63620"}, - {"2600:6c20:a01::/46", "20115"}, - {"2a05:dcc0::/29", "15600"}, - {"2001:ce0:2900::/48", "7650"}, - {"2403:2040::/32", "17775"}, - {"2408:8256:3795::/48", "17816"}, - {"240e:44d:3280::/41", "4134"}, - {"2600:5c01::/39", "10796"}, - {"2602:ffb0:29::/48", "20473"}, - {"2620:0:150::/44", "16524"}, - {"2804:3f58::/33", "265886"}, - {"2806:2f0:24a2::/48", "17072"}, - {"2a0d:77c7:f6ce::/36", "7489"}, - {"2001:559:7e2::/48", "33657"}, - {"2001:1a11:af::/48", "42298"}, - {"240e:44d:e40::/42", "140358"}, - {"2607:f720::/32", "7377"}, - {"2620:12f:f000::/44", "43"}, - {"2804:ff4::/32", "53218"}, - {"2804:75e8::/32", "271077"}, - {"2001:559:5c2::/45", "7922"}, - {"2001:559:84d8::/48", "7922"}, - {"2001:da8:c3::/48", "138381"}, - {"2402:1580::/38", "17682"}, - {"2804:2050:8a8c::/33", "264485"}, - {"2804:7930::/32", "271290"}, - {"2a01:1b0:c010::/34", "31477"}, - {"2001:559:82e8::/48", "33660"}, - {"2001:559:8474::/48", "33650"}, - {"2001:8b8::/29", "1759"}, - {"2409:8924:2b00::/37", "56046"}, - {"2800:160:144e::/43", "14259"}, - {"2803:1a00:500f::/43", "262186"}, - {"2a03:8a0::/32", "200691"}, - {"2a0c:a940::/29", "9009"}, - {"2001:df0:64c0::/48", "147293"}, - {"2001:12f0::/42", "1916"}, - {"2606:7b00:4000::/32", "10538"}, - {"2804:7e28::/32", "271606"}, - {"2407:7a80:28::/43", "132384"}, - {"240a:a9ea::/32", "145188"}, - {"2a09:e200:e200::/48", "49121"}, - {"2405:6e00:8fc::/46", "133612"}, - {"2406:daa0:b080::/44", "16509"}, - {"2610:e0::/34", "2572"}, - {"2804:833c:8000::/33", "272185"}, - {"2a0e:5540:10::/46", "208258"}, - {"2001:559:86e4::/47", "33651"}, - {"2600:6c2e:49b::/39", "20115"}, - {"2604:ef00::/32", "18988"}, - {"2607:6100:101c::/48", "400053"}, - {"2001:67c:1118::/48", "2119"}, - {"2408:8459:1650::/36", "17816"}, - {"240e:980:8800::/40", "38283"}, - {"2600:1801:2::/47", "16552"}, - {"2804:14c:4186::/44", "28573"}, - {"2804:8488::/32", "272266"}, - {"2a0d:3842:1180::/48", "57629"}, - {"2408:8459:a430::/41", "17622"}, - {"2409:8963::/28", "9808"}, - {"240a:a381::/32", "143547"}, - {"2a04:5201:8018::/48", "200740"}, - {"2001:67c:2288::/48", "44073"}, - {"240e:44d:2280::/41", "4134"}, - {"2804:4f8::/36", "28263"}, - {"2806:1090::/32", "8151"}, - {"2401:d800:9c40::/42", "7552"}, - {"2409:8053:3000::/47", "56047"}, - {"240e:61:6000::/32", "4134"}, - {"2602:fedc:10::/42", "393857"}, - {"2605:dd40:8f00::/44", "16509"}, - {"2806:2f0:4003::/41", "17072"}, - {"2a02:26f0:9801::/39", "20940"}, - {"2a09:c140:3::/48", "210079"}, - {"2406:a6c0::/48", "18403"}, - {"2409:896a:4200::/39", "9808"}, - {"240a:ac9f::/32", "145881"}, - {"240e:3b8:ec00::/35", "140314"}, - {"2604:d600:1b08::/37", "32098"}, - {"2604:e180:1006::/33", "55002"}, - {"2804:1070:4000::/36", "28209"}, - {"2806:2f0:2141::/48", "22884"}, - {"2a00:fe00:c180::/48", "702"}, - {"2a07:9b83::/32", "50113"}, - {"2001:44c8:46c0::/42", "45430"}, - {"2400:cb00:376::/47", "13335"}, - {"2620:cb:c000::/48", "393965"}, - {"2620:10a:e000::/40", "11250"}, - {"2803:a4c0::/32", "264795"}, - {"2804:8468::/32", "272259"}, - {"2a02:2808:1006::/48", "47211"}, - {"2a0e:b107:b80::/45", "212995"}, - {"2c0f:f780::/32", "327805"}, - {"2001:559:c4d4::/48", "33287"}, - {"2001:df5:3780::/48", "24303"}, - {"2401:803e:2001::/42", "9919"}, - {"2602:fc3e::/48", "400190"}, - {"2604:4f00::/36", "47002"}, - {"2a0c:84c0::/29", "48635"}, - {"2001:4200:3210::/37", "2018"}, - {"2607:fcd0:ff03:1::/40", "8100"}, - {"2804:4cd0::/32", "267394"}, - {"2804:66c4::/32", "269581"}, - {"2001:400:b14::/48", "3671"}, - {"2001:fd8:a4::/46", "132199"}, - {"2402:800:9d0f::/43", "7552"}, - {"2406:da19::/36", "16509"}, - {"2804:2558:3::/48", "264275"}, - {"2a0d:ac80::/29", "204475"}, - {"2001:559:c2b7::/48", "13367"}, - {"2001:67c:1084::/48", "34686"}, - {"2a00:ef20::/29", "199752"}, - {"2a02:26f7:f085::/46", "20940"}, - {"2a11:a9c0::/29", "1239"}, - {"2c0f:fe10::/32", "20294"}, - {"2607:b500::/47", "54548"}, - {"2800:190:f3::/39", "11664"}, - {"2a02:26f7:d484::/48", "36183"}, - {"2a03:cdc0::/35", "31034"}, - {"2001:978:2:c1::c:0/38", "174"}, - {"2405:6800:3000::/33", "18207"}, - {"2803:14c0::/32", "28023"}, - {"2804:6a84::/32", "270341"}, - {"2806:10a0::/32", "8151"}, - {"2405:7000:400::/40", "59108"}, - {"240a:a4cf::/32", "143881"}, - {"2804:6788::/32", "269634"}, - {"2a0d:3bc0::/29", "60781"}, - {"2a10:d780:4::/32", "211997"}, - {"2402:800:b890::/42", "7552"}, - {"2a00:de61:100::/38", "16509"}, - {"2a05:5a00::/29", "212613"}, - {"2a05:b880::/29", "44746"}, - {"2401:4900:32e0::/39", "45609"}, - {"2408:8459:6810::/42", "17623"}, - {"2804:7210:200::/45", "270830"}, - {"2804:795c::/32", "271301"}, - {"2a04:4e40:210::/41", "54113"}, - {"2a07:a905:ffe4::/48", "204543"}, - {"2001:67c:2c92::/47", "60092"}, - {"2404:bf40:8083::/42", "139084"}, - {"2408:8256:2f80::/44", "17623"}, - {"2602:fd5d:100::/40", "62731"}, - {"2602:ff7a::/32", "394144"}, - {"2404:9740::/32", "135760"}, - {"2409:8948:9400::/31", "24445"}, - {"2606:2800:400d::/48", "14153"}, - {"2804:270::/40", "262814"}, - {"2a04:b2c0::/29", "5413"}, - {"2620:101:3000::/42", "19945"}, - {"2a00:cf00::/32", "41937"}, - {"2a02:26f0:74::/48", "34164"}, - {"2404:3d00:4117::/48", "3573"}, - {"2804:578::/32", "262516"}, - {"2a01:430:11::/48", "51134"}, - {"2a02:26f7:d449::/46", "20940"}, - {"2001:559:8445::/48", "21508"}, - {"2405:6e00:2ed::/48", "65442"}, - {"2409:8087:2005::/42", "56046"}, - {"240e:3be:7600::/39", "140313"}, - {"240e:978:2100::/36", "4134"}, - {"2804:14d:be00::/40", "28573"}, - {"2a00:ea60:200::/40", "43463"}, - {"2a01:8840:1be::/41", "12041"}, - {"2a02:2698:1400::/38", "50542"}, - {"2405:1c0:6751::/46", "55303"}, - {"2408:8456:3650::/39", "17816"}, - {"240a:a7c6::/32", "144640"}, - {"2803:7860::/32", "267829"}, - {"2804:1e20:10::/47", "264409"}, - {"2a02:2498:9002::/36", "13213"}, - {"2a0a:d580::/32", "60602"}, - {"2a02:26f7:d1c5::/46", "20940"}, - {"2a0e:97c0:332::/48", "210542"}, - {"2001:67c:21ec::/48", "56662"}, - {"2804:14b4::/32", "263345"}, - {"2a03:9e43::/32", "141760"}, - {"2001:1248:59be::/41", "11172"}, - {"2001:1248:971f::/42", "11172"}, - {"2001:4478:5a00::/32", "4802"}, - {"2408:8256:3b76::/44", "17623"}, - {"2608:4122:2::/48", "5927"}, - {"2800:440:1e00::/42", "27738"}, - {"2a00:1c60::/32", "47674"}, - {"2a02:88d:8100::/44", "48695"}, - {"2001:c10:ff00:a::/47", "7473"}, - {"2606:82c0:1::/46", "32167"}, - {"2607:f160:2e::/48", "22394"}, - {"2001:df1:6800::/48", "45671"}, - {"2408:8756:ca0::/41", "136958"}, - {"2001:559:1bf::/48", "33659"}, - {"2001:559:80d0::/48", "22909"}, - {"2001:678:57c::/48", "42239"}, - {"240c:cf82::/25", "23910"}, - {"2605:4400:8::/32", "40715"}, - {"2606:2800:4201::/48", "14153"}, - {"2a01:b580::/32", "12688"}, - {"2a02:2698:7c00::/38", "52207"}, - {"2a05:8f00::/29", "201199"}, - {"2400:9380:9fc0::/44", "136167"}, - {"2620:108:8002::/48", "14904"}, - {"2a02:888:148::/47", "48695"}, - {"2a10:c700::/32", "212324"}, - {"2001:559:8561::/48", "7015"}, - {"2403:b100:2014::/32", "9989"}, - {"2604:d600:1105::/44", "32098"}, - {"2620:149:fe::/47", "714"}, - {"2803:3a80::/32", "23383"}, - {"2a0c:8900::/29", "200462"}, - {"2001:49c8::/32", "22284"}, - {"2a02:26f0:ab01::/37", "20940"}, - {"2001:559:8037::/48", "33491"}, - {"2001:559:c17e::/48", "33652"}, - {"2600:140f:8::/47", "20940"}, - {"2606:6000:4000::/36", "10838"}, - {"2800:160:1dd2::/45", "14259"}, - {"2801:11:800::/48", "14080"}, - {"2a02:2420::/32", "197075"}, - {"2a05:900::/29", "198930"}, - {"2001:559:81ea::/48", "33659"}, - {"2402:800:378d::/43", "7552"}, - {"240a:a8bc::/32", "144886"}, - {"2607:fdf0:5e8f::/43", "8008"}, - {"2a01:7f60:30::/32", "9115"}, - {"2a02:26f7:b904::/48", "36183"}, - {"2a07:b40::/29", "202629"}, - {"2a07:8980:103::/30", "198651"}, - {"2001:538::/32", "7381"}, - {"240e:109:804b::/48", "133774"}, - {"2604:d600:55f::/42", "32098"}, - {"2605:9f00::/38", "36473"}, - {"2a02:26f7:b409::/39", "20940"}, - {"2a03:be80:4::/44", "15510"}, - {"2001:559:c0::/48", "21508"}, - {"2001:559:8469::/48", "33659"}, - {"2401:1640::/32", "18254"}, - {"240a:a487::/32", "143809"}, - {"240e:95:8001::/48", "58542"}, - {"2a09:bac0:102::/47", "13335"}, - {"2408:84f3:2e50::/44", "17816"}, - {"2409:8a53:900::/38", "56047"}, - {"2606:1440::/32", "399100"}, - {"2804:3c78:f000::/48", "266214"}, - {"2a02:582:5c00::/34", "6799"}, - {"2a02:26f7:c181::/46", "20940"}, - {"2a04:4e42:601::/36", "54113"}, - {"2a0b:4200:2001::/48", "198433"}, - {"2a0c:9a40:808c::/48", "53356"}, - {"2a10:41c0::/29", "211645"}, - {"2405:c0:90::/48", "138881"}, - {"2a0e:dbc0::/46", "208366"}, - {"2001:df4:1d80::/48", "140878"}, - {"2402:5b00::/44", "18002"}, - {"2804:14c:5500::/40", "28573"}, - {"2a00:fc00:e000::/48", "50392"}, - {"2a07:2e80::/29", "203201"}, - {"2a0e:bbc0:8001::/48", "11251"}, - {"2408:8000:9fff::/48", "138421"}, - {"240a:ab1a::/32", "145492"}, - {"2001:559:c390::/48", "33657"}, - {"2408:8459:e250::/37", "17816"}, - {"240e:947:6000::/32", "4134"}, - {"2a0b:4340:a1::/48", "134575"}, - {"2804:13b0:7c00::/38", "263546"}, - {"2804:71dc::/32", "270816"}, - {"2409:8d0c::/30", "56042"}, - {"240e:44d:6280::/41", "4134"}, - {"2804:78dc::/32", "271270"}, - {"2a02:26f0:d701::/36", "20940"}, - {"2a07:40::/29", "16186"}, - {"2001:678:ad0::/48", "205597"}, - {"2600:1408:25::/36", "20940"}, - {"2a01:c8cf:ffe0::/43", "25454"}, - {"2a0e:9cc0::/29", "208905"}, - {"2600:1f01:4081::/48", "16509"}, - {"2607:4980::/32", "395261"}, - {"2a00:4e80::/32", "12754"}, - {"2a02:ee80:4242::/47", "21433"}, - {"2408:826c::/27", "4837"}, - {"2408:8956:1700::/40", "17816"}, - {"240a:a570::/32", "144042"}, - {"2607:f160:37::/48", "22394"}, - {"2806:230:6022::/48", "265594"}, - {"2a00:1fd0:ec00::/48", "29033"}, - {"2a0c:bdc0::/29", "51333"}, - {"2001:559:538::/48", "33659"}, - {"2402:800:98a9::/43", "7552"}, - {"2804:51c:8000::/34", "262495"}, - {"2804:5110::/39", "268428"}, - {"2a04:4e40:1400::/48", "54113"}, - {"2a07:20c0::/29", "48602"}, - {"2001:3c8:cb02::/35", "4621"}, - {"2001:da8:2f01::/40", "23910"}, - {"2409:40f1::/30", "55836"}, - {"240a:aa16::/32", "145232"}, - {"240e:44d:4a40::/42", "140357"}, - {"2605:afc0::/32", "14488"}, - {"2406:3002:40::/50", "138345"}, - {"2804:7d3c::/34", "271548"}, - {"2a09:f400::/29", "38983"}, - {"2001:3c8:2706::/48", "4621"}, - {"2a09:d240::/48", "30870"}, - {"2001:67c:2864::/48", "51091"}, - {"2804:7838:e000::/35", "271228"}, - {"2a02:5b0::/32", "35467"}, - {"2a02:ee80:4161::/45", "3573"}, - {"2c0f:fbb0::/32", "37055"}, - {"2001:559:1e5::/48", "33491"}, - {"2406:3c0::/32", "132315"}, - {"2607:f178:4::/47", "30217"}, - {"2408:8456:e440::/38", "17816"}, - {"2a02:26f7:e641::/46", "20940"}, - {"2a02:26f7:f1c8::/48", "36183"}, - {"2a0f:29c4::/30", "398481"}, - {"2001:4878:b347::/48", "12222"}, - {"2401:8e00:801::/34", "9260"}, - {"2402:8100:266f::/43", "45271"}, - {"2806:1020:702::/32", "8151"}, - {"2001:559:c489::/46", "7922"}, - {"2001:4c08:2020::/45", "3356"}, - {"2401:4900:54b1::/48", "45609"}, - {"2408:8644::/35", "140726"}, - {"2a09:b240::/32", "21269"}, - {"2a0e:cf80::/29", "210661"}, - {"2001:1248:5f4b::/43", "11172"}, - {"2804:69fc::/37", "270304"}, - {"2a00:1968::/48", "41528"}, - {"2a0a:e240::/31", "205893"}, - {"240a:a87c::/32", "144822"}, - {"240e:978:d00::/40", "134756"}, - {"2a02:26f0:6b01::/37", "20940"}, - {"2a02:26f7:f980::/48", "36183"}, - {"2a10:6780::/29", "204790"}, - {"2001:559:535::/48", "7922"}, - {"2401:5800::/32", "24481"}, - {"2408:8956:b900::/40", "17816"}, - {"2800:160:1531::/41", "14259"}, - {"2804:6ee8:2000::/36", "270626"}, - {"2001:1a11:9a::/48", "8781"}, - {"2a02:e10::/32", "43646"}, - {"2001:df4:7000::/48", "45561"}, - {"2801:0:1d0::/45", "52378"}, - {"2a01:808::/27", "3209"}, - {"2001:8c8::/32", "6700"}, - {"2406:f900:28::/43", "132829"}, - {"2408:8956:7500::/40", "17816"}, - {"2a0e:b105:100::/44", "212996"}, - {"2a0f:aac0::/47", "16509"}, - {"2400:cb00:a4b0::/46", "13335"}, - {"2804:6970::/32", "270270"}, - {"2a00:5641::/32", "13030"}, - {"2a05:3580:d400::/34", "35807"}, - {"2400:d400:5eae::/48", "24238"}, - {"2402:800:41e7::/44", "7552"}, - {"2404:4f02::/40", "137840"}, - {"2408:8459:e210::/42", "17623"}, - {"2602:ff16:10::/46", "29802"}, - {"2a02:2178::/29", "29075"}, - {"2001:67c:640::/48", "59398"}, - {"2001:df5:2200::/48", "133156"}, - {"240a:aafa::/32", "145460"}, - {"2604:5cc0:1fff::/32", "13351"}, - {"2620:12d:e019::/48", "3356"}, - {"2804:c48:ffff::/48", "52687"}, - {"2a02:26f7:c04d::/42", "20940"}, - {"240e:f7:2000::/36", "134771"}, - {"2600:1488:c061::/40", "20940"}, - {"2604:d600:536::/41", "32098"}, - {"2a01:660::/29", "48951"}, - {"2a02:a00:10::/35", "15987"}, - {"2401:d800:df30::/41", "7552"}, - {"2409:40f2:2000::/32", "55836"}, - {"240a:ac43::/32", "145789"}, - {"240a:adfc::/32", "146230"}, - {"2804:335c:f000::/36", "265391"}, - {"2409:8087:8005::/44", "9808"}, - {"2604:a900::/32", "27539"}, - {"2a03:efc0:900::/40", "33438"}, - {"2401:ac00::/32", "9268"}, - {"240a:a079::/32", "142771"}, - {"240a:a71e::/32", "144472"}, - {"240a:a9c5::/32", "145151"}, - {"240e:438:220::/43", "140647"}, - {"2605:c00:100::/40", "46920"}, - {"2607:f6f0:1800::/40", "15830"}, - {"2620:64:a000::/47", "397277"}, - {"2804:18c::/32", "28637"}, - {"2406:6140::/32", "137102"}, - {"2606:2800:4214::/44", "15133"}, - {"240e:3b4:7800::/39", "4134"}, - {"2a02:2268::/32", "197902"}, - {"2a02:26f7:25::/48", "20940"}, - {"2a06:5b00::/29", "41937"}, - {"2406:a2c0::/32", "135845"}, - {"240a:a14b::/32", "142981"}, - {"2602:807:50e0::/47", "55136"}, - {"2607:f250:d010::/48", "7046"}, - {"2607:f6f0:4000::/48", "29884"}, - {"2804:62b4:8000::/36", "269313"}, - {"2406:e400:deee::/34", "7642"}, - {"240a:a411::/32", "143691"}, - {"240e:84c:40::/44", "140345"}, - {"2a0f:b506:ff01::/45", "206313"}, - {"2402:800:b010::/42", "7552"}, - {"240a:afc4::/32", "146686"}, - {"2600:1409:6001::/36", "20940"}, - {"2804:550c:e000::/35", "268686"}, - {"2a04:d880::/29", "5587"}, - {"2a0a:90c0:1000::/47", "205080"}, - {"2a0d:77c7:f1e5::/37", "7489"}, - {"2001:559:318::/48", "7922"}, - {"2001:559:8547::/48", "7016"}, - {"2409:802f:2905::/44", "9808"}, - {"2600:1806:511::/48", "16552"}, - {"2605:a5c0::/32", "54161"}, - {"2804:6a60::/32", "270332"}, - {"2a07:6c40::/29", "29505"}, - {"2a03:5640:f043::/40", "2906"}, - {"2a0e:f880::/29", "207902"}, - {"2001:559:828f::/48", "7922"}, - {"240a:a336::/32", "143472"}, - {"2402:800:5671::/44", "7552"}, - {"2404:2440:eeee::/48", "138521"}, - {"240a:aa7c::/32", "145334"}, - {"2a03:32c0::/44", "48503"}, - {"2a0e:b107:11d0::/47", "58015"}, - {"2001:550:1304::/37", "174"}, - {"2001:559:86ea::/48", "33651"}, - {"2801:16e:6::/42", "19429"}, - {"2804:5bc::/32", "28658"}, - {"2001:678:cf0::/48", "60557"}, - {"2600:1413:1000::/48", "24319"}, - {"2603:c0f1::/36", "6142"}, - {"2804:2bf0:8100::/33", "262740"}, - {"2a0c:3340::/29", "39602"}, - {"2a10:2a80:1ab::/48", "207727"}, - {"2001:c20:4879::/46", "3758"}, - {"240e:981:6100::/36", "4134"}, - {"2a07:7800:7::/29", "31727"}, - {"2001:ee0:a640::/33", "45899"}, - {"2401:d800:bdf2::/38", "7552"}, - {"2803:9880::/32", "264640"}, - {"2a02:128:10::/48", "48709"}, - {"2a0b:b87:ff14::/48", "210667"}, - {"2001:1900:23ce::/36", "3356"}, - {"2402:800:91ee::/43", "7552"}, - {"2402:800:97fe::/36", "7552"}, - {"2605:8240::/32", "398113"}, - {"2804:2af0::/45", "265126"}, - {"2a00:1c10:cd0::/44", "50300"}, - {"2a03:f80:359::/48", "56630"}, - {"2600:1417:5f::/48", "38040"}, - {"2800:68:3a::/47", "61468"}, - {"2800:440:146::/48", "27738"}, - {"2a00:1678:3cc0::/48", "49453"}, - {"2a09:7c47::/32", "44094"}, - {"2a0e:2b04::/30", "1239"}, - {"240e:37c:aa00::/39", "140330"}, - {"2602:fc20::/36", "6461"}, - {"2620:11f:5000::/40", "393869"}, - {"2804:165c::/32", "263284"}, - {"2a02:26f7:cb11::/42", "20940"}, - {"2c0f:efe8::/32", "327795"}, - {"2001:550:1e02::/34", "174"}, - {"2001:df0:5dc0::/48", "149324"}, - {"240a:a195::/32", "143055"}, - {"2001:b88::/33", "33915"}, - {"2408:8256:3360::/43", "17623"}, - {"2408:8656:30fc::/46", "17623"}, - {"2600:6c3a:77::/44", "20115"}, - {"2800:160:1add::/42", "14259"}, - {"2804:102c::/32", "263623"}, - {"2a10:cc42:1790::/46", "20473"}, - {"2408:8956:d640::/40", "17622"}, - {"240a:ac0b::/32", "145733"}, - {"2600:1008:a020::/40", "22394"}, - {"2001:559:8105::/48", "7016"}, - {"2407:4240::/46", "136678"}, - {"2409:8008::/40", "24547"}, - {"2602:805:6000::/48", "36127"}, - {"2a07:e880::/29", "202333"}, - {"2c0f:fbf0:20::/28", "32653"}, - {"2400:1a00:b031::/41", "17501"}, - {"240e:44d:4580::/41", "4134"}, - {"2600:380:9000::/38", "20057"}, - {"2605:e340::/40", "8036"}, - {"2a01:bc80:1::/44", "32590"}, - {"2a05:a884:de10::/48", "7473"}, - {"2404:4f80:18::/42", "58715"}, - {"2804:3f10:4203::/35", "262566"}, - {"2a00:ae00::/29", "34263"}, - {"2a02:5740:9::/48", "58065"}, - {"2001:df6:5180::/48", "38215"}, - {"2a01:8840:8e::/43", "12041"}, - {"2400:9380:9100::/47", "4809"}, - {"2800:bf0:80c0::/47", "52257"}, - {"2a03:9240::/32", "202632"}, - {"2a0a:d6c0:eff4::/48", "211454"}, - {"2001:db0:4800::/37", "17766"}, - {"2403:4800:1200::/32", "9443"}, - {"2407:e80:2::/47", "58689"}, - {"2409:8087:1400::/38", "56044"}, - {"2604:cb00::/32", "7029"}, - {"2801:1b:8800::/48", "19429"}, - {"2a04:b800::/29", "204348"}, - {"2001:559:86e6::/47", "7725"}, - {"2001:fb0:1078::/48", "55844"}, - {"2602:fc09:806::/43", "13780"}, - {"2804:7f1c::/48", "271667"}, - {"240a:a646::/32", "144256"}, - {"240a:af11::/32", "146507"}, - {"2620:eb:8000::/48", "35873"}, - {"2804:14d:a000::/41", "28573"}, - {"2804:4838::/32", "267105"}, - {"2806:2f0:8103::/42", "17072"}, - {"2603:4:1300::/48", "44273"}, - {"2803:840:ba00::/48", "263793"}, - {"2a01:c50f:d400::/40", "12479"}, - {"2c0f:f230::/32", "328193"}, - {"2001:559:871a::/48", "21508"}, - {"2400:1a00:bde1::/33", "17501"}, - {"2408:840d:1c00::/42", "17621"}, - {"2604:1180::/32", "25625"}, - {"2a02:26f7:c981::/46", "20940"}, - {"2a02:26f7:cb01::/46", "20940"}, - {"2001:44c8:3100::/40", "45781"}, - {"2606:2800:4a5c::/46", "15133"}, - {"2001:559:7ca::/48", "7922"}, - {"2400:1a00:8001::/46", "17501"}, - {"2405:7f00:a2a0::/37", "133414"}, - {"240a:a3f4::/32", "143662"}, - {"240e:438:1c40::/38", "4134"}, - {"2800:160:1807::/43", "14259"}, - {"2801:0:260::/48", "52427"}, - {"2a05:b0c6:300::/40", "8100"}, - {"2a05:dfc7:5::/48", "204136"}, - {"2001:559:830b::/48", "7922"}, - {"2405:9800:b418::/48", "133481"}, - {"2620:f6:8000::/48", "35922"}, - {"2804:3fa8::/32", "265905"}, - {"2a01:c50f:4580::/41", "12479"}, - {"2001:559:27c::/47", "33652"}, - {"2001:559:846c::/48", "20214"}, - {"2605:6c80:8000::/33", "40676"}, - {"2a02:26f7:c045::/46", "20940"}, - {"2402:b140::/32", "135425"}, - {"240e:438:1e40::/34", "4134"}, - {"2800:b40:201::/46", "262220"}, - {"2804:88:8002::/35", "28135"}, - {"2a03:11c0::/32", "199657"}, - {"2001:559:3ec::/48", "33652"}, - {"2401:d800:2aa0::/41", "7552"}, - {"2620:12c:b052::/48", "13448"}, - {"2a04:180::/29", "174"}, - {"2001:559:110::/48", "33657"}, - {"2409:8959:cb54::/37", "56040"}, - {"240a:a6c0::/32", "144378"}, - {"2a00:11c0:77::/48", "42360"}, - {"2a00:8860:700::/40", "210266"}, - {"2a0f:f041::/32", "205715"}, - {"2001:2000:6100::/32", "1299"}, - {"2401:d800:f4d0::/42", "7552"}, - {"2602:fd2c::/48", "398499"}, - {"2a04:5781:2000::/40", "12337"}, - {"2a0a:d6c0:226::/48", "212014"}, - {"2001:559:c0c2::/45", "33657"}, - {"2001:4870::/32", "3549"}, - {"240e:108:30::/41", "4134"}, - {"2800:bf0:8000::/44", "52257"}, - {"2804:84fc:1500::/36", "272550"}, - {"2806:2f0:9343::/42", "17072"}, - {"2a00:1e20::/29", "34661"}, - {"2a02:26f0:b::/43", "20940"}, - {"2a02:26f7:dcc0::/48", "36183"}, - {"2a0d:d040::/29", "197036"}, - {"2001:5a0::/34", "6453"}, - {"2001:67c:266c::/48", "25417"}, - {"2404:bf40:8381::/41", "139084"}, - {"240a:a1fc::/32", "143158"}, - {"240a:a584::/32", "144062"}, - {"2600:6c10:f282::/45", "20115"}, - {"2607:3f80::/32", "32248"}, - {"2620:13a:3000::/44", "14414"}, - {"2001:43f8:11f1::/48", "37282"}, - {"2602:fcd5:2::/47", "399122"}, - {"2a03:90c0:10::/39", "199524"}, - {"2001:559:82fb::/48", "7016"}, - {"2405:fd80:1001::/40", "135391"}, - {"2804:77b0::/32", "271193"}, - {"2a0e:97c0:580::/44", "210662"}, - {"2001:1248:988f::/43", "11172"}, - {"2602:807:6004::/48", "53978"}, - {"2a02:166b::/32", "51088"}, - {"2a03:54c0:1e52::/48", "51762"}, - {"2001:4878:c102::/47", "12222"}, - {"2404:bf40:a141::/48", "7545"}, - {"2409:8c85:aa0c::/48", "56042"}, - {"2602:ff96:1a::/48", "40676"}, - {"2604:a00:2::/43", "19318"}, - {"2800:160:1a8d::/43", "14259"}, - {"2804:5824::/32", "268109"}, - {"2a02:26f7:d181::/46", "20940"}, - {"2a03:5880:105::/32", "12757"}, - {"2a05:6c80::/29", "43366"}, - {"2001:559:c313::/48", "33652"}, - {"2001:fd8:32c0::/42", "132199"}, - {"2409:8019::/34", "134810"}, - {"240a:a75e::/32", "144536"}, - {"2a01:4207::/48", "48149"}, - {"2a02:26f7:e304::/48", "36183"}, - {"2406:3001:22:19::/47", "4657"}, - {"2408:8957:a00::/40", "17622"}, - {"2a07:f840::/29", "201116"}, - {"2600:7800::/28", "22646"}, - {"2800:160:1df7::/44", "14259"}, - {"2803:2a0::/32", "266849"}, - {"2a02:cb43:8006::/48", "20546"}, - {"2a03:b480::/32", "24993"}, - {"2409:803c:2100::/37", "9808"}, - {"2a02:27f0::/32", "4455"}, - {"2001:67c:1b38::/48", "203688"}, - {"2001:13d2:380e::/47", "7303"}, - {"2402:800:72d0::/42", "7552"}, - {"2600:1012:b000::/42", "6167"}, - {"2600:1417:1d::/48", "24319"}, - {"2a02:868:4012::/36", "13247"}, - {"2a02:26f7:ec5d::/42", "20940"}, - {"2001:438:70::/32", "6461"}, - {"2001:559:813a::/45", "7015"}, - {"2600:140f:b::/48", "9498"}, - {"2600:6c3a:72::/45", "20115"}, - {"2804:7598:c020::/34", "271057"}, - {"2806:230:400d::/48", "11888"}, - {"2001:df0:8800::/48", "23901"}, - {"2408:8256:2d7c::/46", "17623"}, - {"2408:8406:8400::/39", "4808"}, - {"2001:480:61::/40", "668"}, - {"2001:dcc:700::/48", "23600"}, - {"2001:1248:98dc::/46", "11172"}, - {"2401:3400:9000::/33", "45352"}, - {"2607:2280::/32", "14487"}, - {"2803:65e0:30::/32", "270034"}, - {"2804:3e10::/32", "266571"}, - {"2a02:6160::/32", "47272"}, - {"240a:accc::/32", "145926"}, - {"2a02:21b2:ac18::/48", "57370"}, - {"2a02:f380::/29", "199516"}, - {"240e:983:1e09::/40", "4134"}, - {"2804:4284:4000::/38", "267505"}, - {"2a04:4e40:6210::/44", "54113"}, - {"2a0d:9bc0::/32", "25540"}, - {"2402:800:c000::/34", "7552"}, - {"2610:88:3::/38", "14037"}, - {"2806:2f0:43e3::/37", "17072"}, - {"2a03:2880:f24d::/43", "32934"}, - {"2a0d:20c0::/29", "200689"}, - {"2401:d800:f8f0::/39", "7552"}, - {"240a:a148::/32", "142978"}, - {"240a:a984::/32", "145086"}, - {"240a:ab8c::/32", "145606"}, - {"2a03:2880:f244::/47", "32934"}, - {"240e:979:4e00::/40", "134770"}, - {"2a02:26f7:c980::/48", "36183"}, - {"2001:559:537::/48", "7016"}, - {"2404:7180:f010::/48", "23848"}, - {"2606:ae00:8800::/35", "7287"}, - {"2804:6cac::/32", "270484"}, - {"2806:230:3002::/48", "265594"}, - {"2a00:2380::/25", "2856"}, - {"2a03:2880:f146::/44", "32934"}, - {"2402:b400:4090::/41", "45960"}, - {"2602:107:110::/48", "10796"}, - {"2620:1d5:c9a::/38", "14773"}, - {"2001:67c:16c0::/48", "5588"}, - {"2801:144::/42", "264835"}, - {"2a02:2090:e400::/48", "48287"}, - {"2a02:6900:8810::/48", "7160"}, - {"2a0d:5f80::/29", "200899"}, - {"2400:9380:9bc0::/44", "136167"}, - {"2401:8040::/32", "136127"}, - {"240a:a4d8::/32", "143890"}, - {"2804:6df8::/32", "270567"}, - {"2a0e:b107:9f4::/48", "20473"}, - {"2604:8c00::/32", "4474"}, - {"2606:4700:9c60::/44", "13335"}, - {"2620:90:8000::/48", "23371"}, - {"2a09:bac0:14::/46", "13335"}, - {"2001:67c:2c78::/48", "9201"}, - {"2604:fb80:901::/37", "15128"}, - {"2001:559:867d::/48", "33652"}, - {"2001:559:c365::/48", "33657"}, - {"2001:df0:9080::/48", "63769"}, - {"2620:171:5d::/48", "42"}, - {"2800:160:1abf::/41", "14259"}, - {"2801:18:e800::/48", "19429"}, - {"2804:5b24::/32", "268821"}, - {"2a00:8100::/32", "9125"}, - {"2a01:a620:9::/48", "56911"}, - {"2a10:a500::/42", "205920"}, - {"2404:2280:124::/47", "24429"}, - {"2801:13:a800::/48", "271809"}, - {"2803:4fe0::/32", "271775"}, - {"2a00:6fa0:3200::/32", "49206"}, - {"2001:250:6002::/45", "23910"}, - {"2401:d800:5e00::/42", "7552"}, - {"2408:8459:2050::/39", "17816"}, - {"240a:a7a4::/32", "144606"}, - {"2a00:cee6:dcd::/32", "60268"}, - {"2a03:25e0:200::/40", "16376"}, - {"2001:5b0:4100::/36", "6621"}, - {"240a:ae98::/32", "146386"}, - {"2803:e0e0::/47", "269852"}, - {"2a05:d050:c040::/44", "16509"}, - {"2001:19e8:d1::/44", "2576"}, - {"2a04:49c0::/32", "60471"}, - {"240e:44d:3a00::/41", "140345"}, - {"2801:80:3d0::/48", "263076"}, - {"2804:17ac::/32", "263164"}, - {"2a02:660::/32", "9125"}, - {"2a02:26f7:f74d::/46", "20940"}, - {"2001:559:125::/48", "7725"}, - {"2400:1f00:b700::/48", "45769"}, - {"2804:2f10::/32", "264869"}, - {"2804:7838::/32", "271228"}, - {"2804:83b0::/32", "272212"}, - {"2a02:26f7:c400::/48", "36183"}, - {"2a02:2808:2601::/48", "35165"}, - {"2a05:41c0::/29", "15600"}, - {"2a10:eb80::/29", "211288"}, - {"2001:550:2608::/36", "174"}, - {"2001:559:c23f::/48", "33662"}, - {"2409:8004:2100::/36", "24547"}, - {"2603:40ff:2000::/36", "10578"}, - {"2605:640f:18fc::/48", "53667"}, - {"2406:5800:800::/38", "45577"}, - {"2602:802:4000::/48", "14038"}, - {"2605:c40::/32", "62668"}, - {"2804:6bf8::/32", "270437"}, - {"2a0c:f000:2000::/48", "205265"}, - {"2403:9f00::/32", "17420"}, - {"240e:44d:7940::/42", "140355"}, - {"2620:0:2d0::/48", "40528"}, - {"2804:5550:200::/33", "263067"}, - {"2001:c38:90a0::/46", "135566"}, - {"2400:fc00:4a10::/42", "45773"}, - {"240e:44d:2a00::/41", "140345"}, - {"2607:ffa8::/32", "21858"}, - {"2a02:1668::/32", "51088"}, - {"2a02:4a40:101::/48", "49528"}, - {"2001:250:4835::/48", "24360"}, - {"2001:2002::/32", "3301"}, - {"2600:6c38:448::/45", "20115"}, - {"2602:fc66::/36", "399771"}, - {"2606:f900:a402::/38", "812"}, - {"2406:bf00:1::/48", "45671"}, - {"240e:96b:600c::/46", "140368"}, - {"2610:20:9147::/48", "3477"}, - {"2804:1d60::/32", "264365"}, - {"2a00:47c0:311::/48", "27435"}, - {"2a02:26f7:fc01::/46", "20940"}, - {"2402:800:589b::/41", "7552"}, - {"2806:230:4040::/48", "265594"}, - {"2a00:1d58:f815::/44", "47524"}, - {"2a02:2230:3200::/39", "25467"}, - {"2a0d:d740:105::/48", "210036"}, - {"2001:559:2dc::/47", "33651"}, - {"2408:8256:3d8b::/48", "17816"}, - {"2408:8957:cf40::/40", "17816"}, - {"2409:8949:9f00::/30", "24445"}, - {"2409:8a04:c300::/34", "24547"}, - {"240a:a1d5::/32", "143119"}, - {"2602:fc9c::/36", "399603"}, - {"2620:fb::/48", "22651"}, - {"2804:ef4:6002::/37", "28642"}, - {"2a02:26f7:c4c4::/48", "36183"}, - {"2602:ffd1:1::/48", "29802"}, - {"240a:a09e::/32", "142808"}, - {"2605:4b40::/32", "26425"}, - {"2800:800:540::/43", "26611"}, - {"2804:4f8:4f01::/34", "28263"}, - {"2a02:26f7:d8c5::/46", "20940"}, - {"2a02:26f7:fb08::/48", "36183"}, - {"2001:559:454::/48", "7922"}, - {"2409:8002:2800::/39", "38019"}, - {"2001:1248:9a4c::/43", "11172"}, - {"2603:fcd0::/26", "397165"}, - {"2804:37f0:a100::/36", "266445"}, - {"2a07:e0c0::/30", "213206"}, - {"2401:fd80:1fd::/48", "43519"}, - {"2607:f148:6002::/36", "11734"}, - {"2804:2fec::/32", "52991"}, - {"2804:6e48::/32", "270586"}, - {"2a03:24c0:ffff::/48", "201342"}, - {"2402:ef2f:13::/48", "7633"}, - {"2803:6ce0:1cb0::/41", "269909"}, - {"240a:a925::/32", "144991"}, - {"240e:1::/37", "17897"}, - {"2600:1418:c001::/31", "20940"}, - {"2800:e0::/28", "13489"}, - {"2803:6c0::/32", "265639"}, - {"2a02:5d8::/32", "8596"}, - {"2a03:8600::/48", "3399"}, - {"2c0f:f3c8::/43", "328112"}, - {"2001:df0:30e::/48", "17547"}, - {"2600:c13::/32", "13791"}, - {"2800:320:9800::/48", "27882"}, - {"2804:4870:4800::/34", "267121"}, - {"2804:7a60:103::/40", "271367"}, - {"2a0e:5040::/29", "58280"}, - {"2600:8807:c782::/41", "22773"}, - {"2605:4840:2::/47", "63473"}, - {"2804:278c::/32", "263908"}, - {"2804:2a5c:c000::/34", "264071"}, - {"2804:2dbc::/32", "265300"}, - {"2804:7ee4::/32", "271653"}, - {"2a00:f30:10::/48", "12418"}, - {"2a02:26f7:ccc4::/48", "36183"}, - {"2001:550:6a03::/37", "174"}, - {"2001:4878:8204::/48", "12222"}, - {"2600:1488:6151::/42", "20940"}, - {"2001:ff0::/32", "9824"}, - {"2409:8c3c::/36", "24444"}, - {"240e:105:f600::/30", "4134"}, - {"2600:c02::/35", "12182"}, - {"2607:fdf0:5f68::/40", "8008"}, - {"2804:1168:2000::/32", "52904"}, - {"2806:266:400::/41", "27672"}, - {"2a0e:cd01:2100::/36", "23031"}, - {"2a11:cc80::/29", "59437"}, - {"2001:678:620::/48", "204388"}, - {"2001:1260:200::/42", "28536"}, - {"2001:42a8:101::/32", "36937"}, - {"2620:0:f0::/48", "26523"}, - {"2804:620::/32", "16735"}, - {"2804:4c54::/32", "267364"}, - {"2a02:26f7:de08::/48", "36183"}, - {"2a02:2e02:1d70::/40", "12479"}, - {"2001:1400:ffee::/48", "9201"}, - {"2001:4ba7::/48", "34936"}, - {"2408:8256:378b::/48", "17816"}, - {"240e:3b1:2200::/37", "136198"}, - {"2a03:aa40::/34", "12843"}, - {"2404:4600:7::/48", "45991"}, - {"2404:4a00:5542:3004::/48", "55423"}, - {"240e:967:e200::/39", "133774"}, - {"2a0e:8f02:2142::/45", "211414"}, - {"2804:72c0::/32", "270873"}, - {"2a0f:8642:b00c::/31", "25682"}, - {"2a11:5800::/29", "204790"}, - {"2001:67c:11bc::/48", "199462"}, - {"2a01:ce8c:9000::/33", "51964"}, - {"2a02:26f7:e7::/48", "20940"}, - {"2001:559:735::/48", "7015"}, - {"2001:df0:2e8::/48", "45896"}, - {"2406:f200::/32", "17534"}, - {"2409:8d80:7000::/32", "9808"}, - {"240a:af94::/32", "146638"}, - {"2804:3c6c::/32", "266210"}, - {"2a02:2c60::/32", "9063"}, - {"2a0d:f600::/29", "202277"}, - {"2001:1388:7bb1::/32", "6147"}, - {"2409:8c85:2020::/47", "9808"}, - {"240a:a047::/32", "142721"}, - {"2600:1404:27::/44", "20940"}, - {"240e:980:4800::/40", "134769"}, - {"2607:f5b0::/32", "19148"}, - {"2800:1e0:1100::/40", "7195"}, - {"2001:67c:1950::/48", "29037"}, - {"2001:4b20:100:57a::/61", "34288"}, - {"2401:d800:610::/42", "7552"}, - {"2a02:26f7:db89::/46", "20940"}, - {"2a02:26f7:e309::/42", "20940"}, - {"2001:520:105a::/48", "8103"}, - {"2408:8459:ce30::/41", "17622"}, - {"2408:8957:2140::/40", "17816"}, - {"2409:8a20:c800::/34", "56046"}, - {"240a:a001::/32", "142651"}, - {"2600:1406:4c00:1::/48", "20940"}, - {"2603:c000::/35", "31898"}, - {"2001:559:40::/48", "7922"}, - {"2001:559:1fb::/48", "33652"}, - {"2001:67c:1928::/48", "12843"}, - {"2402:e380:30d::/48", "138558"}, - {"2602:fdd7::/47", "2635"}, - {"2803:9800:5080::/39", "11664"}, - {"2402:800:b272::/40", "7552"}, - {"2402:2f80::/48", "36351"}, - {"2a01:238::/39", "6724"}, - {"2a0f:9240::/35", "49434"}, - {"2a12:9f40::/29", "400522"}, - {"240e:108:1185::/43", "4134"}, - {"240e:938:a10::/32", "4134"}, - {"2600:380:9800::/37", "20057"}, - {"2804:6240::/32", "269286"}, - {"2a02:2e02:2040::/43", "12479"}, - {"2a04:4e42:28::/45", "54113"}, - {"2a10:b680::/32", "44486"}, - {"2603:fe40::/26", "397165"}, - {"2620:13c:5000::/48", "14856"}, - {"2804:22c:f402::/38", "22689"}, - {"2804:3138:c000::/35", "265000"}, - {"2001:e60:d500::/42", "4766"}, - {"2409:8754:3e00::/32", "9808"}, - {"240a:a1aa::/32", "143076"}, - {"2a00:ac20::/32", "199581"}, - {"2a06:d040::/29", "50785"}, - {"2001:67c:664::/48", "42528"}, - {"2001:da8:1046::/36", "23910"}, - {"2402:d000::/39", "9329"}, - {"2408:8719::/30", "4837"}, - {"240a:ac3f::/32", "145785"}, - {"240c:c803::/32", "24362"}, - {"2605:a404:173::/45", "33363"}, - {"2804:c90:2000::/32", "28198"}, - {"2001:678:408::/48", "47451"}, - {"2400:d580:b0::/47", "131587"}, - {"2409:8055:61::/45", "56040"}, - {"2602:fd51::/36", "13895"}, - {"2001:559:80bb::/48", "19704"}, - {"2001:67c:550::/48", "202068"}, - {"2001:df6:4e80::/48", "141892"}, - {"2001:fd8:f180::/42", "132199"}, - {"2804:1100:3000::/32", "53178"}, - {"2001:506:100::/48", "20115"}, - {"2a0b:8fc1:2000::/32", "49825"}, - {"2607:f368:3220::/48", "46846"}, - {"2001:44b8:309f::/48", "4739"}, - {"2001:550:9c04::/47", "174"}, - {"2001:559:8258::/48", "7015"}, - {"2405:7e00:1000::/36", "17408"}, - {"2804:56dc::/32", "268028"}, - {"2a03:2680::/32", "39444"}, - {"2408:8459:b810::/42", "17623"}, - {"2a01:d8:8::/48", "43489"}, - {"2001:8f0::/30", "3329"}, - {"2800:160:18ed::/39", "14259"}, - {"2c0f:e848::/32", "328633"}, - {"2402:1b80:3100::/32", "63956"}, - {"2600:1419:a401::/36", "20940"}, - {"2607:fd48:106::/44", "13536"}, - {"2a0b:3c80::/29", "16097"}, - {"2a0c:2640::/32", "201750"}, - {"2001:678:b08::/48", "48749"}, - {"2401:1380::/32", "58411"}, - {"2804:2bb8::/32", "265171"}, - {"2a12:9940::/29", "49910"}, - {"2001:da8:b2::/48", "23910"}, - {"2400:dc00:c000::/46", "131111"}, - {"2803:6940:2000::/32", "61512"}, - {"2804:3180:301::/32", "265019"}, - {"2a02:188:1004::/48", "5491"}, - {"2409:804f:2100::/35", "9808"}, - {"2409:8b04::/31", "24547"}, - {"240a:a6c9::/32", "144387"}, - {"2a00:1e10::/29", "12494"}, - {"2a0e:aa06:440::/48", "135671"}, - {"2001:67c:1260::/48", "50398"}, - {"2408:8459:4250::/37", "17816"}, - {"2a02:6c60::/32", "49223"}, - {"2001:559:46c::/47", "7922"}, - {"2403:b840::/32", "138336"}, - {"2803:f7e0:2000::/43", "271773"}, - {"2a07:1b80::/40", "42473"}, - {"2a11:60c0:1::/48", "212217"}, - {"2408:8459:1610::/41", "17622"}, - {"2600:1005:b000::/41", "6167"}, - {"2600:1017:b400::/42", "22394"}, - {"2a02:26f7:f8c8::/48", "36183"}, - {"2401:d800:dbd0::/37", "7552"}, - {"2a0d:c740:3c::/48", "197226"}, - {"2a0f:9400:771d::/48", "53356"}, - {"2408:8956:cf40::/40", "17816"}, - {"240a:a31e::/32", "143448"}, - {"240a:a727::/32", "144481"}, - {"2600:2b00::/28", "6181"}, - {"2001:678:294::/48", "2613"}, - {"2001:67c:13b0::/48", "34953"}, - {"2620:11c:1001::/48", "46764"}, - {"2a03:f80:385::/48", "25467"}, - {"2a0b:2d40:bac4::/33", "209135"}, - {"2c0f:f3c8:11::/42", "328112"}, - {"2400:62a0::/32", "149644"}, - {"2403:3140::/32", "23910"}, - {"240a:a1c6::/32", "143104"}, - {"240a:a204::/32", "143166"}, - {"240a:a2b6::/32", "143344"}, - {"240a:acfc::/32", "145974"}, - {"2803:720::/32", "52317"}, - {"2a0a:c800::/30", "39798"}, - {"2a0b:c306::/32", "9119"}, - {"2001:c20:48c8::/48", "9255"}, - {"2001:d28::/32", "9621"}, - {"2600:1406:5001::/37", "20940"}, - {"2804:37c::/32", "52981"}, - {"2804:2cac:1112::/32", "265234"}, - {"2001:a98:8001::/33", "8517"}, - {"2804:1038::/32", "263625"}, - {"2a02:bc8:38::/29", "8641"}, - {"2001:da8:b80f::/43", "23910"}, - {"2406:2000:ef66::/48", "10310"}, - {"2409:804d:100::/36", "9808"}, - {"2607:f428:9112::/42", "20115"}, - {"2804:18:6040::/44", "10429"}, - {"2001:559:8796::/47", "20214"}, - {"2405:201:5a00::/37", "55836"}, - {"240c:c000::/32", "23910"}, - {"2a0b:4d07:101::/46", "44239"}, - {"2001:470:4f::/48", "271915"}, - {"2407:ba80::/32", "45062"}, - {"2607:f4e8:412::/36", "22822"}, - {"2a00:8a80::/29", "29119"}, - {"2a07:b0c0::/29", "202617"}, - {"2001:250:203b::/40", "23910"}, - {"2001:559:8709::/48", "33668"}, - {"2001:1a68:34::/48", "24723"}, - {"2603:c010:6000::/36", "31898"}, - {"2803:fb00::/32", "262248"}, - {"2a0a:7107:1af4::/48", "206986"}, - {"2a0d:4940::/29", "197706"}, - {"2001:559:81c3::/48", "33491"}, - {"2404:8d02:28c6::/39", "9587"}, - {"2a00:47c0:411::/48", "44568"}, - {"2001:559:8392::/48", "33651"}, - {"2001:67c:2bb4::/48", "207537"}, - {"2001:4878:2055::/48", "35994"}, - {"2408:8957:dac0::/39", "17816"}, - {"2804:3d98::/32", "266541"}, - {"2a02:2578:1301::/45", "51375"}, - {"2001:559:70e::/48", "7922"}, - {"2001:1248:9962::/44", "11172"}, - {"2408:8456:e240::/37", "17816"}, - {"2620:11a:a031::/48", "36040"}, - {"2a02:26f0:c001::/40", "20940"}, - {"2001:678:730::/48", "47869"}, - {"2001:1248:5625::/46", "11172"}, - {"2402:1500::/33", "4819"}, - {"2406:5c0::/32", "140395"}, - {"2801:150::/32", "3132"}, - {"2001:b400:f420::/22", "3462"}, - {"2402:7500:5ce::/42", "24158"}, - {"2403:c00:c00::/46", "17488"}, - {"240a:a144::/32", "142974"}, - {"2604:a040::/32", "38195"}, - {"2001:250:342b::/48", "138393"}, - {"2001:579:4f03::/44", "22773"}, - {"2600:1417:5001::/34", "20940"}, - {"2620:100:a001::/46", "19750"}, - {"2a02:26f7:f2c8::/48", "36183"}, - {"2001:3c8:d109::/48", "138547"}, - {"2402:ef2d:b::/30", "7633"}, - {"2406:6e00:109::/32", "17457"}, - {"2602:804:b000::/47", "397824"}, - {"2603:c002:9310::/37", "31898"}, - {"2605:dd40:8f10::/41", "398549"}, - {"2804:85bc:8000::/36", "272597"}, - {"2806:230:2011::/48", "11888"}, - {"2a09:bac0:268::/48", "13335"}, - {"2600:6c38:165::/44", "20115"}, - {"2001:41d0:fc00::/38", "35540"}, - {"2407:2080::/32", "3064"}, - {"2620:a3::/48", "116"}, - {"2804:7d50::/32", "271553"}, - {"2a0c:e440::/29", "200497"}, - {"2001:67c:280c::/48", "57839"}, - {"2001:da0::/32", "4718"}, - {"2402:f800:df01::/40", "7602"}, - {"2604:8200:98::/48", "23089"}, - {"2606:ec00:1000::/36", "40328"}, - {"2804:45c::/32", "28652"}, - {"2804:375c::/32", "266406"}, - {"2804:3b8c::/32", "266156"}, - {"2804:5210::/32", "268492"}, - {"2401:d800:bd40::/42", "7552"}, - {"2404:bf40:e800::/48", "7545"}, - {"240a:a56c::/32", "144038"}, - {"2620:41::/47", "11017"}, - {"2804:488c:8000::/33", "267128"}, - {"2804:5d28::/32", "268954"}, - {"2a03:9040::/32", "61281"}, - {"2001:559:35c::/48", "33491"}, - {"2001:1248:5b23::/41", "11172"}, - {"2408:8456:9610::/42", "134543"}, - {"240a:aa3d::/32", "145271"}, - {"2602:ffc5:400::/40", "398395"}, - {"2a02:118:2::/48", "43811"}, - {"2804:b38::/32", "52758"}, - {"2804:1dcc::/32", "264394"}, - {"2806:2f0:2483::/43", "22884"}, - {"2a0f:5900::/29", "62412"}, - {"2406:1400:c174::/48", "24342"}, - {"2c0f:1100::/32", "328255"}, - {"2804:1c00::/48", "28274"}, - {"2001:559:80c5::/46", "7922"}, - {"2a02:25e0:7700::/40", "41691"}, - {"2a07:e00::/48", "210083"}, - {"2a00:11e0::/32", "48072"}, - {"2a02:910::/32", "43070"}, - {"2a02:5320:f00::/40", "12189"}, - {"2803:53e0:1003::/45", "52468"}, - {"2804:859c::/32", "272590"}, - {"2a0f:8643:b00b::/48", "212149"}, - {"2001:a88::/32", "8426"}, - {"2401:5400:2010::/33", "4434"}, - {"2409:8959:cf44::/43", "9808"}, - {"240e:108:93::/48", "134768"}, - {"2001:3c8:9009::/48", "9464"}, - {"2001:559:868e::/48", "33490"}, - {"2a09:ca00:1::/29", "49434"}, - {"2001:ac0::/34", "8903"}, - {"2804:72ec::/32", "270884"}, - {"2001:559:40d::/48", "33287"}, - {"2804:65e4::/32", "269521"}, - {"2a0d:5280:f002::/47", "205989"}, - {"2607:8900::/32", "27298"}, - {"2804:6fc:cc01::/38", "28158"}, - {"2804:2910::/48", "263995"}, - {"2a02:7680::/32", "57119"}, - {"2a05:7cc0::/32", "61053"}, - {"2001:4888:8057::/44", "6167"}, - {"2406:7ec0:9::/33", "38074"}, - {"2620:137:d000:1::/64", "394161"}, - {"2803:9800:98d0::/39", "11664"}, - {"2a02:26f7:e04c::/48", "36183"}, - {"2804:1524::/32", "263373"}, - {"2a02:26f0:7901::/38", "20940"}, - {"2a0a:e805:300::/40", "64476"}, - {"2604:87c0::/32", "32267"}, - {"2620:127:7001::/48", "63016"}, - {"2804:3e60:610::/32", "266592"}, - {"2804:6738::/32", "269614"}, - {"2a09:6c80::/32", "43845"}, - {"2404:f4c0:f90a::/48", "139833"}, - {"2408:8456:e810::/42", "134543"}, - {"2a02:cc4:2f0::/44", "8211"}, - {"2001:4878:2321::/45", "12222"}, - {"2600:370f:3648::/42", "32261"}, - {"2a02:2a38:38::/32", "58073"}, - {"2001:559:315::/48", "33489"}, - {"240a:a73a::/32", "144500"}, - {"2600:1406:3a01::/37", "20940"}, - {"2606:97c0::/32", "7018"}, - {"2a02:2808:4101::/48", "196953"}, - {"2a03:28a0::/46", "201650"}, - {"2404:bc0:4000::/43", "137735"}, - {"240e:67c:8400::/38", "140329"}, - {"2602:808:3000::/44", "398883"}, - {"2a02:26f7:df49::/46", "20940"}, - {"2001:44c8:41c0::/42", "45430"}, - {"2408:84f3:3640::/44", "17623"}, - {"2600:1406:3c::/47", "20940"}, - {"2409:8062:2c00::/35", "9808"}, - {"2620:1e:e000::/48", "46701"}, - {"2a02:26f7:cbc0::/48", "36183"}, - {"2401:d800:d50::/42", "7552"}, - {"2620:5c:6000::/48", "27623"}, - {"2001:460:74::/46", "3561"}, - {"2001:503:f3da::/48", "7342"}, - {"2001:1a11:10f::/48", "8781"}, - {"2402:b180:9000::/36", "49544"}, - {"2403:4f80::/32", "131270"}, - {"2408:8256:318d::/43", "17623"}, - {"2408:8459:3610::/41", "17623"}, - {"2408:8957:1100::/38", "17816"}, - {"2a03:5f00:10b::/36", "29644"}, - {"2a09:bac0:464::/48", "13335"}, - {"2a0e:1d80:2::/45", "9009"}, - {"2001:400:201:75::/43", "293"}, - {"2001:559:583::/48", "7015"}, - {"2806:230:3020::/48", "265594"}, - {"2a03:fdc0::/32", "8818"}, - {"2a04:ac40::/29", "60140"}, - {"2a09:6840::/29", "43619"}, - {"2a0b:f4c0::/39", "205100"}, - {"2001:559:85f7::/48", "7016"}, - {"2001:1248:a4c7::/43", "11172"}, - {"2401:c240:6100::/32", "132847"}, - {"240a:a995::/32", "145103"}, - {"2804:7dc::/32", "262329"}, - {"2804:7b74::/32", "271433"}, - {"2a02:e20::/29", "5603"}, - {"2402:6b00::/32", "18126"}, - {"2409:8020:1051::/42", "56046"}, - {"2606:ae00:b000::/39", "7287"}, - {"2606:af40::/32", "40405"}, - {"2804:3ed4:2::/32", "266623"}, - {"2a00:7aa0::/32", "41114"}, - {"2a06:1287:41::/34", "61138"}, - {"2001:559:3e2::/48", "7016"}, - {"2605:b100:f000::/36", "36522"}, - {"2620:4d:402a::/48", "395403"}, - {"2a00:d420::/29", "15600"}, - {"2a02:26f7:16::/48", "36183"}, - {"2a0c:c880::/29", "398465"}, - {"2602:fd50:1::/48", "207609"}, - {"2606:4300::/48", "55045"}, - {"2804:540c::/32", "268625"}, - {"2a00:4800:230::/39", "8717"}, - {"2a01:4a0:57::/35", "201011"}, - {"2a04:c600::/29", "49544"}, - {"2a0b:2c0::/32", "205831"}, - {"2a10:9200::/47", "212441"}, - {"2c0f:f750::/32", "327724"}, - {"2001:6d0:ffd4::/48", "43832"}, - {"2001:f10::/32", "17709"}, - {"2602:fbc7::/40", "400442"}, - {"2604:d600:6ab::/36", "32098"}, - {"2804:1784:ff82::/41", "263152"}, - {"2600:100f:b0d0::/44", "6167"}, - {"2800:440:c5::/48", "27738"}, - {"2804:5fdc::/32", "269128"}, - {"2a03:60c1::/29", "31251"}, - {"2a0a:ce04::/47", "9009"}, - {"2001:559:8370::/48", "7922"}, - {"2001:dce::/47", "23869"}, - {"240a:a7df::/32", "144665"}, - {"240a:ad15::/32", "145999"}, - {"240a:af9c::/32", "146646"}, - {"2600:100f:b0e0::/43", "22394"}, - {"2600:1405:9001::/34", "20940"}, - {"2603:f7f0::/20", "397165"}, - {"2603:fb70::/29", "397165"}, - {"2801:1b8::/45", "28000"}, - {"2804:22a0:500::/36", "264112"}, - {"2a03:9d40:1000::/38", "41095"}, - {"2a0d:6900::/29", "35916"}, - {"2a10:5680::/29", "399975"}, - {"240e:267:3400::/36", "4134"}, - {"2a12:e100:3::/48", "51847"}, - {"2402:8100:20d5::/46", "55644"}, - {"2403:1940:20::/48", "137935"}, - {"2408:8456:6e40::/39", "17816"}, - {"2803:4480:7000::/36", "263189"}, - {"2804:41a4::/32", "267447"}, - {"2a0b:4700::/29", "50628"}, - {"2001:559:c007::/48", "7015"}, - {"2001:44c8:b000::/33", "45430"}, - {"2800:160:12c4::/44", "14259"}, - {"2a0e:97c0:36f::/48", "211484"}, - {"2a0e:ac40::/29", "202966"}, - {"2001:67c:2ea8::/48", "209718"}, - {"2402:3d00::/32", "9597"}, - {"2620:10f:7002::/44", "54765"}, - {"2001:67c:240c::/48", "12552"}, - {"240a:adc6::/32", "146176"}, - {"2804:30b8:caef::/43", "28154"}, - {"2804:4ff4::/32", "268360"}, - {"2a02:fb8::/32", "56329"}, - {"2001:559:35f::/48", "33652"}, - {"2409:804c:3019::/42", "9808"}, - {"2804:2fa0::/32", "264903"}, - {"2a0e:bb80::/30", "58317"}, - {"2001:df7:3d00::/48", "4748"}, - {"2800:bf0:3445::/43", "27947"}, - {"2804:9c4:20::/44", "33182"}, - {"2804:dec::/32", "52527"}, - {"2804:3b6c:a008::/33", "266148"}, - {"2a00:1798::/32", "8426"}, - {"2a02:26f7:cec8::/47", "36183"}, - {"2a05:fb80::/29", "31317"}, - {"2606:b640::/32", "394195"}, - {"2a02:cb80:406a::/45", "43766"}, - {"2a06:e144::/30", "203503"}, - {"2806:230:5008::/48", "265594"}, - {"2a11:880::/29", "60987"}, - {"2001:40b8::/32", "13039"}, - {"2400:b080:452a::/32", "45296"}, - {"2409:8924:3300::/37", "56046"}, - {"2801:1e:4000::/45", "262266"}, - {"2804:4e44::/32", "268250"}, - {"2c0f:f698:f001::/46", "37693"}, - {"240e:678:c200::/39", "140329"}, - {"240e:966:1000::/37", "133775"}, - {"2604:8540:fd01::/48", "33353"}, - {"2a02:26f0:9a00::/48", "34164"}, - {"2804:29f4::/37", "264047"}, - {"2402:1c00:d000::/34", "23838"}, - {"2408:84f3:9e40::/34", "17816"}, - {"2804:1368:ffe::/32", "262808"}, - {"2804:6888::/32", "269699"}, - {"2409:8d71::/29", "9808"}, - {"240a:a3da::/32", "143636"}, - {"2600:1419:1b::/48", "4230"}, - {"2804:a18::/32", "263022"}, - {"2001:4c00:893c::/29", "34695"}, - {"2400:eac0::/32", "5580"}, - {"2402:800:5163::/43", "7552"}, - {"240e:267::/38", "140328"}, - {"2602:fe59:10::/48", "46432"}, - {"2a02:4c00::/39", "12676"}, - {"2a06:a403::/29", "203596"}, - {"2001:559:81b1::/48", "7015"}, - {"2001:559:83fa::/48", "7922"}, - {"2a10:30c0::/30", "208256"}, - {"2001:559:c364::/48", "7016"}, - {"2001:648:2e02::/41", "5408"}, - {"2404:a140:17::/48", "138915"}, - {"240a:a065::/32", "142751"}, - {"2806:10ae:3::/48", "8151"}, - {"2404:4600:8::/48", "10158"}, - {"2409:8062:3002::/48", "139080"}, - {"2804:474::/32", "52980"}, - {"2a06:fdc0::/32", "34971"}, - {"2406:3001:23:2::/30", "4657"}, - {"2607:f348:3596::/32", "13354"}, - {"2620:119:50e3::/44", "14413"}, - {"2804:51d8::/32", "268480"}, - {"2001:448a:6050::/42", "7713"}, - {"2a09:f00:a::/47", "1836"}, - {"2a02:2e02:1e80::/41", "12479"}, - {"2a0b:8bc7::/32", "34420"}, - {"2001:4da8:c020::/34", "28824"}, - {"2402:800:5b01::/44", "7552"}, - {"240a:a7ac::/32", "144614"}, - {"2605:8000::/42", "4261"}, - {"2a0b:aa80::/29", "42669"}, - {"2001:418:8007::/37", "2914"}, - {"2402:92c0::/48", "4847"}, - {"2804:85e0::/32", "272606"}, - {"2a0c:5f00::/32", "20647"}, - {"2001:df7:8d00::/48", "138318"}, - {"2403:8300:80bf::/48", "55423"}, - {"2403:8600:60f0::/47", "45820"}, - {"2620:106:c009::/48", "11039"}, - {"2804:7500::/32", "271017"}, - {"2a0c:b641:16f::/48", "211139"}, - {"2001:4830:c100::/48", "395213"}, - {"2600:140f:d::/46", "9498"}, - {"2603:4:1404::/48", "44273"}, - {"2804:5c40::/32", "268897"}, - {"2a02:7a00:7::/32", "39904"}, - {"240a:a3f6::/32", "143664"}, - {"240a:aef5::/32", "146479"}, - {"2606:e100::/32", "47100"}, - {"2804:43a0:5000::/32", "267580"}, - {"2a02:26f0:cb01::/37", "20940"}, - {"2403:e840::/33", "149175"}, - {"240e:fe:e000::/35", "136199"}, - {"2804:1b00::/32", "61703"}, - {"2806:2f0:8201::/46", "17072"}, - {"2a0f:9400:7820::/46", "147028"}, - {"240a:ab7e::/32", "145592"}, - {"2600:1017:9400::/44", "22394"}, - {"2803:ef20::/48", "266774"}, - {"2a02:e200::/30", "8339"}, - {"2001:470:22::/48", "217"}, - {"2001:678:36c::/48", "3320"}, - {"2408:8459:2030::/41", "17622"}, - {"2804:4f4::/32", "262767"}, - {"2804:8348::/32", "272188"}, - {"240e:3b8::/35", "134773"}, - {"2620:11e:3010::/44", "19541"}, - {"2804:27fc::/32", "263933"}, - {"2a01:a280:101::/46", "21314"}, - {"2803:c000::/32", "264628"}, - {"2804:2ab8:69::/32", "53180"}, - {"2804:5c28:100::/45", "268892"}, - {"2a02:2698:5c00::/38", "41754"}, - {"2a02:26f7:e748::/48", "36183"}, - {"2a0d:5d40::/32", "210094"}, - {"2a11:c900::/29", "199468"}, - {"2a03:f85:8::/48", "60729"}, - {"2001:fd8:1a1::/46", "4775"}, - {"240e:422::/32", "4134"}, - {"2620:119:76::/48", "36692"}, - {"2804:5368::/32", "268582"}, - {"2a06:6540:2003::/48", "397568"}, - {"2400:a980:5500::/36", "133111"}, - {"2804:150::/32", "10954"}, - {"2804:41d0:400::/34", "267458"}, - {"2804:4d3c:1e20::/34", "267420"}, - {"2a02:26f7:d78d::/42", "20940"}, - {"2402:5300:810::/35", "45903"}, - {"240a:a627::/32", "144225"}, - {"2a00:14a8::/32", "35548"}, - {"2a02:26f7:bdc8::/48", "36183"}, - {"2001:559:c0b8::/46", "20214"}, - {"2001:678:6d4::/48", "200019"}, - {"2001:1a11:dc::/42", "42298"}, - {"2001:448a:4030::/41", "7713"}, - {"2a02:26f7:ef81::/46", "20940"}, - {"2001:559:c0fb::/48", "33652"}, - {"2001:df1:c500::/48", "136311"}, - {"2600:1408:e801::/37", "20940"}, - {"2a03:b80::/32", "198859"}, - {"2a03:ca80::/31", "20860"}, - {"2a0c:9a40:808a::/48", "48646"}, - {"2400:9c00::/32", "38880"}, - {"2403:7f00::/34", "56300"}, - {"2409:8914:be00::/39", "56044"}, - {"240a:a901::/32", "144955"}, - {"2607:ffb0:5005::/34", "6327"}, - {"2610:a1:1011::/46", "397228"}, - {"2620:13f:7004::/46", "55706"}, - {"2800:800:a72::/40", "26611"}, - {"2804:14c:5b93::/42", "28573"}, - {"2a00:1c50:1::/48", "30811"}, - {"2405:6d00::/39", "17887"}, - {"240a:a54f::/32", "144009"}, - {"240a:a7ee::/32", "144680"}, - {"2804:1bd8:4600::/36", "28224"}, - {"2a02:26f7:f208::/48", "36183"}, - {"2a02:2e02:9060::/39", "12479"}, - {"2c0f:fc89:76::/44", "36992"}, - {"2001:559:4f8::/48", "33489"}, - {"2001:14b8::/29", "16086"}, - {"2409:8904:5db0::/38", "24547"}, - {"2803:eb40::/32", "264712"}, - {"2001:559:862f::/48", "7922"}, - {"2405:1c0:6571::/46", "55303"}, - {"2607:f110:37::/41", "21889"}, - {"2800:2000::/20", "7303"}, - {"2001:559:1e1::/48", "33657"}, - {"2001:df0:425::/48", "131475"}, - {"2600:141d:8001::/25", "20940"}, - {"2603:f7c0::/26", "397165"}, - {"2607:1a00::/32", "22653"}, - {"2607:ffc0::/32", "18705"}, - {"2804:dd0:1100::/32", "28639"}, - {"2804:82f4::/32", "272167"}, - {"2409:8087:6a47::/44", "9808"}, - {"2604:8000::/32", "21528"}, - {"2620:11c:a002::/47", "26414"}, - {"2803:2180:2::/47", "27941"}, - {"2a00:f680::/32", "50171"}, - {"2a02:26f7:ed44::/48", "36183"}, - {"2001:678:414::/48", "31317"}, - {"2409:805b:2906::/38", "56040"}, - {"2620:103:4000::/44", "13953"}, - {"2a02:26f7:dc00::/48", "36183"}, - {"2620:9f:a000::/48", "400179"}, - {"2a02:26f7:db40::/48", "36183"}, - {"2001:bb0::/29", "5466"}, - {"240a:a4c5::/32", "143871"}, - {"2605:8d80:700::/36", "812"}, - {"2800:260::/31", "19429"}, - {"2a06:c3c0:1::/48", "47596"}, - {"2a0e:b107:1340::/44", "57429"}, - {"240a:a634::/32", "144238"}, - {"240a:a84e::/32", "144776"}, - {"2620:8b:8000::/48", "23307"}, - {"2a02:26f7:f540::/48", "36183"}, - {"2a07:7cc0::/29", "61232"}, - {"2001:559:57b::/45", "7015"}, - {"2001:559:817f::/48", "33489"}, - {"2001:559:c288::/48", "33660"}, - {"2402:93c0:20::/48", "59073"}, - {"2606:45c0:9591::/33", "26073"}, - {"2620:11a:a02f::/43", "43515"}, - {"2804:57ac::/32", "268079"}, - {"2a00:1f50::/32", "196655"}, - {"2001:4980::/33", "7753"}, - {"2402:800:3ae0::/44", "7552"}, - {"240e:964:8800::/38", "133775"}, - {"2803:c80::/32", "263192"}, - {"2a02:d600::/29", "35739"}, - {"2620:1f:8006::/48", "10908"}, - {"2804:5364:e000::/35", "268581"}, - {"2a02:26f7:d548::/48", "36183"}, - {"2a02:26f7:e6c9::/46", "20940"}, - {"2a03:b0a0:1::/46", "39923"}, - {"2001:559:2ed::/48", "7015"}, - {"2600:1403:8c01::/35", "20940"}, - {"2607:f3a0:a002::/48", "399817"}, - {"2620:dc:4000::/40", "22023"}, - {"2804:7c94::/32", "271505"}, - {"2001:678:580::/48", "50873"}, - {"2408:80f1:50::/44", "17621"}, - {"240a:a398::/32", "143570"}, - {"240e:108:9a::/48", "58466"}, - {"2604:1300::/34", "3833"}, - {"2804:3f9c::/32", "265902"}, - {"2a06:a800::/29", "203818"}, - {"2001:559:c339::/48", "7016"}, - {"2803:a3a0::/32", "267750"}, - {"2804:2488:4000::/35", "264228"}, - {"2a00:8a60::/29", "47610"}, - {"2401:d800:94d0::/42", "7552"}, - {"240e:3be:1400::/38", "134773"}, - {"240e:980:9000::/40", "134420"}, - {"2001:558::/31", "7922"}, - {"2408:843c:1600::/34", "140716"}, - {"240a:a29d::/32", "143319"}, - {"2605:8940::/32", "393398"}, - {"2408:8456:ba40::/37", "17816"}, - {"2c0f:1c00::/32", "328802"}, - {"2001:559:c48b::/48", "7015"}, - {"2408:8024:8000::/30", "17621"}, - {"2600:1010:b0c0::/43", "6167"}, - {"2a09:97c0::/48", "34775"}, - {"2605:a401:8627::/41", "33363"}, - {"2a01:4fe0::/32", "57928"}, - {"2a01:c50e:5d00::/34", "12479"}, - {"2a03:402::/32", "29141"}, - {"2a0b:8f80:300::/48", "200746"}, - {"2a0f:ca80::/47", "208046"}, - {"2001:df6:a680::/48", "45679"}, - {"2403:a040:cdef::/48", "38047"}, - {"2406:e740::/48", "140766"}, - {"2801:80:2310::/48", "267130"}, - {"2804:13b0:1c30::/44", "263546"}, - {"2a02:ad80::/29", "15633"}, - {"2a03:db80:4404::/48", "5501"}, - {"2a0a:8bc0::/29", "206021"}, - {"240a:aebe::/32", "146424"}, - {"2806:230:4014::/48", "265594"}, - {"2a04:140::/29", "1764"}, - {"2401:b400:13::/48", "58536"}, - {"2402:d000:1069::/45", "9329"}, - {"240a:a869::/32", "144803"}, - {"2620:121:1000::/48", "394010"}, - {"2804:43d4::/32", "267593"}, - {"2a0b:95c0::/32", "205555"}, - {"2001:550:1703::/48", "397384"}, - {"2001:559:8307::/48", "33490"}, - {"240a:a5cf::/32", "144137"}, - {"2a01:3e0:ff72::/29", "6453"}, - {"2a02:26f7:dbc0::/48", "36183"}, - {"2001:da8:8f01::/40", "23910"}, - {"2605:5000::/32", "20283"}, - {"2001:1248:8438::/41", "11172"}, - {"240e:980:4900::/40", "23724"}, - {"2607:c300::/32", "22915"}, - {"2607:fb58:f003::/36", "36086"}, - {"2a00:1b50::/43", "8343"}, - {"2a05:ae40::/29", "41723"}, - {"2a07:41c0::/32", "62240"}, - {"2001:1838:100b::/40", "23352"}, - {"2401:1f00::/32", "9268"}, - {"2610:128:4300::/32", "11686"}, - {"2001:67c:25b0::/48", "29105"}, - {"2001:1a68:3::/48", "24723"}, - {"2600:1405:d001::/34", "20940"}, - {"2803:5200:2000::/36", "52439"}, - {"2804:7804::/32", "271215"}, - {"2001:559:84ae::/48", "33659"}, - {"2001:559:8532::/48", "7725"}, - {"2001:559:c306::/48", "33662"}, - {"2a02:26f7:e545::/46", "20940"}, - {"2a02:7820::/32", "201873"}, - {"2a04:4e42:7e::/40", "54113"}, - {"2408:8459:9030::/41", "17622"}, - {"2801:80:23d0::/48", "268203"}, - {"2803:b1a0::/32", "267704"}, - {"2804:40c4::/32", "265980"}, - {"2402:1680:a::/48", "7590"}, - {"2409::/48", "142500"}, - {"2600:1fa0:60c0::/44", "16509"}, - {"2607:f8c0:203::/48", "25885"}, - {"2804:110c::/32", "52700"}, - {"2001:559:86e1::/48", "22909"}, - {"2409:805c:5::/36", "9808"}, - {"2001:b18:1017::/48", "47943"}, - {"2402:6640::/45", "134995"}, - {"2409:805c:4100::/36", "9808"}, - {"2a02:26f7:eb44::/48", "36183"}, - {"2a0b:99c0::/29", "207187"}, - {"2001:16a2:c2f0::/46", "39891"}, - {"2001:1948::/32", "210"}, - {"2407:38c0:61::/48", "59204"}, - {"2804:3d28:11::/46", "7063"}, - {"2804:5590::/32", "267942"}, - {"2a02:26f7:c108::/48", "36183"}, - {"2a02:26f7:cd04::/48", "36183"}, - {"2409:8060:3900::/31", "9808"}, - {"2600:1406:8401::/36", "20940"}, - {"2607:fcd0:100:6901::/51", "8100"}, - {"2803:7080::/32", "263172"}, - {"2a03:14e0::/32", "6908"}, - {"2001:67c:190::/48", "198568"}, - {"240e:982:6700::/40", "58563"}, - {"2602:fc60::/40", "33385"}, - {"2620:1b:e000::/48", "394805"}, - {"2a07:3a40::/34", "212734"}, - {"2a05:d480::/29", "57795"}, - {"2a0e:fd45:b52::/42", "44103"}, - {"2001:678:660::/48", "203829"}, - {"2001:678:de8::/48", "212834"}, - {"2408:8256:30a0::/39", "17816"}, - {"2804:e30:7e00::/39", "11338"}, - {"2806:107e:22::/32", "8151"}, - {"2a00:4802:b00::/37", "8717"}, - {"2a0b:4340:3331::/36", "48024"}, - {"2a0f:e401:111::/48", "204307"}, - {"2001:bf6::/32", "29670"}, - {"2401:2d00:c3e6::/44", "17625"}, - {"2401:d800:f1a0::/41", "7552"}, - {"2001:559:43c::/48", "7015"}, - {"2001:559:85ad::/46", "7015"}, - {"2402:5300:2110::/38", "45903"}, - {"2406:da70:2000::/40", "16509"}, - {"2408:805d:1000::/26", "17816"}, - {"2600:6c7f:f000::/48", "20115"}, - {"2600:9000:1106::/44", "16509"}, - {"2604:4500:900::/46", "29802"}, - {"2804:2bdc::/47", "265181"}, - {"2404:3d00:4138::/46", "3573"}, - {"2605:cdc0:11::/48", "398088"}, - {"2620:107:9044::/47", "22787"}, - {"2804:c2c::/32", "28191"}, - {"2806:1018:cc00::/40", "8151"}, - {"2001:4d0:108::/48", "24"}, - {"2600:9000:2159::/42", "16509"}, - {"2804:2140::/35", "53059"}, - {"2001:428:b20::/48", "7359"}, - {"2001:df4:5800::/48", "135885"}, - {"2405:13c0::/32", "135808"}, - {"2600:800::/30", "701"}, - {"2602:ff37::/36", "53981"}, - {"2804:90::/33", "28580"}, - {"2804:231c::/32", "61591"}, - {"2804:61f0::/46", "269266"}, - {"2001:678:888::/48", "209933"}, - {"2604:bf00::/38", "17185"}, - {"2605:5240:4900::/37", "397494"}, - {"2620:149:a17::/48", "714"}, - {"2600:140f:5201::/39", "20940"}, - {"2a02:26f7:c899::/46", "20940"}, - {"2001:559:5df::/48", "33651"}, - {"2401:d800:840::/42", "7552"}, - {"2406:6200:2000::/36", "23756"}, - {"2804:387c::/32", "266481"}, - {"2804:6460::/32", "269424"}, - {"2a02:bf0::/43", "25106"}, - {"2001:d68::/48", "7587"}, - {"2404:3900:1992::/48", "38320"}, - {"240e:108:1280::/44", "4134"}, - {"240e:44d:5380::/41", "4134"}, - {"2800:160:24fc::/46", "14259"}, - {"2804:575c::/32", "268061"}, - {"2a02:ee80:4204::/44", "3573"}, - {"2405:8700:3000::/48", "24168"}, - {"2804:a00:10::/47", "262838"}, - {"2804:4588::/32", "266933"}, - {"2a05:d000:e000::/40", "16509"}, - {"2a06:c07::/32", "59414"}, - {"2a0e:aa07:e500::/48", "147028"}, - {"240a:a101::/32", "142907"}, - {"2600:140b:8c01::/35", "20940"}, - {"2607:cc80::/35", "25664"}, - {"2607:fdb8:2::/47", "30496"}, - {"2804:6bb4:1600::/32", "270418"}, - {"2a02:26f7:d251::/46", "20940"}, - {"2a0b:8480::/29", "25341"}, - {"2a0e:fb46::/32", "51837"}, - {"2600:6c3a:c4d::/46", "20115"}, - {"2a00:139c::/32", "58069"}, - {"2001:67c:173c::/48", "60481"}, - {"2604:cb40::/32", "40020"}, - {"2a02:1397:5000::/40", "21351"}, - {"2a07:6380::/29", "44821"}, - {"2001:468:cc1::/43", "40220"}, - {"2409:8924:2700::/36", "56046"}, - {"240a:a7e8::/32", "144674"}, - {"2607:fc48:bc4b::/48", "40009"}, - {"2804:680c::/32", "269667"}, - {"2a0e:8f02:21a0::/46", "208763"}, - {"2001:400:210:105::/47", "293"}, - {"2401:d800:2eb0::/41", "7552"}, - {"2408:8456:c400::/42", "17622"}, - {"240e:679:e600::/30", "4134"}, - {"2806:20d:3242::/40", "32098"}, - {"2001:559:8118::/48", "33287"}, - {"2402:f840:2::/32", "137883"}, - {"2606:b40::/32", "393445"}, - {"2804:6d80::/32", "270537"}, - {"2a0d:b80::/32", "199971"}, - {"2605:9400::/32", "12042"}, - {"2a02:4bb::/29", "39605"}, - {"2a0e:eec7::/32", "51837"}, - {"2001:559:575::/46", "7016"}, - {"2402:800:7970::/40", "7552"}, - {"2605:f500:8111::/33", "1828"}, - {"2606:ae00:bac0::/37", "7287"}, - {"2804:6544::/32", "269479"}, - {"2a00:e2c0::/32", "6830"}, - {"2a06:2380::/29", "29423"}, - {"2620:18f::/32", "104"}, - {"2804:5eb0::/35", "269050"}, - {"2a02:26f0:f9::/48", "34164"}, - {"2a0b:dc80::/29", "206170"}, - {"2001:67c:258c::/48", "31424"}, - {"2001:df0:2ed::/48", "17932"}, - {"2402:800:99c5::/43", "7552"}, - {"240a:ac0c::/32", "145734"}, - {"2600:370f:9043::/42", "32261"}, - {"2a03:2880:f100::/47", "32934"}, - {"2001:dc7:1::/36", "24151"}, - {"2400:ca00::/39", "23688"}, - {"2604:d600:1570::/46", "32098"}, - {"2800:1e0:1700::/44", "7195"}, - {"2804:b8::/32", "52965"}, - {"2804:2dc8::/32", "265303"}, - {"2406:280::/32", "24372"}, - {"240e:983:1300::/48", "134419"}, - {"2c0f:eb00:1100::/40", "61266"}, - {"2001:559:8584::/47", "33651"}, - {"2400:9380:9050::/47", "4809"}, - {"2a00:11c0:60::/48", "197540"}, - {"2a02:ac80:e1::/43", "25145"}, - {"2001:559:875d::/48", "33287"}, - {"2408:8256:2d76::/48", "17816"}, - {"2c0f:7400::/32", "328720"}, - {"2001:1248:9a6c::/43", "11172"}, - {"2604:1580::/32", "54455"}, - {"2806:2f0:3021::/41", "17072"}, - {"2a0c:b980:1000::/36", "48096"}, - {"2001:67c:27d8::/48", "198494"}, - {"2605:f700:43::/44", "18978"}, - {"2804:8164::/32", "272451"}, - {"2806:230:2046::/48", "265594"}, - {"2806:230:4012::/48", "265594"}, - {"2001:678:70::/48", "57801"}, - {"2409:8028:3053::/40", "56041"}, - {"240e:3ba:1400::/38", "134773"}, - {"240e:44d:6400::/42", "140345"}, - {"2a01:42e0::/35", "29046"}, - {"2a02:40c1::/32", "48635"}, - {"2a0c:b642:1a08::/48", "202297"}, - {"2a0e:97c0:4b0::/44", "210542"}, - {"2001:559:c1b2::/48", "33491"}, - {"2001:728:0:5000::15ec/32", "2914"}, - {"2001:43f8:1070::/48", "328174"}, - {"240e:ff:b000::/36", "4134"}, - {"2600:1007:c04::/32", "22394"}, - {"2800:68:17::/44", "61468"}, - {"2a07:9080::/33", "6758"}, - {"2800:bf0:2900::/45", "52257"}, - {"2804:7390::/32", "270923"}, - {"2a02:26f0:9f01::/34", "20940"}, - {"2a09:7180::/30", "39614"}, - {"2001:43f8:1::/48", "327844"}, - {"240e:438:7020::/43", "140647"}, - {"2620:105:3000::/44", "20109"}, - {"2800:160:1be3::/43", "14259"}, - {"2a04:a470:10::/48", "2116"}, - {"2c0f:ef60::/32", "328346"}, - {"2a00:edc0:100::/44", "62597"}, - {"2401:ab00::/32", "17809"}, - {"2800:160:17de::/42", "14259"}, - {"2001:44b8:205a::/48", "7545"}, - {"2804:e30:be00::/39", "11338"}, - {"2a09:300::/29", "209899"}, - {"2a09:a7c4::/30", "13030"}, - {"2a11:5707:b00b::/48", "212149"}, - {"2001:67c:368::/48", "12509"}, - {"240a:a136::/32", "142960"}, - {"240e:45c:1e00::/40", "131285"}, - {"2620:e7::/48", "398451"}, - {"2a00:1fa2:80c0::/48", "42087"}, - {"2001:418:1401:26::/60", "2914"}, - {"2408:8957:d440::/40", "17622"}, - {"2603:fef0::/23", "397165"}, - {"2a03:8ea0::/32", "21321"}, - {"2a10:4646:1000::/36", "210662"}, - {"2400:cb00:390::/46", "13335"}, - {"2606:3280::/32", "20298"}, - {"2804:2f40:f005::/44", "264880"}, - {"2a03:1980::/40", "48260"}, - {"2a05:aec0::/29", "65540"}, - {"2a0c:a500:50::/40", "209385"}, - {"2001:559:25f::/48", "22258"}, - {"2600:14a0:81::/41", "20940"}, - {"2602:ff2f::/36", "22241"}, - {"2a01:7780::/32", "3225"}, - {"2a02:26f7:b584::/48", "36183"}, - {"2001:250:831::/46", "138182"}, - {"2001:559:1ed::/48", "33651"}, - {"240e:980:8200::/40", "58461"}, - {"2804:1bd8:8100::/36", "28224"}, - {"2a00:f40:1::/46", "43447"}, - {"2a02:26f7:ba81::/46", "20940"}, - {"2a12:4946:1222::/48", "211398"}, - {"2402:5300::/37", "45903"}, - {"240a:a95c::/32", "145046"}, - {"2804:154c:501f::/42", "263382"}, - {"2a02:26f7:db88::/48", "36183"}, - {"2400:3f80::/32", "7664"}, - {"2404:2280:106::/47", "24429"}, - {"2409:8d14:1700::/36", "56044"}, - {"2607:f098:2100::/35", "33363"}, - {"2802:8000::/31", "22927"}, - {"2001:b000:592::/47", "3462"}, - {"2804:4188::/32", "267439"}, - {"2001:559:866f::/48", "33662"}, - {"2001:559:c3c7::/48", "7922"}, - {"2001:559:c3d9::/48", "33650"}, - {"2001:648:2011::/48", "15690"}, - {"2409:804b:290b::/45", "9808"}, - {"2804:14c::/40", "28573"}, - {"2804:3784:2800::/32", "53121"}, - {"2804:37f0:f100::/36", "266445"}, - {"2806:2f0:6101::/46", "17072"}, - {"2c0f:fe38::/47", "33771"}, - {"2804:214:801d::/38", "26615"}, - {"2804:2960::/32", "264011"}, - {"2a02:26f7:f200::/48", "36183"}, - {"2001:559:80::/48", "7015"}, - {"240a:a0c7::/32", "142849"}, - {"240a:a4de::/32", "143896"}, - {"2600:370f:520a::/42", "32261"}, - {"2620:10a:4011::/48", "29792"}, - {"2804:610c::/32", "268347"}, - {"2a02:26f7:9f::/48", "20940"}, - {"2001:559:8340::/48", "7922"}, - {"2801:80:3ec0::/44", "272493"}, - {"2a00:4802:220::/44", "13124"}, - {"2a06:3084::/30", "57075"}, - {"240a:a472::/32", "143788"}, - {"2800:c70:402::/32", "23201"}, - {"2001:df7:8980::/48", "138787"}, - {"2400:fc00:9901::/33", "45773"}, - {"240e:96b:6027::/44", "140377"}, - {"2a01:578::/43", "16509"}, - {"2a0f:48c0::/29", "60781"}, - {"2001:4b8::/32", "14654"}, - {"2600:370f:6048::/42", "32261"}, - {"2607:fb10:7030::/45", "2906"}, - {"2620:0:5080::/48", "26462"}, - {"2001:559:867a::/45", "33651"}, - {"2001:559:c0d8::/48", "33662"}, - {"2001:67c:30::/48", "210961"}, - {"2001:67c:27f8::/48", "51040"}, - {"2405:3200:711::/32", "17639"}, - {"2803:6900:546::/47", "52423"}, - {"2a02:26f7:da49::/42", "20940"}, - {"2001:1900:229b::/48", "63168"}, - {"2401:ee00::/40", "23951"}, - {"2402:e7c0:80::/37", "59078"}, - {"240e:6b4:1000::/32", "4134"}, - {"2600:370f:37e5::/36", "32261"}, - {"2602:fe96::/36", "396502"}, - {"2001:559:7e4::/48", "7922"}, - {"2001:df4:3480::/48", "140905"}, - {"2402:1a80::/32", "134069"}, - {"2408:8344::/35", "140726"}, - {"2408:8957:ea00::/40", "17622"}, - {"2804:3d74:7::/39", "262617"}, - {"2a01:5ec0:9000::/36", "44244"}, - {"240a:a3fc::/32", "143670"}, - {"2600:3c0f:10::/45", "63949"}, - {"2803:9800:a024::/43", "11664"}, - {"2a01:4700::/48", "41151"}, - {"2001:8b0:0:50::/58", "20712"}, - {"2401:d800:9950::/42", "7552"}, - {"2409:801a:3001::/45", "132525"}, - {"240a:a44a::/32", "143748"}, - {"2804:45e4:6100::/35", "262567"}, - {"2600:140f:ec01::/38", "20940"}, - {"2a00:d3a0::/29", "15600"}, - {"2a06:a005:410::/44", "149296"}, - {"2001:559:c2aa::/48", "33651"}, - {"2001:dc8:d000::/48", "38737"}, - {"240a:a577::/32", "144049"}, - {"240e:3b7:c000::/37", "140315"}, - {"2600:9000:236e::/43", "16509"}, - {"2605:3000::/32", "12033"}, - {"2607:fcb8::/32", "6479"}, - {"2a00:6680::/46", "3320"}, - {"2a0c:9080::/29", "57353"}, - {"2001:418:1c01:1::/64", "20940"}, - {"240e:44d:5680::/41", "4134"}, - {"2620:104:2021::/46", "40185"}, - {"2803:d10::/32", "272035"}, - {"2a02:26f7:d205::/46", "20940"}, - {"240e:67a:1000::/37", "140330"}, - {"2600:1010:b1f0::/36", "22394"}, - {"2602:fd89::/36", "55129"}, - {"2400:adc7:3000::/39", "9541"}, - {"2402:8e00:3::/32", "38529"}, - {"240a:a7cf::/32", "144649"}, - {"2604:5e80:20::/48", "1700"}, - {"2804:3edc::/32", "266625"}, - {"2a00:b4a0::/32", "60388"}, - {"2800:4f0:10::/46", "28006"}, - {"2804:103c::/32", "52813"}, - {"2a00:a7c0::/32", "57866"}, - {"2a02:26f7:eb85::/46", "20940"}, - {"2a06:f1c0::/29", "203361"}, - {"2001:559:80b0::/45", "33657"}, - {"2400:fc00:85b0::/38", "45773"}, - {"2409:8055:35::/46", "56040"}, - {"240a:a300::/32", "143418"}, - {"2a09:3702::/32", "49981"}, - {"240e:250:1700::/34", "4134"}, - {"2804:7038::/32", "270713"}, - {"2a04:6580::/29", "6831"}, - {"2a06:a004:1000::/36", "61138"}, - {"2001:559:849b::/48", "7016"}, - {"2001:559:84a5::/46", "7922"}, - {"2001:559:c1b5::/48", "33657"}, - {"2402:db00::/32", "132142"}, - {"2406:e780:eb2::/48", "63677"}, - {"2407:ab00::/48", "45270"}, - {"2801:80:3910::/48", "270530"}, - {"2001:470:60::/48", "50763"}, - {"2402:800:5101::/44", "7552"}, - {"2408:84f3:bc40::/38", "17816"}, - {"2604:6600:2800::/32", "40676"}, - {"2608:4163:1::/48", "5927"}, - {"2803:e880:9001::/34", "52468"}, - {"2a0f:8840::/30", "207840"}, - {"2001:678:d98::/48", "3303"}, - {"2001:7f8:27::/48", "29535"}, - {"2804:214:8731::/41", "26615"}, - {"2a02:e982:53::/48", "19551"}, - {"2a03:8960::/32", "200914"}, - {"240a:aa6c::/32", "145318"}, - {"2602:80a:2005::/46", "14618"}, - {"2804:2ce4:4000::/34", "265249"}, - {"2804:451c::/32", "267673"}, - {"2806:370:4040::/40", "28403"}, - {"2a00:4700::/32", "56357"}, - {"2a0b:2340::/29", "205763"}, - {"2c0f:fcb8::/32", "37323"}, - {"2402:d40::/32", "63850"}, - {"2408:8956:9d00::/40", "17816"}, - {"240e:44d:4080::/41", "4134"}, - {"2804:cb0:d302::/45", "52742"}, - {"2a02:26f7:b401::/46", "20940"}, - {"2001:56a:10::/31", "852"}, - {"2001:1248:9754::/44", "11172"}, - {"2401:4900:4d40::/44", "45609"}, - {"2402:800:5571::/44", "7552"}, - {"2407:a800:3e12::/48", "4713"}, - {"240e:6b3::/35", "136200"}, - {"2806:217::/38", "28394"}, - {"2603:c002:1710::/36", "31898"}, - {"2604:d600:c38::/46", "32098"}, - {"2804:1ab0:8100::/33", "61876"}, - {"2a02:e981:27::/44", "19551"}, - {"2a04:e802:19::/45", "57976"}, - {"2a0d:ed80:300::/40", "6830"}, - {"2400:cb00:f00e::/48", "13335"}, - {"240a:a4fe::/32", "143928"}, - {"2600:140b:4801::/38", "20940"}, - {"2804:1454::/32", "263325"}, - {"2001:12b0::/32", "28618"}, - {"2001:44a0::/32", "2506"}, - {"2001:44b8:3083::/48", "4739"}, - {"2409:8080:2ab0::/41", "9808"}, - {"240a:a2f8::/32", "143410"}, - {"2620:74:22::/45", "7342"}, - {"2804:954:400::/45", "263073"}, - {"2a00:5580::/29", "5564"}, - {"2001:678:a1c::/48", "29001"}, - {"240a:ab4e::/32", "145544"}, - {"2600:6c38:25e::/42", "20115"}, - {"2806:265:300::/37", "13999"}, - {"2a0d:fec0:77::/48", "47481"}, - {"2a10:7cc0::/29", "201086"}, - {"2001:559:8664::/48", "33650"}, - {"2001:559:c2c1::/48", "33287"}, - {"2001:df7:ce00::/48", "135905"}, - {"2001:1840:c0b0::/44", "5400"}, - {"2620:128:e080::/48", "22317"}, - {"2804:22a0:b::/45", "264112"}, - {"2a04:ee40::/29", "15796"}, - {"2001:550:1d05::/48", "9009"}, - {"2408:8459:2440::/40", "17623"}, - {"240a:ac70::/32", "145834"}, - {"2602:fc3b:401::/36", "399970"}, - {"2804:5818::/35", "268106"}, - {"2a00:9f00:b::/45", "29314"}, - {"2a02:bf8:1601::/48", "1654"}, - {"2a02:26f7:c141::/46", "20940"}, - {"2001:43f8:11b0::/48", "327923"}, - {"2001:4408:4d00::/44", "55824"}, - {"2402:9500:d01::/32", "55720"}, - {"2403:c300::/32", "24157"}, - {"2404:bf40:8040::/47", "7545"}, - {"2605:b800:787::/48", "27435"}, - {"2804:67b8::/41", "269646"}, - {"2806:2f0:6003::/42", "17072"}, - {"2a02:26f7:b805::/46", "20940"}, - {"2a0a:31c0::/29", "62098"}, - {"2600:370f:7290::/47", "32261"}, - {"2408:8456:7200::/42", "17622"}, - {"2605:1980:1::/48", "65007"}, - {"2408:8459:1e10::/42", "17623"}, - {"240a:aea5::/32", "146399"}, - {"2801:1e:6800::/48", "14080"}, - {"2a00:18d8::/47", "8697"}, - {"2c0f:f738:2000::/45", "61317"}, - {"2606:2800:410b::/45", "15133"}, - {"2607:f750:3000::/40", "23473"}, - {"2806:230:202a::/48", "265594"}, - {"2a06:8400::/31", "198463"}, - {"2a0a:f780::/29", "49191"}, - {"2001:559:c289::/48", "7922"}, - {"2001:42d0:af00::/40", "33764"}, - {"240a:a54c::/32", "144006"}, - {"2806:230:2036::/48", "265594"}, - {"2a00:9ac0::/32", "198096"}, - {"2a0e:1c80:3::/48", "174"}, - {"240a:a1ae::/32", "143080"}, - {"240a:ad65::/32", "146079"}, - {"240e:438:6240::/37", "4134"}, - {"2803:6900:1400::/48", "52423"}, - {"2806:2f0:43c1::/42", "17072"}, - {"2a09:2dc0::/32", "30860"}, - {"2001:678:81c::/48", "12552"}, - {"2001:c10:ff09::/43", "7473"}, - {"2001:1248:a600::/43", "11172"}, - {"2001:16a2:7d00::/38", "39386"}, - {"2409:8028:90::/41", "56041"}, - {"240a:a71c::/32", "144470"}, - {"2620:11b:e0a6::/43", "3356"}, - {"2804:43b4::/32", "267585"}, - {"2806:20d:3238::/41", "32098"}, - {"2402:4e00::/47", "45090"}, - {"2404:880:26::/48", "38750"}, - {"2804:3100::/32", "264986"}, - {"2a01:8840:ad::/48", "207266"}, - {"2a02:e30:f050::/48", "61056"}, - {"2804:14c:6500::/42", "28573"}, - {"2804:4ebc::/32", "268279"}, - {"2804:72e4:4001::/32", "270882"}, - {"2001:67c:2848::/48", "213100"}, - {"2001:8a0::/32", "3243"}, - {"2408:80ea:7a80::/44", "17623"}, - {"240a:a348::/32", "143490"}, - {"240a:aa4b::/32", "145285"}, - {"2a0c:b642:2fff::/48", "34641"}, - {"2001:559:82bc::/48", "33659"}, - {"2001:dce:4::/48", "23869"}, - {"2804:4cb4::/32", "267386"}, - {"2400:cc00:8b00::/37", "17477"}, - {"2610:e8:8000::/33", "6223"}, - {"2600:370f:74f2::/39", "32261"}, - {"2801:1c8:301::/48", "19429"}, - {"2a02:26f7:bcc9::/46", "20940"}, - {"2a06:a080::/32", "207220"}, - {"2001:df0:ca00::/47", "137442"}, - {"2001:12f8:4::/47", "11644"}, - {"2001:1698::/32", "34683"}, - {"2a04:88c5::/32", "28753"}, - {"2606:6780:8::/48", "20324"}, - {"2804:200::/32", "28187"}, - {"2804:32bc::/32", "265096"}, - {"2a00:7145:c1::/46", "51430"}, - {"2a03:6280::/29", "203936"}, - {"2a05:a884:de20::/48", "7473"}, - {"2001:67c:2358::/48", "39287"}, - {"240a:a08b::/32", "142789"}, - {"2804:2e94::/32", "52780"}, - {"2804:30fc::/46", "263009"}, - {"2804:5848::/32", "268119"}, - {"2806:2f0:3361::/46", "17072"}, - {"2a05:fbe0::/31", "200474"}, - {"2a09:bac0:43::/44", "13335"}, - {"2407:ed00:1f00::/32", "9587"}, - {"2408:8459:ca30::/41", "17622"}, - {"2600:1417:f801::/28", "20940"}, - {"2605:ba40::/32", "60171"}, - {"2620:48:8000::/48", "1767"}, - {"2804:7a10::/32", "271345"}, - {"2a02:26f7:d8::/48", "36183"}, - {"2001:250:814::/48", "23910"}, - {"2001:1430::/32", "29243"}, - {"2409:8053:2000::/47", "56047"}, - {"2602:fec3:f00::/40", "62563"}, - {"2a01:5b0:2c::/47", "8561"}, - {"2001:480:20::/48", "48"}, - {"2001:559:879f::/48", "33662"}, - {"2408:8406:7800::/39", "4808"}, - {"2409:8904:65b0::/38", "24547"}, - {"2602:ffb0:28::/48", "64245"}, - {"2804:714c::/32", "270780"}, - {"2a11:7e05::/32", "206446"}, - {"2400:cb00:90::/48", "13335"}, - {"2409:8054:3d::/46", "56040"}, - {"2a0f:ca00:8002::/48", "209907"}, - {"2804:6c0:700::/43", "262418"}, - {"240e:3bb:7600::/39", "140313"}, - {"240e:44d:7900::/42", "140345"}, - {"2600:100e:f110::/36", "6167"}, - {"2a02:26f7:ce45::/46", "20940"}, - {"2a02:26f7:e084::/48", "36183"}, - {"2a10:2f01:242::/48", "213316"}, - {"2401:d800:220::/41", "7552"}, - {"240e:1f:5000::/36", "58466"}, - {"2800:160:1cfc::/46", "14259"}, - {"2804:2a0:c000::/34", "28272"}, - {"2804:3644::/32", "266338"}, - {"2a00:1d58:fa21::/48", "47524"}, - {"2620:78:c000::/48", "62692"}, - {"2803:8720::/32", "266755"}, - {"2a0b:b840:1::/48", "42167"}, - {"2a0c:4180::/32", "29854"}, - {"2a10:55c0::/29", "206332"}, - {"2001:13d0::/35", "7303"}, - {"2a02:26f7:ea00::/48", "36183"}, - {"2a0e:5800::/29", "212660"}, - {"240a:a1d2::/32", "143116"}, - {"2602:ffc5:152::/47", "7489"}, - {"2804:67ac:13::/32", "269643"}, - {"2001:559:8355::/48", "33287"}, - {"2400:cb00:496::/44", "13335"}, - {"2600:6c10:14d::/43", "20115"}, - {"2605:3040::/32", "12183"}, - {"2a02:6c20:819::/48", "24641"}, - {"2a02:ee80:4227::/44", "3573"}, - {"2a0f:9400:7826::/47", "9833"}, - {"2804:28::/32", "28162"}, - {"2804:c90:2::/35", "28198"}, - {"2404:cb00::/32", "17937"}, - {"2408:8459:9a30::/41", "17622"}, - {"240a:adcd::/32", "146183"}, - {"2804:23e8::/32", "262855"}, - {"2804:269c:fe47::/48", "47065"}, - {"2a02:26f7:da40::/48", "36183"}, - {"2a04:a7c0::/32", "198785"}, - {"2a0d:b201:c0::/42", "206026"}, - {"2a0e:97c3:7bc::/48", "20473"}, - {"2a12:a900:1::/48", "16509"}, - {"2001:4998:171::/44", "10310"}, - {"2401:4900:7010::/44", "45609"}, - {"2620:106:3004::/40", "36671"}, - {"2402:e380:120::/45", "139073"}, - {"240a:aff4::/32", "146734"}, - {"2600:8807:93ce::/42", "22773"}, - {"2a0e:9580::/32", "61381"}, - {"2a10:240::/29", "62240"}, - {"2409:8055:3012::/47", "9808"}, - {"2a00:1228:6::/39", "31148"}, - {"2001:df3:2e80::/45", "9833"}, - {"2001:4490:d7a0::/46", "9829"}, - {"2602:803:4075::/48", "398223"}, - {"2800:bf0:3b81::/42", "27947"}, - {"2402:9900:e11::/48", "27435"}, - {"2602:ff98:140::/38", "63447"}, - {"2a01:410::/46", "30844"}, - {"2a02:26f7:c5cd::/42", "20940"}, - {"2a02:5320:300::/40", "12189"}, - {"2a04:f580:8210::/47", "4134"}, - {"2001:559:81f1::/48", "7015"}, - {"2404:e280::/47", "58866"}, - {"240a:a150::/32", "142986"}, - {"2603:c011:2000::/36", "31898"}, - {"2607:f428:9390::/44", "20115"}, - {"2a01:540::/33", "12389"}, - {"2a06:4e40::/29", "200567"}, - {"2404:138:46::/47", "38299"}, - {"240a:a547::/32", "144001"}, - {"2606:5580:8000::/38", "63242"}, - {"2801:11e:3::/48", "3816"}, - {"2804:6c0:600::/43", "262418"}, - {"2c0f:fa58::/32", "37356"}, - {"2001:da8:244::/48", "24349"}, - {"240e:3bc:9200::/36", "140317"}, - {"2804:7a70::/32", "271371"}, - {"2a01:5300::/32", "2840"}, - {"2001:67c:510:1165::49:2/48", "15486"}, - {"2001:4998:20::/48", "14776"}, - {"2400:54c0::/40", "136352"}, - {"2402:800:6150::/38", "7552"}, - {"240a:adde::/32", "146200"}, - {"240d:c010:64::/48", "139341"}, - {"2607:fb90:c900::/35", "21928"}, - {"2a04:6400:191a::/29", "62240"}, - {"2a0a:b980::/32", "203604"}, - {"2a0c:8d40::/29", "202825"}, - {"2001:559:83dd::/48", "33657"}, - {"2402:b801:400::/35", "18371"}, - {"2405:8a00:2073::/44", "55824"}, - {"2407:19c0::/36", "141519"}, - {"2605:59c2:1000::/39", "36492"}, - {"2a09:d2c1:1::/48", "209669"}, - {"2408:8456:3200::/41", "17623"}, - {"2409:8020:81::/43", "56046"}, - {"2801:1a:4800::/48", "269790"}, - {"2804:898::/32", "262380"}, - {"2a00:1188:f::/48", "8455"}, - {"2a01:8640::/48", "59711"}, - {"2a07:9944:20::/48", "58305"}, - {"2a0e:e080::/32", "42487"}, - {"2408:8459:8650::/36", "17816"}, - {"240a:a796::/32", "144592"}, - {"240a:a918::/32", "144978"}, - {"2800:650:101::/32", "28032"}, - {"2801:80:2800::/40", "262441"}, - {"2001:2000:9000::/40", "3301"}, - {"2603:c0f0:2800::/43", "6142"}, - {"2a01:4520::/32", "25459"}, - {"2a03:f680::/32", "1547"}, - {"2001:67c:1308::/48", "211693"}, - {"2408:8456:4c40::/39", "17816"}, - {"2a02:26f7:b9d1::/42", "20940"}, - {"2600:1488:c041::/42", "20940"}, - {"2804:16f4::/32", "263110"}, - {"2a02:26f7:c5::/48", "20940"}, - {"2a02:26f7:c140::/48", "36183"}, - {"2001:648:25e0::/48", "203348"}, - {"240e:67b:8800::/38", "140330"}, - {"2602:ffb0:27::/48", "32780"}, - {"2a03:8640::/32", "8491"}, - {"2a0e:bf00:161::/31", "202539"}, - {"2001:f20:1000::/48", "9875"}, - {"2401:3400:1000::/33", "45352"}, - {"2402:800:97a9::/43", "7552"}, - {"2605:8040::/32", "398008"}, - {"2806:230:2048::/48", "265594"}, - {"2a00:d28::/32", "31662"}, - {"2001:559:c4ad::/48", "33659"}, - {"2001:67c:16b0::/48", "198093"}, - {"2001:dce:8401::/38", "23869"}, - {"2600:1010:b040::/42", "6167"}, - {"2603:c013:2000::/36", "31898"}, - {"2606:2800:1::/48", "15133"}, - {"2620:15:c000::/48", "7029"}, - {"2804:838::/32", "262359"}, - {"2804:497c::/32", "262896"}, - {"2805:f10:f12::/45", "262182"}, - {"2001:16a2:d000::/37", "39386"}, - {"2400:6180::/48", "14061"}, - {"2408:84e2:4c0::/32", "17621"}, - {"2806:2f0:33a1::/46", "17072"}, - {"2a00:1d58:ac00::/35", "47524"}, - {"2a02:4544:e0::/44", "197207"}, - {"2606:2800:508a::/45", "15133"}, - {"2a02:26f7:f5c5::/46", "20940"}, - {"2a0b:af40::/29", "205543"}, - {"2a02:2788:1000::/32", "12392"}, - {"2a09:ab80::/29", "60733"}, - {"2405:25c0:a100::/40", "131951"}, - {"2406:3002:40:4000::/44", "4657"}, - {"2406:4d00::/48", "23724"}, - {"2600:1002:b050::/40", "22394"}, - {"2607:f348::/34", "13354"}, - {"2804:4390::/34", "28194"}, - {"2001:67c:2c68::/48", "62396"}, - {"2001:1630::/29", "28847"}, - {"2409:8052:3900::/32", "9808"}, - {"240a:a34e::/32", "143496"}, - {"240a:af06::/32", "146496"}, - {"2800:160:11d3::/44", "14259"}, - {"2a0c:4481:8::/47", "204720"}, - {"2001:559:844b::/48", "7922"}, - {"2001:4210::/34", "25818"}, - {"2600:6c7f:9060::/48", "20115"}, - {"2a02:1630::/32", "30848"}, - {"2a0e:41c0::/29", "208566"}, - {"2001:67c:14d8::/48", "61413"}, - {"2001:890::/32", "8447"}, - {"2404:54c0::/32", "17831"}, - {"2406:daa0:4020::/44", "16509"}, - {"2804:e1c::/47", "52545"}, - {"2804:3c20::/32", "266192"}, - {"240a:a663::/32", "144285"}, - {"240a:af8e::/32", "146632"}, - {"2804:6c64::/32", "270465"}, - {"2a01:5400::/32", "12775"}, - {"2a02:101c::/32", "61352"}, - {"2400:b880::/32", "133556"}, - {"2800:510::/32", "28022"}, - {"2804:203c::/32", "264479"}, - {"2804:7fd4::/32", "271712"}, - {"2a01:c00::/26", "6805"}, - {"2a02:26f7:e5::/48", "20940"}, - {"2a03:3460::/32", "207015"}, - {"240a:a14f::/32", "142985"}, - {"240e:16:c800::/48", "38283"}, - {"240a:60:f01e::/48", "9605"}, - {"240e:640:8f00::/33", "4134"}, - {"2606:9100:9000::/36", "1421"}, - {"2620:129:9003::/48", "395506"}, - {"2804:c00:c100::/36", "52655"}, - {"2001:559:2ce::/48", "33659"}, - {"2a02:26f7:b9a8::/48", "36183"}, - {"2a0d:b780::/29", "209549"}, - {"2a0f:3f00::/29", "207902"}, - {"2a11:e487:dead::/48", "212568"}, - {"240a:ae83::/32", "146365"}, - {"2001:438:4a::/48", "399033"}, - {"2001:468:cf0::/44", "40220"}, - {"2001:67c:26f4::/48", "57821"}, - {"2800:b70:11::/48", "262191"}, - {"2804:259c:c000::/34", "52772"}, - {"2804:79fc::/32", "271340"}, - {"2a00:b380::/32", "198471"}, - {"2a02:26f0:d700::/48", "34164"}, - {"2a04:b900::/31", "8587"}, - {"2a04:f400:3000::/48", "36351"}, - {"2600:140b:a400::/48", "24319"}, - {"2605:4cc0::/32", "20257"}, - {"2800:160:2450::/46", "14259"}, - {"2001:67c:184c::/48", "35600"}, - {"2001:12f8:2::/47", "12136"}, - {"2403:7580::/32", "38364"}, - {"2804:2b9c::/32", "265163"}, - {"2a03:7ae0::/32", "200846"}, - {"2405:4000:800:6::/63", "7470"}, - {"2409:8050:3802::/40", "56047"}, - {"2804:4870:1c3::/33", "267121"}, - {"2001:559:c1d2::/48", "33287"}, - {"2001:67c:1b2c::/48", "204074"}, - {"2001:da8:8003::/48", "23910"}, - {"2a10:5f80::/29", "37221"}, - {"2001:df0:ee80::/48", "139298"}, - {"2602:fd6f:aba::/45", "18526"}, - {"2a02:26f7:b600::/47", "36183"}, - {"2001:4878:b220::/48", "12222"}, - {"2001:4998:eff6::/35", "10310"}, - {"2402:5300:4210::/39", "45903"}, - {"2409:8c1f:9000::/34", "9808"}, - {"240e:3bf:1200::/39", "4134"}, - {"2600:1415:5001::/36", "20940"}, - {"2602:801:8000::/46", "208188"}, - {"2607:8280::/45", "27027"}, - {"2804:93c:9000::/33", "52878"}, - {"2804:5010::/32", "268367"}, - {"2804:6a0c:ff00::/40", "270309"}, - {"2400:15a0::/48", "140766"}, - {"2401:d800:5390::/42", "7552"}, - {"240a:add9::/32", "146195"}, - {"240e:18:10::/47", "4811"}, - {"2a01:caa0::/32", "47377"}, - {"240a:60:f000::/44", "9605"}, - {"2620:101:9004::/47", "40934"}, - {"2620:145:400::/48", "12257"}, - {"2804:639c::/32", "269372"}, - {"2804:7b0c::/32", "14463"}, - {"2a01:48a0:4001::/48", "57271"}, - {"2a0d:de80::/29", "8888"}, - {"2001:da8:6001::/48", "23910"}, - {"2a02:26f7:d941::/46", "20940"}, - {"2800:bf0:2a0::/44", "52257"}, - {"2803:7e60::/32", "262186"}, - {"2001:418:143a::/41", "2914"}, - {"2001:678:24c::/48", "59474"}, - {"2800:110:301::/35", "4270"}, - {"2001:559:c26a::/48", "33650"}, - {"240a:a7a1::/32", "144603"}, - {"2801:80:22e0::/48", "267086"}, - {"2409:8014:a::/36", "56044"}, - {"2600:6c38:610::/45", "20115"}, - {"2a02:310::/32", "34106"}, - {"2a0f:ffc0::/29", "207767"}, - {"240a:70:8::/47", "9605"}, - {"240a:a1af::/32", "143081"}, - {"2600:380:ba00::/37", "20057"}, - {"2600:380:d000::/44", "20057"}, - {"2800:160:1f1f::/42", "14259"}, - {"2804:954:72::/40", "263073"}, - {"2804:4ae0:2::/39", "267269"}, - {"2a01:7660:6::/48", "20676"}, - {"2a05:d016::/36", "16509"}, - {"2a07:6e80::/29", "202932"}, - {"2001:67c:13a8::/48", "8613"}, - {"2402:6800:0:3015::/46", "22822"}, - {"2600:4402:c002::/47", "6130"}, - {"2600:8807:8a00::/35", "22773"}, - {"2405:c0:20::/48", "138881"}, - {"240a:a286::/32", "143296"}, - {"2401:cf80:61ee::/43", "55303"}, - {"2408:840c:7700::/40", "17621"}, - {"2804:e8:200::/32", "28280"}, - {"2804:14d:168f::/41", "28573"}, - {"2806:230:203c::/48", "265594"}, - {"2a00:49e0::/32", "199361"}, - {"2001:559:365::/48", "7922"}, - {"2409:8220::/27", "9808"}, - {"240e:3b6:8200::/35", "140316"}, - {"2620:0:480::/48", "28729"}, - {"2a06:1b00:104::/46", "8302"}, - {"2a0a:90c0:20::/44", "11868"}, - {"240e:db:e800::/37", "38283"}, - {"2a02:f98::/32", "33984"}, - {"2001:559:8280::/48", "7016"}, - {"2001:df6:2800::/48", "136639"}, - {"2001:4998:19c::/46", "36646"}, - {"2408:8957:1b40::/40", "17816"}, - {"240a:ad53::/32", "146061"}, - {"2602:ffd5::/36", "26832"}, - {"2604:6040:40::/48", "53698"}, - {"2804:2214:8008::/46", "28177"}, - {"2a02:6b80::/32", "197973"}, - {"2a0f:9400:7500::/47", "210576"}, - {"2600:100e:be1e::/39", "6167"}, - {"2803:9800:9849::/40", "11664"}, - {"2804:80cc:b::/48", "272413"}, - {"2806:230:201e::/48", "265594"}, - {"2a0e:b102:100::/48", "212895"}, - {"2800:bf0:2a82::/42", "27947"}, - {"2804:45dc::/32", "266954"}, - {"2a0f:9407::/32", "62240"}, - {"2001:559:c188::/46", "33287"}, - {"2620:11a:a01d::/46", "43515"}, - {"2a02:26f7:b7c0::/48", "36183"}, - {"240a:a1c8::/32", "143106"}, - {"2806:370:5400::/44", "28403"}, - {"2001:678:f5c::/48", "57483"}, - {"2001:67c:1434::/48", "29560"}, - {"2402:1200:2::/47", "24523"}, - {"2407:bd40:8000::/36", "399686"}, - {"2409:8f18::/31", "134810"}, - {"2600:1410:5001::/34", "20940"}, - {"2620:149:a01::/45", "714"}, - {"2806:2f0:10a1::/48", "17072"}, - {"2a0b:1300:8000::/48", "198018"}, - {"2607:f7a8:1e00::/34", "46887"}, - {"2a02:26f7:bfc5::/46", "20940"}, - {"2a02:26f7:c1c5::/46", "20940"}, - {"2a0d:99c0::/29", "40970"}, - {"2600:380:6900::/35", "20057"}, - {"2620:64::/48", "36811"}, - {"2804:14d:8c81::/44", "28573"}, - {"2a06:c080::/29", "60111"}, - {"2804:26cc::/32", "263858"}, - {"2804:4b38::/32", "267291"}, - {"2804:6e7c::/32", "270600"}, - {"2a0c:ff00:2::/29", "204975"}, - {"2001:559:798::/48", "33287"}, - {"2408:80f1:1c0::/42", "138421"}, - {"2607:f7a8:2a00::/32", "46887"}, - {"2804:4c14:ab01::/35", "267348"}, - {"2a0c:93c0::/43", "212465"}, - {"2001:df6:1e00::/48", "18403"}, - {"2001:1840:c060::/44", "196"}, - {"240a:a422::/32", "143708"}, - {"2604:c040::/32", "21922"}, - {"2a02:4c8:af::/48", "47748"}, - {"2a06:180::/29", "198371"}, - {"2a0e:97c0:570::/44", "210661"}, - {"2001:fd8:b1c0::/42", "132199"}, - {"2403:5400:1810::/48", "7470"}, - {"2600:140b:b001::/38", "20940"}, - {"2a0e:7d40:50::/32", "209833"}, - {"2a0e:b107:df3::/45", "141237"}, - {"2405:2300:ff76::/40", "13443"}, - {"240e:44d:3c80::/41", "4134"}, - {"2600:6c34:20::/48", "33588"}, - {"2a03:6100::/33", "34594"}, - {"2a02:26f7:be8d::/46", "20940"}, - {"2a09:79c0::/34", "208803"}, - {"2a0c:2b80::/29", "208677"}, - {"2001:559:431::/48", "7016"}, - {"2001:559:823d::/48", "33652"}, - {"2408:840c:1a00::/40", "17621"}, - {"2804:7bfc::/32", "271468"}, - {"2400:4ec0:8813::/38", "64300"}, - {"2408:840d::/42", "17621"}, - {"2804:15b8::/32", "52666"}, - {"2001:500:c0::/47", "12041"}, - {"2001:1a11:10::/47", "42298"}, - {"2602:feb4:50::/44", "25961"}, - {"2801:16e:2c::/48", "19429"}, - {"2804:1de8::/32", "17222"}, - {"2a03:1980:d1ff::/38", "48260"}, - {"2001:559:751::/46", "33287"}, - {"2001:ce0:3::/48", "3661"}, - {"2804:12b4::/32", "263493"}, - {"2001:559:1ea::/48", "33287"}, - {"2001:c90::/32", "9595"}, - {"2409:8051:2100::/37", "9808"}, - {"2804:70e4::/32", "270754"}, - {"2400:cb00:a480::/45", "13335"}, - {"240a:adfb::/32", "146229"}, - {"240e:438:8020::/43", "140647"}, - {"240e:978:4100::/36", "4134"}, - {"2620:13e:e000::/48", "29802"}, - {"2806:2f0:4121::/46", "17072"}, - {"2a06:82c4::/48", "39602"}, - {"2a0c:b641:202::/45", "209710"}, - {"2407:2f00:103::/48", "38001"}, - {"2409:8924:6900::/38", "56046"}, - {"240a:acda::/32", "145940"}, - {"2605:4c40:41::/46", "30081"}, - {"2a02:26f7:f900::/48", "36183"}, - {"2a03:82e0:2000::/32", "200991"}, - {"2a07:3500:19d8::/48", "38915"}, - {"2001:1248:a00c::/48", "11172"}, - {"2001:4878:48::/48", "12222"}, - {"2403:ad80:90::/48", "135309"}, - {"2409:807f:2a00::/39", "9808"}, - {"240e:108:10f1::/46", "136197"}, - {"240e:438:2420::/43", "140647"}, - {"2001:559:441::/48", "7015"}, - {"2409:8051:1800::/47", "56047"}, - {"2600:1409:b801::/33", "20940"}, - {"2804:3a38::/32", "53227"}, - {"2a02:cdc6:3075::/39", "59715"}, - {"2a03:1a80::/32", "39878"}, - {"2001:500:3682::/48", "397232"}, - {"2001:1938:2200::/46", "33438"}, - {"2409:896a:2a00::/39", "9808"}, - {"2600:6c10:643::/36", "20115"}, - {"2600:d401:600::/32", "1403"}, - {"2603:4:1704::/48", "44273"}, - {"2a02:730:2001::/35", "29278"}, - {"2402:800:fe20::/41", "7552"}, - {"240e:698:2900::/40", "4134"}, - {"2600:1419:2a01::/37", "20940"}, - {"2804:4f38::/32", "268312"}, - {"2a00:6340:4001::/32", "58299"}, - {"2a09:9240::/29", "35388"}, - {"2a0e:b107:c00::/46", "212888"}, - {"240a:aedb::/32", "146453"}, - {"2607:f358:26::/32", "18779"}, - {"2a00:c020:4000::/36", "199551"}, - {"2604:cac0:133::/45", "11019"}, - {"2804:460c::/32", "266965"}, - {"2a00:1c38::/47", "29014"}, - {"2001:678:e38::/48", "212651"}, - {"2406:9000::/32", "24175"}, - {"2603:c002:a010::/40", "31898"}, - {"2604:8240::/32", "7979"}, - {"2605:a404:218::/42", "33363"}, - {"2a02:28:d::/48", "209024"}, - {"2001:67c:1160::/48", "202539"}, - {"2804:1c1c:3001::/33", "61638"}, - {"2407:79c0::/32", "212744"}, - {"240a:a527::/32", "143969"}, - {"2606:ee00:5::/48", "15102"}, - {"2001:49f0:d0fd::/46", "30058"}, - {"2620:fc:c000::/48", "64241"}, - {"2804:2f4c::/32", "264882"}, - {"2a00:aa40::/32", "15415"}, - {"2a0d:5540::/47", "210269"}, - {"2400:5380::/32", "58910"}, - {"2620:75:a000::/48", "397799"}, - {"2804:7950::/32", "271298"}, - {"2405:ec00:9024::/41", "23955"}, - {"240a:a89b::/32", "144853"}, - {"240a:ac2e::/32", "145768"}, - {"2602:feda:dff::/48", "147071"}, - {"2804:5f00:2::/43", "269070"}, - {"2804:8548::/32", "272569"}, - {"2806:2f0:7221::/46", "17072"}, - {"2806:1016:6::/43", "8151"}, - {"2a02:6c20:81a::/42", "207167"}, - {"2001:559:5da::/47", "21508"}, - {"2001:4200:7801::/32", "2018"}, - {"2408:8957:b300::/40", "17816"}, - {"2409:8904:a640::/39", "24547"}, - {"2600:6c39:1::/45", "20115"}, - {"2603:f070::/29", "396356"}, - {"2605:6c80:11::/48", "397373"}, - {"2a02:26f7:d801::/46", "20940"}, - {"2a09:4380::/32", "41114"}, - {"2a09:4d40::/32", "44812"}, - {"2001:559:8650::/48", "33491"}, - {"2001:559:c44e::/47", "7016"}, - {"2001:830::/32", "61157"}, - {"2001:ee0:302::/45", "135905"}, - {"2402:8400::/46", "17820"}, - {"2406:840:9000::/47", "210041"}, - {"2408:8459:4810::/42", "17623"}, - {"2409:8038:2100::/35", "9808"}, - {"240a:a7f2::/32", "144684"}, - {"2600:6c10:f40b::/45", "20115"}, - {"2806:2f0:3421::/46", "17072"}, - {"2a01:258::/32", "31122"}, - {"2a02:26f7:e10c::/48", "36183"}, - {"2001:40d0::/32", "20912"}, - {"2a01:288:4005::/48", "201642"}, - {"2001:67c:1430::/48", "207076"}, - {"2403:300:a07::/48", "714"}, - {"240a:a4eb::/32", "143909"}, - {"240e:16::/32", "4134"}, - {"240e:438:5420::/43", "140647"}, - {"240e:698:2600::/40", "4134"}, - {"2a02:26f0:c500::/48", "34164"}, - {"2602:808:1000::/40", "398898"}, - {"2a0e:2540::/29", "207902"}, - {"2400:f6c0:600::/32", "136530"}, - {"2620:10a:80e6::/48", "55195"}, - {"2a00:1a90:c000::/34", "33854"}, - {"2a03:db80:4c85::/35", "680"}, - {"2803:4180::/36", "263238"}, - {"2a02:6b40::/32", "44066"}, - {"240a:a0b3::/32", "142829"}, - {"240d:c010:7d::/48", "139341"}, - {"240e:438:5e20::/43", "140647"}, - {"2600:6c38:f3f::/41", "20115"}, - {"2605:d7c1::/29", "53820"}, - {"2800:d302:2::/44", "11830"}, - {"2804:67b8:80::/32", "269646"}, - {"2a03:1d87:2::/32", "31117"}, - {"2a0d:2584:f000::/36", "142566"}, - {"2a10:8e00::/32", "20473"}, - {"2001:250:2424::/47", "24356"}, - {"2001:df0:1700::/48", "136070"}, - {"2001:df4:4480::/48", "140918"}, - {"2409:805c:2100::/36", "9808"}, - {"2600:1901:ffe0::/43", "396982"}, - {"2603:90f5:13::/48", "20115"}, - {"2804:14c:7986::/41", "28573"}, - {"2a05:1e80::/29", "202796"}, - {"2a09:3347::/32", "209509"}, - {"240a:a43c::/32", "143734"}, - {"2001:559:c38f::/48", "33287"}, - {"2405:1c0:7911::/45", "55303"}, - {"2408:8456:ba10::/42", "134543"}, - {"2804:b18:8500::/36", "52941"}, - {"2a01:8b40::/35", "203165"}, - {"2a02:26f7:c4c5::/46", "20940"}, - {"2001:4cb0::/32", "29009"}, - {"2a02:26f7:e7c5::/46", "20940"}, - {"2a04:93c0::/29", "24861"}, - {"2001:67c:82c::/48", "210881"}, - {"2001:4888:8062::/47", "6167"}, - {"2401:c5c0:dfd::/32", "55492"}, - {"2606:2800:4070::/46", "15133"}, - {"2801:15c:2::/48", "10753"}, - {"2804:6fe0::/32", "270690"}, - {"2a02:2090:ec00::/48", "48287"}, - {"2a10:9640::/29", "48329"}, - {"2001:559:c389::/48", "33650"}, - {"2600:141b:1001::/37", "20940"}, - {"2803:600:cacf::/34", "18809"}, - {"2001:df4:d880::/48", "135967"}, - {"2401:5000::/32", "24218"}, - {"2602:804:8000::/40", "54506"}, - {"2606:7e40::/32", "22649"}, - {"2620:106:3000::/46", "36671"}, - {"2620:117:0:e::/64", "10564"}, - {"2a04:7cc0::/29", "62332"}, - {"2600:1407:9800::/48", "35994"}, - {"2602:809:4001::/48", "14995"}, - {"2a05:4741:f::/48", "208393"}, - {"2001:559:5::/44", "7922"}, - {"240a:aee8::/32", "146466"}, - {"2a03:3660:1::/48", "51151"}, - {"2405:7a40::/32", "132808"}, - {"2600:370f:6040::/47", "32261"}, - {"2602:fc22::/36", "396970"}, - {"2a0a:1dc4::/30", "35758"}, - {"2a0f:601::/30", "51044"}, - {"2001:559:69::/46", "33651"}, - {"240a:a602::/32", "144188"}, - {"240e:250:400::/35", "4134"}, - {"2001:559:856e::/48", "33650"}, - {"2408:8956:f140::/40", "17816"}, - {"240a:a9e1::/32", "145179"}, - {"2a03:2880:f220::/47", "32934"}, - {"2a12:e00::/29", "24940"}, - {"2001:4358::/32", "36866"}, - {"2408:84f3:b610::/42", "134543"}, - {"240a:a583::/32", "144061"}, - {"240a:af58::/32", "146578"}, - {"2607:f350::/32", "27630"}, - {"2803:7bc0:2::/34", "266185"}, - {"2804:459c::/32", "266938"}, - {"2a0e:9a40::/29", "58061"}, - {"2a0e:9a80::/29", "56708"}, - {"2a0e:fd45:40fd::/48", "61138"}, - {"2a10:31c4::/30", "398481"}, - {"2001:648:2c31::/40", "5408"}, - {"2001:4050::/32", "6830"}, - {"2408:822e::/27", "4837"}, - {"2804:38b0:301::/37", "266494"}, - {"2a02:26f7:ccc5::/46", "20940"}, - {"2001:559:c330::/47", "7015"}, - {"240a:a68a::/32", "144324"}, - {"2605:aa40:c1e1::/46", "395394"}, - {"2a02:2458::/32", "6908"}, - {"2a04:b540:1000::/34", "42244"}, - {"2402:8100:3000::/42", "45271"}, - {"2600:1415:b001::/36", "20940"}, - {"2804:1b68::/37", "61726"}, - {"2804:4d3c:2080::/36", "267420"}, - {"2806:230:4009::/48", "11888"}, - {"2a02:1338::/32", "43561"}, - {"2001:4878:81e0::/44", "35994"}, - {"2804:1b2c::/35", "61713"}, - {"2a01:4c8:f402::/29", "12576"}, - {"2a03:e0c0::/32", "41960"}, - {"2a11:180::/29", "212714"}, - {"2600:1419:6401::/36", "20940"}, - {"2806:33e::/32", "265573"}, - {"2001:1a68:53::/48", "203756"}, - {"2605:a800:2::/48", "603"}, - {"2806:230:402f::/48", "11888"}, - {"2806:310:1c::/46", "16960"}, - {"2a02:2030::/32", "198252"}, - {"2a04:1bc7::/32", "60982"}, - {"2001:3c8:1601::/48", "38589"}, - {"240a:a431::/32", "143723"}, - {"240e:44d:6d40::/42", "140354"}, - {"2a02:b48:801a::/42", "39572"}, - {"2c0f:f598:6::/47", "327813"}, - {"2001:4d48::/29", "8468"}, - {"240a:a19a::/32", "143060"}, - {"2600:1407:6401::/38", "20940"}, - {"2804:85d4::/32", "272603"}, - {"2a05:3580:2f00::/32", "35807"}, - {"2a0d:ec0::/29", "41709"}, - {"2001:559:360::/48", "33491"}, - {"2406:da00:ff00::/48", "14618"}, - {"2408:8256:377f::/48", "17816"}, - {"2a02:26f0:cb::/48", "2914"}, - {"2001:428:4407::/48", "706"}, - {"2804:338c::/32", "265403"}, - {"2a0f:ec06::/32", "30633"}, - {"240e:804:200::/39", "140636"}, - {"2804:63c::/32", "262571"}, - {"2804:7088::/32", "270732"}, - {"2001:16d8:c006::/43", "16150"}, - {"240a:a62b::/32", "144229"}, - {"2605:a404:b88::/43", "33363"}, - {"2803:80:1005::/32", "61317"}, - {"2806:2f0:99e1::/46", "17072"}, - {"2a02:26f7:be91::/42", "20940"}, - {"2a02:26f7:de00::/48", "36183"}, - {"2001:500:63::/44", "30133"}, - {"2001:559:c455::/48", "7015"}, - {"240a:aa7b::/32", "145333"}, - {"2804:6b4c::/32", "270391"}, - {"2001:4e0:1020::/41", "2381"}, - {"2001:559:80e7::/48", "7922"}, - {"2001:df6:c480::/48", "38254"}, - {"2401:1d00::/32", "38505"}, - {"2402:6940:207::/39", "7645"}, - {"2406:7400:b0::/46", "24309"}, - {"240a:a492::/32", "143820"}, - {"240c:c284::/21", "23910"}, - {"2402:800:7dd0::/42", "7552"}, - {"2402:800:980f::/43", "7552"}, - {"240a:a0d0::/32", "142858"}, - {"2603:c0e0:1210::/39", "54253"}, - {"2001:502:8c25::/48", "7342"}, - {"2401:4900:4a60::/45", "45609"}, - {"2401:7500:fff7::/48", "133296"}, - {"2409:8924:c100::/38", "56046"}, - {"2602:feda:19f::/48", "142025"}, - {"2610:b0:40db::/48", "21433"}, - {"2a03:f4c0::/32", "30781"}, - {"2001:df7:1d80::/48", "142594"}, - {"2001:4918::/32", "7849"}, - {"240a:a697::/32", "144337"}, - {"2605:ec80::/32", "11114"}, - {"2606:a380::/32", "13746"}, - {"2605:9e40::/32", "396304"}, - {"2a09:d4c0::/29", "209070"}, - {"2001:470:157::/48", "6939"}, - {"2001:fd8:3020::/47", "4775"}, - {"2402:8c00:2::/48", "17753"}, - {"240a:a5b0::/32", "144106"}, - {"2801:80:c10::/48", "61880"}, - {"2a02:26f7:b5c1::/46", "20940"}, - {"2409:805e:2100::/36", "9808"}, - {"240a:ac46::/32", "145792"}, - {"240e:965:1000::/37", "133775"}, - {"2600:6c10:fc1a::/38", "20115"}, - {"2a01:8740:5::/48", "212588"}, - {"2400:cb00:133::/48", "395747"}, - {"240a:a751::/32", "144523"}, - {"2801:1d:2800::/48", "262589"}, - {"2806:230:4006::/48", "265594"}, - {"2a03:6947:1900::/40", "61266"}, - {"2001:559:500::/48", "7015"}, - {"2001:559:852c::/48", "7015"}, - {"2804:5898::/32", "268138"}, - {"2804:6c28::/32", "270449"}, - {"2401:e380:7551::/48", "131091"}, - {"2404:4a00:1000::/48", "55423"}, - {"2600:1402:4::/44", "20940"}, - {"2600:3007:1311::/40", "13649"}, - {"2603:c0e8:2000::/39", "1218"}, - {"2620:12c:f00a::/45", "19833"}, - {"2803:980::/32", "263248"}, - {"2804:29f8:3::/48", "264048"}, - {"2a01:200::/32", "25164"}, - {"2600:6000:fd54::/40", "12271"}, - {"2804:2258::/32", "264604"}, - {"2a03:6b00:9::/46", "48832"}, - {"2a06:e881:8700::/45", "210554"}, - {"2406:840:5800::/47", "139317"}, - {"2408:8456:e40::/39", "17816"}, - {"2620:53:a000::/48", "396431"}, - {"2800:160:14d3::/45", "14259"}, - {"2a02:ee80:4295::/44", "3573"}, - {"240a:a4a4::/32", "143838"}, - {"2604:d600:c19::/42", "32098"}, - {"2620:ad:8000::/40", "52127"}, - {"2a02:26f7:c6c0::/47", "36183"}, - {"2001:559:c33f::/48", "33660"}, - {"2409:8030:2c00::/35", "9808"}, - {"240e:3bd:9200::/36", "140317"}, - {"2804:1b84::/32", "61732"}, - {"2804:223c::/32", "264599"}, - {"2a01:90::/40", "29668"}, - {"2404:bf40:e103::/48", "2764"}, - {"2804:1a48::/32", "61850"}, - {"2001:559:8134::/48", "33659"}, - {"2401:8d00:7::/44", "38345"}, - {"2405:cc00:3000::/33", "9471"}, - {"2804:768:4b80::/32", "52977"}, - {"2a02:e00::/32", "29141"}, - {"240e:44d:6580::/41", "4134"}, - {"2406:a3c0::/32", "37922"}, - {"2604:9b00:1800::/38", "14230"}, - {"2606:2580::/32", "393994"}, - {"2620:118:b001::/48", "32110"}, - {"2806:370:9010::/44", "28403"}, - {"2a11:3880::/29", "34734"}, - {"2607:d500:602::/48", "54527"}, - {"240e:44d:1a80::/41", "4134"}, - {"2a02:ac80:b1::/41", "25145"}, - {"2600:1806:411::/48", "16552"}, - {"2804:8cc:1c1::/32", "262394"}, - {"2804:1368:ca6b::/34", "262808"}, - {"2806:2f0:20c1::/48", "22884"}, - {"2a02:26f7:dc0c::/48", "36183"}, - {"2001:559:46e::/48", "7725"}, - {"2001:559:521::/48", "33660"}, - {"2001:df0:68::/48", "45689"}, - {"2405:6e00:440::/44", "133612"}, - {"2408:84f3:ac40::/38", "17816"}, - {"2409:8904:5160::/38", "24547"}, - {"2607:b600:4::/46", "10397"}, - {"2804:2868:40::/32", "263961"}, - {"2a02:26f7:e144::/48", "36183"}, - {"2a04:4e40:e00::/48", "54113"}, - {"2a09:4b44:e::/30", "61317"}, - {"2001:c20:487c::/47", "3758"}, - {"2001:df0:fc0::/48", "137165"}, - {"2403:3800:1300::/33", "4007"}, - {"240a:a094::/32", "142798"}, - {"2a02:26f7:b8c4::/48", "36183"}, - {"2a0e:8b40::/29", "205614"}, - {"2604:fb80:f001::/46", "15128"}, - {"2a04:dec0::/29", "60044"}, - {"2001:1908::/32", "7029"}, - {"2408:8459:1410::/41", "17622"}, - {"2604:880:60::/48", "29802"}, - {"2607:f738:d00::/40", "17184"}, - {"2804:a94::/32", "262572"}, - {"2602:fc62:ee::/47", "399760"}, - {"2605:90c0::/32", "15221"}, - {"2803:a8a0::/32", "266802"}, - {"2a02:2864::/30", "25255"}, - {"2c0f:fcc8::/32", "37154"}, - {"2404:0:6000::/36", "24155"}, - {"2602:ff93:5000::/36", "26968"}, - {"2a00:47c0:811::/48", "27435"}, - {"2a02:26f7:c00c::/48", "36183"}, - {"2001:253:109::/48", "142075"}, - {"2401:1d40:3f00::/48", "58466"}, - {"240a:a6b0::/32", "144362"}, - {"2604:b0c0::/32", "54501"}, - {"2a09:3704::/32", "62240"}, - {"2001:ae8::/32", "9080"}, - {"2408:840c:2b00::/40", "17621"}, - {"240e:67a:c200::/39", "140329"}, - {"2600:6c10:f24d::/43", "20115"}, - {"2620:11:a000::/48", "41625"}, - {"2001:fd8:f270::/44", "4775"}, - {"2620:51:c000::/48", "25861"}, - {"2804:7f7:2000::/33", "18881"}, - {"2a01:cd00:8040::/48", "28708"}, - {"2a0a:d6c0:efff::/48", "61423"}, - {"2404:a800:3101::/33", "9498"}, - {"240e:a51:6400::/30", "4134"}, - {"2600:380:ec10::/41", "7018"}, - {"2408:8957:21c0::/38", "17622"}, - {"2600:6c38:88a::/43", "20115"}, - {"2600:cc01:e100::/35", "32298"}, - {"2801:17:4800::/48", "27951"}, - {"2a04:7580::/29", "9199"}, - {"2001:448a:6030::/41", "7713"}, - {"2600:6c10:f342::/45", "20115"}, - {"2800:110:11::/38", "4270"}, - {"2806:108e:21::/46", "8151"}, - {"2a02:26f7:bccd::/46", "20940"}, - {"2a02:e220::/30", "61094"}, - {"2001:559:50f::/43", "7922"}, - {"2402:800:3ce0::/39", "7552"}, - {"2408:840c:ab00::/40", "17621"}, - {"240a:a79b::/32", "144597"}, - {"2001:559:5f1::/48", "33659"}, - {"2001:4998:efec::/43", "10310"}, - {"2402:4e00:5::/46", "45090"}, - {"2600:1404:6c01::/35", "20940"}, - {"2001:ee0:362::/43", "135905"}, - {"2402:a0c0::/47", "137922"}, - {"2404:e100:4004::/46", "133840"}, - {"2408:8456:c900::/42", "17622"}, - {"240a:a648::/32", "144258"}, - {"240e:983:1e00::/48", "58466"}, - {"2600:40ff:ff12::/40", "701"}, - {"2804:768c::/32", "271119"}, - {"2a00:eec0::/32", "3292"}, - {"2a02:68::/29", "21396"}, - {"2a07:4840::/48", "64245"}, - {"2c0f:ee68::/32", "328271"}, - {"240a:ad31::/32", "146027"}, - {"2a04:4e40:c800::/48", "54113"}, - {"2001:1310:3121::/48", "26610"}, - {"2400:cb00:171::/48", "395747"}, - {"2402:7ac0::/32", "137316"}, - {"2407:2440:1::/44", "139057"}, - {"2a02:26f7:f40c::/48", "36183"}, - {"2001:44b8:30b0::/48", "7545"}, - {"2404:3d00:40f8::/47", "3573"}, - {"2600:370f:30c0::/46", "32261"}, - {"2804:3400::/32", "265430"}, - {"2a01:c50e:ca00::/37", "12479"}, - {"2a02:26f7:e189::/42", "20940"}, - {"2a0f:93c0::/31", "62240"}, - {"2001:559:78a::/48", "7922"}, - {"2401:7940::/32", "134971"}, - {"2401:d800:2e12::/41", "7552"}, - {"2a0c:1580::/29", "204860"}, - {"2804:314:4019::/42", "61568"}, - {"2a01:8840:10::/48", "12041"}, - {"2a04:4e40:2010::/41", "54113"}, - {"2a0f:a01::/46", "30633"}, - {"2001:559:c193::/48", "33489"}, - {"2001:18e8:500::/38", "19782"}, - {"2401:7000::/33", "45177"}, - {"2409:8924:1900::/37", "56046"}, - {"2607:9200::/32", "19009"}, - {"2a00:1020::/45", "24739"}, - {"2a0a:d1c0::/29", "15600"}, - {"2a0c:700::/36", "204515"}, - {"2a0e:2c40:20::/29", "50581"}, - {"2001:559:864b::/48", "7015"}, - {"2001:d08:b0::/34", "9534"}, - {"2401:640:2110::/48", "134844"}, - {"240a:aaa9::/32", "145379"}, - {"2804:108c:d700::/34", "28146"}, - {"2804:16d8:8000::/34", "262729"}, - {"2a04:4343::/29", "61349"}, - {"2404:dd00::/32", "58687"}, - {"2620:a9:4000::/48", "3356"}, - {"2803:7680::/32", "22541"}, - {"2804:14d:5821::/46", "28573"}, - {"2a00:1590::/32", "9051"}, - {"2a0e:aa06:480::/44", "207454"}, - {"2a0f:b400::/44", "60781"}, - {"2001:ee0:ef00::/40", "45899"}, - {"2408:84f3:aa10::/42", "134543"}, - {"2600:140b:1000::/48", "17511"}, - {"2804:1a3c::/32", "61847"}, - {"2804:2068::/32", "262470"}, - {"2804:5d9c::/32", "268982"}, - {"2a09:d2c0::/32", "49181"}, - {"2001:559:c253::/48", "7725"}, - {"2001:4888:1a::/47", "22394"}, - {"240a:a9c8::/32", "145154"}, - {"2804:514::/32", "262490"}, - {"2400:c640:81::/36", "136406"}, - {"2602:ffb7:d00::/40", "62874"}, - {"2a03:2880:f138::/46", "32934"}, - {"2001:559:8266::/48", "33651"}, - {"2001:678:798::/48", "201734"}, - {"2404:0:8000::/42", "131591"}, - {"2405:6d00:105::/32", "17887"}, - {"2800:160:182a::/45", "14259"}, - {"2800:2a0:7101::/32", "27947"}, - {"2a02:2298:8000::/36", "15544"}, - {"2001:559:8388::/48", "7922"}, - {"2001:559:859c::/48", "33287"}, - {"2605:5080:5031::/32", "3367"}, - {"2607:fc48:1010::/48", "40009"}, - {"2806:262:300::/37", "13999"}, - {"2806:2d0:1::/48", "263114"}, - {"2401:d640::/32", "132168"}, - {"240a:ad36::/32", "146032"}, - {"240e:44d:4c80::/41", "4134"}, - {"2600:6c2e::/42", "20115"}, - {"2600:6c33:218::/48", "11351"}, - {"2602:107:2d10::/48", "20115"}, - {"2a02:26f7:dac1::/46", "20940"}, - {"2001:559:23e::/47", "7015"}, - {"2804:77ec::/32", "271208"}, - {"2806:370:9120::/43", "28403"}, - {"2a0c:b641:730::/44", "207338"}, - {"2001:559:8564::/48", "33652"}, - {"2001:ce0:7::/48", "3363"}, - {"2001:df3:bc00::/48", "59113"}, - {"2402:800:361d::/42", "7552"}, - {"2001:559:804f::/48", "20214"}, - {"2001:559:8052::/47", "20214"}, - {"2001:16e8:2::/35", "25542"}, - {"240e:62:f000::/36", "4134"}, - {"2a02:26f7:f8d5::/46", "20940"}, - {"2a0c:1f40::/29", "49191"}, - {"2a0f:9400:7a0a::/48", "135395"}, - {"240e:228::/25", "4134"}, - {"2607:3580::/32", "33452"}, - {"2400:c540:c000::/38", "59238"}, - {"2804:14c:5fe0::/44", "28573"}, - {"2804:2d40::/32", "265269"}, - {"2804:5134::/32", "268437"}, - {"2a12:6f47::/32", "148996"}, - {"2c0f:5e00::/32", "328843"}, - {"2001:559:c01e::/48", "7922"}, - {"2001:4de0:200::/40", "33438"}, - {"2620:74:f::/48", "29403"}, - {"2804:e8:8100::/33", "28280"}, - {"2804:80dc::/32", "272417"}, - {"2a04:4e40:a10::/41", "54113"}, - {"2001:559:4ab::/48", "33287"}, - {"2a02:750:11::/45", "42708"}, - {"2408:8456:840::/39", "17816"}, - {"2603:c020:c000::/35", "31898"}, - {"2604:c880:d000::/34", "46455"}, - {"2a01:7c00::/43", "52075"}, - {"2a01:8840:b2::/45", "12041"}, - {"2a02:26f7:be50::/48", "36183"}, - {"2404:bf40:c181::/48", "2764"}, - {"2405:9800:f001::/44", "45430"}, - {"2a00:9b60::/40", "48635"}, - {"2a01:8840:21::/48", "207266"}, - {"2a02:578:6c00::/38", "9031"}, - {"2a0e:3840:4::/48", "40676"}, - {"2001:3c8:130b::/37", "4621"}, - {"2001:559:844a::/48", "33491"}, - {"2405:1c0:6851::/46", "55303"}, - {"2600:9000:1152::/48", "16509"}, - {"2803:9800:a849::/40", "11664"}, - {"2804:18:1810::/44", "10429"}, - {"2c0f:ef78:11::/48", "63293"}, - {"2602:feda:cf0::/44", "212528"}, - {"2a09:5040::/48", "209562"}, - {"2400:7400:3c::/41", "38044"}, - {"240e:3b8:5600::/34", "4134"}, - {"2600:1406:b::/43", "20940"}, - {"2804:a14:3012::/32", "262342"}, - {"240a:a9c3::/32", "145149"}, - {"2606:e280::/32", "46687"}, - {"2a00:fda0::/32", "62365"}, - {"2400:dcc0:a304::/37", "38631"}, - {"2a02:4f00::/32", "44212"}, - {"2a04:4e40:dc00::/48", "54113"}, - {"2a0c:da81::/30", "208861"}, - {"2001:250:c10::/48", "23910"}, - {"2001:578:10b::/45", "22773"}, - {"2800:160:1b32::/45", "14259"}, - {"2806:2f0:3401::/46", "17072"}, - {"2c0e:0:501::/25", "24863"}, - {"2001:978:9400:1::/36", "174"}, - {"2409:804c:1100::/36", "9808"}, - {"240e:103:8b30::/33", "4134"}, - {"240e:108:11a3::/44", "4134"}, - {"2605:a401:8def::/43", "33363"}, - {"2605:a408:4f::/32", "33363"}, - {"2804:1a34::/32", "61845"}, - {"2804:3008::/32", "264927"}, - {"2804:61a8::/32", "269248"}, - {"2a0c:5247:6000::/36", "208861"}, - {"2001:559:853c::/47", "7015"}, - {"2001:da8:ac::/48", "24349"}, - {"2403:9a00::/32", "7505"}, - {"2408:8256:3888::/48", "17816"}, - {"2409:805f:1900::/34", "9808"}, - {"2604:8c0::/32", "209"}, - {"2804:36f0:2400::/33", "266381"}, - {"2a00:1728:30::/48", "42446"}, - {"2001:559:157::/48", "33491"}, - {"2403:6a40::/48", "135967"}, - {"2a02:788::/47", "12843"}, - {"2a0a:1780::/29", "206784"}, - {"2a0b:c900::/29", "206836"}, - {"2001:678:97c::/48", "49697"}, - {"2401:89c0::/48", "137443"}, - {"240e:87c:700::/36", "137692"}, - {"2605:f440:54::/33", "54874"}, - {"2607:fcf0:9100::/33", "13445"}, - {"2400:fc00:8020::/43", "45773"}, - {"2403:1000:3100::/40", "38819"}, - {"2409:8c20:81b::/38", "56046"}, - {"2a01:6960::/32", "39542"}, - {"2a02:ff0:10f3::/44", "12735"}, - {"2a04:29c7::/32", "42821"}, - {"2408:8459:a010::/42", "17623"}, - {"2604:6e00::/37", "13977"}, - {"2804:697c::/32", "270273"}, - {"2806:2f0:2100::/48", "17072"}, - {"2a01:c50f:eec0::/35", "12479"}, - {"2402:ecc0::/32", "58507"}, - {"240a:adcf::/32", "146185"}, - {"2a06:a640::/29", "212144"}, - {"2001:559:c0d4::/47", "7922"}, - {"2001:df4:5f00::/47", "134033"}, - {"2a09:7140::/29", "50628"}, - {"2001:df0:2e4::/48", "18123"}, - {"2409:8924:4d00::/38", "56046"}, - {"2604:e7c0:1::/48", "14821"}, - {"2800:bf0:8030::/44", "27947"}, - {"2804:6bf0::/33", "270435"}, - {"2a02:6604:4::/30", "5377"}, - {"2a0e:7200::/40", "35112"}, - {"2001:678:5ec::/48", "39617"}, - {"2404:8d06:a000::/40", "133543"}, - {"2407:7a80:23::/45", "132384"}, - {"2a00:1288:88::/48", "203070"}, - {"2a02:a800::/26", "6739"}, - {"2a03:5ae0::/32", "49944"}, - {"240a:a232::/32", "143212"}, - {"240e:db:f800::/48", "38283"}, - {"2605:a401:80a5::/43", "33363"}, - {"2802:8010::/30", "22927"}, - {"2a0f:fe80::/29", "60262"}, - {"2001:67c:204c::/48", "34816"}, - {"2001:dd8:17::/44", "30133"}, - {"2001:fd0::/44", "10029"}, - {"2405:9000::/44", "7474"}, - {"2409:8000:3800::/40", "56048"}, - {"2606:2800:4a18::/46", "15133"}, - {"2800:160:264c::/39", "14259"}, - {"2001:67c:628::/48", "28727"}, - {"2001:4de0:2106::/38", "33438"}, - {"2804:a28:c000::/34", "263026"}, - {"2804:4ee0::/32", "268288"}, - {"2804:53cc::/32", "268607"}, - {"2405:1c0:6a81::/48", "55303"}, - {"2801:122::/40", "3816"}, - {"2a02:6a0:4ffe::/47", "4410"}, - {"2a0f:3104::/32", "56694"}, - {"240e:67b:800::/37", "140329"}, - {"2600:1406:2e01::/35", "20940"}, - {"2800:a40::/42", "22080"}, - {"2803:d60::/46", "269774"}, - {"2001:678:388::/48", "206373"}, - {"2408:8459:3810::/41", "17623"}, - {"240a:a954::/32", "145038"}, - {"2604:1500::/32", "35843"}, - {"2a04:f800::/29", "201776"}, - {"2a05:d050:4080::/44", "16509"}, - {"2a0d:82c3::/29", "47787"}, - {"2a0f:d00::/32", "41114"}, - {"2607:4a00::/32", "36316"}, - {"2001:559:c25a::/45", "20214"}, - {"2001:67c:2f0::/48", "51395"}, - {"2408:8456:1c40::/40", "17816"}, - {"2409:4055:5000::/30", "55836"}, - {"2a02:2e02:1a0::/38", "12479"}, - {"2405:1c0:6681::/46", "55303"}, - {"2409:8904:5940::/42", "24547"}, - {"240a:a04d::/32", "142727"}, - {"2607:f148::/48", "11734"}, - {"2804:14c:bd00::/40", "28573"}, - {"2a0b:1905::/30", "57878"}, - {"2a12:5300::/29", "204790"}, - {"2001:559:854b::/48", "22909"}, - {"2001:db0:7000::/32", "17766"}, - {"2001:df2:e380::/48", "140224"}, - {"2001:44c8:132::/35", "45430"}, - {"2604:3680::/32", "10279"}, - {"2606:2800:4a8a::/48", "15133"}, - {"2607:fc40::/32", "13433"}, - {"2620:13e:500a::/48", "206885"}, - {"2a06:6080::/40", "204180"}, - {"2400:46e0::/32", "63878"}, - {"2403:9800:b060::/45", "4771"}, - {"2600:1011:b030::/41", "6167"}, - {"2600:6c38:c2d::/46", "20115"}, - {"2804:3078::/32", "264953"}, - {"2001:250:81b::/48", "23910"}, - {"240a:a665::/32", "144287"}, - {"2a00:1a28:1107::/41", "42708"}, - {"2a03:1b80:d::/32", "18705"}, - {"2a04:7700::/29", "207203"}, - {"2001:678:a10::/48", "204526"}, - {"2804:4600::/32", "266961"}, - {"2a01:6780:1::/48", "15743"}, - {"2a02:26f7:cc::/48", "36183"}, - {"2001:4490:4400::/40", "9829"}, - {"2405:9800:b640::/36", "45430"}, - {"240a:aa9b::/32", "145365"}, - {"2804:14d:2a82::/47", "28573"}, - {"2a02:26f0:31::/46", "20940"}, - {"240a:a762::/32", "144540"}, - {"2600:6c20:3d::/46", "20115"}, - {"2605:a000:c0e::/48", "11955"}, - {"2607:b80::/46", "30247"}, - {"2800:bf0:81c5::/44", "27947"}, - {"2a02:26f7:58::/48", "36183"}, - {"2409:8c62:e10::/44", "139080"}, - {"2409:8054:39::/46", "56040"}, - {"2600:140b:5::/48", "24319"}, - {"2001:250:5838::/47", "24363"}, - {"240a:a345::/32", "143487"}, - {"2604:3cc0:1020::/44", "396298"}, - {"2607:f108:4700::/36", "29838"}, - {"2610:a1:3014::/48", "12008"}, - {"2a04:5b82::/44", "202265"}, - {"2001:1270:2000::/35", "22908"}, - {"2400:c540:c841::/37", "59238"}, - {"240a:a888::/32", "144834"}, - {"2804:14c:5fc1::/43", "28573"}, - {"2804:73a8::/32", "270929"}, - {"2a02:26f7:d380::/48", "36183"}, - {"2a06:5b80::/29", "207083"}, - {"2408:84f3:f840::/44", "17623"}, - {"240e:328::/32", "17638"}, - {"2620:149:241::/45", "714"}, - {"2803:de40::/32", "27879"}, - {"2804:5264::/32", "268515"}, - {"2a02:2b88::/32", "197019"}, - {"2001:559:86da::/48", "33287"}, - {"2403:9800:2::/43", "4648"}, - {"2403:fa40:1::/48", "49544"}, - {"240a:af62::/32", "146588"}, - {"2607:fdc0::/39", "20326"}, - {"2a02:88d:8120::/44", "48695"}, - {"2402:c800:ff74::/44", "38639"}, - {"2600:1407:6::/44", "20940"}, - {"2602:fced::/36", "398992"}, - {"2804:1044::/32", "263627"}, - {"2a02:26f7:f800::/48", "36183"}, - {"2a07:290a::/32", "559"}, - {"2001:67c:1b50::/48", "211879"}, - {"2001:67c:2d9c::/48", "29436"}, - {"2401:4440::/32", "58945"}, - {"2402:5700::/32", "56111"}, - {"2404:b180:1006::/32", "135310"}, - {"2603:8000::/28", "20001"}, - {"2a04:2e00::/29", "60751"}, - {"2a09:8340::/47", "42275"}, - {"2a0d:5642:113::/48", "48386"}, - {"240a:aea0::/32", "146394"}, - {"2a0e:1b80:3::/48", "54201"}, - {"2800:160:1a88::/47", "14259"}, - {"2a01:8840:69::/48", "207266"}, - {"2a02:ad8:24::/41", "12389"}, - {"2a0a:e5c1:400::/40", "209898"}, - {"2a0c:7080::/29", "18779"}, - {"2001:d08:2800::/32", "9534"}, - {"2001:4408:1101::/33", "4758"}, - {"240a:a338::/32", "143474"}, - {"2806:370:7070::/40", "28403"}, - {"2a02:2808:2001::/48", "47909"}, - {"2a04:1b00:2::/47", "61007"}, - {"2a0a:e200:1100::/40", "33438"}, - {"2001:388:6030::/48", "137188"}, - {"2001:13c7:601b::/48", "61520"}, - {"2803:ace0::/32", "269908"}, - {"2a02:26f7:b::/48", "20940"}, - {"2a03:7380:6000::/41", "13188"}, - {"2001:559:8663::/48", "7922"}, - {"2606:b980::/32", "12089"}, - {"2a03:5640:f228::/39", "2906"}, - {"2a10:6747:10::/32", "210777"}, - {"2607:f6f0:202::/48", "27224"}, - {"2804:7e7c::/32", "271627"}, - {"2001:250:7018::/46", "23910"}, - {"2001:5f8::/33", "5056"}, - {"2001:4546:1004::/28", "9924"}, - {"2401:df40:2::/48", "38001"}, - {"2a0c:7280::/29", "13058"}, - {"2001:1840:c000::/44", "196"}, - {"2001:44c8:48e0::/32", "45430"}, - {"2404:1c40:cb::/45", "24432"}, - {"240e:44d:2e00::/42", "140345"}, - {"2600:1415:8801::/35", "20940"}, - {"2600:1417:f001::/37", "20940"}, - {"2a0f:af40::/29", "207793"}, - {"2001:559:328::/48", "7016"}, - {"2400:6280:4::/44", "132280"}, - {"2402:3a80:1b08::/42", "38266"}, - {"2a02:770::/32", "5578"}, - {"2a10:cc40:15f::/48", "209669"}, - {"2001:4d0:6319::/32", "297"}, - {"2001:559:4f0::/47", "7015"}, - {"2a00:1b38::/32", "8339"}, - {"2a01:488::/32", "20773"}, - {"2a02:6c20:807::/48", "201922"}, - {"2001:5b0:ffff::/48", "6621"}, - {"2402:ce80:3::/48", "133005"}, - {"2404:bf40:a501::/46", "7545"}, - {"240e:965:f600::/30", "4134"}, - {"2607:f4e8:ad::/39", "22822"}, - {"2a02:26f7:fa05::/46", "20940"}, - {"2a12:f00::/29", "204790"}, - {"2001:ee0:c440::/39", "45899"}, - {"2402:700::/32", "9997"}, - {"240e:438:3420::/43", "140647"}, - {"2a01:8c81::/32", "205151"}, - {"2a06:2080::/29", "197825"}, - {"2001:678:e7c::/48", "49677"}, - {"2001:1388:83f1::/37", "6147"}, - {"2001:49f0:a06a::/47", "174"}, - {"2408:870c:2020::/41", "138421"}, - {"240e:397:900::/38", "140488"}, - {"2606:3d40:14::/48", "400097"}, - {"2804:2cb8::/42", "265239"}, - {"2a07:1100::/29", "57389"}, - {"2a0d:3580:12e0::/32", "200303"}, - {"2602:fe27:a0::/48", "6473"}, - {"2804:81c0::/32", "272474"}, - {"2a02:587:50db::/42", "6799"}, - {"2a02:26f7:dac8::/48", "36183"}, - {"2402:8100:2440::/47", "45271"}, - {"2408:8256:3061::/40", "17623"}, - {"2600:9000:1003::/48", "16509"}, - {"2a01:b0e0::/32", "61984"}, - {"2001:559:c399::/48", "7015"}, - {"2405:9800:11::/45", "45430"}, - {"2600:cc06::/28", "32298"}, - {"2620:11a:a0f2::/44", "43515"}, - {"2806:2f0:8441::/46", "17072"}, - {"2a0f:f3c0::/48", "207590"}, - {"2402:f800::/32", "7602"}, - {"2409:8055:4d::/46", "56040"}, - {"2a09:7:2005::/48", "41767"}, - {"2408:8456:9c10::/42", "134543"}, - {"2606:18c0:1a::/48", "14445"}, - {"2620:74:14::/48", "30060"}, - {"2800:bf0:a820::/45", "52257"}, - {"2804:8008::/32", "271725"}, - {"2a01:5cc0::/32", "51050"}, - {"2403:97c0::/48", "7489"}, - {"2804:80bc::/32", "271770"}, - {"2a0c:5700:5354::/29", "30893"}, - {"2a10:9902:210::/48", "212105"}, - {"2400:cb00:63::/44", "13335"}, - {"2600:9000:a1a0::/38", "16509"}, - {"2804:1d5c::/32", "264364"}, - {"2a07:f100::/35", "34741"}, - {"2001:ac8:6a::/43", "9009"}, - {"2402:c800:fff2::/48", "38639"}, - {"240a:a0a8::/32", "142818"}, - {"240a:aea6::/32", "146400"}, - {"2a03:7e0::/32", "12859"}, - {"2a0e:25c0::/29", "35236"}, - {"2800:160:1162::/47", "14259"}, - {"2804:2ed4::/32", "265369"}, - {"2806:230:5000::/48", "265594"}, - {"2a03:2880:f25d::/46", "32934"}, - {"2a03:ff00::/32", "61097"}, - {"2a04:4e40:c410::/41", "54113"}, - {"2001:218::/34", "2914"}, - {"2001:559:8189::/48", "33490"}, - {"2401:d800:dae0::/39", "7552"}, - {"2402:800:f200::/42", "7552"}, - {"2a04:c440:9000::/33", "2047"}, - {"2a05:7240::/29", "35784"}, - {"2a0d:8e02::/32", "197793"}, - {"2402:ef2f:4c::/47", "7633"}, - {"2803:68e0::/32", "269874"}, - {"2803:b480::/48", "28099"}, - {"2a03:d000:7000::/39", "31133"}, - {"240e:fd:b000::/33", "4134"}, - {"2001:559:59::/48", "13367"}, - {"2607:3380:1100::/38", "395766"}, - {"2a0b:d6c0::/29", "205856"}, - {"2402:800:9101::/44", "7552"}, - {"2620:118:400e::/48", "127"}, - {"2a00:1fb0::/29", "34660"}, - {"2607:fc58:1:6::/64", "13536"}, - {"2a00:1ca8:57::/42", "50673"}, - {"2a02:2e02:8f00::/42", "12479"}, - {"2404:b300:1000::/48", "131207"}, - {"2404:e801:2008::/46", "55430"}, - {"2803:2540::/43", "264668"}, - {"2806:2f0:3403::/42", "17072"}, - {"2a02:888:8040::/46", "48695"}, - {"2401:d800:9110::/42", "7552"}, - {"2409:8057:3011::/48", "56040"}, - {"240e:b6:1000::/31", "4134"}, - {"2620:119:4076::/36", "7726"}, - {"2a0f:1440::/48", "60781"}, - {"2001:4478:5800::/39", "4739"}, - {"2600:380:f200::/36", "7018"}, - {"2600:1409:f001::/36", "20940"}, - {"2600:6c38:730::/46", "20115"}, - {"2604:1380:4590::/44", "54825"}, - {"2620:120:9000::/44", "26227"}, - {"2804:6fcc::/32", "270685"}, - {"2a0a:2880::/29", "208861"}, - {"2001:559:8491::/48", "7015"}, - {"2001:978:7402::/39", "174"}, - {"2402:ef2f:2f::/43", "7633"}, - {"2a05:dfc7:5353::/48", "204136"}, - {"2407:2a00::/32", "55832"}, - {"240a:afa2::/32", "146652"}, - {"2804:5d68::/32", "268970"}, - {"2a02:2e02:1fa0::/34", "12479"}, - {"2401:bc40:300::/40", "12189"}, - {"2408:805d:f9::/36", "17623"}, - {"240a:ac16::/32", "145744"}, - {"240e:44d:600::/41", "140345"}, - {"2606:b400:8000::/47", "792"}, - {"2804:14d:2a00::/42", "28573"}, - {"2804:6c8::/32", "262606"}, - {"2a0e:97c0:600::/44", "210537"}, - {"2001:df0:a280::/48", "139225"}, - {"2800:bf0:81e3::/45", "52257"}, - {"2a02:26f7:39::/48", "20940"}, - {"2402:800:b310::/42", "7552"}, - {"240a:ab63::/32", "145565"}, - {"240e:980:9200::/40", "4134"}, - {"2605:d00::/32", "6300"}, - {"2801:1fc:2::/48", "27951"}, - {"2806:2f0:4443::/42", "17072"}, - {"2a0e:f680::/29", "208613"}, - {"2406:ce00::/29", "9370"}, - {"2409:802f:2b07::/48", "9808"}, - {"2604:d600:15ad::/43", "32098"}, - {"2804:145c:e001::/35", "263327"}, - {"2806:230:600a::/48", "265594"}, - {"2a02:e980:170::/40", "19551"}, - {"2400:adc0:4311::/48", "9541"}, - {"2403:580:a00::/34", "134715"}, - {"2403:9900::/24", "17676"}, - {"2600:9000:a310::/47", "16509"}, - {"2607:f7a8:1200::/39", "21687"}, - {"2806:230:3004::/48", "265594"}, - {"2a01:9f20::/37", "201746"}, - {"2001:678:25c::/48", "203055"}, - {"2803:5c80:8056::/48", "64114"}, - {"2a02:2e02:9660::/43", "12479"}, - {"2806:2f0:8403::/41", "17072"}, - {"2001:400:b31::/34", "293"}, - {"2001:559:730::/48", "7015"}, - {"2001:df0:6e80::/48", "17439"}, - {"2001:559:c279::/48", "33657"}, - {"2604:d600:c96::/42", "32098"}, - {"2803:6440::/32", "263755"}, - {"2804:1c1c:2000::/35", "61638"}, - {"2401:3bc0:801::/39", "137409"}, - {"2600:1410:2001::/35", "20940"}, - {"2604:b180:190::/44", "33700"}, - {"2a00:1280::/32", "39591"}, - {"2001:978:201:3::/37", "174"}, - {"2804:7d8c::/32", "271568"}, - {"2a01:448::/41", "42585"}, - {"2001:16a2:6100::/40", "39386"}, - {"2403:6ac0::/32", "138149"}, - {"240a:ad5e::/32", "146072"}, - {"2600:6c3a:833::/44", "20115"}, - {"2a02:888:50::/48", "48695"}, - {"2a02:ea8::/32", "41848"}, - {"2a0e:46c4:1310::/47", "142598"}, - {"2001:678:c60::/48", "39527"}, - {"2409:8080:2ae0::/35", "9808"}, - {"2600:1009:b100::/41", "6167"}, - {"2605:400:1::/48", "16406"}, - {"2001:9a0::/32", "15879"}, - {"2400:32a0::/32", "131987"}, - {"2404:ff40::/32", "4229"}, - {"2602:fce1:200::/48", "395886"}, - {"2605:aa80::/32", "27176"}, - {"2804:e64::/37", "262952"}, - {"2a00:6060:ee38::/35", "60983"}, - {"2001:559:c138::/48", "33651"}, - {"2604:e840::/47", "396965"}, - {"2605:b100:600::/40", "577"}, - {"2804:161c:1000::/46", "263268"}, - {"2804:1a80::/32", "262333"}, - {"2a0c:9a40:8070::/44", "212704"}, - {"2a0c:b641:4::/48", "34872"}, - {"2c0f:f1a0::/32", "37314"}, - {"2001:67c:11f0::/48", "212378"}, - {"2001:4888:8024::/46", "22394"}, - {"2804:9d4:1001::/34", "262996"}, - {"2804:10c8:1338::/32", "263649"}, - {"2804:376c::/32", "266413"}, - {"2408:8456:e840::/38", "17816"}, - {"2602:feda:2f0::/48", "133492"}, - {"2804:1898::/34", "61942"}, - {"2403:300:701::/36", "714"}, - {"2604:6900::/32", "29863"}, - {"2605:5640::/36", "25635"}, - {"2806:230:4026::/48", "265594"}, - {"2400:cb00:aae0::/47", "13335"}, - {"2409:8b5c::/26", "9808"}, - {"240a:aeb2::/32", "146412"}, - {"2600:1409:14::/37", "20940"}, - {"2606:7c80:cc1::/46", "40300"}, - {"2a02:26f7:c209::/42", "20940"}, - {"2001:550:1b0b::/37", "174"}, - {"2001:559:81dc::/47", "7922"}, - {"240a:a459::/32", "143763"}, - {"2600:1408:1d::/42", "20940"}, - {"2804:604::/32", "262560"}, - {"2804:2378::/32", "264164"}, - {"2a02:f680:1::/48", "212913"}, - {"2a06:8d40::/29", "21315"}, - {"2001:16b8:6700::/36", "8881"}, - {"2001:1900:2276::/40", "3356"}, - {"2402:5400::/48", "45938"}, - {"2409:8e35::/28", "9808"}, - {"240a:a8dd::/32", "144919"}, - {"2605:4d00::/32", "14613"}, - {"2a02:26f0:4a00::/48", "34164"}, - {"2001:67c:13c::/48", "16075"}, - {"2600:1002:9100::/44", "6167"}, - {"2600:140b:e801::/37", "20940"}, - {"2607:fcd0:106:3b00::/49", "8100"}, - {"2620:ef:4000::/48", "394137"}, - {"2a06:1b00:98::/47", "8302"}, - {"2a06:7244::/32", "57878"}, - {"2001:67c:71c::/48", "59824"}, - {"2400:9380:91c0::/44", "136167"}, - {"2409:8904:5270::/40", "24547"}, - {"2600:1409:3001::/36", "20940"}, - {"2804:2d5c::/32", "265277"}, - {"2001:559:85a7::/48", "33657"}, - {"2800:4b0:8008::/43", "12252"}, - {"2803:6900:616::/47", "52423"}, - {"2a00:d340:ffff::/48", "51720"}, - {"2a02:26f7:e689::/46", "20940"}, - {"2c0f:feb8::/32", "36959"}, - {"2001:559:5f5::/48", "22909"}, - {"2001:568::/37", "852"}, - {"2405:4000:aab::/32", "38082"}, - {"2408:8957:c200::/40", "17622"}, - {"2409:8750:b00::/37", "56047"}, - {"2804:4b90::/32", "267315"}, - {"2403:8680:2::/32", "134630"}, - {"2406:b400:14::/47", "18209"}, - {"240a:a76f::/32", "144553"}, - {"2a02:26f0:8c01::/39", "20940"}, - {"2a05:f506::/48", "14413"}, - {"2a0c:7e43:a525::/48", "20473"}, - {"2401:fd80:1ff::/48", "137502"}, - {"2605:9780:1800::/40", "36180"}, - {"2620:0:167a::/48", "6984"}, - {"2a02:26f7:c945::/46", "20940"}, - {"2a02:26f7:ea4d::/42", "20940"}, - {"2409:8904:6370::/40", "24547"}, - {"2409:8924:7100::/38", "56046"}, - {"2606:5c0::/32", "36165"}, - {"2804:3dc:4::/40", "52967"}, - {"2a0f:5707:abe0::/47", "210522"}, - {"2400:9380:9230::/47", "4809"}, - {"2409:8020:21::/43", "56046"}, - {"2409:8924:9100::/38", "56046"}, - {"240a:a72b::/32", "144485"}, - {"2a00:46c0::/32", "48500"}, - {"2600:6c10:fc13::/44", "20115"}, - {"2804:a0::/32", "262318"}, - {"2001:559:83a6::/48", "33660"}, - {"240a:a031::/32", "142699"}, - {"2606:3c0:3::/32", "399016"}, - {"2001:559:2da::/48", "33652"}, - {"2001:559:81a3::/48", "33657"}, - {"2001:44b8:38::/48", "7545"}, - {"2409:8a79::/30", "9808"}, - {"2800:110:10::/48", "42"}, - {"2a02:610:7501::/48", "51894"}, - {"2409:8907:7620::/39", "24547"}, - {"240a:a87e::/32", "144824"}, - {"240e:3b7:8200::/35", "140316"}, - {"2603:900c::/30", "33363"}, - {"2a0e:b107:1595::/48", "142419"}, - {"2a11:a500::/32", "60505"}, - {"2001:67c:28ec::/48", "209943"}, - {"2400:c700:9::/43", "55644"}, - {"240e:3b1:d000::/36", "134772"}, - {"2804:4380::/32", "267574"}, - {"2a10:480::/31", "4785"}, - {"2409:805c:5100::/36", "9808"}, - {"240a:aefb::/32", "146485"}, - {"2604:c0c0:6000::/32", "14525"}, - {"2803:fd80::/46", "18747"}, - {"2a0e:3e80::/29", "204504"}, - {"2001:df6:9500::/48", "137671"}, - {"2a12:c480::/29", "35297"}, - {"2606:2800:4044::/48", "14210"}, - {"2620:11a:a02d::/46", "36040"}, - {"2804:134::/32", "28323"}, - {"2804:8230::/32", "272504"}, - {"2a03:5c40::/32", "42777"}, - {"2001:559:2e4::/48", "33660"}, - {"2001:559:c1bd::/48", "7725"}, - {"2001:67c:5c0::/48", "205076"}, - {"2607:fc48:c50::/48", "40009"}, - {"2600:6c10:60b::/43", "20115"}, - {"2620:131:1054::/42", "26450"}, - {"2804:a::/31", "14840"}, - {"2001:678:5cc::/48", "31149"}, - {"2001:df6:2480::/48", "44103"}, - {"2001:df7:1900::/48", "137636"}, - {"2001:4868:100::/44", "23148"}, - {"2600:6c38:179::/40", "20115"}, - {"2620:62:400c::/46", "30045"}, - {"2800:160:1ec2::/43", "14259"}, - {"2a0c:53c0::/29", "204081"}, - {"2001:1af8::/33", "60781"}, - {"2400:f2:7000::/48", "202818"}, - {"2404:bf00:8800::/40", "9303"}, - {"240a:a686::/32", "144320"}, - {"240e:45c:5200::/40", "131285"}, - {"2603:f9e0::/22", "397165"}, - {"2607:f040::/32", "14007"}, - {"2a00:6f40::/32", "48452"}, - {"240e:5a:4480::/39", "140296"}, - {"2a02:bc8:37::/48", "202717"}, - {"2a06:98c0:1400::/47", "202623"}, - {"2a0b:5540::/33", "213002"}, - {"2a0e:9740::/29", "51920"}, - {"2001:fd8:1e0::/48", "132199"}, - {"2001:1248:563f::/41", "11172"}, - {"2408:8459:ac50::/38", "17816"}, - {"2408:84f3:9410::/42", "134543"}, - {"240a:a558::/32", "144018"}, - {"2603:c022::/35", "31898"}, - {"2804:3b6c:a004::/46", "265442"}, - {"2604:9440::/32", "53407"}, - {"2804:14c:b500::/40", "28573"}, - {"2a02:618:6::/44", "15774"}, - {"2a0d:2c40::/29", "207146"}, - {"2600:140b:5001::/38", "20940"}, - {"2600:1480:9000::/48", "21342"}, - {"2804:1824::/32", "262301"}, - {"2804:219c::/32", "264564"}, - {"2001:559:8588::/48", "33491"}, - {"2600:370f:70a1::/41", "32261"}, - {"2804:2928::/32", "52951"}, - {"2001:559:303::/48", "33491"}, - {"240a:afa3::/32", "146653"}, - {"240e:44d:7a40::/42", "140355"}, - {"2606:3c00:f000::/44", "20365"}, - {"2620:116:f004::/40", "14157"}, - {"2800:bf0:8106::/48", "27947"}, - {"2001:559:87dc::/48", "33287"}, - {"2001:67c:2650::/48", "1257"}, - {"2404:8d00:1820::/37", "24378"}, - {"2a02:2e02:1440::/43", "12479"}, - {"2001:559:c4e6::/48", "7016"}, - {"2408:8256:356d::/48", "17816"}, - {"2408:8756:2cf3::/44", "135061"}, - {"2804:22a8::/32", "264114"}, - {"2a02:530:29::/32", "21191"}, - {"2a0f:9440::/31", "62240"}, - {"2001:559:3c5::/46", "7922"}, - {"2001:67c:420::/48", "3303"}, - {"2a00:4cc5::/32", "203875"}, - {"2a05:6f80::/29", "201086"}, - {"2a0e:9300::/48", "17818"}, - {"2001:559:77c::/48", "33287"}, - {"2001:559:82f1::/48", "7016"}, - {"2001:67c:28c4::/48", "1257"}, - {"2600:6c7f:9050::/48", "20115"}, - {"2a02:7be0::/32", "201175"}, - {"2a0e:46c4:2800::/47", "213045"}, - {"240a:a130::/32", "142954"}, - {"2605:b100:d00::/41", "577"}, - {"2804:c70::/32", "52706"}, - {"2a06:4ac0::/32", "20609"}, - {"2a0e:fd45:693a::/32", "44103"}, - {"2001:559:c0fa::/48", "21508"}, - {"2408:8459:fe10::/44", "17622"}, - {"2600:1012:b1a0::/43", "6167"}, - {"2803:2c0::/32", "264830"}, - {"2804:7620::/32", "271091"}, - {"2a03:fb40::/29", "202796"}, - {"2001:550:560b::/39", "174"}, - {"2001:678:3ec::/48", "1257"}, - {"2400:bb40:2000::/46", "141039"}, - {"2409:8000:1000::/40", "56048"}, - {"240a:aa6b::/32", "145317"}, - {"2600:1419:1a01::/37", "20940"}, - {"2a00:9640::/41", "57710"}, - {"2a11:ed00::/29", "400522"}, - {"240a:acbf::/32", "145913"}, - {"2600:141b:6801::/35", "20940"}, - {"2a02:2e02:2370::/40", "12479"}, - {"2a03:4bc0:3150::/47", "209454"}, - {"2a03:da40::/31", "58222"}, - {"2001:a98:101::/37", "8517"}, - {"2800:160:1ef9::/45", "14259"}, - {"2804:14d:fb00::/63", "28573"}, - {"2401:d800:2110::/42", "7552"}, - {"240c:cda2::/22", "23910"}, - {"2600:5c00:2305::/37", "20001"}, - {"2602:ffc8:c000::/34", "20278"}, - {"2a09:c0c0::/29", "209235"}, - {"2001:44b8:29::/48", "4739"}, - {"2607:880::/32", "43288"}, - {"2607:f858:9::/32", "4136"}, - {"2620:10f:7000::/47", "54765"}, - {"2804:14c:7900::/40", "28573"}, - {"2804:2e30:21::/48", "265330"}, - {"2806:2f0:3161::/46", "17072"}, - {"2a00:e040:c0c::/48", "60436"}, - {"2a0f:1640::/29", "60262"}, - {"2001:678:a40::/48", "204911"}, - {"2806:230:2044::/48", "265594"}, - {"2a00:1850:2e1::/45", "29357"}, - {"2001:250:500a::/43", "24361"}, - {"2001:df0:90c0::/48", "140825"}, - {"2001:4978:5ff::/48", "13331"}, - {"2408:8459:3250::/37", "17816"}, - {"2409:8c28:3401::/40", "56041"}, - {"2600:1418:4::/33", "20940"}, - {"2806:10c8::/32", "8151"}, - {"2001:c80:c000::/34", "4673"}, - {"2001:1938:4300::/40", "33438"}, - {"2403:c00:a00::/39", "17488"}, - {"2408:8459:c630::/41", "17622"}, - {"2804:4b0:31c::/41", "262459"}, - {"2001:250:6c20::/43", "138370"}, - {"2001:44b8:6060::/45", "7545"}, - {"2409:8054:38::/48", "9808"}, - {"240e:44d:4800::/41", "140345"}, - {"2600:6c21:40c::/43", "20115"}, - {"2604:d600:c05::/44", "32098"}, - {"2620:11d:9001::/48", "33186"}, - {"2a05:fa80::/31", "202139"}, - {"2001:559:83ff::/48", "33655"}, - {"2001:da8:8019::/45", "24364"}, - {"2001:4220:c::/48", "36935"}, - {"2604:d600:1019::/42", "32098"}, - {"2804:5194::/32", "268463"}, - {"2804:817c::/32", "272457"}, - {"2001:67c:19e4::/48", "2119"}, - {"2804:2a4c::/32", "53167"}, - {"2403:3240::/32", "136975"}, - {"2606:2800:5052::/45", "15133"}, - {"2804:7de8::/32", "271590"}, - {"2a01:6b20::/34", "198296"}, - {"2a02:1006:c000::/48", "3320"}, - {"2a0e:97c3:4d0::/48", "20473"}, - {"2602:ff96:13::/48", "26548"}, - {"2620:1bc:102f::/48", "7726"}, - {"2800:160:1f1a::/45", "14259"}, - {"2a02:b48:8900::/38", "39572"}, - {"2a02:26f0:9e::/48", "20940"}, - {"2001:559:80e1::/48", "33662"}, - {"2001:559:8501::/48", "33650"}, - {"2001:661:2000::/35", "2199"}, - {"240e:967:1000::/37", "133775"}, - {"2a02:26f7:d784::/48", "36183"}, - {"2a07:2902:9c00::/38", "210378"}, - {"2001:67c:1400::/45", "29670"}, - {"2001:4878:4037::/44", "12222"}, - {"2a00:6860::/32", "60917"}, - {"2a01:8840:8d::/48", "207266"}, - {"2a0f:ea80::/32", "60144"}, - {"2001:67c:12c0::/47", "202033"}, - {"2001:1248:8755::/42", "11172"}, - {"2402:1dc0::/32", "137209"}, - {"240a:ab3c::/32", "145526"}, - {"240e:267:9400::/28", "4134"}, - {"2600:100d:ff10::/40", "22394"}, - {"2804:15e4:ff6::/44", "53001"}, - {"2804:3a18::/32", "266070"}, - {"2a07:3500:19f0::/48", "38915"}, - {"2a0f:c081:6d96::/48", "43694"}, - {"2001:470:c6::/48", "396097"}, - {"2001:c20:4878::/48", "9255"}, - {"2402:800:347f::/40", "7552"}, - {"2803:a040::/32", "263750"}, - {"2001:559:420::/48", "20214"}, - {"2405:d340::/32", "134712"}, - {"2602:fe7d::/36", "12155"}, - {"2606:b0c0:b00b::/48", "142598"}, - {"2a0b:7280::/62", "48635"}, - {"2804:3b2c:9000::/33", "266133"}, - {"2806:2f0:43a3::/41", "17072"}, - {"2001:5f8:7f06::/48", "18883"}, - {"2403:c900::/32", "58600"}, - {"2804:7f00::/32", "271660"}, - {"2806:2f0:5221::/46", "17072"}, - {"2a02:26f7:cb41::/46", "20940"}, - {"2a03:18e0::/32", "39567"}, - {"2407:8700::/32", "45415"}, - {"2408:8957:2a40::/40", "17622"}, - {"2803:cd60::/32", "64116"}, - {"2806:230:102c::/48", "265594"}, - {"2409:8c85:aa6d::/43", "9808"}, - {"240a:a80f::/32", "144713"}, - {"2605:a401:83f6::/37", "33363"}, - {"2a01:b740:a19::/48", "714"}, - {"2001:67c:888::/48", "8881"}, - {"240e:37b::/35", "140329"}, - {"240e:438:3840::/38", "4134"}, - {"2602:fdcb::/36", "397646"}, - {"2806:2f0:24e0::/35", "17072"}, - {"2a00:b440::/32", "12389"}, - {"2408:8956:21c0::/38", "17622"}, - {"2600:6c10:f058::/45", "20115"}, - {"2804:3324::/32", "265377"}, - {"2a02:26f7:ca80::/48", "36183"}, - {"240a:a0fa::/32", "142900"}, - {"2603:90f5:100::/40", "20001"}, - {"2804:3f4c::/32", "266651"}, - {"2a00:c2a0::/32", "25376"}, - {"2403:5680::/48", "7489"}, - {"2a00:6220::/32", "43557"}, - {"2a06:2340:1000::/44", "9558"}, - {"2606:6680:3::/48", "3170"}, - {"2620:11c:5000::/44", "13331"}, - {"2001:67c:704::/48", "25522"}, - {"2001:948:58::/47", "1653"}, - {"2406:81c0::/32", "141203"}, - {"240a:a672::/32", "144300"}, - {"2803:9d80::/32", "26617"}, - {"2804:1b3:9800::/34", "18881"}, - {"2804:1de0::/32", "264400"}, - {"2a0f:607:1059::/48", "57401"}, - {"2001:da8:2f00::/48", "138393"}, - {"240e:44d:6c80::/41", "4134"}, - {"2600:6c20:a96::/37", "20115"}, - {"2604:d600:1643::/44", "32098"}, - {"2804:14d:5c45::/43", "28573"}, - {"2804:22c::/45", "22689"}, - {"2001:1248:8470::/46", "11172"}, - {"240e:d9:a000::/37", "38283"}, - {"2602:fbf9::/40", "400283"}, - {"2804:1b5c::/47", "28334"}, - {"2402:800:37d3::/44", "7552"}, - {"2402:800:f5a0::/41", "7552"}, - {"2604:e540::/32", "30165"}, - {"2607:ff08::/32", "13722"}, - {"2804:68c4::/33", "269714"}, - {"2a0f:4ac0:1236::/32", "207921"}, - {"2001:da8:26f::/48", "24350"}, - {"2404:c080::/32", "135327"}, - {"2803:b9c0:8100::/40", "265705"}, - {"2a09:6381::/30", "62000"}, - {"2001:da8:2d00::/46", "138369"}, - {"2405:203:99d::/37", "55836"}, - {"2804:8170::/32", "272454"}, - {"2a02:1608::/32", "12531"}, - {"2a0e:b107:30::/48", "209650"}, - {"2001:12f0:b6f::/37", "1916"}, - {"240a:a829::/32", "144739"}, - {"2600:100d:be0e::/40", "22394"}, - {"2001:559:36d::/48", "7922"}, - {"2001:559:8578::/48", "33651"}, - {"2401:b0c0:b000::/48", "136941"}, - {"240c:c703::/27", "23910"}, - {"2606:fd00::/32", "11013"}, - {"2607:700:1500::/38", "22343"}, - {"2a00:ec20::/32", "16236"}, - {"2a09:d640::/29", "198345"}, - {"2001:3c8:2a07::/48", "135528"}, - {"2406:d00:dddd::/48", "132165"}, - {"2407:6e00:5::/48", "17987"}, - {"2600:1408:a401::/48", "20940"}, - {"2607:fae0:6000::/36", "8038"}, - {"2804:2530::/32", "264265"}, - {"2804:36c8::/32", "266371"}, - {"2804:62d8::/32", "269322"}, - {"2001:fd8:b180::/42", "132199"}, - {"2a00:4901::/32", "206509"}, - {"2a00:8180::/32", "16205"}, - {"2001:fb1:300a::/32", "17552"}, - {"240e:3bf:9200::/36", "140317"}, - {"2620:171:1e::/47", "42"}, - {"2a00:9880::/32", "12963"}, - {"2a07:ed00::/31", "41981"}, - {"2001:250:6818::/46", "138373"}, - {"2600:370f:7581::/42", "32261"}, - {"2604:d600:1252::/42", "32098"}, - {"2a02:26f7:f384::/48", "36183"}, - {"2409:8904:57b0::/36", "24547"}, - {"2600:370f:20c8::/42", "32261"}, - {"2602:801:c008::/48", "2639"}, - {"2a02:720::/38", "34427"}, - {"2405:ae00::/32", "10219"}, - {"2600:1406:2801::/38", "20940"}, - {"2604:ca00:f000::/48", "36492"}, - {"2a00:9b00::/32", "29282"}, - {"2600:1415:e001::/37", "20940"}, - {"2600:140b:1201::/39", "20940"}, - {"2804:4544:d800::/40", "266915"}, - {"2806:230:4023::/48", "11888"}, - {"2001:559:33b::/48", "33657"}, - {"2001:67c:29dc::/48", "28940"}, - {"2400:3e20::/36", "398355"}, - {"2401:d800:2170::/40", "7552"}, - {"2607:fe28:206::/35", "53347"}, - {"2001:1900:2272::/45", "3356"}, - {"2a00:fc00::/32", "3255"}, - {"2a06:8145:9f::/48", "199364"}, - {"2c0f:eff0::/32", "327859"}, - {"240a:a089::/32", "142787"}, - {"2620:11c:d000::/47", "63161"}, - {"2800:180::/32", "27924"}, - {"2804:2cac::/35", "265234"}, - {"2804:2fc4:fffe::/47", "264911"}, - {"2605:c3c0:c0fe::/47", "393954"}, - {"2804:3768::/32", "266410"}, - {"2a01:418::/32", "42344"}, - {"2a0c:e707:4000::/34", "39533"}, - {"2a0f:5381:acac::/33", "208135"}, - {"2001:559:815e::/48", "33668"}, - {"2001:67c:16b8::/48", "25166"}, - {"240a:a833::/32", "144749"}, - {"2620:0:1cff:dead:beee::140a/50", "32934"}, - {"2800:bf0:81c2::/48", "27947"}, - {"2804:14c:3f00::/40", "28573"}, - {"2806:2f0:5441::/46", "17072"}, - {"2a04:2500::/48", "60940"}, - {"2a0e:bc0::/29", "41731"}, - {"2a0f:ca87:4::/48", "210344"}, - {"2001:678:4c::/48", "42"}, - {"2001:df0:2ba::/48", "132277"}, - {"2409:8d00::/32", "56048"}, - {"2600:1005:f000::/44", "6167"}, - {"2804:30c::/39", "28343"}, - {"2804:11c8::/36", "263439"}, - {"2a02:d48:bb::/48", "16080"}, - {"2a0e:fd45:b00b::/48", "208150"}, - {"2001:67c:2310::/48", "34564"}, - {"2607:4880:a000::/33", "53508"}, - {"2803:6603:8000::/33", "28075"}, - {"2804:14d:4e85::/44", "28573"}, - {"2804:35d0::/32", "266308"}, - {"2804:5ed8:9000::/33", "269060"}, - {"2806:230:2006::/48", "265594"}, - {"2a03:3100::/32", "29072"}, - {"2409:8030:1100::/36", "9808"}, - {"2607:fae0:9000::/36", "62529"}, - {"2806:2f0:20e0::/48", "17072"}, - {"2a07:e02:bee::/48", "210083"}, - {"2409:8754:2c00::/35", "9808"}, - {"2a02:2f0f:385::/32", "8708"}, - {"2001:df7:df80::/48", "23676"}, - {"2400:4d40:255::/46", "134204"}, - {"2403:ca00::/32", "37933"}, - {"2804:14d:188b::/41", "28573"}, - {"2a03:9320::/32", "5505"}, - {"2a05:d050:80a0::/43", "16509"}, - {"2a10:9903:301::/48", "60790"}, - {"2a12:3e80::/40", "30823"}, - {"2400:adc0:c110::/47", "9541"}, - {"2605:7380::/32", "25697"}, - {"2607:d500:200::/47", "54527"}, - {"2620:58:c400::/48", "36140"}, - {"2804:638c::/32", "269368"}, - {"2806:20d:580f::/39", "32098"}, - {"2a05:840::/48", "43350"}, - {"240a:a269::/32", "143267"}, - {"240a:ac9b::/32", "145877"}, - {"2804:112c::/32", "263663"}, - {"2a12:9140::/48", "16509"}, - {"2001:4cf8:6000::/48", "3758"}, - {"240a:a4d3::/32", "143885"}, - {"2605:2fc0:1200::/36", "31984"}, - {"2a02:26f7:bb41::/46", "20940"}, - {"2a09:3a00:3a00::/40", "59795"}, - {"2406:3003:2081::/36", "4657"}, - {"240e:928:401::/35", "58542"}, - {"2804:3344::/32", "265385"}, - {"2a01:b740:1112::/38", "714"}, - {"2408:8459:e10::/41", "17622"}, - {"240e:108:1003::/44", "4134"}, - {"2600:140b:8401::/36", "20940"}, - {"2804:6998::/32", "262574"}, - {"2a03:1aa0:5000::/32", "201730"}, - {"2a0b:cbc0::/32", "2027"}, - {"2a0f:7a40::/31", "207858"}, - {"2001:510:131::/38", "376"}, - {"2402:8100:3080::/42", "45271"}, - {"2a02:26f7:f6e0::/47", "36183"}, - {"2001:250:2c05::/48", "24357"}, - {"2607:6980:50b0::/44", "20473"}, - {"2607:f6f0:6000::/48", "27566"}, - {"2804:4cb8::/32", "267387"}, - {"2a02:26f7:e000::/48", "36183"}, - {"2a0c:40::/32", "204426"}, - {"2001:678:b78::/48", "8794"}, - {"2001:913:3000::/36", "204708"}, - {"2405:4803:ce0::/44", "18403"}, - {"2405:c9c0:ff::/35", "138823"}, - {"2600:1488:a201::/40", "20940"}, - {"2a02:26f7:e441::/46", "20940"}, - {"2a03:4d41:310::/37", "199610"}, - {"240a:a1ac::/32", "143078"}, - {"2600:1419:19::/48", "4230"}, - {"2605:a401:899a::/41", "33363"}, - {"2803:6604:e600::/35", "28075"}, - {"2a0d:bfc0::/32", "210220"}, - {"2a0e:aa01:2000::/32", "206499"}, - {"2001:559:18f::/43", "7016"}, - {"2001:559:203::/48", "7015"}, - {"2409:805c:5b00::/37", "9808"}, - {"2409:871e::/31", "24400"}, - {"2600:140f:b001::/37", "20940"}, - {"2a02:26a0::/29", "15547"}, - {"2a02:26f7:fb41::/46", "20940"}, - {"2001:b30:4213::/32", "2614"}, - {"2001:dce:7801::/37", "23869"}, - {"2001:fb0:101c::/48", "55476"}, - {"2804:4e88::/32", "268267"}, - {"2a02:26f7:d156::/47", "20940"}, - {"2001:550:5500:1::/38", "174"}, - {"2001:250:2438::/38", "23910"}, - {"2001:559:8240::/48", "33652"}, - {"2602:fc45::/36", "399904"}, - {"2606:2800:420c::/48", "14210"}, - {"2606:cd80::/48", "394727"}, - {"2804:7f68::/32", "271686"}, - {"2a00:18d8:3::/32", "8697"}, - {"2a02:26f0:4d00::/48", "34164"}, - {"2a0b:b980:1::/46", "51920"}, - {"2001:579:c1a4::/38", "22773"}, - {"2001:1248:9989::/45", "11172"}, - {"240a:affc::/32", "146742"}, - {"2620:1d0:5a::/48", "397228"}, - {"2a02:26f7:da05::/46", "20940"}, - {"2001:480:51::/48", "6009"}, - {"2001:da8:27f::/36", "23910"}, - {"2800:440:8106::/48", "27738"}, - {"240a:a75c::/32", "144534"}, - {"240d:c010:77::/44", "139341"}, - {"240e:964:2c00::/38", "133776"}, - {"2607:f4f0::/32", "40581"}, - {"2806:230:204d::/48", "11888"}, - {"2a02:26f7:b5c8::/48", "36183"}, - {"2a02:26f7:e145::/46", "20940"}, - {"2a0a:6f80::/32", "50673"}, - {"2c0f:f500::/32", "327935"}, - {"2001:559:444::/48", "22909"}, - {"240a:aed7::/32", "146449"}, - {"240e:982:7000::/40", "134238"}, - {"2804:2c84::/32", "265224"}, - {"2804:60e8::/32", "269199"}, - {"2a0c:9200::/40", "200924"}, - {"2a0e:b107:10f0::/44", "213105"}, - {"2a10:6d00::/29", "399975"}, - {"240a:ab26::/32", "145504"}, - {"2620:149:a1c::/48", "6185"}, - {"2800:370::/48", "28006"}, - {"2804:56e0::/42", "268029"}, - {"2806:2f0:43a1::/46", "17072"}, - {"2a02:d48:bc::/32", "34913"}, - {"2001:559:8640::/46", "7015"}, - {"240e:438:2820::/43", "140647"}, - {"2600:1417:2::/48", "24319"}, - {"2803:9800:a485::/41", "11664"}, - {"2804:3b6c:e000::/35", "265442"}, - {"2a05:4140:1a1::/48", "211358"}, - {"2a11:3c02::/31", "57844"}, - {"2409:806b:100::/36", "9808"}, - {"240e:44d:1b80::/41", "4134"}, - {"2602:fd5d::/40", "398578"}, - {"2605:37c0::/39", "396469"}, - {"2a00:1cf0::/32", "196724"}, - {"2a00:aea0:600::/40", "12678"}, - {"2a04:4e40:9400::/48", "54113"}, - {"2a0a:1580::/29", "34993"}, - {"2a0e:97c0:694::/44", "210354"}, - {"2001:468:c07::/48", "396955"}, - {"2607:f130::/32", "35916"}, - {"2a02:26f0:1d01::/40", "20940"}, - {"2a00:4040::/48", "48426"}, - {"2a00:ad87:4601::/48", "22216"}, - {"2a0f:ec00:1f::/48", "60781"}, - {"2001:4130:107::/48", "24725"}, - {"2800:160:13c9::/45", "14259"}, - {"2a02:5b40::/31", "59943"}, - {"2001:1680::/29", "9044"}, - {"240a:a4ce::/32", "143880"}, - {"2606:e900::/32", "32444"}, - {"2620:123:2007::/44", "30103"}, - {"2a07:e480:1::/48", "207465"}, - {"2409:8944::/28", "24445"}, - {"2804:1758::/32", "263139"}, - {"2a0f:9340:10::/47", "1299"}, - {"2001:3c8:1701::/48", "23687"}, - {"2001:559:1a6::/47", "7725"}, - {"2400:6280:15::/48", "132876"}, - {"2402:800:547f::/40", "7552"}, - {"2404:e040:c000::/34", "63780"}, - {"2408:8256:3d6a::/48", "17623"}, - {"2804:66d4::/32", "269585"}, - {"2a02:1748::/32", "51184"}, - {"2a10:c640::/48", "211541"}, - {"240d:4000::/21", "133111"}, - {"240e:966:8c00::/35", "4134"}, - {"2800:160:152e::/43", "14259"}, - {"2804:1dbc::/35", "264390"}, - {"2804:2d2c::/32", "52971"}, - {"2804:4f2c::/33", "268309"}, - {"2a07:22c1:31::/48", "212405"}, - {"2001:559:84bf::/48", "33659"}, - {"2001:559:c1fb::/48", "33287"}, - {"2001:678:8a8::/48", "48686"}, - {"2001:df2:9900::/48", "134032"}, - {"2800:68:39::/48", "27947"}, - {"2600:6c10:e44::/44", "20115"}, - {"2603:90b8::/32", "10796"}, - {"2804:1090::/32", "263640"}, - {"2804:184c:104::/32", "61928"}, - {"2806:2f0:12e0::/48", "22884"}, - {"2a02:1f8::/32", "8426"}, - {"2a0c:e640:24::/36", "211876"}, - {"2001:559:23::/48", "33650"}, - {"2001:67c:291c::/48", "211935"}, - {"240a:a61b::/32", "144213"}, - {"2620:11b:e0a4::/47", "202818"}, - {"2800:200:e::/34", "12252"}, - {"2a01:9e02::/29", "41495"}, - {"2a02:26f0:4501::/38", "20940"}, - {"2401:1c00:5100::/34", "38809"}, - {"2604:3840:2::/48", "20061"}, - {"2607:fdb8:8000::/33", "36024"}, - {"2001:ad0:5100::/32", "3327"}, - {"2406:ee80::/32", "55699"}, - {"2600:370f:60a3::/45", "32261"}, - {"2a03:b980:300::/32", "56730"}, - {"2a04:4a45:c::/46", "206067"}, - {"2a0e:c9c0::/29", "50673"}, - {"2a0f:fec0::/29", "47232"}, - {"2001:1a11:55::/42", "42298"}, - {"2a03:57c0::/32", "48159"}, - {"2001:559:4a1::/48", "33659"}, - {"2001:d08::/40", "9534"}, - {"2607:cd80:a000::/36", "6528"}, - {"2800:370:19::/48", "28006"}, - {"2a00:1d36:1140::/40", "9121"}, - {"2a0d:82c7:2::/47", "47787"}, - {"2600:1417:42::/44", "20940"}, - {"2607:fef8:ffe5::/43", "13750"}, - {"2803:83a0::/48", "267745"}, - {"2a03:12c0::/32", "199672"}, - {"2a07:5202::/47", "213208"}, - {"2001:4b20::/55", "34288"}, - {"2804:4c68::/32", "267369"}, - {"2a0b:b582::/48", "43304"}, - {"2001:2b8:e6::/48", "1237"}, - {"2001:559:c4de::/48", "7922"}, - {"2607:f150:ffff::/48", "3601"}, - {"2620:11e:900a::/48", "12196"}, - {"2a01:8640:2::/48", "59711"}, - {"2a0f:6fc2::/32", "51837"}, - {"2001:559:202::/48", "33657"}, - {"240e:44d:7780::/41", "4134"}, - {"2a06:a5c0::/30", "400177"}, - {"2a00:4802:1010::/37", "8717"}, - {"2404:8d02:2041::/40", "9587"}, - {"2405:9800:c919::/46", "45458"}, - {"2804:7cc:100::/48", "28669"}, - {"2804:2690::/32", "263838"}, - {"2804:6fa8::/32", "270675"}, - {"2806:2f0:1000::/46", "22884"}, - {"2a0f:8646:b00c::/31", "25682"}, - {"2001:678:b54::/48", "41268"}, - {"2404:c2c0:4000::/40", "135629"}, - {"2001:4c50::/32", "35244"}, - {"2403:8880::/32", "17964"}, - {"2804:1778::/32", "263146"}, - {"2804:7134::/32", "270774"}, - {"2806:230:4034::/48", "265594"}, - {"2a01:800::/31", "12430"}, - {"2405:7f00:aec0::/35", "133414"}, - {"2800:bf0:a10b::/48", "52257"}, - {"2804:757c::/32", "261050"}, - {"2a02:26f0:7701::/36", "20940"}, - {"2402:800:3555::/42", "7552"}, - {"2a03:a0a0::/46", "39405"}, - {"2c0f:fe38:5::/46", "33771"}, - {"2001:678:564::/48", "56439"}, - {"2600:1480:2100::/37", "20940"}, - {"2607:f1e8::/32", "31939"}, - {"2804:41c::/36", "262416"}, - {"2001:14e0::/32", "12931"}, - {"240a:a6f1::/32", "144427"}, - {"2607:9e80::/35", "397068"}, - {"2620:124:9000::/44", "6838"}, - {"2a01:3f1:3400::/33", "8674"}, - {"2a0e:b704::/46", "210960"}, - {"2001:678:850::/48", "20853"}, - {"2402:4000:1251::/40", "18001"}, - {"2408:8459:fd00::/38", "17816"}, - {"2604:a140:1500::/47", "64658"}, - {"2607:f110:1a::/42", "21889"}, - {"2a05:d050:40c0::/44", "16509"}, - {"2403:0:11c::/48", "65353"}, - {"2804:2980::/32", "53172"}, - {"2001:559:141::/48", "33287"}, - {"2001:4ba3::/32", "24961"}, - {"240a:aaa3::/32", "145373"}, - {"240e:3b5:ec00::/35", "140314"}, - {"2604:4180::/32", "15191"}, - {"2605:5300::/39", "21557"}, - {"2803:1840::/32", "265688"}, - {"2001:500:80::/48", "27299"}, - {"2001:559:71d::/46", "33287"}, - {"2408:8957:8d00::/40", "17816"}, - {"2409:8904:32a0::/39", "24547"}, - {"2a01:77e0::/32", "51088"}, - {"2001:67c:404::/48", "13008"}, - {"240e:3b7:9200::/36", "140317"}, - {"2804:14ac::/32", "263343"}, - {"2a0e:df40::/32", "60117"}, - {"2c0f:f850:dc02::/47", "327979"}, - {"2405:2c40::/32", "45705"}, - {"2804:1b2:4042::/36", "18881"}, - {"2001:559:8573::/48", "33659"}, - {"2401:b080::/41", "133748"}, - {"2402:7a00::/32", "23639"}, - {"2405:6e00:2600::/41", "133612"}, - {"2600:1480:a100::/36", "20940"}, - {"2603:c0e8:1210::/39", "1218"}, - {"2804:7e24::/32", "271605"}, - {"2001:67c:390::/48", "51857"}, - {"2001:4998:ef6b::/48", "36647"}, - {"2800:200:f0d0::/39", "12252"}, - {"2804:14c:ca00::/40", "28573"}, - {"2804:7ef8::/32", "271658"}, - {"2a0e:b107:3f4::/47", "57883"}, - {"2a12:d280::/32", "56958"}, - {"2001:cd8:4781::/32", "4780"}, - {"2404:f4c0:f4cf::/48", "142549"}, - {"240a:a983::/32", "145085"}, - {"2803:c660::/32", "64122"}, - {"2804:6fc::/43", "28158"}, - {"2804:8308::/32", "272172"}, - {"2a00:1e88::/45", "12389"}, - {"2001:678:a18::/48", "43350"}, - {"240e:108:12a0::/39", "4134"}, - {"2a01:c50f:c200::/39", "12479"}, - {"2001:ab7:f000::/36", "15594"}, - {"2001:df6:5e00::/47", "134909"}, - {"2600:80c:100::/40", "701"}, - {"2607:f380:a68::/48", "396310"}, - {"2804:4aa8::/32", "267255"}, - {"2804:808c::/32", "271758"}, - {"2a02:2720::/32", "6663"}, - {"2a03:f80:32::/47", "9009"}, - {"2a0c:dc40::/29", "31370"}, - {"2402:9d80:a20::/41", "131429"}, - {"2403:7200::/32", "9785"}, - {"240a:a96b::/32", "145061"}, - {"240e:3b1:ec00::/35", "140314"}, - {"2620:10c:f014::/48", "33459"}, - {"2607:ff10:fdc2::/38", "10439"}, - {"2800:484:d00::/40", "14080"}, - {"2804:1350::/32", "263528"}, - {"2806:370:8000::/44", "28403"}, - {"2400:dcc0:ad04::/38", "38631"}, - {"2402:e280:200::/48", "134674"}, - {"240a:ad78::/32", "146098"}, - {"2600:9000:1e23::/48", "16509"}, - {"2607:fd48:d00:2::/45", "13536"}, - {"2620:117:0:a::/64", "10564"}, - {"2a04:4e41:24::/43", "54113"}, - {"2a0b:7140:2::/48", "212228"}, - {"2001:559:861f::/48", "33651"}, - {"2605:1980:107::/38", "13951"}, - {"2a02:2a70::/32", "702"}, - {"2620:111:d014::/48", "12025"}, - {"2803:8d00::/32", "27988"}, - {"2a03:1d60::/32", "60294"}, - {"2a03:7700::/32", "34439"}, - {"2a0a:b6c0::/32", "57728"}, - {"2402:79c0:1145::/48", "26415"}, - {"2404:fc00:1001::/45", "45910"}, - {"2001:428:2001:206::/35", "209"}, - {"2001:678:31c::/48", "35213"}, - {"240e:108:92::/48", "4134"}, - {"240e:44d:2380::/41", "4134"}, - {"2600:370f:36c8::/42", "32261"}, - {"2600:6c38:1c7::/44", "20115"}, - {"2804:1ca4:8081::/33", "263010"}, - {"2a00:66c0::/32", "200460"}, - {"2001:559:2ca::/47", "33657"}, - {"2408:8656:3800::/40", "17623"}, - {"2600:6c38:11::/46", "20115"}, - {"2801:17:c001::/48", "272037"}, - {"2803:71a0::/32", "267702"}, - {"2806:230:2054::/48", "265594"}, - {"2a03:d000:9000::/48", "13075"}, - {"240a:a6db::/32", "144405"}, - {"240e:5a:49c0::/38", "140303"}, - {"2804:130c::/39", "263512"}, - {"2a01:6c60::/34", "62217"}, - {"2001:67c:2abc::/48", "199552"}, - {"240a:a831::/32", "144747"}, - {"2804:19a8::/32", "61810"}, - {"2a0f:7600::/32", "43847"}, - {"2001:67c:31c::/48", "47195"}, - {"2401:4900:5aa0::/39", "45609"}, - {"2402:800:32e0::/44", "7552"}, - {"2610:28:f021::/36", "81"}, - {"2804:4870::/39", "267121"}, - {"2806:1018:cd00::/34", "8151"}, - {"2a00:1920::/48", "15866"}, - {"2001:418:1466::/48", "396370"}, - {"240e:983:b00::/48", "134420"}, - {"2804:928::/32", "53102"}, - {"2a02:26f7:d408::/48", "36183"}, - {"2a0c:e641::/32", "209645"}, - {"2a10:40c0::/32", "213299"}, - {"2001:4b98:aaac::/39", "29169"}, - {"2620:10a:d000::/44", "33703"}, - {"2a02:5520::/32", "35600"}, - {"2a0b:a8c0::/47", "13215"}, - {"2a0d:a5c0::/36", "197991"}, - {"240a:a119::/32", "142931"}, - {"240a:a927::/32", "144993"}, - {"2a02:26f7:bec4::/48", "36183"}, - {"2001:559:81a8::/48", "33287"}, - {"2001:4830:c171::/38", "27552"}, - {"2409:8021:3803::/29", "9808"}, - {"2409:8053:1800::/47", "56047"}, - {"2600:370f:7024::/46", "32261"}, - {"2804:45e4:7210::/37", "262567"}, - {"2a01:288::/33", "8717"}, - {"2a04:9d40:f000::/36", "13414"}, - {"2402:800:f9f0::/38", "7552"}, - {"2408:8a02:b110::/42", "9929"}, - {"2804:5e9c::/32", "269044"}, - {"2a02:2510::/32", "44068"}, - {"2a06:fb00:1::/45", "203391"}, - {"2a11:9780::/29", "204790"}, - {"2001:16a2:3e::/39", "39386"}, - {"2402:5680:4000::/36", "133798"}, - {"2600:6c10:20f::/37", "20115"}, - {"2800:bf0:a400::/43", "52257"}, - {"2001:559:5b3::/48", "13367"}, - {"2804:6278::/32", "269299"}, - {"2a10:4140::/29", "206478"}, - {"240a:a1ab::/32", "143077"}, - {"240a:a229::/32", "143203"}, - {"2620:12f:c00d::/46", "395831"}, - {"2804:238::/32", "23106"}, - {"2a03:9c80:8000::/34", "208277"}, - {"2001:559:c500::/48", "33668"}, - {"240a:a5c5::/32", "144127"}, - {"2600:370f:5224::/44", "32261"}, - {"2a0c:9a40:8080::/48", "136620"}, - {"2401:9f00::/32", "9925"}, - {"2402:8100:39ed::/46", "55644"}, - {"240a:aec6::/32", "146432"}, - {"2606:be00::/40", "13768"}, - {"2620:1e0:311::/46", "10801"}, - {"2804:85dc:f001::/36", "272605"}, - {"2c0f:f738:3803::/37", "61317"}, - {"2a03:7240::/40", "56973"}, - {"2001:1248:98e1::/48", "11172"}, - {"2404:bf40:e005::/48", "2764"}, - {"2406:840:feb0::/48", "208753"}, - {"2406:8800:9035::/44", "17465"}, - {"2607:f380:a4f::/48", "32361"}, - {"2804:3f8::/32", "262589"}, - {"2001:1248:8901::/40", "11172"}, - {"240a:aabb::/32", "145397"}, - {"2604:2800::/33", "26793"}, - {"2804:7da0::/32", "271573"}, - {"2a02:bf8:1602::/32", "1239"}, - {"2a02:26f7:d308::/48", "36183"}, - {"2a0e:b100:101::/45", "207556"}, - {"240e:e1:d100::/48", "4811"}, - {"2600:1007:a110::/36", "22394"}, - {"2804:8000::/32", "271723"}, - {"2a04:8d80::/29", "201508"}, - {"2a05:44c0::/32", "32338"}, - {"2a05:5b00::/29", "196881"}, - {"2a0a:2e40:ac01::/46", "206232"}, - {"2a0a:6400::/29", "35202"}, - {"2401:b780:5002::/47", "65435"}, - {"240a:a376::/32", "143536"}, - {"240a:a941::/32", "145019"}, - {"2600:380:f108::/46", "20057"}, - {"2a0f:cd40::/29", "47638"}, - {"2001:428:4005::/37", "209"}, - {"2001:468:2631::/44", "11537"}, - {"2001:480:52::/44", "668"}, - {"2001:550:9b04::/40", "174"}, - {"2602:ffc0::/36", "11080"}, - {"2804:1d9c::/35", "264381"}, - {"2a02:4a20::/32", "30742"}, - {"2001:250:2401::/46", "24356"}, - {"2001:559:8099::/48", "7922"}, - {"2a02:d107:f006::/47", "200088"}, - {"2a0c:a80::/29", "200000"}, - {"2804:3680::/32", "266352"}, - {"2a04:e540::/32", "197938"}, - {"2a0f:d840::/29", "207558"}, - {"2c0f:ed00:100::/44", "328442"}, - {"2402:3dc0:572::/47", "11179"}, - {"240a:ad48::/32", "146050"}, - {"2a02:6900:880c::/48", "43894"}, - {"2001:559:338::/48", "33652"}, - {"2409:803c:100::/37", "9808"}, - {"240e:94a::/29", "4134"}, - {"2806:230:101e::/48", "265594"}, - {"2a02:1390:b000::/40", "21351"}, - {"2a09:e1c1:eff0::/44", "210311"}, - {"2001:559:862c::/48", "33287"}, - {"2001:67c:678::/48", "201816"}, - {"2a0e:1d80:7::/48", "47890"}, - {"2401:d800:9830::/40", "7552"}, - {"2a03:c340::/32", "57324"}, - {"2602:804:4000::/40", "32655"}, - {"2804:3778::/32", "266417"}, - {"2804:3988::/32", "52571"}, - {"2804:4608:8000::/33", "266964"}, - {"2a07:f680::/29", "202311"}, - {"2a0f:8640:b00c::/31", "25682"}, - {"2001:559:c3e1::/48", "33660"}, - {"240a:a5dd::/32", "144151"}, - {"2803:1240::/41", "27855"}, - {"2001:559:c415::/48", "7016"}, - {"2001:dd8:1::/48", "38283"}, - {"2402:e380:31c::/48", "141749"}, - {"2403:9800:c040::/47", "133124"}, - {"2804:2a0c::/32", "264053"}, - {"2a02:26f7:dec9::/46", "20940"}, - {"2a04:5a40::/29", "60311"}, - {"2a07:1780::/29", "57696"}, - {"2a01:c50f:f5c0::/38", "12479"}, - {"2a0a:2842:16::/48", "42962"}, - {"2a0c:3ac0::/48", "46562"}, - {"2a0d:a680::/32", "204609"}, - {"2400:c800:620::/33", "4515"}, - {"240a:a1ce::/32", "143112"}, - {"2602:ff8f:fff::/48", "53274"}, - {"2620:37:c000::/48", "5050"}, - {"2804:57b0::/32", "268080"}, - {"2a07:84c0::/29", "43770"}, - {"2001:1250:ffe0::/43", "22894"}, - {"2405:1c0:6161::/45", "55303"}, - {"2602:fcc3::/48", "399135"}, - {"2800:4f0:50::/40", "28006"}, - {"2804:6658::/32", "269552"}, - {"2a04:4e40:b2f0::/48", "54113"}, - {"2804:14d:688b::/42", "28573"}, - {"2a02:26f7:b99c::/48", "36183"}, - {"2401:df80::/32", "133652"}, - {"240a:a2d9::/32", "143379"}, - {"2a00:86c0:2090::/47", "40027"}, - {"2001:44b8:30c4::/48", "7545"}, - {"2401:d800:5d32::/41", "7552"}, - {"2a01:aee0::/32", "208582"}, - {"2001:559:12b::/48", "33654"}, - {"2001:67c:1b94::/48", "44768"}, - {"2400:cb00:a0f0::/45", "13335"}, - {"2602:fff4::/32", "54869"}, - {"2a00:ef8::/32", "13243"}, - {"2a04:13c5::/32", "61049"}, - {"2001:579:6298::/45", "22773"}, - {"2001:df7:fe80::/48", "149001"}, - {"2406:e000:c11::/44", "23655"}, - {"2409:8030:3900::/31", "9808"}, - {"2607:f798:3000::/32", "812"}, - {"2803:5440:ffff::/48", "264738"}, - {"2804:69f8::/32", "270303"}, - {"2a00:1b11:115::/46", "29152"}, - {"2a02:26f0:3301::/37", "20940"}, - {"2001:559:33a::/48", "33287"}, - {"2600:1011:f110::/36", "6167"}, - {"2800:bf0:69::/43", "52257"}, - {"2001:44b8:406e::/48", "7545"}, - {"2400:b380::/32", "38843"}, - {"2404:bac0::/32", "131642"}, - {"240a:ab33::/32", "145517"}, - {"2804:5248:9000::/33", "268508"}, - {"2a01:a680::/32", "59545"}, - {"2001:44b8:30ce::/48", "7545"}, - {"2407:98c0::/32", "139924"}, - {"2800:a10::/34", "11014"}, - {"2a02:26f7:d704::/48", "36183"}, - {"2a02:c080::/29", "25133"}, - {"2a0b:88c0::/29", "206728"}, - {"2409:8c54:1850::/37", "56040"}, - {"240a:a05c::/32", "142742"}, - {"240e:c:7000::/37", "136197"}, - {"2a02:2971::/29", "43847"}, - {"2a02:6a80:530e::/48", "197997"}, - {"2001:1a11:10c::/48", "8781"}, - {"2001:4b6c::/30", "12635"}, - {"2409:8055:3d::/46", "56040"}, - {"2800:110:1021::/45", "4270"}, - {"2a00:6200::/29", "21502"}, - {"2a01:367:deae::/34", "30823"}, - {"2a0b:5800::/32", "62167"}, - {"2408:8459:a050::/38", "17816"}, - {"2a04:8040::/29", "44527"}, - {"2408:8956:5400::/40", "17622"}, - {"240a:a748::/32", "144514"}, - {"2610:108:f000::/48", "13506"}, - {"2804:191c::/32", "52641"}, - {"2804:2b78:8000::/33", "52468"}, - {"2a02:6680:f1e0::/43", "16116"}, - {"2001:4220:8011::/46", "24835"}, - {"2402:800:7e60::/40", "7552"}, - {"2804:14d:4487::/44", "28573"}, - {"2a00:10d8:10::/48", "29405"}, - {"2001:559:84f1::/48", "33659"}, - {"2001:559:c318::/48", "33651"}, - {"2001:678:4c8::/48", "41731"}, - {"2001:ee0:306::/41", "135905"}, - {"240e:679:c200::/39", "140329"}, - {"2602:803:9003::/44", "17138"}, - {"2604:aa80::/32", "46276"}, - {"2804:e94:700::/43", "262468"}, - {"2a01:9140:cccc::/48", "52122"}, - {"2604:d600:63b::/41", "32098"}, - {"2a0b:59c0::/31", "204945"}, - {"2a0c:b642:321::/40", "206499"}, - {"2a0d:2581:fffc::/48", "209261"}, - {"2a0e:400::/25", "210278"}, - {"2a0f:8ac1:d452::/48", "205749"}, - {"2001:678:970::/48", "31317"}, - {"2001:67c:290::/48", "42195"}, - {"2001:c20:4871::/48", "9255"}, - {"2001:559:31::/46", "7922"}, - {"2001:df1:3580::/48", "135985"}, - {"2600:6c38:202::/43", "20115"}, - {"2606:6040::/32", "399871"}, - {"2a01:300:71::/29", "9009"}, - {"2a09:1480::/39", "35704"}, - {"2001:559:8088::/48", "33657"}, - {"2400:6280:101::/48", "132280"}, - {"2800:400:4000::/48", "27668"}, - {"2804:148c::/32", "263336"}, - {"2001:559:8354::/48", "22909"}, - {"2620:8b:4000::/48", "36407"}, - {"2a03:b880::/29", "47297"}, - {"2001:559:8695::/48", "33287"}, - {"2001:dec::/48", "132797"}, - {"2405:e280:2080::/48", "55769"}, - {"2001:b200:2300::/35", "9505"}, - {"2405:1c0:6441::/46", "55303"}, - {"2804:1780::/32", "263151"}, - {"2a02:26f7:d689::/42", "20940"}, - {"2800:bf0:71::/46", "27947"}, - {"2001:559:29e::/48", "33490"}, - {"2001:4479:8000::/35", "7545"}, - {"2606:4700:140::/36", "13335"}, - {"2620:135:604f::/43", "22697"}, - {"2806:230:2057::/48", "11888"}, - {"2a01:1b0::/32", "31477"}, - {"2001:250:2c2d::/46", "138381"}, - {"2a01:53c0:fffa::/45", "54994"}, - {"2a03:9900::/40", "8990"}, - {"2001:dc8::/47", "23902"}, - {"2401:14c0:5::/42", "136531"}, - {"2408:8957:f440::/40", "17622"}, - {"2803:7be0::/32", "270093"}, - {"2408:8206:a840::/31", "4808"}, - {"2620:78:2000::/48", "26331"}, - {"2804:61a4::/32", "269247"}, - {"2a0a:21c0::/29", "30972"}, - {"2400:cb00:245::/44", "13335"}, - {"2a04:e702:980::/29", "48849"}, - {"2a09:b640::/29", "209255"}, - {"2401:4900:5690::/39", "45609"}, - {"2804:8274::/32", "272522"}, - {"2001:559:37e::/48", "33651"}, - {"2001:df4:200::/47", "133967"}, - {"2001:4878:b136::/48", "12222"}, - {"2409:8051:3002::/40", "56047"}, - {"240a:a074::/32", "142766"}, - {"240e:438:2020::/43", "140647"}, - {"2a00:1fe8::/32", "34154"}, - {"2403:20c0:2::/47", "137945"}, - {"2803:c580::/32", "55259"}, - {"2804:e14::/32", "52543"}, - {"2a07:fe00::/29", "3214"}, - {"2001:253:125::/48", "142091"}, - {"2001:1a11:65::/44", "42298"}, - {"2408:8459:1a10::/42", "17623"}, - {"2600:2:d10::/44", "399741"}, - {"2401:dac0::/32", "13984"}, - {"2600:370f:3641::/45", "32261"}, - {"2605:8000:25::/40", "4261"}, - {"2804:8218::/32", "272498"}, - {"2a0d:3841:1000::/48", "57629"}, - {"2a0e:e704:44::/48", "212971"}, - {"2001:250:2c2f::/39", "23910"}, - {"2405:2d00::/32", "58877"}, - {"2409:8b00::/31", "56048"}, - {"240e:624::/30", "4134"}, - {"2804:7a58::/32", "271361"}, - {"2a03:1100::/32", "42903"}, - {"2001:250:343f::/41", "138393"}, - {"2001:559:c4c6::/48", "33287"}, - {"2409:804c:3900::/33", "9808"}, - {"2409:8924:4500::/38", "56046"}, - {"240a:a33f::/32", "143481"}, - {"240a:aa0b::/32", "145221"}, - {"2804:14c:4500::/40", "28573"}, - {"2804:6924::/32", "270251"}, - {"2401:d800:2f10::/42", "7552"}, - {"2620:83::/48", "5787"}, - {"2804:2490::/32", "264230"}, - {"2804:4ef8:7001::/32", "268295"}, - {"2a02:2698:5400::/44", "41843"}, - {"2a02:26f7:cdc8::/48", "36183"}, - {"2409:8e80:9000::/34", "56040"}, - {"2620:67::/48", "22303"}, - {"2a02:2818:7::/48", "197481"}, - {"2a0f:9885::/30", "208861"}, - {"2001:559:5ce::/48", "33287"}, - {"2001:48c8::/45", "29791"}, - {"2401:d800:dfc0::/42", "7552"}, - {"2409:8055:51::/46", "56040"}, - {"2600:80a:423::/41", "701"}, - {"2a02:26f7:e5c8::/48", "36183"}, - {"2a02:6ea0:e600::/36", "60068"}, - {"2a0b:9fc0:1::/64", "13094"}, - {"2001:df4:2d00::/48", "135905"}, - {"2404:df40::/32", "24249"}, - {"240a:14:e90::/44", "9605"}, - {"2607:f428:9300::/44", "19115"}, - {"2800:160:1718::/42", "14259"}, - {"2a02:2698:2800::/38", "41668"}, - {"2001:1248:571d::/46", "11172"}, - {"240a:aa8c::/32", "145350"}, - {"2620:171:17::/44", "42"}, - {"2806:2f0:2441::/48", "22884"}, - {"2a01:668::/32", "13105"}, - {"2a07:3c80:200::/40", "209322"}, - {"2a07:a880:4701::/48", "3399"}, - {"2a09:580::/29", "209715"}, - {"2804:548:200::/32", "53005"}, - {"2804:5db4::/32", "268987"}, - {"2804:6c50::/32", "270459"}, - {"2a01:110:e051::/35", "6584"}, - {"2001:559:4a7::/48", "33660"}, - {"2001:67c:8c::/48", "39686"}, - {"2401:4900:4d00::/44", "45609"}, - {"2a02:27b8:4000::/48", "49278"}, - {"2a0a:54c1:31::/41", "62240"}, - {"2001:559:c414::/48", "7015"}, - {"2408:8247::/35", "140726"}, - {"240a:afdf::/32", "146713"}, - {"2803:4e0::/32", "262213"}, - {"2804:47c::/32", "262437"}, - {"2a00:4802:1000::/44", "13124"}, - {"2001:559:8080::/48", "7922"}, - {"2804:7f7::/35", "10429"}, - {"2806:230:102f::/48", "11888"}, - {"2606:2800:4065::/48", "15133"}, - {"2a0e:b107:12f2::/48", "211722"}, - {"2a10:4480::/29", "399975"}, - {"240e:67f:c200::/39", "140329"}, - {"2600:6c10:641::/46", "20115"}, - {"2607:f8f0:600::/48", "271"}, - {"2804:5c88:1d00::/32", "268914"}, - {"2001:480:241::/43", "668"}, - {"2001:559:8736::/47", "7015"}, - {"2604:5e80:21::/32", "8"}, - {"2a01:7c60::/32", "201198"}, - {"2001:559:c0b0::/45", "7922"}, - {"2804:d3c:8001::/39", "52613"}, - {"2a0e:3a80::/32", "47454"}, - {"2409:874c::/32", "9808"}, - {"2409:8924:8500::/38", "56046"}, - {"240e:925::/36", "132147"}, - {"2400:54a0:1020::/48", "34927"}, - {"2a04:16c0:201::/29", "48921"}, - {"2607:700::/37", "22343"}, - {"2620:138:b000::/40", "16740"}, - {"2806:2f0:4521::/46", "17072"}, - {"2a09:11c0:332::/44", "211352"}, - {"2001:559:10d::/46", "7922"}, - {"2404:f300:12::/32", "56258"}, - {"2607:6700::/32", "40464"}, - {"2804:6464::/32", "262725"}, - {"2001:df0:be::/48", "7467"}, - {"240a:a86e::/32", "144808"}, - {"240a:ac17::/32", "145745"}, - {"2804:6ee0::/32", "270624"}, - {"2a00:eb0:100::/48", "61201"}, - {"2a02:b8:234::/32", "25273"}, - {"2a02:26f7:ba04::/48", "36183"}, - {"2a0c:9a40:101a::/47", "202479"}, - {"2a0e:b107:17c0::/44", "210537"}, - {"2001:67c:2f48::/48", "51273"}, - {"2400:7400:61::/48", "23736"}, - {"2407:fb40::/32", "132767"}, - {"2408:8956:8600::/40", "17622"}, - {"2605:2b40:4000::/34", "394851"}, - {"2804:6a04::/41", "270306"}, - {"2001:da8:ef00::/48", "138373"}, - {"2400:a980:2d00::/38", "133111"}, - {"2402:800:3371::/44", "7552"}, - {"2406:4ac0::/32", "55891"}, - {"2001:559:3a6::/48", "7015"}, - {"2409:8907:7320::/37", "24547"}, - {"240a:a905::/32", "144959"}, - {"2606:9b00::/32", "35894"}, - {"2620:1ec:34::/48", "8068"}, - {"2a00:4802:3020::/39", "8717"}, - {"2a09:7e40::/29", "35437"}, - {"2a09:dc04::/30", "35916"}, - {"2c0f:fac8::/32", "37395"}, - {"2001:b90::/32", "15919"}, - {"2607:ffd0:703::/48", "13767"}, - {"2803:bc40::/32", "52468"}, - {"2a10:eec0::/44", "7342"}, - {"2402:800:5871::/44", "7552"}, - {"2620:12f:c007::/44", "395831"}, - {"2804:4024:2030::/35", "265937"}, - {"2a01:18::/32", "29240"}, - {"2a0c:c647:fe05::/39", "50489"}, - {"2a0d:78c0::/29", "49191"}, - {"2001:559:c254::/48", "33662"}, - {"240e:67d:1000::/37", "140330"}, - {"2804:2634::/35", "264332"}, - {"2804:36d8::/32", "266376"}, - {"2a02:2090:e800::/48", "48287"}, - {"2a03:e581:4::/48", "201057"}, - {"2a09:7c43::/32", "48108"}, - {"2001:559:8398::/48", "7016"}, - {"2401:a840:400::/32", "136917"}, - {"2607:3380:1000::/40", "395152"}, - {"2001:1b28:405::/48", "51103"}, - {"2401:ee00:701::/36", "23951"}, - {"240a:a17d::/32", "143031"}, - {"2001:1260:240::/40", "28536"}, - {"2406:2b40::/32", "131937"}, - {"2408:864e::/27", "4837"}, - {"240e:44d:4d40::/42", "140357"}, - {"2a00:7820::/32", "34863"}, - {"2405:1c0:6471::/46", "55303"}, - {"2803:6900:506a::/48", "52423"}, - {"2804:5950::/32", "268182"}, - {"2804:705c::/32", "270722"}, - {"2a05:f140::/29", "200896"}, - {"2409:8b34:aa00::/33", "9808"}, - {"2a0a:48c0::/32", "39324"}, - {"2401:ed80::/32", "63932"}, - {"2804:580c::/32", "268103"}, - {"2804:5f44::/32", "269088"}, - {"2600:1406:d001::/37", "20940"}, - {"2605:e000:1c00::/32", "20001"}, - {"2804:7d20::/32", "271540"}, - {"2a02:26f7:b605::/46", "20940"}, - {"2a02:26f7:c68a::/48", "36183"}, - {"2a02:4540:9000::/43", "197207"}, - {"2a04:2080::/29", "34758"}, - {"2001:4408:5b00::/45", "55824"}, - {"2801:80:19f0::/48", "265392"}, - {"2803:6900:561::/48", "52423"}, - {"2a02:c0::/32", "39029"}, - {"2a03:2880:f26a::/45", "32934"}, - {"2001:c20:4896::/44", "3758"}, - {"240a:ace1::/32", "145947"}, - {"2600:3001:12::/42", "13649"}, - {"2804:46d4:2::/32", "267014"}, - {"2a0b:4340:a2::/44", "205532"}, - {"2001:67c:14c8::/47", "29478"}, - {"2001:480:331::/48", "2621"}, - {"2404:b980::/35", "62240"}, - {"2409:8924:4900::/38", "56046"}, - {"240e:967:ea00::/39", "133776"}, - {"2a03:1ac0:2e01::/40", "9049"}, - {"2a0c:8840:1000::/36", "211453"}, - {"2001:fd8:b300::/42", "132199"}, - {"240a:acba::/32", "145908"}, - {"2804:4a2c::/32", "267222"}, - {"2408:8356::/28", "17816"}, - {"2409:8014:100a::/45", "56044"}, - {"2409:8c71::/29", "9808"}, - {"240e:44d:4380::/41", "4134"}, - {"2610:b0:40dc::/47", "3573"}, - {"2804:6878::/32", "269694"}, - {"2001:559:814d::/48", "13367"}, - {"2402:800:bd50::/42", "7552"}, - {"2406:8600:efaf::/48", "45915"}, - {"2804:6568::/32", "269488"}, - {"2a02:26f7:46::/48", "36183"}, - {"2a0b:9580::/32", "199324"}, - {"2001:520:1055::/46", "8103"}, - {"2400:9380:8ec0::/44", "136167"}, - {"2406:3000::/46", "4657"}, - {"2408:8756:af6::/37", "136958"}, - {"2804:1660::/32", "52560"}, - {"2a00:e90::/32", "8400"}, - {"2a0b:e84::/30", "206537"}, - {"2804:4024::/34", "265937"}, - {"2a02:26f7:e301::/46", "20940"}, - {"2a02:e981:32::/44", "19551"}, - {"2a10:6880::/29", "204790"}, - {"2a11:bc40::/29", "211823"}, - {"2001:559:c0fc::/48", "7922"}, - {"2001:678:de4::/48", "57632"}, - {"240d:c010::/47", "132203"}, - {"2604:d600:b000::/33", "32098"}, - {"2a0b:180::/29", "43872"}, - {"2001:ee0:7ec0::/32", "45899"}, - {"2806:230:2040::/48", "265594"}, - {"2a02:26f7:dd84::/48", "36183"}, - {"2a09:1c00::/29", "209891"}, - {"2001:1248:5662::/45", "11172"}, - {"2401:d800:9df0::/38", "7552"}, - {"2602:ffa2::/36", "2386"}, - {"2001:559:349::/48", "33652"}, - {"2001:1a10:d00::/38", "8781"}, - {"2405:e440::/32", "132139"}, - {"2804:506c::/32", "268388"}, - {"2a0e:bac0::/29", "33770"}, - {"2408:8456:9040::/38", "17816"}, - {"2409:8c1f:27b0::/33", "9808"}, - {"240a:a477::/32", "143793"}, - {"2600:6c34:1e::/48", "33588"}, - {"2604:10c0::/47", "40034"}, - {"2804:154c:500f::/43", "263382"}, - {"2804:5714::/32", "268042"}, - {"2a02:26f7:e70c::/48", "36183"}, - {"2400:a980:40fc::/46", "38587"}, - {"2409:896a:1e00::/39", "9808"}, - {"2001:a10:186::/32", "8308"}, - {"2603:4:1000::/44", "44273"}, - {"2603:6033::/32", "10796"}, - {"2804:954:407::/38", "263073"}, - {"2804:1f1c::/32", "265235"}, - {"2804:2164::/32", "264552"}, - {"2804:2918::/32", "263997"}, - {"2a00:8740:600::/40", "211282"}, - {"2a09:bac0:108::/48", "395747"}, - {"2001:550:1:305::/39", "174"}, - {"2401:2700::/47", "9286"}, - {"2403:6a00::/32", "18239"}, - {"2405:c0:70::/48", "138881"}, - {"240a:acca::/32", "145924"}, - {"2607:fdf0:5eb6::/47", "8008"}, - {"2402:800:558d::/43", "7552"}, - {"2602:fc15::/44", "142632"}, - {"2605:c600::/32", "33097"}, - {"2a02:26f7:c3ca::/47", "20940"}, - {"2a0c:b540::/32", "62188"}, - {"2001:49d0:180::/42", "15116"}, - {"2600:c14::/32", "13790"}, - {"2607:fe28:5020::/45", "53347"}, - {"2a00:6901:e002::/47", "20926"}, - {"2a02:26f7:60::/48", "36183"}, - {"2c0f:ed68:ff02::/40", "328170"}, - {"2001:559:8538::/48", "33651"}, - {"2401:d800:f140::/42", "7552"}, - {"2605:2880::/48", "18907"}, - {"2a00:9f00::/44", "29314"}, - {"2a03:5a00:10::/48", "57489"}, - {"2a0f:93c1:1::/42", "62240"}, - {"2a10:21c0:4001::/48", "28885"}, - {"2a04:4e40:c400::/47", "54113"}, - {"2a0a:e5c0:23::/45", "209898"}, - {"2a0c:7000::/29", "57508"}, - {"2a0d:9f00::/32", "49821"}, - {"2a0e:7040::/29", "206766"}, - {"2600:140a:2001::/35", "20940"}, - {"2620:be:4000::/48", "394068"}, - {"2001:1250:ffc0::/44", "22894"}, - {"2001:4c08:200c::/43", "3356"}, - {"2404:fbc0::/48", "63734"}, - {"2604:69c0::/47", "18439"}, - {"2001:559:8200::/48", "33659"}, - {"2001:67c:134::/48", "12643"}, - {"2001:67c:1354::/48", "212469"}, - {"240a:ac21::/32", "145755"}, - {"2602:107:2510::/48", "20115"}, - {"2606:5780::/32", "54579"}, - {"2a02:ee80:4087::/43", "3573"}, - {"2400:8b00:1000::/44", "45727"}, - {"240e:fb:a000::/35", "136200"}, - {"2a02:26f7:1a::/48", "36183"}, - {"2001:df5:d680::/48", "141676"}, - {"240d:c010:54::/48", "139341"}, - {"2a02:26f7:f580::/48", "36183"}, - {"2a11:e580::/29", "204790"}, - {"2001:559:4fd::/48", "13367"}, - {"2409:1::/28", "55824"}, - {"240a:a8bb::/32", "144885"}, - {"2600:100d:fe00::/44", "6167"}, - {"2602:fd7d:500::/36", "16925"}, - {"2804:37c4:8400::/33", "266435"}, - {"2a00:c3a0::/32", "51349"}, - {"2a02:ee80:40d8::/39", "3573"}, - {"2407:6a00::/32", "18055"}, - {"2804:843c::/32", "272248"}, - {"2001:4458::/32", "4818"}, - {"2600:370f:7028::/43", "32261"}, - {"2804:4198::/32", "267443"}, - {"2a02:26f7:c385::/46", "20940"}, - {"2a0f:4f00::/29", "62412"}, - {"2001:1900:230f::/48", "10753"}, - {"2402:9500:8001::/33", "55720"}, - {"2600:1003:a000::/44", "6167"}, - {"2602:fc23:140::/44", "210631"}, - {"2a02:2e02:b10::/41", "12479"}, - {"2a0a:7d80:8::/48", "25106"}, - {"2001:678:3c8::/48", "34516"}, - {"2001:4268::/39", "15964"}, - {"2403:3200::/32", "18268"}, - {"2409:805c:3091::/42", "9808"}, - {"240a:a05b::/32", "142741"}, - {"2804:40:c000::/36", "28657"}, - {"2a02:2698:2000::/42", "51645"}, - {"2001:43f8:5::/48", "328325"}, - {"2400:adc0:c010::/47", "9541"}, - {"2402:800:581d::/42", "7552"}, - {"2602:fc46::/36", "400005"}, - {"2602:fc5d:252::/48", "399866"}, - {"2a03:2880:f122::/43", "32934"}, - {"2001:1248:8724::/43", "11172"}, - {"2404:1b00::/32", "55912"}, - {"240e:848:80::/43", "140553"}, - {"2620:10a:8023::/48", "27299"}, - {"2804:585c::/32", "268124"}, - {"2a02:26f7:cbc5::/46", "20940"}, - {"2001:559:ea::/45", "20214"}, - {"2001:559:c4df::/48", "33491"}, - {"2804:18d8::/32", "61583"}, - {"2a0a:3507::/48", "57327"}, - {"2a06:45c0::/32", "200425"}, - {"2001:559:86c2::/48", "7015"}, - {"2402:800:998d::/43", "7552"}, - {"2600:140f:2601::/39", "20940"}, - {"2620:f:a::/48", "3629"}, - {"2804:11b4::/32", "263433"}, - {"2a0f:e280::/29", "50629"}, - {"2404:d200::/32", "17766"}, - {"2a0f:2100:171::/48", "62240"}, - {"2001:410:2002::/40", "10965"}, - {"2001:df7:f280::/48", "138277"}, - {"2604:c180::/32", "32882"}, - {"2804:5cc4::/32", "268929"}, - {"2806:320::/39", "28438"}, - {"2400:1c00:13::/48", "3758"}, - {"2a0d:2406:d00::/44", "202418"}, - {"2a0e:aac4::/32", "212675"}, - {"2a10:2f01:360::/44", "56894"}, - {"2a10:3bc0::/29", "204790"}, - {"2001:559:8554::/48", "7016"}, - {"2401:3bc0:701::/36", "137409"}, - {"2606:9500::/39", "19893"}, - {"2804:4d3c:a38::/41", "267420"}, - {"2620:2d:4005::/46", "41231"}, - {"2804:1868::/32", "61930"}, - {"2a02:6b8:82::/29", "208722"}, - {"2a03:3c00::/32", "20847"}, - {"2001:3e0::/34", "10013"}, - {"2001:da8:3012::/42", "24358"}, - {"240a:aa11::/32", "145227"}, - {"240a:ada4::/32", "146142"}, - {"2800:2e0::/32", "11081"}, - {"2801:c4:13::/48", "265533"}, - {"2804:874:8000::/33", "262373"}, - {"2804:5d14::/38", "268949"}, - {"2a05:dfc7:dfc7::/44", "204136"}, - {"2a0e:46c4:10a::/48", "142635"}, - {"2001:253:13a::/45", "38272"}, - {"2001:1388:8a46::/48", "264684"}, - {"240a:af26::/32", "146528"}, - {"2a0c:1a40:1::/48", "48362"}, - {"2a0d:5600:60::/48", "9009"}, - {"2001:569::/44", "852"}, - {"2a01:1c8::/32", "15699"}, - {"2405:7f00:a1a0::/38", "133414"}, - {"2801:1e:3000::/48", "267893"}, - {"2804:6808:2000::/32", "269666"}, - {"2602:fbec::/36", "211535"}, - {"2607:f428:91d0::/44", "20115"}, - {"2a02:2110::/32", "57910"}, - {"2402:800:5471::/44", "7552"}, - {"2406:e500::/47", "58593"}, - {"2804:62f0:c102::/35", "269329"}, - {"2a00:a680::/32", "61174"}, - {"2001:559:3d5::/48", "33651"}, - {"2600:1409:7801::/32", "20940"}, - {"2800:600::/39", "52323"}, - {"2a0e:f200:174::/48", "30633"}, - {"2001:df2:d900::/48", "18403"}, - {"2405:12c0::/32", "135775"}, - {"2001:f40:12::/32", "9930"}, - {"2400:d580:a0::/47", "131587"}, - {"2604:81c0:3d5c::/48", "396422"}, - {"2c0f:eef0:27::/48", "15695"}, - {"2001:df3:802::/47", "22787"}, - {"2401:ee00:e1::/39", "23951"}, - {"240a:a992::/32", "145100"}, - {"240e:45c:aa00::/35", "131285"}, - {"2600:1409:6801::/37", "20940"}, - {"2606:5b80:2157::/32", "22612"}, - {"2a02:26f7:efc0::/48", "36183"}, - {"2a0c:f47::/32", "49436"}, - {"2a0c:2140::/29", "31617"}, - {"2001:250:7011::/46", "24369"}, - {"2001:67c:1818::/48", "3303"}, - {"2401:4900:5c70::/44", "45609"}, - {"2604:6d00:2400::/48", "36223"}, - {"2804:68c4:e000::/36", "269714"}, - {"2001:678:f20::/48", "211551"}, - {"2001:1320::/32", "27733"}, - {"240e:b58::/24", "4134"}, - {"2001:500:3e5::/48", "26134"}, - {"2001:559:c39f::/48", "33651"}, - {"2001:678:d5c::/48", "12552"}, - {"2804:46f0:c1::/32", "267021"}, - {"2401:4900:4c10::/44", "45609"}, - {"240a:ae5d::/32", "146327"}, - {"2604:f980:4360::/44", "19957"}, - {"2800:160:18d4::/44", "14259"}, - {"2a04:cec0::/35", "5410"}, - {"2a05:e186::/31", "200941"}, - {"2a0f:5b80::/29", "204790"}, - {"2a10:13c0:da7a::/48", "212238"}, - {"240e:45c:8600::/35", "131285"}, - {"2806:31d::/32", "18734"}, - {"2a0b:d0c0::/29", "51178"}, - {"2001:1248:9f00::/42", "11172"}, - {"2404:ccc0::/32", "139021"}, - {"240e:438:2e20::/43", "140647"}, - {"2800:bf0:80c6::/48", "27947"}, - {"2804:1f32::/32", "265994"}, - {"2001:df0:5080::/48", "136379"}, - {"2604:3d09:f000::/29", "6327"}, - {"2a0e:46c4:107::/48", "142419"}, - {"2001:67c:29a8::/48", "42168"}, - {"2001:1248:593f::/41", "11172"}, - {"240a:a864::/32", "144798"}, - {"240a:ab76::/32", "145584"}, - {"240a:ad61::/32", "146075"}, - {"2001:559:374::/47", "7015"}, - {"2001:fd8:b330::/44", "4775"}, - {"2409:8907:7820::/39", "24547"}, - {"240a:ab08::/32", "145474"}, - {"240a:ac13::/32", "145741"}, - {"240e:6b9:1000::/36", "4134"}, - {"2607:f3a0:a006::/48", "399814"}, - {"2804:14d:cc00::/40", "28573"}, - {"2a02:26f7:cd49::/46", "20940"}, - {"2a02:26f7:db49::/42", "20940"}, - {"2408:8310::/30", "4837"}, - {"2408:8456:1900::/42", "17622"}, - {"240a:aae9::/32", "145443"}, - {"2803:8920:7000::/32", "266673"}, - {"2a00:9ce0::/32", "44891"}, - {"2001:67c:2968::/48", "33907"}, - {"2001:e60:d3a0::/45", "4766"}, - {"240e:979:6e00::/40", "134770"}, - {"2806:230:302a::/48", "265594"}, - {"2a02:3d8::/32", "39093"}, - {"2001:470:f6::/48", "13925"}, - {"2001:559:80f3::/45", "22909"}, - {"2001:4138::/31", "15533"}, - {"2404:3d00:4136::/47", "21433"}, - {"2406:daa0:2040::/44", "16509"}, - {"2409:801e:3003::/45", "24400"}, - {"2620:107:9064::/48", "18747"}, - {"2804:5388::/32", "268590"}, - {"2a01:4180::/33", "200517"}, - {"2a02:26f0:b201::/37", "20940"}, - {"2a07:36c0::/29", "57795"}, - {"2a01:e8::/32", "25473"}, - {"2404:a00::/32", "18121"}, - {"240a:acd7::/32", "145937"}, - {"2600:1403:6c01::/32", "20940"}, - {"2620:171:a00::/44", "42"}, - {"2604:d600:45::/37", "32098"}, - {"2a0c:d540:1111::/48", "210896"}, - {"2a0c:e644::/31", "38136"}, - {"2001:559:405::/48", "7016"}, - {"2404:1b8::/32", "9794"}, - {"2600:1417:4c::/47", "24319"}, - {"2a00:a080::/32", "15557"}, - {"2a01:a200::/32", "41811"}, - {"2a02:26f7:e94d::/42", "20940"}, - {"2001:250:84f::/43", "138182"}, - {"2001:57a:510::/36", "22773"}, - {"2001:e60:a408::/42", "4766"}, - {"2400:fc00::/42", "45773"}, - {"2405:2900::/36", "132198"}, - {"2405:f080:1602::/48", "136907"}, - {"2407:3000:7::/41", "17707"}, - {"2001:253:128::/48", "142094"}, - {"2001:4d80::/33", "5606"}, - {"2804:6fc:cfff::/34", "28158"}, - {"2409:801f:3009::/45", "9808"}, - {"2600:1403:6401::/36", "20940"}, - {"2603:4:1500::/48", "44273"}, - {"2620:119:5015::/44", "13443"}, - {"240a:abdd::/32", "145687"}, - {"2606:5000:5e00::/32", "209"}, - {"2a01:c50f:9dc0::/38", "12479"}, - {"2401:8a40:1::/46", "45326"}, - {"2a02:6c20:8::/36", "207167"}, - {"2001:67c:5d4::/48", "8422"}, - {"2604:2e8b:e000::/35", "30036"}, - {"2804:2250:7040::/32", "262756"}, - {"2a01:280:310::/48", "1257"}, - {"2a02:26f7:92::/48", "36183"}, - {"2403:f500::/34", "10103"}, - {"2406:e001:5800::/34", "23655"}, - {"2409:8c04:110e::/43", "24547"}, - {"240e:5:2000::/35", "58542"}, - {"2602:fdc7::/36", "397636"}, - {"2800:200:b450::/40", "12252"}, - {"2804:38c4::/32", "266500"}, - {"2a01:678::/29", "29608"}, - {"2a02:b60:4000::/45", "44217"}, - {"2a02:26f7:b3::/48", "20940"}, - {"2a0e:4d80::/29", "208882"}, - {"2a0e:d640::/29", "208372"}, - {"2001:559:8378::/48", "33652"}, - {"2001:678:334::/48", "48031"}, - {"2402:b80::/32", "134001"}, - {"2408:8459:c910::/42", "17623"}, - {"2600:140f:1a01::/39", "20940"}, - {"2a0b:ec00::/29", "34373"}, - {"2a0e:7340::/29", "60843"}, - {"2a10:1b80::/32", "8896"}, - {"2a11:580::/29", "62206"}, - {"2400:5200:c00::/40", "55410"}, - {"2600:370f:73a3::/45", "32261"}, - {"2607:f8f0:614::/48", "393249"}, - {"2606:f900:9e01::/34", "812"}, - {"2607:f140:a000::/48", "393282"}, - {"2a00:a160::/32", "60592"}, - {"2a0c:e300::/30", "198985"}, - {"2a0f:ca87:6::/48", "208421"}, - {"2620:1f7:2800::/37", "2686"}, - {"2804:5774::/32", "268066"}, - {"2a00:7420::/33", "60893"}, - {"2a04:4e40:7600::/48", "54113"}, - {"2a07:9380::/32", "50840"}, - {"2001:18c8:800::/40", "54111"}, - {"2001:40f0::/32", "15997"}, - {"2402:800:5555::/42", "7552"}, - {"2600:370f:7565::/40", "32261"}, - {"2803:1a00::/37", "262186"}, - {"2804:7f50::/32", "271680"}, - {"2a0d:2904::/44", "205651"}, - {"2001:67c:3dc::/48", "207696"}, - {"2001:df4:d000::/48", "59216"}, - {"2408:84f3:3050::/44", "17816"}, - {"240e:44d:7b40::/42", "140355"}, - {"2607:fee8::/32", "7078"}, - {"2620:62:4000::/46", "30045"}, - {"2001:1998:650::/40", "7843"}, - {"2408:8456:ea40::/39", "17816"}, - {"2a00:dd8:1::/48", "15994"}, - {"2001:678:9c8::/48", "56796"}, - {"2001:da8:245::/48", "23910"}, - {"2804:5154:a0::/39", "268445"}, - {"2804:5470::/32", "268650"}, - {"2a02:26f0:5901::/37", "20940"}, - {"2a12:fc00::/29", "204790"}, - {"2001:4060:4053::/32", "6772"}, - {"2001:b000:590::/47", "131660"}, - {"2408:8456:9e10::/42", "134543"}, - {"2600:c0d::/32", "14742"}, - {"2a0a:340:aa00::/40", "48043"}, - {"240e:958:2000::/40", "140527"}, - {"2804:2248::/32", "264602"}, - {"2a0c:9a40:8090::/44", "20473"}, - {"2001:1490:2::/40", "8895"}, - {"2400:51a0:e080::/44", "211946"}, - {"2404:8c80::/32", "55933"}, - {"2804:5ad4::/32", "268799"}, - {"2001:808:e000::/31", "8364"}, - {"2401:bbc0::/32", "133527"}, - {"2600:1408:9c01::/48", "20940"}, - {"2a02:ee80:4250::/47", "21433"}, - {"2607:9b80:820::/40", "46558"}, - {"2804:b0c:e001::/35", "52935"}, - {"2804:28d4::/32", "263983"}, - {"2a02:88d:8130::/44", "48695"}, - {"2001:559:85d6::/48", "33661"}, - {"2001:da8:203::/48", "24351"}, - {"2001:559:c4f6::/44", "7922"}, - {"2001:4b38::/32", "25220"}, - {"2a05:4f40::/30", "29485"}, - {"2001:1248:a469::/45", "11172"}, - {"2a01:5ec0:7000::/36", "44244"}, - {"2600:1416:1001::/36", "20940"}, - {"2603:c002:1910::/38", "31898"}, - {"2804:13d8:100::/32", "262669"}, - {"2a06:5fc0::/29", "212144"}, - {"2c0f:f5c0:391::/37", "29465"}, - {"2001:678:230::/48", "1102"}, - {"2400:5280::/35", "63199"}, - {"2401:d800:ff10::/42", "7552"}, - {"2409:4053:3000::/29", "55836"}, - {"2600:1407:800::/48", "18717"}, - {"2803:6700:40::/48", "263210"}, - {"2600:140b:1e01::/34", "20940"}, - {"2603:c002:9d10::/40", "31898"}, - {"2804:2a68::/32", "262435"}, - {"2804:55d8::/32", "267960"}, - {"2a09:a441::/32", "205479"}, - {"2402:3a80:1710::/46", "38266"}, - {"2408:8459:7250::/37", "17816"}, - {"2409:8c20:a18::/37", "56046"}, - {"240a:a28f::/32", "143305"}, - {"240a:aefd::/32", "146487"}, - {"2620:0:190::/48", "33084"}, - {"2a07:1400::/29", "24853"}, - {"2403:4900:1::/48", "131188"}, - {"2806:230:2042::/48", "265594"}, - {"2c0f:fb50::/32", "15169"}, - {"2001:1248:a454::/44", "11172"}, - {"240e:981:f300::/36", "4134"}, - {"2806:2f0:4621::/46", "17072"}, - {"2a01:5d40::/32", "24945"}, - {"2402:ee80:58::/47", "132647"}, - {"2409:8703::/32", "9808"}, - {"2620:171:db::/48", "715"}, - {"2804:5004::/32", "268364"}, - {"2a01:270:f000::/36", "41075"}, - {"2a02:d5c0::/29", "49565"}, - {"2409:8904:5b40::/42", "24547"}, - {"2a00:4802:d00::/44", "13124"}, - {"2001:4d68::/32", "25441"}, - {"240e:44d:2300::/42", "140345"}, - {"2604:8480::/32", "54945"}, - {"2806:370:7240::/40", "28403"}, - {"2a02:9b0:4023::/43", "35819"}, - {"2001:559:536::/48", "33660"}, - {"2001:67c:2c4c::/48", "1257"}, - {"2401:d800:7b70::/40", "7552"}, - {"2001:559:bd::/46", "33491"}, - {"2001:559:3d0::/48", "33489"}, - {"2804:6704::/32", "269598"}, - {"2001:559:c21a::/47", "33659"}, - {"2402:800:99ee::/38", "7552"}, - {"2001:da8:ca::/48", "138182"}, - {"2001:4878:8141::/48", "12222"}, - {"2400:1920::/32", "146974"}, - {"2804:3174:8000::/36", "265016"}, - {"2a03:2040::/29", "198385"}, - {"2a0b:51c0::/29", "205679"}, - {"2001:1248:97c5::/44", "11172"}, - {"2401:cf80::/33", "55303"}, - {"2a0f:6f00::/29", "208861"}, - {"2001:559:2d3::/48", "33659"}, - {"240a:a460::/32", "143770"}, - {"2409:8080:381f::/42", "9808"}, - {"240a:a1d9::/32", "143123"}, - {"2604:d600:33::/41", "32098"}, - {"2804:1be0::/32", "61754"}, - {"2804:63fc::/32", "269396"}, - {"2a09:d2c2:1::/48", "213064"}, - {"2001:67c:1324::/48", "43384"}, - {"240a:adb9::/32", "146163"}, - {"2600:1700::/28", "7018"}, - {"2800:1e0:1600::/44", "7195"}, - {"2804:22e8::/32", "264130"}, - {"2a02:26f7:b884::/48", "36183"}, - {"2a0d:1a45:babf::/37", "57782"}, - {"2001:559:c3a4::/47", "33651"}, - {"2408:8456:6800::/42", "17622"}, - {"2a02:26f7:bfc9::/46", "20940"}, - {"2a03:5800::/32", "31214"}, - {"2a05:5a42::/32", "8943"}, - {"2001:1470::/29", "2107"}, - {"2804:5844::/32", "268117"}, - {"2a02:7cc0::/48", "35000"}, - {"2a04:2b00:13ff::/48", "201303"}, - {"2a05:d050:e0c0::/44", "16509"}, - {"2001:559:8721::/48", "33650"}, - {"2001:67c:50c::/48", "15486"}, - {"2001:67c:194c::/48", "62434"}, - {"2803:b2a0::/32", "3549"}, - {"2806:2f0:9a03::/39", "17072"}, - {"2a02:29b0::/32", "16298"}, - {"2001:559:8396::/48", "33659"}, - {"2001:559:c03b::/45", "20214"}, - {"2602:feda:c52::/44", "212425"}, - {"2605:a404:3f::/41", "33363"}, - {"2803:7180:4000::/36", "21575"}, - {"2804:68::/32", "53070"}, - {"2001:f60::/27", "2519"}, - {"2602:fbd0:10::/47", "16509"}, - {"2804:4d6c::/32", "268195"}, - {"2a0b:af80::/29", "206310"}, - {"2001:559:262::/48", "33651"}, - {"2001:df7:4480::/48", "142529"}, - {"240e:108:13b0::/41", "4134"}, - {"2804:421c::/32", "267478"}, - {"2a06:a005:2c0::/44", "211139"}, - {"2a0f:6dc0::/29", "200567"}, - {"240a:ad81::/32", "146107"}, - {"2a03:5640:f041::/48", "2906"}, - {"2001:df5:bb00::/48", "131375"}, - {"2607:6003:2305::/48", "11572"}, - {"2a0a:8c41::/29", "204957"}, - {"2001:250:c31::/48", "138374"}, - {"2402:e280:2225::/46", "134674"}, - {"2a03:4740::/32", "50737"}, - {"2001:df5:9480::/48", "136360"}, - {"2405:58c0:5c00::/40", "133101"}, - {"2607:6880::/32", "11554"}, - {"2804:432c::/32", "267553"}, - {"2a10:4941:10::/44", "200964"}, - {"240a:ad7f::/32", "146105"}, - {"2604:8800::/32", "23028"}, - {"2803:3960::/32", "262186"}, - {"2806:230:5005::/48", "11888"}, - {"2401:1c40::/48", "135915"}, - {"2606:4700:301d::/42", "13335"}, - {"2800:be0:4e3::/32", "267848"}, - {"2800:bf0:2a00::/45", "52257"}, - {"2804:52f8:200::/40", "268554"}, - {"2001:579:c0c4::/43", "22773"}, - {"2405:1000::/32", "45671"}, - {"2803:da20::/40", "27951"}, - {"2804:dac::/32", "28181"}, - {"2804:46b8::/32", "267007"}, - {"2804:493c::/32", "267172"}, - {"2804:3f54::/32", "53185"}, - {"2001:1248:8453::/44", "11172"}, - {"2402:800:310f::/43", "7552"}, - {"2406:21c0::/32", "140429"}, - {"2602:fbd3::/48", "16509"}, - {"2a0c:c380::/32", "207242"}, - {"2a0e:4540:cafe::/48", "58247"}, - {"240a:a838::/32", "144754"}, - {"2804:14d:5c96::/44", "28573"}, - {"2a04:4e40:5e10::/44", "54113"}, - {"2402:800:b190::/42", "7552"}, - {"2405:4803:cf0::/39", "18403"}, - {"2602:fc01::/36", "210902"}, - {"2803:4f20::/32", "266768"}, - {"2405:6e00:688::/45", "18291"}, - {"240a:abe0::/32", "145690"}, - {"2600:140f:5000::/48", "9498"}, - {"2603:c025::/35", "31898"}, - {"2804:679c::/32", "269639"}, - {"2001:578:121::/43", "22773"}, - {"2001:fd8:a1::/46", "4775"}, - {"2806:2f0:94a3::/43", "17072"}, - {"2a02:26f7:d190::/48", "36183"}, - {"2001:57a:8013::/44", "22773"}, - {"2406:9b00::/32", "56264"}, - {"2800:bf0:b424::/48", "27947"}, - {"2804:30c:200::/35", "28343"}, - {"2001:468:2640::/48", "396955"}, - {"2001:550:7601:1::/39", "174"}, - {"2001:ec0:8a6::/41", "23969"}, - {"2001:1b70:4296::/48", "395592"}, - {"2602:ffc8:3d20::/32", "20278"}, - {"2803:e520::/32", "266687"}, - {"2a0f:9b40::/29", "212144"}, - {"2001:550:6701::/36", "174"}, - {"2a00:1280:8004::/33", "39591"}, - {"2a02:26f7:c3d8::/48", "36183"}, - {"2404:4980::/32", "132770"}, - {"2406:e1c0:301::/37", "141459"}, - {"2a0a:340:be00::/40", "48043"}, - {"2001:df1:6e80::/48", "174"}, - {"2400:cb00:a590::/45", "13335"}, - {"2600:d0b:c000::/29", "20161"}, - {"2800:160:196c::/46", "14259"}, - {"2a05:b080::/29", "198024"}, - {"2001:678:fd4::/48", "56951"}, - {"2404:bf40:f802::/48", "139084"}, - {"240e:108:1168::/45", "4134"}, - {"240e:250:1400::/38", "134419"}, - {"2620:c::/44", "7324"}, - {"2804:1b3:c000::/34", "18881"}, - {"2804:4f48::/32", "268317"}, - {"240a:a979::/32", "145075"}, - {"2620:119:4000::/43", "7726"}, - {"2a01:7f80::/32", "15975"}, - {"2001:df7:3b80::/48", "142627"}, - {"2408:80f1:220::/44", "138421"}, - {"240e:946:3001::/45", "58540"}, - {"2607:f110:32::/45", "21889"}, - {"2a00:15e0::/29", "15960"}, - {"2a0a:c440::/29", "205935"}, - {"2a0f:e940::/29", "60781"}, - {"2001:250:7014::/46", "24369"}, - {"2406:e4c0::/48", "140766"}, - {"2804:47d8::/32", "267080"}, - {"2a07:1980:4::/46", "48851"}, - {"240e:3b0:2200::/37", "136198"}, - {"2602:feda:bb0::/44", "140938"}, - {"2804:14d:5e00::/40", "28573"}, - {"2a01:8200::/32", "31216"}, - {"2403:4040::/32", "131937"}, - {"2804:2764::/32", "263898"}, - {"2001:559:8086::/48", "33657"}, - {"2406:eb00:208::/47", "132653"}, - {"2607:fe28:2::/44", "53347"}, - {"2620:32:8000::/48", "1742"}, - {"2a0c:e640:102d::/46", "210951"}, - {"2001:559:5e0::/48", "33287"}, - {"240a:a287::/32", "143297"}, - {"240a:abb7::/32", "145649"}, - {"2607:f9a8::/32", "2685"}, - {"2804:67d4::/32", "269653"}, - {"2a02:26f0:6d01::/35", "20940"}, - {"2a02:26f7:c089::/46", "20940"}, - {"2400:a980:6000::/40", "133512"}, - {"2402:800:520f::/43", "7552"}, - {"240a:a573::/32", "144045"}, - {"2602:ff75:1000::/36", "22653"}, - {"2a10:f840::/29", "52031"}, - {"2401:d800:5732::/40", "7552"}, - {"2600:380:a080::/39", "20057"}, - {"2602:feb4:1e0::/44", "25961"}, - {"2602:feda:c51::/48", "212279"}, - {"2803:6604:a401::/39", "28075"}, - {"2a0e:aa01:1fff::/48", "139589"}, - {"240a:a7be::/32", "144632"}, - {"2604:e840:a::/43", "396965"}, - {"2a02:cc8::/31", "60781"}, - {"2001:678:e8::/48", "41088"}, - {"2402:3a80:1364::/47", "38266"}, - {"2a02:26f7:e305::/46", "20940"}, - {"2804:43e0::/32", "267596"}, - {"2001:559:14f::/48", "33287"}, - {"240a:ac44::/32", "145790"}, - {"2c0f:f708::/32", "327693"}, - {"2001:6d0:ffb8::/48", "3316"}, - {"2604:2ec0::/32", "13984"}, - {"2804:6100::/32", "269205"}, - {"2a0e:b107:8e0::/44", "213372"}, - {"2001:44b8:105f::/48", "4739"}, - {"2401:d800:da80::/41", "7552"}, - {"2001:559:2de::/48", "33660"}, - {"2001:559:c3cb::/45", "7015"}, - {"2001:678:f70::/48", "213027"}, - {"2001:67c:18b0::/48", "35684"}, - {"2406:d740::/46", "141449"}, - {"2604:480::/32", "40098"}, - {"2804:1764::/32", "263143"}, - {"2a03:5240::/32", "199599"}, - {"2001:df0:e480::/47", "7545"}, - {"240a:a09f::/32", "142809"}, - {"2606:82c0:21::/45", "32167"}, - {"2a0d:8cc0::/29", "43350"}, - {"2001:559:838f::/48", "33490"}, - {"240a:aca8::/32", "145890"}, - {"2800:160:28b5::/41", "14259"}, - {"2804:18f4::/32", "61765"}, - {"2a0a:6780::/29", "206377"}, - {"2001:ee0:cb40::/37", "45899"}, - {"2402:800:7352::/40", "7552"}, - {"2620:12d:e0a0::/44", "394027"}, - {"2803:f1a0::/32", "267705"}, - {"2a00:e20::/39", "25048"}, - {"2a00:79e1:380::/48", "395973"}, - {"2a02:26f0:b000::/48", "34164"}, - {"2001:559:13b::/48", "397601"}, - {"2001:fd8:2a8::/41", "4775"}, - {"2001:4210:290a::/35", "25818"}, - {"2800:370:10::/48", "28006"}, - {"2803:48e0:2::/32", "52468"}, - {"2804:78ac::/32", "271258"}, - {"2001:648:22b1::/41", "5408"}, - {"2402:fa00::/33", "55359"}, - {"2404:3e00:a700::/33", "38758"}, - {"2600:6c2e:d0e::/38", "20115"}, - {"2607:f110:e320::/41", "21889"}, - {"2804:1e48::/32", "4809"}, - {"2620:123:2000::/48", "30103"}, - {"2a00:11c0:aa1::/48", "42388"}, - {"2a02:4460::/32", "202032"}, - {"2a04:4e40:ae00::/48", "54113"}, - {"2a04:4e40:ba00::/48", "54113"}, - {"2a00:6700:1::/48", "202784"}, - {"2607:f978:7::/48", "32475"}, - {"2620:107:9042::/48", "22787"}, - {"2804:4b08::/32", "267279"}, - {"2804:7178::/32", "270791"}, - {"2a0b:8900::/32", "21214"}, - {"2402:2500::/45", "13445"}, - {"2600:6c10:413::/45", "20115"}, - {"2803:5c80:6001::/48", "64114"}, - {"2804:5ca0::/32", "268920"}, - {"2804:628c:4000::/42", "269303"}, - {"2a02:26f7:c088::/48", "36183"}, - {"2a0c:9a40:8116::/47", "204438"}, - {"2001:559:847b::/48", "33650"}, - {"2001:4210:6b00::/32", "25818"}, - {"2001:4878:321::/45", "12222"}, - {"2404:e100:3002::/47", "55685"}, - {"2620:83:a000::/48", "394191"}, - {"2001:57a:8038::/41", "22773"}, - {"2404:3200::/32", "17509"}, - {"2405:1c0:61db::/48", "55303"}, - {"2804:4d0c::/32", "267409"}, - {"2a07:2180::/32", "48579"}, - {"2a05:f6c0::/29", "203953"}, - {"2001:250:3434::/44", "138393"}, - {"240e:6:d140::/40", "4134"}, - {"2803:9800:a507::/36", "11664"}, - {"2803:ac10::/32", "271876"}, - {"2804:75b0:8000::/33", "271063"}, - {"2a01:3a8::/32", "20507"}, - {"2a02:26f7:fb09::/42", "20940"}, - {"2a04:bc40:3dc0::/44", "44750"}, - {"2a07:2500::/29", "48374"}, - {"2001:67c:2480::/48", "212966"}, - {"240a:a058::/32", "142738"}, - {"2806:2f0:45c3::/42", "17072"}, - {"2a0b:b84::/31", "7489"}, - {"2404:c000:8000::/46", "17727"}, - {"240a:ac2f::/32", "145769"}, - {"2604:3fc0:2000::/35", "396300"}, - {"2001:559:807a::/47", "33651"}, - {"2405:a400::/32", "38793"}, - {"2408:84f3:3660::/40", "17623"}, - {"2409:804d:2100::/35", "9808"}, - {"2600:3000:5100::/40", "13845"}, - {"2600:370f:73b0::/41", "32261"}, - {"2600:9000:a120::/41", "16509"}, - {"2607:f770:fffc::/46", "22958"}, - {"2a01:5043:e::/48", "202196"}, - {"2a03:d480::/32", "42455"}, - {"2001:559:476::/48", "7922"}, - {"2001:16d8:a0a3::/36", "16150"}, - {"2600:4402:2019::/32", "6130"}, - {"2804:2ca4::/33", "265232"}, - {"2001:559:21a::/48", "33651"}, - {"240a:a86f::/32", "144809"}, - {"2806:230:100b::/48", "11888"}, - {"2a04:4e40:f010::/42", "54113"}, - {"2409:8535::/22", "9808"}, - {"2620:11:40::/45", "3486"}, - {"2001:559:85cc::/48", "7922"}, - {"2400:6280:10d::/48", "132280"}, - {"2408:8956:7400::/40", "17622"}, - {"2607:1000::/32", "30263"}, - {"2607:f380:805::/48", "2152"}, - {"2804:9f8::/33", "262773"}, - {"2a00:1a28::/40", "42708"}, - {"2001:4b98:abcb::/48", "209453"}, - {"2408:8956:6f00::/40", "17816"}, - {"2409:8c28:c06::/39", "56041"}, - {"2602:fd0a::/36", "63027"}, - {"2803:c180:2010::/39", "52341"}, - {"2001:4c8:8000::/33", "6461"}, - {"2c0f:ef78:d::/46", "63293"}, - {"2401:7400:2ff::/36", "4773"}, - {"2620:104:4008::/48", "15248"}, - {"2804:3cac::/32", "266228"}, - {"2a02:2170::/32", "41480"}, - {"2a0f:85c0::/48", "207841"}, - {"2001:470:50::/48", "36791"}, - {"2406:20c0:6001::/32", "140423"}, - {"2408:843c:2600::/30", "4837"}, - {"2804:1ccc::/32", "61676"}, - {"2a00:8080::/32", "43366"}, - {"2a01:a500:2::/34", "42831"}, - {"2402:db40:2::/33", "131486"}, - {"2604:c8c0::/36", "396045"}, - {"2404:4a00:1001::/34", "45629"}, - {"2404:4e00:8000::/48", "32787"}, - {"2408:8256:1196::/37", "17622"}, - {"2620:9:a00c::/46", "395515"}, - {"2800:bf0::/43", "52257"}, - {"2a02:26f7:b5c9::/42", "20940"}, - {"2604:f980:2500::/44", "19957"}, - {"2409:8c4c:17::/44", "9808"}, - {"2620:100:3010::/48", "23286"}, - {"2a09:adc0:2::/29", "64466"}, - {"2001:559:8549::/46", "7015"}, - {"2405:7f00:9e40::/40", "133414"}, - {"2803:9c60::/32", "46198"}, - {"2804:3a64::/32", "266086"}, - {"2001:1248:5ad8::/42", "11172"}, - {"2600:1012:9110::/36", "22394"}, - {"2605:9d80:9092::/48", "4809"}, - {"2804:84f0::/32", "272547"}, - {"2a02:26f7:cb09::/45", "20940"}, - {"2a02:6600:f001::/29", "5377"}, - {"2a02:c100::/29", "199645"}, - {"2409:8030:2100::/36", "9808"}, - {"2804:4760:fab4::/37", "267050"}, - {"2804:81e0::/32", "272483"}, - {"2001:559:35e::/48", "7015"}, - {"2001:4048:109::/32", "33922"}, - {"2001:4490:3bfc::/37", "9829"}, - {"2001:4998:ef64::/47", "14778"}, - {"2800:160:2034::/41", "14259"}, - {"2a00:1510::/32", "42882"}, - {"2a02:26f7:b6c5::/46", "20940"}, - {"2a02:2930::/32", "49767"}, - {"2409:8054:3045::/42", "56040"}, - {"2600:6c3a:403::/42", "20115"}, - {"2c0f:fe38:2340::/32", "33771"}, - {"2401:d800:720::/41", "7552"}, - {"240e:108:24::/48", "134768"}, - {"2606:2800:5120::/46", "15133"}, - {"2803:760::/39", "269816"}, - {"2804:188:6007::/32", "262750"}, - {"2804:5500::/34", "268683"}, - {"2a00:7fc0::/33", "25291"}, - {"2a0f:304::/32", "1239"}, - {"2001:b08:26::/48", "198685"}, - {"2804:32e8::/32", "265104"}, - {"2a12:ff80::/48", "212686"}, - {"2001:260::/32", "2518"}, - {"2600:1006:d140::/43", "6167"}, - {"2804:1e38:6000::/32", "264415"}, - {"2404:3c00:1000::/32", "23944"}, - {"2603:c002:9710::/36", "31898"}, - {"2620:100:6000::/43", "19679"}, - {"2a0e:b107:da0::/44", "142438"}, - {"2a0f:ff00:100::/38", "213281"}, - {"2610:b0:40fe::/39", "21433"}, - {"2001:550:2c01::/38", "174"}, - {"2001:559:388::/48", "7922"}, - {"2402:800:392b::/41", "7552"}, - {"240a:a845::/32", "144767"}, - {"2804:5098::/32", "268398"}, - {"2a04:4e40:fe30::/41", "54113"}, - {"2a0a:1086:c0fe::/47", "393954"}, - {"2a0b:14c0:2::/48", "61273"}, - {"2607:f110:e520::/36", "21889"}, - {"2804:4fb4::/32", "268344"}, - {"2a00:11c0:3b::/48", "42473"}, - {"2a02:e980:ae::/43", "19551"}, - {"2401:fdc0:10::/44", "141013"}, - {"2409:803c:1800::/40", "24444"}, - {"2804:5f50::/32", "269091"}, - {"2800:bf0:3785::/42", "27947"}, - {"2804:80a8::/39", "271765"}, - {"2a0c:dec0:f100::/48", "207063"}, - {"2a0e:97c0:76c::/48", "207662"}, - {"2001:978:a701::/35", "174"}, - {"2405:1640::/32", "138886"}, - {"2606:6800:2400::/40", "394903"}, - {"2001:559:1b3::/48", "20214"}, - {"2409:8a50:700::/36", "56047"}, - {"2604:9e01::/32", "20264"}, - {"2803:c760::/32", "269819"}, - {"2806:230:2038::/48", "265594"}, - {"240e:981:b000::/39", "134420"}, - {"2604:bb80:300::/32", "14602"}, - {"2606:8e80:6800::/35", "32133"}, - {"2610:20:8804::/46", "2648"}, - {"2804:2484::/32", "28258"}, - {"2804:82c8::/32", "272540"}, - {"2806:102e:2::/45", "8151"}, - {"2a00:4802:320::/44", "13124"}, - {"2a10:1800:666::666/128", "43142"}, - {"2001:1818::/32", "7850"}, - {"2403:300:a15::/48", "714"}, - {"240a:a20d::/32", "143175"}, - {"2a02:950::/30", "31229"}, - {"2a06:28c0::/29", "197798"}, - {"2001:559:78c::/48", "33287"}, - {"2001:559:c15d::/48", "22909"}, - {"2408:8956:4c00::/40", "17622"}, - {"2803:3410::/32", "64129"}, - {"2804:819c::/32", "272465"}, - {"2a00:15a8:900::/32", "29140"}, - {"240e:964:ec00::/35", "4134"}, - {"2a00:6740::/32", "8779"}, - {"2a02:26f7:23::/48", "20940"}, - {"2001:418:4001:2::/64", "20940"}, - {"240e:1c:6000::/32", "4134"}, - {"2a04:dc0::/48", "199386"}, - {"2a06:1580::/29", "201086"}, - {"2a0e:b107:1806::/48", "149007"}, - {"2001:4998:21::/46", "10310"}, - {"2400:0:720::/43", "4766"}, - {"240e:67e:8400::/38", "140329"}, - {"2804:2298::/32", "264110"}, - {"2a01:8840:1e::/42", "12041"}, - {"2001:590:3804::/37", "3257"}, - {"2408:8256:378a::/48", "17623"}, - {"2804:6f0:900::/32", "53047"}, - {"2a0a:c700::/29", "28788"}, - {"2401:3bc0:901::/35", "137409"}, - {"240a:a873::/32", "144813"}, - {"2804:15c8::/32", "263410"}, - {"2a05:6c00::/29", "62126"}, - {"2001:56a:c::/47", "852"}, - {"2001:67c:2dec::/48", "41617"}, - {"240a:afee::/32", "146728"}, - {"2804:7dbc::/32", "271579"}, - {"2406:c800:e001::/35", "38016"}, - {"240e:3b0:f100::/37", "134775"}, - {"2603:8077::/32", "11955"}, - {"2605:6400:d814::/48", "398355"}, - {"2607:2900::/32", "25914"}, - {"2803:1e10::/36", "271975"}, - {"2a06:e881:2509::/48", "205634"}, - {"2405:4803:edd0::/35", "18403"}, - {"2407:1e40:601::/36", "141732"}, - {"240a:a968::/32", "145058"}, - {"2600:370f:3628::/47", "32261"}, - {"2600:6c3a:43a::/36", "20115"}, - {"2804:2ac8::/32", "265118"}, - {"2a04:4e40:4000::/48", "54113"}, - {"2a05:bf00::/29", "43260"}, - {"2a06:a005:a::/47", "9833"}, - {"2001:67c:99c::/48", "209105"}, - {"2620:149:100d::/46", "714"}, - {"2001:42d0:b::/40", "33764"}, - {"2001:4878:8228::/48", "12222"}, - {"2402:800:350f::/43", "7552"}, - {"2605:a404:f0::/44", "33363"}, - {"2620:38:2000::/48", "53535"}, - {"2620:10f:d000::/44", "208722"}, - {"2620:132::/44", "63027"}, - {"2804:1a30:c100::/40", "61844"}, - {"2001:ad8::/29", "8823"}, - {"240a:a2ed::/32", "143399"}, - {"240a:ad8b::/32", "146117"}, - {"240e:379:aa00::/39", "140330"}, - {"2620:151::/36", "16793"}, - {"2a04:6040::/31", "49229"}, - {"2a0a:e805:610::/44", "64476"}, - {"240a:a621::/32", "144219"}, - {"2600:1415:a::/48", "24319"}, - {"2606:4700:85c0::/43", "13335"}, - {"2806:230:1000::/48", "265594"}, - {"2a0f:600:607::/44", "51044"}, - {"2001:559:256::/48", "33662"}, - {"2600:1010:f100::/44", "6167"}, - {"2800:bf0:2420::/45", "52257"}, - {"2803:5c80:5595::/48", "64114"}, - {"2804:6c1c::/32", "270446"}, - {"2a03:a2c2::/32", "60595"}, - {"2a0b:2542::/48", "137256"}, - {"2409:8c30:1110::/38", "9808"}, - {"2606:a000:4000::/32", "11426"}, - {"2804:14c:fc00::/40", "28573"}, - {"2804:787c::/32", "271245"}, - {"2400:7400:e013::/48", "23736"}, - {"2402:e380:301::/48", "133072"}, - {"2607:f8f8:1f10::/32", "23033"}, - {"2001:df5:1680::/48", "45671"}, - {"2a02:26f7:d208::/48", "36183"}, - {"2a0d:c980::/29", "204487"}, - {"2a10:6500::/29", "399975"}, - {"240e:44d:2700::/41", "140345"}, - {"2602:fcca::/36", "399428"}, - {"2a02:5640::/29", "9137"}, - {"2c0f:e9c8::/32", "36926"}, - {"2001:1598::/32", "28747"}, - {"2401:8ac0:1c0::/48", "4671"}, - {"2620:68::/48", "29906"}, - {"2803:9800:9099::/46", "11664"}, - {"2804:62ec::/32", "269328"}, - {"2a02:26f7:b68d::/42", "20940"}, - {"2a02:2808:1009::/48", "56361"}, - {"2001:559:c3::/44", "7922"}, - {"2402:800:ba02::/41", "7552"}, - {"2406:daa0:c0c0::/44", "16509"}, - {"2804:672c::/32", "269609"}, - {"2a07:bfc0::/29", "9022"}, - {"2a0b:7800::/29", "15600"}, - {"2001:250:3c04::/44", "138369"}, - {"2001:559:c231::/48", "33652"}, - {"2407:3e80::/32", "38768"}, - {"2606:6300::/32", "46618"}, - {"2804:1b3:6f00::/41", "10429"}, - {"2a02:26f7:f381::/46", "20940"}, - {"2001:559:5d6::/47", "7922"}, - {"2404:2200:28::/32", "18200"}, - {"2804:4bc:5001::/32", "262462"}, - {"2804:e40::/32", "262947"}, - {"2a02:2ac8::/32", "702"}, - {"2001:df1:e000::/48", "55666"}, - {"2001:1248:885c::/42", "11172"}, - {"2001:1248:97ef::/43", "11172"}, - {"2804:6538::/32", "269476"}, - {"2001:559:c178::/48", "33657"}, - {"2001:67c:29f4::/48", "58302"}, - {"2401:1100::/32", "133380"}, - {"2406:2000:100::/40", "10310"}, - {"2800:160:1b87::/44", "14259"}, - {"2a0a:e5c0::/48", "209898"}, - {"2001:559:3d9::/48", "7922"}, - {"240c:c02f::/32", "24349"}, - {"2607:6b80:65::/48", "55081"}, - {"2804:128c::/32", "263483"}, - {"2a02:158:c000::/39", "44946"}, - {"2a04:1b00:80::/47", "60679"}, - {"2a0e:eec4::/32", "398343"}, - {"2001:678:80::/48", "51955"}, - {"2401:d800:d220::/41", "7552"}, - {"2804:f18::/32", "263566"}, - {"2001:559:35b::/48", "33651"}, - {"2001:13c7:601d::/48", "64103"}, - {"2001:4408:4801::/40", "4758"}, - {"2401:8b00::/32", "55385"}, - {"2402:800:9d1d::/41", "7552"}, - {"2600:1f00:1000::/40", "16509"}, - {"2804:1018::/32", "263619"}, - {"2a00:7580:10::/48", "8659"}, - {"2a0c:b640:a::/43", "34872"}, - {"2001:559:747::/48", "33287"}, - {"2404:e00:852::/48", "15695"}, - {"240a:a1a1::/32", "143067"}, - {"2a02:ee80:4012::/45", "3573"}, - {"2001:4878:4007::/44", "12222"}, - {"2001:49f0:d110::/47", "174"}, - {"2600:400:8f00::/33", "15147"}, - {"2804:1080:8003::/48", "28287"}, - {"2804:84f4::/32", "272548"}, - {"2a00:1e28::/32", "12859"}, - {"2001:559:c24d::/46", "7015"}, - {"2403:9200::/32", "23641"}, - {"2800:ad0::/32", "11816"}, - {"2806:2f0:60e1::/46", "17072"}, - {"2a02:26f7:cd4d::/46", "20940"}, - {"2a03:7dc0::/32", "39256"}, - {"2a10:7d40::/29", "6939"}, - {"2001:678:3b8::/48", "208733"}, - {"2a01:41a0::/32", "62282"}, - {"2a09:be40:4200::/41", "213349"}, - {"2a0b:d280::/32", "20655"}, - {"2404:3d00:40ec::/46", "21433"}, - {"2605:f700:100::/44", "18978"}, - {"2804:7cb4::/32", "271513"}, - {"2a0d:7a00::/29", "205145"}, - {"2a0e:97c3:5c4::/48", "20473"}, - {"2400:89c0:1130::/44", "37936"}, - {"2a01:75c0::/29", "199284"}, - {"2408:8957:4d00::/40", "17816"}, - {"240a:ae0b::/32", "146245"}, - {"2600:1000:9110::/36", "22394"}, - {"2605:4d80::/32", "27626"}, - {"2401:d800:7e70::/40", "7552"}, - {"2a01:70::/32", "25098"}, - {"2a03:6100:6100::/48", "38937"}, - {"2a0d:fd40:57::/29", "14630"}, - {"2401:d800:f020::/41", "7552"}, - {"2402:800:7ce0::/39", "7552"}, - {"240a:ae14::/32", "146254"}, - {"240a:afa0::/32", "146650"}, - {"2605:a401:8313::/42", "33363"}, - {"2803:6900:524::/48", "52423"}, - {"2a0e:db80::/29", "205516"}, - {"2406:840:eb80::/43", "140731"}, - {"2806:2f0:33e3::/37", "17072"}, - {"2a01:5b40:ac4::/32", "12996"}, - {"2a03:9c00:d::/48", "41732"}, - {"2a0c:b641:45c::/48", "210348"}, - {"2401:1880::/32", "45177"}, - {"2600:1404:dc01::/34", "20940"}, - {"2620:10a:80ec::/48", "394354"}, - {"2801:11:4000::/48", "10753"}, - {"2801:80:e60::/48", "264534"}, - {"2a02:26f7:d445::/46", "20940"}, - {"2001:1a12::/29", "8781"}, - {"2001:41ca::/29", "35425"}, - {"2602:803:c006::/48", "26667"}, - {"2602:fd15:2::/36", "398465"}, - {"2610:1e0::/35", "3714"}, - {"2804:5c18::/32", "268887"}, - {"2a02:26f7:c004::/48", "36183"}, - {"2001:67c:2b64::/48", "210466"}, - {"240a:70::/46", "9605"}, - {"2604:56c0::/32", "53507"}, - {"2804:7b54::/32", "271425"}, - {"2a06:8781::/40", "47447"}, - {"2610:160::/43", "27325"}, - {"2804:5094::/32", "268397"}, - {"2806:2f0:6063::/40", "17072"}, - {"2408:8656:2cfd::/48", "17816"}, - {"240a:ad3e::/32", "146040"}, - {"2803:b6a0::/32", "266905"}, - {"2404:f4c0:f90e::/47", "139833"}, - {"240a:a993::/32", "145101"}, - {"2a01:7c8:8000::/33", "20857"}, - {"2a01:8840:35::/48", "207266"}, - {"2001:4878:c257::/48", "12222"}, - {"2400:9380:9250::/46", "4809"}, - {"2804:4e24::/32", "268242"}, - {"2a02:26f7:c894::/48", "36183"}, - {"2404:4f00:3045::/32", "17819"}, - {"2409:8915:3400::/39", "56044"}, - {"2605:59c0:8000::/33", "36492"}, - {"2a02:26f7:c94e::/42", "20940"}, - {"2001:16a2:c1f0::/44", "39386"}, - {"2001:19e8:8041::/48", "3923"}, - {"2001:1a11:22::/45", "8781"}, - {"2400:7400:36::/47", "23736"}, - {"2405:a740::/32", "58820"}, - {"240a:a1e6::/32", "143136"}, - {"2600:140f:c00::/48", "55836"}, - {"2804:58b8:11::/48", "15695"}, - {"2a00:e78::/33", "34602"}, - {"2a01:4f40::/32", "29222"}, - {"2a02:26f7:c::/48", "36183"}, - {"2001:67c:154::/48", "25318"}, - {"2408:840c:9c00::/40", "17621"}, - {"2620:46:4000::/48", "395431"}, - {"2804:14d:1a00::/40", "28573"}, - {"2a03:a300:2000::/48", "35104"}, - {"2404:2680::/32", "9618"}, - {"2606:2800:15::/46", "15133"}, - {"2403:2c00:f000::/43", "4058"}, - {"2610:e0:a010::/44", "26934"}, - {"2804:5bcc::/32", "52657"}, - {"2806:230:3009::/48", "11888"}, - {"2803:800:5::/32", "25607"}, - {"2a01:c50f:f780::/36", "12479"}, - {"2a0e:5b80::/29", "42487"}, - {"2402:1c00:c01::/45", "23838"}, - {"2605:6400:4000::/32", "53667"}, - {"2a00:d40:10a::/48", "2597"}, - {"2001:559:212::/48", "7016"}, - {"2405:205:4000::/35", "55836"}, - {"2408:8957:3800::/40", "17622"}, - {"240e:3bd:6400::/35", "140312"}, - {"240e:67d:800::/37", "140329"}, - {"240e:964:f600::/31", "4134"}, - {"240e:983:1702::/40", "4134"}, - {"2804:3984::/32", "262902"}, - {"2a05:d8c0::/29", "15391"}, - {"2001:da8:e824::/37", "23910"}, - {"2602:107:510::/48", "11351"}, - {"2610:b0:40f8::/47", "21433"}, - {"2803:a010::/32", "271795"}, - {"2a00:fa60:1520::/32", "53550"}, - {"2a02:26f7:112::/48", "36183"}, - {"2a0a:9c40::/29", "43809"}, - {"2001:559:857b::/48", "33662"}, - {"2001:559:c2cd::/48", "33650"}, - {"2001:470:c7::/44", "6939"}, - {"2001:559:c1ec::/48", "33651"}, - {"2001:43f8:1090::/48", "328267"}, - {"2402:3a80:c80::/38", "38266"}, - {"2403:ddc0::/32", "138388"}, - {"240e:54:8000::/33", "140329"}, - {"2600:805:b01::/30", "701"}, - {"2803:f00::/47", "262182"}, - {"2a01:9780::/32", "209754"}, - {"2a06:e040::/33", "198507"}, - {"2a0f:b4c3::/32", "199669"}, - {"2a10:7a40:3::/48", "39910"}, - {"2402:3a80:640::/40", "38266"}, - {"2403:e800:51b::/36", "4637"}, - {"2406:aa00::/35", "55354"}, - {"2400:d800::/30", "9506"}, - {"2409:8044::/34", "24445"}, - {"240a:aa21::/32", "145243"}, - {"2605:3380:444f::/48", "12025"}, - {"2a04:2ac0::/29", "61081"}, - {"2a0d:f3c0::/29", "34907"}, - {"2c0f:1300::/32", "37440"}, - {"2409:8080:2a20::/44", "9808"}, - {"2409:870c::/30", "56042"}, - {"240a:af29::/32", "146531"}, - {"2600:1419:ac01::/35", "20940"}, - {"2a01:cb20:1000::/33", "3215"}, - {"2a0d:540::/29", "203180"}, - {"2a0d:82c7:2000::/35", "47787"}, - {"2001:559:c0fe::/48", "33650"}, - {"240a:ad00::/32", "145978"}, - {"2604:f9c0::/32", "397064"}, - {"2606:f700::/32", "54359"}, - {"2a0c:cb00::/32", "212313"}, - {"240e:183:8210::/46", "140652"}, - {"2620:0:e50::/45", "3676"}, - {"2a0c:b641:70::/48", "211013"}, - {"2001:559:8668::/48", "7725"}, - {"2001:559:c010::/47", "33287"}, - {"2605:a401:842b::/39", "33363"}, - {"2804:256c::/32", "264280"}, - {"2804:6608::/33", "269529"}, - {"2a0e:11c0::/32", "61150"}, - {"2a11:fc0::/29", "210767"}, - {"2606:8c00:2::/48", "22995"}, - {"2607:ae80:128::/48", "26558"}, - {"2a04:1580::/29", "200155"}, - {"2a0f:9340::/48", "1299"}, - {"2001:559:8753::/48", "7015"}, - {"2401:d800:f1d0::/42", "7552"}, - {"2607:f220:204::/44", "19050"}, - {"2620:149:a19::/48", "714"}, - {"2804:2b4::/36", "28265"}, - {"2a02:970:139a::/37", "44002"}, - {"2804:51ec::/32", "268485"}, - {"2a03:91c0::/32", "57394"}, - {"2a0b:2d85::/32", "44582"}, - {"2001:1248:982c::/43", "11172"}, - {"2804:d10::/32", "52593"}, - {"2804:47a0:2000::/32", "267066"}, - {"2001:559:82::/48", "33651"}, - {"2001:559:8359::/48", "33659"}, - {"2001:da8:9000::/45", "24369"}, - {"2403:9800:12::/42", "4648"}, - {"2604:7ac0:b00::/37", "12213"}, - {"2607:fb58:9000::/33", "36086"}, - {"2804:e94:675::/44", "262468"}, - {"2a00:a4c0::/32", "57734"}, - {"2a06:e044::/44", "203382"}, - {"2408:8344:1200::/32", "4837"}, - {"2602:fcbc::/48", "14618"}, - {"2803:5b10::/32", "272083"}, - {"2a02:d88::/32", "20552"}, - {"2a03:c680::/29", "28919"}, - {"2a0e:8f02:f026::/48", "211480"}, - {"2600:802:1103::/45", "701"}, - {"2001:4488:5::/34", "7713"}, - {"2001:da8:d024::/48", "23910"}, - {"2001:4408:4900::/37", "4758"}, - {"2405:84c0:99f0::/44", "9886"}, - {"240e:438:b040::/38", "4134"}, - {"2803:da60::/32", "267890"}, - {"2a0a:e5c0:2a::/47", "213081"}, - {"2001:559:81f0::/48", "33657"}, - {"2001:44b8:405e::/48", "7545"}, - {"2409:804e:3100::/36", "9808"}, - {"2409:8958:cd44::/43", "9808"}, - {"2600:100d:b1d0::/42", "6167"}, - {"2a02:26f7:dd09::/42", "20940"}, - {"2a0b:4340:95::/48", "205610"}, - {"2a0b:9d80::/32", "15699"}, - {"2a0c:5247:9000::/36", "59504"}, - {"2610:20:6000::/37", "49"}, - {"2a01:240::/32", "30781"}, - {"2a02:748::/35", "29802"}, - {"2a02:26f0:8a00::/48", "34164"}, - {"2a05:b0c6:6006::/48", "211139"}, - {"2a0a:e580::/29", "208861"}, - {"2001:559:164::/48", "33489"}, - {"2001:559:51b::/48", "7922"}, - {"2407:c00:8000::/33", "45356"}, - {"2606:4fc0:10::/44", "399581"}, - {"2a0a:cf40::/29", "44295"}, - {"2403:1300:9000::/33", "56286"}, - {"2602:fe1e::/36", "22751"}, - {"2804:62e8::/32", "269327"}, - {"2a01:46c0::/48", "199248"}, - {"2a06:1287:2610::/36", "61138"}, - {"2a09:eb80::/29", "209649"}, - {"2001:559:864c::/48", "33491"}, - {"2001:559:86e8::/47", "33652"}, - {"2404:f4c0:f940::/46", "142551"}, - {"240e:3b8:7600::/39", "140313"}, - {"2806:2f0:1300::/46", "22884"}, - {"2604:880:26::/47", "29802"}, - {"2804:90:6300::/37", "28580"}, - {"2804:3e1c::/32", "266574"}, - {"2a0a:8740::/29", "205851"}, - {"2001:1580::/32", "9158"}, - {"2606:6240:dead::/48", "398447"}, - {"2607:f028:8::/48", "2173"}, - {"2001:559:c3f8::/48", "7725"}, - {"2001:df1:f600::/48", "27385"}, - {"2001:4400::/31", "4768"}, - {"2600:140b:2c00::/48", "31109"}, - {"2a10:3140::/30", "208256"}, - {"2a12:ea00::/29", "1239"}, - {"2001:559:401::/48", "20214"}, - {"2001:559:7bf::/48", "33651"}, - {"2001:1878:800::/44", "85"}, - {"2406:e540::/48", "140766"}, - {"2604:6d00:2000::/48", "36223"}, - {"2604:ca00:7::/48", "36492"}, - {"2a04:ac0:1::/48", "20860"}, - {"2404:a500:4::/47", "45854"}, - {"2a02:26f7:e345::/46", "20940"}, - {"2a02:26f7:e48c::/48", "36183"}, - {"2001:468:300::/48", "2637"}, - {"2001:df0:86::/48", "18055"}, - {"240a:a7ca::/32", "144644"}, - {"2605:cac0::/32", "398425"}, - {"2804:eac::/32", "262967"}, - {"2806:2f0:1182::/48", "17072"}, - {"2a02:26f0:d501::/40", "20940"}, - {"2a02:26f7:cdc5::/46", "20940"}, - {"2a0d:1cc0::/48", "208549"}, - {"2402:800:9363::/43", "7552"}, - {"2804:7654::/32", "271104"}, - {"2a02:c140::/29", "8426"}, - {"2c0f:f980:7000::/32", "33763"}, - {"2001:c20:486a::/48", "9255"}, - {"2001:1810::/42", "14116"}, - {"240a:aa95::/32", "145359"}, - {"2606:fe80:20::/44", "12180"}, - {"2620:9a:e000::/48", "399879"}, - {"2800:bf0:80ed::/46", "27947"}, - {"2804:14c:7579::/40", "28573"}, - {"2a02:480::/32", "8685"}, - {"2001:559:c299::/48", "7015"}, - {"2402:800:3a8d::/43", "7552"}, - {"2402:800:70c0::/42", "7552"}, - {"240a:acfd::/32", "145975"}, - {"2602:fc6d::/40", "25819"}, - {"2a0c:b641:32::/48", "210233"}, - {"2c0f:f360::/34", "7489"}, - {"2001:559:833f::/48", "22258"}, - {"2001:19d0:600::/40", "12025"}, - {"240a:a562::/32", "144028"}, - {"2a02:26f7:e4::/48", "36183"}, - {"2001:43f8:2a0::/48", "32279"}, - {"2001:4408:6d10::/38", "4758"}, - {"2001:4830:c500::/40", "27552"}, - {"2804:2844::/33", "263951"}, - {"2001:559:c19a::/48", "13367"}, - {"2001:559:c3d6::/48", "33657"}, - {"2001:678:5f4::/48", "204626"}, - {"2409:802f:2b05::/48", "9808"}, - {"240a:a26e::/32", "143272"}, - {"240a:a770::/32", "144554"}, - {"240a:a932::/32", "145004"}, - {"2804:c90::/47", "28198"}, - {"2001:400:6000:a::/37", "293"}, - {"2001:559:85a9::/46", "33662"}, - {"2600:1417:1a::/48", "24319"}, - {"2605:41c0:2::/48", "397042"}, - {"2620:149:5fc::/36", "714"}, - {"2a02:368::/32", "28859"}, - {"2a02:26f7:bd0c::/48", "36183"}, - {"2a06:6541:30c1::/48", "3549"}, - {"2c0f:fbc8::/32", "37075"}, - {"240a:aba2::/32", "145628"}, - {"2804:14c:445::/42", "28573"}, - {"2804:7acc::/32", "13357"}, - {"2806:230:1200::/45", "11888"}, - {"2a10:8580::/48", "206436"}, - {"2001:559:c41f::/48", "33287"}, - {"2402:2500:7::/33", "13445"}, - {"240a:ad80::/32", "146106"}, - {"240e:cf:a000::/33", "4134"}, - {"240e:3bf:c000::/37", "140315"}, - {"2a02:26f7:df01::/46", "20940"}, - {"2a0d:55c0::/29", "58011"}, - {"2403:2500:400::/48", "36236"}, - {"2409:8060:100::/36", "9808"}, - {"2605:ad80:12f0::/44", "62887"}, - {"2607:f7a8:200::/39", "46887"}, - {"2801:1fc:14::/48", "27951"}, - {"2a02:26f7:4d::/48", "20940"}, - {"2400:ac40:d50::/40", "136255"}, - {"240e:44d:5e00::/41", "140345"}, - {"2001:448a:2010::/47", "7713"}, - {"2803:d860::/32", "267826"}, - {"2804:5b64::/32", "268840"}, - {"2a00:d880::/32", "198203"}, - {"2001:559:c285::/48", "33660"}, - {"2400:3320::/48", "140766"}, - {"2408:8456:1940::/40", "17816"}, - {"2409:805e:1100::/36", "9808"}, - {"2600:6c10:f308::/43", "20115"}, - {"2607:f220:300::/44", "22828"}, - {"2800:bf0:8120::/44", "52257"}, - {"2804:de0::/32", "262604"}, - {"2a0f:9400:800e::/48", "140098"}, - {"2606:3380:4::/43", "53334"}, - {"2607:fb90:b500::/36", "21928"}, - {"2a02:22d0::/44", "61323"}, - {"2406:f400:161::/48", "38001"}, - {"2600:1417:50::/47", "9829"}, - {"2606:5000:1200::/34", "209"}, - {"2800:bf0:3a04::/42", "27947"}, - {"2402:9d80:a00::/47", "131429"}, - {"240e:44d:4480::/41", "4134"}, - {"2602:ff4b::/48", "18106"}, - {"2606:4e00::/32", "396362"}, - {"2600:5c00:141::/40", "10838"}, - {"2600:9000:103b::/48", "16509"}, - {"2605:9d80:9023::/48", "4809"}, - {"2800:68:14::/48", "61468"}, - {"2a01:7a00::/36", "51701"}, - {"2a01:bb22::/32", "14618"}, - {"2a07:7a00::/29", "204064"}, - {"2a0b:ae40:5::/44", "396362"}, - {"2001:4210:350a::/33", "25818"}, - {"2404:79c0:1002::/48", "138633"}, - {"2408:8957:6400::/40", "17622"}, - {"2409:8a52:900::/38", "56047"}, - {"240a:a74f::/32", "144521"}, - {"2001:559:84c2::/48", "33659"}, - {"2402:8100:24c0::/42", "45271"}, - {"2610:b0:403c::/41", "3573"}, - {"2804:38f4::/32", "266514"}, - {"2a03:2887:ff1b::/45", "63293"}, - {"2a03:f080::/35", "42685"}, - {"2a0c:b641:452::/48", "211944"}, - {"2001:fd8:e4::/46", "132199"}, - {"2001:44b8:5::/48", "7545"}, - {"2a03:1360::/32", "31736"}, - {"2a0c:61c0::/32", "203602"}, - {"2403:cb00:301::/46", "58621"}, - {"2600:7000::/24", "6939"}, - {"2804:5d0:e000::/35", "28241"}, - {"2a00:1260::/32", "31641"}, - {"2a03:5840:100::/48", "213073"}, - {"2001:250:6802::/45", "138373"}, - {"2607:f2c0::/32", "5645"}, - {"2a01:4a0:31::/44", "201011"}, - {"2001:da8:2024::/44", "24357"}, - {"2001:1248:9728::/43", "11172"}, - {"240a:a8ab::/32", "144869"}, - {"240e:3bd:f100::/37", "134775"}, - {"2602:107:60d::/48", "20001"}, - {"2a00:1ca8:2d::/41", "50673"}, - {"2a02:26f7:bc09::/42", "20940"}, - {"2a02:4140::/45", "43957"}, - {"2a03:43e0::/32", "59748"}, - {"2001:43f8:1320::/48", "328358"}, - {"2403:4a00::/32", "9304"}, - {"2404:e801:100c::/46", "55430"}, - {"240e:24:c000::/28", "4134"}, - {"2a0d:ac00:1000::/48", "205202"}, - {"2a11:29c2:b00b::/48", "212149"}, - {"2600:1406:6401::/36", "20940"}, - {"2a00:dd00::/46", "212573"}, - {"2a02:c1c0::/29", "31655"}, - {"2a04:1c43::/29", "201035"}, - {"2001:c38:9125::/48", "9931"}, - {"2402:3a80:c062::/48", "38266"}, - {"240a:a58e::/32", "144072"}, - {"240a:ab43::/32", "145533"}, - {"240a:ac7a::/32", "145844"}, - {"240e:267:400::/35", "4134"}, - {"2600:1419:4c01::/35", "20940"}, - {"2804:11dc::/33", "263444"}, - {"2806:230:1027::/48", "11888"}, - {"2a02:ed04:4610::/39", "50304"}, - {"2a0f:9200::/31", "45009"}, - {"240e:438:4220::/43", "140647"}, - {"2600:370f:2020::/47", "32261"}, - {"2603:6030::/31", "10796"}, - {"2804:14c:6589::/43", "28573"}, - {"2001:559:21f::/48", "33491"}, - {"2404:e680::/35", "18409"}, - {"240a:a009::/32", "142659"}, - {"2602:ff0d::/39", "395938"}, - {"2606:18c0:3::/48", "61317"}, - {"2a02:2108::/32", "43284"}, - {"2a0e:46c4:200::/48", "38230"}, - {"2a0f:5000::/29", "205500"}, - {"2001:678:302::/48", "35684"}, - {"2606:9200::/32", "6428"}, - {"2607:fae0:245::/48", "15562"}, - {"2a00:ac00::/31", "51728"}, - {"2a03:6780::/48", "2119"}, - {"2a06:1cc0::/32", "198964"}, - {"2001:c20:700a::/36", "3758"}, - {"2401:c080:1000::/34", "20473"}, - {"2800:bf0:2300::/47", "52257"}, - {"2806:230:4015::/48", "11888"}, - {"2001:df5:5480::/48", "141412"}, - {"2405:7f00:3000::/38", "133414"}, - {"240e:3bd:1400::/38", "134773"}, - {"2804:7a7c:1000::/36", "271374"}, - {"2001:df0:1600::/48", "134980"}, - {"2804:2ecc::/32", "265367"}, - {"2806:2f0:72a1::/46", "17072"}, - {"2806:370:2210::/41", "28403"}, - {"2a00:4802:3200::/44", "13124"}, - {"2a04:4e41:60::/48", "54113"}, - {"240a:ab4b::/32", "145541"}, - {"2600:6c10:111::/45", "20115"}, - {"2a02:24e0::/32", "50957"}, - {"2a0f:5707:ab22::/48", "202297"}, - {"2407:2c0::/48", "140775"}, - {"240a:abd3::/32", "145677"}, - {"2a01:c50f:1140::/40", "12479"}, - {"2a10:7500::/29", "399975"}, - {"2001:250:c0d::/46", "138374"}, - {"2a00:7180:8004::/46", "207806"}, - {"2a10:4646:d0::/44", "210810"}, - {"2607:fd28:a004::/48", "62753"}, - {"2a02:26f7:ec54::/48", "36183"}, - {"2001:c98::/32", "9858"}, - {"2001:df0:44::/48", "17990"}, - {"2001:44b8:40d7::/48", "7545"}, - {"240a:ace5::/32", "145951"}, - {"2600:1415:4001::/37", "20940"}, - {"2600:1488:6421::/41", "20940"}, - {"2803:e600:9999::/48", "65500"}, - {"2a10:2f00:16c::/48", "211495"}, - {"2407:ca00::/32", "45280"}, - {"2607:f518:136::/35", "46887"}, - {"2803:e400::/32", "52373"}, - {"2804:39ec::/32", "266059"}, - {"2a01:3d8::/32", "12759"}, - {"2001:559:20b::/48", "22909"}, - {"2001:559:c091::/48", "33667"}, - {"2001:559:c378::/48", "7922"}, - {"2405:800:a::/35", "7545"}, - {"2409:896a:9e00::/39", "9808"}, - {"2602:fed2:710e::/48", "20473"}, - {"2a00:8140:f000::/36", "60351"}, - {"2a01:90:400::/48", "29668"}, - {"2a02:26f7:c8::/48", "36183"}, - {"2a05:4840::/29", "60576"}, - {"2402:c100:c03::/32", "23673"}, - {"2402:e380:322::/48", "64041"}, - {"2407:fa00::/32", "24043"}, - {"2409:8320::/27", "9808"}, - {"2605:2980::/32", "11404"}, - {"2a11:6c0::/40", "211083"}, - {"2c0f:ec80:9000::/33", "37315"}, - {"2001:559:8752::/48", "7922"}, - {"2620:137:d::/46", "396253"}, - {"2804:58::/32", "262659"}, - {"2804:6e68::/32", "270595"}, - {"2a02:26f7:c180::/48", "36183"}, - {"2a02:2e02:1230::/40", "12479"}, - {"2a03:bdc0::/32", "30781"}, - {"2a09:fc00::/29", "200848"}, - {"2a10:5900::/29", "208256"}, - {"2001:503:4872::/48", "7342"}, - {"2405:ec01:2000::/32", "137412"}, - {"2a11:5b40::/29", "204790"}, - {"2408:8459:b850::/38", "17816"}, - {"2804:14d:8e87::/44", "28573"}, - {"2804:79b4::/32", "271322"}, - {"2a02:2e02:1210::/42", "12479"}, - {"2a0e:6b40:10::/48", "42034"}, - {"240e:30b::/35", "137691"}, - {"2607:f2b1:4001::/48", "30614"}, - {"2a02:2698:7000::/38", "50543"}, - {"2001:5a0:3e02::/39", "6453"}, - {"240a:a0ce::/32", "142856"}, - {"2605:3d00::/32", "46353"}, - {"2610:b0:4072::/40", "3573"}, - {"2804:84f8::/32", "272549"}, - {"2400:dd0d:2001::/30", "7497"}, - {"2403:3a00::/32", "9371"}, - {"2405:1040::/48", "135905"}, - {"2407:5680::/32", "133476"}, - {"240e:3b4:1400::/38", "134773"}, - {"2804:48c0::/32", "267142"}, - {"2a02:df0::/32", "25233"}, - {"2a0f:c083::/32", "51837"}, - {"2a11:5740::/29", "1239"}, - {"2403:780:c000::/34", "64098"}, - {"2600:80c:1000::/39", "701"}, - {"2a00:6901:b005::/48", "20926"}, - {"2a06:a001:a000::/44", "210542"}, - {"2a0c:7480::/32", "5606"}, - {"2001:559:8510::/48", "33657"}, - {"2602:107:1010::/48", "33363"}, - {"2606:6e00::/32", "7296"}, - {"2607:e080::/32", "197696"}, - {"2804:4c2c::/32", "267354"}, - {"2a03:b280:1000::/48", "29838"}, - {"2409:8d5a:600::/45", "9808"}, - {"240a:a4b8::/32", "143858"}, - {"2600:1402:1f::/37", "20940"}, - {"2801:19c:10::/48", "14080"}, - {"2804:36f8::/32", "266383"}, - {"2a0e:b107:1567::/44", "209209"}, - {"2606:eb80::/32", "55044"}, - {"2800:2e::/32", "7908"}, - {"2804:6f00::/32", "270632"}, - {"2a03:2887:ff21::/48", "63293"}, - {"2a0b:6e00::/32", "203687"}, - {"240a:ab54::/32", "145550"}, - {"240a:ad91::/32", "146123"}, - {"2a09:9cc0::/48", "44364"}, - {"2a0a:9204:31::/30", "61317"}, - {"2c0f:f3f0::/32", "328024"}, - {"2001:559:3c8::/48", "7922"}, - {"2001:559:87a7::/48", "33287"}, - {"2001:1900:2816::/35", "3356"}, - {"2620:100:6036::/41", "19679"}, - {"2806:230:3005::/48", "11888"}, - {"2a00:4802:4e00::/44", "13124"}, - {"2a01:e0::/32", "39854"}, - {"2a03:9c0::/32", "28716"}, - {"2001:470:bf::/41", "6939"}, - {"2001:1248:8000::/43", "11172"}, - {"240a:a05d::/32", "142743"}, - {"2804:3724::/32", "266392"}, - {"2806:20d:5049::/46", "32098"}, - {"2a0a:540::/29", "205892"}, - {"2001:200:c000::/35", "23634"}, - {"2403:8300:813f::/48", "2516"}, - {"2406:ae40::/32", "141590"}, - {"2a02:88d:100::/48", "48695"}, - {"2a02:2ab0:220::/37", "702"}, - {"2001:559:c3e2::/48", "7922"}, - {"2604:5ec0::/32", "13356"}, - {"2608:148:b::/48", "27064"}, - {"2402:8100:27c0::/47", "45271"}, - {"2405:e100::/43", "132116"}, - {"2607:fb60::/32", "1742"}, - {"2a02:e980:e5::/44", "19551"}, - {"2001:4998:ef6d::/43", "14778"}, - {"2804:fb0::/32", "262841"}, - {"2a01:bb23:8000::/29", "14618"}, - {"2a02:26f7:c5c4::/47", "36183"}, - {"2001:df1:8000::/48", "132440"}, - {"2800:484:2f00::/40", "10620"}, - {"2806:2f0:4061::/46", "17072"}, - {"2001:1978:1300::/40", "13768"}, - {"2401:6bfd::/32", "18220"}, - {"240e:3b3:1400::/38", "134773"}, - {"2600:6c20:c22::/45", "20115"}, - {"2804:c20::/32", "52680"}, - {"2804:74f8::/32", "271015"}, - {"2001:df0:8640::/48", "133658"}, - {"2408:8957:7e00::/40", "17622"}, - {"2409:896a:2e00::/39", "9808"}, - {"2606:18c0:1e::/48", "14445"}, - {"2a02:26f7:f148::/48", "36183"}, - {"2a02:7b40::/32", "62282"}, - {"2a03:6640::/32", "199562"}, - {"240a:ac02::/32", "145724"}, - {"2602:ff62:20e::/36", "61317"}, - {"2804:52e4::/32", "268548"}, - {"2a02:6420::/32", "201596"}, - {"2407:8c00:1b0::/44", "55441"}, - {"2a00:5a20::/47", "199289"}, - {"2a07:2780::/31", "15490"}, - {"2001:df0:272::/48", "132111"}, - {"2001:1838:9002::/40", "23352"}, - {"2001:67c:1bec:f000::/52", "2148"}, - {"2001:bf7:fc10::/38", "44194"}, - {"2804:15f0:8000::/33", "263419"}, - {"2402:800:538d::/43", "7552"}, - {"2408:8456:6040::/39", "17816"}, - {"2408:84f3:a840::/38", "17816"}, - {"2a02:888:8044::/46", "48695"}, - {"2a03:22a0::/32", "44833"}, - {"2a05:d012::/36", "16509"}, - {"2804:10b0::/32", "28175"}, - {"2a04:d480:2400::/35", "25291"}, - {"2408:8459:cc30::/41", "17622"}, - {"240e:44d:100::/42", "140345"}, - {"2a0c:a9c7:236::/48", "47445"}, - {"2400:7fc0:2c0::/44", "55960"}, - {"2600:380:9f80::/34", "20057"}, - {"2602:107:e000::/40", "11426"}, - {"2804:163c:303::/32", "263277"}, - {"2804:3584::/32", "266291"}, - {"2a02:2e02:8600::/42", "12479"}, - {"2a0e:4980::/32", "15879"}, - {"2001:43f8:92::/48", "37708"}, - {"2405:4803:31a::/37", "18403"}, - {"2a05:dec0::/29", "197580"}, - {"2403:8500:100::/36", "45804"}, - {"2403:df00:3::/32", "9292"}, - {"240e:982:5500::/36", "4134"}, - {"2600:140b:6::/44", "20940"}, - {"2a06:c6c0:1::/48", "15626"}, - {"2001:1388:8a0c::/47", "264684"}, - {"2406:da00:6000::/40", "16509"}, - {"2407:d600::/32", "7690"}, - {"2408:8459:3a50::/37", "17816"}, - {"2600:6c38:a3e::/41", "20115"}, - {"2600:9000:2378::/45", "16509"}, - {"2803:c010:3e4::/47", "271799"}, - {"2804:14d:5083::/41", "28573"}, - {"2804:4c14:aa01::/39", "267348"}, - {"2a02:26f0:10b::/45", "20940"}, - {"2a02:26f7:d255::/46", "20940"}, - {"2404:bf40:f081::/39", "139084"}, - {"2406:d501:10::/32", "136557"}, - {"2804:2324:f000::/36", "262883"}, - {"2a02:6680:f100::/44", "16116"}, - {"2401:2a00:1004::/34", "7468"}, - {"2600:1009:a100::/43", "6167"}, - {"2a02:26b0:8000::/48", "42910"}, - {"2a03:4080::/32", "47815"}, - {"2a0b:5380::/29", "206119"}, - {"2001:559:773::/45", "7922"}, - {"2401:b400:10::/47", "58536"}, - {"240a:a99a::/32", "145108"}, - {"2607:4d00:4000::/35", "33260"}, - {"2a0c:10c0::/40", "196755"}, - {"2a0d:ee00::/32", "42487"}, - {"2001:da8:b6::/48", "24359"}, - {"2403:f040::/32", "4618"}, - {"2803:21c0::/32", "265680"}, - {"2a01:79c0::/32", "58326"}, - {"2a06:c3c0::/48", "52048"}, - {"2001:559:4cf::/43", "7015"}, - {"2804:10a0:e0::/38", "28173"}, - {"2a02:26f7:b608::/48", "36183"}, - {"2001:67c:1f4::/48", "39500"}, - {"2405:8a00:8020::/47", "55824"}, - {"2804:8124::/32", "272435"}, - {"2a02:26f7:c1::/48", "20940"}, - {"2a02:26f7:d154::/47", "36183"}, - {"2a02:26f7:ea80::/48", "36183"}, - {"2001:678:6bc::/48", "202592"}, - {"240a:abfe::/32", "145720"}, - {"2600:c04::/35", "10912"}, - {"2606:4700::/47", "13335"}, - {"2a0a:9c0::/29", "207991"}, - {"2001:559:c50b::/45", "7922"}, - {"2804:51c::/33", "262495"}, - {"2001:67c:1578::/48", "43757"}, - {"2407:3dc0::/32", "140583"}, - {"240a:a08f::/32", "142793"}, - {"2605:c00:1200::/40", "46920"}, - {"2806:2f0:1041::/46", "22884"}, - {"2a02:26f7:b7c4::/48", "36183"}, - {"2a02:2e02:3ba0::/37", "12479"}, - {"2a06:6541:2002::/48", "3356"}, - {"2001:900::/32", "35393"}, - {"2402:ef01::/47", "9430"}, - {"2804:d74::/32", "28577"}, - {"2a00:1288:1a8::/46", "34010"}, - {"2405:ec0::/36", "132768"}, - {"2407:c080:805::/37", "55990"}, - {"2a03:2e0::/32", "197451"}, - {"2620:149:a1b::/48", "714"}, - {"2804:1644:fb00::/37", "262903"}, - {"2804:14c:9b89::/41", "28573"}, - {"2804:117c:8010::/33", "53061"}, - {"240a:a989::/32", "145091"}, - {"240a:ac96::/32", "145872"}, - {"2607:9c00::/32", "18474"}, - {"2803:c40::/32", "33182"}, - {"2001:44c8:45a0::/43", "45430"}, - {"2404:bf40:e101::/46", "139084"}, - {"2406:3000:3:2c::/45", "4657"}, - {"240a:a123::/32", "142941"}, - {"2600:1805:ff11::/48", "16552"}, - {"2001:559:87a6::/48", "7922"}, - {"2001:1a68:16::/44", "15694"}, - {"2600:1406:32::/48", "21342"}, - {"2604:7f80::/32", "17378"}, - {"2803:2b00:1103::/32", "52468"}, - {"2a00:ab80::/32", "50903"}, - {"2a0c:54c0::/32", "204065"}, - {"2001:470:cf::/43", "6939"}, - {"2001:579:e02c::/43", "22773"}, - {"2001:4878:31::/48", "12222"}, - {"240e:951:2c00::/28", "4134"}, - {"2804:7e00::/32", "271596"}, - {"2a01:7120::/32", "62206"}, - {"2a04:4a45::/44", "206067"}, - {"2001:67c:17b0::/48", "21436"}, - {"2602:fd23:a::/36", "33185"}, - {"2607:f178:10::/48", "30217"}, - {"2803:c200:7519::/48", "22411"}, - {"2a06:4000::/29", "204151"}, - {"2001:67c:24b8::/48", "212725"}, - {"2401:d800:b4c0::/42", "7552"}, - {"240e:350:6400::/31", "4134"}, - {"2606:a600:4001::/48", "398024"}, - {"2804:3c34::/32", "266196"}, - {"2a03:83a0:2::/48", "201529"}, - {"2001:559:4ba::/48", "33652"}, - {"2001:579:e03c::/41", "22773"}, - {"2001:da8:cd::/48", "138373"}, - {"2600:100b:b0e0::/39", "6167"}, - {"2610:20:6b00::/40", "2648"}, - {"2804:14c:d800::/40", "28573"}, - {"2a02:26f7:c148::/48", "36183"}, - {"2a02:cb80:2140::/48", "43766"}, - {"2404:ce40:2000::/32", "138884"}, - {"240a:a4c2::/32", "143868"}, - {"2403:f680:101::/48", "58898"}, - {"2406:3002:50::/50", "138345"}, - {"2408:8957:d240::/40", "17622"}, - {"2409:8e14:9000::/31", "56044"}, - {"240e:978:600::/36", "4134"}, - {"2620:13d:c000::/48", "399086"}, - {"2804:92c::/32", "263056"}, - {"2001:388:30d9::/33", "7575"}, - {"2402:8100:31d8::/47", "45271"}, - {"2403:e600::/36", "58376"}, - {"2a02:26f7:eb40::/48", "36183"}, - {"2001:4530:4::/32", "9433"}, - {"2409:8971::/29", "9808"}, - {"2001:1a11:126::/48", "8781"}, - {"2408:8459:1a30::/41", "17622"}, - {"2600:1417:62::/48", "20940"}, - {"2620:171:71::/46", "42"}, - {"2800:810::/39", "27747"}, - {"2602:fcdf::/36", "398491"}, - {"2a02:a48::/32", "48960"}, - {"2a02:26f7:c809::/46", "20940"}, - {"2401:4900:3280::/42", "45609"}, - {"240a:a132::/32", "142956"}, - {"2a02:26f7:ef10::/48", "36183"}, - {"2a0e:8f02:2154::/48", "211869"}, - {"2405:c9c0:1389::/32", "138823"}, - {"2a07:1980:e::/43", "48851"}, - {"2408:8957:8100::/40", "17816"}, - {"2001:579:e384::/35", "22773"}, - {"2404:c140:956e::/48", "57401"}, - {"2409:8904:e140::/42", "24547"}, - {"2605:a40c:24::/32", "33363"}, - {"2804:66ac::/32", "269575"}, - {"2a02:45c0:15::/48", "59675"}, - {"2a03:3da0::/48", "59649"}, - {"2a03:47c0:20c1::/39", "21277"}, - {"2a10:7900:ffff::/29", "399975"}, - {"2001:450::/34", "3549"}, - {"2600:1004:f000::/44", "6167"}, - {"2001:5b0:3d00::/38", "6621"}, - {"2402:800:3dd3::/44", "7552"}, - {"2408:8956:3100::/40", "17816"}, - {"240a:aa77::/32", "145329"}, - {"2600:6c34:221::/48", "33588"}, - {"2806:230:3012::/48", "265594"}, - {"2a01:170:2000::/32", "8820"}, - {"2a02:26f7:eccc::/48", "36183"}, - {"2a0d:2406:babe::/48", "49133"}, - {"2404:0:2000::/36", "7482"}, - {"2404:0:9000::/26", "17709"}, - {"2600:1fa0:e0c0::/44", "16509"}, - {"2804:683c::/32", "269678"}, - {"2001:4c8:1086::/43", "15290"}, - {"2400:a980:1500::/36", "133111"}, - {"2402:800:62ac::/43", "7552"}, - {"2407:0:0:3e::/32", "4761"}, - {"240a:a861::/32", "144795"}, - {"2606:4800::/32", "11430"}, - {"2800:5f0:3001::/42", "22724"}, - {"2a00:cc40:3::/29", "44395"}, - {"2a0c:2800::/32", "205316"}, - {"2001:559:509::/48", "33650"}, - {"2001:dc7:ffc2::/48", "24406"}, - {"2402:8700:54::/32", "58979"}, - {"2803:2e40::/39", "27796"}, - {"2804:8260::/32", "272516"}, - {"2a10:2f00:12a::/48", "9886"}, - {"2001:df0:cf::/48", "55390"}, - {"2600:1409:9000::/48", "35994"}, - {"2a05:68c0::/29", "201059"}, - {"2a05:9340::/30", "60117"}, - {"2a06:8dc7::/48", "25369"}, - {"240a:a0b7::/32", "142833"}, - {"2605:7440::/32", "20128"}, - {"2a0d:d380::/29", "210107"}, - {"2001:67c:20::/48", "198303"}, - {"2600:c010:100::/40", "7843"}, - {"2a05:5300::/29", "200562"}, - {"2a09:4d41::/32", "50673"}, - {"2a0b:fec0::/29", "205360"}, - {"2a0d:3080::/29", "205068"}, - {"2001:67c:1cc::/48", "50906"}, - {"2001:67c:124c::/48", "197564"}, - {"240e:3b5:1400::/38", "134773"}, - {"2804:48d8::/32", "267148"}, - {"2804:6b00::/32", "270371"}, - {"2a00:e200:100::/48", "39396"}, - {"2a0e:fb44::/32", "398343"}, - {"2408:8956:700::/40", "17816"}, - {"2600:1403:3::/44", "20940"}, - {"2801:16:f000::/48", "19429"}, - {"2804:d8c::/32", "52638"}, - {"240a:a409::/32", "143683"}, - {"240a:a867::/32", "144801"}, - {"2606:d980::/32", "396481"}, - {"2001:559:840c::/48", "7015"}, - {"240e:44d:40::/42", "140346"}, - {"2804:8270::/32", "61608"}, - {"2806:370:6000::/40", "28403"}, - {"2a03:b6c0::/32", "20672"}, - {"2a03:ed80::/32", "13178"}, - {"2a12:7c40::/48", "208446"}, - {"2001:559:5ae::/47", "20214"}, - {"2001:559:c2d4::/48", "33659"}, - {"2804:4a48::/32", "267229"}, - {"2a02:26f7:dc41::/46", "20940"}, - {"2402:800:9947::/43", "7552"}, - {"240a:a53d::/32", "143991"}, - {"2620:132:3000::/40", "395089"}, - {"2800:160:1053::/45", "14259"}, - {"2a02:ad8:7c::/38", "12389"}, - {"2a0a:56c4:8200::/47", "42649"}, - {"2a0b:c540::/29", "47926"}, - {"2001:559:8717::/48", "33659"}, - {"2402:800:3cc5::/43", "7552"}, - {"2406:3000:20::/44", "4657"}, - {"2409:8030:900::/35", "9808"}, - {"240e:3b6:dc00::/34", "4134"}, - {"2605:a401:80c6::/43", "33363"}, - {"2803:6900:553::/48", "52423"}, - {"2804:145c::/37", "263327"}, - {"2a01:4000::/32", "33852"}, - {"2001:502:1ca1::/48", "396574"}, - {"2001:559:4d8::/48", "33655"}, - {"2409:896a:7c00::/39", "9808"}, - {"240a:a157::/32", "142993"}, - {"2606:4700:8ca0::/44", "13335"}, - {"2607:7c80:54::/48", "7247"}, - {"2001:df6:6380::/48", "141866"}, - {"2400:9380:9200::/46", "4809"}, - {"2401:f000:2:100::/56", "38477"}, - {"2402:800:9be0::/44", "7552"}, - {"2a00:4802:ab0::/41", "13124"}, - {"2a0b:a180::/29", "41038"}, - {"2001:559:139::/48", "33287"}, - {"2408:8956:300::/40", "17816"}, - {"2800:bf0:2a80::/47", "52257"}, - {"2001:67c:22a8::/48", "197416"}, - {"240a:ab7b::/32", "145589"}, - {"2605:b280::/32", "26709"}, - {"2803:1e80::/32", "28111"}, - {"2002::/16", "6939"}, - {"2400:e440:500::/41", "42382"}, - {"2402:c600::/32", "17941"}, - {"240e:ff:c000::/48", "134773"}, - {"2605:a40a:b000::/33", "33363"}, - {"2a0c:b641:453::/48", "211891"}, - {"2001:559:aa::/47", "7922"}, - {"2404:3d00:4134::/47", "3573"}, - {"240a:abcd::/32", "145671"}, - {"240e:964:9580::/41", "133775"}, - {"2620:48:c002::/47", "26549"}, - {"2804:1c30::/32", "28285"}, - {"2a00:1b88::/32", "29075"}, - {"2a04:9f40::/29", "204790"}, - {"2001:250:7801::/43", "24372"}, - {"240e:982:6800::/37", "4134"}, - {"2604:af80:848::/40", "18859"}, - {"2800:160:25d5::/38", "14259"}, - {"2a02:26f7:d485::/46", "20940"}, - {"2001:df1:fe80::/48", "139786"}, - {"2409:8c14:ae00::/31", "56044"}, - {"240a:a717::/32", "144465"}, - {"240a:adc1::/32", "146171"}, - {"2a01:aea0:dd2::/48", "42473"}, - {"2a02:ee80:4048::/46", "3573"}, - {"2a03:5f00:105::/46", "29644"}, - {"2001:6d0:ffb7::/48", "47445"}, - {"2001:df6:a700::/48", "132046"}, - {"2800:160:1f2a::/43", "14259"}, - {"2804:74cc::/32", "271004"}, - {"2001:250:7001::/46", "24369"}, - {"2001:559:81ac::/48", "7725"}, - {"2a02:26f0:9700::/48", "6762"}, - {"2a02:2aa8:121::/44", "702"}, - {"2402:800:3955::/42", "7552"}, - {"2404:138::/41", "38022"}, - {"2405:1c0:7961::/48", "55303"}, - {"2806:310:25::/44", "16960"}, - {"2a02:26f7:e149::/46", "20940"}, - {"2a03:9cc0::/29", "5463"}, - {"2a07:b8c1::/45", "14043"}, - {"2408:8957:4100::/40", "17816"}, - {"240e:1a:160::/44", "146966"}, - {"2001:67c:8d0::/48", "31564"}, - {"2602:fd50:100::/40", "62513"}, - {"2602:feda:105::/48", "396303"}, - {"2620:8:4300::/48", "174"}, - {"2800:490:4000::/36", "27951"}, - {"2803:9800:b4c3::/39", "11664"}, - {"2a0a:e5c1:100::/38", "207996"}, - {"2001:650:cc01::/48", "3209"}, - {"2402:800:599b::/42", "7552"}, - {"2408:8459:4450::/38", "17816"}, - {"2408:84e2:2c0::/37", "17621"}, - {"240e:628::/32", "17638"}, - {"2602:fed2:7195::/48", "33696"}, - {"2a01:3e0::/37", "6453"}, - {"2a09:c580::/32", "209979"}, - {"2c0f:fd58::/32", "11845"}, - {"2001:559:8187::/48", "7725"}, - {"2001:1250:2000::/44", "22894"}, - {"240e:804::/40", "140636"}, - {"2a01:40e0:2::/48", "34012"}, - {"2a0e:c80:1::/46", "3170"}, - {"2a0e:b107:340::/44", "209710"}, - {"2001:df0:e780::/48", "16089"}, - {"2600:5c00:386c::/48", "11351"}, - {"2a02:88d:8220::/44", "48695"}, - {"2001:470:ce::/48", "396097"}, - {"2605:1e80::/34", "14380"}, - {"2801:1ca::/44", "3816"}, - {"2001:559:75d::/48", "7725"}, - {"2408:870c:30::/40", "17621"}, - {"2409:807c:2100::/36", "9808"}, - {"240e:44d:5700::/42", "140345"}, - {"2a02:4c07:4000::/32", "12676"}, - {"2a06:e881:550d::/46", "209864"}, - {"2a10:2380::/29", "204790"}, - {"2001:df6:b780::/48", "148971"}, - {"2408:84f3:ba40::/37", "17816"}, - {"2605:cdc0:20::/48", "398088"}, - {"2800:bf0:140::/45", "52257"}, - {"2a05:3580:b800::/33", "35807"}, - {"2c0f:f088::/32", "328471"}, - {"2406:20c0::/34", "140423"}, - {"2406:7400:34::/47", "131269"}, - {"2607:fb10:7012::/42", "2906"}, - {"2a02:ee80:4199::/48", "3573"}, - {"2a09:bac0:242::/48", "13335"}, - {"2402:800:34d3::/44", "7552"}, - {"2604:d240::/32", "396852"}, - {"2001:559:c276::/48", "7015"}, - {"2001:559:c2ec::/48", "33652"}, - {"2800:bf0:2445::/38", "27947"}, - {"2804:2f40:f000::/45", "264880"}, - {"2a09:1405::/48", "48749"}, - {"2400:6d80::/32", "58621"}, - {"2804:13b0:3c00::/43", "263546"}, - {"2a00:f620:1::/48", "174"}, - {"2001:67c:2f04::/48", "16074"}, - {"2800:bf0:8250::/44", "27947"}, - {"2804:1608::/32", "263423"}, - {"2a10:2f01:220::/48", "207890"}, - {"2a10:c540::/29", "44070"}, - {"2408:8956:cdc0::/38", "17622"}, - {"2804:12a0::/32", "61900"}, - {"2804:67c4::/32", "269649"}, - {"2a00:1210:ffff::/48", "34700"}, - {"2a01:a460::/32", "34520"}, - {"2a02:2e02:1140::/40", "12479"}, - {"2a07:14c0:7000::/36", "59504"}, - {"2a0c:9a40:1038::/47", "34927"}, - {"2606:2800:6040::/47", "15133"}, - {"2607:ffd0:5::/39", "13767"}, - {"2804:10a0:224::/32", "28173"}, - {"2a05:6a00::/29", "51395"}, - {"2001:df2:f680::/48", "132269"}, - {"2406:3000:4d::/43", "4657"}, - {"2001:559:8439::/46", "33667"}, - {"2001:16a2:c2c4::/42", "39386"}, - {"2408:8456:4010::/42", "134543"}, - {"240e:51:6000::/29", "4134"}, - {"2804:6cd8:1000::/38", "270496"}, - {"2a02:610::/33", "2588"}, - {"2a02:28f0::/29", "44136"}, - {"2402:3a80:1705::/48", "38266"}, - {"2001:559:1d6::/48", "33491"}, - {"2001:559:8128::/48", "13367"}, - {"240e:438:ac40::/38", "4134"}, - {"2600:370f:3743::/45", "32261"}, - {"2801:80:3680::/48", "269133"}, - {"2a0c:7840::/29", "50415"}, - {"2001:648:2e81::/35", "5408"}, - {"2603:90b6::/32", "12271"}, - {"2408:883a::/37", "4837"}, - {"240a:a929::/32", "144995"}, - {"2610:a1:1082::/48", "397226"}, - {"2001:559:1b2::/48", "33287"}, - {"240a:a3fa::/32", "143668"}, - {"2600:1407:3401::/38", "20940"}, - {"2600:1419:3201::/37", "20940"}, - {"2001:559:832b::/48", "7922"}, - {"2001:559:85da::/48", "13367"}, - {"2001:448a:3010::/41", "7713"}, - {"2001:4300::/32", "31065"}, - {"2402:e280:2136::/44", "134674"}, - {"2001:559:85d9::/48", "7922"}, - {"2604:6140::/32", "21818"}, - {"2a04:7c00::/29", "200023"}, - {"2001:559:831e::/48", "7922"}, - {"2400:dd0b:1006::/29", "7497"}, - {"2801:140:bfa::/48", "262249"}, - {"2806:20d:16fd::/46", "32098"}, - {"2a07:3506:c1::/48", "9150"}, - {"2a09:be40:28ff::/48", "213170"}, - {"2001:df3:e180::/48", "140695"}, - {"2001:448a:1070::/40", "7713"}, - {"2803:6604:c401::/39", "28075"}, - {"2a00:12e8::/32", "29014"}, - {"2a01:4020:35::/32", "25369"}, - {"2a02:26f7:cc41::/46", "20940"}, - {"2a06:6780::/29", "56568"}, - {"2606:3380:fff0::/48", "53334"}, - {"2a0d:1a43::/32", "208590"}, - {"2406:2f00::/32", "132542"}, - {"2406:b400:f0::/47", "18209"}, - {"2407:1000::/35", "24005"}, - {"2409:8014:300a::/30", "56044"}, - {"2600:370f:3765::/44", "32261"}, - {"2804:cdc:c000::/34", "52565"}, - {"2806:107e:1c::/42", "8151"}, - {"2a00:1ec8:9a::/32", "2854"}, - {"2406:f00:9::/48", "58758"}, - {"2800:5d0:213::/48", "17048"}, - {"2804:1f4::/32", "262757"}, - {"2804:4120::/32", "266005"}, - {"2a00:7740::/32", "33915"}, - {"2a0b:8140::/29", "38948"}, - {"2001:250:2413::/44", "24356"}, - {"2001:da8:b4::/48", "24367"}, - {"2a0f:8780::/29", "208108"}, - {"2001:e48:83::/32", "9583"}, - {"2604:a200::/32", "13614"}, - {"2001:648:2c01::/44", "5408"}, - {"2001:16a2:7400::/36", "25019"}, - {"240e:6c0::/23", "4134"}, - {"2803:8c40::/32", "263789"}, - {"2803:c480::/32", "263194"}, - {"2a00:7b60::/32", "49058"}, - {"2a02:2708::/32", "21378"}, - {"2001:559:6f::/48", "33287"}, - {"2600:1004:a100::/43", "6167"}, - {"2603:5:2100::/38", "44273"}, - {"2001:559:269::/48", "13367"}, - {"2402:800:940f::/43", "7552"}, - {"2402:800:96ee::/39", "7552"}, - {"2604:400::/32", "26225"}, - {"2607:f750:20::/47", "23473"}, - {"2801:80:2540::/48", "268558"}, - {"2804:314:10::/34", "61568"}, - {"2a02:7aa0:5000::/48", "52173"}, - {"2c0f:e908::/32", "327750"}, - {"2404:d180:1a::/48", "133372"}, - {"2a02:24b0::/32", "29470"}, - {"2404:7e80:4000::/36", "132717"}, - {"2409:8028:2b00::/40", "56041"}, - {"2607:f6f0:3002::/40", "19930"}, - {"2801:140:49::/48", "262249"}, - {"2804:4f8:a002::/45", "28263"}, - {"2804:138b:b0c2::/42", "53037"}, - {"2a02:26f7:b8cc::/48", "36183"}, - {"2a09:bac0:134::/44", "13335"}, - {"2a0d:a8c0::/29", "39405"}, - {"2620:96:8000::/48", "3719"}, - {"2620:171:d1::/45", "42"}, - {"2a02:26f7:df4c::/48", "36183"}, - {"2a03:4d42::/36", "199610"}, - {"240e:3b6:9c00::/34", "140310"}, - {"2600:1408:8000::/48", "35994"}, - {"2606:4280:8000::/36", "16696"}, - {"2a02:7d0::/32", "34141"}, - {"2001:67c:1750::/48", "208441"}, - {"2401:b640::/32", "136948"}, - {"2804:2838::/38", "263948"}, - {"2001:dce:100::/48", "38064"}, - {"2001:df4:4280::/48", "140920"}, - {"240a:a7a7::/32", "144609"}, - {"240e:f:b000::/36", "134768"}, - {"2600:1406:fc01::/31", "20940"}, - {"2600:1801:4::/46", "16552"}, - {"2001:1248:55d8::/47", "11172"}, - {"2001:4070::/33", "5550"}, - {"2409:8c70:3a20::/41", "9808"}, - {"2607:fdf0:5efc::/39", "8008"}, - {"2a09:9dc0::/48", "44364"}, - {"2a0e:b107:370::/44", "208751"}, - {"2a0f:9640::/29", "35415"}, - {"2001:4c8:102b::/41", "15290"}, - {"2001:19e8:a::/48", "2576"}, - {"2600:140f:f800::/48", "24319"}, - {"2606:62c0:1000::/34", "399686"}, - {"2800:440:1c00::/42", "27738"}, - {"2804:6cc:8200::/36", "262607"}, - {"2a01:4e8::/32", "44314"}, - {"2a05:e800:1::/48", "50881"}, - {"2a10:ba00:bee5::/48", "16509"}, - {"240e:3b5:9200::/36", "140317"}, - {"2600:6c10:e01::/46", "20115"}, - {"2602:fd6e::/36", "19999"}, - {"2620:105:f000::/40", "4201"}, - {"2401:d800:2080::/42", "7552"}, - {"2401:d800:f200::/42", "7552"}, - {"2a01:4ff::/40", "213230"}, - {"2001:67c:1442::/48", "43832"}, - {"2600:1407:1401::/36", "20940"}, - {"2804:354c::/33", "53018"}, - {"2401:2200:50::/48", "55420"}, - {"2401:d800:5650::/42", "7552"}, - {"2402:800:f690::/39", "7552"}, - {"2602:ffca::/36", "32875"}, - {"2603:c002:150::/38", "31898"}, - {"2803:d1a0::/32", "267700"}, - {"2804:694:5000::/32", "262596"}, - {"2804:1194::/36", "263424"}, - {"2804:7690::/33", "271120"}, - {"2a02:250:3::/48", "25234"}, - {"2a02:c6c1::/48", "44050"}, - {"2001:559:761::/48", "7016"}, - {"2806:2f0:4241::/46", "17072"}, - {"2001:44b8:30ed::/48", "7545"}, - {"240a:a41d::/32", "143703"}, - {"2801:1fa::/44", "19429"}, - {"2a03:2880:f167::/44", "32934"}, - {"2a12:3780::/29", "57113"}, - {"240e:966:c400::/39", "133775"}, - {"2800:600:181::/38", "52323"}, - {"2801:80:2330::/48", "267247"}, - {"2804:7a98::/32", "271381"}, - {"2600:1005:b1f0::/33", "22394"}, - {"2600:1800:11::/45", "16552"}, - {"2a02:26f7:bf49::/46", "20940"}, - {"2001:678:800::/48", "213103"}, - {"2402:800:9a0f::/43", "7552"}, - {"2404:bc0:4200::/43", "137735"}, - {"2408:894e::/32", "4837"}, - {"2a04:4e40:7840::/43", "54113"}, - {"2001:ee0:ee00::/40", "45899"}, - {"2603:c0f0:1210::/39", "6142"}, - {"2a02:6aa0::/32", "200081"}, - {"2a0b:b2c0::/48", "205504"}, - {"2405:4803:cea::/45", "18403"}, - {"2408:8459:50::/38", "17816"}, - {"240a:a08c::/32", "142790"}, - {"2804:66c0::/32", "269580"}, - {"2804:7048::/32", "270717"}, - {"2a01:7660:7::/32", "12843"}, - {"2602:fc3b:101::/38", "399970"}, - {"2a07:6880::/32", "202872"}, - {"2001:7f8:5d::1000/48", "15645"}, - {"2001:fd8:3040::/47", "4775"}, - {"2600:1003:a410::/38", "22394"}, - {"2804:20fc:1100::/36", "264525"}, - {"2a01:b000:9::/32", "35266"}, - {"2a02:26f7:cd::/48", "20940"}, - {"2a04:100::/34", "49223"}, - {"2406:1e00::/32", "56030"}, - {"2409:8087:2900::/35", "9808"}, - {"2600:c02:1021::/32", "12182"}, - {"2607:f928:4::/48", "13359"}, - {"2804:72b4::/32", "270870"}, - {"2a09:35c0:100::/38", "209510"}, - {"2001:6d0:6d0::/48", "43832"}, - {"2001:978:5401::/36", "174"}, - {"2402:9e80:2402::/48", "133752"}, - {"240a:a2e1::/32", "143387"}, - {"2600:c02:b020::/48", "22211"}, - {"2806:264:4300::/37", "13999"}, - {"2806:107e::/43", "8151"}, - {"2001:559:f3::/48", "33651"}, - {"2408:8256:2ca0::/39", "17816"}, - {"2408:861a::/31", "4837"}, - {"240a:adec::/32", "146214"}, - {"2600:1901:bde0::/33", "15169"}, - {"2a00:61e0::/32", "60294"}, - {"240a:a072::/32", "142764"}, - {"2804:3838:6::/42", "53170"}, - {"2600:400::/35", "15147"}, - {"2604:ee40::/32", "395646"}, - {"2a0e:97c0:380::/48", "60404"}, - {"2001:559:c107::/48", "33667"}, - {"2a07:2d40::/48", "25435"}, - {"240a:a39c::/32", "143574"}, - {"240a:a7ad::/32", "144615"}, - {"2606:7ec0::/32", "4046"}, - {"2608:c144:1::/48", "5927"}, - {"2800:2a0:230::/47", "264788"}, - {"2a06:7740::/48", "207651"}, - {"2001:559:c022::/47", "33657"}, - {"2001:df7:c700::/48", "45316"}, - {"240a:a322::/32", "143452"}, - {"2a12:4946:1700::/48", "211398"}, - {"2001:1878:600::/39", "226"}, - {"2409:8b7d::/30", "9808"}, - {"2804:65dc::/32", "269519"}, - {"2806:2f0:3263::/40", "17072"}, - {"2001:550:1704::/36", "174"}, - {"2405:7c00:a000::/45", "9534"}, - {"2407:c000:c025::/34", "9270"}, - {"240e:10:1000::/32", "4134"}, - {"240e:a66::/35", "140329"}, - {"2806:2f0:9e81::/42", "17072"}, - {"2a02:2e02:bc0::/43", "12479"}, - {"2408:8459:b050::/38", "17816"}, - {"2801:13:4800::/48", "269825"}, - {"2804:84fc::/37", "272550"}, - {"2a02:26f7:bd11::/42", "20940"}, - {"2001:559:2b4::/47", "7922"}, - {"240a:ab28::/32", "145506"}, - {"2600:1417:9001::/36", "20940"}, - {"2801:10:f000::/48", "3816"}, - {"2a02:6604:3::/48", "44933"}, - {"2401:8e80::/32", "18187"}, - {"2408:8956:cd40::/40", "17816"}, - {"2804:6dec::/32", "270564"}, - {"2001:da8:a7::/48", "24363"}, - {"2409:8057:3054::/42", "56040"}, - {"2803:6700:340::/48", "263210"}, - {"2804:5e28::/32", "269015"}, - {"2a02:26f7:c9c5::/46", "20940"}, - {"2803:50c0:105::/46", "264763"}, - {"2804:7aa8::/32", "271384"}, - {"2001:500:9c::/46", "20144"}, - {"2001:559:80cd::/48", "22258"}, - {"2001:da8:7011::/48", "23910"}, - {"2001:44b8:3084::/48", "7545"}, - {"2409:8c20:c800::/34", "56046"}, - {"2806:2f0:9843::/42", "17072"}, - {"2a02:26f7:c88c::/47", "36183"}, - {"2a02:26f7:cd47::/48", "20940"}, - {"2a02:dc00:100::/48", "15493"}, - {"2001:559:8208::/48", "33654"}, - {"2404:c8:3::/32", "10217"}, - {"2600:140b:f001::/37", "20940"}, - {"2600:1480:5801::/44", "21342"}, - {"2804:2778::/34", "263903"}, - {"2a00:da80::/32", "43614"}, - {"2001:559:c332::/48", "33659"}, - {"2406:840:9995::/46", "210320"}, - {"2804:200c::/32", "262815"}, - {"2804:802c:205::/32", "271734"}, - {"2a00:1c08::/32", "44335"}, - {"2a00:da00::/32", "8560"}, - {"2a02:558::/32", "12594"}, - {"2a0a:aa42::/32", "205668"}, - {"2001:678:8::/48", "210004"}, - {"2401:d800:9c70::/40", "7552"}, - {"2404:bf40:c441::/48", "7545"}, - {"240a:ab3d::/32", "145527"}, - {"2804:3d4::/45", "262401"}, - {"2001:250:2406::/44", "24356"}, - {"2404:e801:2004::/46", "55430"}, - {"2408:8459:ee10::/42", "17623"}, - {"2607:f148:1000::/34", "11734"}, - {"2610:a1:3068::/48", "12008"}, - {"2a02:26f7:eb84::/48", "36183"}, - {"2404:c2c0:240::/44", "135629"}, - {"2a06:11c0::/46", "31169"}, - {"2a0d:75c0::/29", "49191"}, - {"2a11:c00::/29", "47787"}, - {"2001:559:79::/48", "7725"}, - {"2400:9800:13::/45", "24203"}, - {"2409:8c85:5400::/43", "56040"}, - {"240e:10:a000::/37", "63838"}, - {"240e:3b8:dc00::/34", "4134"}, - {"2607:fc48:c18::/48", "40009"}, - {"2804:27c4::/32", "263921"}, - {"2804:7f04::/32", "271661"}, - {"2a06:f787:2::/48", "2686"}, - {"2a0c:f000:1000::/48", "206976"}, - {"2001:da8:201d::/48", "138369"}, - {"240e:438:7a40::/37", "4134"}, - {"2620:128:1002::/48", "53620"}, - {"2a01:480::/32", "24961"}, - {"2a0b:5340::/48", "13030"}, - {"2407:b080::/48", "23724"}, - {"240a:acfa::/32", "145972"}, - {"2a0d:2e00:3000::/48", "33932"}, - {"2407:b400::/32", "17924"}, - {"2406:3400:9d::/41", "10143"}, - {"2600:1413:2000::/48", "24319"}, - {"2607:f1d0::/32", "17378"}, - {"2607:f598:f001::/48", "397715"}, - {"2803:8700:10::/48", "25577"}, - {"2001:559:878d::/46", "33652"}, - {"2602:fd50:f00::/48", "207071"}, - {"2803:7210:efff::/35", "271915"}, - {"2804:4f60::/35", "268323"}, - {"2a0f:cc87:6000::/36", "208861"}, - {"2402:800:3bee::/43", "7552"}, - {"2404:1900::/32", "18092"}, - {"240a:a967::/32", "145057"}, - {"240c:ca08::/30", "23910"}, - {"2600:141b:1000::/48", "35994"}, - {"2604:49c0::/32", "395400"}, - {"2a02:1800::/24", "6848"}, - {"2a09:fe00::/29", "209900"}, - {"2402:800:397f::/40", "7552"}, - {"240e:44d:2140::/42", "140361"}, - {"2a01:7d80:2000::/38", "8990"}, - {"2a0d:1642:1::/48", "49505"}, - {"2001:67c:2698::/48", "50779"}, - {"2407:d6c0:8::/48", "136785"}, - {"2605:6840:101::/38", "398041"}, - {"2620:ed:c000::/48", "14209"}, - {"2a00:5881:9000::/40", "198978"}, - {"2a03:2880:f20b::/43", "32934"}, - {"2001:1388:76c2::/36", "6147"}, - {"2406:2000:a1::/46", "10310"}, - {"2600:1406:1600::/48", "16625"}, - {"2620:102:4000::/43", "4130"}, - {"2806:32a::/32", "265574"}, - {"2a02:26f7:dd::/46", "20940"}, - {"2a09:5940::/29", "209304"}, - {"2001:da8:4021::/48", "23910"}, - {"2001:43f8:14c0::/48", "328644"}, - {"2001:4970::/32", "11274"}, - {"2407:3000::/45", "17707"}, - {"2604:d600:c82::/45", "32098"}, - {"2803:cb40::/32", "16906"}, - {"2806:230:500f::/48", "11888"}, - {"2a01:3b8::/33", "33885"}, - {"2a0a:4d00::/29", "201706"}, - {"2a0d:a740:1::/46", "213371"}, - {"2a0e:b107:450::/45", "57883"}, - {"2001:4490:d180::/46", "9829"}, - {"2603:b0af::/25", "11796"}, - {"2604:b000:9000::/33", "14638"}, - {"2c0f:f0a0::/32", "328638"}, - {"2001:df6:a800::/48", "59165"}, - {"2001:fd8:121::/46", "4775"}, - {"2404:7180:b021::/46", "23848"}, - {"2408:877f::/32", "134542"}, - {"240e:3b2:4c00::/35", "136200"}, - {"2800:484:d000::/38", "10620"}, - {"2803:d100:e940::/38", "52362"}, - {"2804:8254::/32", "272513"}, - {"2a02:f7c0::/32", "49273"}, - {"2401:d800:2550::/42", "7552"}, - {"2402:800:bb90::/42", "7552"}, - {"2403:7b40:1::/44", "132931"}, - {"240a:a3ef::/32", "143657"}, - {"2610:a1:1010::/48", "397226"}, - {"2408:8640::/32", "4837"}, - {"2608:4123:2::/48", "6025"}, - {"2803:c010:10::/47", "271799"}, - {"2a02:26f7:f244::/48", "36183"}, - {"2406:8ec0::/32", "45701"}, - {"2407:7800::/32", "55803"}, - {"2a03:2a00::/29", "15817"}, - {"2001:67c:208c::/48", "15562"}, - {"2402:4f00:4004::/32", "58453"}, - {"2600:1015::/32", "6167"}, - {"2620:101:403c::/48", "16880"}, - {"2a00:e540::/32", "33964"}, - {"2a02:4e0:2a00::/42", "16135"}, - {"2a0c:b641:190::/44", "57853"}, - {"2001:13b1:3::/32", "3549"}, - {"2a03:13c0::/32", "199624"}, - {"2a09:4c0:d01::/38", "58057"}, - {"2a0f:85c1:220::/44", "207842"}, - {"2402:800:fe80::/42", "7552"}, - {"240a:af32::/32", "146540"}, - {"2a01:7e0::/42", "44066"}, - {"2001:590:2005:300::/35", "3257"}, - {"2400:c540:c753::/36", "59238"}, - {"2402:800:be40::/42", "7552"}, - {"2408:8459:4e80::/42", "136959"}, - {"2620:1e0:100::/48", "10801"}, - {"2a00:1140:201::/32", "44806"}, - {"2a02:ac80:a001::/35", "25145"}, - {"2a03:2c20::/42", "50287"}, - {"2a04:c442:8000::/38", "2534"}, - {"2602:fc6a:210::/48", "399747"}, - {"2800:160:1c58::/42", "14259"}, - {"2800:5f0:3022::/45", "22724"}, - {"2a02:26f7:b748::/48", "36183"}, - {"2a03:1300::/32", "13214"}, - {"2401:31c0:fffe::/48", "134830"}, - {"240a:aa5e::/32", "145304"}, - {"2804:42b8::/32", "267521"}, - {"2a0c:3880::/29", "44543"}, - {"2405:84c0:fd15::/48", "51089"}, - {"2604:2e88::/30", "30036"}, - {"2800:160:18e0::/44", "14259"}, - {"2001:559:8488::/48", "7922"}, - {"2001:559:8729::/46", "33652"}, - {"2400:cb00:370::/48", "13335"}, - {"2406:9840::/44", "134053"}, - {"240a:a221::/32", "143195"}, - {"2804:61e4::/32", "269263"}, - {"2406:e002::/34", "23655"}, - {"2603:f390::/26", "397165"}, - {"2606:3d40:100::/40", "400097"}, - {"2804:1c84:4::/46", "61659"}, - {"2c0e:2005:0:200::/30", "5713"}, - {"2001:559:c220::/48", "33667"}, - {"2001:67c:93c::/48", "208445"}, - {"2404:f080:2000::/32", "131392"}, - {"240a:a393::/32", "143565"}, - {"2a00:4802:a90::/42", "13124"}, - {"2001:da8:af::/48", "24353"}, - {"2400:cb00:164::/48", "395747"}, - {"2620:11b:e0f2::/44", "3356"}, - {"2001:678:b9c::/48", "207853"}, - {"2001:df6:5c00::/48", "55938"}, - {"2610:b0:40da::/48", "3573"}, - {"2610:1e0:1801::/37", "3714"}, - {"2804:68d4::/32", "269719"}, - {"2804:6a10::/32", "270310"}, - {"2a02:b48:8010::/45", "39572"}, - {"2a0e:b107:11d8::/45", "58015"}, - {"2001:559:85dd::/48", "7725"}, - {"240e:45c:500::/40", "137266"}, - {"240e:982:b000::/40", "58461"}, - {"2800:68:11::/48", "262212"}, - {"2a02:cb43:1002::/45", "20546"}, - {"2001:579:5f84::/34", "22773"}, - {"2001:df0:290::/48", "22787"}, - {"2400:dd01:100a::/45", "7497"}, - {"2408:8656:30f0::/48", "17623"}, - {"2602:fc8b:11::/48", "211544"}, - {"2804:ea0:4002::/32", "52968"}, - {"2804:18b4::/32", "61948"}, - {"2a02:2010:2000::/43", "20978"}, - {"2a02:26f7:e385::/46", "20940"}, - {"2a0d:3c00::/29", "205243"}, - {"2a12:2340::/48", "59458"}, - {"2c0f:f508::/32", "327754"}, - {"2402:8100:27e2::/45", "55644"}, - {"2605:a401:8136::/41", "33363"}, - {"2a02:4560:4::/32", "60157"}, - {"2a09:4e07:d000::/36", "208861"}, - {"2001:dd8:1f::/48", "56088"}, - {"240a:a859::/32", "144787"}, - {"240e:87c:880::/24", "4134"}, - {"2602:fca9::/36", "1742"}, - {"2804:790::/32", "28653"}, - {"2a00:12a0::/32", "34123"}, - {"2001:da8:c1::/48", "138377"}, - {"2406:3340:2000::/32", "139139"}, - {"2602:fe4f::/36", "396917"}, - {"2a04:dfc0::/29", "680"}, - {"2001:250:803::/45", "24348"}, - {"240a:a0d6::/32", "142864"}, - {"2620:16d::/37", "7862"}, - {"2a10:f5c0::/29", "211357"}, - {"2a12:3e40::/48", "16509"}, - {"2001:559:409::/48", "7922"}, - {"2406:3400::/43", "10143"}, - {"2409:8054:44::/48", "9808"}, - {"240a:a3d5::/32", "143631"}, - {"2804:3034:108::/40", "264936"}, - {"2804:3ea4::/32", "266611"}, - {"2a02:26f7:f804::/48", "36183"}, - {"2408:8957:9100::/40", "17816"}, - {"2600:141b:15::/36", "20940"}, - {"2a0b:a700::/29", "207003"}, - {"2409:8904:5c70::/40", "24547"}, - {"240e:103:8b00::/44", "139203"}, - {"2804:61ec::/32", "269265"}, - {"2804:8060::/32", "61606"}, - {"2a0b:14c0:1::/48", "205184"}, - {"2407:5200:49::/38", "55915"}, - {"240a:ada3::/32", "146141"}, - {"240e:3b0:c000::/37", "140315"}, - {"2804:82a0::/32", "272530"}, - {"2a00:8860:100::/40", "60558"}, - {"2a00:ad40:20::/44", "197872"}, - {"2a02:26f7:d041::/46", "20940"}, - {"2a02:26f7:eb50::/48", "36183"}, - {"2001:678:c8::/48", "33999"}, - {"2407:4840::/32", "133301"}, - {"2605:7cc0::/32", "397161"}, - {"2801:0:310::/48", "262238"}, - {"2803:6900:1::/48", "52423"}, - {"2a0e:b700::/30", "35085"}, - {"2001:579:1c08::/42", "22773"}, - {"2409:8010:2900::/35", "9808"}, - {"2620:149:1150::/42", "714"}, - {"2804:111c:2::/45", "52818"}, - {"2a11:940::/29", "25145"}, - {"2001:da8:252::/48", "24350"}, - {"2804:8654::/32", "272636"}, - {"2a02:220::/32", "31122"}, - {"2a02:26f0:1501::/40", "20940"}, - {"2001:4200:3021::/38", "2018"}, - {"2400:18e0:1::/46", "131210"}, - {"2404:3c40::/32", "55933"}, - {"2404:6900:2013::/32", "17819"}, - {"2800:bf0:2443::/48", "27947"}, - {"2001:559:2b7::/44", "7922"}, - {"2409:896a:4c00::/39", "9808"}, - {"2600:6c38:106::/47", "20115"}, - {"2602:ffa6:700::/40", "62731"}, - {"2804:145c:cd10::/38", "263327"}, - {"2a0b:58c0::/29", "42375"}, - {"2001:559:850c::/47", "7725"}, - {"2001:1920::/32", "25689"}, - {"2606:f405::/32", "11776"}, - {"2620:1df::/36", "395678"}, - {"2001:250:219::/46", "24348"}, - {"2001:67c:292c::/48", "210211"}, - {"2800:160:164c::/46", "14259"}, - {"2804:39a0::/32", "266040"}, - {"2409:8028:1000::/40", "56041"}, - {"2600:100c:e210::/35", "22394"}, - {"2605:a401:8ca2::/41", "33363"}, - {"2804:520:2::/32", "262496"}, - {"2602:fc59:c0::/42", "19625"}, - {"2604:ca00:494::/42", "36492"}, - {"2a0b:4000::/29", "64488"}, - {"2806:2f0:7203::/42", "17072"}, - {"2a02:26f7:b4::/48", "36183"}, - {"2a09:3507::/32", "208861"}, - {"2a0e:40c0:2::/48", "21100"}, - {"2001:678:ec::/48", "197467"}, - {"2604:fb80:6801::/37", "15128"}, - {"2803:6900:593::/48", "52423"}, - {"2804:34d0::/32", "265482"}, - {"2804:5118::/32", "268430"}, - {"2a0f:19c0::/29", "60262"}, - {"2001:559:848a::/48", "33491"}, - {"2001:1810:9980::/48", "30447"}, - {"2406:840:f44f::/48", "137835"}, - {"2409:8c15:2e00::/35", "9808"}, - {"2600:9000:1e47::/48", "16509"}, - {"2a00:7e40:9ac1::/48", "1301"}, - {"2001:678:4::/47", "42909"}, - {"2001:da8:b81c::/48", "24372"}, - {"2001:1248:a4b0::/46", "11172"}, - {"2001:43f8:30::/48", "6968"}, - {"2403:9000::/32", "7594"}, - {"2404:4a00:7000:1::/37", "45629"}, - {"2605:e8c0::/32", "393444"}, - {"2607:f180::/34", "35908"}, - {"2620:171:1::/46", "42"}, - {"2803:f00:3::/45", "262182"}, - {"2a00:e120::/32", "20860"}, - {"240a:a781::/32", "144571"}, - {"2600:380:7c80::/39", "20057"}, - {"2800:600:212::/39", "52323"}, - {"240a:ab36::/32", "145520"}, - {"2600:1408:23::/45", "20940"}, - {"2604:d600:62e::/43", "32098"}, - {"2804:14d:8489::/41", "28573"}, - {"2c0f:ff30::/32", "37334"}, - {"2001:559:821b::/48", "33660"}, - {"2407:cc00::/32", "6660"}, - {"2602:fed2:7701::/48", "53356"}, - {"2804:f14:c100::/34", "262865"}, - {"2a0b:140::/29", "57773"}, - {"2001:559:831d::/48", "7015"}, - {"2001:678:7a8::/48", "13037"}, - {"2401:1d40:f8::/39", "23724"}, - {"2402:2f80:8::/48", "38001"}, - {"2804:3d4:2e::/43", "262401"}, - {"2001:559:124::/48", "33661"}, - {"2402:5d40::/32", "137079"}, - {"2620:115:c00e::/47", "2635"}, - {"2a06:79c0::/47", "15622"}, - {"2a0f:5701:3509::/48", "205593"}, - {"2407:1c00::/32", "26496"}, - {"2a02:26f7:b9::/48", "20940"}, - {"2001:559:8683::/48", "33660"}, - {"2403:fbc0:1000::/48", "23959"}, - {"2408:8456:6a00::/42", "17622"}, - {"2408:8459:8a30::/41", "17622"}, - {"2620:16e:487::/48", "3147"}, - {"2804:18c0::/35", "61951"}, - {"2a00:1c10:100::/40", "50300"}, - {"2a0e:8380::/32", "57793"}, - {"2402:800:328d::/43", "7552"}, - {"2405:19c0:1::/32", "140810"}, - {"2604:9740::/32", "11252"}, - {"2803:3440:9100::/33", "263784"}, - {"2804:2728:702::/45", "263880"}, - {"2a00:1d36:cc0::/38", "9121"}, - {"2a01:5740::/31", "57763"}, - {"2a0b:1b00::/29", "49544"}, - {"2a0f:9400:771f::/48", "211767"}, - {"2001:43f8:dd0::/48", "328212"}, - {"240a:a95b::/32", "145045"}, - {"2804:aec::/32", "52928"}, - {"2001:559:304::/48", "33657"}, - {"2401:ce80::/36", "14340"}, - {"2406:daa0:6060::/44", "16509"}, - {"240a:a3c8::/32", "143618"}, - {"2602:fd6b::/36", "36043"}, - {"2a00:4802:1e00::/40", "13124"}, - {"2a02:6c8::/33", "56611"}, - {"2a02:26f7:be4c::/48", "36183"}, - {"2a06:e881:8222::/48", "210761"}, - {"2001:550:1602::/47", "174"}, - {"2001:18b8:46::/44", "29789"}, - {"240a:adaa::/32", "146148"}, - {"2800:300:84e0::/43", "27986"}, - {"2804:738c:c010::/34", "270922"}, - {"2a02:26f7:c3dd::/46", "20940"}, - {"2a04:6d40::/47", "197888"}, - {"2a0e:97c0:550::/44", "58336"}, - {"2001:43f8:7b0::/48", "37578"}, - {"2409:8051:802::/40", "56047"}, - {"2602:ff96:1fe::/48", "40676"}, - {"2804:18:10d0::/44", "10429"}, - {"2804:25bc:a::/42", "264299"}, - {"2a02:6b8:23::/40", "208722"}, - {"2001:559:8387::/48", "33650"}, - {"2401:d800:500::/42", "7552"}, - {"2401:f000:7::/48", "38477"}, - {"2402:3780:2::/47", "132789"}, - {"240a:a62d::/32", "144231"}, - {"2620:d4:8000::/48", "27250"}, - {"2804:7070::/32", "270727"}, - {"2a10:2040::/29", "204576"}, - {"2001:559:81a1::/48", "7922"}, - {"2001:678:4d8::/48", "212704"}, - {"2001:fd0:3401::/36", "10029"}, - {"240a:a16f::/32", "143017"}, - {"2607:f018:ffff::/48", "36375"}, - {"2804:14d:5c9c::/42", "28573"}, - {"2a03:d9c0:8000::/48", "3214"}, - {"2a0b:37c0::/29", "205728"}, - {"2607:f7a0:1::/46", "46562"}, - {"2620:132:e002::/48", "41690"}, - {"2803:5e00:b5::/39", "267765"}, - {"2a02:d400::/29", "50261"}, - {"2001:4de0:49::/48", "50525"}, - {"240a:a2f2::/32", "143404"}, - {"2607:f8c0:208::/48", "25885"}, - {"2a02:26f7:90::/48", "36183"}, - {"2a0a:6840::/29", "25317"}, - {"2001:1248:9ae6::/39", "11172"}, - {"2402:b940::/40", "138538"}, - {"2409:8d14:1900::/34", "56044"}, - {"240e:44d:2d80::/41", "4134"}, - {"2600:1408:8c01::/35", "20940"}, - {"2600:6c10:f207::/44", "20115"}, - {"2604:bc40:6000::/48", "14618"}, - {"2602:fc03::/36", "400231"}, - {"2a0a:e0c0::/29", "15755"}, - {"2400:1bc0::/32", "59368"}, - {"2a0e:d4c0::/29", "197706"}, - {"2001:559:c1b3::/48", "20214"}, - {"2400:fa80:1::/48", "133480"}, - {"2602:fd60::/43", "396503"}, - {"2804:7f40::/32", "271676"}, - {"2406:8800:9043::/45", "17465"}, - {"2406:e401::/32", "135053"}, - {"2804:14d:c200::/40", "28573"}, - {"2804:161c:400::/43", "263268"}, - {"2804:4f80:3e00::/39", "268330"}, - {"2a01:8f9::/32", "3209"}, - {"2001:559:843d::/48", "7016"}, - {"2001:559:c441::/48", "7922"}, - {"2001:5b0:4ed5::/44", "6621"}, - {"2400:3dc0:501::/38", "134371"}, - {"2603:c0f0:2910::/40", "6142"}, - {"2001:250:808::/46", "138182"}, - {"2001:4878:b151::/48", "12222"}, - {"2804:431:e000::/35", "27699"}, - {"2806:2a0:a00::/40", "28548"}, - {"2a0e:1200::/29", "209112"}, - {"2001:559:820d::/48", "7015"}, - {"2001:678:300::/48", "39892"}, - {"2001:4b20:0:193::/64", "65505"}, - {"2400:7400:e031::/48", "38044"}, - {"2408:8459:ef10::/42", "17623"}, - {"2600:6c10:62::/47", "20115"}, - {"2607:f370::/32", "8057"}, - {"2a00:17c0::/40", "12993"}, - {"2a01:8580::/32", "198089"}, - {"2001:df6:f000::/48", "133142"}, - {"2804:2ee8::/32", "262880"}, - {"2a01:5b0:12::/44", "8391"}, - {"2001:250:2032::/44", "24355"}, - {"2001:559:2fe::/47", "7922"}, - {"2401:13c0:e000::/36", "132652"}, - {"2a00:11c0:1337::/48", "42473"}, - {"2a02:26f7:bd51::/42", "20940"}, - {"2400:7400:e021::/48", "23736"}, - {"240e:1e:3000::/36", "4134"}, - {"2600:1009:b0d0::/42", "6167"}, - {"2804:1b94:640::/36", "52974"}, - {"2804:6a30::/32", "270318"}, - {"2a03:b940::/32", "206484"}, - {"2001:57a:9202::/47", "22773"}, - {"2408:8456:3400::/41", "17623"}, - {"240a:a203::/32", "143165"}, - {"2804:ea4::/32", "262965"}, - {"2a04:8240::/29", "6694"}, - {"2a06:1740::/29", "200652"}, - {"2a07:df00::/29", "41974"}, - {"2409:8a55:3c00::/39", "56040"}, - {"2803:6fa0:100::/48", "267790"}, - {"2804:4368:e000::/35", "267568"}, - {"2a07:6886::/32", "204860"}, - {"2402:8100:21d0::/45", "45271"}, - {"2405:7e00:17::/48", "17408"}, - {"2408:8456:5640::/39", "17816"}, - {"2604:ff40::/32", "30211"}, - {"2607:fc18::/36", "13706"}, - {"2806:2f0:3481::/46", "17072"}, - {"2a02:6ea0:cd77::/48", "60068"}, - {"2a0c:b641:560::/47", "210481"}, - {"2001:559:871b::/48", "7016"}, - {"2404:f080::/35", "131392"}, - {"2804:e24::/32", "262417"}, - {"2806:265:3300::/37", "13999"}, - {"2a04:4e40:7210::/41", "54113"}, - {"2a12:5900::/29", "204790"}, - {"2402:1e80::/50", "4672"}, - {"2408:8956:bb00::/40", "17816"}, - {"2607:fd28:a000::/48", "3725"}, - {"2a01:76c0::/29", "21263"}, - {"2a07:9700::/29", "202741"}, - {"2001:458::/32", "8002"}, - {"2001:1900:2366::/47", "202818"}, - {"2600:200d:3000::/36", "33517"}, - {"2404:1140:1::/44", "141439"}, - {"2404:4f80::/43", "58715"}, - {"2408:8956:19c0::/38", "17622"}, - {"2620:101:4034::/46", "16880"}, - {"2620:121::/45", "55219"}, - {"2a02:26f0:8001::/39", "20940"}, - {"2a02:4901::/32", "200128"}, - {"2a05:4f44::/30", "31012"}, - {"2001:978:904::/44", "174"}, - {"2001:df5:c080::/48", "134505"}, - {"2404:5d80:6800::/40", "33438"}, - {"2a01:540:d000::/34", "12389"}, - {"2a07:48c0::/29", "212629"}, - {"2402:3a80:740::/42", "38266"}, - {"2606:2800:4048::/48", "14210"}, - {"2803:cf00::/32", "264642"}, - {"2001:468:200::/40", "11537"}, - {"2402:800:b650::/39", "7552"}, - {"2a03:be80:2::/47", "15510"}, - {"2400:cb00:220::/44", "13335"}, - {"240a:a985::/32", "145087"}, - {"2602:80c:9000::/44", "400070"}, - {"2806:2f0:80e1::/46", "17072"}, - {"2a00:4802:4e20::/44", "13124"}, - {"240e:438:7620::/43", "140647"}, - {"2a02:c20::/32", "41453"}, - {"2804:2904:a12::/32", "262588"}, - {"2a0c:b641:10::/47", "205523"}, - {"2600:1017:9810::/34", "6167"}, - {"2804:2c14::/32", "265194"}, - {"2a00:1188::/44", "8455"}, - {"2a0f:9400:7700::/48", "20473"}, - {"2001:678:ddc::/48", "212989"}, - {"2001:4490:d8c0::/46", "9829"}, - {"2804:5698::/32", "268011"}, - {"2a0f:40c0::/29", "207929"}, - {"2001:678:fa8::/48", "211564"}, - {"2001:1248:9721::/46", "11172"}, - {"2a02:ac80::/43", "25145"}, - {"2a04:9fc0::/29", "1136"}, - {"2001:67c:2718::/48", "25068"}, - {"2401:3c0:211::/46", "45528"}, - {"2408:8656:30f1::/45", "17816"}, - {"2620:a5:2000::/48", "7018"}, - {"2804:104c:4800::/40", "263629"}, - {"2a02:b50:4012::/48", "29791"}, - {"2001:250:e20::/35", "23910"}, - {"2001:67c:680::/48", "202577"}, - {"2408:84f3:ea40::/35", "17816"}, - {"2409:8051:2800::/47", "56047"}, - {"2600:1011:b070::/39", "6167"}, - {"2803:2d60:1119::/36", "14754"}, - {"2804:5be8:4000::/32", "268876"}, - {"2a01:c50f:600::/36", "12479"}, - {"2a02:26f7:c70d::/42", "20940"}, - {"2a0c:7b81::/32", "47596"}, - {"2607:5e80:1000::/33", "13807"}, - {"2a10:2f00:17b::/48", "210074"}, - {"2409:8051:3800::/47", "56047"}, - {"2804:5d4c::/32", "268963"}, - {"2804:7f28::/32", "271670"}, - {"2a00:bd00::/32", "6898"}, - {"2a02:26f7:f040::/48", "36183"}, - {"2a04:5201:4::/48", "200740"}, - {"2a0e:6540:d16::/48", "208364"}, - {"2001:678:be4::/48", "207647"}, - {"2404:cdc0::/32", "138842"}, - {"2405:4802:9740::/31", "18403"}, - {"2800:160:1d8e::/47", "14259"}, - {"2a02:367:1566::/48", "42804"}, - {"2001:678:ff8::/48", "207812"}, - {"240a:ac91::/32", "145867"}, - {"240e:62:3000::/32", "4134"}, - {"2602:fc23:117::/48", "211946"}, - {"2607:400::/32", "30583"}, - {"2a02:26f7:cf01::/46", "20940"}, - {"2001:fd8:b080::/42", "132199"}, - {"2804:104c:ec00::/40", "263629"}, - {"2a0d:b201:50b0::/41", "206026"}, - {"2408:8256:2c83::/48", "17816"}, - {"2804:cec::/32", "52575"}, - {"2804:3f90::/32", "263081"}, - {"2806:230:6005::/48", "11888"}, - {"2a01:5040:a000::/48", "43996"}, - {"2401:8800:400::/40", "17439"}, - {"2409:892a::/27", "9808"}, - {"240a:a452::/32", "143756"}, - {"2804:2ccc::/35", "265244"}, - {"2001:559:c3f9::/48", "33662"}, - {"2001:67c:244::/48", "39822"}, - {"2402:800:5d63::/43", "7552"}, - {"2406:840:e500::/47", "211571"}, - {"2803:6900:559::/48", "52423"}, - {"2804:18:5868::/34", "26599"}, - {"2804:b18:8001::/44", "52941"}, - {"2a02:26f0:118::/48", "20940"}, - {"2a03:5640:f042::/48", "16509"}, - {"2001:559:8147::/48", "7015"}, - {"2602:feb4:1b0::/44", "25961"}, - {"2607:9e80:1201::/40", "397068"}, - {"2804:41f4::/37", "267468"}, - {"240a:a821::/32", "144731"}, - {"2600:6c20:c26::/47", "20115"}, - {"2620:160:e372::/48", "2011"}, - {"2804:1674::/44", "53231"}, - {"2001:559:826c::/48", "7015"}, - {"2001:4478:1a00::/34", "4802"}, - {"2400:7400:12::/42", "38044"}, - {"240a:a4a6::/32", "143840"}, - {"2405:db00::/32", "9268"}, - {"240a:a976::/32", "145072"}, - {"2a02:2478::/32", "51862"}, - {"2001:559:358::/48", "33651"}, - {"2001:67c:2a2c::/48", "49566"}, - {"2804:6ea8::/33", "270611"}, - {"2a0f:25c0::/48", "207077"}, - {"2001:250:3c18::/48", "23910"}, - {"2408:8956:7200::/40", "17622"}, - {"240a:a4e3::/32", "143901"}, - {"240e:3b3:8200::/35", "140316"}, - {"240e:438:5440::/38", "4134"}, - {"2a02:690::/29", "41960"}, - {"2a02:26f7:bd8c::/48", "36183"}, - {"2a06:cf00::/29", "62365"}, - {"2001:44b8:30a6::/44", "7545"}, - {"2405:1340::/32", "9654"}, - {"2a05:e880::/29", "50304"}, - {"2001:559:c4e3::/48", "33287"}, - {"2408:8956:a200::/40", "17622"}, - {"240a:ab0f::/32", "145481"}, - {"2600:140b:f401::/36", "20940"}, - {"2607:f758:1400::/33", "13649"}, - {"2a0f:5701:350a::/43", "206499"}, - {"2001:67c:10f4::/48", "211763"}, - {"240e:964:e400::/39", "133775"}, - {"2600:140f:1201::/37", "20940"}, - {"2804:3e2c::/32", "266578"}, - {"2a01:8f20::/32", "51863"}, - {"2001:67c:a8::/48", "197269"}, - {"2001:44b8:4058::/48", "7545"}, - {"2409:8904:4560::/38", "24547"}, - {"240a:a4dd::/32", "143895"}, - {"240a:a4f7::/32", "143921"}, - {"2604:3d00::/33", "6327"}, - {"2620:117:7010::/40", "26955"}, - {"2804:39a8::/32", "266042"}, - {"2a00:c320::/32", "42263"}, - {"2a02:26f0:d301::/37", "20940"}, - {"2401:d800:fe50::/42", "7552"}, - {"240e:679:e400::/39", "140330"}, - {"2600:1012:9100::/44", "6167"}, - {"2606:bc00:bf00::/33", "19419"}, - {"2800:160:1d81::/46", "14259"}, - {"2a02:6722::/32", "44234"}, - {"2a0c:9a40:8060::/44", "20473"}, - {"2401:f40::/32", "134732"}, - {"2401:4900:44c0::/42", "45609"}, - {"240a:a7c7::/32", "144641"}, - {"240e:b2:e000::/36", "136197"}, - {"2804:2d4:10::/44", "28244"}, - {"2a0e:7740::/32", "208490"}, - {"2403:300:a14::/48", "6185"}, - {"2a0b:6c80::/32", "12586"}, - {"2600:6c38:414::/44", "20115"}, - {"2804:187c::/32", "262673"}, - {"2001:559:7c9::/48", "20214"}, - {"2001:13d2:6807::/32", "7303"}, - {"2401:b740::/32", "137549"}, - {"2401:d800:f60::/40", "7552"}, - {"2406:daa0:1040::/44", "16509"}, - {"240a:aed5::/32", "146447"}, - {"2600:1f01:4814::/47", "16509"}, - {"2804:1258::/32", "263471"}, - {"2804:4ca0:200::/32", "267381"}, - {"2400:6800::/32", "10105"}, - {"2620:171:ce::/47", "42"}, - {"2804:40a8::/32", "265973"}, - {"2a0b:4342:1a2a::/45", "57578"}, - {"2a0d:5a80::/29", "21100"}, - {"2408:8924::/32", "4837"}, - {"2600:9000:1e41::/48", "16509"}, - {"2a02:88d:8030::/44", "48695"}, - {"2c0f:f498::/32", "37575"}, - {"2806:230:5007::/48", "11888"}, - {"2402:800:9647::/43", "7552"}, - {"2607:f9c0::/32", "22070"}, - {"2806:2f0:2062::/48", "17072"}, - {"2c0f:ea98::/32", "37347"}, - {"2001:67c:2f68::/48", "207748"}, - {"2402:800:9ea0::/43", "7552"}, - {"2403:0:11d::/38", "4755"}, - {"240e:44d:5900::/42", "140345"}, - {"2605:a401:80bc::/47", "33363"}, - {"2a06:e800::/32", "47950"}, - {"2001:1290::/31", "16735"}, - {"2404:8d02:48c9::/39", "9587"}, - {"2408:8957:1fc0::/34", "17622"}, - {"2409:8904:a140::/38", "24547"}, - {"240e:980:2b00::/40", "58563"}, - {"2600:1000:b0e2::/43", "22394"}, - {"2a01:348:63::/36", "39326"}, - {"2408:840d:c300::/42", "17621"}, - {"2a0f:9400:7719::/46", "53356"}, - {"2001:559:864f::/48", "33661"}, - {"2001:df0:1e::/50", "38794"}, - {"2a02:26f7:8e::/48", "36183"}, - {"2a02:26f7:f850::/48", "36183"}, - {"2001:67c:4c::/48", "35609"}, - {"2406:3400:dd::/38", "10143"}, - {"2602:fec9::/36", "46995"}, - {"2a0f:9f00::/29", "208206"}, - {"2001:559:8458::/48", "33287"}, - {"2001:67c:2878::/48", "8881"}, - {"2405:5440::/48", "56150"}, - {"2602:fea7::/38", "397270"}, - {"2804:370::/32", "262881"}, - {"2001:559:c1ac::/48", "20214"}, - {"2400:1a00:8011::/34", "17501"}, - {"2400:5200:1000::/40", "55410"}, - {"2607:fe88:1000::/33", "852"}, - {"2a01:1f8::/32", "34568"}, - {"2a04:c007::/32", "204248"}, - {"2a0c:e80::/29", "200000"}, - {"2408:873c::/31", "4837"}, - {"2605:a404:69c::/39", "33363"}, - {"2804:eb8::/32", "262970"}, - {"2804:19b8::/33", "52912"}, - {"2001:559:2fb::/48", "33287"}, - {"2001:5b0:5f00::/40", "6621"}, - {"2804:3a0::/32", "52960"}, - {"2a00:f10:ff02::/29", "48635"}, - {"2a03:84a0::/44", "29990"}, - {"2001:500:103::/48", "55002"}, - {"2001:6f8:1904::/40", "3257"}, - {"2408:8409:4800::/40", "4808"}, - {"2409:801f:3005::/46", "9808"}, - {"240a:a53e::/32", "143992"}, - {"240e:44d:5640::/42", "140347"}, - {"2600:3501:f000::/30", "396998"}, - {"2804:e64:667::/32", "262952"}, - {"2001:250:4008::/46", "24358"}, - {"2604:15c0::/32", "40187"}, - {"2a0b:8e80::/47", "43824"}, - {"2a11:7280::/29", "1239"}, - {"2620:22:a000::/48", "27580"}, - {"2a00:1728:2e::/47", "34224"}, - {"2001:250:4810::/42", "24360"}, - {"2604:d600:692::/45", "32098"}, - {"2804:1df8::/32", "264404"}, - {"2804:39f0::/32", "266060"}, - {"2a09:440::/29", "204790"}, - {"2a0e:2e00::/29", "9119"}, - {"2401:d800:7990::/42", "7552"}, - {"2605:1700::/32", "40029"}, - {"2001:559:c206::/48", "7016"}, - {"2402:e280:3d82::/43", "134674"}, - {"240a:a084::/32", "142782"}, - {"2620:1b2::/36", "26673"}, - {"2800:bf0:2800::/44", "52257"}, - {"240a:a6bc::/32", "144374"}, - {"2804:407c::/32", "28153"}, - {"2403:fc00::/38", "9443"}, - {"2602:fe19:2b::/34", "26073"}, - {"2602:feda:c30::/44", "209294"}, - {"2a05:1086:f000::/47", "141694"}, - {"2a0b:78c0::/32", "42830"}, - {"2a0c:b641:1::/48", "34872"}, - {"2801:19:b000::/48", "266666"}, - {"2a00:c540::/32", "57506"}, - {"2a01:9940:100::/47", "12807"}, - {"2a0a:4500::/29", "199163"}, - {"2001:559:862d::/48", "7016"}, - {"2400:a980:d00::/38", "133111"}, - {"2405:f940::/32", "139154"}, - {"2408:84f3:3610::/44", "17623"}, - {"2a00:4802:4a30::/39", "8717"}, - {"2a01:6d00::/43", "28726"}, - {"2a0b:b87:ffe9::/48", "202307"}, - {"2a0c:9a40:10a0::/48", "213288"}, - {"240e:3b2:f100::/37", "134775"}, - {"2600:370f:5141::/40", "32261"}, - {"2a02:b48:8000::/44", "39572"}, - {"2a0e:e704:60::/44", "212469"}, - {"2401:d800:72e0::/39", "7552"}, - {"2a02:26f7:bf0c::/48", "36183"}, - {"2600:140f:c400::/48", "9498"}, - {"2a03:75c0::/32", "197922"}, - {"2804:6820::/32", "269670"}, - {"2804:8594::/32", "272588"}, - {"2a02:fc8::/32", "42572"}, - {"2a0f:5707:ab20::/48", "3280"}, - {"2001:b28:999a::/34", "42065"}, - {"2001:df1:1b80::/48", "139364"}, - {"2401:ca40::/32", "136978"}, - {"240a:ad9b::/32", "146133"}, - {"2600:6c39:45b::/39", "20115"}, - {"2001:579:9395::/41", "22773"}, - {"2800:160:1b3c::/46", "14259"}, - {"2806:230:403f::/48", "11888"}, - {"2a01:4ce0:50::/48", "174"}, - {"2a04:1cc3::/29", "48635"}, - {"2a04:e1c0:1::/48", "12859"}, - {"2001:df7:b780::/48", "134505"}, - {"2408:8956:3400::/40", "17622"}, - {"240c:cda1::/32", "24357"}, - {"240e:108:25::/48", "134756"}, - {"240e:946:3007::/32", "58540"}, - {"2804:20c8::/32", "264514"}, - {"2a02:26f7:ed45::/46", "20940"}, - {"2a09:bac0:123::/45", "13335"}, - {"2a0b:31c0:563::/48", "205726"}, - {"2403:9500::/32", "9657"}, - {"2408:8956:8200::/40", "17622"}, - {"2600:804:441::/31", "701"}, - {"2001:df2:c900::/48", "38635"}, - {"2001:fd8:120::/48", "132199"}, - {"2400:7400:3b::/48", "23736"}, - {"2602:fed2:7123::/48", "206607"}, - {"2607:2200::/32", "17090"}, - {"2800:800:970::/48", "26611"}, - {"2001:678:110::/48", "57436"}, - {"2001:67c:2cc0::/48", "5588"}, - {"2001:df7:7d80::/48", "141909"}, - {"240e:3b5:f700::/36", "4134"}, - {"2a02:26f7:cec5::/46", "20940"}, - {"2001:559:c13d::/48", "7016"}, - {"2001:978:3401::/36", "174"}, - {"2604:e080::/32", "32458"}, - {"2804:14d:d682::/41", "28573"}, - {"2a07:3b00::/29", "198024"}, - {"2001:db0:5000::/34", "17766"}, - {"2402:800:36e0::/44", "7552"}, - {"2408:8957:3500::/40", "17816"}, - {"2600:1406:601::/39", "20940"}, - {"2605:f700:400::/38", "18978"}, - {"2610:18:8104::/48", "22550"}, - {"2804:21f8:50::/39", "262272"}, - {"2804:50a4::/32", "268401"}, - {"2a0e:b106:20::/44", "203038"}, - {"2001:559:c30b::/48", "33659"}, - {"2408:8256:3d9c::/46", "17623"}, - {"2602:fc09::/40", "13780"}, - {"2804:1bd8:4a00::/37", "28224"}, - {"240e:3bf:7800::/39", "4134"}, - {"2001:57a:4044::/34", "22773"}, - {"2001:e68:20db:12::/32", "4788"}, - {"2402:800:f020::/41", "7552"}, - {"2606:2800:247::/44", "15133"}, - {"2620:137:7000::/40", "396322"}, - {"2804:2e10::/32", "265320"}, - {"2a0b:9b00:401::/38", "62240"}, - {"2401:b080:64::/32", "133748"}, - {"2804:4138::/32", "266011"}, - {"2a02:e540::/29", "8661"}, - {"2001:550:2200:205::/62", "174"}, - {"2605:a401:8c0a::/41", "33363"}, - {"2804:30f8::/36", "264984"}, - {"2804:430c::/32", "267545"}, - {"2001:388:607c::/48", "135893"}, - {"2001:67c:2418::/48", "9023"}, - {"2001:44b8:605e::/48", "7545"}, - {"2408:8456:8a00::/42", "17622"}, - {"240e:30e:4a00::/35", "137688"}, - {"2804:230::/32", "53211"}, - {"2804:5ac4:20::/43", "268795"}, - {"2408:8459:e50::/35", "17816"}, - {"240a:a5e9::/32", "144163"}, - {"2a09:de40::/32", "209198"}, - {"2804:14d:2c00::/40", "28573"}, - {"2804:34e4::/32", "264985"}, - {"2804:5b14::/34", "268817"}, - {"2a02:330:8::/47", "209456"}, - {"2a0f:2ec0::/29", "60262"}, - {"2a03:ca40::/32", "197727"}, - {"2406:ef80:1::/45", "63473"}, - {"2408:84f3:3490::/38", "17816"}, - {"2409:8c1f:8fa0::/41", "9808"}, - {"240a:ae44::/32", "146302"}, - {"2600:6c20:c53::/39", "20115"}, - {"2605:3380:4a00::/40", "12025"}, - {"2001:559:c320::/48", "33657"}, - {"2400:89c0:2200::/48", "37936"}, - {"2602:fed2:770b::/48", "34924"}, - {"2607:f368:1000::/46", "32982"}, - {"2a0c:d2c6::/32", "7007"}, - {"2a0f:d080::/29", "57756"}, - {"2001:400:201:73::/61", "3425"}, - {"2607:fe98::/32", "10947"}, - {"2a00:d2c0:5::/32", "12975"}, - {"2a02:7800::/32", "15582"}, - {"2a06:e040:7602::/47", "198507"}, - {"2001:4998:48::/43", "10310"}, - {"2401:d800:7cc0::/42", "7552"}, - {"2409:8907:8320::/37", "24547"}, - {"240e:45c:100::/40", "137266"}, - {"2604:f80::/46", "22458"}, - {"2620:10a:80ef::/48", "55195"}, - {"2620:128:2000::/44", "395287"}, - {"2804:75fc::/32", "271082"}, - {"2001:df2:3a80::/48", "138270"}, - {"2401:2900:8888::/48", "23679"}, - {"2405:8f40:1::/48", "54994"}, - {"2602:fdc4::/48", "63430"}, - {"2604:6840:ac10::/48", "20446"}, - {"2605:e240:b::/48", "16509"}, - {"2a03:ec00:b200::/40", "12847"}, - {"2001:15c0::/29", "21283"}, - {"2001:559:184::/48", "33490"}, - {"2a02:2455::/33", "35244"}, - {"2a02:2e02:2490::/41", "12479"}, - {"2402:4e00:2::/45", "45090"}, - {"2403:200::/32", "45461"}, - {"2a00:4520:9::/32", "42961"}, - {"2a0c:1d80::/29", "31480"}, - {"2a11:a6c0::/46", "3269"}, - {"2001:3c8:e10e::/48", "137546"}, - {"2401:d800:fa40::/42", "7552"}, - {"240e:97d:4000::/34", "58543"}, - {"2606:b800::/32", "25983"}, - {"2a02:26f7:d440::/48", "36183"}, - {"2001:559:196::/48", "7016"}, - {"2001:559:4db::/48", "7015"}, - {"2001:678:efc::/48", "212135"}, - {"2803:26e0:a1fa::/48", "269955"}, - {"2804:1924::/32", "61774"}, - {"2804:6ac4:2000::/36", "16921"}, - {"2806:2f0:24c3::/43", "22884"}, - {"2a02:26f7:e541::/46", "20940"}, - {"2a0c:e303::/32", "211882"}, - {"2001:250:6030::/47", "24364"}, - {"2400:cb00:384::/46", "13335"}, - {"2a00:cb80::/32", "35393"}, - {"2400:8500:2000::/36", "58791"}, - {"2406:da18::/36", "16509"}, - {"2600:370f:33c4::/44", "32261"}, - {"2604:4dc0::/32", "54483"}, - {"2804:3160:4::/33", "265010"}, - {"2a02:26f7:e80c::/48", "36183"}, - {"2a09:be40:3100::/40", "213167"}, - {"2001:2f8::/32", "2907"}, - {"2001:559:8794::/48", "33657"}, - {"2606:2800:7001::/46", "15133"}, - {"2804:1b04:14::/44", "53048"}, - {"2804:54c0::/32", "268668"}, - {"2a04:4e40:1430::/41", "54113"}, - {"2a0a:2b00:20::/48", "16509"}, - {"2a0c:a4c0::/29", "202451"}, - {"2405:7f00:a020::/40", "133414"}, - {"2602:fd55::/47", "45250"}, - {"2804:1c94::/32", "61663"}, - {"2a02:26f7:e148::/48", "36183"}, - {"2a0d:2687::/32", "209650"}, - {"2804:1e2c:200::/40", "264412"}, - {"2001:67c:2b74::/48", "3320"}, - {"2001:e60:d400::/42", "4766"}, - {"240e:44d:4340::/42", "140359"}, - {"2a00:a760::/32", "41216"}, - {"2a04:ff00:600::/40", "206634"}, - {"2a06:ba00::/48", "34775"}, - {"2a0a:c5c0::/29", "29423"}, - {"2001:67c:1588::/48", "198168"}, - {"2001:910::/32", "20766"}, - {"2402:800:97e0::/44", "7552"}, - {"240e:267:7000::/38", "140335"}, - {"240e:3bd:c800::/37", "4134"}, - {"2a03:d5c0:a000::/40", "199391"}, - {"2001:df6:cc00::/48", "55683"}, - {"2402:1f00:8300::/33", "16276"}, - {"2406:9e00:6::/44", "55352"}, - {"240a:a037::/32", "142705"}, - {"2803:efa0::/32", "267792"}, - {"2001:678:430::/47", "205956"}, - {"2402:800:9471::/40", "7552"}, - {"2408:4000::/28", "37963"}, - {"2602:fbeb::/36", "46685"}, - {"2001:250:80c::/48", "23910"}, - {"2606:a300:5::/32", "35847"}, - {"2001:3c8:9007::/48", "9464"}, - {"2001:678:66c::/48", "200924"}, - {"2600:1005:b100::/41", "6167"}, - {"2804:160::/32", "28195"}, - {"2804:f14::/32", "262865"}, - {"2a02:68a0::/32", "201906"}, - {"2001:559:430::/48", "33489"}, - {"2001:b18:10::/48", "47787"}, - {"2402:800:fb40::/42", "7552"}, - {"2405:aac0:221::/46", "139949"}, - {"240a:a042::/32", "142716"}, - {"240a:a5dc::/32", "144150"}, - {"240a:a725::/32", "144479"}, - {"2a02:4280::/32", "40981"}, - {"2a03:5dc0:6::/48", "13032"}, - {"2a0b:3c40:10::/48", "1239"}, - {"2a0c:1100::/32", "781"}, - {"2a0e:b107:1710::/44", "210826"}, - {"2001:559:870b::/48", "7015"}, - {"2408:8459:ae10::/42", "17623"}, - {"2602:fc97:50::/48", "399544"}, - {"2804:168:1000::/48", "28279"}, - {"2804:222c::/38", "264596"}, - {"2804:5d2c::/47", "268955"}, - {"2a00:1ca8:8a::/43", "50673"}, - {"2a01:488:bb07::/44", "20773"}, - {"2a0e:b107:ea8::/46", "211640"}, - {"2402:800:3efe::/33", "7552"}, - {"2408:84f3:4810::/42", "134543"}, - {"2600:6c3b:424::/44", "20115"}, - {"2a00:db60:4000::/48", "15224"}, - {"2a02:e60::/32", "47506"}, - {"2a0f:39c0::/29", "60781"}, - {"2001:dd8:7::/48", "187"}, - {"2001:1878:405::/40", "226"}, - {"2607:f330:6aab::/37", "15130"}, - {"2804:591c:30::/32", "28370"}, - {"2a00:1cb8:2000::/35", "12713"}, - {"2a00:4802:2e00::/41", "13124"}, - {"2a0f:3dc0::/29", "207902"}, - {"2001:da8:6000::/48", "24355"}, - {"2a01:b740:a06::/48", "6185"}, - {"2001:559:8311::/48", "7922"}, - {"2001:1270:4000::/34", "22011"}, - {"2620:132:7090::/41", "19537"}, - {"2804:16d8:4000::/35", "262729"}, - {"2001:559:c0af::/48", "33491"}, - {"2001:df0:201::/48", "1221"}, - {"2804:14d:ba84::/46", "28573"}, - {"2806:109f:1::/48", "8151"}, - {"2a02:e040::/29", "43995"}, - {"2001:1248:552c::/43", "11172"}, - {"2400:5300::/47", "45815"}, - {"2401:7400:c002::/36", "4773"}, - {"2409:896a:9000::/39", "9808"}, - {"2600:9000:1e1a::/45", "16509"}, - {"2605:6700::/32", "11976"}, - {"2803:9800:9012::/42", "11664"}, - {"2a02:26f7:cbc9::/42", "20940"}, - {"2001:502:ad09::/48", "397226"}, - {"2001:e60:100a::/41", "4766"}, - {"2620:ef:8000::/48", "35977"}, - {"2a0e:aa07:e010::/48", "208370"}, - {"2001:67c:38c::/48", "43081"}, - {"2001:67c:774::/48", "64424"}, - {"2001:4b60::/40", "28857"}, - {"2409:896a:5f00::/34", "9808"}, - {"2604:2d80:6880::/38", "30036"}, - {"2804:14c:5900::/41", "28573"}, - {"2804:a8c:400::/32", "262299"}, - {"2a00:14b8::/32", "49826"}, - {"2a04:4e40:4610::/44", "54113"}, - {"2405:1c0:6461::/45", "55303"}, - {"2607:f020:2000::/40", "40289"}, - {"2620:123:7000::/44", "46757"}, - {"2804:14c:8794::/42", "28573"}, - {"2a00:1e50::/33", "34006"}, - {"2a03:d60:2::/48", "201743"}, - {"2a07:a40:c::/48", "205112"}, - {"2001:559:86b6::/48", "33660"}, - {"2600:1419:e800::/48", "61580"}, - {"2804:5f64::/32", "269096"}, - {"2806:230:6019::/48", "11888"}, - {"2401:8a40:44::/46", "45326"}, - {"2800:160:1b6a::/43", "14259"}, - {"2803:ec60::/32", "267850"}, - {"2804:6338::/32", "269347"}, - {"2804:8564::/35", "262313"}, - {"2a03:980:1::/46", "20645"}, - {"2001:550:a905::/44", "174"}, - {"2001:559:314::/48", "33491"}, - {"2001:559:7d7::/48", "33654"}, - {"2001:559:c52f::/48", "33490"}, - {"2001:67c:788::/48", "16509"}, - {"2001:1458::/31", "513"}, - {"2a02:26f7:cf08::/47", "36183"}, - {"2a03:7203::/32", "42322"}, - {"2a06:8ec0:3::/48", "7489"}, - {"2a07:9b40:d00f::/48", "39702"}, - {"2401:d800:a50::/42", "7552"}, - {"2404:c0:33a0::/33", "23693"}, - {"2001:1b10::/32", "29259"}, - {"2001:3c8:a702::/48", "132879"}, - {"2402:800:5b0f::/43", "7552"}, - {"2405:8a00:a055::/33", "55824"}, - {"2409:8044:2b14::/28", "24445"}, - {"2605:a404:6a::/43", "33363"}, - {"2a0e:8f02:2171::/46", "211168"}, - {"2408:8456:2040::/40", "17816"}, - {"240e:438:9820::/43", "140647"}, - {"2600:140f:2400::/48", "9498"}, - {"2804:568:601::/32", "262514"}, - {"2a0c:5000:3085::/30", "60502"}, - {"2607:3200::/46", "11240"}, - {"2804:27b4::/32", "53124"}, - {"2a01:64c0::/32", "45012"}, - {"2a02:6b0::/32", "24638"}, - {"2001:43f8:d00::/48", "33764"}, - {"2001:44c8:4150::/40", "131445"}, - {"2402:800:3d2b::/41", "7552"}, - {"2605:b240::/48", "13820"}, - {"2803:9100::/32", "52409"}, - {"2804:18:6058::/45", "10429"}, - {"2804:2a60:182::/32", "263089"}, - {"2a01:5043:2eff::/48", "202196"}, - {"2a0e:f500:1::/46", "60781"}, - {"2001:579:192c::/43", "22773"}, - {"2001:1900:225d::/48", "10753"}, - {"2600:1419:5401::/36", "20940"}, - {"2605:9d80:a000::/48", "36678"}, - {"2a05:ff80::/29", "8758"}, - {"2a07:3147::/32", "48408"}, - {"2001:559:c49f::/48", "33651"}, - {"2402:1100::/32", "132035"}, - {"2602:107:2410::/48", "20115"}, - {"2804:67d8::/32", "269654"}, - {"2406:daa0:60a0::/44", "16509"}, - {"2402:13c0:1::/48", "7474"}, - {"2606:2800:4ae8::/46", "15133"}, - {"2804:8054:2000::/40", "271744"}, - {"2409:873d::/25", "9808"}, - {"240e:45c:3800::/40", "131285"}, - {"2a02:24d8::/32", "21473"}, - {"2a05:22c0::/29", "42567"}, - {"2001:fd8:264::/46", "132199"}, - {"2001:4878:4062::/47", "12222"}, - {"2001:4888:8061::/48", "22394"}, - {"2606:b400:8006::/48", "792"}, - {"2804:6fa0::/32", "270673"}, - {"2a00:7380::/37", "51906"}, - {"2a01:8c9::/29", "3209"}, - {"2402:3a80:800::/44", "38266"}, - {"2405:f080:1e00::/46", "136907"}, - {"240a:a353::/32", "143501"}, - {"2a05:e580::/32", "63399"}, - {"2001:4830:c170::/48", "22147"}, - {"2401:9d00:2::/39", "9835"}, - {"2405:8a00:4015::/44", "55824"}, - {"2804:2938::/32", "264004"}, - {"2a02:798::/32", "31688"}, - {"2a02:26f7:b940::/48", "36183"}, - {"2a0c:8640::/30", "3257"}, - {"240e:44d:e00::/42", "140345"}, - {"2a00:c20::/32", "29611"}, - {"2a01:9e40::/32", "31287"}, - {"2a0f:2b40::/29", "60262"}, - {"2001:550:1208::/39", "174"}, - {"2402:800:71b0::/41", "7552"}, - {"2408:8256:3281::/48", "17623"}, - {"2603:c011::/36", "31898"}, - {"2620:0:5010::/48", "30094"}, - {"2804:3cec::/32", "266242"}, - {"2001:678:610::/48", "202967"}, - {"2001:e68:2001:2::/40", "4788"}, - {"2406:840:fef0::/48", "136591"}, - {"2804:ae0:2801::/38", "28352"}, - {"2c0f:ee40:3000::/36", "36666"}, - {"2001:559:847d::/48", "33287"}, - {"2400:da00:401::/45", "38365"}, - {"2607:fcc8:5000::/36", "11955"}, - {"2803:3b80:c000::/36", "263702"}, - {"2804:3824::/32", "266459"}, - {"2001:559:c278::/48", "7015"}, - {"2a02:ee80:406d::/46", "3573"}, - {"2a05:2d01::/32", "64404"}, - {"2a0d:bf80::/29", "206576"}, - {"2400:b200::/33", "37963"}, - {"2401:d800:7c22::/41", "7552"}, - {"2607:fd28:a008::/48", "36086"}, - {"2001:250:e04::/44", "138375"}, - {"2001:559:86a2::/47", "7922"}, - {"2604:da00::/36", "31745"}, - {"2610:1e0:1800::/48", "1657"}, - {"2a01:4ae0::/32", "59933"}, - {"2001:67c:23fc::/48", "41352"}, - {"2409:8052::/47", "56047"}, - {"240a:aabc::/32", "145398"}, - {"2600:1480:1801::/37", "20940"}, - {"2804:18:7840::/43", "26599"}, - {"2400:a980:30f3::/45", "133513"}, - {"2402:8400:6::/48", "17820"}, - {"2404:3d00:41a3::/48", "3573"}, - {"2804:3ec8::/32", "266620"}, - {"2a00:4720::/32", "42442"}, - {"2001:559:83f1::/48", "7725"}, - {"240a:a736::/32", "144496"}, - {"240e:45c:6400::/40", "131285"}, - {"2a0b:340::/32", "43886"}, - {"2400:eb40:4005::/48", "14821"}, - {"240e:a67:1a00::/34", "140330"}, - {"2a02:26f7:11d::/48", "20940"}, - {"2a07:59c1:30c0::/43", "140731"}, - {"2001:559:8669::/48", "33491"}, - {"2001:4888:8045::/46", "22394"}, - {"2603:90f5:400::/40", "11955"}, - {"2804:2894::/32", "263969"}, - {"2806:250:1c::/46", "28509"}, - {"2a02:26f7:c418::/48", "36183"}, - {"2c0f:ed70::/32", "327822"}, - {"2409:8d1b::/29", "9808"}, - {"240a:ae45::/32", "146303"}, - {"2a00:1560:1112::/32", "29684"}, - {"2a00:1780:dc00::/40", "210213"}, - {"2a02:6c20:3::/48", "201922"}, - {"2401:4900:ea0::/43", "45609"}, - {"240e:9b:f027::/44", "140258"}, - {"2a0b:4340:82::/47", "134176"}, - {"2c0f:f348:b::/35", "24757"}, - {"2600:100b:b1e0::/33", "6167"}, - {"2600:1419:3c01::/38", "20940"}, - {"2800:160:2016::/44", "14259"}, - {"2804:4be4::/32", "267335"}, - {"2401:d800:b9d0::/42", "7552"}, - {"2603:faf0::/23", "397165"}, - {"2606:13c0::/48", "10843"}, - {"2804:7b3c::/32", "271419"}, - {"2a09:3d03::/32", "210625"}, - {"2a0e:1d40::/29", "212655"}, - {"2a0e:3200::/29", "12843"}, - {"2001:4408:201::/35", "4758"}, - {"2a00:c38::/32", "15576"}, - {"2a00:18f8::/32", "31416"}, - {"2001:559:76b::/48", "21508"}, - {"2a01:8840:25::/48", "207266"}, - {"2a03:9980:1930::2/29", "30742"}, - {"2600:1407:c801::/35", "20940"}, - {"2620:189::/36", "16957"}, - {"2806:250:10::/48", "28555"}, - {"2806:2f0:2160::/40", "17072"}, - {"2a02:b80::/29", "30740"}, - {"2405:84c0:ff60::/44", "139782"}, - {"2406:9e00::/45", "55352"}, - {"2804:f2c::/33", "53191"}, - {"2a00:6cc0::/48", "62407"}, - {"2a00:7540::/29", "25145"}, - {"2a02:ad8:2e00::/33", "12389"}, - {"2a02:26f7:e780::/48", "36183"}, - {"2a03:e400::/32", "45005"}, - {"2001:559:85ac::/48", "7922"}, - {"2001:db0::/35", "17766"}, - {"240e:679:c400::/39", "140330"}, - {"2804:694c:c000::/34", "270261"}, - {"2a12:7bc0:104::/47", "204903"}, - {"2001:1a11:a8::/45", "42298"}, - {"2403:cfc0:1006::/48", "395092"}, - {"240a:ab74::/32", "145582"}, - {"240e:3b1:ac00::/35", "4134"}, - {"2804:84ec::/32", "272284"}, - {"2a0f:8640:b00b::/48", "212149"}, - {"2001:579:184c::/40", "22773"}, - {"2001:678:220::/48", "52022"}, - {"2605:5080:5011::/42", "3367"}, - {"2605:6ac0:5000::/36", "400475"}, - {"2606:6e80::/32", "33548"}, - {"2804:1f16::/32", "265190"}, - {"2a03:67e0::/32", "201201"}, - {"2001:3c8:9008::/48", "4621"}, - {"2001:44b8:1058::/46", "4739"}, - {"2a02:26f7:f180::/48", "36183"}, - {"2a06:5040:30::/45", "6134"}, - {"2400:8300::/32", "10002"}, - {"2604:880:64::/47", "29802"}, - {"2801:80:1930::/48", "264979"}, - {"2801:15c::/48", "14080"}, - {"2a01:5da0::/32", "15397"}, - {"2a02:53a0::/32", "35280"}, - {"2001:500:125::/48", "396566"}, - {"2400:adc0:4200::/46", "9541"}, - {"2404:f240::/32", "134863"}, - {"240e:6b3:2000::/32", "4134"}, - {"2804:23c4::/32", "264181"}, - {"2806:1070:cefe::/48", "20940"}, - {"2a00:1570::/32", "39308"}, - {"2001:559:c343::/48", "33490"}, - {"2405:6c40:4::/44", "24527"}, - {"2804:1e70:4000::/34", "264429"}, - {"2a0c:f587:fffe::/47", "200334"}, - {"2a10:4a00::/29", "399975"}, - {"2620:5f:8000::/48", "33281"}, - {"2a00:be00::/32", "29226"}, - {"2001:559:2df::/48", "33652"}, - {"2409:8057:3040::/43", "56040"}, - {"2a06:e881:4405::/48", "203801"}, - {"240a:ac8e::/32", "145864"}, - {"2804:8140:2000::/32", "272442"}, - {"2a0e:1b07::/32", "49436"}, - {"2001:67c:548::/48", "56513"}, - {"2402:3a80:1ee0::/43", "38266"}, - {"240a:aa88::/32", "145346"}, - {"2606:df80::/32", "64227"}, - {"2804:4ba0::/32", "267319"}, - {"2001:550:2403::/39", "174"}, - {"2001:579:d10c::/42", "22773"}, - {"240e:44d:5a80::/41", "4134"}, - {"2600:370f:5068::/40", "32261"}, - {"2605:c9c0::/32", "398371"}, - {"2a02:7a00:6::/48", "197895"}, - {"2001:250:2100::/48", "138381"}, - {"2001:67c:1ba8::/48", "49494"}, - {"240a:a2ce::/32", "143368"}, - {"2800:420::/30", "5639"}, - {"2804:510c::/33", "61594"}, - {"2a10:2f01:100::/48", "39753"}, - {"240a:a1be::/32", "143096"}, - {"240e:967:ec00::/35", "4134"}, - {"2a02:88d:401f::/48", "47794"}, - {"2a0d:3580::/35", "200303"}, - {"2804:1058::/32", "262988"}, - {"2a0c:7900::/29", "205052"}, - {"2001:559:490::/48", "7922"}, - {"2001:dcc:403::/48", "23599"}, - {"2600:9000:1030::/48", "16509"}, - {"2800:160:1928::/43", "14259"}, - {"2804:3d04::/32", "266248"}, - {"2001:559:7bc::/48", "7016"}, - {"2600:6c3b:42a::/40", "20115"}, - {"2606:6200::/35", "21570"}, - {"2804:1b1c:f000::/36", "61709"}, - {"2a02:26f7:c04c::/48", "36183"}, - {"2001:678:700::/48", "50464"}, - {"2804:ee8::/32", "262704"}, - {"2804:4778::/32", "267056"}, - {"2a03:c980:dead::/48", "210079"}, - {"2604:3400:ca01::/48", "29169"}, - {"2804:38bc::/32", "266498"}, - {"2a02:26f7:bc::/48", "36183"}, - {"2a04:4e40:3c10::/41", "54113"}, - {"2407:b4c0:12::/48", "142366"}, - {"2804:6ac::/32", "262601"}, - {"2804:5888::/32", "268130"}, - {"2404:a8:4094::/48", "24514"}, - {"2a02:7f0::/32", "42739"}, - {"2a0b:2d87::/32", "35048"}, - {"2a0e:b107:d0::/44", "207968"}, - {"240e:3be:6400::/35", "140312"}, - {"2600:b00::/28", "36728"}, - {"2603:f7b8::/29", "397165"}, - {"2607:f6f8:2000::/35", "30170"}, - {"2a02:928:16::/32", "34108"}, - {"2a02:26f0:5601::/39", "20940"}, - {"2a02:26f7:bd08::/48", "36183"}, - {"2a0a:9880::/29", "44974"}, - {"2001:559:c452::/48", "33662"}, - {"2001:4878:259::/48", "12222"}, - {"2401:d800:29b0::/41", "7552"}, - {"2801:80:240::/48", "262511"}, - {"2001:1248:9731::/45", "11172"}, - {"2402:e40::/32", "23943"}, - {"2600:100b:a010::/39", "6167"}, - {"2610:b0:4128::/43", "3573"}, - {"2804:9d4:173::/38", "262996"}, - {"2001:559:c39a::/48", "33667"}, - {"2803:a2e0::/32", "269921"}, - {"2804:33bc::/32", "265414"}, - {"2a03:40e0::/32", "196932"}, - {"2a0e:1bc5::/35", "208621"}, - {"2001:b08:21::/45", "3267"}, - {"2001:4048:108::/48", "47341"}, - {"2a0e:b107:1182::/48", "210925"}, - {"2001:678:650::/48", "49472"}, - {"2800:160:1812::/45", "14259"}, - {"2a02:2ad8:120::/33", "702"}, - {"2a07:85c2::/48", "174"}, - {"2001:559:23c::/48", "7015"}, - {"240a:ad05::/32", "145983"}, - {"2a00:edc0:6259::/48", "62597"}, - {"2a0a:4080::/32", "47493"}, - {"2001:559:82b2::/48", "7725"}, - {"240a:aa97::/32", "145361"}, - {"2604:d800:1002::/32", "20355"}, - {"2001:67c:27b8::/48", "42428"}, - {"240e:982:b100::/40", "136190"}, - {"2607:fad0:40::/44", "53824"}, - {"2a03:1e40::/32", "197799"}, - {"2402:800:5963::/43", "7552"}, - {"2a01:bb20:3000::/32", "61969"}, - {"2a0c:e080::/44", "51095"}, - {"2607:f7c0:4100::/32", "36444"}, - {"2800:bf0:146::/44", "52257"}, - {"2804:7a80::/32", "271375"}, - {"2a00:5c20::/32", "199298"}, - {"2803:7ce0::/32", "23140"}, - {"2a02:2010:2300::/45", "20978"}, - {"2402:8100:27ea::/45", "55644"}, - {"2a03:5640:f560::/48", "16509"}, - {"2a0f:5701:3527::/32", "206499"}, - {"2c0f:f330::/32", "327950"}, - {"2408:840c:6e00::/40", "17621"}, - {"2606:2800:5033::/48", "15133"}, - {"2804:43c0::/32", "267588"}, - {"2804:5d14:800::/38", "268949"}, - {"2800:1e0:d02::/38", "7195"}, - {"2001:648:2c00::/48", "6867"}, - {"2001:7c0::/34", "553"}, - {"2001:19f0:a800::/35", "20473"}, - {"240e:108:4f::/42", "4134"}, - {"2600:1416:2001::/35", "20940"}, - {"2a02:26f7:eb8d::/42", "20940"}, - {"2001:67c:1124::/48", "60973"}, - {"2001:df3:b980::/48", "17538"}, - {"2407:e740:2::/39", "59239"}, - {"240a:ae39::/32", "146291"}, - {"2806:230:6018::/48", "265594"}, - {"2a00:8b00::/32", "35154"}, - {"2a01:4dc0::/42", "206618"}, - {"2402:8100:27e0::/47", "45271"}, - {"2804:3964::/32", "266028"}, - {"2804:3d34::/32", "266260"}, - {"2804:6b44::/32", "270389"}, - {"2a03:efc0:ba5e::/48", "33438"}, - {"2001:67c:1be0::/48", "210317"}, - {"2a03:af60::/32", "25513"}, - {"2a10:ca00:1::/48", "212217"}, - {"2408:84f3:3060::/40", "17623"}, - {"2409:8752:700::/36", "56047"}, - {"2803:6900:1531::/48", "52423"}, - {"2806:266:300::/41", "27672"}, - {"2804:56c:1200::/34", "28210"}, - {"2804:16d8:800::/38", "262729"}, - {"2001:559:36a::/48", "33490"}, - {"2001:978:8e00::/48", "197205"}, - {"240a:a6b2::/32", "144364"}, - {"2600:1407:3c01::/33", "20940"}, - {"2605:32c0:a001::/48", "14618"}, - {"2a02:cb80:2a40::/48", "43766"}, - {"2804:e24:fe40::/40", "262417"}, - {"2a02:26f7:d104::/48", "36183"}, - {"240a:a65a::/32", "144276"}, - {"2a05:27c0::/46", "210021"}, - {"2604:34c0::/32", "25780"}, - {"2806:230:1028::/48", "265594"}, - {"2806:230:4008::/48", "265594"}, - {"2a02:26f7:b90c::/48", "36183"}, - {"2401:d800:dce2::/39", "7552"}, - {"2405:6e00:2088::/45", "18291"}, - {"2407:5280:200::/45", "133557"}, - {"2804:1e84::/32", "264433"}, - {"2806:230:300b::/48", "11888"}, - {"2403:9800:7100::/37", "4771"}, - {"240e:967:d400::/39", "58772"}, - {"2804:6408::/32", "269399"}, - {"2001:559:8274::/48", "33660"}, - {"2409:8053:3802::/40", "56047"}, - {"2600:140f:4601::/36", "20940"}, - {"2602:fff8::/36", "13866"}, - {"2804:3ea0::/32", "266610"}, - {"2a01:47c1::/32", "41075"}, - {"2a02:d8a0::/32", "43709"}, - {"2a04:da00::/29", "60140"}, - {"240a:ac48::/32", "145794"}, - {"240e:108:11b2::/47", "58461"}, - {"240e:397:1e00::/34", "140495"}, - {"2804:6258::/32", "269291"}, - {"2001:559:65::/48", "33657"}, - {"2409:8958:ca54::/39", "56040"}, - {"2804:b0c::/32", "52935"}, - {"2804:30b0::/32", "264969"}, - {"2804:7e50::/32", "271616"}, - {"2a04:4e47::/46", "54113"}, - {"2a0d:c740:1c::/48", "49367"}, - {"2400:cb00:a8f0::/47", "13335"}, - {"240a:aa17::/32", "145233"}, - {"2620:c7:c000::/48", "394128"}, - {"2a00:11c0:dd::/48", "42473"}, - {"2a04:5740::/29", "43857"}, - {"2a06:a001:a060::/44", "210542"}, - {"2001:67c:244c::/48", "39293"}, - {"2403:0:607::/48", "38191"}, - {"2800:160:2042::/45", "14259"}, - {"2408:8456:5400::/42", "17622"}, - {"2001:559:8256::/48", "33651"}, - {"2406:2000:ec::/46", "24506"}, - {"2409:8087:6a37::/41", "9808"}, - {"240a:ae20::/32", "146266"}, - {"2603:c002:1a10::/42", "31898"}, - {"2804:131c::/32", "263516"}, - {"2a00:1228::/47", "31148"}, - {"2a04:f80::/29", "42858"}, - {"2001:4830:c150::/44", "22147"}, - {"2401:b8c0:b::/45", "64074"}, - {"2a02:26f7:ddc0::/48", "36183"}, - {"2a02:26f7:e744::/48", "36183"}, - {"2409:8c28:6093::/39", "56041"}, - {"2001:57a:f213::/40", "22773"}, - {"2409:895c::/26", "9808"}, - {"2606:8b40::/32", "21748"}, - {"2a02:26f7:e510::/48", "36183"}, - {"2600:6c38:73c::/41", "20115"}, - {"2804:14c:de43::/40", "28573"}, - {"2a00:d30:120::/45", "47201"}, - {"2a02:26f7:f080::/48", "36183"}, - {"2001:559:8497::/48", "7015"}, - {"2602:fcf6:ffb::/48", "210930"}, - {"2800:bf0:824b::/48", "52257"}, - {"2804:318c:2020::/32", "265023"}, - {"2806:2f0:20a3::/43", "22884"}, - {"2a01:190:15ee::/48", "28839"}, - {"2a02:2ae8::/39", "702"}, - {"2001:1248:98a7::/44", "11172"}, - {"240a:a4d0::/32", "143882"}, - {"2602:fc26:cd::/48", "213339"}, - {"2001:67c:2610::/48", "197964"}, - {"2804:7f7:a000::/35", "10429"}, - {"2a02:26f7:d400::/48", "36183"}, - {"2405:a040::/32", "131667"}, - {"2803:2ee0:3842::/32", "269983"}, - {"2803:f7e0:1040::/48", "271773"}, - {"2a00:1288:114::/40", "10310"}, - {"2a02:26f7:113::/45", "20940"}, - {"2408:8256:3292::/44", "17623"}, - {"240a:a539::/32", "143987"}, - {"2600:1406:f001::/37", "20940"}, - {"2602:fed2:fc3::/44", "53356"}, - {"2606:f300:2::/47", "14135"}, - {"2a01:288:4008::/48", "198941"}, - {"2a07:3b80:3::/48", "60781"}, - {"2001:559:c100::/48", "33659"}, - {"2400:7400::/44", "38044"}, - {"2401:1801:140::/36", "58683"}, - {"2602:fbe7::/40", "398898"}, - {"2605:9500::/45", "14244"}, - {"2a02:88d:22f::/48", "47794"}, - {"2a02:2ad0:633::/44", "702"}, - {"2a0f:9400:6225::/48", "48741"}, - {"2001:559:52f::/43", "33287"}, - {"2001:67c:24e8::/47", "47749"}, - {"240a:a773::/32", "144557"}, - {"240a:a8c4::/32", "144894"}, - {"2607:ffd8:214::/36", "33333"}, - {"2a01:8840:f1::/48", "207266"}, - {"2a09:2dc2::/32", "43180"}, - {"2001:559:79b::/48", "7922"}, - {"2408:840d:ab00::/42", "17621"}, - {"240a:a9b0::/32", "145130"}, - {"2001:678:c98::/48", "48025"}, - {"2001:67c:2ab4::/48", "3301"}, - {"2001:1840:c020::/44", "196"}, - {"2600:6c38:72b::/45", "20115"}, - {"2606:2800:6050::/48", "15133"}, - {"2804:14d:ce00::/40", "28573"}, - {"2804:2444::/32", "264211"}, - {"2a01:7d20:c00::/40", "203645"}, - {"2a0a:7a00::/29", "61317"}, - {"2600:9000:1083::/45", "16509"}, - {"2804:5d00::/32", "268945"}, - {"2a02:26f7:d740::/48", "36183"}, - {"2620:111:d002::/47", "18841"}, - {"2804:954:2000::/32", "263073"}, - {"2406:840:400::/48", "139317"}, - {"2409:8904:7e40::/39", "24547"}, - {"2803:6900:200::/48", "52423"}, - {"2804:10c0::/32", "263647"}, - {"2a04:a100::/29", "62183"}, - {"2a0b:e41:1::/46", "205809"}, - {"2001:559:769::/48", "33491"}, - {"2001:df3:8f80::/48", "140603"}, - {"2804:18:1860::/40", "26599"}, - {"2001:559:860b::/48", "7725"}, - {"2404:3d00:40a8::/45", "3573"}, - {"240e:13:807::/48", "140859"}, - {"2607:ff00:700::/40", "19181"}, - {"2800:110:3401::/36", "4270"}, - {"2806:230:4003::/48", "11888"}, - {"2a02:ee80:4074::/46", "3573"}, - {"2a0b:1d80::/29", "202694"}, - {"2001:44b8:9::/45", "4739"}, - {"2408:8956:2f00::/40", "17816"}, - {"240a:a0df::/32", "142873"}, - {"240e:109:8044::/48", "134768"}, - {"2600:6c38:b65::/43", "20115"}, - {"2607:4600::/32", "33339"}, - {"2607:f180:7300::/31", "35908"}, - {"2607:f6b8::/32", "4043"}, - {"2620:0:f00::/47", "6431"}, - {"2804:82f8::/32", "272168"}, - {"2a04:6c0::/29", "9067"}, - {"2001:559:479::/46", "7922"}, - {"2001:559:c0f9::/48", "7016"}, - {"2001:6d9::/29", "8323"}, - {"240a:a1c9::/32", "143107"}, - {"2804:368::/32", "22381"}, - {"2804:213c::/46", "264544"}, - {"2a0b:2d40:c10b::/34", "209135"}, - {"2001:bc8:2000::/32", "12876"}, - {"2804:1e64::/32", "264426"}, - {"2a02:26f7:bf00::/48", "36183"}, - {"2001:559:297::/48", "33660"}, - {"2402:3a80:1738::/48", "38266"}, - {"2408:84f3:a640::/36", "17816"}, - {"2610:a1:302c::/48", "12008"}, - {"2801:80:200::/48", "52997"}, - {"2804:20f8::/35", "264524"}, - {"2804:8648::/32", "272633"}, - {"2a03:bc00::/32", "29086"}, - {"2001:559:825c::/48", "33659"}, - {"2001:579:9260::/44", "22773"}, - {"2001:df7:6d80::/48", "139484"}, - {"2405:84c0:fa00::/40", "9886"}, - {"2610:b8::/32", "19021"}, - {"2a0d:7100::/45", "41033"}, - {"2409:802f:2a05::/48", "9808"}, - {"2001:559:83cd::/48", "33651"}, - {"2001:5e0:21::/46", "16713"}, - {"2400:adc1::/30", "9541"}, - {"2402:ef1b:2100::/40", "7633"}, - {"2409:806b:5d00::/29", "9808"}, - {"2600:100c:b280::/33", "22394"}, - {"2001:559:c383::/45", "7922"}, - {"2001:738:4::/48", "12303"}, - {"2406:840:fbb0::/48", "139058"}, - {"2800:160:1032::/41", "14259"}, - {"2804:2f40:a000::/33", "264880"}, - {"2001:559:3e3::/45", "33662"}, - {"2001:559:813d::/46", "33491"}, - {"2001:1248:84c5::/43", "11172"}, - {"2600:1406:8000::/48", "35994"}, - {"2620:1d5:9::/45", "14773"}, - {"2800:590:206d::/36", "7004"}, - {"2804:2ebc:200a::/32", "265363"}, - {"2001:df3:a800::/48", "133408"}, - {"2407:6380::/32", "131713"}, - {"2604:d600:15d2::/44", "32098"}, - {"2806:230:fffa::/45", "11888"}, - {"2408:840c:1300::/40", "17621"}, - {"240a:aee1::/32", "146459"}, - {"240e:67e:8c00::/33", "4134"}, - {"2a02:26f7:ca81::/46", "20940"}, - {"2401:4900:3760::/44", "45609"}, - {"2804:3840::/32", "266465"}, - {"2001:1248:4300::/44", "11172"}, - {"240e:f:c800::/37", "4835"}, - {"2600:370f:34e5::/44", "32261"}, - {"2602:fed2:7115::/46", "53356"}, - {"2a0f:5707:17::/48", "212592"}, - {"2a0f:9340:32::/47", "1299"}, - {"2a10:8700::/32", "207925"}, - {"2408:8406:3000::/39", "4808"}, - {"240a:aa05::/32", "145215"}, - {"2804:18:7000::/42", "26599"}, - {"2804:4760:c002::/34", "267050"}, - {"2001:67c:299c::/48", "56813"}, - {"2409:4003:3000::/27", "55836"}, - {"2803:1860:1200::/36", "267823"}, - {"2803:f200::/32", "52322"}, - {"2602:fdb3::/36", "397945"}, - {"2604:6600:2::/45", "40676"}, - {"2606:380::/32", "40545"}, - {"2803:af00::/32", "52453"}, - {"2a02:26f7:cb04::/48", "36183"}, - {"2a10:45c0::/32", "212808"}, - {"2409:8055:19::/45", "56040"}, - {"2800:bf0:a000::/44", "52257"}, - {"2a02:26f7:c488::/48", "36183"}, - {"2a12:7c00::/30", "210625"}, - {"2402:ef21:8000::/35", "7633"}, - {"240a:a38e::/32", "143560"}, - {"2600:1003:f850::/29", "22394"}, - {"2603:c0f8:1410::/39", "20054"}, - {"2a05:62c0::/29", "48360"}, - {"2402:b5c0::/32", "137553"}, - {"2602:802::/40", "397843"}, - {"2605:8300:d::/46", "33059"}, - {"2620:25:6000::/48", "15296"}, - {"2a02:26f7:dbc9::/46", "20940"}, - {"2a09:bfc0::/29", "44103"}, - {"2405:84c0:ff19::/48", "9886"}, - {"2a02:c744::/30", "199644"}, - {"2a0e:b107:af0::/44", "50798"}, - {"2001:2045::/27", "1299"}, - {"2404:bf40:8481::/42", "139084"}, - {"2605:7580::/32", "40107"}, - {"2804:204:313::/45", "28186"}, - {"2804:2fc0::/33", "264910"}, - {"2804:7bc4::/32", "271453"}, - {"2806:230:2002::/48", "265594"}, - {"2001:44b8:6068::/48", "7545"}, - {"2401:1700::/44", "55666"}, - {"2600:140f:cc01::/38", "20940"}, - {"2804:23b4::/32", "264178"}, - {"2804:5948::/32", "268181"}, - {"2a04:4e40:3e30::/41", "54113"}, - {"2a05:6200:73::/48", "201630"}, - {"2c0f:eea0::/32", "37288"}, - {"2001:559:c3d5::/48", "33650"}, - {"2001:df1:9180::/48", "139689"}, - {"2606:1540::/35", "398704"}, - {"2804:64d4::/32", "269452"}, - {"2806:230:4021::/48", "11888"}, - {"2001:559:8070::/47", "33490"}, - {"2001:559:c3ea::/48", "33657"}, - {"2001:67c:232c::/48", "207160"}, - {"2001:12e0:b000::/33", "10429"}, - {"2001:4998:15c::/48", "36752"}, - {"2406:daa0:8020::/44", "16509"}, - {"2602:fed2:7188::/48", "396881"}, - {"2804:1b9c::/32", "61737"}, - {"2a0d:6780::/29", "200899"}, - {"2001:67c:24e0::/48", "198141"}, - {"240a:aa98::/32", "145362"}, - {"2607:de00:3b::/38", "23498"}, - {"2804:35c0::/32", "266304"}, - {"2001:678:1d4::/48", "64449"}, - {"2606:8e80:4000::/48", "32133"}, - {"2a02:78::/32", "44514"}, - {"2a0b:1b82::/31", "206521"}, - {"2400:c700:11::/40", "55644"}, - {"2402:7b00:3::/48", "55843"}, - {"2620:10b:7000::/46", "11483"}, - {"2804:72a4::/32", "270866"}, - {"2a06:3380::/29", "12941"}, - {"2a0e:b107:eb1::/48", "212120"}, - {"2001:4430:c000::/42", "17853"}, - {"2409:8054:51::/46", "56040"}, - {"2602:ff16:1::/44", "29802"}, - {"2803:6c20::/32", "265830"}, - {"2a09:5140::/48", "34775"}, - {"2001:559:8096::/47", "22909"}, - {"2402:800:3871::/44", "7552"}, - {"2409:8c1e:5b80::/34", "9808"}, - {"2001:559:c2e9::/48", "33650"}, - {"2400:e940::/32", "136463"}, - {"240e:964:1800::/37", "133774"}, - {"2a02:26f7:f949::/46", "20940"}, - {"2a05:3e80::/29", "201211"}, - {"2405:ef00::/43", "58779"}, - {"2620:120:8000::/44", "393990"}, - {"2804:2984:780::/32", "53184"}, - {"2a0f:c087:e::/48", "212521"}, - {"240a:a8b5::/32", "144879"}, - {"240a:a9d2::/32", "145164"}, - {"2607:5500::/31", "54290"}, - {"2620:102:b001::/48", "7195"}, - {"2801:1fc:10::/48", "27951"}, - {"2804:14c:5584::/41", "28573"}, - {"2804:22cc::/37", "264123"}, - {"2a0c:7e45:d430::/48", "20473"}, - {"2001:dce:9400::/48", "45285"}, - {"2001:454e:c011::/34", "9924"}, - {"2409:8520::/27", "9808"}, - {"240a:ae5b::/32", "146325"}, - {"2001:559:825a::/48", "7725"}, - {"2607:f8b0::/33", "15169"}, - {"2a00:b6e0::/32", "60362"}, - {"2a0f:74c0::/29", "207572"}, - {"2620:e1:c000::/48", "56647"}, - {"2804:5b38::/32", "52842"}, - {"2806:332::/37", "265578"}, - {"2a00:1f28::/32", "43733"}, - {"2a04:2b87::/32", "47602"}, - {"2620:ed:4000::/48", "852"}, - {"2a09:900::/46", "15576"}, - {"2001:df2:9980::/48", "139889"}, - {"2402:a600::/32", "17996"}, - {"2600:1008:b1f0::/33", "22394"}, - {"2600:9c00::/32", "7979"}, - {"2804:21dc::/32", "264578"}, - {"2804:6934::/32", "270255"}, - {"2001:559:325::/48", "7725"}, - {"2001:df7:5280::/48", "138754"}, - {"2605:32c0:a004::/33", "5670"}, - {"2605:a404:c74::/40", "33363"}, - {"2806:230:5003::/48", "11888"}, - {"2405:1e00:ff00::/48", "9498"}, - {"2804:5024::/32", "262826"}, - {"240e:5e:10e0::/44", "140053"}, - {"2a0d:63c1::/32", "30721"}, - {"2001:1278:10::/32", "18734"}, - {"2401:d800:2b30::/41", "7552"}, - {"2405:1480:1000::/48", "4811"}, - {"2602:fed2:7314::/48", "53356"}, - {"2604:3b80:2833::/32", "31857"}, - {"2a01:b740:a22::/48", "6185"}, - {"2a03:f700::/32", "5563"}, - {"2409:8052:2000::/47", "56047"}, - {"2402:800:9b01::/44", "7552"}, - {"2600:1407:801::/38", "20940"}, - {"2001:67c:934::/48", "31662"}, - {"2403:9800:30::/39", "4648"}, - {"2409:8c3d::/25", "9808"}, - {"2804:518c::/32", "268459"}, - {"2a02:ee80:40d4::/46", "21433"}, - {"2408:8456:d040::/36", "17816"}, - {"2600:1014:9110::/36", "22394"}, - {"2600:1408:ac01::/38", "20940"}, - {"2804:2d78::/32", "265285"}, - {"2a02:2ae8:150::/32", "702"}, - {"2a0b:3080:8020::/33", "206516"}, - {"2001:559:c101::/46", "13367"}, - {"2404:59c0:4000::/32", "58507"}, - {"2804:5454::/32", "268643"}, - {"2404:bf40:f202::/40", "139084"}, - {"2600:1415:15::/48", "24319"}, - {"2a03:58a0::/32", "201330"}, - {"2001:1900:2285::/46", "3356"}, - {"2401:d800:f110::/42", "7552"}, - {"240a:a0dc::/32", "142870"}, - {"240a:a23e::/32", "143224"}, - {"240a:aab1::/32", "145387"}, - {"2600:140f:bc00::/48", "9498"}, - {"2605:a401:8ebc::/41", "33363"}, - {"2804:14d:ec00::/40", "28573"}, - {"2804:3298::/32", "265087"}, - {"2a02:26f7:59::/48", "20940"}, - {"2a02:2b80::/47", "45012"}, - {"2a0f:8ac1:a0a::/48", "205749"}, - {"2001:559:31b::/48", "7922"}, - {"240e:640:cf00::/34", "4134"}, - {"2a02:ee80:40c2::/43", "3573"}, - {"2a04:95c0::/29", "29611"}, - {"240a:aa58::/32", "145298"}, - {"240e:ff:c00b::/36", "4134"}, - {"2804:970:8000::/33", "263086"}, - {"2806:230:3018::/48", "265594"}, - {"2a04:34c0::/29", "47156"}, - {"2a10:cc42:1dba::/45", "20473"}, - {"2a11:90c0::/29", "204790"}, - {"2001:1388:4446::/36", "6147"}, - {"2404:5cc0::/32", "142122"}, - {"240a:aa6e::/32", "145320"}, - {"2804:204:235::/46", "28186"}, - {"2a02:26f7:dac9::/42", "20940"}, - {"2a0c:6c40:a4ef::/48", "20705"}, - {"2001:67c:18c::/48", "47682"}, - {"2001:df0:c200::/48", "131182"}, - {"2600:100d:fe10::/40", "22394"}, - {"2603:c002:8150::/38", "31898"}, - {"2a05:b8c0::/29", "203815"}, - {"2407:c940::/35", "48024"}, - {"2409:801e::/34", "24400"}, - {"2600:1001:b030::/40", "22394"}, - {"2804:76bc::/32", "271131"}, - {"2a00:f5c0::/32", "41369"}, - {"2a06:7f80::/29", "204035"}, - {"2001:559:87db::/48", "7015"}, - {"2001:1248:97b0::/44", "11172"}, - {"2401:3bc0:1014::/32", "137409"}, - {"2620:139:6006::/48", "22600"}, - {"2804:2744::/32", "263888"}, - {"2804:84cc::/34", "272541"}, - {"2a0e:3a87:ff00::/40", "208741"}, - {"2001:559:237::/48", "33661"}, - {"2400:a980:8ff::/48", "133111"}, - {"2409:8057:3807::/44", "56040"}, - {"2600:6c10:f069::/46", "20115"}, - {"2800:160:113d::/41", "14259"}, - {"2804:74a8:200::/32", "270995"}, - {"2a02:26f0:1e::/42", "20940"}, - {"2a02:26f0:a800::/48", "34164"}, - {"2a0c:b641:530::/44", "210597"}, - {"2a0e:2800::/29", "63023"}, - {"2001:500:53::/45", "12041"}, - {"2401:c900:1f00::/34", "36351"}, - {"2a02:26f7:b3c0::/48", "36183"}, - {"2a0f:9400:770a::/48", "211481"}, - {"2404:f4c0:f608::/41", "139328"}, - {"2a0c:5247:3000::/36", "59504"}, - {"2a0f:1201::/32", "62240"}, - {"2602:fdfa::/36", "397332"}, - {"2803:2a00:2000::/35", "27895"}, - {"2803:6580::/32", "265839"}, - {"2804:2198::/32", "52807"}, - {"2001:559:834f::/48", "33287"}, - {"2403:f880:6000::/39", "33438"}, - {"2604:6640::/32", "3131"}, - {"2620:13b:3000::/48", "13607"}, - {"2620:15c::/36", "45566"}, - {"2001:559:7ac::/48", "33491"}, - {"2001:559:c321::/48", "7922"}, - {"240a:c000::/21", "137726"}, - {"2600:1488:6161::/40", "20940"}, - {"2408:8956:5f00::/40", "17816"}, - {"2607:f6f0:5004::/40", "27224"}, - {"2804:25e4:301::/37", "61573"}, - {"2806:10a0:cbff:100::/34", "8151"}, - {"2401:d800:d650::/42", "7552"}, - {"2402:800:568d::/43", "7552"}, - {"240a:a3a2::/32", "143580"}, - {"2803:5ce0:300::/40", "54235"}, - {"240a:a805::/32", "144703"}, - {"2804:18a0::/32", "61944"}, - {"2804:72ac::/32", "270868"}, - {"2a01:5041:e::/48", "202196"}, - {"2a02:4de0::/32", "31590"}, - {"2a03:3f40:8a::/32", "50673"}, - {"2a0f:3101::/32", "62240"}, - {"2405:6e00:2200::/43", "133612"}, - {"2408:84f3:b440::/38", "17816"}, - {"2620:94:e000::/48", "398915"}, - {"2a0e:97c0:5ee::/47", "210426"}, - {"2001:1248:5f3f::/41", "11172"}, - {"2600:1404:d001::/37", "20940"}, - {"2607:fb90:1000::/36", "21928"}, - {"2804:964::/34", "263080"}, - {"2a06:3000:1000::/36", "209220"}, - {"2001:da8:260::/47", "23910"}, - {"2409:8a04:6100::/36", "24547"}, - {"240b:4003:12b::/45", "45102"}, - {"2803:4480:8000::/33", "263189"}, - {"2804:ec0::/32", "262972"}, - {"2806:2f0:2443::/43", "22884"}, - {"2400:4e80:7a00::/32", "131584"}, - {"2a0f:e6c0:fe1::/48", "60781"}, - {"2405:d000:7000::/36", "17660"}, - {"2803:5ac0::/32", "265633"}, - {"2a02:26f7:c89d::/42", "20940"}, - {"2404:138:130::/46", "45131"}, - {"240e:982:1200::/34", "4134"}, - {"2600:6c38:20::/45", "20115"}, - {"2607:fc48:f004::/48", "40009"}, - {"2402:79c0:3::/48", "7342"}, - {"2602:fbbe::/40", "40676"}, - {"2800:485:1c00::/40", "10620"}, - {"2604:6400:8100::/33", "29974"}, - {"2604:d600:131e::/42", "32098"}, - {"2804:6bd4::/32", "270428"}, - {"2a10:d000::/43", "35506"}, - {"2408:80ea:7700::/41", "17816"}, - {"2408:8459:4a30::/41", "17622"}, - {"2409:8d6b::/27", "9808"}, - {"240e:3bb::/35", "134773"}, - {"2600:140f:3c00::/48", "9498"}, - {"2604:6d00:1000::/48", "36223"}, - {"2a02:26f7:e3cc::/48", "36183"}, - {"2a0c:f00::/107", "56485"}, - {"2409:8904:5840::/42", "24547"}, - {"240e:45c:c100::/40", "140536"}, - {"2a06:19c0::/29", "8309"}, - {"2001:559:c2c4::/47", "7016"}, - {"2403:6380:16::/47", "212237"}, - {"2602:fc95::/36", "399499"}, - {"2606:6680:245::/48", "40676"}, - {"2620:149:538::/41", "714"}, - {"2801:80:ec0::/48", "264102"}, - {"2804:14d:1488::/47", "28573"}, - {"2001:1388:70c6::/37", "6147"}, - {"2403:9800:b050::/45", "4771"}, - {"2405:1c0:6241::/46", "55303"}, - {"2409:896a:6900::/38", "9808"}, - {"240a:a8ca::/32", "144900"}, - {"2a00:b580::/32", "16188"}, - {"2a0e:fd45:2a0e::/40", "213253"}, - {"2402:8100:39d0::/42", "45271"}, - {"240e:1f:1000::/33", "4134"}, - {"2804:18a8::/32", "262502"}, - {"2a02:870::/32", "42863"}, - {"2a02:26f0:8200::/48", "34164"}, - {"2a02:26f7:c38b::/48", "20940"}, - {"2a09:4c0:c01::/39", "58057"}, - {"2804:4854::/32", "267114"}, - {"2001:678:b68::/48", "35684"}, - {"2001:c20:c857::/34", "3758"}, - {"2620:106:c005::/48", "11039"}, - {"2804:1754::/48", "263137"}, - {"2804:39e8::/34", "266058"}, - {"2a0d:c500::/29", "204888"}, - {"2001:4878:2037::/44", "12222"}, - {"2408:8459:e610::/42", "17623"}, - {"2620:6b:2000::/48", "397382"}, - {"2620:13b:3020::/48", "13607"}, - {"2001:470:bb::/48", "36324"}, - {"2001:559:25c::/47", "7922"}, - {"2001:559:5cf::/48", "7015"}, - {"2001:4878:8031::/48", "12222"}, - {"2600:1000:bf00::/44", "6167"}, - {"2600:140b:c01::/38", "20940"}, - {"2600:1f1e::/36", "16509"}, - {"2607:f238::/32", "11799"}, - {"2800:160:11cf::/43", "14259"}, - {"2a02:a90::/32", "3303"}, - {"2a02:26f7:e38d::/42", "20940"}, - {"240a:adb6::/32", "146160"}, - {"2606:2800:157::/44", "15133"}, - {"2607:9080:6::/48", "7018"}, - {"2803:59e0::/32", "270021"}, - {"2806:268:2300::/47", "13999"}, - {"2a00:16f8:10::/48", "397942"}, - {"2a02:26f0:6c01::/39", "20940"}, - {"2602:feda:182::/47", "211843"}, - {"2610:18:8801::/48", "17035"}, - {"2620:74:57::/42", "7342"}, - {"2804:2cac:cccd::/35", "265234"}, - {"2a01:c50f:cb40::/40", "12479"}, - {"2a0c:9a40:1050::/47", "34927"}, - {"2001:559:524::/48", "7015"}, - {"2405:1c0:6661::/45", "55303"}, - {"2407:11c0::/32", "139879"}, - {"240a:afd1::/32", "146699"}, - {"2804:62f0:e102::/35", "269329"}, - {"2a02:57e0::/32", "59779"}, - {"2a07:e80::/29", "203329"}, - {"2a07:a8c0::/33", "34939"}, - {"2001:df1:b900::/48", "132563"}, - {"2a03:ea40::/32", "197985"}, - {"2001:559:64::/48", "7725"}, - {"2001:559:787::/48", "22909"}, - {"2001:559:80e5::/48", "7725"}, - {"2001:678:56c::/48", "41887"}, - {"2409:8020:1031::/41", "56046"}, - {"2803:4160::/32", "269726"}, - {"2401:d800:d620::/41", "7552"}, - {"2604:980:7004::/47", "21859"}, - {"2804:1ab0::/32", "61876"}, - {"2804:2f1c:a300::/33", "264872"}, - {"2804:47cc::/32", "267077"}, - {"2a02:26f0:8b01::/37", "20940"}, - {"2a02:26f7:dc80::/48", "36183"}, - {"2001:668:120::/48", "17035"}, - {"2804:314::/44", "61568"}, - {"2804:5680::/32", "268004"}, - {"2804:8414::/32", "272238"}, - {"2806:33b::/32", "265586"}, - {"2001:559:471::/48", "7725"}, - {"2001:559:85c4::/46", "7922"}, - {"2001:df0:31a::/45", "140592"}, - {"2402:b040:fde9::/48", "137132"}, - {"2602:feda:1e0::/44", "140926"}, - {"2a01:ce84::/36", "51964"}, - {"2401:d800:7480::/42", "7552"}, - {"2407:ef00:930::/48", "2687"}, - {"240a:aa55::/32", "145295"}, - {"2600:370f:51b2::/44", "32261"}, - {"2607:fdf0:5e9f::/42", "8008"}, - {"2804:143c::/32", "263320"}, - {"2a04:23c0::/29", "200851"}, - {"2a0e:b107:9f7::/48", "210337"}, - {"2001:559:c4ee::/47", "7015"}, - {"2401:4900:4b30::/44", "45609"}, - {"2404:a800:1611::/34", "9498"}, - {"2408:8948::/32", "4837"}, - {"240e:950:c00::/38", "141157"}, - {"2603:c002:9f00::/43", "31898"}, - {"2a01:b2e0::/29", "60781"}, - {"2409:806b:5b00::/37", "9808"}, - {"2a02:2e02:1300::/41", "12479"}, - {"2001:678:64::/48", "199670"}, - {"2001:1460::/32", "48635"}, - {"2405:e700:400::/40", "133089"}, - {"2406:8800:9011::/46", "17465"}, - {"240e:d6:1000::/36", "140330"}, - {"2804:624c::/32", "53106"}, - {"2001:559:313::/48", "33662"}, - {"2001:678:d78::/48", "8298"}, - {"240a:a674::/32", "144302"}, - {"2610:b0:40fa::/45", "3573"}, - {"2a02:2340::/32", "51319"}, - {"2a02:2e02:a90::/39", "12479"}, - {"2a12:49c2:4000::/31", "211444"}, - {"2001:579:244c::/42", "22773"}, - {"2402:ee80::/48", "132647"}, - {"240e:698:2500::/40", "134756"}, - {"2a02:26f7:f6ec::/47", "36183"}, - {"2c0f:fbe0::/28", "36874"}, - {"240e:44d:7880::/41", "4134"}, - {"2605:5080:5021::/43", "3367"}, - {"2606:8640::/32", "400170"}, - {"2804:682c::/32", "269673"}, - {"2001:678:78c::/48", "12360"}, - {"2001:678:8f8::/48", "206884"}, - {"240a:afb0::/32", "146666"}, - {"2a10:fa80:56::/44", "57050"}, - {"2001:559:8122::/48", "13367"}, - {"2600:370f:40a0::/47", "32261"}, - {"2806:230:600f::/48", "11888"}, - {"2a02:f0a0::/30", "25376"}, - {"2001:559:214::/48", "33657"}, - {"2001:559:830a::/48", "13367"}, - {"2001:67c:7f8::/48", "21221"}, - {"2001:1248:96b0::/45", "11172"}, - {"2001:559:860a::/48", "33659"}, - {"2403:6c0:7367::/48", "137367"}, - {"2600:6c38:a90::/45", "20115"}, - {"2804:6aa8::/32", "270351"}, - {"2a0f:5707:aa14::/46", "208814"}, - {"2001:559:61::/48", "7015"}, - {"2001:da8:23d::/48", "24348"}, - {"2801:96:fff7::/48", "28586"}, - {"2a0f:57c0::/32", "199536"}, - {"2001:dce:7401::/38", "23869"}, - {"2408:8456:7000::/42", "17622"}, - {"240a:a4ed::/32", "143911"}, - {"2600:1419:601::/36", "20940"}, - {"2602:fe9e::/36", "395434"}, - {"2804:3654::/32", "266342"}, - {"2804:61dc:5000::/34", "269261"}, - {"2a10:2080::/29", "207551"}, - {"2001:578:b::/45", "22773"}, - {"2001:ce0:8::/48", "7651"}, - {"2806:2f0:3521::/46", "17072"}, - {"240a:ad56::/32", "146064"}, - {"2803:1d80::/32", "61481"}, - {"2804:37f0:3100::/36", "266445"}, - {"2a02:158:fffe::/48", "44946"}, - {"2001:559:394::/48", "33651"}, - {"2806:288:4092::/48", "28469"}, - {"2a0b:2a86::/32", "21769"}, - {"2a0e:1c40:4000::/48", "208635"}, - {"2600:1417:20::/48", "9498"}, - {"2620:10f:b071::/48", "395700"}, - {"2803:f340:1100::/36", "14754"}, - {"2001:1248:986a::/45", "11172"}, - {"2001:4408:5601::/36", "4758"}, - {"240e:3bb:f100::/37", "134775"}, - {"2602:107:810::/48", "11955"}, - {"2607:8e80::/32", "395479"}, - {"2620:79:5::/44", "30013"}, - {"2a02:ed03::/32", "61292"}, - {"2001:559:5c8::/48", "33668"}, - {"2604:9d80::/43", "395172"}, - {"2604:b400::/32", "11979"}, - {"2604:d040::/32", "396879"}, - {"2804:4d3c::/36", "267420"}, - {"2001:559:8507::/48", "33651"}, - {"2408:8956:f200::/42", "17816"}, - {"240e:6b8::/34", "140308"}, - {"2a04:ba80::/29", "202217"}, - {"240a:a5d5::/32", "144143"}, - {"2a0a:7dc0::/29", "57656"}, - {"2405:4803:d0a::/43", "18403"}, - {"2a09:bac0:133::/48", "395747"}, - {"2001:559:c163::/48", "7015"}, - {"2409:807e:3100::/36", "9808"}, - {"240a:a7f9::/32", "144691"}, - {"2600:40ff:fffc::/46", "701"}, - {"2800:bf0:81c9::/45", "52257"}, - {"2a0d:2580:ff00::/48", "20473"}, - {"2a10:4646:60::/44", "212106"}, - {"2001:da8:218::/47", "24349"}, - {"2409:8004:2900::/35", "24547"}, - {"2804:4748::/32", "267043"}, - {"2401:d800:53f0::/37", "7552"}, - {"2605:a401:8089::/42", "33363"}, - {"2610:20:9008::/45", "3477"}, - {"2404:6300::/35", "131310"}, - {"2405:84c0:ff25::/48", "9516"}, - {"2600:1417:c001::/36", "20940"}, - {"2001:678:820::/48", "213297"}, - {"2607:f178::/48", "30217"}, - {"2804:6e38::/32", "270583"}, - {"2a09:1c40::/32", "209553"}, - {"2a0f:3440::/29", "37296"}, - {"2001:678:ea8::/48", "209295"}, - {"2407:47c0::/32", "210542"}, - {"2804:8018:6000::/36", "271729"}, - {"2a01:5b0:30::/48", "50611"}, - {"2a09:4c2:34::/48", "213372"}, - {"2001:67c:8cc::/48", "210562"}, - {"2001:67c:157c::/48", "3215"}, - {"2001:15f8:c00::/48", "25384"}, - {"240a:a3b6::/32", "143600"}, - {"240e:87c:270::/39", "137692"}, - {"2a0d:e8c0::/47", "35829"}, - {"2001:559:82bd::/48", "33668"}, - {"2404:bf40:f803::/48", "7545"}, - {"2604:d00::/32", "40523"}, - {"2806:2f0:2400::/48", "17072"}, - {"2a00:c760::/32", "47381"}, - {"240a:aec7::/32", "146433"}, - {"2620:1d5:d::/39", "14773"}, - {"2a02:26f7:ce00::/48", "36183"}, - {"2a0e:b280::/29", "208794"}, - {"2001:67c:760::/48", "35008"}, - {"2001:978:5204::/39", "174"}, - {"2409:f:f5::/32", "55824"}, - {"240a:a698::/32", "144338"}, - {"2a02:238::/32", "16097"}, - {"2001:350::/32", "7671"}, - {"2001:500:124::/48", "396549"}, - {"240a:afe8::/32", "146722"}, - {"2a04:e800:5010::/47", "57976"}, - {"2a0a:6500::/48", "50219"}, - {"2804:14d:5823::/40", "28573"}, - {"2a01:5d0::/32", "8462"}, - {"2604:2c40:1000::/36", "63252"}, - {"2804:7dfc::/32", "271595"}, - {"2001:4978:10af::/36", "19255"}, - {"2407:7a80::/43", "132384"}, - {"240e:438:820::/43", "140647"}, - {"2804:4b0:364::/40", "262459"}, - {"2804:2804:840::/32", "263935"}, - {"2a04:6a40::/29", "49892"}, - {"2001:da8:4e00::/47", "138376"}, - {"2408:8459:7230::/41", "17622"}, - {"2804:1a84::/32", "61863"}, - {"2806:261:2300::/37", "13999"}, - {"2a02:ff0:3dfb::/45", "12735"}, - {"2607:fc58:2000:600::/64", "13536"}, - {"2806:2f0:97a1::/46", "17072"}, - {"2a0d:d900:2::/29", "61138"}, - {"240a:a080::/32", "142778"}, - {"240a:a2b3::/32", "143341"}, - {"2804:ef0:200::/32", "263558"}, - {"2001:559:8302::/48", "33651"}, - {"2400:cb00:a1b0::/45", "13335"}, - {"2402:b8c0::/32", "55966"}, - {"2408:8459:1b50::/37", "17816"}, - {"2620:120:e000::/40", "15169"}, - {"2800:bf0:8165::/48", "52257"}, - {"2001:b400:d408::/45", "17421"}, - {"2400:fa80:4::/46", "133480"}, - {"2409:8055:4c::/48", "9808"}, - {"240d:c010:6c::/48", "132203"}, - {"2600:6c10:f829::/41", "20115"}, - {"2604:d600:50b::/43", "32098"}, - {"2607:f440::/31", "7859"}, - {"2803:8280::/32", "264844"}, - {"2400:8800:500::/47", "6279"}, - {"2409:8054:301a::/48", "9808"}, - {"240e:3be:dc00::/34", "4134"}, - {"2620:0:a00::/44", "71"}, - {"2a02:26f0:1b01::/37", "20940"}, - {"2a06:a005:1::/48", "60438"}, - {"2001:df7:e200::/48", "135239"}, - {"2804:66a0:13::/32", "269572"}, - {"2a02:3d0::/45", "22822"}, - {"2a02:2160:8000::/36", "44679"}, - {"2404:bf40:c040::/46", "7545"}, - {"2600:1000:bf0e::/33", "22394"}, - {"2602:ffb0:11::/48", "40676"}, - {"2605:2700:9001::/33", "47066"}, - {"2607:f668::/32", "22351"}, - {"2804:2148::/32", "264545"}, - {"2407:c080::/36", "55990"}, - {"2409:8c4c::/43", "9808"}, - {"2600:1904::/30", "396982"}, - {"2a07:22c1:39::/48", "207846"}, - {"2001:559:4c6::/44", "7922"}, - {"2001:67c:850::/48", "210775"}, - {"240a:a607::/32", "144193"}, - {"2804:594::/32", "19723"}, - {"2804:32d4::/32", "265100"}, - {"2a00:1d58:fa15::/44", "47524"}, - {"2a01:4640:c800::/40", "9042"}, - {"2001:990::/32", "15703"}, - {"2001:df5:1700::/48", "18196"}, - {"2a11:540::/30", "210966"}, - {"2401:d800:5ef0::/39", "7552"}, - {"2600:1fa0:8010::/39", "16509"}, - {"2800:300:8500::/40", "27651"}, - {"2804:1950::/32", "61786"}, - {"2804:1f3a::/32", "268839"}, - {"2a0d:9540:a01::/46", "59460"}, - {"2c0f:f1e0::/47", "37235"}, - {"2408:8957:c100::/40", "17816"}, - {"240a:abb4::/32", "145646"}, - {"240e:3b9:1200::/39", "4134"}, - {"2a02:26f7:36::/48", "36183"}, - {"2001:4878:2164::/48", "12222"}, - {"2a0e:2a80::/29", "207902"}, - {"2409:8904:4160::/38", "24547"}, - {"2a02:340::/32", "48918"}, - {"2a02:26f7:e8d0::/48", "36183"}, - {"2a03:32c0:3023::/32", "48503"}, - {"2600:140b:e401::/38", "20940"}, - {"2602:80d:3000::/44", "545"}, - {"2604:ef40:2::/48", "396158"}, - {"2a02:27ba:4000::/34", "49278"}, - {"2001:df3:5580::/48", "14618"}, - {"240a:a669::/32", "144291"}, - {"2605:b100:a00::/40", "577"}, - {"2804:7db4::/32", "271577"}, - {"2a07:62c0::/29", "202970"}, - {"2402:3a80:1c3c::/41", "38266"}, - {"2408:840d:5b00::/42", "17621"}, - {"2604:d600:1156::/44", "32098"}, - {"2a01:5042:200b::/48", "202196"}, - {"2001:44b8:4052::/48", "7545"}, - {"2803:7da0:a::/48", "64114"}, - {"2a05:2140::/29", "201603"}, - {"2804:a9c::/32", "52898"}, - {"2806:2f0:62::/40", "17072"}, - {"2c0f:ea30::/32", "5713"}, - {"2600:380:8f00::/40", "7018"}, - {"2602:fc11::/36", "398334"}, - {"2806:2f0:12e2::/48", "22884"}, - {"2a00:b340:35::/48", "196745"}, - {"2a02:26f7:e604::/48", "36183"}, - {"2404:8d02:1049::/43", "9587"}, - {"2406:daa0:e040::/44", "16509"}, - {"2610:a1:1072::/48", "397220"}, - {"2a02:b48:8106::/44", "39572"}, - {"2a02:26f7:e448::/48", "36183"}, - {"2a05:3580::/42", "35807"}, - {"2001:559:c4bd::/46", "33287"}, - {"240a:a465::/32", "143775"}, - {"2600:380:cc80::/38", "7018"}, - {"2602:fd23:1::/48", "62788"}, - {"2a00:90c0::/38", "197745"}, - {"2a03:3e80::/32", "50372"}, - {"2001:4868:906::/33", "701"}, - {"2402:800:7940::/42", "7552"}, - {"2a09:4c0::/39", "58057"}, - {"2402:800:54ee::/39", "7552"}, - {"240a:a027::/32", "142689"}, - {"240a:a0b2::/32", "142828"}, - {"240a:a7d4::/32", "144654"}, - {"2804:88:4000::/36", "28135"}, - {"2804:674::/32", "28328"}, - {"2a00:ece0::/32", "6718"}, - {"2a0b:f800::/32", "39251"}, - {"2a11:6980::/29", "204790"}, - {"2401:1d40:1::/40", "59019"}, - {"2600:5c01:2c0c::/48", "11351"}, - {"2602:fddb::/36", "397460"}, - {"2a07:f600:4058::/48", "34567"}, - {"2001:ded:8000::/48", "23726"}, - {"2408:8026:100::/38", "17621"}, - {"240e:3be:f100::/37", "134775"}, - {"2a01:c9c0:8016::/48", "2285"}, - {"2a0b:2a41::/29", "29014"}, - {"2a0d:1a40:faf::/48", "202313"}, - {"240e:983:1f00::/22", "4134"}, - {"2600:4040:8000::/31", "701"}, - {"2804:3af4::/32", "266120"}, - {"2804:7d90::/47", "271569"}, - {"2a01:8840:e2::/45", "12041"}, - {"2a0b:4d07:401::/48", "44239"}, - {"2605:6c80:c::/48", "40244"}, - {"2804:7f14::/32", "271665"}, - {"2001:559:8636::/48", "7922"}, - {"240b:4005::/32", "45102"}, - {"2600:1406:2a01::/39", "20940"}, - {"2604:d600:1563::/44", "32098"}, - {"2610:20:8e00::/44", "3477"}, - {"2804:5a18::/32", "268748"}, - {"2a01:8840:29::/48", "207266"}, - {"2001:559:263::/48", "33657"}, - {"2402:800:3a63::/43", "7552"}, - {"240a:a188::/32", "143042"}, - {"2620:91:a000::/48", "32170"}, - {"2001:250:223::/48", "24349"}, - {"240e:980:2200::/40", "58466"}, - {"2a02:26f7:c588::/48", "36183"}, - {"2001:559:8057::/44", "7922"}, - {"2001:559:84f0::/48", "7016"}, - {"2001:4998:ef6c::/48", "36646"}, - {"2409:804c:2100::/35", "9808"}, - {"240e:438:8640::/36", "4134"}, - {"2604:c740::/32", "10392"}, - {"2a0e:b107:320::/44", "207756"}, - {"2001:559:849d::/46", "7015"}, - {"2603:f5e0::/27", "397165"}, - {"2620:54:2000::/48", "396997"}, - {"2a05:b0c6:5001::/48", "211358"}, - {"2600:6800::/24", "7155"}, - {"2804:8208::/32", "272494"}, - {"2a01:50c0:1000::/36", "12843"}, - {"2001:559:c16f::/48", "33657"}, - {"2401:d800:7de0::/38", "7552"}, - {"240e:980:8600::/40", "136195"}, - {"2600:8807:9e00::/34", "22773"}, - {"2a00:7460::/32", "24833"}, - {"2a0e:aa07:e100::/45", "142025"}, - {"2400:6600::/32", "9812"}, - {"2408:8459:1830::/41", "17622"}, - {"240a:a530::/32", "143978"}, - {"240a:a963::/32", "145053"}, - {"2607:6480:8000::/35", "54112"}, - {"2804:3764:fffd::/46", "266409"}, - {"2a02:26f7:f1c9::/42", "20940"}, - {"2a05:be80::/29", "12637"}, - {"2404:bf40:e703::/40", "139084"}, - {"240a:a928::/32", "144994"}, - {"240e:87c::/40", "137692"}, - {"2804:2de8::/32", "265311"}, - {"2a06:6540:1000::/48", "34893"}, - {"2a0e:97c0:68e::/47", "49953"}, - {"2001:678:fb4::/48", "50873"}, - {"2001:1498::/32", "12956"}, - {"2400:89c0:2100::/48", "37936"}, - {"2408:8459:a610::/42", "17623"}, - {"2620:c9::/48", "701"}, - {"2804:2364::/32", "264159"}, - {"2401:7500:fffa::/45", "133296"}, - {"2409:8087:3009::/45", "9808"}, - {"2a02:2698:8009::/38", "41682"}, - {"2001:559:424::/48", "33657"}, - {"2800:160:1ee1::/44", "14259"}, - {"2804:638::/32", "28178"}, - {"2001:559:34::/48", "7015"}, - {"2001:559:c36d::/48", "33667"}, - {"240e:44d:180::/41", "4134"}, - {"240e:45c:200::/40", "131285"}, - {"2606:43c0::/32", "3801"}, - {"2610:18:8105::/36", "2828"}, - {"2806:230:400c::/48", "265594"}, - {"2a02:938::/29", "8608"}, - {"2a07:54c0::/29", "61138"}, - {"240c:ca06::/32", "23910"}, - {"240e:108:11e0::/48", "58466"}, - {"2600:1406:a001::/38", "20940"}, - {"2001:559:806a::/48", "7922"}, - {"2001:6d0:ffff::/48", "5568"}, - {"2001:df0:71::/48", "45665"}, - {"2402:9900:d11::/48", "27435"}, - {"2600:1406:a401::/36", "20940"}, - {"2a10:482::/29", "4785"}, - {"2001:579:2483::/38", "22773"}, - {"2407:9000::/32", "24130"}, - {"2604:d600:162f::/43", "32098"}, - {"2800:190:7::/44", "11664"}, - {"2804:24c0::/32", "262290"}, - {"2804:5ae0::/32", "268802"}, - {"2a01:9d80::/32", "197883"}, - {"2001:67c:930::/48", "14907"}, - {"2001:da8:e019::/46", "23910"}, - {"2401:d800:d3a0::/41", "7552"}, - {"2605:7fc0::/32", "395846"}, - {"2a12:b380::/29", "210412"}, - {"2620:129:9000::/48", "17216"}, - {"2602:808:8000::/40", "3763"}, - {"2804:3550::/32", "266280"}, - {"2a02:2298::/36", "15544"}, - {"2a07:e00:ff::/48", "210083"}, - {"2001:559:c1f7::/48", "33287"}, - {"2804:7c8:2000::/33", "262323"}, - {"2a0d:8340::/32", "205125"}, - {"240a:adc9::/32", "146179"}, - {"2620:108:4022::/48", "1313"}, - {"2001:678:860::/48", "212466"}, - {"2001:da8:e015::/48", "23910"}, - {"2602:fba8:f00::/48", "14618"}, - {"2804:7910::/32", "271282"}, - {"2a02:c600::/29", "47317"}, - {"2001:1260:105::/44", "13591"}, - {"2620:136:f001::/48", "11153"}, - {"2804:145c:8c90::/39", "263327"}, - {"2a07:8084::/31", "62296"}, - {"2a0e:1c80:11::/46", "1299"}, - {"2602:fff6:4::/48", "20473"}, - {"2620:0:cf0::/48", "6456"}, - {"2a00:86c0:2092::/45", "2906"}, - {"2a09:d9c0::/32", "207568"}, - {"2603:90f5:e::/48", "20115"}, - {"2604:e840:2::/44", "396965"}, - {"2a03:a900::/32", "48926"}, - {"2c0f:f450::/32", "37302"}, - {"2400:cb00:230::/44", "13335"}, - {"2409:8c85:2000::/43", "56046"}, - {"240a:a972::/32", "145068"}, - {"2803:6900:597::/44", "52423"}, - {"2806:283::/35", "265515"}, - {"2a03:8980::/32", "16232"}, - {"2a09:9180:ecfd::/48", "42081"}, - {"2409:4056:1000::/34", "55836"}, - {"2606:9500:200::/47", "393423"}, - {"2804:1cc4:5000::/32", "61674"}, - {"2001:253:119::/48", "142085"}, - {"2406:c500:fff3::/48", "45671"}, - {"240e:3b1:c000::/37", "140315"}, - {"2602:ff62:106::/42", "61317"}, - {"2001:250:83b::/48", "138182"}, - {"2001:559:1cb::/48", "20214"}, - {"240e:3b4:6400::/35", "140312"}, - {"2804:93c:1031::/40", "52878"}, - {"2806:3ad::/32", "265586"}, - {"2001:67c:28e8::/48", "199768"}, - {"240e:67d:8400::/38", "140329"}, - {"2605:f540::/32", "398712"}, - {"2801:80:1bb0::/48", "266495"}, - {"2804:1218::/36", "263456"}, - {"2804:69b0:10::/42", "270285"}, - {"2001:559:8443::/48", "33660"}, - {"2001:559:c46b::/48", "33490"}, - {"2409:8b4c::/30", "9808"}, - {"2605:4f00::/32", "26413"}, - {"2806:2f0:50e1::/46", "17072"}, - {"2a02:26f0:dc00::/48", "34164"}, - {"2a06:afc0::/48", "41011"}, - {"2a0e:6540:d0d0::/48", "208364"}, - {"2406:c500:fffd::/48", "7545"}, - {"2620:45:2000::/48", "577"}, - {"2a02:26f7:bbc9::/42", "20940"}, - {"2a07:fc00::/48", "39378"}, - {"2a0d:2280::/29", "51815"}, - {"2605:5580::/32", "40805"}, - {"2001:559:811f::/48", "33652"}, - {"2001:df5:3580::/48", "136697"}, - {"2402:9500:a01::/39", "55720"}, - {"240a:a2a7::/32", "143329"}, - {"240e:ff:c007::/48", "136198"}, - {"240a:ad8d::/32", "146119"}, - {"2a02:26f7:f988::/48", "36183"}, - {"2001:559:52b::/48", "7922"}, - {"2402:8700::/41", "58979"}, - {"2620:0:f02::/41", "6431"}, - {"2620:11f:1000::/48", "27421"}, - {"2a00:f440::/44", "48347"}, - {"2a07:c180::/29", "64442"}, - {"2607:b080:301::/32", "29838"}, - {"2a02:748:a000::/33", "29802"}, - {"2c0f:f4f8::/32", "328471"}, - {"2404:fc00:20::/46", "45910"}, - {"2409:8057:302a::/43", "56040"}, - {"2620:f8:4000::/48", "1767"}, - {"2800:600:303::/37", "52323"}, - {"2803:4300::/32", "263759"}, - {"2804:7914::/32", "271283"}, - {"2001:978:901::/46", "174"}, - {"2403:57c0::/32", "133815"}, - {"2409:8000:2900::/40", "9808"}, - {"2804:23b0:b800::/33", "262645"}, - {"2a02:26f7:da09::/46", "20940"}, - {"2a0d:b880::/29", "39392"}, - {"2001:df0:9200::/48", "133384"}, - {"2408:892c::/32", "4837"}, - {"240e:41::/37", "17897"}, - {"2a02:26f7:e645::/46", "20940"}, - {"2001:250:22f::/43", "23910"}, - {"2001:250:3807::/48", "23910"}, - {"240e:9b:f003::/45", "140246"}, - {"2806:2f0:8123::/41", "17072"}, - {"2a00:e200:101::/46", "41313"}, - {"2a02:ac80:2001::/35", "25145"}, - {"2a03:42e0::/48", "47105"}, - {"2a07:7200::/47", "34197"}, - {"2a10:e300:26::/48", "44854"}, - {"2001:250:301c::/40", "24357"}, - {"2001:559:83e1::/48", "7922"}, - {"2001:e68:2:100::/34", "4788"}, - {"2408:8956:5900::/40", "17816"}, - {"2603:2000::/19", "7922"}, - {"2a0b:a40::/29", "57684"}, - {"2001:978:1406::/36", "174"}, - {"2001:1af0::/32", "13046"}, - {"240e:108:43::/48", "63835"}, - {"240e:874:360::/30", "4134"}, - {"2604:b180:500::/44", "18601"}, - {"2a0e:3840:415::/48", "40676"}, - {"2001:918:ff45::/43", "3303"}, - {"2001:430::/32", "7332"}, - {"2401:4900:2100::/45", "45609"}, - {"2408:8459:8230::/41", "17622"}, - {"2804:25e4:705::/32", "61573"}, - {"2a0b:eb80::/29", "38946"}, - {"2a0c:f00::14:0/29", "56485"}, - {"2620:2b:a000::/48", "394118"}, - {"2a01:440::/37", "29551"}, - {"2a03:2880:f05d::/46", "32934"}, - {"2a09:bac0:336::/47", "13335"}, - {"2a0e:6540:a32::/48", "208364"}, - {"2600:6c38:840::/44", "20115"}, - {"2001:67c:750::/48", "206170"}, - {"2804:1f2c::/32", "265478"}, - {"2a07:6840::/29", "29119"}, - {"2001:67c:10::/48", "60149"}, - {"2405:6e00:2680::/44", "18291"}, - {"2801:80:19d0::/48", "265375"}, - {"2804:1810:f400::/36", "263262"}, - {"2a02:26f7:f400::/48", "36183"}, - {"2001:4ba8::/29", "12570"}, - {"2402:800:fc10::/42", "7552"}, - {"2620:9c:a000::/48", "16509"}, - {"2620:11a:a00b::/43", "43515"}, - {"2001:1b70:82::/48", "29518"}, - {"2403:71c0:8000::/48", "43959"}, - {"2409:8a21::/29", "9808"}, - {"240a:af09::/32", "146499"}, - {"2600:370f:7424::/41", "32261"}, - {"2804:145c:c630::/36", "263327"}, - {"2001:559:81d1::/46", "20214"}, - {"2800:300:64e0::/43", "27986"}, - {"2806:230:301c::/48", "265594"}, - {"2a02:ee80:4192::/44", "3573"}, - {"2001:678:158::/48", "202886"}, - {"2001:67c:2ae8::/48", "58329"}, - {"2606:5180::/32", "7992"}, - {"2620:149:a18::/48", "6185"}, - {"2a06:a005:c::/46", "208753"}, - {"2001:559:850e::/48", "7015"}, - {"2401:4900:35f0::/38", "45609"}, - {"2408:862a:a800::/33", "4837"}, - {"2600:140a:1::/35", "20940"}, - {"2605:2180::/36", "12422"}, - {"2806:288:4050::/48", "28469"}, - {"2a01:300:10:6::/41", "9009"}, - {"2a02:3e8::/32", "43646"}, - {"2a05:f507:43::/45", "13443"}, - {"2001:559:7f0::/48", "7015"}, - {"2001:559:84d0::/48", "7725"}, - {"240a:a80d::/32", "144711"}, - {"240a:a9de::/32", "145176"}, - {"2600:9000:1128::/46", "16509"}, - {"2606:cd00:11::/32", "40845"}, - {"2803:d20::/32", "265684"}, - {"2001:678:424::/48", "43442"}, - {"2409:8055:39::/46", "56040"}, - {"2600:9000:2310::/46", "16509"}, - {"2603:c001:2a10::/37", "31898"}, - {"2620:9f::/48", "30021"}, - {"2001:250:82f::/43", "23910"}, - {"2603:90bb::/32", "11426"}, - {"2a02:26f7:98::/48", "36183"}, - {"2a09:bac0:113::/45", "13335"}, - {"2400:ca02:f01f::/40", "23688"}, - {"2606:1f80:f000::/36", "13414"}, - {"2607:f738::/39", "17184"}, - {"2804:3364::/37", "265393"}, - {"2001:67c:590::/48", "206809"}, - {"2001:67c:1010::/47", "8674"}, - {"2a05:6200:72::/48", "25369"}, - {"2001:1248:9658::/47", "11172"}, - {"2400:7400:e026::/48", "38044"}, - {"2804:49c:13::/48", "7162"}, - {"2a00:5ae0:100::/48", "198638"}, - {"2a02:2892:40::/48", "51185"}, - {"2a02:ee80:41bd::/48", "21433"}, - {"2a09:fbc0::/32", "205718"}, - {"2001:559:c040::/48", "33490"}, - {"2401:4900:880::/44", "45609"}, - {"2804:4094::/32", "265968"}, - {"2a05:7dc2:3000::/33", "51324"}, - {"2001:4478:1400::/40", "4802"}, - {"2403:cfc0:1004::/48", "9678"}, - {"240e:5:8000::/30", "4134"}, - {"2a01:8640:3::/48", "201525"}, - {"2a02:27b8:2002::/45", "49278"}, - {"2001:559:13d::/48", "22909"}, - {"2001:678:4a8::/48", "35062"}, - {"2401:d800:de10::/42", "7552"}, - {"2402:fbc0:10::/32", "134014"}, - {"2409:8010:2100::/36", "9808"}, - {"2a02:26f7:cc48::/48", "36183"}, - {"2a04:4e40:a800::/48", "54113"}, - {"2a06:aa40:cadc::/29", "51944"}, - {"2a11:7b80::/29", "57866"}, - {"2401:73c0::/47", "136792"}, - {"2402:800:9447::/43", "7552"}, - {"240e:d6:2000::/33", "4134"}, - {"2a0d:e4c5::/30", "208861"}, - {"2001:559:8152::/48", "33657"}, - {"2001:7a8:802::/44", "13193"}, - {"240a:a590::/32", "144074"}, - {"240a:affa::/32", "146740"}, - {"2606:7b00::/34", "10538"}, - {"2a02:bf0:20::/44", "25106"}, - {"2a03:6400:40::/47", "11054"}, - {"2001:559:716::/48", "7922"}, - {"2001:44c8:a000::/39", "38444"}, - {"2402:db40::/47", "131486"}, - {"2001:16b8:7a00::/32", "8881"}, - {"2401:d800:900::/42", "7552"}, - {"2405:b40:32::/41", "55674"}, - {"240a:a78a::/32", "144580"}, - {"240e:3b8:6400::/35", "140312"}, - {"2620:3a:c000::/48", "21976"}, - {"2803:1500::/32", "27800"}, - {"2804:7a00::/32", "271341"}, - {"2a09:bac0:145::/48", "13335"}, - {"2001:1520:3::/48", "34011"}, - {"240e:3bb:ac00::/35", "4134"}, - {"2804:39c:1000::/33", "28329"}, - {"2a01:699::/32", "25084"}, - {"2001:67c:2b68::/48", "204444"}, - {"2602:fd92:e00::/40", "39618"}, - {"2804:14d:1600::/40", "28573"}, - {"2a02:a0::/32", "8426"}, - {"2a02:888:48::/47", "48695"}, - {"2a02:26f7:95::/48", "20940"}, - {"2001:1bb8::/32", "31122"}, - {"2600:6c3a:1b::/45", "20115"}, - {"2600:a003::/29", "22450"}, - {"2602:fe06::/36", "397672"}, - {"2804:670c::/32", "269600"}, - {"2a05:9400::/29", "204957"}, - {"2001:678:9b4::/48", "213210"}, - {"240a:a801::/32", "144699"}, - {"240a:af60::/32", "146586"}, - {"2800:480:ff52::/48", "14080"}, - {"2a02:2888::/32", "8265"}, - {"2001:250:1407::/48", "23910"}, - {"2c0f:fec8:49::/38", "37197"}, - {"2402:800:fdc0::/42", "7552"}, - {"240a:a0a0::/32", "142810"}, - {"2a02:ef80::/48", "16509"}, - {"2001:559:830c::/48", "33657"}, - {"2408:8459:f600::/40", "17816"}, - {"2804:4e3c::/32", "268248"}, - {"2a02:26f7:ba88::/48", "36183"}, - {"2401:4900:5230::/41", "45609"}, - {"2c0f:fda0::/32", "37525"}, - {"240e:438:7e20::/43", "140647"}, - {"2602:febe:301::/36", "30405"}, - {"2603:7033::/32", "12271"}, - {"2a00:bdc0::/35", "47541"}, - {"2001:c20:c832::/45", "3758"}, - {"2001:559:55f::/42", "7016"}, - {"2402:e280:2412::/40", "134674"}, - {"2607:f3d0::/32", "27400"}, - {"2800:160:129a::/42", "14259"}, - {"2800:370:4000::/40", "28006"}, - {"2a00:1f40::/29", "42864"}, - {"2a0c:9f00::/48", "47890"}, - {"2001:559:2d0::/48", "33650"}, - {"2001:559:806d::/48", "33287"}, - {"2001:df1:1080::/48", "136977"}, - {"240a:a557::/32", "144017"}, - {"2600:6c20:262::/36", "20115"}, - {"2604:5880:2::/45", "10980"}, - {"2603:f920::/25", "397165"}, - {"2800:160:120d::/43", "14259"}, - {"2a02:1320::/32", "34409"}, - {"2a0a:8d80:1::/48", "200019"}, - {"240a:a03d::/32", "142711"}, - {"240a:a701::/32", "144443"}, - {"2610:b0:4030::/47", "701"}, - {"2001:df1:f080::/48", "139776"}, - {"2404:bf40:e001::/48", "2764"}, - {"2607:9e80:1181::/38", "397068"}, - {"2620:f0:c00a::/48", "14148"}, - {"2a02:670::/32", "47217"}, - {"2a0d:2406:510::/46", "39753"}, - {"2001:559:4ca::/47", "33287"}, - {"2407:e3c0::/48", "38732"}, - {"2400:39a0::/48", "63739"}, - {"2400:6280:129::/46", "132280"}, - {"2400:a980:1400::/40", "133515"}, - {"2402:800:5939::/41", "7552"}, - {"2600:6c10:182::/45", "20115"}, - {"2600:6c10:f402::/45", "20115"}, - {"2620:126:7002::/48", "394559"}, - {"2804:5f74::/32", "269100"}, - {"2a00:1218::/32", "34772"}, - {"2001:559:13c::/48", "33667"}, - {"2001:559:821a::/48", "20214"}, - {"2001:559:c1be::/48", "33652"}, - {"2001:b08:a::/48", "29147"}, - {"2600:6c20:85b::/45", "20115"}, - {"2804:5ae4::/32", "268803"}, - {"2001:559:1f5::/46", "33652"}, - {"2001:559:80f1::/48", "33287"}, - {"2001:df0:41f::/48", "133014"}, - {"2001:ee0:9940::/38", "45899"}, - {"2409:806a:1a::/40", "9808"}, - {"2804:cdc:2040::/32", "52565"}, - {"2a00:f280::/32", "206288"}, - {"2402:3a80:1a6f::/40", "38266"}, - {"2409:8a10::/34", "9808"}, - {"240e:44d:5540::/42", "140347"}, - {"2409:8c00:7840::/48", "56048"}, - {"240a:ad59::/32", "146067"}, - {"2804:4fe0::/32", "268355"}, - {"2a03:f80:ed15::/46", "57169"}, - {"2001:df7:9300::/47", "134392"}, - {"2001:e60:d110::/38", "4766"}, - {"2408:8957::/40", "17622"}, - {"2600:1488:6181::/43", "20940"}, - {"2801:1d2::/44", "18747"}, - {"2803:e880:8112::/45", "52468"}, - {"2a00:1728:21::/46", "34224"}, - {"2a03:2480:8010::/44", "200107"}, - {"2a05:93c6::/31", "7979"}, - {"240a:a877::/32", "144817"}, - {"2600:6:ff44::/42", "1239"}, - {"2606:b00::/32", "15305"}, - {"2a09:4c0:5e1::/36", "58057"}, - {"2401:d800:23b0::/41", "7552"}, - {"2402:800:b3a0::/41", "7552"}, - {"2800:bf0:172::/45", "27947"}, - {"240a:a3cf::/32", "143625"}, - {"2800:190::/48", "11664"}, - {"2806:2f0:9341::/46", "17072"}, - {"2001:500:1::/48", "1508"}, - {"2001:559:8409::/48", "7922"}, - {"2403:31c0::/32", "137376"}, - {"2408:84f3:d810::/42", "134543"}, - {"2801:106::/48", "19429"}, - {"2405:4cc1:300::/40", "55891"}, - {"2407:6dc0::/32", "140944"}, - {"2600:1400:5::/48", "35994"}, - {"2001:550:4f02::/35", "174"}, - {"2400:7fc0:2a0::/44", "55960"}, - {"240a:abf9::/32", "145715"}, - {"2a02:26f7:c1c4::/48", "36183"}, - {"2a02:ae00::/32", "16125"}, - {"2402:800:bf90::/42", "7552"}, - {"2620:138:3008::/48", "11251"}, - {"2804:6ae4::/32", "270364"}, - {"2a02:16d8::/39", "5518"}, - {"2a03:afe2::/32", "51392"}, - {"2402:f200::/32", "18196"}, - {"2405:ec00:1002::/39", "23955"}, - {"2600:1480:2801::/37", "20940"}, - {"2a09:6ec0::/29", "197706"}, - {"2001:978:1c01::/39", "174"}, - {"2001:1b28:406::/38", "8728"}, - {"240a:ad19::/32", "146003"}, - {"240e:983:1e01::/48", "134764"}, - {"2a02:26f7:ef04::/48", "36183"}, - {"2a0b:b87:ff15::/48", "210614"}, - {"2a10:a00::/32", "209208"}, - {"2001:559:85ef::/48", "7015"}, - {"2001:1a60::/32", "2594"}, - {"2405:7040:6001::/48", "17621"}, - {"240a:a1a5::/32", "143071"}, - {"240a:a591::/32", "144075"}, - {"2602:fed2:4000::/36", "53356"}, - {"2804:4b98:e000::/35", "267317"}, - {"2a0d:2902:caff::/48", "204185"}, - {"2001:559:87da::/48", "33489"}, - {"2001:678:54::/48", "57382"}, - {"2001:1978:1500::/36", "13768"}, - {"240a:a852::/32", "144780"}, - {"2804:4540::/32", "266914"}, - {"2804:5270::/32", "268518"}, - {"2804:8040::/32", "271739"}, - {"2600:1004:d160::/34", "22394"}, - {"2602:ff6e:19::/36", "63202"}, - {"2a0f:31c0::/29", "37405"}, - {"2401:d800:be60::/40", "7552"}, - {"2606:f900:7608::/32", "812"}, - {"2803:d6c0::/48", "265698"}, - {"2a0f:7940::/29", "51262"}, - {"2001:44b8:401::/35", "4739"}, - {"2001:4de0:2::/47", "34343"}, - {"2800:160:18db::/45", "14259"}, - {"2804:6ea0:4030::/32", "270609"}, - {"2a06:ec00::/29", "553"}, - {"240a:a22d::/32", "143207"}, - {"2603:c001:2610::/36", "31898"}, - {"2600:9000:2388::/47", "16509"}, - {"2800:160:1116::/44", "14259"}, - {"2804:5200::/32", "268489"}, - {"2806:2f0:2101::/48", "22884"}, - {"2a02:26f7:b8cd::/42", "20940"}, - {"2a03:b500:4000::/32", "41135"}, - {"2a11:7e02::/32", "52000"}, - {"2001:559:83fd::/46", "7016"}, - {"240e:84c::/44", "140345"}, - {"2804:eb4::/37", "61890"}, - {"2001:7f8:2a::/48", "13041"}, - {"2401:200::/32", "17666"}, - {"240a:aa79::/32", "145331"}, - {"2a0c:7e40:7bb1::/48", "20473"}, - {"2402:800:54d3::/44", "7552"}, - {"2408:8459:4210::/42", "17623"}, - {"2a0a:e940::/29", "207543"}, - {"240a:aa35::/32", "145263"}, - {"2804:7030::/32", "270711"}, - {"2a05:7e80::/30", "50009"}, - {"2a0f:d300::/29", "47787"}, - {"2001:fe8:10::/47", "24435"}, - {"240a:a173::/32", "143021"}, - {"2602:fe3a:2::/48", "20119"}, - {"2620:13c:a000::/48", "19367"}, - {"2800:160:1d13::/42", "14259"}, - {"2801:80:b00::/48", "61789"}, - {"2804:5360::/32", "268580"}, - {"2804:5520::/32", "268691"}, - {"2a02:26f7:d54d::/46", "20940"}, - {"2401:d800:2ad0::/42", "7552"}, - {"240e:438:5840::/38", "4134"}, - {"2607:dc80::/32", "64262"}, - {"2804:2a40::/32", "264067"}, - {"2a07:6cc0:60::/48", "61098"}, - {"2001:559:113::/48", "7922"}, - {"2403:43c0::/32", "137990"}, - {"240a:ab44::/32", "145534"}, - {"2604:b980::/32", "47103"}, - {"2a07:9944:1b::/45", "40676"}, - {"240e:267:6000::/38", "140334"}, - {"2600:c08::/34", "10913"}, - {"2a02:ff0:1400::/40", "12735"}, - {"2a02:26f7:d151::/46", "20940"}, - {"2001:559:80b7::/48", "7922"}, - {"2406:7400:60::/46", "24309"}, - {"2804:43f4:70::/40", "267601"}, - {"2a0e:b107:12d4::/46", "211358"}, - {"2405:6480::/32", "135425"}, - {"2406:5e00::/47", "38456"}, - {"2a00:10a0:6::/48", "199234"}, - {"2a0e:b107:1220::/44", "211479"}, - {"240a:a143::/32", "142973"}, - {"2600:370f:70ce::/39", "32261"}, - {"2602:fd92:700::/40", "174"}, - {"2804:b34::/32", "52751"}, - {"2804:6808::/35", "269666"}, - {"2a00:1b40::/32", "47777"}, - {"2001:67c:12c8::/48", "43028"}, - {"2001:c38:9012::/47", "9931"}, - {"2600:140f:4201::/37", "20940"}, - {"2607:fcc0::/33", "36483"}, - {"2803:9800:a8ce::/47", "11664"}, - {"2804:a3c::/32", "53054"}, - {"2a02:26f7:8::/48", "36183"}, - {"2a02:26f7:f704::/48", "36183"}, - {"2a0b:7f00::/29", "44489"}, - {"2a10:4880::/29", "204802"}, - {"240a:afd7::/32", "146705"}, - {"2600:9000:112e::/43", "16509"}, - {"2806:2f0:3043::/43", "17072"}, - {"2400:81c0::/32", "17804"}, - {"240a:af54::/32", "146574"}, - {"2602:80a:2001::/48", "14618"}, - {"2001:559:8766::/48", "7016"}, - {"2408:875c::/44", "140886"}, - {"240e:3b2::/35", "134773"}, - {"2606:2980:1000::/40", "26344"}, - {"2804:23ec::/32", "21574"}, - {"2806:370:1010::/44", "28403"}, - {"2a0a:1dc0::/30", "42994"}, - {"2001:559:c08b::/48", "33491"}, - {"2001:67c:1288::/48", "29560"}, - {"2404:8000:102b::/45", "17451"}, - {"2407:96c0::/32", "140158"}, - {"2605:8900:3000::/36", "8100"}, - {"2620:7d:c000::/48", "4190"}, - {"2a05:3b80::/29", "33915"}, - {"2c0f:f9e8::/32", "37497"}, - {"240a:a291::/32", "143307"}, - {"2600:6c3a:848::/37", "20115"}, - {"2804:7a3c::/39", "271357"}, - {"2a02:e980:28::/45", "19551"}, - {"2a0e:3500::/29", "56456"}, - {"2001:67c:21fc::/48", "43922"}, - {"2a01:b740:a1d::/48", "714"}, - {"2a02:26f0:da00::/48", "34164"}, - {"2a12:4942::/31", "211398"}, - {"2c0f:f428::/32", "30844"}, - {"2001:678:1f4::/48", "50004"}, - {"2001:67c:2588::/48", "8447"}, - {"240a:ab5b::/32", "145557"}, - {"2603:c011:8000::/36", "31898"}, - {"2607:fb10:32::/34", "2906"}, - {"2a06:3ac0::/29", "196945"}, - {"2001:559:c409::/48", "7015"}, - {"2409:8008:1100::/36", "24547"}, - {"2600:180a::/35", "16552"}, - {"2620:11d:d000::/40", "18995"}, - {"2a03:5c0::/32", "199254"}, - {"2a03:9fc0:1::/46", "200820"}, - {"240a:a8b9::/32", "144883"}, - {"2602:808:4000::/48", "398960"}, - {"2804:21cc::/32", "264574"}, - {"2804:7ae8::/32", "271399"}, - {"2001:559:182::/48", "7922"}, - {"2001:730::/29", "6830"}, - {"2401:4900:1b10::/42", "45609"}, - {"2408:8957:f6c0::/36", "17816"}, - {"2001:559:397::/44", "7922"}, - {"2001:da8:e803::/48", "24368"}, - {"2001:14f7:50::/32", "12355"}, - {"2408:8456:3600::/41", "17623"}, - {"240e:967:e400::/39", "133775"}, - {"2804:2b08::/32", "61578"}, - {"2806:230:2037::/48", "11888"}, - {"2806:2f0:50a3::/41", "17072"}, - {"2001:df2:f300::/48", "136699"}, - {"2408:8456:6400::/42", "17622"}, - {"240a:aa37::/32", "145265"}, - {"2602:feda:b8f::/48", "205923"}, - {"2610:20:5002::/48", "5744"}, - {"2a02:26f7:de81::/46", "20940"}, - {"2a05:ef40::/29", "200428"}, - {"2400:8b00:980::/42", "45727"}, - {"2409:8c28:6d08::/35", "56041"}, - {"2400:3dc0:301::/37", "134371"}, - {"2402:800:9a7f::/40", "7552"}, - {"2607:f5a0:214::/36", "17048"}, - {"2620:138:6000::/48", "36710"}, - {"2001:559:77e::/48", "20214"}, - {"2606:2000:12::/45", "1616"}, - {"2a01:8840:4d::/48", "207266"}, - {"2a02:148::/29", "1680"}, - {"2a0b:b580:ffff::/31", "43304"}, - {"2a0e:c887::/44", "208759"}, - {"2406:3000:7::/44", "4657"}, - {"240e:438:9a20::/43", "140647"}, - {"2a00:8aa0::/32", "62059"}, - {"2a0f:af00::/32", "208201"}, - {"2400:e3c0::/32", "45267"}, - {"240a:af25::/32", "146527"}, - {"2804:427c::/32", "267503"}, - {"2804:61b4::/32", "269251"}, - {"2a02:26f0:fc::/47", "20940"}, - {"2a02:59e0::/48", "60118"}, - {"2001:559:c0c8::/48", "7922"}, - {"2604:e500::/32", "6461"}, - {"2a02:26f7:d188::/48", "36183"}, - {"2001:7f8:107::/48", "211947"}, - {"2606:2f80::/32", "395075"}, - {"2801:19:e000::/48", "61499"}, - {"2804:2f3c:2030::/32", "264879"}, - {"2402:800:6249::/42", "7552"}, - {"2404:e8c0::/32", "139090"}, - {"2408:8456:5840::/39", "17816"}, - {"2603:90f2::/32", "7843"}, - {"2804:7cc8::/32", "271518"}, - {"2001:559:c457::/48", "7015"}, - {"2001:67c:4c8::/48", "50034"}, - {"240e:3be:1800::/34", "4134"}, - {"240e:924:4000::/36", "132153"}, - {"2803:d280::/32", "264733"}, - {"2a03:5640:f143::/48", "14618"}, - {"2a10:3780::/29", "206238"}, - {"2404:3d00:4174::/44", "3573"}, - {"2603:f3f8::/29", "396356"}, - {"2606:2800:51f::/42", "15133"}, - {"2606:2800:5062::/45", "15133"}, - {"2a05:544::/31", "206766"}, - {"2a0a:d6c0:9145::/48", "210596"}, - {"2001:4c8:1009::/45", "15290"}, - {"2401:ea80::/32", "133930"}, - {"2607:f010::/32", "52"}, - {"2a0f:140::/30", "62240"}, - {"2607:f6f0:2002::/40", "54588"}, - {"2001:2040::/32", "3301"}, - {"240e:580::/22", "4134"}, - {"2600:1480:e100::/37", "20940"}, - {"2602:fd9a:fff1::/44", "54613"}, - {"2a02:26f7:c34b::/48", "20940"}, - {"2a07:f7c7:ffff::/48", "39020"}, - {"2600:100d:b000::/42", "6167"}, - {"2803:ab00:92::/48", "23520"}, - {"2a0e:7b80::/32", "29014"}, - {"2001:550:a11::/46", "174"}, - {"2001:c20:489b::/45", "3758"}, - {"2604:d600:1270::/45", "32098"}, - {"2001:559:864a::/48", "33657"}, - {"2600:1404:fc01::/31", "20940"}, - {"2602:fd80:2::/36", "53612"}, - {"2804:6af0::/32", "270367"}, - {"240e:3ba:dc00::/34", "4134"}, - {"2a0f:b300:b300::/48", "208200"}, - {"2409:8915:9000::/39", "56044"}, - {"240a:a0a4::/32", "142814"}, - {"240e:874:300::/41", "140638"}, - {"2600:1003:b060::/40", "22394"}, - {"2a02:26f7:f708::/48", "36183"}, - {"2a0c:7a80::/29", "204782"}, - {"2620:0:2830::/48", "16876"}, - {"2001:678:828::/48", "24639"}, - {"2001:da8:7000::/45", "24363"}, - {"2407:3a40::/32", "58411"}, - {"2409:800b:2c05::/40", "24547"}, - {"2602:fe65:10::/41", "396872"}, - {"2607:fcf0:104::/32", "13445"}, - {"2804:1934::/32", "61778"}, - {"2a01:6ae0::/29", "62227"}, - {"2a02:26f7:d9c1::/46", "20940"}, - {"2401:d800:bb80::/42", "7552"}, - {"2402:3300:cac2::/48", "56300"}, - {"2001:dde::/48", "24082"}, - {"2405:6e00:640::/40", "133612"}, - {"240a:ac00::/32", "145722"}, - {"2a05:546::/32", "210352"}, - {"2a09:8580::/29", "43341"}, - {"2400:1f00:20::/48", "45769"}, - {"2406:6f40::/47", "141163"}, - {"2600:1415:3000::/48", "2914"}, - {"2602:fe05::/32", "54936"}, - {"2605:a140::/30", "40021"}, - {"2803:5e00::/40", "267765"}, - {"2804:ac4::/32", "52920"}, - {"2401:c900:1000::/38", "36351"}, - {"2607:3500::/48", "11228"}, - {"2607:fb10:2035::/41", "2906"}, - {"2607:fc58:1:30::/64", "13536"}, - {"2804:49c:4210::/48", "7162"}, - {"2804:1dc4::/32", "264392"}, - {"2a00:80a::/25", "1257"}, - {"2a01:6f60::/32", "62365"}, - {"2a0f:4640::/29", "200750"}, - {"2001:559:4f3::/48", "33657"}, - {"2001:579:f104::/42", "22773"}, - {"240e:965:1800::/34", "4134"}, - {"2600:1005:9100::/44", "6167"}, - {"2606:7d00:c002::/35", "23248"}, - {"2001:559:7cd::/48", "33657"}, - {"2001:559:8098::/48", "7016"}, - {"2001:67c:3e0::/48", "16089"}, - {"240a:a25b::/32", "143253"}, - {"240a:a5c3::/32", "144125"}, - {"2800:98:111b::/37", "14754"}, - {"2804:204:311::/46", "28186"}, - {"2a00:5740::/32", "56582"}, - {"2001:559:81bc::/48", "33491"}, - {"2404:6900::/34", "17819"}, - {"2600:1488:6341::/40", "20940"}, - {"2602:ffb0:ffd::/48", "32780"}, - {"2605:a401:8a3e::/39", "33363"}, - {"2605:f000::/32", "22442"}, - {"2606:5980::/32", "11071"}, - {"2600:1407:b001::/36", "20940"}, - {"2804:65b4::/32", "269509"}, - {"2001:4f8:9::/48", "30132"}, - {"2402:800:36ee::/39", "7552"}, - {"240e:37e:aa00::/39", "140330"}, - {"2605:5c0:40::/44", "26517"}, - {"2607:3200:3::/43", "11240"}, - {"2804:5f04::/32", "269071"}, - {"2401:4200::/32", "24195"}, - {"2409:805a:2902::/48", "9808"}, - {"2409:805b:2b05::/32", "56040"}, - {"2800:5f0:8001::/34", "22724"}, - {"2001:678:dd0::/48", "47753"}, - {"2401:d800:bce0::/39", "7552"}, - {"2a01:6480:14::/46", "29049"}, - {"2001:df0:8400::/48", "55741"}, - {"2403:300:2000::/32", "714"}, - {"2803:f4a0::/32", "266830"}, - {"2806:2a0:19::/46", "28548"}, - {"2409:8004:3031::/41", "24547"}, - {"2600:5c00:3aff::/39", "20001"}, - {"2620:12e:b000::/46", "7046"}, - {"2001:559:1ab::/48", "7922"}, - {"2001:67c:858::/48", "210775"}, - {"2800:200:b4b0::/41", "12252"}, - {"2804:1ca0:ff01::/46", "61666"}, - {"2a00:f28::/43", "15802"}, - {"2a0b:7500::/29", "206859"}, - {"2001:559:32e::/48", "7016"}, - {"2403:a200:a400::/33", "17428"}, - {"2406:5200::/32", "18067"}, - {"2408:8459:8210::/42", "17623"}, - {"2602:fc6e::/36", "399893"}, - {"2801:80:7b0::/48", "263613"}, - {"2804:4bb4:400::/35", "267325"}, - {"2408:8456:5040::/39", "17816"}, - {"240a:a46a::/32", "143780"}, - {"2602:fed2:7706::/48", "53356"}, - {"2610:a1:306c::/48", "12008"}, - {"2402:800:f570::/40", "7552"}, - {"2409:8924:7500::/38", "56046"}, - {"2600:9000:221e::/42", "16509"}, - {"2a06:ee05::/32", "25623"}, - {"2a0b:6dc0::/29", "5482"}, - {"2610:a1:3020::/48", "12008"}, - {"2803:380::/32", "263728"}, - {"2a0c:d80::/29", "200000"}, - {"2001:678:d34::/48", "59570"}, - {"2a0a:d340::/29", "56616"}, - {"2001:67c:13c8::/48", "42936"}, - {"2a02:26f7:e208::/48", "36183"}, - {"2a02:e0c7:ffff::/48", "9100"}, - {"2001:1248:57f2::/44", "11172"}, - {"2400:adcc:800::/39", "9541"}, - {"2402:800:fa20::/41", "7552"}, - {"240a:a695::/32", "144335"}, - {"2a01:8640:b::/48", "202015"}, - {"2a01:8cc0::/32", "59456"}, - {"2800:800:620::/44", "26611"}, - {"2800:bf0:80c7::/43", "52257"}, - {"2a01:d0:318::/45", "29632"}, - {"2a01:aa80::/48", "3301"}, - {"2a0d:e4c1::/32", "59504"}, - {"2a10:3cc0::/29", "204790"}, - {"2001:590:2005:200::/56", "20940"}, - {"2001:678:cfc::/48", "61400"}, - {"2001:1a68:21::/48", "57723"}, - {"2402:800:b410::/42", "7552"}, - {"2408:8456:cf40::/35", "17816"}, - {"2600:1403:b::/43", "20940"}, - {"2600:1419:18::/48", "20940"}, - {"2804:7970::/32", "271305"}, - {"2a00:10a0:b::/48", "51305"}, - {"2a02:26f7:b7c9::/42", "20940"}, - {"2001:559:76d::/48", "7725"}, - {"2400:e480:e::/32", "131588"}, - {"2605:2800:100::/47", "3354"}, - {"2804:14d:2::/40", "28573"}, - {"240a:a0e8::/32", "142882"}, - {"2a05:4700:200::/48", "43578"}, - {"2804:104c:2400::/40", "263629"}, - {"2a0a:5080::/29", "49865"}, - {"2405:db40::/32", "137987"}, - {"2602:ff96:11::/48", "8100"}, - {"2605:a404:cf4::/39", "33363"}, - {"2804:4734:3000::/32", "267038"}, - {"2804:4c38::/32", "267357"}, - {"2a07:b380::/29", "202604"}, - {"2a07:ba80::/29", "40970"}, - {"2001:df0:96::/48", "45770"}, - {"2406:5d40::/47", "141009"}, - {"2804:14d:5c5f::/42", "28573"}, - {"2a02:2308:21::/43", "29028"}, - {"2605:a000:40f::/38", "10796"}, - {"2607:f699::/32", "53999"}, - {"2803:ddc0::/32", "27855"}, - {"2804:1040::/33", "263626"}, - {"2804:1cc8::/32", "61675"}, - {"2001:250:7401::/44", "24371"}, - {"2804:30c:1400::/32", "28343"}, - {"2a02:850:ffe0::/48", "1921"}, - {"2402:3a80::/46", "38266"}, - {"2607:f8f0:e00::/40", "271"}, - {"2804:4784::/32", "267059"}, - {"2a02:26f7:eac4::/48", "36183"}, - {"2c0f:edd8::/32", "328114"}, - {"2001:4878:a136::/48", "12222"}, - {"240c:6:3::/48", "24445"}, - {"2607:f738:800::/41", "17184"}, - {"2a02:ee80:403a::/41", "3573"}, - {"2404:efc0:155::/48", "10122"}, - {"2408:8956:3e00::/40", "17622"}, - {"2408:8957:ed40::/40", "17816"}, - {"240a:a7fe::/32", "144696"}, - {"2804:aa8::/37", "52903"}, - {"2a03:7f20::/48", "8473"}, - {"2401:d800:d760::/40", "7552"}, - {"2408:862a::/32", "4837"}, - {"2804:321c::/32", "265056"}, - {"2804:5b58::/32", "268836"}, - {"2a01:270:e000::/46", "29657"}, - {"2a01:6780:2::/48", "24679"}, - {"2a0b:2040::/29", "559"}, - {"2001:438:fffd:13::/64", "20940"}, - {"2001:559:c094::/48", "33651"}, - {"2001:ee0:e200::/40", "45899"}, - {"2408:8956:b600::/40", "17622"}, - {"2408:8956:d6c0::/36", "17816"}, - {"2804:3494::/32", "265466"}, - {"2a03:b000:600::/36", "42695"}, - {"2a04:5ec7::/48", "62154"}, - {"2100:1900:5:2:2::1ba4/126", "3356"}, - {"2600:141b:2800::/48", "35994"}, - {"2606:ec00:a100::/40", "40328"}, - {"2a02:1c8:7::/48", "41704"}, - {"2001:559:406::/48", "7725"}, - {"2001:559:8191::/46", "33659"}, - {"2407:4cc0::/32", "134905"}, - {"2408:8456::/42", "17622"}, - {"240e:3b2:f700::/36", "4134"}, - {"2620:131:104c::/47", "26450"}, - {"2804:7b8::/32", "262315"}, - {"2a02:26f7:b604::/48", "36183"}, - {"2001:67c:2aa8::/48", "3330"}, - {"2403:9800:c021::/43", "4648"}, - {"2001:559:7a4::/48", "7015"}, - {"2001:559:83c0::/48", "33659"}, - {"2600:803:22d::/41", "701"}, - {"2602:fe43::/36", "397005"}, - {"2804:1c4::/32", "262744"}, - {"2a00:ab40:3001::/33", "41798"}, - {"2a0d:5600:a32::/48", "9009"}, - {"2a0f:64c0::/29", "31463"}, - {"2001:559:84c5::/48", "33287"}, - {"2405:c0:40::/48", "138881"}, - {"2a06:f2c0::/29", "202975"}, - {"2a11:f2c0::/48", "207960"}, - {"2406:7800::/32", "10101"}, - {"2a0c:b5c0::/29", "59909"}, - {"2a0e:8f02:f036::/48", "210915"}, - {"2001:dd8:8::/45", "4608"}, - {"2402:be80::/32", "131749"}, - {"2600:100a:b0e0::/43", "22394"}, - {"2600:8807:7a2::/41", "22773"}, - {"2804:669c:4080::/32", "269571"}, - {"2a02:26f7:c3d4::/48", "36183"}, - {"2405:8a00:2079::/40", "55824"}, - {"2800:160:c167::/34", "14259"}, - {"2804:1088::/33", "52913"}, - {"2804:3de8::/33", "266562"}, - {"2a00:4902::/32", "12390"}, - {"2a03:6400:20::/44", "11054"}, - {"2a0d:3842:1070::/48", "57629"}, - {"240a:a9f1::/32", "145195"}, - {"2803:2e60::/32", "267920"}, - {"2804:2d34::/32", "265266"}, - {"2a0a:8887:1::/48", "59922"}, - {"2a0e:fdc0::/29", "207375"}, - {"240a:a1bb::/32", "143093"}, - {"240e:3b6:f100::/37", "134775"}, - {"2602:ff25::/39", "394346"}, - {"2804:15dc::/32", "263415"}, - {"2001:559:80a4::/48", "33287"}, - {"2001:4998:194::/46", "26101"}, - {"2804:3b8:1e9::/43", "52965"}, - {"2a00:c560::/29", "62416"}, - {"2a00:d580:4900::/40", "16365"}, - {"240a:aff3::/32", "146733"}, - {"2804:adc::/32", "52927"}, - {"2a00:d240::/32", "25274"}, - {"2001:67c:23a8::/48", "50101"}, - {"2001:fd8:3330::/44", "4775"}, - {"2408:8956:ea00::/40", "17622"}, - {"2800:160:14d8::/42", "14259"}, - {"2804:3f70::/32", "265892"}, - {"2804:4794::/32", "267063"}, - {"2a0e:46c3:300::/40", "51745"}, - {"2001:1838:4200::/35", "23352"}, - {"2402:800:5a55::/42", "7552"}, - {"240a:aab2::/32", "145388"}, - {"240e:e3:8000::/33", "4812"}, - {"2603:fd00::/29", "63023"}, - {"2620:82:4000::/48", "22098"}, - {"2801:15:2800::/48", "270033"}, - {"2804:2fdc:8000::/36", "264917"}, - {"2806:310:2e::/43", "16960"}, - {"2a00:4580::/30", "3226"}, - {"2a03:1fe0::/32", "39509"}, - {"2a03:2420::/32", "201682"}, - {"2a06:f0c0::/29", "3352"}, - {"2a07:7280::/29", "202591"}, - {"2001:57a:6031::/35", "22773"}, - {"2001:912::/33", "51083"}, - {"2400:8800:4082::/32", "3491"}, - {"2400:b800::/44", "45638"}, - {"240a:a88c::/32", "144838"}, - {"2806:2f0:7223::/41", "17072"}, - {"2001:559:3c3::/48", "33651"}, - {"2803:7260:3::/43", "52238"}, - {"2804:80cc:f::/43", "272413"}, - {"2a00:4802:4c20::/39", "8717"}, - {"2a00:9300::/32", "12843"}, - {"2a02:26f7:e008::/48", "36183"}, - {"2a11:27c0::/43", "199524"}, - {"2001:559:2f9::/48", "7922"}, - {"240a:a58d::/32", "144071"}, - {"2605:4000::/32", "2722"}, - {"2804:93c::/42", "52878"}, - {"2402:8100:20ee::/43", "55644"}, - {"2405:9800:c906::/47", "45458"}, - {"2804:6e80::/32", "270601"}, - {"2001:559:8553::/48", "7922"}, - {"2605:4300:ff00::/40", "62907"}, - {"2605:5480::/32", "26253"}, - {"2606:2180:1::/46", "22241"}, - {"2a02:26f7:e089::/46", "20940"}, - {"2602:fc64:df1::/48", "36829"}, - {"2604:ad00::/32", "4181"}, - {"2804:7110:6100::/35", "270764"}, - {"2a01:4480::/32", "196816"}, - {"2a02:1390:5000::/40", "21351"}, - {"2a02:2ad0:140::/38", "702"}, - {"2a0c:d947::/32", "209877"}, - {"2406:da1c::/36", "16509"}, - {"240a:a062::/32", "142748"}, - {"240a:a5a0::/32", "144090"}, - {"2606:f200::/32", "36097"}, - {"2620:56:a000::/48", "46924"}, - {"2409:8904:5770::/40", "24547"}, - {"2602:feda:b90::/46", "212995"}, - {"2620:13a:2000::/40", "1970"}, - {"2803:7180:6000::/36", "21575"}, - {"2804:1bb4::/32", "61744"}, - {"2804:62b4:4000::/36", "269313"}, - {"2a09:ae80::/29", "204537"}, - {"2a12:13c0::/29", "35710"}, - {"2402:3500::/32", "45177"}, - {"240a:a4b7::/32", "143857"}, - {"240e:44d:6c00::/41", "140345"}, - {"2a04:8680::/32", "39150"}, - {"2001:640::/32", "2895"}, - {"2001:fd8:302c::/43", "4775"}, - {"2001:44c8:48d0::/44", "131445"}, - {"2806:2f0:70e3::/39", "17072"}, - {"2a02:818::/32", "15525"}, - {"2a02:7860::/32", "201859"}, - {"2001:559:3cd::/48", "7725"}, - {"2404:2400:201::/32", "56132"}, - {"2409:805e:3900::/31", "9808"}, - {"2600:1802:13::/45", "16552"}, - {"2804:2fc4:ff14::/44", "264911"}, - {"2a02:ee80:428e::/47", "21433"}, - {"2a0c:b641:f0::/48", "210985"}, - {"2001:df4:7100::/48", "131784"}, - {"2001:df5:a080::/48", "134461"}, - {"2400:d400:9::/48", "45671"}, - {"2405:9240::/32", "61317"}, - {"240e:0:a000::/33", "4134"}, - {"2600:6c38:b33::/44", "20115"}, - {"2800:cd0::/32", "6568"}, - {"2804:3d9c::/32", "266542"}, - {"2806:250:c::/48", "28554"}, - {"2a03:5580::/29", "57280"}, - {"2001:57b:2000::/32", "22773"}, - {"2600:140f:1801::/39", "20940"}, - {"2800:160:13fe::/37", "14259"}, - {"2a00:1288:ef68::/47", "10310"}, - {"2001:250:241f::/48", "23910"}, - {"2001:938:4001::/44", "8437"}, - {"2600:140f:1601::/39", "20940"}, - {"2600:6c38:61f::/42", "20115"}, - {"2a02:f640::/29", "58291"}, - {"2001:4de0:3000::/45", "33438"}, - {"240a:a655::/32", "144271"}, - {"2804:6410::/32", "269402"}, - {"2a0d:e640::/29", "210017"}, - {"2602:feda:a2::/47", "46997"}, - {"2606:bc00:5000::/32", "19419"}, - {"2607:fdb8:4::/48", "7181"}, - {"2800:381:bbbc::/33", "10834"}, - {"2803:9800:91c0::/37", "11664"}, - {"2804:7754::/32", "61604"}, - {"2806:2f0:1283::/43", "17072"}, - {"2a02:888:40::/46", "48695"}, - {"2a04:4e40:fe10::/44", "54113"}, - {"2a09:7:2004::/48", "35537"}, - {"2a10:6f00::/32", "399975"}, - {"2408:8957:ef40::/40", "17816"}, - {"2409:8924:7b00::/37", "56046"}, - {"2804:4080::/32", "265963"}, - {"2806:2f0:8001::/46", "17072"}, - {"2001:67c:18fc::/48", "35073"}, - {"2804:eec:1302::/36", "28226"}, - {"2a02:26f0:117::/48", "21342"}, - {"2a02:26f0:bb00::/48", "34164"}, - {"2c0f:f020:3000::/33", "327907"}, - {"2405:3001::/32", "4641"}, - {"2600:370f:4020::/47", "32261"}, - {"2607:fcc8:afc1::/33", "10796"}, - {"2804:5064::/32", "268386"}, - {"2a00:dc0::/32", "39560"}, - {"2001:428:b21::/48", "4015"}, - {"2001:503:91ef::/48", "7342"}, - {"2001:550:6502::/38", "174"}, - {"2001:559:152::/48", "33652"}, - {"2402:800:5a01::/44", "7552"}, - {"2404:9d00::/32", "135817"}, - {"2a02:26f7:cd81::/46", "20940"}, - {"2a03:ec0::/47", "199669"}, - {"2001:ee0:8300::/36", "45899"}, - {"2401:4300:abcd::/48", "45184"}, - {"2408:8456:3800::/41", "17623"}, - {"2409:4064:5000::/27", "55836"}, - {"2804:fc4::/32", "263602"}, - {"2804:3800:1000::/34", "266449"}, - {"2a0b:df00::/32", "44984"}, - {"2604:6600:200a::/43", "40676"}, - {"2620:0:2b10::/48", "20381"}, - {"2409:8020:91::/42", "56046"}, - {"240e:3b2:c000::/37", "140315"}, - {"2600:1409:5801::/34", "20940"}, - {"2803:55c0::/32", "265715"}, - {"2001:559:8800::/33", "7922"}, - {"2408:84f3:2e60::/40", "17623"}, - {"2804:547c::/32", "268653"}, - {"2a03:63c0::/32", "199578"}, - {"2400:9380:8bc0::/44", "136167"}, - {"2600:1004:9100::/44", "6167"}, - {"2804:2d50::/32", "265274"}, - {"2804:43f8::/32", "267613"}, - {"2a00:54e0::/32", "199324"}, - {"2401:cbc0::/32", "23778"}, - {"240a:a04a::/32", "142724"}, - {"2600:370f:37ca::/42", "32261"}, - {"2606:ae80:1410::/44", "25751"}, - {"2620:42:c000::/48", "395089"}, - {"2a02:888:8140::/46", "48695"}, - {"2a09:bac0:78::/47", "13335"}, - {"2001:250:2011::/48", "23910"}, - {"2406:9c40:1002::/34", "55366"}, - {"2600:1901:4020::/32", "15169"}, - {"2602:ffe4:c3b::/45", "21859"}, - {"2804:d4::/32", "28138"}, - {"2804:6a3c::/32", "270321"}, - {"2409:8c74:f200::/36", "9808"}, - {"2600:9000:2089::/45", "16509"}, - {"2803:5c80:6034::/48", "64114"}, - {"2a01:5b40::/45", "12996"}, - {"2001:9e0::/29", "12414"}, - {"2401:c7c0:21a::/48", "134148"}, - {"2603:c0e0::/39", "54253"}, - {"2620:8d::/48", "23342"}, - {"2a00:1728:20:200::/48", "31490"}, - {"2a09:a280::/29", "210051"}, - {"2401:4900:5b80::/42", "45609"}, - {"2800:1e0:1071::/40", "7195"}, - {"2a02:f040:a::/48", "59605"}, - {"240e:264:1000::/36", "140329"}, - {"2804:4970::/32", "267184"}, - {"2804:4e38::/32", "268247"}, - {"2804:61bc::/32", "269253"}, - {"2a02:26f7:e8c1::/46", "20940"}, - {"2a03:39c0::/29", "43858"}, - {"2a07:9e00::/29", "20740"}, - {"2001:6d0:ffc7::/48", "8985"}, - {"2620:119:501b::/45", "13443"}, - {"2804:5cf0::/32", "268940"}, - {"2001:418:2401:2::/35", "2914"}, - {"2001:4de0::/47", "34343"}, - {"2402:800:b920::/41", "7552"}, - {"2405:84c0:ff26::/44", "59598"}, - {"240a:a885::/32", "144831"}, - {"2600:370f:35aa::/43", "32261"}, - {"2804:cc0::/32", "52550"}, - {"2402:9d80:601::/48", "131429"}, - {"240a:a3bd::/32", "143607"}, - {"2c0f:faa0::/32", "36998"}, - {"2403:2900::/32", "132005"}, - {"2406:daa0:9040::/44", "16509"}, - {"2406:e000:378::/47", "23655"}, - {"240a:14:ecc::/48", "9605"}, - {"2607:fcd0:100:7f01::/48", "8100"}, - {"2a00:e20:154::/31", "25048"}, - {"2a02:540::/45", "35432"}, - {"2a04:4e40:d600::/48", "54113"}, - {"2604:20c0:2000::/36", "40641"}, - {"2620:4d:400e::/48", "395403"}, - {"2a02:1c0::/29", "29084"}, - {"2a02:26f7:ce80::/48", "36183"}, - {"2a06:c840::/29", "198024"}, - {"2001:500:7::/48", "40490"}, - {"2001:56a:e::/47", "7861"}, - {"2402:a0c0:6::/48", "137922"}, - {"240a:aeb7::/32", "146417"}, - {"2804:2cd0::/32", "265245"}, - {"2a02:26f7:b9c6::/47", "20940"}, - {"2001:550:8200:1::/36", "174"}, - {"2401:4900:38e0::/43", "45609"}, - {"240e:44d:7380::/41", "4134"}, - {"2806:370:40a0::/44", "28403"}, - {"2a03:37a0::/32", "59755"}, - {"2001:940::/32", "12853"}, - {"2001:1a68:54::/32", "15694"}, - {"2409:8904:d170::/40", "24547"}, - {"2801:80:1330::/48", "264019"}, - {"2804:d88::/32", "52637"}, - {"2a04:4e40:4410::/41", "54113"}, - {"2001:559:8005::/44", "7922"}, - {"240e:a7:7fc0::/46", "140508"}, - {"2606:2200::/32", "35986"}, - {"2804:3dbc:c000::/35", "266550"}, - {"2a02:e48::/32", "5379"}, - {"2400:cb00:94::/44", "13335"}, - {"2402:ea80::/48", "17747"}, - {"2407:1e40:501::/38", "141732"}, - {"2409:8915:2700::/40", "56044"}, - {"2a03:f1c0::/32", "61121"}, - {"2a0f:3d81::/29", "1239"}, - {"2001:48f8:f330::/36", "11232"}, - {"2409:8728:4600::/32", "56041"}, - {"240e:3b6:d000::/36", "134772"}, - {"2605:a401:86cd::/39", "33363"}, - {"2a02:26f7:62::/48", "36183"}, - {"2a04:1c0::/29", "57795"}, - {"240e:964:5000::/37", "58772"}, - {"2605:6400:1::/46", "53667"}, - {"2607:f810:f40::/32", "6192"}, - {"2804:15a4:11a0::/38", "263400"}, - {"2001:559:546::/48", "33651"}, - {"240a:afa4::/32", "146654"}, - {"2a06:2bc0::/29", "204171"}, - {"2001:1638::/32", "44066"}, - {"2407:2640::/32", "141549"}, - {"2409:8057:3020::/47", "9808"}, - {"2800:bf0:827a::/40", "52257"}, - {"2804:5e40::/32", "269021"}, - {"2a02:26f0:90::/45", "20940"}, - {"2a03:8320::/32", "200874"}, - {"2001:12e8::/34", "16397"}, - {"2800:160:1b99::/42", "14259"}, - {"2a02:26f7:b5c4::/48", "36183"}, - {"2001:559:c4fb::/48", "33659"}, - {"2001:cb0:3203::/32", "4637"}, - {"240a:abd1::/32", "145675"}, - {"2800:160:1169::/46", "14259"}, - {"2a0e:e640::/29", "202844"}, - {"2001:4878:215::/46", "12222"}, - {"240a:a0f0::/32", "142890"}, - {"2001:559:770::/48", "22909"}, - {"2407:3100:8114::/33", "10118"}, - {"2602:806:b000::/40", "63279"}, - {"2620:11a:a033::/45", "36040"}, - {"2a01:8020::/32", "199800"}, - {"2a02:26f7:e700::/48", "36183"}, - {"2a0b:2cc0::/48", "203929"}, - {"2001:da8:26a::/48", "23910"}, - {"240a:ac50::/32", "145802"}, - {"240e:3b0:7a00::/32", "140313"}, - {"2603:c0f8:1210::/37", "20054"}, - {"2001:559:8750::/47", "20214"}, - {"2001:c30::/32", "4721"}, - {"2409:8057:3012::/47", "9808"}, - {"240a:aa4c::/32", "145286"}, - {"2605:3380:4d01::/48", "395174"}, - {"2001:250:342a::/48", "138438"}, - {"2001:67c:2cf8::/48", "12552"}, - {"2401:b0c0:f000::/48", "136941"}, - {"2407:38c0:64::/48", "59204"}, - {"240a:a0c4::/32", "142846"}, - {"2605:a404:de8::/46", "33363"}, - {"2804:29a8::/32", "264027"}, - {"2a02:26f7:f201::/46", "20940"}, - {"2a0d:d00::/29", "212865"}, - {"2a0f:1fc0::/29", "60262"}, - {"2001:4c70::/32", "28678"}, - {"240a:a0db::/32", "142869"}, - {"240a:a211::/32", "143179"}, - {"2a02:ff0:1e00::/40", "12735"}, - {"2a03:2880:f21a::/45", "32934"}, - {"2a0a:2842:f853::/48", "136796"}, - {"2a0b:6903::/48", "206873"}, - {"240e:30a::/35", "137691"}, - {"2600:100d:f110::/36", "22394"}, - {"2801:80:1e21::/48", "14026"}, - {"2803:d100:1000::/36", "52362"}, - {"2a02:2698:9000::/38", "41661"}, - {"2001:67c:15a3::/48", "5577"}, - {"2620:72:a000::/48", "20115"}, - {"2804:3234::/32", "265062"}, - {"2804:7ab4:200::/32", "271387"}, - {"2806:2f0:8043::/42", "17072"}, - {"2a03:14a0::/32", "60427"}, - {"2406:180:8000::/40", "63956"}, - {"2409:8c85:aa03::/48", "9808"}, - {"240e:d6:6000::/37", "133774"}, - {"2a06:d581:3000::/36", "3303"}, - {"2a0d:3842:1050::/48", "57629"}, - {"2804:3af8::/32", "266121"}, - {"2804:758c::/32", "271054"}, - {"2a02:5c20::/29", "60111"}, - {"2a0c:5c81::/29", "55081"}, - {"2a11:fe00::/29", "42375"}, - {"2600:1410:e001::/31", "20940"}, - {"2804:25e8::/32", "264310"}, - {"2a05:d050:a0c0::/44", "16509"}, - {"2a09:9c00::/29", "209947"}, - {"2001:4e8::/32", "6327"}, - {"2803:9800:a893::/45", "11664"}, - {"2804:6120::/32", "269214"}, - {"2a02:7080::/48", "398826"}, - {"2001:559:7d2::/48", "33657"}, - {"2001:da8:2009::/48", "23910"}, - {"2001:1980:900::/34", "29838"}, - {"240a:ab67::/32", "145569"}, - {"2606:6680:5::/48", "53340"}, - {"2620:1d5:a40::/37", "14773"}, - {"2804:6444::/35", "269417"}, - {"2806:230:4019::/48", "11888"}, - {"2a00:a140::/32", "34686"}, - {"2a02:1620::/32", "1290"}, - {"2a02:26f7:dc::/48", "36183"}, - {"2a02:27b0:5600::/32", "9146"}, - {"240e:980:9500::/40", "58563"}, - {"2604:4b40::/32", "396420"}, - {"2604:d600:108c::/39", "32098"}, - {"2803:4e40::/32", "264608"}, - {"2a00:1fa2:80c1::/34", "28884"}, - {"2a02:4e8::/32", "20738"}, - {"2a02:26f7:f791::/46", "20940"}, - {"2a05:3280::/37", "50999"}, - {"2a0f:c400:a::/48", "60781"}, - {"2001:559:49::/48", "33491"}, - {"2001:fd8:f2b0::/44", "4775"}, - {"2a02:f040:c::/48", "59605"}, - {"2001:559:c144::/48", "33667"}, - {"2001:fd8:f280::/42", "132199"}, - {"2001:1248:5621::/45", "11172"}, - {"2605:3380:1000::/36", "12025"}, - {"2804:14d:5cc3::/43", "28573"}, - {"2409:896a:4600::/39", "9808"}, - {"240a:a46d::/32", "143783"}, - {"2600:3501:1200::/33", "396998"}, - {"2a00:efe0::/32", "49489"}, - {"2a0c:e740::/33", "51778"}, - {"2001:559:c407::/44", "33659"}, - {"2405:2500:11::/48", "136566"}, - {"2409:801e:3000::/46", "9808"}, - {"2603:c021::/35", "31898"}, - {"2403:4280:1::/48", "138950"}, - {"240e:5f:6003::/48", "136200"}, - {"2a0d:4b00::/29", "204943"}, - {"2407:ed00::/35", "9587"}, - {"2603:c002:8000::/39", "31898"}, - {"2610:120::/36", "33606"}, - {"2804:14d:4c91::/45", "28573"}, - {"2401:d800:ff40::/42", "7552"}, - {"2403:300:a32::/48", "6185"}, - {"240e:14:2000::/33", "4134"}, - {"2804:18:7858::/39", "10429"}, - {"2804:3808::/32", "266451"}, - {"2804:54a0:1e00::/32", "27688"}, - {"2a00:cd0::/32", "48173"}, - {"2a01:5100::/32", "50032"}, - {"2a03:7000::/32", "28997"}, - {"2a0e:8940::/29", "209528"}, - {"2a0e:b800:abcd::/48", "20473"}, - {"2a10:5740::/46", "34412"}, - {"2804:1040:b100::/33", "263626"}, - {"2a02:26f7:d9c8::/48", "36183"}, - {"2001:ae1::/32", "42008"}, - {"2804:1384::/32", "263537"}, - {"2a00:b404:e000::/36", "203329"}, - {"2a02:26f7:f::/48", "20940"}, - {"2a02:26f7:cf41::/46", "20940"}, - {"2a02:26f7:ec11::/42", "20940"}, - {"2a06:c240:40::/29", "49222"}, - {"2a0b:db00::/29", "13285"}, - {"2001:559:82c5::/44", "7015"}, - {"2409:896a:3c00::/39", "9808"}, - {"240e:5f:6010::/26", "4134"}, - {"2001:503:a83e::/48", "396574"}, - {"2001:559:4b3::/45", "7922"}, - {"240a:abf5::/32", "145711"}, - {"2606:91c0::/32", "400229"}, - {"2804:24e8::/32", "53171"}, - {"2a03:efc0:1900::/40", "54203"}, - {"2a07:3c80:400::/40", "209322"}, - {"2401:d800:27d0::/36", "7552"}, - {"2604:9b00:4800::/38", "14230"}, - {"2605:c000::/32", "7393"}, - {"2607:f5a0:8::/38", "17048"}, - {"2803:4580:9100::/38", "52468"}, - {"2804:7438:4::/32", "270967"}, - {"2806:2f0:4603::/42", "17072"}, - {"2a0c:c9c0::/30", "202414"}, - {"2001:559:5c6::/48", "33287"}, - {"2606:9f00::/32", "30640"}, - {"2001:559:791::/48", "33668"}, - {"2401:d800:7ba0::/41", "7552"}, - {"2401:d800:d370::/40", "7552"}, - {"2402:8100:17::/36", "55644"}, - {"2600:5400:e901::/27", "19108"}, - {"2405:7f00:8000::/39", "133414"}, - {"240c:c407::/28", "23910"}, - {"2a02:26f7:e549::/42", "20940"}, - {"2a11:f300::/29", "400522"}, - {"2001:559:871f::/48", "7015"}, - {"2001:559:c2cf::/48", "33652"}, - {"2408:8459:f130::/41", "17622"}, - {"2607:f740:e003::/48", "63911"}, - {"2804:130c:200::/32", "263512"}, - {"2804:1f36::/32", "268005"}, - {"2a0a:5c0::/29", "206298"}, - {"2001:250:5878::/37", "23910"}, - {"2001:420::/40", "109"}, - {"2001:e60:a788::/36", "4766"}, - {"240e:982:5100::/38", "4134"}, - {"2600:6c3a:83c::/41", "20115"}, - {"2a02:26f7:f344::/48", "36183"}, - {"2a06:b140::/29", "58264"}, - {"2a09:e200::/48", "49121"}, - {"2403:bc00:7fff::/32", "45668"}, - {"2602:fbd3:10::/48", "398653"}, - {"2620:100:4000::/46", "25923"}, - {"240a:aa9c::/32", "145366"}, - {"2607:ffb0:4007::/35", "6327"}, - {"2804:8614::/32", "272619"}, - {"2a02:26f7:d008::/48", "36183"}, - {"2a09:bac0:162::/47", "13335"}, - {"2a0a:ef40::/29", "5378"}, - {"2001:550:2a02::/39", "174"}, - {"240e:3bb:5600::/34", "4134"}, - {"2804:6784::/32", "269633"}, - {"2806:230:202d::/48", "11888"}, - {"2806:230:3021::/48", "11888"}, - {"240a:a4ec::/32", "143910"}, - {"2801:13:2800::/48", "14080"}, - {"2804:5918:2000::/33", "268169"}, - {"2a03:3500::/32", "13054"}, - {"2a0e:b107:19b1::/48", "206569"}, - {"2c0f:eb00:400::/40", "328962"}, - {"2c0f:f940::/32", "33779"}, - {"240e:9b:f021::/46", "140256"}, - {"2604:f980:5800::/40", "19957"}, - {"2605:5f00::/32", "15257"}, - {"2401:3bc0:601::/39", "137409"}, - {"2408:840c:5200::/40", "17621"}, - {"240a:a283::/32", "143293"}, - {"240e:979:9500::/40", "131325"}, - {"2804:6124::/32", "269215"}, - {"2001:1520:200::/40", "20738"}, - {"2404:ea80:d21::/32", "135373"}, - {"2408:8956:6a00::/40", "17622"}, - {"2408:8957:f140::/40", "17816"}, - {"2600:1417:68::/47", "20940"}, - {"2804:4dcc:6000::/32", "52856"}, - {"2804:7da4::/32", "61605"}, - {"2a02:3c0::/29", "44065"}, - {"2a11:7500::/29", "42375"}, - {"2001:559:87fe::/48", "7015"}, - {"2607:f220:10::/44", "19050"}, - {"2800:bf0:8268::/45", "52257"}, - {"2804:42e0::/32", "267533"}, - {"2a01:5041:400b::/48", "202196"}, - {"2403:fa40:2::/48", "23858"}, - {"2404:c400::/37", "9328"}, - {"240a:a880::/32", "144826"}, - {"240a:aa8a::/32", "145348"}, - {"2600:5c00:2304::/48", "3456"}, - {"2600:6c7f:90a0::/48", "20115"}, - {"2600:d800::/31", "13804"}, - {"2a00:14e8::/29", "25358"}, - {"240a:ae77::/32", "146353"}, - {"2606:7640::/32", "54502"}, - {"2a12:2a80::/29", "204790"}, - {"2001:559:c258::/48", "33651"}, - {"2600:1fa0:e040::/44", "16509"}, - {"2620:124:5000::/40", "19523"}, - {"2001:4860::/35", "15169"}, - {"2400:cb00:403::/44", "13335"}, - {"2404:f4c0:f402::/48", "209218"}, - {"2620:a2:e000::/48", "399273"}, - {"2804:2e3c::/32", "265334"}, - {"2a00:6920:e000::/39", "42003"}, - {"2001:1248:5bb6::/41", "11172"}, - {"2405:84c0:fadf::/42", "9886"}, - {"2406:d501::/44", "136557"}, - {"2a03:32c0:16::/48", "29555"}, - {"2a05:f7c0::/29", "43260"}, - {"2001:559:846e::/48", "33287"}, - {"2001:579:b914::/41", "22773"}, - {"240a:abf3::/32", "145709"}, - {"2a00:d8c0::/48", "31138"}, - {"2402:5300:4004::/42", "45903"}, - {"2409:8069:2c00::/30", "9808"}, - {"2409:8752:f00::/35", "56047"}, - {"2001:559:40b::/45", "33659"}, - {"2a00:1628::/32", "21360"}, - {"2a02:cb80:2120::/48", "43766"}, - {"2602:107:1110::/48", "33363"}, - {"2604:5500:800::/42", "19165"}, - {"2804:3454::/32", "265451"}, - {"2a01:4640:100::/38", "9042"}, - {"2a02:ee80:4025::/44", "3573"}, - {"2402:e280:3d98::/47", "134674"}, - {"2406:3003:3030::/41", "55430"}, - {"2409:8924:8f00::/35", "56046"}, - {"240a:a1d7::/32", "143121"}, - {"2605:8bc0:3462::/48", "26695"}, - {"2a05:f8c0::/29", "49940"}, - {"2408:8459:8630::/41", "17622"}, - {"240a:ab07::/32", "145473"}, - {"2605:2800:8300::/48", "14373"}, - {"2607:fb91:2000::/36", "21928"}, - {"2801:18c::/48", "10753"}, - {"2804:6f14::/32", "270637"}, - {"2a02:22e0::/32", "38987"}, - {"2a02:af80::/29", "39440"}, - {"2a03:53a0::/32", "31736"}, - {"2a04:71c7::/32", "206583"}, - {"2604:ff00:b000::/44", "36271"}, - {"2804:2d30::/32", "265265"}, - {"2a0a:7c40::/32", "205925"}, - {"2a0d:2146:be00::/43", "50801"}, - {"2400:8800::/39", "3491"}, - {"2804:3e44::/34", "266584"}, - {"2001:67c:200::/48", "51038"}, - {"2001:df6:7900::/48", "135843"}, - {"2800:160:2cc3::/43", "14259"}, - {"2001:678:998::/48", "200288"}, - {"2404:ec00::/32", "18081"}, - {"2604:1300:4000::/34", "3833"}, - {"2804:250::/32", "262803"}, - {"2804:3d54::/32", "266268"}, - {"2a11:1b00::/29", "210967"}, - {"2001:67c:24b0::/48", "50905"}, - {"2001:67c:2858::/48", "8304"}, - {"240a:a555::/32", "144015"}, - {"2600:140f:3a00::/48", "9498"}, - {"2604:d600:c54::/42", "32098"}, - {"2804:14d:4cd2::/45", "28573"}, - {"240e:44d:5c80::/41", "4134"}, - {"2602:80a::/40", "2722"}, - {"2620:13f:f000::/44", "397687"}, - {"2a02:5180::/32", "43247"}, - {"2a03:2880:4000::/32", "32934"}, - {"2a03:32a0::/32", "198225"}, - {"2a0c:c00:400::/41", "208402"}, - {"2a0e:46c4:2c25::/48", "137509"}, - {"2001:559:577::/48", "7015"}, - {"2400:70c0::/32", "58507"}, - {"2402:800:5b2b::/43", "7552"}, - {"2804:7e08::/32", "271598"}, - {"2a00:dcc0::/32", "34971"}, - {"2a02:26f7:f9c9::/42", "20940"}, - {"2607:f778::/32", "32035"}, - {"2804:22f8::/32", "264135"}, - {"2a03:1980:d113::/48", "61029"}, - {"2a07:85c3::/48", "174"}, - {"2a0a:3380::/29", "16353"}, - {"2a0d:3b80::/29", "39384"}, - {"2a0d:ca47:3::/36", "8423"}, - {"2a10:cc44:112::/48", "59922"}, - {"2620:0:2ed0::/48", "26711"}, - {"2620:125:4008::/45", "394812"}, - {"2804:e30:400::/45", "11338"}, - {"2a02:26f7:f004::/48", "36183"}, - {"2001:250:6007::/48", "24364"}, - {"2001:550:1:d::/55", "174"}, - {"2001:67c:135c::/48", "12552"}, - {"2001:67c:136c::/48", "60384"}, - {"2a02:26f7:cf05::/46", "20940"}, - {"2a02:26f7:e74c::/48", "36183"}, - {"2001:1b70:b3::/48", "6461"}, - {"2405:7f00:8520::/36", "133414"}, - {"240a:2:d90::/44", "9605"}, - {"240c:4000::/24", "38365"}, - {"2600:140b:7400::/48", "31109"}, - {"2602:fd21:800::/37", "398488"}, - {"2801:80:350::/48", "262524"}, - {"2a02:2498:53aa::/48", "13213"}, - {"2a02:26f7:30::/48", "36183"}, - {"2a06:ecc0::/29", "12552"}, - {"2a0a:ec02:902::/48", "42692"}, - {"2600:1017:a400::/44", "22394"}, - {"2804:894::/32", "262379"}, - {"2a0a:e5c1:500::/38", "207996"}, - {"2402:2f00::/32", "58434"}, - {"2404:b9c0::/32", "137409"}, - {"2620:160:e720::/44", "4196"}, - {"2001:4c88::/32", "49100"}, - {"2800:160:1855::/46", "14259"}, - {"2803:f7a0::/32", "267783"}, - {"2a00:1e50:8000::/33", "204273"}, - {"2803:9800:a501::/45", "11664"}, - {"2804:4308::/32", "267544"}, - {"2a00:1db8::/29", "34659"}, - {"2a02:26f7:4b::/48", "20940"}, - {"2a0d:77c7:2241::/35", "7489"}, - {"2a0f:8e40::/29", "200602"}, - {"2409:8c54:b010::/28", "56040"}, - {"2600:140b:2601::/39", "20940"}, - {"2a02:2668:6200::/37", "16345"}, - {"2001:559:205::/48", "20214"}, - {"2001:559:284::/48", "33657"}, - {"2406:cb40::/48", "395092"}, - {"2804:df8::/32", "52532"}, - {"2a0a:3980:9::/48", "198949"}, - {"2a0d:2587:c200::/48", "7721"}, - {"2001:559:8050::/47", "33491"}, - {"2001:559:8352::/48", "33660"}, - {"2404:f340:4000::/34", "139190"}, - {"240a:a23f::/32", "143225"}, - {"2607:f740:19::/48", "36236"}, - {"2607:ff00:500::/40", "11572"}, - {"2800:bf0:3a00::/46", "52257"}, - {"2804:3424::/32", "265438"}, - {"2a0b:4d07:701::/46", "44239"}, - {"2a0f:b100:100::/40", "210118"}, - {"2001:559:160::/48", "20214"}, - {"2804:7c7c:e00::/32", "271499"}, - {"2a11:48c0::/29", "24940"}, - {"2001:ee0:ea00::/40", "45899"}, - {"2400:3460::/32", "131812"}, - {"240a:af7c::/32", "146614"}, - {"2804:a48::/32", "263084"}, - {"2804:1f38::/32", "268118"}, - {"2a10:cc42:137e::/40", "20473"}, - {"2001:559:38::/45", "7922"}, - {"240a:a3e6::/32", "143648"}, - {"2a0b:4340:530::/41", "131477"}, - {"2a02:ee80:4070::/46", "3573"}, - {"2a04:9600::/29", "199766"}, - {"2804:2514::/32", "264259"}, - {"2001:559:58a::/47", "7922"}, - {"2001:67c:90c::/48", "41294"}, - {"240a:a1ee::/32", "143144"}, - {"2804:2a60:ff00::/40", "263089"}, - {"2a0a:2640::/29", "200428"}, - {"2a02:da8::/32", "39906"}, - {"2a02:4bc0::/32", "20618"}, - {"2001:df1:7e00::/48", "135300"}, - {"2001:fd8:f330::/44", "4775"}, - {"2600:1fa0:8120::/44", "16509"}, - {"2800:bf0:3024::/43", "27947"}, - {"2804:14d:2c84::/42", "28573"}, - {"2a05:3240::/29", "59780"}, - {"2a09:4dc0::/32", "196822"}, - {"2600:14c0::/45", "21342"}, - {"2620:149:65::/43", "714"}, - {"2a0c:9a40:1010::/45", "202479"}, - {"2001:579:b950::/40", "22773"}, - {"2001:ee0:d540::/36", "45899"}, - {"2403:1ec0:1610::/48", "4812"}, - {"2001:2a8::/32", "7670"}, - {"2001:388:608d::/35", "7575"}, - {"2406:7900:7226::/48", "132300"}, - {"2a00:1728:20::/55", "31490"}, - {"2001:67c:98::/48", "15600"}, - {"2001:1248:5965::/44", "11172"}, - {"2402:1200:156::/32", "24523"}, - {"2604:e180:5206::/32", "55002"}, - {"2607:f220::/44", "26810"}, - {"2804:73d8::/32", "270941"}, - {"2806:286:6000::/32", "265524"}, - {"2a0e:a680::/48", "8767"}, - {"2401:d800:cc0::/42", "7552"}, - {"2408:841a::/29", "4837"}, - {"2605:6800::/32", "11996"}, - {"2a07:e300::/29", "43341"}, - {"2001:559:15e::/48", "33659"}, - {"2604:d600:1c0b::/43", "32098"}, - {"2804:214:2::/44", "26615"}, - {"2001:550:10d::/38", "174"}, - {"2405:5540::/32", "133676"}, - {"2a02:4e0:2300::/42", "16135"}, - {"2404:7940::/32", "58593"}, - {"240a:ad89::/32", "146115"}, - {"240c:c781::/32", "24367"}, - {"2600:370f:37e1::/45", "32261"}, - {"2600:8808:4000::/31", "22773"}, - {"2607:fdf0:5ef2::/45", "8008"}, - {"2804:1088:8000::/33", "52913"}, - {"2804:3488::/32", "262766"}, - {"2404:f4c0:f944::/47", "142551"}, - {"2a00:8780::/32", "8829"}, - {"2a01:198:ff00::/40", "60781"}, - {"2a02:26f0:cd00::/48", "34164"}, - {"2a02:26f7:dc0d::/42", "20940"}, - {"2c0f:f5d8::/32", "37381"}, - {"2001:57a:7002::/45", "22773"}, - {"2408:84e2:200::/40", "17621"}, - {"2800:b10:10::/48", "27884"}, - {"2803:abc0::/48", "265632"}, - {"2804:20f0::/32", "264522"}, - {"2a0b:3100::/39", "12859"}, - {"2a10:c941:101::/30", "35277"}, - {"2001:559:c436::/48", "7016"}, - {"2406:daa0:6020::/44", "16509"}, - {"2408:8957:5d00::/40", "17816"}, - {"240e:438:6420::/43", "140647"}, - {"2604:bd40::/32", "395236"}, - {"2804:13b0::/44", "263546"}, - {"2804:6558::/32", "269484"}, - {"2a03:80c0::/47", "210079"}, - {"2a0d:2146:8040::/48", "209864"}, - {"2a0d:9b00::/32", "207498"}, - {"2605:4580:3141::/46", "14299"}, - {"2800:bf0:3440::/45", "52257"}, - {"2804:5538::/32", "268697"}, - {"2806:230:2016::/48", "265594"}, - {"2402:800:f192::/41", "7552"}, - {"240a:a051::/32", "142731"}, - {"240e:3b8:1200::/39", "4134"}, - {"2a02:26f7:f581::/46", "20940"}, - {"2a06:1a00::/33", "39824"}, - {"2804:a14::/34", "262342"}, - {"2a04:ff00:501::/40", "206607"}, - {"2001:388:c5::/42", "7575"}, - {"2001:4878:151::/48", "12222"}, - {"2401:1d40:4000::/32", "59019"}, - {"2403:e800:80c::/39", "4637"}, - {"2404:bf40:a182::/42", "139084"}, - {"2600:1f13::/36", "16509"}, - {"2800:160:1c9f::/42", "14259"}, - {"2804:4404::/32", "267616"}, - {"2a01:8480:2005::/32", "15704"}, - {"2408:80e3:8000::/33", "4837"}, - {"2804:7f58::/32", "271682"}, - {"2405:4803:c4e::/40", "18403"}, - {"2001:678:978::/48", "209347"}, - {"2405:1500::/42", "58717"}, - {"2409:8924:7300::/37", "56046"}, - {"240e:44d:5400::/42", "140345"}, - {"2c0f:fd20::/32", "36909"}, - {"2800:bf0:2820::/44", "52257"}, - {"2803:5c40::/32", "263796"}, - {"2a01:97a0::/32", "34702"}, - {"2001:438:fffd:127::/46", "6461"}, - {"2001:559:c307::/48", "33657"}, - {"2001:1a11:122::/45", "8781"}, - {"2408:8656:3b00::/37", "17816"}, - {"2a0c:5540::/43", "204020"}, - {"2400:1c00:f0::/44", "45143"}, - {"240a:a413::/32", "143693"}, - {"240a:abcc::/32", "145670"}, - {"2804:4858::/32", "267115"}, - {"2a02:26f7:bec8::/48", "36183"}, - {"2001:250:84d::/46", "23910"}, - {"2001:550:5b00:3::/37", "174"}, - {"2001:559:228::/43", "33491"}, - {"2a07:3500:1060::/47", "208240"}, - {"2a0d:a280::/29", "206487"}, - {"2804:6440::/32", "269416"}, - {"2a03:97e0::/32", "203673"}, - {"2a07:85c0::/48", "174"}, - {"2a0a:c980::/29", "48596"}, - {"2001:559:372::/48", "13367"}, - {"240e:e1:1000::/33", "4134"}, - {"2604:c400::/32", "30350"}, - {"2620:81:c000::/48", "393420"}, - {"2804:2930::/32", "264002"}, - {"2a04:4e40:b200::/48", "54113"}, - {"2001:da8:6f01::/40", "23910"}, - {"2001:44b8:3b::/48", "4739"}, - {"2600:1000::/44", "6167"}, - {"2607:f438::/32", "23520"}, - {"2804:4358::/32", "267564"}, - {"2001:678:980::/48", "35675"}, - {"2401:4900:5110::/44", "45609"}, - {"2405:ce00::/32", "7575"}, - {"2408:8459:bc30::/41", "17622"}, - {"2604:2380::/32", "33029"}, - {"2a02:26f7:d385::/46", "20940"}, - {"2a03:6940::/32", "61266"}, - {"2001:de8:13::/48", "55822"}, - {"2001:4998:1b1::/44", "10310"}, - {"2806:104e:3::/45", "8151"}, - {"2a02:26f7:bb::/48", "20940"}, - {"2a03:af80::/29", "16342"}, - {"2001:fb0:109f:8006::/64", "7470"}, - {"2001:4479:900::/35", "7545"}, - {"2401:d800:53c0::/42", "7552"}, - {"2600:9000:1e0c::/48", "16509"}, - {"2606:4700:8d90::/44", "13335"}, - {"2a06:c980::/29", "13287"}, - {"2a09:d880::/48", "209680"}, - {"2a02:c740::/30", "24978"}, - {"2a07:8140::/36", "49690"}, - {"2405:7f00:3203::/45", "133414"}, - {"240a:a20f::/32", "143177"}, - {"2804:4bd8:600::/33", "267332"}, - {"2806:2f0:21e0::/48", "17072"}, - {"2a04:7c0:1::/45", "61135"}, - {"2400:dbc0::/32", "133255"}, - {"2600:1014:b0d0::/42", "6167"}, - {"2a03:49e0::/32", "58260"}, - {"2a0e:97c0:720::/48", "208779"}, - {"2408:8206:19d0::/32", "4808"}, - {"2409:8a52:500::/38", "56047"}, - {"2800:440:2000::/42", "27738"}, - {"2803:6910::/32", "272004"}, - {"2804:214:8018::/45", "26615"}, - {"2a02:26f7:cc89::/46", "20940"}, - {"2a02:46e0::/39", "60049"}, - {"2001:250:209::/48", "24348"}, - {"2001:4479:c000::/36", "7545"}, - {"2402:800:6239::/41", "7552"}, - {"2409:805f:3900::/26", "9808"}, - {"2a0f:e1c3::/29", "60781"}, - {"2407:c00::/33", "45356"}, - {"240a:a3c5::/32", "143615"}, - {"2602:fbf1:20::/40", "38136"}, - {"2605:dd40:9000::/33", "398549"}, - {"2804:8f4:3000::/40", "52875"}, - {"2001:428:4408::/36", "209"}, - {"2a02:23a0::/32", "13287"}, - {"2001:67c:2204:607::2ffa:1/48", "24708"}, - {"2408:8956:a800::/40", "17622"}, - {"240a:a7db::/32", "144661"}, - {"240a:a7fa::/32", "144692"}, - {"2600:1488:a301::/41", "20940"}, - {"2620:46:2000::/48", "13535"}, - {"2804:fac::/32", "263598"}, - {"2001:4d0:6118::/48", "10343"}, - {"240e:95d:2800::/37", "139316"}, - {"2a0e:8f02:2130::/48", "211722"}, - {"2a0f:de40::/48", "60781"}, - {"240a:aa1a::/32", "145236"}, - {"2606:34c0:1::/48", "398810"}, - {"2800:440:240::/48", "27738"}, - {"2804:79bc::/32", "271324"}, - {"2a04:4280:30::/48", "43260"}, - {"2a0b:6440::/29", "41779"}, - {"2a0d:5bc0::/32", "210252"}, - {"2001:428:b22::/45", "209"}, - {"2001:559:c38d::/48", "22909"}, - {"2001:df7:80::/48", "136697"}, - {"2a0c:b381::/37", "204731"}, - {"2a0d:f80::/29", "58273"}, - {"2a01:c50e:9800::/38", "12479"}, - {"2a02:d4e0::/30", "197491"}, - {"2401:d800:9d30::/41", "7552"}, - {"240a:abc1::/32", "145659"}, - {"2600:5000::/30", "7029"}, - {"2604:ae00:3::/48", "4452"}, - {"2a09:da00::/32", "35913"}, - {"2409:8008:3900::/32", "24547"}, - {"240a:af24::/32", "146526"}, - {"2605:a404:cd0::/42", "33363"}, - {"2804:774::/38", "52858"}, - {"2a05:d050:6080::/44", "16509"}, - {"2001:df1:d400::/47", "133904"}, - {"2001:44b8:30e5::/44", "7545"}, - {"2806:2f0:22::/48", "22884"}, - {"2a01:5043:2000::/48", "202196"}, - {"2605:5440::/44", "23328"}, - {"2605:bb00:1002::/47", "4213"}, - {"2620:1ec:c12::/38", "8075"}, - {"2a00:8c60:2::/48", "60432"}, - {"2a01:b740:a02::/48", "6185"}, - {"2a0d:5600:34::/46", "9009"}, - {"2001:480:24::/44", "668"}, - {"2001:559:2a1::/46", "7015"}, - {"2001:67c:618::/48", "199061"}, - {"2001:43f8:160::/48", "37170"}, - {"2408:8456:5240::/39", "17816"}, - {"240e:108:82::/48", "58461"}, - {"2a02:40c0::/36", "60781"}, - {"2a06:a001:a030::/48", "211481"}, - {"2a09:6140::/29", "50107"}, - {"2001:559:8452::/47", "33287"}, - {"2001:df6:1500::/48", "134003"}, - {"2400:cb00:a146::/48", "13335"}, - {"2405:f600:41::/44", "45117"}, - {"240a:a533::/32", "143981"}, - {"2607:b080::/38", "29838"}, - {"2804:3894::/32", "266487"}, - {"2620:137:8::/48", "396253"}, - {"2804:5534:4000::/43", "268696"}, - {"2806:2f0:62a0::/35", "17072"}, - {"2a02:cb80:2a10::/48", "43766"}, - {"2a07:5900::/39", "203014"}, - {"2a10:c800::/47", "56322"}, - {"2400:1a00:b041::/39", "17501"}, - {"2409:8904:5060::/39", "24547"}, - {"240a:af10::/32", "146506"}, - {"2606:a780::/32", "394437"}, - {"2607:e880:55::/48", "13602"}, - {"2a02:2588::/29", "28851"}, - {"2a04:6480::/29", "39923"}, - {"2a10:3040::/30", "208256"}, - {"2001:550:3801::/38", "174"}, - {"2403:2700:10::/48", "38500"}, - {"2a02:26f7:d785::/46", "20940"}, - {"2a0a:af00::/29", "206955"}, - {"2a0b:f200::/32", "207031"}, - {"2001:678:a98::/48", "208702"}, - {"2602:fbfa::/36", "400270"}, - {"2620:18:c000::/48", "39287"}, - {"2804:8070::/32", "271750"}, - {"2a07:d840::/29", "210107"}, - {"2a0d:2bc0::/48", "43260"}, - {"2a00:6340::/33", "58299"}, - {"2a01:8840:e::/48", "12287"}, - {"2a02:ad8:204::/35", "12389"}, - {"2a06:6541:2003::/48", "397568"}, - {"2406:3000:35:100::/48", "16625"}, - {"2602:ff2e::/36", "21694"}, - {"2a00:df0::/32", "28717"}, - {"2600:140f:e800::/48", "12222"}, - {"2806:2f0:9521::/46", "17072"}, - {"2001:1890:1fff:103::/64", "6461"}, - {"2400:fc00:81b0::/38", "45773"}, - {"2b0d:6f84::/30", "37268"}, - {"2401:d800:f0a2::/39", "7552"}, - {"240a:ab30::/32", "145514"}, - {"2607:f9f1::/46", "22205"}, - {"2800:1e0:2::/36", "7195"}, - {"2801:1fc:1a::/48", "27951"}, - {"2804:29a0::/32", "28219"}, - {"2a0b:ee80::/29", "51395"}, - {"2001:418:1401:2c::/64", "20940"}, - {"2001:559:c31b::/48", "7016"}, - {"2405:9000:90::/48", "17719"}, - {"240e:979:2e00::/40", "134770"}, - {"2607:6980:e030::/44", "136620"}, - {"2a0e:b107:159b::/48", "142598"}, - {"2408:8256:196::/38", "17622"}, - {"2600:100b:f110::/36", "6167"}, - {"2806:20d:1908::/43", "32098"}, - {"2a05:4680::/29", "57902"}, - {"2001:559:4d6::/48", "22909"}, - {"2001:678:d50::/48", "213204"}, - {"2001:43f8:1400::/48", "328650"}, - {"2401:b780:6a::/33", "45410"}, - {"2605:d7c0::/32", "207976"}, - {"2a0b:a900::/30", "206712"}, - {"2001:1248:5696::/41", "11172"}, - {"2001:4ce8::/32", "250"}, - {"2403:600::/32", "135391"}, - {"2604:6780::/32", "13694"}, - {"2804:45e4:7c10::/39", "262567"}, - {"2a02:26f7:da44::/48", "36183"}, - {"2c0f:f7c0:3001::/32", "30986"}, - {"2804:85b4::/32", "272595"}, - {"2a02:ed04::/39", "50304"}, - {"2a0e:b107:9d7::/48", "213262"}, - {"2001:43f8:c70::/48", "328030"}, - {"2401:47c0:1b00::/37", "41095"}, - {"2605:ef80:16::/42", "36492"}, - {"2804:45a8::/32", "266941"}, - {"2001:559:8165::/48", "33654"}, - {"2001:559:111::/48", "33287"}, - {"2001:67c:710::/48", "197933"}, - {"2404:f801:802c::/48", "45139"}, - {"240e:67b:c200::/39", "140329"}, - {"2600:9000:2000::/44", "16509"}, - {"2806:230:6010::/48", "265594"}, - {"2a00:79a0::/36", "60771"}, - {"2a02:23e0::/32", "35393"}, - {"2a03:d640::/32", "24713"}, - {"2001:388:d::/42", "7575"}, - {"2600:6c2e:fd4::/32", "20115"}, - {"2604:200::/45", "33132"}, - {"2800:c20::/32", "28110"}, - {"2804:18:10e0::/43", "26599"}, - {"2806:20d:5b03::/45", "32098"}, - {"2a01:8180:1000::/36", "21150"}, - {"2a0f:2bc0::/29", "60262"}, - {"2001:559:c1b0::/48", "22909"}, - {"2400:c600:3320::/41", "24389"}, - {"2407:a2c0::/32", "63791"}, - {"2602:feb0::/36", "174"}, - {"2606:8740:1000::/40", "26968"}, - {"2a0b:7140:1::/48", "207408"}, - {"2001:67c:24d8::/48", "204228"}, - {"240a:a9ec::/32", "145190"}, - {"2605:9880::/38", "23470"}, - {"2804:469c::/33", "267000"}, - {"2804:4ef8::/33", "268295"}, - {"2a02:80::/29", "34244"}, - {"2a0b:9b40::/29", "202120"}, - {"2001:559:c49e::/48", "7725"}, - {"2001:559:c4a4::/48", "33651"}, - {"2001:1900:224e::/43", "3356"}, - {"2409:8704:300::/37", "24547"}, - {"2a01:758:fff9::/45", "3326"}, - {"2a02:26f7:f78d::/46", "20940"}, - {"2a0a:7640::/30", "206049"}, - {"2402:800:6310::/40", "7552"}, - {"2402:b400:41b0::/41", "45960"}, - {"2604:ca00:1100::/44", "36492"}, - {"2a05:dfc7:8::/48", "200897"}, - {"2c0f:3600:100::/38", "328855"}, - {"2403:1380::/32", "133421"}, - {"2408:8256:3d8a::/48", "17623"}, - {"2801:80:1af0::/48", "266373"}, - {"2804:104c:a000::/40", "263629"}, - {"2a0d:12c0:2000::/48", "205804"}, - {"2400:8480:3010::/42", "133385"}, - {"240a:a2d2::/32", "143372"}, - {"2602:fd53::/36", "395611"}, - {"2804:7b64::/32", "271429"}, - {"2a02:2048::/32", "1342"}, - {"2a0e:2740::/29", "208093"}, - {"2c0f:f2b0::/32", "328049"}, - {"2001:1388:7aa1::/39", "6147"}, - {"2409:8a5c::/33", "9808"}, - {"240a:a662::/32", "144284"}, - {"240e:d:b000::/37", "136191"}, - {"2806:2f0:4423::/41", "17072"}, - {"2620:98:e00e::/48", "399728"}, - {"2804:3a7c::/32", "266092"}, - {"2a00:12f8:410::/32", "9198"}, - {"2a02:26f7:f0c1::/46", "20940"}, - {"2a03:2887:ff4a::/47", "63293"}, - {"2001:df7:e080::/48", "137165"}, - {"2407:a180:1c9::/48", "131758"}, - {"240e:3b2:c800::/37", "4134"}, - {"2804:15a4::/35", "263400"}, - {"2806:2f0:3561::/46", "17072"}, - {"2a03:11a0:1::/48", "201684"}, - {"2a0e:a880::/36", "51561"}, - {"2600:9000:1170::/46", "16509"}, - {"2804:34:2007::/42", "28306"}, - {"2804:7ba4::/32", "271445"}, - {"2a0f:21c0::/29", "60262"}, - {"2a0f:8400::/32", "208210"}, - {"2001:559:135::/48", "33661"}, - {"2001:559:705::/48", "33659"}, - {"2402:8100:3840::/42", "45271"}, - {"2408:8647:1200::/28", "4837"}, - {"2620:ed::/48", "3660"}, - {"2804:18:6050::/45", "26599"}, - {"2a07:940::/29", "201127"}, - {"2001:559:c3c8::/48", "33651"}, - {"2401:47c0:1700::/36", "41095"}, - {"2404:ba00:4::/48", "17665"}, - {"240e:44d:2c00::/42", "140345"}, - {"2603:f7b0::/29", "396356"}, - {"2a0c:b641:7a1::/46", "207268"}, - {"2001:57a:aa09::/35", "22773"}, - {"2001:4350:3002::/32", "2609"}, - {"2402:7500:faff::/48", "24158"}, - {"2602:fe54::/43", "16584"}, - {"2804:2144:1000::/32", "52795"}, - {"2a01:8840:c2::/45", "12041"}, - {"2a02:26f7:b7::/48", "20940"}, - {"2001:559:c510::/48", "33287"}, - {"2404:c900:8::/46", "58682"}, - {"2a00:1730::/32", "25549"}, - {"2a01:c50f:e140::/37", "12479"}, - {"2804:5c44::/32", "268898"}, - {"2408:8406::/39", "4808"}, - {"2a0b:efc0:401::/32", "60893"}, - {"2001:4878:c220::/48", "12222"}, - {"2402:800:fca0::/39", "7552"}, - {"2806:2f0:31e1::/46", "17072"}, - {"2806:2f0:9941::/46", "17072"}, - {"2a0a:a400::/29", "64444"}, - {"2a11:3bc0::/29", "212238"}, - {"2001:559:715::/48", "33490"}, - {"2001:44b8:406b::/48", "4739"}, - {"2403:9800:6000::/40", "4771"}, - {"2406:2000:e4::/46", "56173"}, - {"2620:11a:40b0::/48", "7014"}, - {"2804:6474:c000::/34", "269429"}, - {"2a01:8840:2e::/43", "12041"}, - {"2a0e:97c0:6b0::/44", "210076"}, - {"2804:4e8c::/32", "268268"}, - {"2804:70c0:32::/48", "270746"}, - {"2400:201::/48", "4766"}, - {"2407:c940:2103::/32", "48024"}, - {"2600:9000:20a1::/44", "16509"}, - {"2806:230:5009::/48", "11888"}, - {"2806:250:1::/45", "28509"}, - {"2a01:9bc0::/29", "39686"}, - {"2a02:26f7:c185::/46", "20940"}, - {"2406:e00:800::/48", "55740"}, - {"2a00:1ca0::/34", "21413"}, - {"240a:aebf::/32", "146425"}, - {"240e:3b9:c800::/37", "4134"}, - {"2602:250::/28", "46690"}, - {"2804:3d28:a::/45", "7063"}, - {"2a02:2068:a000::/29", "15830"}, - {"2a02:26f7:df09::/42", "20940"}, - {"2600:1010:9f00::/44", "6167"}, - {"2602:fd92:a00::/40", "39618"}, - {"2804:52f4:a70::/40", "268552"}, - {"2001:48a8:68fd::/48", "177"}, - {"2804:20dc::/32", "264517"}, - {"2400:adc0:4000::/46", "9541"}, - {"2405:1c0:6171::/46", "55303"}, - {"240a:aeba::/32", "146420"}, - {"2800:160:1b37::/44", "14259"}, - {"2a00:1278::/32", "12813"}, - {"2a00:ccc0::/31", "57433"}, - {"2c0f:ed68::/32", "328170"}, - {"2001:559:781::/48", "33287"}, - {"2001:ee0:e500::/40", "45899"}, - {"2a02:26f7:c040::/48", "36183"}, - {"2a0d:d6c2::/29", "200350"}, - {"2408:8256:2f8b::/48", "17816"}, - {"2408:8459:9230::/41", "17622"}, - {"2801:1fc:34::/48", "27951"}, - {"2804:3b6c:c004::/46", "265442"}, - {"2a02:26f7:dd05::/46", "20940"}, - {"2001:559:c205::/48", "33491"}, - {"2001:df6:ad80::/48", "142064"}, - {"2606:5580::/47", "63242"}, - {"2804:3eb0::/32", "266615"}, - {"2a0b:d5c1:100::/40", "197202"}, - {"240e:44d:7480::/41", "4134"}, - {"2600:1415:2c01::/38", "20940"}, - {"2804:8080::/32", "271754"}, - {"2806:2f0:6081::/46", "17072"}, - {"2403:f3c0::/32", "131626"}, - {"2406:daa0:e0c0::/44", "16509"}, - {"2408:870c:90::/41", "17621"}, - {"2409:8904:8890::/39", "24547"}, - {"240a:a680::/32", "144314"}, - {"2600:380:a880::/38", "7018"}, - {"2a02:2e02:2630::/41", "12479"}, - {"2a05:bec0:40::/48", "44486"}, - {"2001:559:402::/47", "33287"}, - {"2401:d100::/44", "18705"}, - {"240e:964:3000::/37", "133775"}, - {"2600:140b:4c01::/35", "20940"}, - {"2608:c143:1::/48", "27066"}, - {"2a01:c9c0:c1::/46", "8891"}, - {"2001:67c:318::/48", "51608"}, - {"2001:1a11:b0::/47", "8781"}, - {"2604:880:207::/43", "29802"}, - {"2803:2a01:9800::/46", "27895"}, - {"2a0f:ca80:1337::/44", "208046"}, - {"2a10:f8c0::/29", "8387"}, - {"2402:800:52ee::/39", "7552"}, - {"2402:800:5771::/44", "7552"}, - {"2402:9e80:2a::/48", "140224"}, - {"2402:e380:12d::/43", "139073"}, - {"2607:f428:9350::/44", "11351"}, - {"2a00:d540::/29", "49250"}, - {"2a0f:5701:3515::/48", "205593"}, - {"2001:559:c11a::/48", "7015"}, - {"2401:bc40:e303::/48", "136899"}, - {"2620:11e:f000::/48", "6130"}, - {"2804:14c:7700::/40", "28573"}, - {"2404:1a40:200::/32", "9744"}, - {"2408:8459:aa30::/41", "17622"}, - {"2a04:3600::/29", "57487"}, - {"2a04:4e40:9600::/48", "54113"}, - {"2806:2f0:5121::/46", "17072"}, - {"2a00:e580::/29", "25424"}, - {"2401:c340::/46", "56136"}, - {"2401:ce80:1003::/32", "14340"}, - {"2408:84f3:e610::/42", "134543"}, - {"2409:8a3c:1400::/33", "24444"}, - {"2604:df40::/32", "394991"}, - {"2001:559:10b::/48", "7016"}, - {"2001:559:8764::/47", "33659"}, - {"2001:fd8:1a0::/48", "132199"}, - {"2001:1388:2f06::/44", "6147"}, - {"2409:821e::/31", "24400"}, - {"240a:af4d::/32", "146567"}, - {"2a02:26f7:da0d::/46", "20940"}, - {"2a02:26f7:ea09::/42", "20940"}, - {"2a07:a900::/29", "46261"}, - {"2001:67c:738::/48", "43139"}, - {"2001:da8:3010::/48", "24358"}, - {"2400:cb00:270::/48", "13335"}, - {"2801:1e4::/42", "27951"}, - {"2001:559:1b9::/46", "33652"}, - {"2800:160:17fa::/45", "14259"}, - {"2801:140:eeee::/48", "264798"}, - {"2a01:4c8::/32", "12576"}, - {"2a02:888:8240::/46", "48695"}, - {"2a11:3::/29", "8888"}, - {"2402:b940:200::/39", "138538"}, - {"2c0f:f388::/32", "37004"}, - {"2001:18b8:124::/32", "29789"}, - {"2401:4900:c00::/43", "45609"}, - {"2408:8956:3500::/40", "17816"}, - {"2a02:ee80:4285::/44", "3573"}, - {"2001:4210:980d::/43", "25818"}, - {"2600:1806:119::/48", "16552"}, - {"2607:f428:91b0::/41", "20115"}, - {"2a02:2398::/46", "9166"}, - {"2001:dc7:5df8::/45", "24151"}, - {"2001:559:815f::/48", "7015"}, - {"240a:aaef::/32", "145449"}, - {"240e:44d:2880::/41", "4134"}, - {"2803:2200::/32", "263174"}, - {"2a02:26f7:e580::/48", "36183"}, - {"2a10:31c0::/30", "208256"}, - {"2409:8054:3020::/47", "9808"}, - {"2607:f480:24::/48", "27435"}, - {"2a0f:4d80::/29", "201847"}, - {"2604:6600:e900::/40", "201106"}, - {"2804:487c::/32", "267124"}, - {"2804:542c:8000::/36", "268633"}, - {"2a02:26f7:f000::/48", "36183"}, - {"2409:8c44:801::/38", "24445"}, - {"2602:ffa6:300::/46", "62731"}, - {"2a02:26f7:f7d0::/48", "36183"}, - {"2a02:2af8:220::/37", "702"}, - {"2a0f:b100:200::/40", "201281"}, - {"2001:67c:2ce8::/48", "199508"}, - {"2620:121:a000::/44", "6082"}, - {"240a:a90f::/32", "144969"}, - {"2600:1409:9001::/36", "20940"}, - {"2a00:5f40::/29", "8469"}, - {"2a01:b200::/32", "44185"}, - {"240e:44d:2780::/41", "4134"}, - {"240e:938:f910::/44", "139462"}, - {"2804:194::/32", "53131"}, - {"2804:1f26:ca5a::/48", "265020"}, - {"2404:bf40:a583::/45", "7545"}, - {"2605:6300::/32", "27026"}, - {"2001:559:717::/48", "33659"}, - {"2402:800:9a9b::/42", "7552"}, - {"240a:a7bc::/32", "144630"}, - {"2607:f750:7000::/40", "23473"}, - {"2803:6700:220::/48", "263210"}, - {"2804:3108::/32", "264988"}, - {"2a00:8000::/32", "200707"}, - {"2a02:502::/32", "5538"}, - {"2a0d:49c0::/29", "43260"}, - {"2804:17c4::/32", "263250"}, - {"2a01:9d20::/29", "39611"}, - {"2402:e380:13f::/40", "139073"}, - {"2600:806:100::/48", "12234"}, - {"2602:ffc5:110::/44", "40676"}, - {"240a:aa87::/32", "145345"}, - {"240e:438:9640::/36", "4134"}, - {"2602:feb4:240::/44", "25961"}, - {"2607:f058::/34", "22302"}, - {"2803:6700:1000::/40", "263210"}, - {"2804:74::/32", "28338"}, - {"2804:22d8:8000::/33", "264126"}, - {"2a01:8840:11::/48", "13657"}, - {"2a02:26f7:ed08::/48", "36183"}, - {"2001:559:1a3::/48", "7922"}, - {"2001:559:c40b::/45", "7015"}, - {"2001:678:a7c::/48", "200924"}, - {"2602:feda:b9f::/48", "212995"}, - {"2a0a:2b00::/43", "52129"}, - {"2405:8a00::/40", "55824"}, - {"2406:d00::/48", "132165"}, - {"2606:4700:a2::/39", "13335"}, - {"2607:a800:408::/48", "15695"}, - {"2800:200:e2c1::/42", "12252"}, - {"2a10:1240::/29", "15589"}, - {"2a10:f240::/29", "211385"}, - {"2620:74:4f::/43", "7342"}, - {"2803:96c0::/32", "265654"}, - {"2402:800:5c55::/42", "7552"}, - {"2408:862e::/27", "4837"}, - {"240e:978:7100::/36", "4134"}, - {"2606:4840::/32", "399570"}, - {"2400:5ce0::/44", "149522"}, - {"2401:d800:b40::/42", "7552"}, - {"2804:2020::/32", "264470"}, - {"2a00:1588:f800::/37", "43139"}, - {"2a03:2880:f151::/45", "32934"}, - {"2400:adca::/39", "9541"}, - {"2409:8e28::/29", "56041"}, - {"2602:feb4:90::/44", "25961"}, - {"2603:c0e9::/36", "1218"}, - {"2001:44b8:2049::/48", "4739"}, - {"2804:45e4:8100::/33", "262567"}, - {"2a11:7480::/29", "1239"}, - {"2404:b300::/48", "59318"}, - {"2a02:26f7:e648::/48", "36183"}, - {"2a09:8280:14::/42", "40509"}, - {"2a0f:5707:aa10::/46", "208814"}, - {"240a:a363::/32", "143517"}, - {"2600:6c38:8ec::/43", "20115"}, - {"2606:2800:601b::/45", "15133"}, - {"2a0d:a400::/29", "30836"}, - {"2603:c020::/35", "31898"}, - {"2001:559:8603::/48", "33662"}, - {"2001:67c:20a0::/47", "50472"}, - {"2605:72c0:500::/40", "40401"}, - {"2a11:7b40::/29", "210545"}, - {"2001:559:820b::/45", "7016"}, - {"2605:e640::/32", "13370"}, - {"2804:b18:c020::/36", "52941"}, - {"2001:559:c371::/48", "33287"}, - {"2408:8957:c940::/40", "17816"}, - {"240a:a0cc::/32", "142854"}, - {"240a:a883::/32", "144829"}, - {"2607:2a00::/47", "29909"}, - {"2803:6200::/32", "262237"}, - {"2804:7d90:2::/32", "271569"}, - {"2001:418:1401:21::/64", "20940"}, - {"2001:559:835f::/48", "33287"}, - {"2001:559:c38e::/48", "7922"}, - {"2401:1c00:3080::/48", "131298"}, - {"2401:4800:2011::/48", "38457"}, - {"2402:800:7030::/41", "7552"}, - {"2408:8456:8040::/39", "17816"}, - {"240a:a71b::/32", "144469"}, - {"240e:f7:3000::/36", "136190"}, - {"2620:117:7002::/44", "26955"}, - {"2804:39c:6000::/32", "28329"}, - {"2804:f8c:5000::/32", "263591"}, - {"2804:3244:28::/32", "265066"}, - {"2a03:5a00:d::/48", "58319"}, - {"240a:a046::/32", "142720"}, - {"2800:484:5e00::/39", "14080"}, - {"2001:559:81e3::/48", "33652"}, - {"2401:f000::/47", "38477"}, - {"2406:1440:1101::/48", "7630"}, - {"2409:8008:db::/48", "24547"}, - {"240a:a8d0::/32", "144906"}, - {"2600:370f:7468::/40", "32261"}, - {"2804:f4::/32", "26606"}, - {"2a02:26f7:d3c8::/47", "36183"}, - {"2001:448a:5030::/41", "7713"}, - {"2409:806a:100::/36", "9808"}, - {"2602:fcce:f2::/36", "399200"}, - {"2604:a00:1010::/32", "19318"}, - {"2804:4b50::/34", "267297"}, - {"2a03:f80:40::/48", "9009"}, - {"2001:250:2808::/42", "138378"}, - {"2001:6d0:d4::/47", "8985"}, - {"2405:4802:7610::/32", "18403"}, - {"2600:1406:3e::/48", "35994"}, - {"2806:2f0:23e3::/43", "22884"}, - {"2a12:b840::/32", "29119"}, - {"2a01:8840:41::/48", "207266"}, - {"2001:fd8:f1f0::/44", "4775"}, - {"2408:8456:6a40::/39", "17816"}, - {"2801:16:c800::/48", "19429"}, - {"2803:b780:1::/48", "65000"}, - {"2a10:2f01:2b0::/46", "205635"}, - {"2001:250:5073::/48", "23910"}, - {"2401:c5c0::/47", "55492"}, - {"240a:a434::/32", "143726"}, - {"2607:fb90:7f00::/32", "21928"}, - {"2804:175c::/32", "263140"}, - {"2a10:8680::/29", "197071"}, - {"2001:da8:7015::/48", "23910"}, - {"2400:cb00:a710::/48", "13335"}, - {"2401:f880::/32", "133936"}, - {"2402:800:7d40::/42", "7552"}, - {"2408:8459:c50::/38", "17816"}, - {"2600:6c10:fc11::/46", "20115"}, - {"2408:84f3:a610::/42", "134543"}, - {"2804:8608::/32", "272615"}, - {"2001:559:835a::/48", "33287"}, - {"2401:c680:e::/48", "134371"}, - {"240e:44d:1200::/41", "140345"}, - {"2600:6c38:b47::/44", "20115"}, - {"2605:35c0::/36", "6597"}, - {"2607:fd48:200:3::/47", "13536"}, - {"2804:1664::/32", "263285"}, - {"2001:678:bd0::/48", "207631"}, - {"2001:67c:168c::/48", "199217"}, - {"2400:e240::/32", "38247"}, - {"2600:140b:cc00::/48", "24319"}, - {"2620:12c:3000::/44", "3356"}, - {"2a00:1248:501f::/32", "3216"}, - {"2a02:bd8::/32", "8535"}, - {"2a0e:e740::/30", "208338"}, - {"2409:800b:2b04::/47", "9808"}, - {"2a02:d0c2:2::/48", "212414"}, - {"2001:559:5e8::/48", "22909"}, - {"2804:297c:c3c0::/42", "262907"}, - {"2001:440:1880::/48", "1880"}, - {"2001:67c:151c::/48", "210543"}, - {"2a02:26f7:f545::/46", "20940"}, - {"2604:2d80:c030::/34", "30036"}, - {"2407:8b00:1163::/34", "64073"}, - {"2607:ea00::/32", "57"}, - {"2607:fb90:8c00::/35", "21928"}, - {"2620:f:2::/48", "3755"}, - {"2a01:160::/32", "16186"}, - {"2001:4c0:6003::/32", "855"}, - {"2407:8c00:20::/48", "55441"}, - {"2a02:26f7:ef50::/48", "36183"}, - {"2001:678:ce0::/48", "206384"}, - {"2404:1c40:45::/44", "24432"}, - {"2806:36f::/32", "265619"}, - {"2a02:26f7:c9c9::/46", "20940"}, - {"2001:559:c0ff::/48", "33660"}, - {"2001:559:c11b::/48", "33651"}, - {"2600:380:f1e2::/47", "64011"}, - {"2600:6c38:b31::/46", "20115"}, - {"2602:fdfc::/36", "36556"}, - {"2804:5b68::/32", "268841"}, - {"240a:a8ba::/32", "144884"}, - {"2602:fd92:800::/48", "211481"}, - {"2620:103:c006::/44", "14203"}, - {"2a04:e702:97f::/48", "9044"}, - {"2a07:8b00::/29", "202817"}, - {"2001:df7:1500::/48", "135955"}, - {"240a:a233::/32", "143213"}, - {"240e:3b5:2c00::/35", "134774"}, - {"2607:b400:a00::/48", "1312"}, - {"2607:fcf0:2::/45", "13445"}, - {"2800:370:4c::/43", "28006"}, - {"2804:4e58::/32", "268255"}, - {"2001:559:c48e::/48", "33659"}, - {"2001:1980:5400::/34", "29838"}, - {"2402:800:5855::/42", "7552"}, - {"2600:1016:f110::/31", "6167"}, - {"2607:f900::/32", "10823"}, - {"2806:2f0:90a6::/39", "17072"}, - {"2409:8904:5eb0::/39", "24547"}, - {"2600:2601:101::/28", "33362"}, - {"2a02:26f7:e900::/48", "36183"}, - {"2a02:6d40::/32", "42652"}, - {"2a0b:cf00::/32", "208683"}, - {"2a0e:f800::/29", "38919"}, - {"2001:550:4201::/37", "174"}, - {"2001:559:c451::/48", "7016"}, - {"240e:1:a000::/37", "137688"}, - {"2607:f6f8::/35", "30170"}, - {"2001:43f8:ab0::/48", "328093"}, - {"2620:171:51::/48", "715"}, - {"2804:244::/32", "262801"}, - {"2a06:a005:210::/44", "207705"}, - {"2001:500:8f::/48", "26710"}, - {"240a:a257::/32", "143249"}, - {"2a02:b60:4006::/32", "44217"}, - {"2a09:5c80::/29", "40976"}, - {"2001:559:833e::/48", "21508"}, - {"2001:44b8:6051::/45", "4739"}, - {"240a:a006::/32", "142656"}, - {"2a0a:1a40::/32", "38176"}, - {"2001:250:4::/48", "24348"}, - {"2401:7840::/32", "136795"}, - {"2402:d400:d::/32", "17762"}, - {"240e:438:9440::/38", "4134"}, - {"2804:4344::/32", "267559"}, - {"2804:6efc::/32", "270631"}, - {"2a00:4bc0:600::/40", "48263"}, - {"2001:559:8613::/48", "33650"}, - {"2403:f500:4000::/32", "10103"}, - {"2407:65c0::/32", "142272"}, - {"240a:a1d1::/32", "143115"}, - {"2603:fb40::/29", "397165"}, - {"2606:ad00::/32", "25694"}, - {"2801:1fc:32::/48", "27951"}, - {"2a01:c50f:3400::/36", "12479"}, - {"2a0f:27c0::/29", "399975"}, - {"2406:f400::/44", "38001"}, - {"240a:ae00::/32", "146234"}, - {"240e:108:11d8::/48", "134769"}, - {"240e:44d:3c00::/41", "140345"}, - {"2803:c3c0::/32", "27884"}, - {"2a0d:8f40::/29", "208906"}, - {"2001:559:815c::/48", "33287"}, - {"2001:559:8698::/48", "33659"}, - {"2a02:3000::/23", "6805"}, - {"2a11:58c0::/29", "62240"}, - {"2001:559:8489::/48", "33287"}, - {"2001:67c:2634::/48", "197431"}, - {"2401:d800:190::/42", "7552"}, - {"2403:5180:16::/48", "138467"}, - {"2604:6d00:2500::/48", "36223"}, - {"2804:4368:4d0::/42", "267568"}, - {"2a12:49c0::/30", "211444"}, - {"2001:67c:288::/48", "28855"}, - {"2402:800:9247::/43", "7552"}, - {"2403:8e80::/32", "134739"}, - {"240a:a93f::/32", "145017"}, - {"2804:1060::/32", "263632"}, - {"2804:7208::/32", "270828"}, - {"2a0b:c180::/32", "16019"}, - {"2a0e:7d02::/31", "211335"}, - {"2001:4868:4200::/40", "23148"}, - {"2402:4480::/38", "174"}, - {"2404:3280:b::/32", "9287"}, - {"2604:c7c0::/32", "35935"}, - {"2a00:f120::/32", "200026"}, - {"2a03:5120::/40", "6830"}, - {"2600:8804:a000::/30", "22773"}, - {"2a02:698::/32", "34784"}, - {"2a0c:e9c0::/29", "197036"}, - {"2405:da00::/47", "38235"}, - {"2602:107:e600::/40", "20001"}, - {"2606:5cc0:ff01::/45", "36263"}, - {"2606:6240::/46", "398447"}, - {"2a02:26f7:c001::/48", "20940"}, - {"2a04:c880::/32", "208189"}, - {"2600:140f:1800::/48", "9498"}, - {"2803:4be0::/32", "270078"}, - {"2a02:26f7:d2c9::/42", "20940"}, - {"2c0f:eb00:1300::/40", "328962"}, - {"2001:ee0:c540::/38", "45899"}, - {"2408:8459:4cc0::/38", "17816"}, - {"2607:6003:2307::/48", "19181"}, - {"2620:44::/47", "7133"}, - {"2801:80:1d90::/48", "265988"}, - {"2a02:26f7:ea90::/48", "36183"}, - {"2600:6c10:c35::/46", "20115"}, - {"2607:fb90:1f00::/34", "21928"}, - {"2a07:72c0::/29", "57029"}, - {"2001:1a11:10b::/48", "42298"}, - {"2605:21c0::/32", "20055"}, - {"2804:7884::/32", "271248"}, - {"2806:20d:350e::/43", "32098"}, - {"2402:e280:3d7c::/40", "134674"}, - {"2001:4478:ff01::/48", "4739"}, - {"2401:1040:400::/32", "134806"}, - {"2405:aac0:fe::/48", "139949"}, - {"240a:a66a::/32", "144292"}, - {"2605:380:40::/48", "42473"}, - {"2804:8284::/32", "272524"}, - {"2a02:26f7:b3c5::/46", "20940"}, - {"2001:559:c160::/48", "33660"}, - {"2400:4e80::/35", "131584"}, - {"2602:fed2:710b::/48", "34927"}, - {"240e:979:6f00::/35", "4134"}, - {"2603:c002:1210::/39", "31898"}, - {"2806:230:4035::/48", "11888"}, - {"2a01:568:6000::/32", "43950"}, - {"2a02:26f7:c3d5::/46", "20940"}, - {"2a02:26f7:eb04::/48", "36183"}, - {"2a03:5900::/44", "31126"}, - {"2408:8956:1500::/40", "17816"}, - {"2600:1008:b170::/40", "22394"}, - {"2a03:db80:5464::/48", "200943"}, - {"2a06:1e85:2::/48", "57782"}, - {"2800:160:2735::/36", "14259"}, - {"2803:eee0::/32", "269987"}, - {"2a04:f580:8000::/48", "4134"}, - {"2001:4878:b038::/48", "12222"}, - {"2400:c540:c277::/39", "59238"}, - {"2604:300::/32", "21947"}, - {"2a09:bac0:100::/48", "13335"}, - {"2001:df0:df80::/48", "139297"}, - {"2600:1406:9400::/48", "35994"}, - {"2a0a:380::/29", "49223"}, - {"2001:978:2a01::/46", "56638"}, - {"240a:ab50::/32", "145546"}, - {"2a01:ab80::/32", "204243"}, - {"2600:1014:b0f0::/44", "22394"}, - {"2804:37a8:1206::/43", "266428"}, - {"2806:101e:1::/48", "8151"}, - {"2604:ca00:1000::/48", "36492"}, - {"2400:dd01:1010::/34", "7497"}, - {"2800:484:e100::/40", "10620"}, - {"2800:bf0:828e::/48", "27947"}, - {"2803:5300::/32", "264637"}, - {"2406:8500::/32", "134773"}, - {"2600:370f:3721::/45", "32261"}, - {"2a10:7706::/31", "399975"}, - {"2c0f:f738:2202::/35", "61317"}, - {"2610:160:11::/48", "30312"}, - {"2801:80:400::/48", "263012"}, - {"2804:104c:e400::/40", "263629"}, - {"2a05:7900::/29", "48348"}, - {"2001:da8:701f::/48", "138371"}, - {"2001:44b8:2059::/48", "4739"}, - {"2001:559:707::/44", "7016"}, - {"2001:678:f38::/48", "211362"}, - {"2402:e280:212e::/47", "134674"}, - {"2404:4a00:3294::/33", "45629"}, - {"2600:d402::/28", "1403"}, - {"2604:4d40:7fff::/48", "399196"}, - {"2a00:eb9::/32", "16083"}, - {"2a02:6c20:829::/32", "207167"}, - {"2a04:4e42:ff3::/33", "54113"}, - {"2c0f:f5c0:131::/38", "29465"}, - {"2401:d800:d182::/42", "7552"}, - {"2605:48c0::/32", "397504"}, - {"2001:67c:1874::/48", "39249"}, - {"2409:8d14:20::/38", "56044"}, - {"2404:3800::/47", "45459"}, - {"2406:9e00:1110::/47", "55352"}, - {"2620:149:245::/37", "714"}, - {"2804:3848::/47", "266467"}, - {"2a06:3e40::/29", "42102"}, - {"2001:1248:5a6b::/43", "11172"}, - {"2001:4d78:1300::/40", "15830"}, - {"2400:6500:ff01::/40", "16509"}, - {"240e:b08::/27", "4134"}, - {"2602:fd10:800::/44", "398795"}, - {"2a00:aac0::/29", "25375"}, - {"2001:df1:6001::/48", "4755"}, - {"2405:201:7200::/32", "55836"}, - {"2408:840c:3600::/40", "17621"}, - {"2408:870c:d0::/42", "138421"}, - {"2409:8c70:3ad5::/46", "9808"}, - {"2a00:4cc6::/32", "203871"}, - {"2a02:2ad0:120::/43", "702"}, - {"2a09:e140::/29", "9119"}, - {"2a0c:4e40::/29", "48943"}, - {"2a10:7700:f215::/48", "400177"}, - {"2001:550:221b::/39", "174"}, - {"2001:67c:2dac::/48", "42886"}, - {"2404:f4c0:f502::/48", "134666"}, - {"2001:1a50::/32", "25560"}, - {"2001:4200:310::/40", "2018"}, - {"240a:a191::/32", "143051"}, - {"240a:acff::/32", "145977"}, - {"240e:86:9000::/28", "4134"}, - {"2604:1100:d200::/39", "11911"}, - {"2a07:bcc0::/47", "35146"}, - {"2a0e:c400::/29", "51083"}, - {"2401:3cc0:841::/39", "137409"}, - {"2600:1000:a020::/40", "22394"}, - {"2001:1900:23af::/41", "3356"}, - {"2803:6604:6401::/39", "28075"}, - {"2a00:4802:380::/44", "13124"}, - {"2a0b:56c0::/29", "41960"}, - {"2001:1248:9723::/45", "11172"}, - {"2402:6c00::/32", "46015"}, - {"240e:3bf::/35", "134773"}, - {"2604:d600:2005::/38", "32098"}, - {"2804:14d:7681::/45", "28573"}, - {"2804:59d4::/32", "268728"}, - {"2804:5bb8:cc::/32", "268865"}, - {"2001:67c:854::/48", "210775"}, - {"2600:6c7f:9350::/44", "11351"}, - {"2a00:7147:b1::/48", "51430"}, - {"2402:b300::/32", "23631"}, - {"240e:44d:4240::/42", "140359"}, - {"2804:7dc0::/32", "271580"}, - {"2a03:6880::/32", "39835"}, - {"2001:559:371::/48", "33652"}, - {"2001:4488:7008::/32", "7713"}, - {"2405:ed80::/44", "135106"}, - {"2408:8459:9e10::/42", "17623"}, - {"240e:933::/32", "134420"}, - {"2606:2800:10c::/46", "15133"}, - {"2a05:ed80::/29", "200278"}, - {"2402:d500::/32", "45235"}, - {"2620:40:4000::/48", "16931"}, - {"2a01:488:bb1b::/33", "20773"}, - {"2a0c:b641:580::/48", "210469"}, - {"2001:a17:fffb::/45", "204679"}, - {"2409:8018:28f2::/35", "134810"}, - {"240a:40aa:c000::/35", "58834"}, - {"2606:6800:2c00::/40", "394897"}, - {"2a06:4940::/29", "204279"}, - {"2001:678:40::/48", "25354"}, - {"2405:8d40:aa0::/48", "139831"}, - {"2a0e:fd45:2b70::/48", "210305"}, - {"2001:4b20:1000::/64", "65505"}, - {"2405:2d40::/43", "55695"}, - {"2600:1488:a501::/42", "20940"}, - {"2a02:26f7:becc::/48", "36183"}, - {"2a02:26f7:d7c9::/42", "20940"}, - {"2408:84f3:9a10::/42", "134543"}, - {"2803:6700:440::/48", "263210"}, - {"2804:49c:319::/48", "15201"}, - {"2402:800:63a1::/44", "7552"}, - {"2402:800:9a1d::/42", "7552"}, - {"2408:8956:1fc0::/34", "17622"}, - {"2409:8028:8f1::/46", "56041"}, - {"2001:559:44b::/45", "7015"}, - {"2001:559:563::/48", "13367"}, - {"240e:978:a00::/40", "23650"}, - {"2804:62f0::/32", "269329"}, - {"2a05:300::/47", "59895"}, - {"2001:678:5e4::/48", "61961"}, - {"2402:4b80::/32", "24367"}, - {"2603:fcb0::/25", "397165"}, - {"2a02:1770::/33", "8865"}, - {"2401:8e00::/36", "9260"}, - {"2404:138:4012::/31", "38022"}, - {"2606:bc0::/32", "7018"}, - {"2607:f3f0::/46", "16724"}, - {"2804:3c10::/32", "266188"}, - {"2804:4808::/32", "267093"}, - {"2a07:2f40::/29", "212659"}, - {"2a07:4247:3000::/36", "211956"}, - {"2001:67c:49c::/48", "2799"}, - {"2001:df0:2ea::/48", "38605"}, - {"2407:9440:62::/43", "141626"}, - {"2804:4ef4:4000::/32", "268294"}, - {"2409:806b:2900::/35", "9808"}, - {"2001:67c:27fc::/48", "12732"}, - {"2600:c800::/28", "7018"}, - {"2804:214:c001::/44", "26615"}, - {"2a03:4900::/46", "197695"}, - {"2a0e:8f02:f01f::/48", "211696"}, - {"240e:1:1000::/33", "4134"}, - {"2620:119:4014::/41", "7726"}, - {"2804:14d:2a84::/41", "28573"}, - {"2a02:26f7:3::/48", "20940"}, - {"2a02:26f7:f6c5::/46", "20940"}, - {"2a0b:2900:5200::/40", "48582"}, - {"2a0d:3c0::/29", "201211"}, - {"2001:67c:5e8::/48", "29663"}, - {"2402:e380:314::/48", "140244"}, - {"2406:7400:f1::/45", "24309"}, - {"240a:acde::/32", "145944"}, - {"2800:160:16dd::/46", "14259"}, - {"2804:300:c000::/31", "53237"}, - {"2a02:26f7:bd4c::/48", "36183"}, - {"2a02:26f7:c580::/48", "36183"}, - {"2406:6e00:f03b::/41", "17457"}, - {"2804:1a8::/32", "28229"}, - {"2a00:a8e0:201::/46", "15598"}, - {"2a07:5fc0::/29", "209621"}, - {"2a07:cbc0::/39", "201299"}, - {"2a0e:b1c0::/29", "60843"}, - {"2c0f:f6d0::/44", "327687"}, - {"2001:388:10ad::/41", "7575"}, - {"2001:559:3c0::/48", "33652"}, - {"2001:559:76e::/47", "33659"}, - {"2804:1380:173::/32", "263536"}, - {"2a00:15b8:500::/32", "31122"}, - {"2a06:1287:3300::/44", "206499"}, - {"2a0e:6d00::/29", "39761"}, - {"2607:2800::/32", "33302"}, - {"2607:fcd0:100:2d04::/49", "8100"}, - {"2804:1bd8::/33", "28224"}, - {"2001:559:c04c::/47", "7015"}, - {"2001:559:c073::/48", "33659"}, - {"2001:16a2:4200::/37", "25019"}, - {"2403:6dc0:1000::/36", "38047"}, - {"2404:2340:5000::/36", "134926"}, - {"2409:8915:9200::/39", "56044"}, - {"2620:1ec:14::/44", "8075"}, - {"2804:e0c::/48", "28176"}, - {"2a02:ee80:4169::/48", "3573"}, - {"2001:67c:198c::/48", "205016"}, - {"240a:a69a::/32", "144340"}, - {"2600:1417:4001::/37", "20940"}, - {"2606:2800:2::/48", "14153"}, - {"2a02:26f7:f0c5::/46", "20940"}, - {"2a02:e982:1f::/42", "19551"}, - {"2a02:e0:3201::/46", "34984"}, - {"2a11:97c0::/29", "204790"}, - {"2001:500:120::/48", "396549"}, - {"2403:400:900::/31", "23820"}, - {"2600:c000::/40", "7843"}, - {"2401:d800:a80::/42", "7552"}, - {"240a:a0af::/32", "142825"}, - {"2606:ae00:ac00::/40", "7287"}, - {"2607:f680::/32", "26228"}, - {"2001:559:877f::/48", "33651"}, - {"2001:4878:8215::/46", "12222"}, - {"2006:75c0::/32", "400010"}, - {"2408:8a27:4000::/35", "4837"}, - {"2409:8004:310e::/43", "24547"}, - {"2804:3ef0:a101::/48", "266630"}, - {"2a0c:9a40:1030::/47", "34927"}, - {"2401:340::/32", "55720"}, - {"2402:800:3163::/43", "7552"}, - {"2403:1840::/32", "137845"}, - {"2803:b2c0::/47", "264851"}, - {"2806:2f0::/43", "17072"}, - {"240a:ae32::/32", "146284"}, - {"2602:fca3::/48", "2165"}, - {"2604:7ac0::/36", "12213"}, - {"2620:14:2000::/48", "395899"}, - {"2804:11a0::/32", "262889"}, - {"2a02:26f7:e14d::/42", "20940"}, - {"2a02:faa0::/48", "203427"}, - {"2a09:51c0::/29", "202053"}, - {"2a10:f900::/29", "49191"}, - {"2409:8a56:9200::/40", "9808"}, - {"2600:cc03:e000::/40", "62833"}, - {"2001:559:812d::/46", "7922"}, - {"2001:16a2:c120::/44", "39386"}, - {"2405:6c40::/47", "24527"}, - {"2600:6c7f:9012::/48", "20115"}, - {"2a05:1082:1::/48", "136918"}, - {"2407:7380::/32", "134970"}, - {"2600:370f:5250::/42", "32261"}, - {"2607:f740:e60a::/48", "63911"}, - {"2803:cd80:8000::/33", "61478"}, - {"2001:678:268::/48", "206939"}, - {"2400:addb:800::/39", "9541"}, - {"2606:8980::/32", "394368"}, - {"2001:550:1b0a::/48", "397496"}, - {"2401:d800:2350::/42", "7552"}, - {"2804:2f6c::/32", "264890"}, - {"2a02:e70:19a::/32", "33965"}, - {"2001:1528::/32", "15685"}, - {"2403:2800:2::/48", "27435"}, - {"2409:8d14:2900::/31", "56044"}, - {"2606:2800:4a68::/46", "15133"}, - {"2804:5114::/32", "268429"}, - {"2001:a90::/32", "21119"}, - {"2001:16a2:4028::/47", "39386"}, - {"2402:800:f420::/41", "7552"}, - {"2404:bf40:8403::/42", "139084"}, - {"240e:964:2000::/37", "4134"}, - {"2600:140f:c800::/48", "24319"}, - {"2600:6c38:d44::/38", "20115"}, - {"2607:f740:44::/48", "36236"}, - {"2800:bf0:1d1::/46", "52257"}, - {"2804:14c:7575::/46", "28573"}, - {"2402:800:561d::/42", "7552"}, - {"2606:3900::/32", "13329"}, - {"2001:559:84f9::/48", "33287"}, - {"2800:5f0:6::/39", "22724"}, - {"2001:559:473::/48", "33659"}, - {"2402:4e00:7::/41", "45090"}, - {"2606:f900:2000::/33", "812"}, - {"2a02:5f00::/32", "19229"}, - {"2a03:9a00::/29", "8896"}, - {"2a0f:5707:fff7::/48", "50310"}, - {"2600:6c38:76d::/36", "20115"}, - {"2607:f038::/46", "21527"}, - {"2409:896a:9800::/39", "9808"}, - {"2409:8c70:3aa0::/44", "9808"}, - {"240a:aa4f::/32", "145289"}, - {"2804:4a34::/32", "267224"}, - {"2a02:1648::/29", "49375"}, - {"2a0a:6380::/29", "12552"}, - {"2c0f:f220::/32", "36924"}, - {"2001:4958::/32", "577"}, - {"2401:d800:da50::/42", "7552"}, - {"2405:e40:9::/32", "139005"}, - {"2409:8a14::/33", "56044"}, - {"2607:9800:c104::/44", "15085"}, - {"2804:43b0::/32", "267584"}, - {"2a00:1eb8:c006::/48", "47583"}, - {"2a02:26f7:e9::/48", "20940"}, - {"2a04:7b40::/29", "200003"}, - {"2a11:29c6:b00b::/48", "212149"}, - {"2409:8915:5400::/39", "56044"}, - {"240e:44d:4f00::/41", "140345"}, - {"2600:1480:f000::/48", "21342"}, - {"2605:8680:fffe::/31", "25780"}, - {"2806:2f0:9e61::/40", "17072"}, - {"2a02:ee80:402b::/43", "3573"}, - {"2a06:1280::/36", "61138"}, - {"2a0f:ec40::/32", "42433"}, - {"2001:67c:2160::/48", "2486"}, - {"240c:c410::/32", "24369"}, - {"2800:4b0:4503::/44", "12252"}, - {"2803:9800::/33", "11664"}, - {"2a07:59c6:caca::/48", "205413"}, - {"2001:b400:f408::/45", "17421"}, - {"2402:f800:d000::/36", "7602"}, - {"2620:85:8000::/48", "46453"}, - {"2804:4d60::/32", "263096"}, - {"2a03:3260::/32", "6829"}, - {"2404:7a40:16::/36", "132556"}, - {"240a:ad6f::/32", "146089"}, - {"240a:aee3::/32", "146461"}, - {"2804:3aec::/32", "266118"}, - {"2001:559:877c::/48", "33287"}, - {"2001:67c:1600::/44", "47487"}, - {"2402:ef11:2::/47", "9430"}, - {"2406:840:7::/48", "139317"}, - {"2607:fb20:10::/48", "14230"}, - {"2800:160:156d::/43", "14259"}, - {"2a06:1700:100::/48", "200651"}, - {"2a0f:cc80::/32", "210625"}, - {"2620:1fd:20::/44", "11971"}, - {"2804:84a4::/32", "28267"}, - {"2a0a:7c80::/32", "206672"}, - {"2404:3bc0::/32", "55933"}, - {"2409:801e:3010::/31", "24400"}, - {"2804:6250::/32", "262964"}, - {"2001:250:600a::/48", "23910"}, - {"2401:1700:1d::/33", "55666"}, - {"2408:8957:9b00::/40", "17816"}, - {"2804:1ad0::/32", "28621"}, - {"2a02:26f7:e749::/46", "20940"}, - {"2001:4830:2446::/48", "395326"}, - {"2401:8f40::/48", "136933"}, - {"2804:1f06::/32", "52887"}, - {"2a02:26f7:bcd0::/48", "36183"}, - {"2a02:5560::/32", "60130"}, - {"2a03:8180:1c00::/39", "36351"}, - {"2001:67c:3c4::/48", "1136"}, - {"2405:55c0:3d::/46", "63991"}, - {"240a:acd0::/32", "145930"}, - {"2620:81:2000::/48", "16904"}, - {"2620:98:4002::/47", "393949"}, - {"2800:bf0:b42d::/33", "27947"}, - {"2001:67c:2668::/48", "31566"}, - {"2408:8956:6800::/40", "17622"}, - {"2804:54:1c00::/33", "28220"}, - {"2804:1b3:4100::/41", "10429"}, - {"2404:c0:31a0::/38", "23693"}, - {"2a02:c40:3::/32", "13000"}, - {"2a0f:5707:ab27::/48", "43927"}, - {"2001:b08:9::/48", "3267"}, - {"2407:f440::/32", "59191"}, - {"2800:bf0:3a40::/47", "52257"}, - {"2001:559:8271::/48", "7725"}, - {"2804:1b04:20::/46", "53048"}, - {"2a02:2891:4::/48", "51185"}, - {"2001:678:680::/48", "25223"}, - {"2403:1000:5100::/40", "38819"}, - {"2409:8907:8220::/39", "24547"}, - {"2804:5300::/32", "268556"}, - {"2806:230:2039::/48", "11888"}, - {"2a02:26f7:ce05::/46", "20940"}, - {"2401:4900:50::/48", "9498"}, - {"2401:d800:dc60::/40", "7552"}, - {"2404:d500:4::/47", "132370"}, - {"240a:a268::/32", "143266"}, - {"2605:6180::/32", "14340"}, - {"240a:a4fa::/32", "143924"}, - {"2600:1f1c::/36", "16509"}, - {"2a09:9b80::/29", "204790"}, - {"2001:c20:487b::/48", "9255"}, - {"2401:d800:97d2::/36", "7552"}, - {"2a02:26f7:ebc4::/48", "36183"}, - {"2a04:6650::/31", "210156"}, - {"2001:559:19:e001::/45", "7922"}, - {"2401:a040::/32", "131586"}, - {"2402:8100:16::/48", "45271"}, - {"240a:a129::/32", "142947"}, - {"2602:fc2a::/36", "15020"}, - {"2800:bf0:14b::/48", "27947"}, - {"2a05:fec0::/29", "39224"}, - {"2a0e:ce40::/29", "12778"}, - {"2001:ec0:800::/40", "23969"}, - {"2a02:26f7:cb08::/48", "36183"}, - {"2a0b:5100::/29", "15765"}, - {"2a0d:1a40:7800::/43", "208563"}, - {"2001:559:869b::/45", "33667"}, - {"2001:678:154::/48", "203017"}, - {"240a:a49b::/32", "143829"}, - {"240e:978:4000::/40", "137702"}, - {"2607:ffc8:4001::/32", "17356"}, - {"2620:137:6000::/44", "393507"}, - {"2001:250:5400::/42", "24362"}, - {"2001:559:c4f1::/45", "7922"}, - {"2001:ee0:c640::/36", "45899"}, - {"2407:8f00::/32", "45677"}, - {"240a:a76a::/32", "144548"}, - {"2803:8c10:40::/42", "271868"}, - {"2a00:fe00:c0a0::/48", "702"}, - {"2001:da8:800a::/47", "24364"}, - {"240a:ac36::/32", "145776"}, - {"2402:a300:3e6::/44", "55427"}, - {"240a:ac6c::/32", "145830"}, - {"240e:357:6400::/26", "4134"}, - {"2804:85b0::/32", "262810"}, - {"2806:230:101f::/48", "11888"}, - {"2a06:a005:b0::/48", "207941"}, - {"2804:46f4::/32", "267022"}, - {"2001:559:81d9::/46", "7015"}, - {"2001:678:210::/48", "204506"}, - {"240e:f:a000::/36", "4835"}, - {"2610:108:8001::/48", "11724"}, - {"2620:124:6000::/42", "40816"}, - {"2a04:1b00:4::/47", "61005"}, - {"2408:8956:ac00::/40", "17622"}, - {"240a:a507::/32", "143937"}, - {"2804:428c::/32", "267507"}, - {"2806:230:1006::/48", "265594"}, - {"2a02:26f7:fa41::/46", "20940"}, - {"240a:a020::/32", "142682"}, - {"240a:a679::/32", "144307"}, - {"2804:840c::/32", "272236"}, - {"2a11:1::/30", "44103"}, - {"2403:100:1000::/48", "56300"}, - {"240a:ae49::/32", "146307"}, - {"2600:6c3a:c4f::/38", "20115"}, - {"2610:a1:3048::/48", "12008"}, - {"2620:13d:f004::/40", "22711"}, - {"2800:200:bd30::/41", "12252"}, - {"2a0d:1080:1::/48", "47215"}, - {"2001:4998:19::/46", "10310"}, - {"2401:d180:2120::/48", "133865"}, - {"2804:60cc::/32", "269192"}, - {"2001:67c:104::/48", "198595"}, - {"2407:4d00:ff02::/48", "38841"}, - {"240e:3bb:1800::/34", "4134"}, - {"240e:982:4300::/36", "4134"}, - {"2804:1b70::/32", "61728"}, - {"2804:291c:4100::/32", "263998"}, - {"2a01:8840:9e::/42", "12041"}, - {"2a0b:6b86:b00::/47", "206699"}, - {"2409:8000:2a00::/39", "56048"}, - {"2804:4c14:9a01::/39", "267348"}, - {"2a03:1ac0:1::/34", "9049"}, - {"240a:a5c9::/32", "144131"}, - {"2607:fe20::/32", "30404"}, - {"2800:bf0:2905::/40", "27947"}, - {"2a09:8280:2f::/48", "40509"}, - {"2001:d58::/32", "9416"}, - {"2402:4f40::/32", "137404"}, - {"240e:974:e202::/40", "4134"}, - {"2600:6c38:822::/44", "20115"}, - {"2a00:6901:2::/47", "20926"}, - {"2408:870c:4010::/30", "17621"}, - {"2605:1b00::/32", "25999"}, - {"2001:67c:2e10::/48", "200986"}, - {"2408:8256:3282::/48", "17816"}, - {"2806:230:4038::/48", "265594"}, - {"2001:559:1fc::/48", "33491"}, - {"2400:cb00:26::/44", "13335"}, - {"2a0f:c581::/30", "208861"}, - {"2602:feda:1d1::/46", "137256"}, - {"2804:710:10::/32", "17222"}, - {"2a02:26f7:cf00::/48", "36183"}, - {"2a02:ee80:4121::/46", "3573"}, - {"240a:a3e2::/32", "143644"}, - {"240a:a56a::/32", "144036"}, - {"240e:44d:2240::/42", "140361"}, - {"2607:9100::/32", "21743"}, - {"2a0e:97c0:74f::/48", "208260"}, - {"2001:559:551::/46", "33659"}, - {"2001:da8:b8::/48", "24366"}, - {"2401:1400::/32", "9297"}, - {"2409:8e18::/31", "134810"}, - {"2804:42c4:c803::/48", "267524"}, - {"2a02:e0:3809::/33", "34984"}, - {"2a02:2e02:8f70::/40", "12479"}, - {"2a0a:af40::/32", "208075"}, - {"2001:df2:8200::/47", "135551"}, - {"2001:1398:121::/48", "52304"}, - {"2600:140f:a00::/48", "9498"}, - {"2800:160:14e4::/44", "14259"}, - {"2804:4cfc::/32", "267405"}, - {"2a01:5040::/42", "43996"}, - {"2a02:26f0:9201::/39", "20940"}, - {"2a11:a680::/29", "204790"}, - {"2001:438:fffd:11f::/58", "6461"}, - {"2001:da8:6f00::/48", "138378"}, - {"2602:fda1::/38", "397031"}, - {"2804:66f8::/32", "269595"}, - {"2a02:26f7:f884::/48", "36183"}, - {"2a02:4240::/32", "50266"}, - {"2a06:83c0::/29", "15391"}, - {"2001:3a0:f007::/48", "131079"}, - {"2001:559:12::/44", "7922"}, - {"2001:559:82ae::/47", "7015"}, - {"2400:57e0::/32", "142317"}, - {"2a07:aa00:7::/48", "203"}, - {"2001:559:722::/48", "7922"}, - {"2405:201:fffc::/30", "55836"}, - {"2620:0:500::/42", "11643"}, - {"2a00:4a00:8000::/33", "39356"}, - {"2a01:6020:f000::/36", "199070"}, - {"2a02:26f7:8f::/48", "20940"}, - {"2a04:5d00:71::/44", "60241"}, - {"2001:67c:1104::/48", "213021"}, - {"240e:108:11b4::/41", "4134"}, - {"240e:438:3a40::/37", "4134"}, - {"2605:59c2:1140::/33", "36492"}, - {"2a03:4f00::/32", "5524"}, - {"2a03:5ee0::/32", "3320"}, - {"2408:8779:c008::/30", "4837"}, - {"2607:fde8::/32", "3853"}, - {"2001:df0:c0::/48", "55741"}, - {"240a:a120::/32", "142938"}, - {"240a:ac78::/32", "145842"}, - {"2001:470:11b::/48", "395570"}, - {"2001:13c7:600d::/48", "52359"}, - {"2401:cac0::/32", "136982"}, - {"2404:8000:ba72::/33", "17451"}, - {"240a:a5a3::/32", "144093"}, - {"240a:ad70::/32", "146090"}, - {"2604:84c0::/32", "7979"}, - {"2604:d600:1558::/47", "32098"}, - {"2a01:7360::/32", "198290"}, - {"2a01:cb22::/34", "3215"}, - {"2a02:26f7:d1c1::/46", "20940"}, - {"2001:579:d204::/42", "22773"}, - {"2001:67c:24f4::/48", "196653"}, - {"2a04:fac0::/29", "212859"}, - {"2a0b:6b81:210::/48", "203729"}, - {"2001:49f8:40a::/48", "14230"}, - {"2408:8256:3780::/44", "17623"}, - {"2409:803c:30c0::/48", "9808"}, - {"240a:af9b::/32", "146645"}, - {"2806:2f0:4581::/46", "17072"}, - {"2a11:a980::/29", "204790"}, - {"2408:8256:2f8e::/43", "17623"}, - {"2806:250:d::/46", "28509"}, - {"2a02:26f7:cd44::/48", "36183"}, - {"2001:559:209::/48", "7016"}, - {"2602:ffc5:105::/48", "398395"}, - {"2804:24d4::/32", "52781"}, - {"2a00:1fa3::/29", "8359"}, - {"2a02:26f7:f109::/42", "20940"}, - {"2a09:4a47::/32", "23470"}, - {"2600:1012:b1c0::/44", "22394"}, - {"2605:a401:8ce3::/39", "33363"}, - {"2804:2540::/32", "264268"}, - {"2804:3e70:d008::/34", "266596"}, - {"2001:559:8262::/47", "33657"}, - {"240e:982::/39", "136195"}, - {"2804:a54:13::/32", "262664"}, - {"2001:250:210::/48", "24349"}, - {"2401:d800:29e0::/38", "7552"}, - {"2408:8406:5400::/39", "4808"}, - {"2a03:9c40::/48", "34655"}, - {"2a0a:ec02:301::/48", "42692"}, - {"2001:67c:6b0::/48", "34756"}, - {"2a04:4e40:f810::/41", "54113"}, - {"2a07:4f40::/29", "8426"}, - {"2a0d:12c0:1000::/48", "205804"}, - {"2401:4900:5850::/44", "45609"}, - {"2401:d800:75c0::/42", "7552"}, - {"2408:8956:b000::/40", "17622"}, - {"2804:4218::/34", "267477"}, - {"2a0c:1680::/29", "15874"}, - {"2001:57a:3a04::/47", "22773"}, - {"240a:a256::/32", "143248"}, - {"240e:938:a00::/44", "139203"}, - {"2a0b:d680::/32", "201127"}, - {"2a11:4280::/29", "210883"}, - {"2408:8956::/40", "17622"}, - {"240a:ad57::/32", "146065"}, - {"2a0b:5cc0::/32", "49432"}, - {"2001:559:381::/48", "7922"}, - {"2401:d800:5fb0::/41", "7552"}, - {"2804:332c::/32", "265379"}, - {"2a04:9a40::/29", "51373"}, - {"2a06:6d40::/29", "198090"}, - {"2a07:59c6:ca01::/45", "205413"}, - {"2001:510::/39", "376"}, - {"2400:e500:1::/42", "38742"}, - {"2402:800:7180::/42", "7552"}, - {"2602:fc64:ce00::/48", "36829"}, - {"2a0a:e5c0:13::/48", "208731"}, - {"2001:559:116::/48", "20214"}, - {"2001:559:80f9::/48", "33660"}, - {"2001:df1:c600::/48", "133821"}, - {"2001:b400:f220::/37", "3462"}, - {"240e:908:8000::/39", "137698"}, - {"2620:0:960::/48", "6223"}, - {"2806:230:4030::/48", "265594"}, - {"2a03:52a0::/39", "12557"}, - {"2602:fe90::/38", "35913"}, - {"2a02:ff0:e00::/40", "12735"}, - {"2401:d800:7fb2::/41", "7552"}, - {"2606:2800:6a60::/46", "15133"}, - {"2001:559:59d::/48", "33287"}, - {"2408:8776::/28", "4837"}, - {"240a:a24a::/32", "143236"}, - {"240c:c7ba::/20", "23910"}, - {"240e:67b:c400::/39", "140330"}, - {"2a00:1908::/36", "43586"}, - {"2a03:3840::/29", "199600"}, - {"2a05:19c0:2::/47", "59802"}, - {"2a0d:7b40::/29", "60016"}, - {"2a02:e90::/32", "15389"}, - {"2a02:26f7:c40c::/48", "36183"}, - {"2603:b000::/27", "11796"}, - {"2801:80:36d0::/48", "269216"}, - {"2804:7eb0::/32", "271641"}, - {"2a02:26f7:f204::/48", "36183"}, - {"2a03:e580::/32", "49282"}, - {"2a0d:df40::/29", "61272"}, - {"2402:8cc0:200::/40", "131137"}, - {"2406:840:f62f::/48", "140506"}, - {"2407:58c0::/32", "24277"}, - {"2409:8028::/40", "56041"}, - {"2409:8904:cfb0::/35", "24547"}, - {"2804:2cd4:90::/42", "265246"}, - {"2a06:a281::/32", "49117"}, - {"2a0a:68c0::/40", "134835"}, - {"2a0d:b201:80c0::/42", "206026"}, - {"2c0f:fbc0::/32", "37670"}, - {"2001:4998:ef5f::/42", "10310"}, - {"2405:d900::/32", "56004"}, - {"240a:a1d0::/32", "143114"}, - {"2a0c:9a40:808b::/48", "398646"}, - {"2600:141c:e001::/35", "20940"}, - {"2602:fc71:f00::/48", "400232"}, - {"2603:c013::/36", "31898"}, - {"2604:7c00::/32", "40244"}, - {"2a02:1370::/32", "39324"}, - {"2a04:f580:9212::/47", "4809"}, - {"2001:559:c2f9::/48", "33659"}, - {"2001:678:dc8::/48", "213032"}, - {"2001:67c:14b0::/48", "13127"}, - {"2001:fd0:e::/40", "10029"}, - {"2401:1801:1120::/32", "58683"}, - {"2402:ef04:f000::/31", "7633"}, - {"240e:3bb:c800::/37", "4134"}, - {"2600:1409:3::/48", "20940"}, - {"2a0b:b87:ffd2::/48", "213186"}, - {"2a0d:1a45:babe::/48", "210089"}, - {"2001:559:86ca::/48", "33287"}, - {"2001:b58::/29", "20626"}, - {"2408:8256:3087::/43", "17623"}, - {"2800:bf0:80ef::/43", "52257"}, - {"2a0b:a080:1::/48", "202165"}, - {"2001:67c:19a4::/48", "51815"}, - {"2001:1490:100::/48", "30857"}, - {"2600:140f:801::/39", "20940"}, - {"2607:f108::/38", "29838"}, - {"2801:82::/32", "10881"}, - {"2804:18:4878::/35", "26599"}, - {"2a0f:1140::/32", "34959"}, - {"2a02:26f7:f745::/46", "20940"}, - {"2a05:7880::/32", "209242"}, - {"2600:1016:f010::/39", "6167"}, - {"2600:370f:72a8::/47", "32261"}, - {"2a02:73a0:90::/48", "201895"}, - {"2001:44b8:30af::/48", "4739"}, - {"2408:8656:2ef0::/48", "17623"}, - {"240a:ad3f::/32", "146041"}, - {"240e:679:1800::/32", "4134"}, - {"2a0c:e186::/32", "204690"}, - {"2001:67c:2068::/48", "34261"}, - {"2402:800:5a0f::/43", "7552"}, - {"2402:800:b590::/42", "7552"}, - {"2404:4a00:8a00::/64", "55423"}, - {"2a00:1f78:fffe::/48", "39227"}, - {"2a02:26f7:e841::/46", "20940"}, - {"2a0b:11c0:bea::/48", "198682"}, - {"2a0c:b641:4f0::/44", "212653"}, - {"2a0c:db00::/29", "50467"}, - {"2406:840:e0c0::/45", "141429"}, - {"2408:80f1:180::/43", "17621"}, - {"2600:6c10:ff9d::/42", "20115"}, - {"2804:f74::/32", "263586"}, - {"2804:28e4:e002::/42", "28260"}, - {"2804:4fd8::/32", "268353"}, - {"2806:2f0:9b61::/46", "17072"}, - {"2400:d400:b97::/48", "45671"}, - {"240e:44d:3000::/41", "140345"}, - {"2803:8d00:e001::/35", "27988"}, - {"2804:7878::/32", "271244"}, - {"2409:8f50::/30", "56047"}, - {"2620:171:60::/48", "42"}, - {"2a01:8840:81::/48", "207266"}, - {"2001:67c:10e0::/48", "201612"}, - {"2409:8924:b700::/36", "56046"}, - {"2a01:4060::/32", "9063"}, - {"2a02:6b8:81::/48", "13238"}, - {"2001:559:c0ab::/45", "33490"}, - {"2407:e540::/32", "146969"}, - {"2409:8a04:6a00::/32", "24547"}, - {"2804:75c0::/32", "271067"}, - {"2806:108e:2::/47", "8151"}, - {"2a07:a740::/29", "57795"}, - {"2001:678:98c::/48", "31371"}, - {"2001:1900:2263::/48", "3356"}, - {"2804:100::/32", "28364"}, - {"2a04:4e40:b010::/41", "54113"}, - {"2606:3580::/32", "46450"}, - {"2a00:1cf8:8000::/33", "44944"}, - {"2a09:84c0::/37", "8145"}, - {"2803:ecc0::/37", "264814"}, - {"2804:1244::/32", "263466"}, - {"2a10:847:8000::/33", "3223"}, - {"2a10:7240::/32", "212574"}, - {"240a:ad2e::/32", "146024"}, - {"240a:adc2::/32", "146172"}, - {"2800:300:89e0::/43", "27651"}, - {"2a01:360::/29", "34549"}, - {"2001:49f0:d105::/44", "174"}, - {"2408:8459:10::/41", "17622"}, - {"2409:8d15:2a00::/30", "56044"}, - {"240e:981:8000::/40", "132153"}, - {"2602:feda:e39::/46", "147028"}, - {"2001:4408:c001::/46", "4758"}, - {"2402:8100:cb0::/35", "55644"}, - {"240e:1f:d000::/36", "134764"}, - {"2804:448c::/32", "267638"}, - {"2a02:ac80:e01::/39", "25145"}, - {"2a04:c340::/29", "44640"}, - {"2c0f:f528:40::/45", "327782"}, - {"2400:a440:144::/48", "18019"}, - {"2401:d800:bd70::/40", "7552"}, - {"2602:feda::/48", "46997"}, - {"2001:4430:6090::/36", "17853"}, - {"2408:8026:830::/32", "17621"}, - {"2804:db0:100::/40", "52862"}, - {"2a00:f0e0::/43", "198499"}, - {"2a06:e881:7700::/40", "212024"}, - {"2a0a:340:1400::/39", "48043"}, - {"2a10:87c0::/29", "49820"}, - {"2001:559:73a::/48", "33491"}, - {"2001:67c:10fc::/48", "3301"}, - {"2402:800:569b::/41", "7552"}, - {"2404:5d80:6300::/40", "33438"}, - {"240a:a426::/32", "143712"}, - {"240e:3bf:1400::/38", "134773"}, - {"2600:140f:e801::/38", "20940"}, - {"2a04:f580:80a0::/48", "4134"}, - {"2001:67c:234c::/48", "42204"}, - {"2001:df6:b500::/48", "136715"}, - {"240a:a081::/32", "142779"}, - {"240a:a8a3::/32", "144861"}, - {"2a10:8703::/32", "207925"}, - {"2604:2600::/32", "46209"}, - {"2a04:3f83:45::/44", "9120"}, - {"2001:559:c3dc::/48", "7015"}, - {"2001:1248:841e::/42", "11172"}, - {"2408:80ea:7680::/43", "17623"}, - {"2409:807c:2900::/35", "9808"}, - {"2607:fae0::/38", "8038"}, - {"2c0f:ef10::/32", "328262"}, - {"2605:bc0:2008::/48", "54201"}, - {"2804:7a68::/32", "271369"}, - {"2806:28e::/32", "265530"}, - {"2a02:230::/32", "43383"}, - {"2a02:26f7:dfcc::/47", "36183"}, - {"2a04:6540::/32", "200168"}, - {"2a12:4946:9900::/40", "211696"}, - {"2001:678:594::/48", "58132"}, - {"2401:4900:3e80::/42", "45609"}, - {"2a02:3c8::/32", "43892"}, - {"2a02:888:4047::/48", "47794"}, - {"2001:1248:8845::/44", "11172"}, - {"2409:807c:100::/36", "9808"}, - {"2804:812c::/32", "272437"}, - {"2a02:c280::/29", "198725"}, - {"2a04:5b81:2010::/44", "202265"}, - {"2a09:9f42::/29", "1239"}, - {"2408:8957:a000::/40", "17622"}, - {"2a04:4e40:1600::/47", "54113"}, - {"2a0d:9c40::/29", "210150"}, - {"240a:ac09::/32", "145731"}, - {"2604:d600:c71::/44", "32098"}, - {"2804:4acc::/32", "267264"}, - {"2804:4d58::/35", "268191"}, - {"2804:5ab4::/32", "268790"}, - {"2804:6f60::/32", "270656"}, - {"2a03:5a00:a::/48", "198778"}, - {"2a06:ed00::/29", "50642"}, - {"2600:6c20:249::/45", "20115"}, - {"2a00:79e1:f02::/45", "395973"}, - {"2a09:380::/29", "204860"}, - {"2001:440:1800::/48", "1880"}, - {"2610:b0:415b::/42", "3573"}, - {"2610:150::/32", "46844"}, - {"2804:42c8::/32", "267526"}, - {"2804:57e4::/32", "268093"}, - {"2a03:e140:3a::/48", "16262"}, - {"2402:9800:4006::/48", "138138"}, - {"240a:a4df::/32", "143897"}, - {"240e:1a:20::/44", "23650"}, - {"2a00:ca8::/32", "30764"}, - {"2a0d:9340:1004::/29", "35761"}, - {"2001:559:3ce::/48", "33668"}, - {"2001:978:7303::/37", "174"}, - {"2a00:a640::/46", "13445"}, - {"2a06:c7c0::/29", "198024"}, - {"2001:480:91::/44", "668"}, - {"2001:7e0::/32", "13285"}, - {"2400:7400:e022::/48", "38044"}, - {"240a:a97f::/32", "145081"}, - {"240a:af87::/32", "146625"}, - {"2803:5440:4049::/48", "264738"}, - {"2804:104::/32", "262685"}, - {"2a0e:7d40:44::/44", "209833"}, - {"2600:1007:f002::/45", "6167"}, - {"2a02:23f8::/32", "24590"}, - {"2605:6880::/32", "63052"}, - {"2605:9780::/48", "36180"}, - {"2607:f460::/32", "22742"}, - {"2804:14c0::/32", "263348"}, - {"2001:5a8::/32", "46375"}, - {"2001:1248:989c::/42", "11172"}, - {"2001:1a11:12e::/48", "8781"}, - {"2401:d800:9410::/42", "7552"}, - {"2409:8c85:aa35::/44", "9808"}, - {"2804:6114::/32", "269211"}, - {"2001:1248:a4d6::/44", "11172"}, - {"2402:d840::/32", "134555"}, - {"240c:c804::/23", "23910"}, - {"2804:190:300::/32", "53165"}, - {"2804:3210::/35", "262779"}, - {"2804:7d84::/32", "271566"}, - {"2a02:26f7:e640::/48", "36183"}, - {"2a06:1e00:40::/48", "60695"}, - {"2001:559:82da::/48", "33662"}, - {"240a:a153::/32", "142989"}, - {"2600:141c:8::/36", "20940"}, - {"2001:4de0:7001::/46", "33438"}, - {"2403:40c0::/48", "45215"}, - {"2604:a180:a000::/35", "22933"}, - {"2a04:3cc0:800::/35", "31036"}, - {"2402:e280:2162::/45", "134674"}, - {"2001:559:c48f::/48", "7922"}, - {"2404:8000:b3::/41", "17451"}, - {"2405:6e00:200::/42", "133612"}, - {"2408:8956:3300::/40", "17816"}, - {"2409:8087:3021::/40", "9808"}, - {"2606:fd80::/32", "2552"}, - {"2806:230:102e::/48", "265594"}, - {"2a01:5e80::/32", "42789"}, - {"2404:f4c0:f000::/44", "24239"}, - {"2408:84f3:3690::/36", "17816"}, - {"2408:8956:2700::/36", "17816"}, - {"2602:fed2:7311::/48", "53356"}, - {"2804:58ec::/32", "268158"}, - {"2001:57a:9204::/46", "22773"}, - {"2001:c38:9000::/44", "9931"}, - {"2402:800:3671::/44", "7552"}, - {"240a:a437::/32", "143729"}, - {"240a:a775::/32", "144559"}, - {"2804:54c::/32", "262507"}, - {"2804:8c0::/32", "262391"}, - {"2a01:5041:2000::/48", "202196"}, - {"2a03:90c0:500::/40", "199524"}, - {"2a06:a005:3c0::/42", "149296"}, - {"2a0c:b641:690::/46", "209297"}, - {"2804:25f0::/32", "264311"}, - {"2a00:1e80::/32", "21473"}, - {"2a01:8640:4::/47", "202015"}, - {"2001:dce:101::/48", "45285"}, - {"2a09:b681::/32", "208861"}, - {"2a0d:b00:2901::/48", "205862"}, - {"2001:67c:2fb4::/48", "200826"}, - {"2001:6d8::/32", "8267"}, - {"2401:d800:b300::/42", "7552"}, - {"2620:107:a000::/40", "20"}, - {"2a11:2800::/48", "42831"}, - {"2406:e00:10e::/47", "55740"}, - {"240a:a58a::/32", "144068"}, - {"2604:ca00:233::/48", "36492"}, - {"2804:37f0:a900::/35", "266445"}, - {"2806:2f0:3163::/40", "17072"}, - {"2a02:26f7:3e::/48", "36183"}, - {"2a0f:52c1::/48", "212319"}, - {"2401:3bc0:f::/37", "137409"}, - {"2804:50f4::/32", "268421"}, - {"2406:840:e80f::/48", "134488"}, - {"2610:190::/38", "62"}, - {"2a0b:3e00::/32", "14076"}, - {"2001:df0:214::/48", "132696"}, - {"240a:a053::/32", "142733"}, - {"240a:a33b::/32", "143477"}, - {"2a01:b1c0::/32", "48200"}, - {"2a02:26f7:e389::/46", "20940"}, - {"2804:82b0::/32", "272534"}, - {"2a0f:e404:100::/46", "58057"}, - {"2001:438:fffd:6d::/55", "6461"}, - {"2600:6c38:a31::/45", "20115"}, - {"2804:8d0::/32", "28269"}, - {"2400:f280:2200::/39", "55766"}, - {"2406:6e00:f049::/36", "17457"}, - {"240a:a677::/32", "144305"}, - {"2a10:9fc0::/29", "40970"}, - {"2001:559:8742::/47", "33491"}, - {"2001:628:454::/35", "1853"}, - {"2001:67c:1894::/48", "3301"}, - {"2001:dc0:a000::/35", "4608"}, - {"2408:8456:e010::/42", "134543"}, - {"2602:feb4:1a0::/44", "25961"}, - {"2a02:2780::/32", "35434"}, - {"2a03:4cc0::/32", "199569"}, - {"2001:559:238::/46", "33287"}, - {"2001:579:b11c::/41", "22773"}, - {"2a02:26f7:d0c8::/48", "36183"}, - {"2a0b:8c80::/29", "206420"}, - {"2a0f:7880:100::/40", "210542"}, - {"2a0f:aac0:2::/48", "14618"}, - {"2001:1968::/32", "7029"}, - {"2401:2e00::/32", "37963"}, - {"2404:bd00:a::/45", "58678"}, - {"240e:982:8100::/40", "133775"}, - {"2001:1248:9a54::/44", "11172"}, - {"2001:44b8:4057::/48", "4739"}, - {"2402:800:9b9b::/42", "7552"}, - {"2409:8080:2a10::/44", "9808"}, - {"2a03:6f00:1::/45", "9123"}, - {"2604:8440::/32", "32217"}, - {"2804:280::/32", "53219"}, - {"2804:6e0c::/32", "270572"}, - {"2a0d:4d40::/44", "50630"}, - {"2a04:4e40:6610::/44", "54113"}, - {"2a0f:be00::/29", "208250"}, - {"2001:da8:8017::/44", "23910"}, - {"240e:378::/35", "140329"}, - {"2603:c002:9a30::/39", "31898"}, - {"2804:14c:4700::/40", "28573"}, - {"2a02:26f7:c249::/40", "20940"}, - {"2600:141c:1001::/36", "20940"}, - {"2600:370f:738b::/42", "32261"}, - {"2a00:1600::/32", "50195"}, - {"2a05:35c0::/46", "60781"}, - {"2001:559:c45b::/48", "33650"}, - {"2403:e240::/32", "4767"}, - {"2405:4803:dda0::/34", "18403"}, - {"2600:100f:a010::/40", "22394"}, - {"2603:90b1::/32", "10838"}, - {"2800:bf0:8068::/46", "52257"}, - {"2c0f:f778::/32", "37009"}, - {"2400:32e0::/48", "140770"}, - {"2408:8456:be10::/42", "134543"}, - {"240a:a731::/32", "144491"}, - {"2600:1006:d160::/34", "22394"}, - {"2600:1480:580c::/47", "21342"}, - {"2606:2800:4204::/46", "15133"}, - {"2a02:16c8::/32", "6871"}, - {"2001:67c:22f4::/48", "200490"}, - {"240e:108:1162::/45", "4134"}, - {"2604:3e00::/32", "2552"}, - {"2804:18:830::/44", "26599"}, - {"2a0d:2902:caf9::/45", "204185"}, - {"2604:8600:9000::/33", "14453"}, - {"2803:9800:ba01::/33", "11664"}, - {"2a00:edc0:136::/48", "136468"}, - {"2a04:2b01::/30", "42044"}, - {"2a10:1c80::/29", "400522"}, - {"2001:1260:5::/48", "28544"}, - {"2607:9e80:1281::/39", "397068"}, - {"2620:d8:c000::/48", "7784"}, - {"2803:1040:2000::/32", "263751"}, - {"2804:2004::/32", "264460"}, - {"2a00:1d80::/32", "6789"}, - {"240a:af65::/32", "146591"}, - {"240e:974:eb00::/40", "38283"}, - {"2a09:bac0:1000::/47", "13335"}, - {"2001:c10:ff13::/44", "7473"}, - {"2409:805e:900::/35", "9808"}, - {"2409:8924:3100::/38", "56046"}, - {"2600:1406:ac00::/48", "35994"}, - {"2606:2800:4ad0::/47", "15133"}, - {"2620:39:6000::/48", "25682"}, - {"2804:90:6700::/32", "28580"}, - {"2804:14a8::/32", "263342"}, - {"2a02:508::/32", "8473"}, - {"2001:559:9f::/48", "7922"}, - {"2607:3f00:4::/42", "46261"}, - {"2607:5200::/32", "18501"}, - {"2610:18::/32", "2828"}, - {"2a01:c50f:e7c0::/36", "12479"}, - {"240a:aa15::/32", "145231"}, - {"240e:108:1151::/46", "4134"}, - {"2804:6fc8:8000::/37", "270684"}, - {"2a01:b8::/32", "8978"}, - {"2c0f:e878::/32", "60171"}, - {"2001:502:7094::/48", "396566"}, - {"2001:559:c4bc::/48", "33659"}, - {"2408:8957:cbc0::/37", "17622"}, - {"2409:8904:e040::/42", "24547"}, - {"2800:160:1880::/45", "14259"}, - {"2804:8024::/32", "271732"}, - {"2806:2f0:3243::/42", "17072"}, - {"2a02:587:501b::/40", "6799"}, - {"2a09:7d40:9::/32", "209382"}, - {"2001:559:87f1::/48", "20214"}, - {"2001:da8:8002::/48", "24366"}, - {"2401:9640::/32", "133982"}, - {"2604:9b40::/32", "29848"}, - {"2804:4218:3100::/32", "267477"}, - {"2a06:1000::/29", "35041"}, - {"2400:f7c0::/32", "133952"}, - {"2804:1b40::/35", "28255"}, - {"2001:250:4800::/44", "24360"}, - {"2001:4878:8102::/48", "12222"}, - {"2604:8600:7000::/32", "14453"}, - {"2806:2f0:3041::/46", "17072"}, - {"2a0f:bc0::/29", "203536"}, - {"2400:ad40::/32", "136262"}, - {"2606:cf00::/32", "54327"}, - {"2607:fc08::/32", "46786"}, - {"2a02:2308:31::/32", "29028"}, - {"2405:9800:c926::/44", "45430"}, - {"240a:a5f0::/32", "144170"}, - {"2804:3968::/32", "266029"}, - {"2804:4580:800::/35", "266931"}, - {"2a00:d0c0:200::/48", "205766"}, - {"2400:35e0::/32", "149026"}, - {"2404:2640:4000::/32", "138523"}, - {"2604:d600:1236::/44", "32098"}, - {"2408:8956:6200::/40", "17622"}, - {"2604:cac0:49::/48", "11019"}, - {"2801:bc:2000::/32", "28601"}, - {"2804:6a8c::/32", "270343"}, - {"2409:8053:2802::/38", "56047"}, - {"2620:171:59::/45", "715"}, - {"2a0f:9400:770c::/48", "53356"}, - {"2403:300:a31::/48", "714"}, - {"2605:8a40::/32", "13855"}, - {"2a01:c50f:fcc0::/39", "12479"}, - {"2a03:d900::/32", "49079"}, - {"2a0e:b107:ac2::/48", "204307"}, - {"2001:da8:267::/44", "23910"}, - {"2402:800:9a01::/44", "7552"}, - {"2803:4600:111b::/36", "14754"}, - {"2804:d84::/36", "28171"}, - {"2a0b:e46:1::/48", "203055"}, - {"2001:67c:1444::/48", "43832"}, - {"240a:a8f8::/32", "144946"}, - {"2a02:26f7:9a::/48", "36183"}, - {"2a03:7180::/32", "8499"}, - {"2a09:1380::/29", "209815"}, - {"2001:503:e239::/48", "397226"}, - {"2409:8904:38a0::/39", "24547"}, - {"240e:980:4e00::/40", "136195"}, - {"2600:5002:1807::/28", "7029"}, - {"2600:6c10:37::/44", "20115"}, - {"240e:1a:50::/39", "23650"}, - {"2600:380:c600::/39", "20057"}, - {"2a0d:6fc0::/29", "12400"}, - {"2001:eb0:100::/46", "9584"}, - {"2409:8915:4c00::/39", "56044"}, - {"240e:3b3:7800::/39", "4134"}, - {"2610:a1:fff::/48", "12008"}, - {"2a01:348::/41", "39326"}, - {"2a01:7140::/32", "41849"}, - {"2a0d:52c0::/29", "210129"}, - {"240a:a9a2::/32", "145116"}, - {"2607:f740:e610::/48", "63911"}, - {"2a03:9d40:4000::/40", "41095"}, - {"2a10:cb42::/29", "198328"}, - {"2804:768:880::/35", "52977"}, - {"2804:3c70::/32", "266211"}, - {"2408:8956:4300::/40", "17816"}, - {"2600:6c10:a1::/45", "20115"}, - {"2600:6c2e:711::/36", "20115"}, - {"2804:544::/32", "262505"}, - {"2804:3288::/32", "52827"}, - {"2a02:26f0:8e00::/48", "34164"}, - {"2a02:2750::/32", "8245"}, - {"2a02:6c00::/37", "786"}, - {"2001:df4:b400::/48", "17701"}, - {"2402:8100:20c8::/47", "55644"}, - {"2a02:e980:12f::/43", "19551"}, - {"2001:559:83d2::/47", "7725"}, - {"2804:5ccc::/36", "268931"}, - {"2a0c:eec0::/29", "50819"}, - {"2001:428:6808::/48", "19648"}, - {"2001:559:c1d3::/48", "33657"}, - {"2804:d50::/28", "8167"}, - {"2a01:a8c0::/29", "44712"}, - {"2a0d:1a40:fa0::/47", "202313"}, - {"2800:484:2400::/38", "14080"}, - {"2804:1bf4::/32", "61759"}, - {"2a01:6f0:fffe::/48", "36351"}, - {"2001:fd8:1e1::/46", "4775"}, - {"2600:1003:9110::/37", "22394"}, - {"2806:217:602::/32", "28394"}, - {"2a02:26f7:d984::/48", "36183"}, - {"2a02:26f7:f984::/48", "36183"}, - {"2001:559:c456::/48", "7922"}, - {"2804:34:2025::/32", "28306"}, - {"2a01:53c0:ffed::/43", "54994"}, - {"2001:550:7705::/46", "174"}, - {"240a:a70a::/32", "144452"}, - {"2607:f740:e03a::/48", "63911"}, - {"2804:c54::/32", "262650"}, - {"2a05:ca40::/29", "41906"}, - {"2403:ae00::/32", "38766"}, - {"2409:8e10::/30", "9808"}, - {"2a0c:e643:1984::/48", "146992"}, - {"2001:16a2:8200::/40", "25019"}, - {"2600:1417:c000::/48", "24319"}, - {"2800:8a0:c400::/38", "5722"}, - {"2a01:758:1::/32", "3326"}, - {"2a02:d10::/32", "9050"}, - {"2001:3a8::/32", "9848"}, - {"2600:141b:3801::/33", "20940"}, - {"2001:418:144e::/47", "15562"}, - {"2408:8256:2d9f::/38", "17816"}, - {"240a:a8a7::/32", "144865"}, - {"2804:694:4500::/38", "262596"}, - {"2804:269c:fe05::/48", "47065"}, - {"2806:20d:3214::/46", "32098"}, - {"2a02:26f7:ca::/48", "36183"}, - {"2a02:26f7:f889::/46", "20940"}, - {"2a12:9240::/32", "198034"}, - {"2600:6c10:fff6::/47", "20115"}, - {"2607:6800::/32", "27258"}, - {"2a02:440::/32", "30968"}, - {"2a02:26f0:96::/48", "34164"}, - {"2a04:9a00:1113::/48", "208153"}, - {"2a0b:11c0:11::/44", "198682"}, - {"2001:4478:1312::/48", "4739"}, - {"2001:4cb8:c1::/38", "28878"}, - {"2401:f540:1::/46", "134094"}, - {"240a:af53::/32", "146573"}, - {"2800:160:21a4::/41", "14259"}, - {"2404:2440:e0e0::/48", "138521"}, - {"2405:7f00:8900::/38", "133414"}, - {"240e:44d:1280::/41", "4134"}, - {"2800:860::/47", "262197"}, - {"2a00:15f8:a001::/33", "25532"}, - {"2a00:d360::/29", "15600"}, - {"2a0c:ab40::/29", "51105"}, - {"2a0e:bc00::/29", "206316"}, - {"2804:cc4::/43", "52551"}, - {"2001:678:1e0::/48", "202739"}, - {"2404:fa00::/34", "45780"}, - {"2620:123:d001::/48", "3356"}, - {"2a02:2290::/48", "206610"}, - {"2a02:26f7:b684::/48", "36183"}, - {"2a02:26f7:de91::/42", "20940"}, - {"2400:7400:e037::/35", "38044"}, - {"240a:a7a3::/32", "144605"}, - {"2600:803:1201::/29", "701"}, - {"2607:f740:50::/48", "36236"}, - {"2a02:26f7:b2::/48", "36183"}, - {"2a03:db02::/32", "25086"}, - {"240e:e1:9c00::/38", "4812"}, - {"2600:141b:3800::/48", "35994"}, - {"2001:559:c400::/48", "33651"}, - {"2402:1200:4::/44", "24523"}, - {"2a0e:8f02:f014::/48", "212268"}, - {"2001:67c:2278::/48", "44574"}, - {"2806:2f0:3121::/46", "17072"}, - {"2a00:1138::/33", "43782"}, - {"2a00:1490:fac1::/48", "42416"}, - {"2a09:5ec0::/29", "209428"}, - {"2001:67c:2a74::/48", "57839"}, - {"2405:6ac0::/32", "139736"}, - {"2409:8a4c:ce00::/31", "9808"}, - {"240a:a263::/32", "143261"}, - {"240e:a7:7fd5::/46", "140515"}, - {"2602:fed9::/36", "209"}, - {"2603:90f5:700::/40", "11351"}, - {"2804:5d78::/36", "268974"}, - {"2a02:d3c7::/32", "59565"}, - {"2408:8459:cd30::/41", "17622"}, - {"2408:8956:7e00::/40", "17622"}, - {"2602:ffe2:53::/45", "53334"}, - {"2a01:73c0:124::/37", "21450"}, - {"2001:559:153::/45", "7922"}, - {"2400:ac40:b80::/42", "136255"}, - {"2804:5884::/32", "268134"}, - {"2404:b0:2000::/47", "9891"}, - {"2605:3380:44fe::/47", "12025"}, - {"2804:2204::/32", "264586"}, - {"2c0f:fb18::/32", "37199"}, - {"2c0f:fe38:2060::/39", "33771"}, - {"2001:428:c0c::/48", "19604"}, - {"2001:df3:9a00::/48", "135769"}, - {"2001:1900:3012::/48", "6086"}, - {"2001:2060::/30", "1759"}, - {"240e:878:400::/39", "4134"}, - {"2a03:5640:f510::/46", "2906"}, - {"2001:67c:1bf0::/48", "33885"}, - {"2001:4878:c031::/48", "12222"}, - {"2402:800:512b::/41", "7552"}, - {"2604:3400:dc1::/48", "209453"}, - {"2001:df7:dc80::/48", "17487"}, - {"2402:800:f110::/42", "7552"}, - {"2001:559:8783::/45", "7922"}, - {"2001:67c:1100::/48", "197498"}, - {"2001:1260:2::/48", "28537"}, - {"2405:6e00:f820::/48", "133612"}, - {"2604:9cc0:a::/38", "50131"}, - {"2804:5f98::/32", "269111"}, - {"2a03:ff40::/33", "61102"}, - {"2a0f:a01:3::/45", "7018"}, - {"2001:559:326::/48", "13367"}, - {"2001:df7:6100::/48", "138504"}, - {"2402:3a80:1a20::/41", "38266"}, - {"2800:1e0:b02::/37", "7195"}, - {"2804:6040::/32", "269155"}, - {"2402:a300:8006::/44", "55427"}, - {"2001:1a11:ae::/48", "8781"}, - {"2404:4a00:2::/64", "55423"}, - {"240a:ad29::/32", "146019"}, - {"2602:fe6b::/36", "46475"}, - {"2a0f:9400:8023::/48", "213092"}, - {"2001:78c::/32", "57651"}, - {"2401:fa00:40::/47", "24424"}, - {"2607:da00:190::/36", "15164"}, - {"2804:5148::/32", "268443"}, - {"2c0f:fa28::/32", "37054"}, - {"2001:559:24e::/48", "33659"}, - {"2404:8e01::/32", "55392"}, - {"2a02:88d:811f::/48", "47794"}, - {"2a0f:a300::/32", "44326"}, - {"2001:559:c387::/48", "7016"}, - {"2400:8bc0::/32", "134907"}, - {"2408:8957:4c00::/40", "17622"}, - {"2600:1008:f010::/40", "22394"}, - {"2602:807:5000::/46", "55136"}, - {"2602:fcef::/36", "398984"}, - {"2a02:1778::/32", "41079"}, - {"2402:e380:310::/48", "138632"}, - {"2404:2440:c0c0::/48", "138521"}, - {"2409:8b3c::/32", "24444"}, - {"2607:f4e0:300::/32", "4150"}, - {"2620:0:1a20::/48", "33368"}, - {"2804:214::/47", "26615"}, - {"2804:6c58::/32", "270462"}, - {"2a01:c9c0:b1::/45", "24600"}, - {"2a02:26f7:de41::/46", "20940"}, - {"2a0d:8d06:1003::/32", "60557"}, - {"2408:8244::/35", "140726"}, - {"2600:380:f110::/40", "7018"}, - {"2604:5500:ac00::/38", "19165"}, - {"2607:b300:fd03::/48", "54994"}, - {"2804:4fc0::/32", "268347"}, - {"2806:2f0:34e1::/39", "17072"}, - {"2001:550:6600:1::/46", "174"}, - {"2606:800::/32", "1442"}, - {"2a02:c205::/30", "51167"}, - {"2a09:a4c7:8000::/36", "210625"}, - {"2402:800:961d::/41", "7552"}, - {"2001:da8:20f::/48", "24349"}, - {"2401:d800:5270::/40", "7552"}, - {"2804:2f3c::/34", "264879"}, - {"2a00:11c0:39::/48", "42473"}, - {"2a01:8dc0:109::/48", "29479"}, - {"2400:cb00:40::/47", "13335"}, - {"2600:2001::/32", "33517"}, - {"2620:65:a000::/48", "13536"}, - {"2804:13d0:99c0::/38", "263297"}, - {"2804:2fb0::/32", "264906"}, - {"2001:388:3058::/48", "24433"}, - {"2001:559:21::/48", "7015"}, - {"2409:8720:c800::/34", "56046"}, - {"2600:9000:1e4f::/43", "16509"}, - {"2804:7a0c::/32", "271344"}, - {"2001:4010::/32", "44444"}, - {"2404:188::/29", "6619"}, - {"2405:4cc1:d00::/40", "9471"}, - {"240a:aefe::/32", "146488"}, - {"2a04:aa40::/32", "47176"}, - {"2a06:85c0::/48", "202610"}, - {"2a0b:8f80:1::/48", "200746"}, - {"2001:4968::/32", "30513"}, - {"2604:8600:5000::/34", "14453"}, - {"2804:f24:9a11::/33", "263567"}, - {"2a02:26f7:c3c8::/47", "36183"}, - {"2402:e280:2201::/44", "134674"}, - {"240a:a1f2::/32", "143148"}, - {"2603:90b7::/32", "20001"}, - {"2804:4bb4:2000::/32", "267325"}, - {"2a02:26f7:be44::/48", "36183"}, - {"240a:a01a::/32", "142676"}, - {"2a01:66c0::/32", "58308"}, - {"2a0c:4480:a::/48", "204720"}, - {"2001:559:450::/47", "33668"}, - {"2001:67c:2890::/48", "43862"}, - {"2001:df0:d780::/48", "139288"}, - {"240a:a154::/32", "142990"}, - {"2600:6c10:d4::/46", "20115"}, - {"2a06:6541:1440::/48", "8220"}, - {"2a0a:d980::/31", "213113"}, - {"2a0f:1e00:456::/48", "30633"}, - {"2409:8030:1900::/34", "9808"}, - {"240e:352:6400::/31", "4134"}, - {"2605:70c0::/32", "398013"}, - {"2606:cc0:10::/47", "40676"}, - {"2804:3ba0::/32", "52688"}, - {"2620:0:2ea1::/48", "26777"}, - {"2a0c:9a40:8040::/43", "213392"}, - {"2602:fc5d:707::/48", "399866"}, - {"2607:f3f0:3::/32", "16724"}, - {"2a02:2e02:27c0::/36", "12479"}, - {"2402:5c40:5c42::/48", "64089"}, - {"2409:803c:30c1::/42", "24444"}, - {"240a:a0b0::/32", "142826"}, - {"240a:aee7::/32", "146465"}, - {"2604:5040:11::/48", "20150"}, - {"2605:3380:412e::/43", "12025"}, - {"2804:47e4::/32", "267083"}, - {"2a02:2090:6800::/48", "43489"}, - {"2a0b:4d07:501::/48", "44239"}, - {"2a0e:fa00:1::/48", "49447"}, - {"2001:428:f000::/36", "3908"}, - {"2804:e30:dc00::/38", "11338"}, - {"2804:1498::/32", "263339"}, - {"2a07:4bc0::/29", "198537"}, - {"2a0c:9a40:81a0::/48", "213385"}, - {"2001:da8:243::/48", "24348"}, - {"2401:c5c0:201::/37", "55492"}, - {"2406:7400:10::/46", "24309"}, - {"240a:a18a::/32", "143044"}, - {"2400:181::/48", "4766"}, - {"240a:afb1::/32", "146667"}, - {"2804:5420::/32", "268630"}, - {"2a02:26f0:c201::/37", "20940"}, - {"2a03:c8c0::/29", "50476"}, - {"2a0f:607:1056::/48", "212057"}, - {"2800:bf0:2ca::/35", "27947"}, - {"240a:a4d6::/32", "143888"}, - {"2606:8e80:53::/48", "32133"}, - {"2804:18:7800::/43", "26599"}, - {"2a04:42c0::/29", "12593"}, - {"2a0b:20c0:2001::/36", "205766"}, - {"2402:6f40:1::/48", "4812"}, - {"2404:1c40:ff::/39", "24432"}, - {"2804:4b28::/32", "267287"}, - {"2a0b:2780::/29", "43260"}, - {"2a10:c941:10:d::/47", "35277"}, - {"2407:cdc0:e014::/46", "38136"}, - {"2409:804b:2908::/48", "24445"}, - {"240a:acf5::/32", "145967"}, - {"2602:800:c000::/38", "397695"}, - {"2804:18f0::/32", "61764"}, - {"2001:1a08::/32", "15830"}, - {"240a:a81c::/32", "144726"}, - {"2800:bf0:828c::/47", "27947"}, - {"2804:22b0::/32", "264116"}, - {"2a01:768::/32", "25563"}, - {"2a0a:6340::/29", "42624"}, - {"2a0e:d601:7220::/48", "202436"}, - {"2403:c240::/32", "9264"}, - {"2600:6c38:b1c::/46", "20115"}, - {"2605:aa40:c1e5::/34", "395394"}, - {"2a0b:7d40:1::/46", "205583"}, - {"2a0c:b641:5d0::/48", "212952"}, - {"2001:57a:eff1::/35", "22773"}, - {"2001:df4:f900::/48", "137351"}, - {"2804:ac::/32", "18547"}, - {"2406:840:80::/47", "139317"}, - {"2408:8956:f4c0::/38", "17816"}, - {"2800:490:e000::/39", "27951"}, - {"2800:bf0:3780::/45", "52257"}, - {"2a00:1288:f043::/48", "23880"}, - {"2a03:8b60::/45", "29256"}, - {"2a0d:2144::/38", "39083"}, - {"2001:559:84d9::/46", "7015"}, - {"2409:8924:6700::/36", "56046"}, - {"240a:a890::/32", "144842"}, - {"2607:6480:4000::/35", "395337"}, - {"2001:550:a01::/48", "18640"}, - {"2602:ffdf::/38", "63060"}, - {"2604:1d40:200::/40", "30612"}, - {"2402:7f40::/32", "137166"}, - {"2404:6480::/32", "135130"}, - {"2408:8957:f8c0::/37", "17816"}, - {"2a01:aea0:df6::/32", "42473"}, - {"2a06:8c0::/29", "200739"}, - {"2a0e:b107:cb0::/44", "212948"}, - {"2a11:e487:cafe::/48", "212568"}, - {"2600:1010:e000::/44", "6167"}, - {"2803:4610::/32", "271939"}, - {"2a02:2010:2110::/45", "20978"}, - {"2001:559:8733::/45", "33651"}, - {"2402:3a80:1e64::/40", "38266"}, - {"2607:fd48:300:100::/47", "13536"}, - {"2803:e080::/32", "12150"}, - {"2001:559:fe::/39", "7922"}, - {"2001:559:c013::/48", "33491"}, - {"2001:559:8060::/48", "21508"}, - {"2001:c20:7805::/46", "3758"}, - {"2406:e580::/32", "63679"}, - {"2408:8120:7000::/36", "9929"}, - {"240a:a753::/32", "144525"}, - {"2607:fdc8:800::/48", "30036"}, - {"2804:2f60:200::/32", "264887"}, - {"2001:4c8:1111::/33", "15290"}, - {"2a02:5260::/29", "59775"}, - {"2a0a:d180:1000::/29", "206652"}, - {"2409:8904:4260::/39", "24547"}, - {"2803:1680:3000::/36", "21351"}, - {"2a0a:4a40:2273::/29", "206754"}, - {"2600:100c:9010::/38", "22394"}, - {"2620:11a:6000::/44", "32064"}, - {"2a02:27ab::/32", "21100"}, - {"2a02:6600::/32", "5377"}, - {"2a02:ddc3::/48", "47246"}, - {"2001:67c:2eac::/48", "211060"}, - {"2401:7500:fffd::/48", "33480"}, - {"240a:a2b2::/32", "143340"}, - {"2605:38c0::/32", "393601"}, - {"2620:13f:7018::/47", "51439"}, - {"2a01:58:6106::/48", "12552"}, - {"2a09:bd00:ffca::/48", "8985"}, - {"2a0b:1740::/29", "42202"}, - {"2001:550:6f01::/35", "174"}, - {"2406:600::/34", "4694"}, - {"2409:8000:3900::/33", "9808"}, - {"2804:26a4::/32", "263846"}, - {"2a06:cc0::/29", "30929"}, - {"2a0e:8f02:2120::/46", "211635"}, - {"2001:44c8:46b0::/44", "131445"}, - {"2400:ffc0:13c::/47", "17439"}, - {"240a:a342::/32", "143484"}, - {"2606:2800:4290::/48", "15133"}, - {"2804:64fc::/33", "269461"}, - {"2a02:7280::/32", "49572"}, - {"2a04:f240::/29", "201825"}, - {"2a07:b8c1:6::/43", "14043"}, - {"2407:4b40::/47", "141796"}, - {"2800:160:2c37::/44", "14259"}, - {"2804:51b0::/32", "268470"}, - {"2408:80ea:6300::/41", "17816"}, - {"2605:2280::/32", "62886"}, - {"2804:4b54::/32", "267298"}, - {"2a00:7180:8010::/46", "212775"}, - {"2a02:26f7:e2c4::/48", "36183"}, - {"2a0e:b107:5a1::/46", "203943"}, - {"2001:67c:28cc::/48", "51468"}, - {"240a:ad23::/32", "146013"}, - {"2600:1000:9f00::/44", "6167"}, - {"2610:e0:a001::/44", "2572"}, - {"2800:160:1acf::/43", "14259"}, - {"2a02:ac87:ac88::/33", "25145"}, - {"2405:3200::/39", "17639"}, - {"2602:ffc5:30::/46", "7489"}, - {"2a03:b8c0:20::/45", "396253"}, - {"2409:8070:1100::/36", "9808"}, - {"2a03:5342:10::/42", "200656"}, - {"2a03:9180:2::/47", "199813"}, - {"2001:1838:5003::/40", "23352"}, - {"240a:aa81::/32", "145339"}, - {"240a:af93::/32", "146637"}, - {"2804:315c::/32", "265009"}, - {"2a02:2698:9800::/38", "31363"}, - {"2a03:3000::/32", "42772"}, - {"2a0a:3140:1610::/44", "15532"}, - {"2a0d:2146:2404::/48", "44592"}, - {"2a11:3380::/29", "20565"}, - {"2001:e60:a488::/38", "4766"}, - {"2001:1248:5916::/44", "11172"}, - {"2001:1a10:2::/40", "8781"}, - {"2600:1409:3801::/33", "20940"}, - {"2610:a1:1028::/48", "19905"}, - {"2800:3f0::/33", "15169"}, - {"2401:8800:4::/43", "17439"}, - {"240a:a358::/32", "143506"}, - {"240a:ac95::/32", "145871"}, - {"2620:109:40::/40", "10753"}, - {"2804:13b8::/32", "263548"}, - {"2a02:6da0::/29", "47638"}, - {"2408:8456:5000::/42", "17622"}, - {"2408:8459:c930::/41", "17622"}, - {"240a:ae3f::/32", "146297"}, - {"240a:aff6::/32", "146736"}, - {"2600:1406:201::/39", "20940"}, - {"2803:2a00::/38", "27895"}, - {"2804:7114::/32", "270765"}, - {"2a0f:d600::/39", "208236"}, - {"2600:370f:350e::/42", "32261"}, - {"2a02:2968::/29", "48635"}, - {"2a10:9903:110::/44", "15510"}, - {"2001:559:90::/48", "7725"}, - {"2001:df2:4100::/48", "132304"}, - {"2001:1aea::/32", "5588"}, - {"240a:ac5c::/32", "145814"}, - {"2604:10c0:ffff::/48", "40034"}, - {"2800:160:2b07::/41", "14259"}, - {"2803:1780:8000::/48", "264646"}, - {"2804:6348::/32", "269351"}, - {"2a11:a880::/29", "204790"}, - {"2804:52b4::/32", "268535"}, - {"2a00:1c88:100::/48", "209242"}, - {"2001:559:c005::/48", "7016"}, - {"2408:8256:318c::/48", "17816"}, - {"2603:fb80::/27", "397165"}, - {"2a0d:1580::/48", "202085"}, - {"2001:559:822a::/48", "21508"}, - {"2001:678:4a0::/48", "44574"}, - {"2600:1407:e801::/35", "20940"}, - {"2804:1240::/32", "263465"}, - {"2a02:26f0:116::/48", "3292"}, - {"2a11:5705:b00b::/48", "212149"}, - {"2001:559:c262::/48", "33659"}, - {"2620:125:9001::/48", "397415"}, - {"2a02:1710:4::/48", "44843"}, - {"2a0e:cb80::/29", "44486"}, - {"240a:a3b4::/32", "143598"}, - {"2001:559:83d5::/48", "7922"}, - {"2001:4830:c210::/48", "64249"}, - {"2600:1901:c130::/34", "15169"}, - {"2620:106:6009::/45", "3562"}, - {"2a00:4802:5010::/40", "8717"}, - {"2a07:7b80:101::/44", "8757"}, - {"2a11:c300::/29", "204790"}, - {"2001:559:706::/48", "33287"}, - {"2804:a84:8001::/33", "262296"}, - {"2a0e:aa06:470::/44", "208618"}, - {"2400:e500::/48", "138322"}, - {"2620:10a:80ac::/48", "396501"}, - {"2409:8924:6300::/37", "56046"}, - {"2602:feb4:250::/44", "25961"}, - {"2605:e000:40c::/38", "20001"}, - {"2806:230:202f::/48", "11888"}, - {"2806:102e:1e::/48", "8151"}, - {"2001:559:4f9::/48", "33287"}, - {"2405:16c0::/32", "134781"}, - {"240a:ad30::/32", "146026"}, - {"2600:1409:f801::/30", "20940"}, - {"2800:370:84::/48", "28006"}, - {"2401:d800:70::/40", "7552"}, - {"2409:803c:2c00::/38", "9808"}, - {"2409:896a:1b00::/37", "9808"}, - {"2620:128:2010::/48", "397457"}, - {"240a:afcc::/32", "146694"}, - {"2600:1409:b::/48", "20940"}, - {"2607:f6f0:a004::/40", "16553"}, - {"2804:204:206::/44", "28186"}, - {"2001:13d2:5802::/47", "7303"}, - {"2603:fa30::/25", "397165"}, - {"2804:14d:5ca6::/43", "28573"}, - {"2001:559:76a::/48", "22909"}, - {"2001:559:c085::/48", "33287"}, - {"2401:d800:7e10::/42", "7552"}, - {"2406:e900::/48", "132649"}, - {"2804:2fcc::/32", "264912"}, - {"2806:269:3300::/37", "13999"}, - {"2001:5a0:4e02::/35", "6453"}, - {"2001:df2:4380::/48", "139870"}, - {"2409:8a50:1100::/31", "56047"}, - {"2620:2e:40ce::/47", "394506"}, - {"2804:9f8:400c::/32", "262773"}, - {"2804:531c:228::/43", "268564"}, - {"2a07:a105::/30", "200486"}, - {"2a10:a1c0::/32", "6730"}, - {"2001:e60:a388::/37", "4766"}, - {"2604:9e02::/32", "53365"}, - {"2620:11c:f000::/48", "393667"}, - {"2804:6590::/32", "269500"}, - {"2804:7308::/36", "270891"}, - {"2a02:2e02:1ee0::/39", "12479"}, - {"2001:559:86b2::/48", "33650"}, - {"2001:650:cc03::/29", "28748"}, - {"2600:1000:b1d0::/42", "6167"}, - {"2600:1488:c001::/41", "20940"}, - {"2804:14d:600::/40", "28573"}, - {"2804:2674:4000::/40", "264344"}, - {"2804:3c98::/32", "266223"}, - {"2a07:9944:10::/48", "58305"}, - {"2607:f038:4010::/45", "21527"}, - {"2a02:2010:2310::/45", "20978"}, - {"2a04:aa47::/32", "47176"}, - {"2001:559:c267::/44", "7922"}, - {"2408:8000:a018::/48", "140716"}, - {"2408:8956:7840::/40", "17622"}, - {"2602:fd6f:aaa::/45", "18526"}, - {"2a0b:efc0::/37", "60893"}, - {"2a0f:34c0::/29", "400177"}, - {"240a:a206::/32", "143168"}, - {"240e:62:c000::/36", "4134"}, - {"2600:2003::/32", "33517"}, - {"2803:b80::/32", "27930"}, - {"2a00:c40::/32", "34315"}, - {"2a01:8840:52::/45", "12041"}, - {"2001:559:c235::/48", "7922"}, - {"2001:1248:9703::/45", "11172"}, - {"2402:5b00:20::/41", "18002"}, - {"2607:f4e8:e::/47", "22822"}, - {"2001:1bc0::/31", "29686"}, - {"2a01:53c0:ffbf::/48", "54994"}, - {"2001:559:804d::/48", "33662"}, - {"2001:559:c10e::/48", "33659"}, - {"2602:240::/28", "46375"}, - {"2606:40cc::/30", "1239"}, - {"2a00:86c0:2086::/47", "40027"}, - {"2a03:7f80::/32", "42010"}, - {"2a06:1280:ce06::/31", "61138"}, - {"2001:559:1e2::/48", "33656"}, - {"2001:df3:5700::/48", "137198"}, - {"2a00:d00::/39", "41887"}, - {"2a01:6100::/32", "15967"}, - {"2001:df0:a3::/48", "45305"}, - {"2404:a640::/41", "133827"}, - {"240a:a251::/32", "143243"}, - {"2600:1419:6c01::/35", "20940"}, - {"2803:c10::/32", "271867"}, - {"2804:17c8::/32", "263251"}, - {"2a02:26f7:d088::/48", "36183"}, - {"2409:804d:900::/35", "9808"}, - {"2604:6600:fe7d::/40", "40676"}, - {"2804:318c:ff02::/40", "265023"}, - {"2806:20d:322e::/47", "32098"}, - {"2404:7180:aa00::/48", "23848"}, - {"2408:84f3:2c20::/43", "17816"}, - {"2604:e180:de06::/44", "55002"}, - {"2403:6c00::/32", "17514"}, - {"2001:559:8689::/48", "33655"}, - {"2001:559:c136::/48", "20214"}, - {"2401:d380::/32", "38031"}, - {"2a02:26f7:d781::/46", "20940"}, - {"2a0e:b107:15d0::/46", "210951"}, - {"240a:a226::/32", "143200"}, - {"2804:4efc::/34", "268296"}, - {"2804:7d70::/35", "271561"}, - {"2400:1c00:1::/45", "45143"}, - {"2600:1404:a001::/38", "20940"}, - {"2800:5f0:2034::/46", "22724"}, - {"2804:41c4::/32", "267455"}, - {"2806:2f0:2183::/42", "22884"}, - {"2a02:ec80:500::/48", "14907"}, - {"2a0b:8f80::/48", "48635"}, - {"2600:9000:1e0e::/48", "16509"}, - {"2605:a401:8e41::/44", "33363"}, - {"2804:5d08::/32", "263101"}, - {"2a09:2bc0::/32", "209528"}, - {"2a0f:d0c0::/29", "43424"}, - {"2a10:da40::/29", "34907"}, - {"2c0f:ef68:4::/32", "37662"}, - {"2001:579:412c::/43", "22773"}, - {"2001:43f8:13a0::/48", "37187"}, - {"2400:1701::/32", "4765"}, - {"2604:880:264::/43", "29802"}, - {"2803:6f00:801::/32", "14117"}, - {"2a02:2600::/32", "48299"}, - {"2a02:26f0:9d01::/40", "20940"}, - {"2a02:26f7:8c::/48", "36183"}, - {"2a02:4d40::/32", "25394"}, - {"2a0d:a80::/29", "200851"}, - {"2404:c140:222::/34", "138997"}, - {"2600:1006:b030::/44", "22394"}, - {"2606:65c0:30::/48", "399804"}, - {"2804:118c::/32", "53182"}, - {"2804:2a04::/32", "264051"}, - {"2804:574c::/34", "268057"}, - {"2a00:4140::/32", "34766"}, - {"2a0f:9400:7726::/48", "53356"}, - {"2001:1388:80a::/38", "6147"}, - {"240a:accd::/32", "145927"}, - {"2600:1008:b030::/44", "22394"}, - {"2600:14c0:a::/47", "21342"}, - {"2605:9600::/32", "62"}, - {"2800:160:1231::/44", "14259"}, - {"2801:80:a10::/48", "263287"}, - {"2804:7be8:2::/32", "271462"}, - {"2a06:9f40::/30", "204136"}, - {"2406:3400:a00::/32", "10143"}, - {"2409:8050:2100::/37", "9808"}, - {"2607:f718::/32", "11847"}, - {"2a06:6541:4181::/48", "8220"}, - {"2408:880c::/27", "17621"}, - {"2607:8200:c000::/36", "6295"}, - {"2801:80:3400::/48", "268743"}, - {"2806:230:100c::/48", "265594"}, - {"2a02:2380:1::/45", "51941"}, - {"2001:500:89::/48", "26710"}, - {"240e:108:1090::/48", "58542"}, - {"2600:6c38:97::/44", "20115"}, - {"2800:bf0:b405::/42", "27947"}, - {"2804:21ec::/32", "264582"}, - {"2a02:26f7:b404::/48", "36183"}, - {"2001:559:142::/48", "20214"}, - {"2401:4900:40a0::/41", "45609"}, - {"240a:a093::/32", "142797"}, - {"2804:1f08::/32", "263293"}, - {"2804:28b0::/32", "52932"}, - {"2a01:1b8:6::/32", "1257"}, - {"2001:559:467::/48", "33657"}, - {"2001:678:7::/48", "48053"}, - {"2001:67c:2840::/48", "25046"}, - {"2001:d50::/32", "7665"}, - {"240a:a46f::/32", "143785"}, - {"240e:980:9400::/40", "4134"}, - {"2a00:d100::/32", "15704"}, - {"2a06:a004:6000::/36", "44570"}, - {"2a10:3100::/29", "35598"}, - {"2c0f:7b00::/28", "8452"}, - {"2408:8456:cc00::/42", "17622"}, - {"2a00:19c8::/32", "35833"}, - {"2a06:cfc0::/29", "199837"}, - {"2a0f:2a04::/32", "42692"}, - {"240a:a397::/32", "143569"}, - {"2604:8fc0::/32", "13549"}, - {"2a01:77c0:6::/48", "34848"}, - {"2a02:6e8::/32", "8399"}, - {"2a0e:6c80::/29", "208599"}, - {"2c0f:f6d8:4022::/47", "21433"}, - {"2001:7f8:ec::/48", "208425"}, - {"2001:da8:e016::/44", "24367"}, - {"2620:b3:4000::/48", "62611"}, - {"2803:ea80:2000::/36", "28048"}, - {"2804:808::/32", "16735"}, - {"2804:145c:8d90::/38", "263327"}, - {"2804:8150::/34", "272446"}, - {"2001:250:342d::/48", "138393"}, - {"2408:8756:4d00::/32", "17816"}, - {"240e:108:98::/48", "137698"}, - {"2804:3d58::/32", "266525"}, - {"2600:6c20:85e::/40", "20115"}, - {"2001:c20:489a::/48", "9255"}, - {"2001:4878:4225::/48", "12222"}, - {"240b:4007::/32", "45102"}, - {"2a0e:e6c0:4000::/36", "59584"}, - {"2001:559:85af::/48", "20214"}, - {"2001:b20::/29", "24611"}, - {"2405:aa00::/32", "7712"}, - {"2600:140b:cc01::/38", "20940"}, - {"2620:74:29::/48", "396574"}, - {"2803:f00:680::/42", "262182"}, - {"2806:20d:5014::/47", "32098"}, - {"2a00:6180::/32", "29062"}, - {"2a01:9660::/43", "199743"}, - {"2401:8700:3a::/48", "36408"}, - {"2406:c7c0::/32", "138800"}, - {"2600:1418:8001::/33", "20940"}, - {"2804:81d8::/32", "272480"}, - {"2c0f:f598:3::/48", "327813"}, - {"2405:9000:b::/41", "7474"}, - {"2600:140b:7001::/38", "20940"}, - {"2605:380:32::/48", "42473"}, - {"2605:6ac0:3000::/36", "32374"}, - {"2607:f128:1::/37", "32748"}, - {"2610:b0:414c::/43", "3573"}, - {"2a0f:ca86::/40", "208046"}, - {"2001:559:16c::/48", "7016"}, - {"2400:cb00:a770::/47", "13335"}, - {"240e:44d:1100::/42", "140345"}, - {"2602:fed2:718b::/45", "53356"}, - {"2606:4700:3000::/43", "13335"}, - {"2a00:be80::/32", "15557"}, - {"2001:43f8:90::/48", "37708"}, - {"2800:160:1caf::/43", "14259"}, - {"2804:2aa8::/32", "264088"}, - {"2806:2f0:6141::/46", "17072"}, - {"2a0e:3840:1::/48", "3170"}, - {"2001:4408::/45", "4758"}, - {"2403:8400:10::/47", "17917"}, - {"2600:100d:9010::/40", "22394"}, - {"2605:f440:5353::/48", "57439"}, - {"2a0a:7780::/29", "207167"}, - {"2001:1578:200::/40", "12817"}, - {"2404:8d02:4983::/41", "9587"}, - {"2409:8087:102c::/38", "9808"}, - {"2800:8f0::/32", "22860"}, - {"2402:800:5ee0::/44", "7552"}, - {"2405:9200:5f00::/44", "131596"}, - {"240e:3b7:ec00::/35", "140314"}, - {"2a02:ce00::/29", "47521"}, - {"2a11:fe80:fabd::/46", "209209"}, - {"2c0f:f530:20::/44", "61138"}, - {"2804:6064::/32", "269164"}, - {"2a02:2e02:10b0::/41", "12479"}, - {"2001:559:c3b1::/48", "33659"}, - {"240e:45c:3a00::/40", "131285"}, - {"2606:5b00::/38", "29765"}, - {"2620:124:b003::/40", "32521"}, - {"2620:149:100::/41", "714"}, - {"2804:2c58:1010::/39", "265211"}, - {"2a02:ab0::/29", "42346"}, - {"2a03:c400::/32", "8445"}, - {"2001:468:913::/48", "1747"}, - {"2400:9380:99c0::/44", "136167"}, - {"240a:acdb::/32", "145941"}, - {"2a02:63e0::/32", "202709"}, - {"2a02:ad40::/29", "21207"}, - {"2a09:a4c2::/32", "210625"}, - {"2001:559:8495::/48", "22909"}, - {"2001:df1:8900::/48", "136733"}, - {"240e:44d:5a40::/42", "140350"}, - {"2804:3b8::/44", "52965"}, - {"2804:6908:6000::/35", "270244"}, - {"2a07:4841::/48", "13213"}, - {"2a0e:da40:10::/42", "210542"}, - {"2001:250:c29::/48", "23910"}, - {"2001:268:837::/44", "2516"}, - {"2001:468:702::/36", "11537"}, - {"2001:4878:a038::/48", "12222"}, - {"2405:9640::/48", "136557"}, - {"240a:a604::/32", "144190"}, - {"2607:1280:12e0::/44", "394972"}, - {"2607:fb10:5043::/42", "2906"}, - {"2403:1940:10::/48", "137935"}, - {"2409:8914:9c00::/39", "56044"}, - {"2600:1407:20::/47", "20940"}, - {"2602:fff0::/36", "18889"}, - {"2607:f620::/32", "11590"}, - {"2803:cae0:c002::/47", "27951"}, - {"2a0a:c140::/32", "205901"}, - {"2001:559:8338::/48", "33657"}, - {"2001:67c:2944::/48", "211781"}, - {"240e:438:1440::/38", "4134"}, - {"2a02:26f7:d345::/46", "20940"}, - {"2a0f:4680::/32", "50113"}, - {"2a11:bd40::/29", "18779"}, - {"2001:500:61::/48", "33080"}, - {"2607:fc48:c00::/48", "40009"}, - {"2804:70d4::/34", "270751"}, - {"2a0b:6b84:b::/35", "200639"}, - {"2400:1c00:1e::/41", "45143"}, - {"2400:fc00:87e0::/36", "45773"}, - {"2600:6000:fb34::/48", "11351"}, - {"2604:880:222::/43", "29802"}, - {"2607:fb58:7000::/36", "36086"}, - {"2a0b:97c0::/29", "58067"}, - {"2001:1248:a02f::/48", "11172"}, - {"240c:caa1::/32", "24363"}, - {"2600:6c38:d42::/47", "20115"}, - {"2001:559:c1d4::/48", "33287"}, - {"2804:482c::/32", "267102"}, - {"2a02:2e02:280::/37", "12479"}, - {"2001:503:3227::/48", "7342"}, - {"2403:300:a16::/48", "6185"}, - {"2404:bc0:4100::/43", "137735"}, - {"2408:8459:e450::/38", "17816"}, - {"2607:f5b3::/32", "396362"}, - {"2620:e2:4000::/48", "64230"}, - {"2804:660c::/32", "269530"}, - {"2804:67ec::/32", "269659"}, - {"2001:550:9006::/39", "174"}, - {"2405:3140:31::/48", "56006"}, - {"2406:3000:e::/48", "140929"}, - {"2606:4700:1100::/40", "132892"}, - {"2a05:cf40::/29", "199163"}, - {"2400:cb00:a320::/45", "13335"}, - {"2600:bc01::/32", "398993"}, - {"2604:f180::/32", "30526"}, - {"2620:11b:4000::/48", "19210"}, - {"2a02:26f7:f188::/48", "36183"}, - {"2800:160:1f08::/46", "14259"}, - {"2406:eb00:1::/48", "132653"}, - {"2600:380:e900::/41", "7018"}, - {"2600:803:613::/48", "27030"}, - {"2600:1401:8::/34", "20940"}, - {"2804:1288:2000::/32", "263482"}, - {"2a00:47c0:611::/48", "27435"}, - {"2a10:1fc0:4::/48", "61102"}, - {"2001:df3:8880::/48", "132335"}, - {"2603:f078::/24", "397165"}, - {"2604:d600:54f::/43", "32098"}, - {"2803:f00:4c9::/48", "262182"}, - {"2804:7094:5000::/32", "270735"}, - {"2a0f:f480::/29", "60262"}, - {"2402:800:f9c0::/42", "7552"}, - {"240e:67c:c600::/34", "4134"}, - {"2604:9000:103::/34", "19693"}, - {"2a04:4e40:2400::/45", "54113"}, - {"2401:7500:ff6::/47", "33480"}, - {"2806:2f0:5163::/40", "17072"}, - {"2404:7a00::/32", "17953"}, - {"240e:3b9:4c00::/35", "136200"}, - {"240e:44d:5440::/42", "140347"}, - {"2600:380:f107::/48", "64011"}, - {"2600:387:15::/25", "7018"}, - {"2607:f778:c100::/38", "32035"}, - {"2a00:1b00:1000::/48", "47862"}, - {"2a0c:3580::/29", "30823"}, - {"2c0f:fbf0::/48", "37394"}, - {"2001:df0:e6::/48", "45596"}, - {"2001:4878:4031::/48", "12222"}, - {"2405:ec00:9014::/42", "23955"}, - {"2605:940::/40", "396919"}, - {"2607:f160:ff00::/40", "6167"}, - {"2a06:c100::/29", "208920"}, - {"2001:678:108::/48", "196682"}, - {"2402:800:1131::/34", "7552"}, - {"2402:8a80::/32", "134375"}, - {"2407:c40:1::/46", "46562"}, - {"2409:8087:2025::/40", "56046"}, - {"240a:a384::/32", "143550"}, - {"2804:3940::/32", "266021"}, - {"2a04:1a00::/29", "199318"}, - {"2a04:4e40:3a00::/47", "54113"}, - {"2402:800:9601::/44", "7552"}, - {"2600:140b:1401::/38", "20940"}, - {"2800:160:11a4::/43", "14259"}, - {"2804:314:4007::/43", "61568"}, - {"2a0e:9680::/29", "57112"}, - {"2001:df2:f980::/48", "17439"}, - {"2402:800:3de0::/44", "7552"}, - {"2403:e800:e80c::/35", "4637"}, - {"2408:8456:f100::/42", "17622"}, - {"2602:fe04::/36", "15164"}, - {"2804:4498::/32", "267641"}, - {"2a02:26f7:b6c9::/46", "20940"}, - {"2a0f:5707:aa23::/44", "207622"}, - {"2001:cc8::/31", "4637"}, - {"2402:ef40::/32", "4808"}, - {"2404:bf40:f002::/41", "139084"}, - {"240a:a2af::/32", "143337"}, - {"240e:979:7f00::/32", "4134"}, - {"2a0a:4ac0::/29", "40970"}, - {"2001:1900:2288::/45", "3356"}, - {"2404:3d00:4146::/44", "3573"}, - {"240a:ad25::/32", "146015"}, - {"2a00:12d8::/43", "12586"}, - {"2001:df3:a980::/48", "135900"}, - {"2401:dc40::/32", "24253"}, - {"2a0e:97c0:4da::/48", "211024"}, - {"2001:559:30f::/48", "33287"}, - {"2401:7b40:4001::/46", "38071"}, - {"2404:8000:94::/44", "17451"}, - {"2409:8914:9e00::/39", "56044"}, - {"240a:a387::/32", "143553"}, - {"240a:a6f8::/32", "144434"}, - {"2604:b180:150::/44", "26925"}, - {"2605:7b40::/32", "53384"}, - {"2620:104:600a::/48", "53779"}, - {"2804:7734::/33", "271162"}, - {"2a00:dd80:3e::/41", "36236"}, - {"2406:e000::/38", "23655"}, - {"2607:f740:e626::/48", "29997"}, - {"2620:17c::/36", "30641"}, - {"2804:59c::/32", "262527"}, - {"2804:bfc::/32", "52654"}, - {"2a0e:97c3:416::/48", "20473"}, - {"2800:110:3400::/48", "28068"}, - {"2001:49f0:a071::/36", "174"}, - {"2800:370:61::/48", "28006"}, - {"2a00:6c80::/32", "44974"}, - {"2a02:2a60::/32", "702"}, - {"2a0c:9840::/29", "202510"}, - {"2804:cb0:facf::/37", "52742"}, - {"2001:500:6::/48", "12287"}, - {"2404:2280:1c8::/48", "24429"}, - {"240a:a8a1::/32", "144859"}, - {"2604:a2c0::/32", "53256"}, - {"2800:550:5::/42", "7004"}, - {"2804:4604::/32", "266962"}, - {"2a0c:8540:1::/45", "42198"}, - {"240a:a429::/32", "143715"}, - {"2804:7c18::/42", "271475"}, - {"240e:44d:6000::/41", "140345"}, - {"2600:140b:9800::/48", "24319"}, - {"2607:f148:4000::/36", "11734"}, - {"2800:860:facf::/37", "262197"}, - {"2804:49a4::/32", "267194"}, - {"2804:6010::/32", "269143"}, - {"2600:6c08::/31", "20115"}, - {"2a02:26f0:af01::/40", "20940"}, - {"2c0f:ecf0::/32", "36924"}, - {"2001:559:8350::/47", "7922"}, - {"2001:559:c0a1::/48", "33652"}, - {"2001:df5:3080::/48", "55308"}, - {"2804:76d0::/32", "271136"}, - {"2a02:ec0:300::/32", "41653"}, - {"2804:7090::/32", "270734"}, - {"2a05:4741:6::/48", "51699"}, - {"2a06:a000:200::/40", "210842"}, - {"2409:8904:a840::/39", "24547"}, - {"240a:a5ac::/32", "144102"}, - {"2a02:4b8::/31", "39605"}, - {"2a0b:7ec0::/33", "206728"}, - {"2001:468:2620::/48", "237"}, - {"2001:57a:b800::/33", "22773"}, - {"2401:b180:8000::/33", "37963"}, - {"240a:a0c9::/32", "142851"}, - {"2602:fcb8::/36", "36289"}, - {"2603:b0e0:caff::/34", "11796"}, - {"2610:b0:40bf::/41", "3573"}, - {"2620:122:8003::/48", "399731"}, - {"2804:550c::/33", "268686"}, - {"2400:6280:150::/48", "132280"}, - {"2607:9e80:1381::/32", "397068"}, - {"2803:2a80:1255::/48", "262928"}, - {"2a02:26f7:cf0a::/42", "20940"}, - {"2a02:26f7:d888::/48", "36183"}, - {"2a09:f780::/48", "203395"}, - {"2001:559:c298::/48", "33287"}, - {"2400:cb00:380::/46", "13335"}, - {"240e:3b8:1800::/34", "4134"}, - {"2600:9000:232a::/45", "16509"}, - {"2a02:2e02:a0d0::/39", "12479"}, - {"2a0c:a9c7:2::/47", "62135"}, - {"2001:250:5831::/48", "138371"}, - {"2001:559:c30c::/48", "7922"}, - {"2001:e48:22:1018::/48", "9583"}, - {"2001:4220:800b::/45", "24835"}, - {"2402:9800:4005::/48", "136108"}, - {"2405:9cc0::/32", "139967"}, - {"2606:54c0::/32", "13335"}, - {"2804:2bc::/39", "262832"}, - {"2001:1248:9c0f::/43", "11172"}, - {"2400:a980:4000::/40", "38587"}, - {"2600:c0e::/34", "13789"}, - {"2600:140b:b801::/38", "20940"}, - {"2600:8807:a840::/38", "22773"}, - {"2c0f:1a00::/32", "37603"}, - {"240e:96b:600f::/43", "140369"}, - {"2001:1260:4f1::/44", "28532"}, - {"2400:9380:8140::/48", "4134"}, - {"2404:bf40:c201::/41", "139084"}, - {"2404:f4c0:5151::/36", "139248"}, - {"2604:92c0::/32", "19568"}, - {"2804:1d0c::/32", "61692"}, - {"2804:455c::/32", "266921"}, - {"240e:30a:1200::/32", "4134"}, - {"2806:230:602b::/48", "11888"}, - {"2a03:8ac0:250::/48", "47523"}, - {"2a0a:e680::/29", "21159"}, - {"2600:1402:4000::/48", "35994"}, - {"2607:f058:2200::/32", "22302"}, - {"2a09:b0c0::/32", "9063"}, - {"2001:559:c116::/48", "7922"}, - {"2001:df0:21e::/48", "55396"}, - {"2001:df5:9980::/48", "140766"}, - {"2407:cdc0:a000::/44", "38136"}, - {"240a:a681::/32", "144315"}, - {"240e:980:2c01::/40", "4134"}, - {"2604:200:7::/43", "33132"}, - {"2801:ba::/32", "28602"}, - {"2804:67fc::/32", "269663"}, - {"2a03:d200::/32", "56366"}, - {"2a0f:5701:fe02::/43", "206499"}, - {"2800:160:1afb::/39", "14259"}, - {"2001:559:c032::/45", "22909"}, - {"2409:8a02::/32", "38019"}, - {"2600:1417:78::/48", "9498"}, - {"2804:14c:dc81::/41", "28573"}, - {"2a02:128:6::/48", "50765"}, - {"2a02:26f7:f284::/48", "36183"}, - {"2a03:a580::/32", "197914"}, - {"2001:579:6290::/45", "22773"}, - {"2402:800:76c0::/42", "7552"}, - {"240a:aa40::/32", "145274"}, - {"2804:3c28::/36", "263011"}, - {"2804:77d0::/32", "271201"}, - {"2a03:6306::/32", "12837"}, - {"2a0f:85c2::/32", "207841"}, - {"2620:10a:80ad::/48", "55195"}, - {"2a02:ff0:3df1::/46", "12735"}, - {"2a02:26f7:f6f8::/47", "36183"}, - {"2a0c:9ac0::/29", "18779"}, - {"2001:1b70:86ae::/48", "158"}, - {"240a:abbc::/32", "145654"}, - {"2402:800:3eb1::/44", "7552"}, - {"2402:800:5d2b::/41", "7552"}, - {"240a:afa5::/32", "146655"}, - {"2a02:2e02:24d0::/39", "12479"}, - {"2a10:d8c0::/29", "208861"}, - {"2a11:e700::/29", "60935"}, - {"240a:acd5::/32", "145935"}, - {"2607:f710:60::/48", "19624"}, - {"2001:df2:e600::/48", "133661"}, - {"2607:4800::/32", "25637"}, - {"2804:431c:300::/32", "267549"}, - {"2a02:26f7:b8c5::/46", "20940"}, - {"2001:559:8550::/47", "33490"}, - {"2600:1004:d060::/40", "22394"}, - {"2603:c001:3e00::/43", "31898"}, - {"2606:1a40:200e::/47", "42473"}, - {"2804:4f10::/32", "266612"}, - {"2804:599c::/32", "268713"}, - {"2a0b:bc80::/29", "42924"}, - {"2a0b:c4c0::/29", "9144"}, - {"2a0f:2240::/29", "60262"}, - {"2400:8901::/29", "63949"}, - {"2407:3280::/32", "4851"}, - {"2409:8087:1000::/44", "9808"}, - {"2620:40:6000::/48", "30405"}, - {"2620:100:6029::/43", "19679"}, - {"2a02:1390:7000::/36", "21351"}, - {"2a03:c940::/32", "52142"}, - {"2a0a:6680:197a::/34", "203500"}, - {"2001:fd8:f200::/42", "132199"}, - {"2607:e480:4::/48", "395748"}, - {"2607:fdf0:5fff::/32", "8008"}, - {"2801:15:a800::/48", "19429"}, - {"2a00:4802:3c10::/39", "8717"}, - {"2400:4ec0:8f01::/35", "64300"}, - {"2408:8459:ce10::/42", "17623"}, - {"2409:8055:301a::/48", "9808"}, - {"2803:8100::/32", "21826"}, - {"2a0d:4ac0::/46", "208006"}, - {"2001:44b8:309b::/48", "7545"}, - {"2403:3800:601::/35", "4007"}, - {"2600:6c7f:91c0::/43", "20115"}, - {"2620:149:a23::/45", "714"}, - {"2a09:f0c0::/29", "209169"}, - {"2a0c:7680:1337::/48", "50629"}, - {"2406:bf00::/48", "38220"}, - {"240a:aea8::/32", "146402"}, - {"240e:41:c000::/37", "17799"}, - {"2604:d600:698::/42", "32098"}, - {"2606:c380::/32", "11440"}, - {"2606:ef80:7::/32", "7226"}, - {"2801:b6:1000::/32", "263083"}, - {"240a:aae6::/32", "145440"}, - {"2804:62c::/34", "262569"}, - {"2001:559:558::/48", "33287"}, - {"2001:dd8:1b::/48", "24049"}, - {"2405:8a00:c028::/34", "55824"}, - {"240a:a69e::/32", "144344"}, - {"2606:c280::/32", "394968"}, - {"2607:f8f0:680::/48", "271"}, - {"2803:6ce0:6000::/32", "269909"}, - {"2a01:a560::/32", "12552"}, - {"2001:1248:5a0d::/43", "11172"}, - {"2a00:1e68:113::/31", "42861"}, - {"2a00:dcc7:d000::/38", "34971"}, - {"2a02:26f7:78::/48", "36183"}, - {"2a02:6900:8818::/48", "7160"}, - {"2409:8070:30fd::/46", "9808"}, - {"240a:aa86::/32", "145344"}, - {"2600:1009:9100::/44", "6167"}, - {"2607:d500:202::/40", "54527"}, - {"2a00:5a60:c000::/48", "199274"}, - {"2a03:2880:f03b::/45", "32934"}, - {"2c0f:f858:3::/32", "36947"}, - {"2001:559:3db::/48", "7725"}, - {"2408:8956:f6c0::/36", "17816"}, - {"2606:2800:4ac4::/46", "15133"}, - {"2a00:1c98::/32", "34762"}, - {"2a0a:9000::/29", "64472"}, - {"2001:1900:221f::/42", "3356"}, - {"2407:5040:a00::/34", "134715"}, - {"2606:ae00:1000::/48", "7287"}, - {"2806:230:2025::/48", "11888"}, - {"2a03:b8c0:1b::/45", "396253"}, - {"2001:470:f7::/48", "6939"}, - {"2406:4c00::/32", "9509"}, - {"2407:ff80::/35", "135881"}, - {"240a:a13f::/32", "142969"}, - {"2001:818::/29", "12353"}, - {"2404:4600:6::/48", "38099"}, - {"2800:160:232f::/40", "14259"}, - {"2a01:b5a0::/32", "45010"}, - {"2804:2b44::/43", "265144"}, - {"2a01:6e60::/32", "199883"}, - {"2001:500:f1::/48", "198260"}, - {"2401:4800::/48", "38457"}, - {"2404:880:22::/48", "38750"}, - {"2602:fd35::/36", "398427"}, - {"2a01:4ac0:1::/46", "57497"}, - {"2a09:7d40::/44", "209382"}, - {"2a0f:d940::/29", "60781"}, - {"2400:cc00::/34", "17477"}, - {"2a07:4f81:1::/48", "14870"}, - {"2402:800:9855::/42", "7552"}, - {"2402:800:9cc5::/43", "7552"}, - {"240e:44d:4f80::/41", "4134"}, - {"2806:2f0:1062::/48", "22884"}, - {"2406:2000:9c::/48", "38033"}, - {"2600:6c10:a5::/44", "20115"}, - {"2610:20:8030::/44", "6629"}, - {"2607:8b80::/32", "4986"}, - {"2a01:c840::/28", "15962"}, - {"2a0b:79c0::/29", "8426"}, - {"2001:468:c81::/42", "40220"}, - {"2001:67c:217c::/48", "2486"}, - {"2001:ee0:eb00::/40", "45899"}, - {"2001:f20:4001::/48", "9875"}, - {"2804:2f34::/35", "264877"}, - {"2a02:26f7:2b::/48", "20940"}, - {"2405:4000::/36", "38082"}, - {"2600:1002:d000::/43", "6167"}, - {"2a0a:a3c0:c0::/32", "41955"}, - {"2600:6000:fd0f::/42", "12271"}, - {"2804:7110:5100::/34", "270764"}, - {"2a02:26f7:d000::/48", "36183"}, - {"2a02:26f7:d588::/48", "36183"}, - {"2001:470:9a::/48", "17197"}, - {"2001:559:8446::/48", "33657"}, - {"2402:800:5a2b::/41", "7552"}, - {"2404:4a00:7a00:1::/37", "45629"}, - {"240e:351:5c00::/34", "134419"}, - {"2a04:4e40:810::/41", "54113"}, - {"2001:559:878f::/48", "7015"}, - {"2001:678:fc8::/48", "207960"}, - {"2a02:6900:8807::/48", "43898"}, - {"2a06:6541:1000::/48", "34893"}, - {"2001:df3:2d00::/48", "63765"}, - {"2a0e:1a00::/29", "206894"}, - {"2600:1003:b0a0::/44", "6167"}, - {"2a10:1180::/31", "212181"}, - {"2001:559:68::/48", "7922"}, - {"2001:559:340::/45", "33651"}, - {"2001:c20:48c2::/48", "9255"}, - {"2001:df3:8e80::/48", "140599"}, - {"240e:f7::/36", "58461"}, - {"2602:feb4:130::/44", "25961"}, - {"2607:f098:3300::/33", "33363"}, - {"2804:4ad0::/32", "267265"}, - {"2a07:5100::/29", "203052"}, - {"2001:e40::/29", "9370"}, - {"2605:5980::/32", "12284"}, - {"2606:7d00:c001::/48", "14749"}, - {"2806:2f0:6123::/41", "17072"}, - {"2001:67c:17f4::/48", "1257"}, - {"2402:f700:4000::/32", "23907"}, - {"2404:3d00:40de::/47", "3573"}, - {"240e:3b1:2c00::/35", "134774"}, - {"2800:b000::/32", "7303"}, - {"2a00:1ec8:26::/47", "2854"}, - {"2001:67c:12e8::/47", "24603"}, - {"2001:67c:27dc::/48", "8426"}, - {"2402:e280:211b::/45", "134674"}, - {"240a:a777::/32", "144561"}, - {"2600:380:c180::/37", "20057"}, - {"2600:6000:fd0e::/48", "11351"}, - {"2804:64f4::/32", "269459"}, - {"2a0e:b107:22::/48", "208181"}, - {"2400:5e00::/32", "7598"}, - {"2408:8957:1000::/40", "17622"}, - {"2a00:4802:a70::/40", "13124"}, - {"2a02:26f7:c2::/48", "36183"}, - {"2a02:26f7:c480::/48", "36183"}, - {"2a05:400::/29", "205112"}, - {"2401:4900:3840::/43", "45609"}, - {"2605:9300:2::/48", "13767"}, - {"2804:13dc:ff30::/40", "262428"}, - {"2804:76b4::/32", "271129"}, - {"2a01:c9c0:8018::/48", "2285"}, - {"2a0a:90c0:1059::/42", "205080"}, - {"2001:43f8:1180::/48", "37394"}, - {"2405:4000:800:a::/61", "38082"}, - {"2600:140f:3201::/37", "20940"}, - {"2a02:a80::/29", "52126"}, - {"2a06:5d00::/29", "47372"}, - {"2001:43f8:3b0::/48", "327694"}, - {"2402:9d80:26d::/40", "131429"}, - {"240a:a6a9::/32", "144355"}, - {"2804:13d0:9940::/40", "263297"}, - {"2a02:dc00:202::/48", "15493"}, - {"2a0e:fd45:40fc::/48", "3280"}, - {"2001:418:9808::/48", "21778"}, - {"2001:dcc:702::/48", "23600"}, - {"2604:7c40:100::/40", "31867"}, - {"2a01:a7e0::/36", "200711"}, - {"2a05:1580:10::/46", "59874"}, - {"240a:a902::/32", "144956"}, - {"2804:b18:89::/45", "52941"}, - {"2001:678:128::/48", "205236"}, - {"2001:da8:d800::/42", "24362"}, - {"240a:a5a8::/32", "144098"}, - {"2804:644c::/32", "269419"}, - {"2804:6ac4:3000::/32", "16921"}, - {"2806:230:3015::/48", "11888"}, - {"240a:a632::/32", "144236"}, - {"2605:a401:8c75::/44", "33363"}, - {"2800:b70:2::/44", "262191"}, - {"2001:1b70:6202::/48", "158"}, - {"2600:1480:1100::/37", "20940"}, - {"2800:3c0:20a0::/39", "19863"}, - {"2a0e:8880::/29", "210662"}, - {"240a:a98e::/32", "145096"}, - {"2402:800:510f::/43", "7552"}, - {"2402:800:f840::/42", "7552"}, - {"2602:803:6000::/44", "25915"}, - {"2606:b440::/32", "396893"}, - {"2a00:ea40::/32", "2589"}, - {"2a01:6c8::/36", "29006"}, - {"2a01:4660::/32", "34360"}, - {"2a02:26f7:ee41::/46", "20940"}, - {"2001:559:c282::/48", "33652"}, - {"2001:67c:2554::/48", "39840"}, - {"2001:da8:4805::/48", "24360"}, - {"2001:448a:10f0::/34", "7713"}, - {"2404:9400:f::/48", "133159"}, - {"2409:8c70:3a10::/44", "140105"}, - {"240a:a121::/32", "142939"}, - {"2804:50::/35", "26592"}, - {"2804:62b4::/35", "269313"}, - {"2a06:4280::/29", "60032"}, - {"2a10:f9c0::/29", "202365"}, - {"2404:af80:10::/47", "38026"}, - {"240e:d9:d801::/34", "4134"}, - {"2a04:4e40:9420::/43", "54113"}, - {"2a05:9d40::/29", "62166"}, - {"2607:f298:b::/48", "26347"}, - {"2803:7600::/32", "265751"}, - {"2806:2f0:8183::/42", "17072"}, - {"2a01:7d20:102::/38", "203645"}, - {"240e:983:1a00::/40", "4811"}, - {"2804:2e2c::/32", "265329"}, - {"2804:3f3c::/32", "266647"}, - {"2a02:26f7:d884::/48", "36183"}, - {"2001:678:d::/48", "49488"}, - {"2405:be40::/48", "131378"}, - {"2408:8957:e700::/40", "17816"}, - {"240e:108:8d::/48", "137693"}, - {"2620:1ec:49::/36", "8075"}, - {"2a00:16c8::/39", "50173"}, - {"2a06:21c0::/29", "51942"}, - {"2403:6b80::/44", "2635"}, - {"2404:7c80::/32", "133661"}, - {"2804:3bbc::/32", "266168"}, - {"2a04:2cc0::/29", "38917"}, - {"2c0f:f030::/34", "328137"}, - {"2408:840d:2900::/42", "17621"}, - {"2800:160:1ed5::/42", "14259"}, - {"2a03:c100::/32", "49808"}, - {"2a09:a940::/29", "61437"}, - {"2408:870c:100::/34", "17621"}, - {"240a:af9a::/32", "146644"}, - {"2a03:1180::/32", "198002"}, - {"2001:1600::/32", "29222"}, - {"2405:8dc0::/32", "45370"}, - {"2610:a0:2::/47", "7786"}, - {"2804:40d0::/32", "265983"}, - {"2a04:b480:20::/46", "209506"}, - {"2a12:5840:b00b::/48", "212149"}, - {"2401:c500:fd10::/46", "54994"}, - {"240a:a59a::/32", "144084"}, - {"2620:98:a000::/47", "399668"}, - {"2804:2fc::/32", "53238"}, - {"2a0b:cdc1::/32", "35790"}, - {"2602:fed2:7190::/45", "53356"}, - {"2801:1f0:2020::/33", "3573"}, - {"2804:7b28::/32", "271414"}, - {"2a06:3d80::/29", "60117"}, - {"2402:6640:6::/43", "134995"}, - {"2804:4274::/32", "267501"}, - {"2a02:2698:2c00::/38", "41727"}, - {"2a02:26f7:b648::/48", "36183"}, - {"2a04:e4c7:fffd::/46", "36692"}, - {"2001:1248:5ae6::/47", "11172"}, - {"2001:18e8:400::/40", "1767"}, - {"2620:13f:3000::/43", "46842"}, - {"2804:2f88:e100::/35", "264897"}, - {"2a04:7840::/32", "56523"}, - {"2a05:d000:2000::/40", "16509"}, - {"2404:f4c0:f9cb::/48", "142281"}, - {"2605:dd40:40::/44", "398549"}, - {"2607:f4a0:5011::/32", "11272"}, - {"2804:c1c::/32", "52679"}, - {"2a03:48c0::/32", "199608"}, - {"2602:fd50:f60::/44", "212276"}, - {"2804:50a0::/32", "268400"}, - {"2a04:2bc0::/32", "207133"}, - {"2001:67c:2eb4::/48", "207372"}, - {"2400:a980:68fc::/47", "133111"}, - {"2408:8256:2d8d::/43", "17623"}, - {"240a:ae18::/32", "146258"}, - {"240e:44d:3580::/41", "4134"}, - {"2600:1406:fc00::/48", "35994"}, - {"2600:6c10:98::/46", "20115"}, - {"2602:fd81::/36", "32018"}, - {"240e:108:86::/48", "136195"}, - {"240e:438:4240::/37", "4134"}, - {"2603:f730::/24", "397165"}, - {"2001:678:6a4::/48", "202481"}, - {"2001:b08:17::/48", "8398"}, - {"2602:107:2b10::/48", "20115"}, - {"2804:3980::/32", "266034"}, - {"2a0d:d680::/29", "57588"}, - {"2c0f:f568::/46", "37451"}, - {"2001:559:866d::/48", "13367"}, - {"2001:559:c1ae::/48", "7725"}, - {"2600:6c7f:9040::/48", "20115"}, - {"2001:559:831f::/48", "33650"}, - {"2001:678:a20::/48", "15380"}, - {"2001:913:1000::/36", "204059"}, - {"2001:4998:61::/46", "10310"}, - {"2001:4b18::/34", "20746"}, - {"2604:ab80:2::/45", "55079"}, - {"2a07:7340::/29", "34549"}, - {"2c0e:7f80:300::/29", "36974"}, - {"2402:800:3c8d::/41", "7552"}, - {"2804:3868:1800::/32", "266475"}, - {"2a01:6f00::/29", "43571"}, - {"2001:559:87e5::/48", "7922"}, - {"2001:559:c394::/48", "33651"}, - {"2405:f080:2e00::/47", "136907"}, - {"2806:303::/32", "21623"}, - {"2a06:1a40::/29", "20988"}, - {"2001:250:85a::/48", "138182"}, - {"2a10:540::/29", "47747"}, - {"2402:6f40::/48", "45079"}, - {"2404:bf40:c4c0::/48", "7545"}, - {"2406:9dc0::/44", "18250"}, - {"2801:1e:7000::/48", "266773"}, - {"2801:80:3770::/46", "269498"}, - {"2408:8256:3273::/44", "17623"}, - {"240a:a713::/32", "144461"}, - {"2804:f1c::/32", "262463"}, - {"2a03:5a00:39::/48", "203517"}, - {"2001:559:77d::/48", "7015"}, - {"2001:df3:2000::/48", "45712"}, - {"2409:805c:1100::/36", "9808"}, - {"2620:4d:4021::/46", "395403"}, - {"2a09:bac0:143::/48", "13335"}, - {"2001:559:5b0::/48", "7922"}, - {"2001:559:c008::/46", "33651"}, - {"2001:67c:86c::/48", "59935"}, - {"2001:df0:2780::/48", "138973"}, - {"2407:6800::/32", "9723"}, - {"2a03:2887:ff31::/46", "33667"}, - {"2402:c340:eeef::/35", "38047"}, - {"2409:8051:1802::/40", "56047"}, - {"240e:438:e20::/43", "140647"}, - {"2a0d:76c0::/48", "209608"}, - {"2001:559:c2fd::/39", "33287"}, - {"240a:a807::/32", "144705"}, - {"240a:a305::/32", "143423"}, - {"2604:d600:15a8::/45", "32098"}, - {"2402:8100:c::/43", "55644"}, - {"2607:f280::/32", "14615"}, - {"2804:40:e000::/35", "28657"}, - {"2804:4524::/32", "267675"}, - {"2a01:5042:3::/48", "202196"}, - {"2a02:2e02:1ba0::/43", "12479"}, - {"2a04:2e80:6::/48", "59861"}, - {"2001:470:91::/45", "6939"}, - {"2804:2384:f000::/36", "264167"}, - {"2a0e:b40::/48", "62321"}, - {"2001:df0:c2::/48", "9749"}, - {"240a:a10c::/32", "142918"}, - {"240a:a94d::/32", "145031"}, - {"2a07:d880::/32", "3214"}, - {"2a0b:b81::/46", "211772"}, - {"2602:fed5:5::/36", "27398"}, - {"2603:b051::/26", "11796"}, - {"2c0f:ffa8::/32", "37057"}, - {"2001:2000:6000::/40", "1759"}, - {"2600:8806:c000::/31", "22773"}, - {"2620:1ec:41::/44", "8068"}, - {"2804:734::/32", "262624"}, - {"2804:49e8::/32", "267208"}, - {"2409:8924:c500::/38", "56046"}, - {"2a10:3900::/48", "39392"}, - {"2001:67c:284::/48", "198605"}, - {"2409:408c:9000::/31", "55836"}, - {"240a:ac26::/32", "145760"}, - {"2804:63a8::/36", "269375"}, - {"2a00:63c0::/29", "44133"}, - {"2001:67c:25b8::/48", "41038"}, - {"2402:800:7090::/42", "7552"}, - {"240a:aa4a::/32", "145284"}, - {"240e:105::/32", "4134"}, - {"2600:8807:9400::/36", "22773"}, - {"2602:fc8b:25::/46", "211544"}, - {"2604:ae80:1000::/36", "11904"}, - {"2a02:26f7:e408::/48", "36183"}, - {"2a06:6dc0::/29", "49788"}, - {"2801:1:8805::/46", "64102"}, - {"2804:6b04::/32", "270372"}, - {"2a03:5840:1::/40", "35661"}, - {"2a03:db80:3410::/48", "12643"}, - {"2a0c:5600::/29", "208106"}, - {"2a0e:d200::/29", "209044"}, - {"2001:559:18b::/48", "7015"}, - {"2400:fc00:42d0::/37", "45773"}, - {"2408:8256:2d77::/44", "17623"}, - {"240a:a2d4::/32", "143374"}, - {"240a:a5ae::/32", "144104"}, - {"240c:c0a8:5c4a::/32", "24348"}, - {"2804:14d:148f::/43", "28573"}, - {"2804:46f0:81::/41", "267021"}, - {"2804:5570::/32", "267935"}, - {"2a04:9a00:1046::/44", "212157"}, - {"2a0a:e340::/29", "205689"}, - {"2a10:a80::/32", "202717"}, - {"2001:9f0::/29", "719"}, - {"2604:d600:1073::/40", "32098"}, - {"2804:6244::/32", "269287"}, - {"2a01:598::/29", "3320"}, - {"2001:67c:1810::/48", "62392"}, - {"240a:a6d3::/32", "144397"}, - {"2a0a:fd40::/29", "44851"}, - {"2a0e:f600:49::/29", "60781"}, - {"2a01:a7c0::/32", "199606"}, - {"2a0d:4d00:80::/48", "44794"}, - {"240a:afbe::/32", "146680"}, - {"240a:afbf::/32", "146681"}, - {"2607:6004:a100::/40", "397378"}, - {"2607:b400:a01::/48", "40220"}, - {"2a02:5360::/32", "51326"}, - {"2400:cb00:300::/47", "13335"}, - {"2a02:26f0:ea01::/39", "20940"}, - {"2c0f:eb00:700::/40", "37148"}, - {"2607:a780:1::/48", "395518"}, - {"2620:0:2250::/48", "20130"}, - {"2800:bc0::/32", "20080"}, - {"2a02:26f7:dbc1::/46", "20940"}, - {"2a02:2e02:1950::/42", "12479"}, - {"2001:67c:2c54::/48", "13189"}, - {"240a:ac6e::/32", "145832"}, - {"2804:90:4100::/38", "28580"}, - {"2804:5cd4::/33", "268933"}, - {"2806:230:200c::/48", "265594"}, - {"2a03:efc0:1700::/40", "33438"}, - {"2a0e:68c0:4::/48", "57616"}, - {"2a0e:97c0:6d1::/46", "208690"}, - {"2c0f:5200::/32", "328822"}, - {"2c0f:fc90:1002::/32", "16284"}, - {"2001:480:50::/48", "6043"}, - {"240a:a6b3::/32", "144365"}, - {"240e:3bd:4c00::/35", "136200"}, - {"2a01:9860::/32", "205952"}, - {"2a02:26f7:cc09::/42", "20940"}, - {"2a03:6420::/32", "39384"}, - {"2a0a:ec40::/32", "62214"}, - {"240a:a977::/32", "145073"}, - {"2602:fc0a::/48", "400191"}, - {"2804:4008::/32", "265929"}, - {"2804:59a0:1000::/36", "268714"}, - {"2a02:7d8:e10::/32", "3302"}, - {"2a03:4d42:1000::/31", "199610"}, - {"2a09:7c45::/32", "135330"}, - {"2001:4088::/32", "9153"}, - {"2402:800:9739::/41", "7552"}, - {"2a02:26f7:cc80::/48", "36183"}, - {"2a02:26f7:cdc9::/42", "20940"}, - {"2a03:dc00::/32", "57752"}, - {"2a0b:aac0::/29", "64236"}, - {"2a0e:b101:302::/32", "60474"}, - {"2001:67c:2b38::/48", "16101"}, - {"2600:6c38:1b7::/44", "20115"}, - {"2803:10a0::/32", "266793"}, - {"2804:6b6c::/32", "270399"}, - {"2a02:b48:800c::/46", "39572"}, - {"2001:da8:b00c::/48", "23910"}, - {"2406:c500:ffef::/48", "4739"}, - {"2605:1500::/32", "19518"}, - {"2620:106:f000::/47", "22964"}, - {"2a02:26f7:da85::/46", "20940"}, - {"2001:d10:9800::/33", "4787"}, - {"240a:a2ab::/32", "143333"}, - {"2600:2c01:1000::/36", "27582"}, - {"2603:c027:4000::/35", "31898"}, - {"2800:88:14::/41", "26210"}, - {"2a01:8840:b5::/48", "207266"}, - {"2a03:5640:f200::/42", "16509"}, - {"2c0f:f5b8::/32", "327997"}, - {"2400:44a0::/48", "149194"}, - {"2403:c000:1401::/48", "38228"}, - {"240e:67a:1800::/32", "4134"}, - {"2a00:1908:e965::/48", "50475"}, - {"2a10:3dc0::/29", "204790"}, - {"2620:84:a000::/44", "398330"}, - {"2804:764::/32", "10733"}, - {"2a06:7880::/29", "12437"}, - {"2001:df3:5a00::/48", "131996"}, - {"2001:df4:9f00::/48", "135722"}, - {"2403:7500::/32", "38566"}, - {"2605:a900:2200::/35", "46887"}, - {"2607:f6f0:8001::/48", "394749"}, - {"2804:2524::/32", "264262"}, - {"2804:504c::/33", "268380"}, - {"2a02:26f7:c285::/46", "20940"}, - {"2a02:26f7:ed88::/48", "36183"}, - {"2a06:e881:7800::/40", "212002"}, - {"2a0c:f80::/29", "209372"}, - {"2001:67c:2054::/48", "34953"}, - {"2001:1248:5a99::/42", "11172"}, - {"2607:fb58:2::/34", "36086"}, - {"2a0b:b602::/32", "57758"}, - {"2001:550:9803::/38", "174"}, - {"2606:3d40:e::/48", "400097"}, - {"2620:0:630::/48", "4185"}, - {"2001:1248:559d::/42", "11172"}, - {"2001:1248:5f00::/43", "11172"}, - {"2001:49f0:d0e6::/48", "30058"}, - {"2409:8008:d9::/48", "24547"}, - {"2a02:26f7:7f::/48", "20940"}, - {"2c0f:fd80::/32", "25543"}, - {"2001:3c8:1401::/48", "3839"}, - {"2001:67c:2e54::/48", "200871"}, - {"2804:f64::/32", "263583"}, - {"2804:3ef8::/32", "266632"}, - {"2a02:5320:b00::/40", "12189"}, - {"2001:428::/36", "209"}, - {"2001:550:c00:103::/61", "174"}, - {"2001:559:c2f1::/48", "20214"}, - {"2401:f100::/32", "38651"}, - {"240a:aad8::/32", "145426"}, - {"2607:f408:1::/48", "19871"}, - {"2804:1c50::/32", "61649"}, - {"2600:1408:4801::/37", "20940"}, - {"2602:ff84:8::/48", "3223"}, - {"2a04:5ec0::/29", "60239"}, - {"2001:678:5d0::/48", "204723"}, - {"2001:978:2a03::/35", "174"}, - {"2403:1000:1100::/38", "38819"}, - {"2404:e801:200c::/46", "55430"}, - {"240a:a906::/32", "144960"}, - {"2620:149:ae2::/45", "714"}, - {"2804:5484::/32", "268655"}, - {"2806:20d:1114::/42", "32098"}, - {"2a00:1f00::/32", "50295"}, - {"2a0a:7e04::/30", "61317"}, - {"2001:67c:2bd0::/48", "204847"}, - {"2a02:76c0:1::/48", "61170"}, - {"240a:a2a1::/32", "143323"}, - {"240a:a8d2::/32", "144908"}, - {"2a00:d740::/29", "61006"}, - {"2a02:26f7:84::/48", "36183"}, - {"2a0e:97c0:130::/44", "211972"}, - {"2402:e280:216b::/43", "134674"}, - {"2607:f928:5::/48", "14085"}, - {"2800:160:16e0::/44", "14259"}, - {"2001:470:32::/48", "19969"}, - {"2401:4d40::/30", "59125"}, - {"2804:85bc::/36", "272597"}, - {"2a02:2e02:8cf0::/39", "12479"}, - {"2a05:7980::/29", "201246"}, - {"240a:a63b::/32", "144245"}, - {"240e:109:8000::/43", "58519"}, - {"2a07:c540::/29", "198930"}, - {"2800:160:2421::/41", "14259"}, - {"2a02:26f7:df04::/48", "36183"}, - {"2a0c:ea40::/29", "200409"}, - {"2001:df7:9980::/48", "147039"}, - {"240a:a797::/32", "144593"}, - {"2600:380:7d80::/32", "20057"}, - {"2620:131:1038::/41", "26450"}, - {"2800:160:1ab7::/44", "14259"}, - {"2402:5ac0::/32", "137409"}, - {"2409:8915:6000::/39", "56044"}, - {"2600:1419:b401::/36", "20940"}, - {"2602:fed2:8000::/36", "1239"}, - {"2800:160:20e9::/39", "14259"}, - {"2804:4ca8::/36", "267383"}, - {"2a04:dc1::/48", "199386"}, - {"2403:6d00::/40", "56094"}, - {"2804:25d8::/32", "264307"}, - {"2806:2f0:21c1::/48", "22884"}, - {"2a00:19e0::/29", "25504"}, - {"2a00:8d80::/32", "15557"}, - {"2a02:26f7:e485::/46", "20940"}, - {"2001:4978:500::/45", "13331"}, - {"2402:fa00:6000::/32", "55359"}, - {"240e:3bb:8200::/35", "140316"}, - {"2600:6c21:489::/41", "20115"}, - {"2605:a380::/34", "53828"}, - {"2804:840:8030::/38", "262680"}, - {"2a09:b682::/31", "210625"}, - {"2a0e:b107:93a::/48", "204446"}, - {"2001:559:5b2::/48", "33287"}, - {"2406:8f00::/32", "38761"}, - {"240e:378:aa00::/39", "140330"}, - {"2a02:e8::/32", "43128"}, - {"2a0d:3842:1170::/48", "57629"}, - {"240a:a8ce::/32", "144904"}, - {"2804:14d:8e8e::/43", "28573"}, - {"2804:6900::/32", "270242"}, - {"2401:d800:f9e0::/38", "7552"}, - {"240a:a629::/32", "144227"}, - {"2803:39e0::/32", "270023"}, - {"2804:8658:200::/32", "272637"}, - {"2a06:cbc0::/29", "12693"}, - {"2001:1900:220a::/48", "53670"}, - {"2408:8452::/31", "4837"}, - {"2001:4490:d500::/46", "9829"}, - {"2401:8a00::/32", "10099"}, - {"2408:4009::/37", "37963"}, - {"2408:8256:3889::/43", "17623"}, - {"2602:80a:c000::/48", "399685"}, - {"2607:8200:e000::/36", "6295"}, - {"2620:31:c000::/48", "62478"}, - {"2804:1f50::/32", "61607"}, - {"2a01:664:c00::/35", "48951"}, - {"2001:559:2a3::/48", "33660"}, - {"2001:67c:228::/48", "42175"}, - {"2407::/62", "4761"}, - {"2408:8256:396d::/48", "17816"}, - {"2600:6c3b:4e6::/32", "20115"}, - {"2604:4d40:7b1b::/48", "399196"}, - {"2804:3ae0::/32", "266115"}, - {"2a01:7080::/43", "42848"}, - {"2a02:2e00:f000::/36", "12479"}, - {"2a0e:97c0:780::/46", "47316"}, - {"2001:16a2:c2c0::/46", "39891"}, - {"2602:fd28::/36", "62866"}, - {"2a02:850::/44", "30971"}, - {"2a04:4e40:3c00::/47", "54113"}, - {"2600:6c10:ff25::/44", "20115"}, - {"2607:fc68:101::/32", "2711"}, - {"2804:6478::/32", "53123"}, - {"2a04:2e40::/29", "51859"}, - {"2604:d600:543::/44", "32098"}, - {"2a00:6901:b002::/47", "20926"}, - {"2a0e:b107:18::/48", "210814"}, - {"240a:a5ee::/32", "144168"}, - {"2602:feda:d70::/44", "138435"}, - {"2a02:13c8::/32", "39484"}, - {"2a03:a80::/32", "15836"}, - {"2a06:6f00::/29", "197164"}, - {"2a0e:6901:200::/37", "57695"}, - {"2001:67c:21cc::/48", "25354"}, - {"2a00:1c20::/32", "50989"}, - {"2a0c:b641:1c0::/47", "39792"}, - {"2001:559:85ec::/48", "33657"}, - {"2408:84f3:4010::/42", "134543"}, - {"240a:a9c7::/32", "145153"}, - {"2a03:9220::/32", "15742"}, - {"2001:559:852b::/48", "20214"}, - {"2403:ad80:94::/48", "135309"}, - {"2801:0:330::/48", "52382"}, - {"2401:d800:9b00::/42", "7552"}, - {"2804:34ac::/32", "265472"}, - {"2001:67c:1211::/48", "42139"}, - {"2001:918:f00::/40", "8300"}, - {"2404:6dc0::/32", "135876"}, - {"2620:13e:d000::/44", "32864"}, - {"2401:13c0::/34", "132652"}, - {"2405:84c0:9000::/44", "139618"}, - {"240a:a90e::/32", "144968"}, - {"2804:18f8::/32", "61766"}, - {"2a02:88d:813f::/40", "47794"}, - {"2a0c:9a40::/48", "202479"}, - {"2403:8600:a080::/43", "45820"}, - {"2407:2bc0::/32", "136380"}, - {"2607:2480:2::/48", "395450"}, - {"2620:ef:c000::/48", "64233"}, - {"2804:ae0:8100::/38", "28352"}, - {"2806:2f0:21e1::/46", "17072"}, - {"2a02:ac80:d01::/38", "25145"}, - {"2404:f4c0:fac0::/47", "142284"}, - {"2600:3505:f000::/28", "396998"}, - {"2600:6c21:6::/43", "20115"}, - {"2620:3e::/48", "394271"}, - {"2a02:2528:2613::/48", "2613"}, - {"2001:67c:274c::/48", "42034"}, - {"240a:a4a8::/32", "143842"}, - {"2620:16e:287::/48", "3147"}, - {"2804:145c:c510::/42", "263327"}, - {"2804:62f0:a102::/35", "269329"}, - {"2a03:94e0::/30", "56655"}, - {"2408:8459:c450::/38", "17816"}, - {"2409:8924:6b00::/37", "56046"}, - {"2600:6c10:9b::/45", "20115"}, - {"2804:28ec::/32", "263987"}, - {"2804:5048::/32", "268379"}, - {"2a04:4e40:4810::/41", "54113"}, - {"2001:df6:5880::/48", "142022"}, - {"2001:44b8:28::/48", "7545"}, - {"2405:9800:d003::/48", "133848"}, - {"2804:ef4:3::/33", "28642"}, - {"2a12:3f00::/29", "204790"}, - {"2403:2500:4000::/41", "36236"}, - {"2409:8907:7520::/38", "24547"}, - {"2605:a404:29a::/41", "33363"}, - {"2a00:fde0::/32", "199736"}, - {"2a11:f880::/29", "204790"}, - {"2400:5d80::/32", "58507"}, - {"2402:600:a12b::/33", "38515"}, - {"2a02:678::/32", "8632"}, - {"2a02:26f7:df41::/46", "20940"}, - {"2408:8957:8e00::/40", "17622"}, - {"2409:8055:9::/45", "56040"}, - {"2409:8c54:4020::/36", "56040"}, - {"240a:a405::/32", "143679"}, - {"240a:ac9c::/32", "145878"}, - {"2605:a404::/42", "33363"}, - {"2a02:26f7:dec0::/48", "36183"}, - {"2600:6c3a:1e::/41", "20115"}, - {"2605:aa40:c1e0::/48", "18792"}, - {"2800:160:1b71::/40", "14259"}, - {"2804:4284::/38", "267505"}, - {"240a:a307::/32", "143425"}, - {"2a00:7145:b1::/48", "51430"}, - {"2a02:d8:e::/32", "44654"}, - {"2001:df1:b400::/48", "10214"}, - {"2605:9d80:8001::/48", "4134"}, - {"2801:80::/48", "28646"}, - {"2001:250:6400::/45", "24367"}, - {"240a:a496::/32", "143824"}, - {"2603:fe80::/25", "397165"}, - {"2620:12d:6000::/47", "13380"}, - {"2804:22c:6::/32", "22689"}, - {"2804:80d4::/32", "272415"}, - {"2804:81b8::/33", "272472"}, - {"2a00:c1c0::/32", "31241"}, - {"2408:8957:9800::/40", "17622"}, - {"2600:370f:7421::/46", "32261"}, - {"2800:a00::/32", "11315"}, - {"2001:3c8:1702::/34", "4621"}, - {"2001:559:8586::/47", "7922"}, - {"2001:16a2:8030::/44", "25019"}, - {"2001:1a11:b2::/45", "42298"}, - {"2001:559:c405::/48", "33657"}, - {"2001:1a11:115::/48", "8781"}, - {"2402:1c00:c05::/46", "23838"}, - {"2408:8956:4d00::/40", "17816"}, - {"2606:b300::/33", "33438"}, - {"2620:108:7000::/44", "16509"}, - {"2804:4d74::/32", "268197"}, - {"2a02:26f7:dc08::/48", "36183"}, - {"2001:559:4e5::/48", "20214"}, - {"2001:16a3::/29", "39386"}, - {"2404:4e00:1083::/48", "32787"}, - {"240e:878::/40", "137689"}, - {"2804:4d14::/32", "266054"}, - {"2a00:4fa0::/29", "206293"}, - {"2001:44c8:4750::/40", "45430"}, - {"2603:c0f8:2000::/43", "20054"}, - {"2804:416c::/32", "267432"}, - {"2a03:7940::/32", "197226"}, - {"2001:df0:5bc0::/48", "140825"}, - {"2408:8459:ba30::/41", "17622"}, - {"2a0c:2bc0::/29", "212302"}, - {"2405:58c0:4100::/38", "133101"}, - {"2600:1408:a402::/36", "20940"}, - {"2607:fcd0:100:b01::/53", "8100"}, - {"2620:11e:3050::/44", "395686"}, - {"2a03:a4e0:100::/40", "2119"}, - {"2a0a:a980::/29", "31742"}, - {"2a0f:600:600::/47", "51044"}, - {"2001:c20:c843::/45", "3758"}, - {"240a:a89c::/32", "144854"}, - {"240e:44d:1e00::/41", "140345"}, - {"2803:4e10::/32", "271965"}, - {"2804:4024:2022::/44", "265937"}, - {"2a03:30c0::/32", "61408"}, - {"2a03:41a0:10::/44", "59764"}, - {"2001:b200:700::/34", "9505"}, - {"2407:7a80:11::/46", "132384"}, - {"2408:8001:3070::/44", "17623"}, - {"240a:a019::/32", "142675"}, - {"240e:fe:6000::/32", "136200"}, - {"2804:124c:4c0::/38", "263468"}, - {"2a02:2e02:17d0::/42", "12479"}, - {"2001:559:4d7::/48", "33657"}, - {"240e:ff:c008::/48", "140310"}, - {"2606:7080::/32", "13727"}, - {"2803:dac0:15::/38", "265634"}, - {"2804:52f4:b00::/32", "268552"}, - {"2001:42d0::/44", "33764"}, - {"240e:108:41::/48", "4811"}, - {"2a03:2480:8028::/46", "200107"}, - {"2401:d800:73f2::/37", "7552"}, - {"2402:e380:309::/48", "137940"}, - {"2408:8256:3b7f::/48", "17816"}, - {"2a07:5cc0::/29", "3399"}, - {"2a0e:46c4:1100::/40", "38230"}, - {"2400:9c80::/48", "58396"}, - {"2402:b740:8002::/33", "140867"}, - {"240e:85c:50::/26", "4134"}, - {"2602:801:f00d::/46", "32590"}, - {"2607:3e80::/32", "16463"}, - {"2a00:40a0::/40", "49528"}, - {"2a0a:df80:24::/48", "39212"}, - {"2001:250:301b::/48", "23910"}, - {"240a:a9e0::/32", "145178"}, - {"2604:2e80::/47", "30036"}, - {"2607:f6f8:3101::/32", "30170"}, - {"2620:f0:4000::/45", "394699"}, - {"2620:10c:700e::/47", "2906"}, - {"2a01:a700:4643::/29", "39138"}, - {"2a0d:c80::/29", "21032"}, - {"2a10:4680::/29", "399975"}, - {"2001:1388:8a60::/46", "264684"}, - {"2406:eb00:132::/48", "132653"}, - {"240e:44d:4440::/42", "140359"}, - {"2801:80:a70::/48", "263257"}, - {"2a02:26f7:ed89::/42", "20940"}, - {"2001:1900:300a::/43", "3356"}, - {"2409:8c44:b01::/35", "24445"}, - {"2a02:26f0:d500::/48", "34164"}, - {"2a05:4c00::/29", "24750"}, - {"2001:559:85df::/48", "33491"}, - {"2001:4479:1900::/34", "7545"}, - {"2600:1417:d001::/37", "20940"}, - {"2600:9000:11e0::/47", "16509"}, - {"2a00:fa40:2000::/36", "57739"}, - {"2a03:17c0::/32", "44300"}, - {"2a04:7f80::/29", "48728"}, - {"2001:559:8085::/48", "33287"}, - {"2405:43c0:1000::/48", "139636"}, - {"2600:6c33:219::/37", "20115"}, - {"2804:4f90::/38", "268335"}, - {"2a00:41e0::/29", "57809"}, - {"2a03:b8c0:1e::/48", "396253"}, - {"2a06:a005:240::/43", "211358"}, - {"2402:800:9163::/43", "7552"}, - {"2a05:e780::/29", "52115"}, - {"2a09:2940::/32", "209898"}, - {"2001:df6:b800::/48", "59349"}, - {"2001:e60:a308::/42", "4766"}, - {"2405:dc00:fe::/47", "4804"}, - {"2001:67c:19d4::/48", "30877"}, - {"2400:6280:104::/48", "132280"}, - {"240a:ab72::/32", "145580"}, - {"2606:3d00::/32", "13549"}, - {"2620:171:65::/48", "715"}, - {"2403:cfc0:100c::/48", "395092"}, - {"240e:3b7:c800::/37", "4134"}, - {"2804:40a0:f400::/36", "265971"}, - {"2a02:4a8::/32", "25234"}, - {"2806:2f0:7103::/42", "17072"}, - {"2a03:4360::/32", "61307"}, - {"240e:44d:2500::/41", "140345"}, - {"2804:ad8:4380::/32", "262494"}, - {"2804:2b44:87::/32", "265144"}, - {"2a02:5500::/32", "40993"}, - {"2a03:2887:ff25::/48", "63293"}, - {"2a07:b5c0::/29", "41046"}, - {"2a0c:dc80::/32", "208033"}, - {"2001:978:4f06::/35", "174"}, - {"2001:c20:48a7::/44", "3758"}, - {"2602:fc53:1::/46", "399924"}, - {"2602:fd92:801::/48", "142418"}, - {"2a09:c740::/32", "205718"}, - {"2a0a:4540:1000::/48", "16509"}, - {"2408:8957:d2c0::/37", "17816"}, - {"240a:a958::/32", "145042"}, - {"2605:3a40::/47", "6233"}, - {"2600:1f16::/36", "16509"}, - {"2602:fe0d::/36", "30168"}, - {"2804:2028::/32", "264473"}, - {"2a02:26f0:3401::/39", "20940"}, - {"2a06:1287:3010::/38", "61138"}, - {"2400:cb00:a2c2::/48", "13335"}, - {"2409:896a:5200::/39", "9808"}, - {"240a:a896::/32", "144848"}, - {"2804:2ca4:4100::/32", "265232"}, - {"2804:43dc::/32", "267595"}, - {"2804:6c08:c000::/34", "270441"}, - {"2a02:88d:4030::/44", "48695"}, - {"2a04:4e40:3a10::/41", "54113"}, - {"2a06:fd80::/47", "206206"}, - {"2600:140f:f400::/48", "9498"}, - {"2804:5e8c::/32", "269040"}, - {"2a0c:9a40:8085::/48", "7489"}, - {"2001:559:87cc::/48", "33657"}, - {"2408:8957:2840::/40", "17622"}, - {"2605:a000:70e::/48", "11955"}, - {"2804:2884::/32", "263966"}, - {"2402:4480:304::/48", "138433"}, - {"2409:8c14:f0::/44", "9808"}, - {"2a02:26f7:c309::/46", "20940"}, - {"2a04:5d00::/41", "60241"}, - {"2408:8956:c600::/40", "17622"}, - {"2a02:2e02:95b0::/38", "12479"}, - {"2a03:26e0::/32", "201646"}, - {"2a03:90c0:320::/40", "199524"}, - {"2001:559:369::/48", "33287"}, - {"2001:5a0:5202::/32", "6453"}, - {"240e:59:8000::/30", "4134"}, - {"2801:1c:3000::/48", "16906"}, - {"2804:84d8::/32", "272283"}, - {"2a05:7300::/32", "35701"}, - {"2001:559:84f2::/48", "33657"}, - {"2600:1408:4401::/36", "20940"}, - {"2600:6c10:c25::/44", "20115"}, - {"2a09:cc0::/48", "44364"}, - {"2a0f:5180::/32", "29802"}, - {"2a10:9100:7::/48", "209588"}, - {"2606:1980:100::/48", "54994"}, - {"2804:3b80::/32", "266153"}, - {"2a02:26f7:e388::/48", "36183"}, - {"2a02:ee80:4140::/43", "3573"}, - {"2a0e:1c80:2::/48", "50304"}, - {"2a0e:2940::/29", "207787"}, - {"2001:559:556::/48", "33659"}, - {"2001:67c:1b8::/48", "8916"}, - {"2402:800:3d01::/44", "7552"}, - {"2602:fca7:1::/46", "399318"}, - {"2806:2f0:9f21::/40", "17072"}, - {"2001:44b8:1054::/47", "4739"}, - {"2404:bf40:a041::/40", "139084"}, - {"240a:a048::/32", "142722"}, - {"2600:1408:5401::/36", "20940"}, - {"2804:40::/34", "28657"}, - {"2806:370:2110::/44", "28403"}, - {"2a04:4e40:c600::/48", "54113"}, - {"2600:1010:9f10::/40", "22394"}, - {"2600:140b:d001::/37", "20940"}, - {"2a00:bc20::/32", "9186"}, - {"2a02:26f7:6b::/48", "20940"}, - {"2a02:6c20:5::/48", "208143"}, - {"2001:559:545::/48", "22258"}, - {"2001:678:100::/48", "47697"}, - {"240a:a743::/32", "144509"}, - {"2620:96:a000::/48", "399628"}, - {"2602:fcc9:777::/48", "32505"}, - {"2605:a7c0:111::/44", "16509"}, - {"2806:230:1600::/36", "11888"}, - {"2a06:98c1:3120::/46", "13335"}, - {"2001:253:133::/48", "142099"}, - {"2001:559:81ed::/48", "33668"}, - {"2001:678:e60::/48", "212596"}, - {"2001:8b0::/57", "20712"}, - {"2620:4:a000::/48", "16539"}, - {"2800:200:e281::/43", "12252"}, - {"2804:113c:ac00::/33", "53181"}, - {"2a00:11b0::/29", "16019"}, - {"2a00:df80:ffff::/48", "210611"}, - {"2a02:26f7:d90d::/42", "20940"}, - {"2401:3c0:118::/47", "45528"}, - {"240e:16:b203::/45", "38283"}, - {"2607:cc00::/32", "36003"}, - {"2a02:e0:3803::/45", "34984"}, - {"2a09:1b40::/32", "209383"}, - {"2a09:2681::/32", "61282"}, - {"2001:559:81cc::/47", "33287"}, - {"2402:800:32c5::/43", "7552"}, - {"2409:8924:a700::/36", "56046"}, - {"2803:ffe0::/32", "27951"}, - {"240a:aba8::/32", "145634"}, - {"2606:f100::/32", "3300"}, - {"2a04:1b00:e::/47", "61007"}, - {"2001:559:860c::/47", "7922"}, - {"240a:a36c::/32", "143526"}, - {"240e:3bc:f100::/37", "134775"}, - {"2600:1419:4a01::/39", "20940"}, - {"2603:d090::/25", "30600"}, - {"2605:f700:40::/46", "18978"}, - {"2800:484:cd00::/38", "10620"}, - {"2804:4bfc::/32", "267341"}, - {"2a03:2480:80::/48", "200107"}, - {"2a0a:90c0:1090::/48", "205080"}, - {"2408:8459:1050::/37", "17816"}, - {"2409:8052:3802::/40", "56047"}, - {"2606:1980:12::/47", "54994"}, - {"2a02:f880::/29", "61244"}, - {"2a07:2280::/29", "48909"}, - {"2400:9700:121::/44", "24550"}, - {"2400:cb00:11::/46", "13335"}, - {"2600:1480:3000::/40", "33905"}, - {"2804:214:4002::/43", "26615"}, - {"2a00:1d58:fa1c::/46", "47524"}, - {"2001:56b:e::/47", "7861"}, - {"2620:65:8000::/46", "20306"}, - {"2620:101:2009::/46", "30238"}, - {"2800:160:1fc8::/46", "14259"}, - {"2804:aa8:700::/36", "52903"}, - {"2806:230:601c::/48", "265594"}, - {"2a01:367:c205::/35", "30823"}, - {"2a02:1760::/32", "33864"}, - {"2a0d:8d04::/31", "44103"}, - {"2001:dce:8800::/48", "38064"}, - {"240a:a9f0::/32", "145194"}, - {"2001:df7:8280::/48", "147017"}, - {"2a01:4aa0::/32", "24951"}, - {"2a0e:c5c0::/32", "208854"}, - {"2401:d800:93e0::/37", "7552"}, - {"2402:3a80:1900::/40", "38266"}, - {"2a00:c840::/32", "44998"}, - {"2a05:ed40::/29", "207628"}, - {"2606:1340::/32", "399091"}, - {"2a00:c00:f060::/46", "15769"}, - {"2a09:9ac0::/48", "209562"}, - {"240e:967:ac00::/33", "4134"}, - {"2620:128:e00c::/48", "22317"}, - {"2a03:47c0:2181::/38", "21277"}, - {"2804:3b9c::/32", "266160"}, - {"2a02:26f7:c88e::/47", "20940"}, - {"2001:b201::/21", "3462"}, - {"240a:af2d::/32", "146535"}, - {"2a00:da8:fffb::/48", "6878"}, - {"2a07:9100::/29", "202774"}, - {"2a09:bac0:201::/45", "13335"}, - {"2001:200:a00::/37", "2500"}, - {"2400:1700:200::/48", "136552"}, - {"2402:7500:5c0::/48", "24158"}, - {"2604:d600:c7b::/45", "32098"}, - {"2001:559:364::/48", "13367"}, - {"2001:559:520::/48", "33651"}, - {"2001:1248:a4b4::/46", "11172"}, - {"2001:1540:dd06::/34", "47886"}, - {"2407:500:4000::/39", "58940"}, - {"2a01:c50f:b100::/38", "12479"}, - {"2a02:26f7:d248::/48", "36183"}, - {"2a0b:7ec0:deae::/29", "206728"}, - {"2620:11a:c018::/48", "54113"}, - {"2804:2b58::/32", "265148"}, - {"2804:7608::/32", "271085"}, - {"2806:20d:36ff::/33", "32098"}, - {"2a07:1980::/46", "25773"}, - {"2001:19f0:5000::/34", "20473"}, - {"2806:268:2405::/40", "13999"}, - {"2a05:55c0::/31", "50597"}, - {"2a0c:6c40:c82f::/48", "20705"}, - {"2402:800:41ef::/43", "7552"}, - {"2803:f3a0::/32", "267758"}, - {"2804:4220::/32", "267479"}, - {"2a02:26f7:bac4::/47", "36183"}, - {"2001:559:c2ed::/48", "33659"}, - {"2a01:4120::/32", "62363"}, - {"2a10:2f00:15c::/48", "212292"}, - {"2406:e780::/36", "63679"}, - {"240a:a86c::/32", "144806"}, - {"240e:51:5800::/37", "137695"}, - {"2804:5330::/32", "174"}, - {"2a02:26f7:d48c::/48", "36183"}, - {"2605:cb80::/32", "17210"}, - {"2800:bf0:826f::/48", "27947"}, - {"2a0b:f300:4c7::/30", "62240"}, - {"2001:480:561::/38", "668"}, - {"2001:67c:744::/48", "59632"}, - {"2001:1900:2269::/43", "3356"}, - {"240a:a421::/32", "143707"}, - {"240e:438:5040::/38", "4134"}, - {"2a11:7e03::/32", "135330"}, - {"2804:14c:7577::/44", "28573"}, - {"2804:8334::/32", "272183"}, - {"2409:8057:3074::/37", "56040"}, - {"2c0f:f6c8::/32", "15964"}, - {"2001:559:460::/48", "33287"}, - {"2001:ee0:1007::/40", "45899"}, - {"2408:840d:9e00::/42", "17621"}, - {"2603:c012:2000::/36", "31898"}, - {"2806:230:6012::/48", "265594"}, - {"2a00:c4c0::/32", "56477"}, - {"2602:fcff:10::/48", "57164"}, - {"2607:fdb8:5::/42", "30496"}, - {"2a05:d050:4020::/44", "16509"}, - {"2001:f00::/32", "3836"}, - {"2400:9380:9005::/46", "4809"}, - {"2401:3f00::/32", "56308"}, - {"2402:800:7850::/42", "7552"}, - {"2408:8459:7050::/38", "17816"}, - {"2600:6c38:231::/45", "20115"}, - {"2603:1062:2::/27", "8075"}, - {"2a0d:2e00:1000::/48", "33932"}, - {"2a0f:6fc6::/32", "16262"}, - {"2401:5f80::/45", "38731"}, - {"2405:40::/32", "136744"}, - {"2405:4803:2ee::/43", "18403"}, - {"2604:d600:616::/47", "32098"}, - {"2606:6800::/40", "394597"}, - {"2a01:5c00::/32", "201205"}, - {"2001:678:704::/48", "1257"}, - {"2403::/44", "4755"}, - {"2404:8d02:1045::/44", "9587"}, - {"2406:e000:38a::/43", "23655"}, - {"2409:8028:1800::/40", "56041"}, - {"2600:1408:3401::/36", "20940"}, - {"2a0e:1bc1:2000::/35", "59566"}, - {"2402:800:9afe::/39", "7552"}, - {"2406:840:110::/47", "139317"}, - {"240a:a1e4::/32", "143134"}, - {"2600:1419:c::/48", "35204"}, - {"2408:84f3:4040::/38", "17816"}, - {"2803:4580:8100::/45", "52468"}, - {"2804:3e70::/35", "266596"}, - {"2804:5648::/32", "267988"}, - {"2a01:c50f:ad80::/38", "12479"}, - {"2c0f:e8f8:2100::/32", "328699"}, - {"2001:579:b218::/36", "22773"}, - {"2408:8459:1d10::/42", "17623"}, - {"240e:44d:500::/41", "140345"}, - {"2600:6c10:f042::/44", "20115"}, - {"2804:28e4:403::/32", "28260"}, - {"2408:8957:8b00::/40", "17816"}, - {"2001:559:8106::/48", "20214"}, - {"2001:67c:1868::/48", "57683"}, - {"2620:139:7000::/40", "396950"}, - {"2a02:88d:200::/44", "48695"}, - {"2001:4878:8037::/44", "12222"}, - {"2402:ef2f:2c::/48", "7633"}, - {"240a:a092::/32", "142796"}, - {"240e:698:4900::/38", "4134"}, - {"2a00:1e88:8::/48", "39229"}, - {"2a02:cec0::/30", "25459"}, - {"2a05:5240::/30", "198722"}, - {"2001:700::/32", "224"}, - {"2400:dd03:100b::/29", "7497"}, - {"2803:4000::/32", "265801"}, - {"2001:250:20c::/48", "24349"}, - {"2402:800:63f1::/45", "7552"}, - {"240e:e9:4800::/37", "4134"}, - {"2607:6b80:34::/48", "9009"}, - {"2607:feb0::/32", "26546"}, - {"2800:bf0:2400::/44", "52257"}, - {"2a02:26f7:e501::/46", "20940"}, - {"2a02:2e02:a00::/42", "12479"}, - {"2a0f:240::/29", "60262"}, - {"2405:3300::/32", "131143"}, - {"240a:a8e3::/32", "144925"}, - {"2804:3430::/32", "265441"}, - {"2a00:85a0::/32", "12703"}, - {"2a09:6903::/32", "49981"}, - {"2a09:e640::/29", "204981"}, - {"2a0e:1e80::/29", "9119"}, - {"2a0e:b680::/29", "208016"}, - {"2a11:4980::/29", "210879"}, - {"2001:559:800d::/48", "7725"}, - {"2001:1a11:112::/48", "8781"}, - {"2409:8904:ab40::/33", "24547"}, - {"240a:a766::/32", "144544"}, - {"2620:10a:4008::/48", "29792"}, - {"2a10:200:2::/36", "208059"}, - {"2405:f080:1000::/37", "136907"}, - {"2406:840:44::/47", "139317"}, - {"240e:44d:7280::/41", "4134"}, - {"2a07:aa00:89::/29", "3549"}, - {"2a0a:2307::/48", "20853"}, - {"2001:559:258::/48", "7922"}, - {"2001:7f9::/48", "211655"}, - {"2001:df0:3d80::/48", "18124"}, - {"240a:a6b7::/32", "144369"}, - {"2a0b:e181:400::/38", "198605"}, - {"2001:559:2ea::/48", "33287"}, - {"2408:8956:6c00::/40", "17622"}, - {"2606:aa00::/32", "3794"}, - {"2a0d:c040::/29", "210081"}, - {"2400:dcc0:a604::/39", "38631"}, - {"2401:d800:5f80::/42", "7552"}, - {"2604:d600:2201::/36", "32098"}, - {"2804:77ac::/32", "271192"}, - {"2a01:8840:f5::/48", "207266"}, - {"2a04:3542:c000::/29", "202053"}, - {"2a0d:c9c0:1::/48", "49645"}, - {"2001:468:f00::/35", "11537"}, - {"2001:559:1b6::/48", "33287"}, - {"2001:559:87f8::/48", "7922"}, - {"2408:8056::/32", "4837"}, - {"2600:140b:4c00::/48", "31109"}, - {"2001:559:247::/48", "7016"}, - {"2409:8051:1002::/40", "56047"}, - {"2606:2c80::/32", "36813"}, - {"2607:f740:e640::/46", "63911"}, - {"2803:4c80::/32", "263181"}, - {"2001:559:81a7::/48", "7725"}, - {"2001:df0:7480::/48", "139076"}, - {"2403:7000::/33", "45179"}, - {"2600:1417:17::/44", "20940"}, - {"2a02:2e02:6b0::/41", "12479"}, - {"240a:a7f3::/32", "144685"}, - {"2402:800:910f::/43", "7552"}, - {"2406:f400:40::/44", "38001"}, - {"240e:37a::/35", "140329"}, - {"2a01:43a0::/32", "199998"}, - {"2a0d:d580::/32", "205588"}, - {"2001:559:2e1::/48", "33659"}, - {"2404:bf40:c280::/48", "7545"}, - {"2806:2f0:51a1::/46", "17072"}, - {"2a02:26f7:df8d::/42", "20940"}, - {"2a09:bac0:4::/48", "13335"}, - {"240a:aab4::/32", "145390"}, - {"2604:c840::/32", "397181"}, - {"2804:1784:ff05::/40", "263152"}, - {"2a00:4802:270::/44", "8717"}, - {"2a0c:4380::/40", "20860"}, - {"2407:59c0::/32", "140072"}, - {"2605:a401:80dd::/46", "33363"}, - {"2806:2f0:7061::/46", "17072"}, - {"2001:fd8:34b0::/44", "4775"}, - {"2604:d600:65c::/42", "32098"}, - {"2a02:26f7:d9::/48", "20940"}, - {"2402:800:3363::/43", "7552"}, - {"240a:ac99::/32", "145875"}, - {"2604:2c00:ff80::/41", "11071"}, - {"2804:14c:c600::/40", "28573"}, - {"2804:14d:7e3c::/41", "28573"}, - {"2804:5ec::/32", "28143"}, - {"2804:55b8::/32", "267952"}, - {"2a00:5400::/35", "35753"}, - {"2001:1a11:ca::/47", "8781"}, - {"2603:c022:c000::/35", "31898"}, - {"2606:4700:55::/46", "13335"}, - {"2804:3e70:b008::/33", "266596"}, - {"2a02:26f7:bcc1::/46", "20940"}, - {"2403:bdc0::/32", "138338"}, - {"240a:a718::/32", "144466"}, - {"2606:2800:5130::/48", "15133"}, - {"2a10:5c80::/29", "25726"}, - {"2001:559:7b3::/48", "7922"}, - {"2408:84f3:3650::/44", "17816"}, - {"2409:8a20::/32", "56046"}, - {"240a:aa4d::/32", "145287"}, - {"2a0b:380::/29", "60111"}, - {"2001:250:1c0a::/48", "23910"}, - {"2001:df3:1880::/48", "140015"}, - {"2401:d800:810::/42", "7552"}, - {"2a02:26f7:c3d9::/46", "20940"}, - {"2600:1003:b840::/42", "6167"}, - {"2620:115:50::/40", "18888"}, - {"2804:77c:501::/32", "53222"}, - {"2806:230:3017::/48", "11888"}, - {"2a02:2ab8:330::/32", "702"}, - {"2401:a140:1::/48", "4811"}, - {"240a:ac6f::/32", "145833"}, - {"240e:3bb:6400::/35", "140312"}, - {"2801:194::/44", "18747"}, - {"2a02:26f7:c589::/46", "20940"}, - {"2a0d:e0c0::/29", "210662"}, - {"2408:81a3:c800::/48", "140707"}, - {"2a02:2610::/32", "25521"}, - {"2a02:cb43:3004::/44", "20546"}, - {"2a04:4e40:b840::/44", "54113"}, - {"2a0a:8300::/29", "50911"}, - {"2001:550:1605::/39", "174"}, - {"2620:17e:300::/42", "19991"}, - {"2804:4098:3e90::/32", "265969"}, - {"2804:73e4:3000::/32", "270944"}, - {"2a00:40c0::/31", "12762"}, - {"2a02:7720::/32", "2119"}, - {"2001:559:3b5::/48", "33651"}, - {"2001:559:c197::/48", "33491"}, - {"2602:fed2:3ec::/46", "53356"}, - {"2a0d:ae00::/29", "42910"}, - {"2001:67c:314::/48", "39628"}, - {"2001:da8:4009::/42", "24353"}, - {"2801:17:800::/48", "264635"}, - {"2a02:88d:20::/44", "48695"}, - {"2a04:8580:ffff::/48", "21030"}, - {"2001:4490:3200::/42", "9829"}, - {"240e:946:3005::/46", "58540"}, - {"2600:140f:1e01::/34", "20940"}, - {"2804:5f58::/32", "269093"}, - {"2a06:6440::/29", "200000"}, - {"2a0a:7a04:3::/31", "61317"}, - {"2001:648:22b0::/48", "47616"}, - {"240e:6b6:4000::/36", "140310"}, - {"2a02:c6c2::/31", "58061"}, - {"2001:638:30e::/32", "680"}, - {"2001:4998:28::/48", "36229"}, - {"2402:8dc0::/32", "137496"}, - {"2409:8914:4600::/39", "56044"}, - {"2607:f740:e00c::/48", "200325"}, - {"2804:c00:3600::/32", "52655"}, - {"2804:2070::/32", "28661"}, - {"2804:72d8::/32", "270879"}, - {"2a02:290::/32", "8732"}, - {"2001:67c:1460::/45", "47487"}, - {"2400:8b00:a80::/42", "45727"}, - {"2407:6c80::/32", "38298"}, - {"2804:49a4:c008::/34", "267194"}, - {"2804:4c64::/32", "267368"}, - {"2a00:7b00:f900::/37", "12338"}, - {"2a02:26f7:e281::/46", "20940"}, - {"2a03:af20::/32", "197949"}, - {"240a:a82b::/32", "144741"}, - {"2607:fb10:5064::/43", "2906"}, - {"2a00:1f78:ffff::/48", "8893"}, - {"2620:1ec:901::/45", "8075"}, - {"2a0d:e480::/29", "51207"}, - {"2c0f:5500::/32", "328895"}, - {"2600:140f:3e00::/48", "9498"}, - {"2605:f440:cafe::/48", "209864"}, - {"2804:90c:f800::/38", "262617"}, - {"2a01:b740:a1e::/48", "6185"}, - {"2a02:26f7:ba09::/42", "20940"}, - {"2001:559:8049::/46", "7922"}, - {"2001:559:84ed::/48", "33489"}, - {"2604:e800::/32", "23376"}, - {"2a0c:2dc0::/29", "49028"}, - {"2001:da8:e804::/48", "138373"}, - {"240e:1e:6000::/32", "4134"}, - {"2604:d600:1329::/45", "32098"}, - {"2804:4930::/32", "267169"}, - {"2a02:2760::/32", "51402"}, - {"2a07:9a40::/36", "30081"}, - {"2001:559:2fc::/48", "33652"}, - {"2401:2540::/32", "55899"}, - {"2404:e680:1141::/32", "18409"}, - {"240a:a3d7::/32", "143633"}, - {"240a:af55::/32", "146575"}, - {"240e:3bf:7a00::/32", "140313"}, - {"2603:c002:8e10::/35", "31898"}, - {"2c0f:f0f8::/32", "36924"}, - {"2400:7400:e029::/48", "38044"}, - {"240e:397:600::/36", "140487"}, - {"2602:808:a003::/45", "16509"}, - {"2a02:2e02:83d0::/37", "12479"}, - {"2001:678:784::/48", "3301"}, - {"2402:9900:100::/47", "27435"}, - {"2403:300:a33::/35", "714"}, - {"2001:559:8168::/48", "33662"}, - {"2804:5edc::/32", "269061"}, - {"2a02:26f0:115::/48", "34164"}, - {"2001:c20:4872::/47", "3758"}, - {"2401:d800:54e0::/39", "7552"}, - {"2600:9000:1000::/48", "16509"}, - {"2a00:d60::/32", "29680"}, - {"2a02:26f7:d2c8::/48", "36183"}, - {"2a0b:1900::/44", "57878"}, - {"2001:1248:9745::/46", "11172"}, - {"2804:2788::/32", "263907"}, - {"2a00:1450:480f::/32", "15169"}, - {"2c0f:e870::/32", "60171"}, - {"2001:559:84f6::/44", "33659"}, - {"2001:1248:a4e0::/45", "11172"}, - {"2402:1580:2970::/32", "17682"}, - {"2804:30f8:809::/46", "264984"}, - {"2a02:26f7:b90d::/42", "20940"}, - {"2c0f:f6d0:107::/32", "327687"}, - {"2001:559:80ea::/45", "33287"}, - {"2408:8256:316a::/48", "17816"}, - {"2606:dc0::/32", "398816"}, - {"2620:132:f702::/36", "394977"}, - {"2806:2f0:4283::/43", "17072"}, - {"2a02:28c0::/48", "51806"}, - {"2001:728::/49", "2914"}, - {"2001:b200:4000::/32", "9505"}, - {"2602:fdae::/36", "14106"}, - {"2603:f200::/27", "397165"}, - {"2605:6400:d815::/34", "53667"}, - {"2605:de40:3005::/32", "397553"}, - {"2a02:26f7:c008::/48", "36183"}, - {"2a03:5700::/32", "5524"}, - {"2001:43f8:920::/48", "3741"}, - {"2409:8c85:aa14::/48", "56044"}, - {"240a:ab95::/32", "145615"}, - {"2600:140f:3c01::/39", "20940"}, - {"2408:8459:f800::/40", "17816"}, - {"2607:fa08::/46", "23404"}, - {"2804:1e58::/46", "264422"}, - {"2804:5bdc:8004::/33", "268873"}, - {"2806:2f0:4081::/46", "17072"}, - {"2a02:26f7:d254::/48", "36183"}, - {"2405:23c0::/32", "134325"}, - {"2a00:f0e0:71::/32", "198499"}, - {"2a02:26f7:d988::/48", "36183"}, - {"2a0a:d7c7:808::/48", "8447"}, - {"2001:67c:248c::/48", "47638"}, - {"2001:978:3000:1::/38", "174"}, - {"2401:d800:b292::/41", "7552"}, - {"2a0c:d400:100::/48", "7809"}, - {"2001:bb8::/32", "3221"}, - {"2001:da8:e800::/48", "24368"}, - {"2404:b5c0::/32", "134911"}, - {"2001:1388:2146::/37", "6147"}, - {"2001:1af0:9000::/48", "44325"}, - {"2404:6300:4001::/32", "131310"}, - {"2604:b180:80::/44", "32775"}, - {"2604:d800:1001::/48", "3713"}, - {"2804:1b3:1000::/36", "18881"}, - {"2804:4c74::/32", "267371"}, - {"2a0a:6280::/29", "199434"}, - {"2607:f698::/32", "30176"}, - {"2a00:f90::/32", "34781"}, - {"2a02:5740:18::/48", "41564"}, - {"2001:df0:8380::/48", "131401"}, - {"2402:800:6218::/42", "7552"}, - {"2406:cf00:1000::/43", "23724"}, - {"2408:840c:8800::/40", "17621"}, - {"2607:f928:3::/48", "22645"}, - {"2001:559:41b::/45", "7725"}, - {"240e:67a:c600::/34", "4134"}, - {"2804:248:4008::/32", "28598"}, - {"2001:559:131::/48", "33652"}, - {"2400:adc4::/39", "9541"}, - {"2401:c800::/32", "7511"}, - {"2605:7c0::/48", "19382"}, - {"2804:e30:5800::/37", "11338"}, - {"2a02:ab00::/29", "6830"}, - {"2804:c48:ff01::/44", "52687"}, - {"2804:743c::/32", "270968"}, - {"2a02:2698:3000::/38", "50544"}, - {"2600:1413:9001::/34", "20940"}, - {"2620:6a::/48", "3152"}, - {"2402:8e00::/46", "38529"}, - {"2605:8300:b::/48", "174"}, - {"2606:9580:ff03::/48", "394256"}, - {"2804:62c:2006::/43", "262569"}, - {"2804:4a20::/32", "267220"}, - {"2a02:26f7:c740::/48", "36183"}, - {"2001:559:80c1::/48", "7015"}, - {"2407:d0c0::/32", "133434"}, - {"2620:171:50::/48", "42"}, - {"2a02:598:3334::/33", "43037"}, - {"2a04:4ec0::/31", "202503"}, - {"2a0a:fa00::/29", "49191"}, - {"2a0d:5e80::/29", "200899"}, - {"2001:1978:1b00::/37", "13768"}, - {"2409:895a:d000::/31", "56040"}, - {"2800:d302:13::/45", "11830"}, - {"2a00:1d08::/32", "13003"}, - {"2a01:8840:b1::/48", "207266"}, - {"2a0a:3d00::/48", "1836"}, - {"2001:410:8003::/48", "549"}, - {"2404:f4c0:fa0a::/47", "142280"}, - {"2600:1404:8401::/35", "20940"}, - {"2606:b400:881c::/48", "7160"}, - {"2800:160:1063::/43", "14259"}, - {"2804:4c14:da01::/39", "267348"}, - {"240e:1f:7000::/36", "134763"}, - {"2604:b5c0::/32", "394859"}, - {"2804:1184::/32", "61895"}, - {"2804:7948::/32", "271296"}, - {"2001:559:c0c9::/48", "7016"}, - {"2001:16a2:b800::/38", "25019"}, - {"2a04:5b84:1::/48", "202265"}, - {"2001:ac8:98::/32", "9009"}, - {"2a02:26f7:b408::/48", "36183"}, - {"2a02:26f7:c485::/46", "20940"}, - {"2a02:26f7:d24d::/46", "20940"}, - {"2401:c500:fd04::/48", "54994"}, - {"2402:800:59c5::/43", "7552"}, - {"2a00:e48::/33", "35703"}, - {"2a0a:4300::/29", "56655"}, - {"240a:a56e::/32", "144040"}, - {"2605:6400:9004::/33", "53667"}, - {"2804:7edc::/32", "271652"}, - {"240a:ac90::/32", "145866"}, - {"240a:af20::/32", "146522"}, - {"240e:438:8e40::/35", "4134"}, - {"240e:878:180::/41", "137689"}, - {"2804:710::/47", "17222"}, - {"2806:2f0:4201::/46", "17072"}, - {"2001:5a0:4403::/38", "6453"}, - {"240a:afaf::/32", "146665"}, - {"2602:feda:af8::/48", "138210"}, - {"2800:2f0::/48", "27668"}, - {"2806:230:5014::/48", "265594"}, - {"2a0a:1a80::/29", "203828"}, - {"2a0c:5100::/29", "205071"}, - {"2a0f:cc00:1::/48", "60781"}, - {"2a10:4941:30::/44", "62214"}, - {"2404:4a00:4::/64", "55423"}, - {"2600:100b:b030::/40", "6167"}, - {"2607:f2d8:6000::/32", "18450"}, - {"2a00:1d58:fa23::/45", "47524"}, - {"2001:a48:9000::/33", "8970"}, - {"2001:dce:9500::/48", "38064"}, - {"2001:1260:11f::/40", "13591"}, - {"240a:a3de::/32", "143640"}, - {"2602:feda:c40::/48", "212580"}, - {"2a00:15a8::/36", "29140"}, - {"2a00:17c0:c5::/32", "12993"}, - {"2602:102:1019::/31", "20115"}, - {"2803:10e0::/32", "269853"}, - {"2001:500:76::/44", "30133"}, - {"2803:9800:b037::/44", "11664"}, - {"2804:2678::/32", "264342"}, - {"2600:1488:a521::/35", "20940"}, - {"2a02:1380::/32", "50572"}, - {"2a02:26f7:db48::/48", "36183"}, - {"2a03:6947:1700::/40", "61266"}, - {"2a06:98c0:1000::/48", "203898"}, - {"2a09:500::/32", "48131"}, - {"2409:803c:3091::/42", "24444"}, - {"240a:a88e::/32", "144840"}, - {"240a:a9af::/32", "145129"}, - {"2803:f80::/32", "263726"}, - {"2a02:26f0:8000::/48", "8551"}, - {"2a05:dfc7:9::/42", "61138"}, - {"2a0b:4200:1001::/48", "3303"}, - {"2001:67c:2f9c::/48", "5588"}, - {"2408:8956:500::/40", "17816"}, - {"240a:a996::/32", "145104"}, - {"2804:ef4:5402::/38", "28642"}, - {"2804:4520::/32", "267674"}, - {"2804:77dc::/32", "271204"}, - {"2a02:888:4040::/46", "48695"}, - {"2a02:26f7:dcc8::/48", "36183"}, - {"2001:559:876f::/43", "7016"}, - {"2001:b48::/29", "16117"}, - {"240e:108:44::/48", "134768"}, - {"2804:3af0::/32", "266119"}, - {"2804:4488:7010::/44", "262480"}, - {"2a00:cee5:dcd::/30", "60268"}, - {"2408:8957:1240::/40", "17622"}, - {"240a:ae95::/32", "146383"}, - {"2406:93c0::/32", "137042"}, - {"240a:af47::/32", "146561"}, - {"2001:559:518::/48", "33655"}, - {"2001:4998:64::/48", "393245"}, - {"2604:880:3ad::/41", "29802"}, - {"2620:149:ae7::/43", "714"}, - {"2a01:aea0:dd6::/42", "42473"}, - {"2001:1248:57cf::/42", "11172"}, - {"2604:2e80:1403::/36", "30036"}, - {"2607:7b00:7000::/36", "54643"}, - {"2806:2f0:4641::/46", "17072"}, - {"2a05:4a40:fffe::/47", "2571"}, - {"2a09:5302::/32", "205090"}, - {"2a0a:f0c0::/29", "204860"}, - {"2a10:30c4::/30", "398481"}, - {"2001:559:c31d::/48", "7015"}, - {"240a:ad2a::/32", "146020"}, - {"2600:6c38:557::/42", "20115"}, - {"2605:a401:8f47::/40", "33363"}, - {"2620:124:1000::/44", "12161"}, - {"2a05:e581::/29", "63399"}, - {"2001:559:c366::/44", "7015"}, - {"2404:8d02:2983::/37", "9587"}, - {"2600:6c20:dff::/38", "20115"}, - {"2604:5400:4400::/35", "11776"}, - {"2804:aac:8000::/33", "52905"}, - {"2a00:88a0::/32", "25540"}, - {"2001:1248:5988::/43", "11172"}, - {"2806:230:1016::/48", "265594"}, - {"2a02:26f7:d8c4::/48", "36183"}, - {"2001:df0:c300::/48", "136099"}, - {"2803:87e0::/32", "270095"}, - {"2a04:c180::/29", "12842"}, - {"2a0b:4e80::/32", "206491"}, - {"2001:da8:8000::/48", "24364"}, - {"2602:ff36:301::/40", "395348"}, - {"2620:149:983::/41", "714"}, - {"2804:5598::/32", "267944"}, - {"2804:5ac4:40::/34", "268795"}, - {"2a0d:5c0::/29", "61317"}, - {"2001:678:b7c::/48", "207871"}, - {"2001:16c0:12::/32", "31732"}, - {"2408:8957:f200::/42", "17816"}, - {"240e:3bb:d000::/36", "134772"}, - {"240e:438:6e20::/43", "140647"}, - {"2602:ff3a::/36", "62512"}, - {"2620:49:8080::/48", "7046"}, - {"2804:2000:1000::/33", "264459"}, - {"2a02:26f7:cf85::/46", "20940"}, - {"2a03:9980::/35", "30742"}, - {"2001:ce0:4::/48", "4616"}, - {"2a04:1bc0::/32", "60982"}, - {"2402:800:55ee::/38", "7552"}, - {"2604:38c0::/32", "54097"}, - {"2800:160:1212::/44", "14259"}, - {"2804:2010::/32", "264462"}, - {"2a05:9580::/29", "42120"}, - {"2001:df0:cb::/48", "45786"}, - {"2606:2c40::/48", "209242"}, - {"2a00:10b0::/29", "49586"}, - {"2001:559:53b::/48", "7015"}, - {"2001:559:82a2::/47", "7922"}, - {"2404:3380::/32", "134707"}, - {"2806:2f0:9e03::/42", "17072"}, - {"2a0f:f780::/29", "60262"}, - {"2001:559:161::/48", "7725"}, - {"2001:559:2e3::/48", "33491"}, - {"2001:559:4ac::/48", "22909"}, - {"2620:171:aa::/48", "42"}, - {"2a00:1dc8::/32", "34352"}, - {"2a02:128:14::/48", "201069"}, - {"2a02:2698:a001::/48", "12768"}, - {"2602:feda:e40::/44", "149285"}, - {"2804:eb0::/32", "262968"}, - {"2804:4bc8::/40", "267329"}, - {"2a06:98c1:50::/45", "13335"}, - {"2a09:bac0:11::/46", "13335"}, - {"240a:ab18::/32", "145490"}, - {"2804:7110::/34", "270764"}, - {"2a0e:8f02:f039::/48", "210826"}, - {"2800:bf0:259::/45", "52257"}, - {"240a:a383::/32", "143549"}, - {"2610:1c8::/43", "23393"}, - {"2a02:26f0:2::/45", "20940"}, - {"2a02:26f0:6901::/38", "20940"}, - {"2a0e:b107:21::/48", "137490"}, - {"2001:250:583b::/41", "24363"}, - {"2001:559:8467::/48", "7015"}, - {"2602:805:8000::/40", "397110"}, - {"2a01:51c0::/31", "29422"}, - {"2001:559:714::/48", "20214"}, - {"2401:8800:a00::/46", "17439"}, - {"2405:9800:9814::/38", "45430"}, - {"2407:b000:4015::/48", "394749"}, - {"240e:108:84::/48", "63835"}, - {"2606:3c80:c000::/34", "33582"}, - {"2a02:26f7:c440::/48", "36183"}, - {"2a04:f900::/29", "59921"}, - {"2a07:3fc0::/29", "203468"}, - {"2a07:f600:4045::/48", "9098"}, - {"2600:5400:ce01::/34", "19108"}, - {"2800:1e0:3000::/40", "7195"}, - {"2a01:111:2004::/42", "8075"}, - {"2a0f:e6c0:a::/48", "60781"}, - {"2001:550:502::/38", "174"}, - {"2001:559:2b::/45", "7922"}, - {"2a0b:9e00::/29", "35370"}, - {"2001:468:d02::/40", "4600"}, - {"2804:3434::/32", "265442"}, - {"2a01:618:8000::/38", "8683"}, - {"2a01:5bc0::/32", "48298"}, - {"2a02:26f6:1::/32", "20940"}, - {"2a02:26f7:b984::/47", "36183"}, - {"2a06:d480::/29", "59701"}, - {"2a0e:47c7:1000::/48", "208259"}, - {"2001:559:c208::/48", "33491"}, - {"2602:feda:20::/44", "205532"}, - {"2a06:3c40::/29", "1764"}, - {"2406:3002:20::/48", "9874"}, - {"240e:45c:6800::/40", "131285"}, - {"2607:1b00:10::/48", "54456"}, - {"2620:138:3009::/45", "22604"}, - {"2804:7d48::/32", "271551"}, - {"2001:559:8188::/48", "33659"}, - {"2001:18a0::/32", "23265"}, - {"2001:44b8:6034::/44", "4739"}, - {"240a:a0eb::/32", "142885"}, - {"240a:a28b::/32", "143301"}, - {"2600:1409:c801::/35", "20940"}, - {"2602:fcae::/36", "16904"}, - {"2a04:29c2::/32", "42821"}, - {"2403:3800:8000::/33", "4007"}, - {"240a:ad9e::/32", "146136"}, - {"2620:149:f02::/35", "714"}, - {"2001:559:8160::/48", "7725"}, - {"2403:6e40:160::/44", "9830"}, - {"2803:c010:2a::/48", "271799"}, - {"2804:70bc::/32", "270745"}, - {"2804:7f10::/32", "271664"}, - {"2a02:26f7:ea85::/46", "20940"}, - {"2a04:5c85:1000::/36", "42570"}, - {"2a05:43c3::/29", "210139"}, - {"2409:8c20:5800::/38", "56046"}, - {"2800:160:1869::/43", "14259"}, - {"2a01:8fa::/32", "12302"}, - {"2001:559:465::/48", "7922"}, - {"2001:dce:7000::/48", "45285"}, - {"2603:4010::/31", "3"}, - {"2402:93c0:100::/48", "59073"}, - {"240a:adb1::/32", "146155"}, - {"2001:67c:2b30::/48", "3320"}, - {"2605:7000::/32", "44444"}, - {"2a02:80e0::/30", "197216"}, - {"2a0f:5707:af07::/44", "211358"}, - {"2001:678:e24::/48", "212717"}, - {"240e:3b3:f100::/37", "134775"}, - {"2602:107:2610::/48", "20115"}, - {"2606:b0c0::/32", "8095"}, - {"2a05:980::/29", "201702"}, - {"2001:678:19::/48", "44358"}, - {"2406:a340::/32", "141327"}, - {"2600:1001:f110::/30", "22394"}, - {"2800:bf0:8166::/47", "27947"}, - {"2804:37c4:8200::/39", "266435"}, - {"2804:5960::/32", "268186"}, - {"2804:6414::/32", "269403"}, - {"2a00:1909::/32", "3266"}, - {"2a00:1a10::/29", "41230"}, - {"2602:feda:d55::/44", "141712"}, - {"2001:559:8281::/48", "33665"}, - {"2001:dcc:4::/48", "23599"}, - {"2408:8956:bd00::/40", "17816"}, - {"240a:a19d::/32", "143063"}, - {"2610:a1:1073::/48", "397228"}, - {"2804:2e64::/32", "265343"}, - {"2001:44b8:5034::/44", "7545"}, - {"2401:d800:d790::/42", "7552"}, - {"2604:bfc0::/32", "54646"}, - {"2a00:19c8:9000::/29", "35833"}, - {"2a0f:480::/29", "198111"}, - {"2a10:3f80::/29", "212144"}, - {"2001:559:c35a::/48", "33651"}, - {"2404:1f00:ffa2::/45", "55947"}, - {"2408:8957:2600::/40", "17622"}, - {"2804:23e4:2a::/32", "264191"}, - {"2804:561c::/32", "267977"}, - {"2001:968::/29", "24875"}, - {"2001:49f0:d0b0::/44", "174"}, - {"2406:3002:50:4000::/31", "4657"}, - {"2408:8409:6c00::/40", "4808"}, - {"2607:f4e8:6::/44", "22822"}, - {"2a02:26f7:c9cd::/42", "20940"}, - {"2a09:bfc7::/32", "49544"}, - {"240a:a54b::/32", "144005"}, - {"2803:5c80:5507::/48", "64114"}, - {"2a02:26f7:cbc1::/46", "20940"}, - {"2a0e:97c3:55c::/48", "20473"}, - {"2001:67c:1108::/47", "198060"}, - {"2001:44c8:4080::/44", "131445"}, - {"2402:5300:4110::/38", "45903"}, - {"2408:8256:2f7f::/48", "17816"}, - {"240a:ad50::/32", "146058"}, - {"2a02:26f7:d160::/48", "36183"}, - {"240a:a6dd::/32", "144407"}, - {"2600:1fa0:1040::/44", "16509"}, - {"2a00:c68::/32", "43513"}, - {"2a0a:4640:14::/42", "206177"}, - {"240e:981:300::/36", "4134"}, - {"2605:a404:23c::/40", "33363"}, - {"2606:2800:60f5::/48", "15133"}, - {"2001:410:a01c::/48", "40007"}, - {"2001:468:600::/40", "10578"}, - {"2401:d800:bef0::/39", "7552"}, - {"240a:a309::/32", "143427"}, - {"240a:a396::/32", "143568"}, - {"240a:a7dc::/32", "144662"}, - {"2600:1407:1801::/37", "20940"}, - {"2a02:f840:2::/31", "199483"}, - {"2a0f:9400:8020::/48", "20473"}, - {"2401:f800::/32", "7529"}, - {"240a:a46b::/32", "143781"}, - {"2602:ff18:221::/48", "21973"}, - {"2620:8b:c000::/48", "14382"}, - {"2804:45cc::/32", "266950"}, - {"2a06:ec0::/32", "8943"}, - {"2a0a:7980::/32", "41114"}, - {"2a0f:9400:8011::/48", "207445"}, - {"2001:559:8386::/48", "33491"}, - {"2406:f00:1::/48", "132524"}, - {"2a01:53a0:1001::/48", "199953"}, - {"2001:559:3dc::/48", "33657"}, - {"2001:4430:41e8::/36", "17853"}, - {"240a:abb0::/32", "145642"}, - {"2602:fd2d::/36", "398567"}, - {"2a0b:6b81:208::/48", "203729"}, - {"2a0f:8ac1:d9a3::/48", "205749"}, - {"2401:3c0:205::/44", "45528"}, - {"2a02:2bb8::/32", "24851"}, - {"240e:44d:7340::/42", "140356"}, - {"2001:44b8:2054::/44", "7545"}, - {"2402:800:527f::/40", "7552"}, - {"2606:f40:3001::/48", "14618"}, - {"2a05:e980::/32", "47215"}, - {"2a0e:b107:1170::/47", "142055"}, - {"2407:5440::/48", "141145"}, - {"2407:aa40::/32", "142508"}, - {"240a:ac87::/32", "145857"}, - {"240a:af97::/32", "146641"}, - {"2600:1410:b001::/33", "20940"}, - {"2600:1480:b001::/37", "20940"}, - {"2602:fddd::/36", "26801"}, - {"2604:880:38c::/46", "29802"}, - {"2804:85c8::/32", "272600"}, - {"2a02:2010:2410::/45", "20978"}, - {"2a12:79c0::/32", "47536"}, - {"2001:559:803a::/48", "33491"}, - {"2403:9800:b019::/41", "4648"}, - {"2606:6580::/34", "15305"}, - {"2606:e600::/32", "4258"}, - {"2804:5bc0:c000::/34", "268867"}, - {"2a04:e7c0::/29", "197879"}, - {"2603:c0e8:2910::/40", "1218"}, - {"2607:f740:e621::/48", "63911"}, - {"2a06:1780::/32", "60781"}, - {"2408:8956:9200::/40", "17622"}, - {"240a:aaa1::/32", "145371"}, - {"240e:3b3:2200::/37", "136198"}, - {"2606:2800:50c::/46", "15133"}, - {"2a03:2ca0:256::/34", "59865"}, - {"2001:559:c0f8::/48", "33659"}, - {"2001:678:cf8::/48", "38974"}, - {"2001:1688::/29", "3212"}, - {"240a:a476::/32", "143792"}, - {"2a0e:9300:42c0::/48", "62184"}, - {"2400:adc3::/39", "9541"}, - {"2405:7f00:9b00::/37", "133414"}, - {"2408:8956:d440::/40", "17622"}, - {"2607:f2d8:401b::/48", "33494"}, - {"2803:6604:a001::/37", "28075"}, - {"2804:1288::/36", "263482"}, - {"2a02:26f7:cb00::/48", "36183"}, - {"2a02:2a28::/32", "51137"}, - {"2a09:2740::/29", "209536"}, - {"2404:8d06:6100::/36", "10089"}, - {"240a:ad22::/32", "146012"}, - {"2804:ffc::/32", "263612"}, - {"2a00:e000::/48", "56975"}, - {"2a0d:d6c0::/31", "200350"}, - {"2406:8600:f03f::/41", "10310"}, - {"240e:108:1196::/42", "4134"}, - {"2804:25b4:ff01::/40", "264297"}, - {"2804:2c38::/32", "265204"}, - {"2a04:b903::/32", "8587"}, - {"2a0b:b600:1000::/38", "60404"}, - {"2001:559:8132::/48", "33491"}, - {"2a05:d018::/35", "16509"}, - {"2001:da8:258::/48", "23910"}, - {"2001:1b70:86::/48", "158"}, - {"240e:438:6a40::/37", "4134"}, - {"2804:1ae4::/32", "61697"}, - {"2804:2994::/32", "264023"}, - {"2804:7570::/32", "271046"}, - {"2a0d:f980::/29", "204431"}, - {"2001:559:817c::/48", "33667"}, - {"2001:1b70:4292::/48", "158"}, - {"240e:d:a000::/37", "136193"}, - {"2604:6840:f800::/37", "33438"}, - {"2a0e:c640::/29", "208386"}, - {"2001:503:e8ef::/48", "7342"}, - {"2001:559:c06b::/48", "7016"}, - {"2001:4350:a000::/48", "31245"}, - {"2408:84f3:9e10::/42", "134543"}, - {"240e:3b4:2200::/37", "136198"}, - {"2600:1016:b0e0::/39", "6167"}, - {"2603:b0a3::/28", "11796"}, - {"2a10:50c0::/48", "212772"}, - {"2001:670::/29", "719"}, - {"2001:e10::/32", "7539"}, - {"2408:8456:7a00::/42", "17622"}, - {"240a:a16b::/32", "143013"}, - {"2804:6388::/32", "269367"}, - {"2a00:1938::/32", "42093"}, - {"2a0b:1301:8000::/48", "198018"}, - {"2409:8763::/28", "9808"}, - {"2606:2800:4100::/48", "15133"}, - {"2a02:26f7:e704::/48", "36183"}, - {"2a03:5a00:8::/48", "49124"}, - {"2a03:7c00::/32", "199087"}, - {"2a0b:e200:1::/48", "208321"}, - {"2a11:d940::/29", "30879"}, - {"2409:8054:45::/44", "56040"}, - {"240c:c7b9::/32", "24367"}, - {"240e:980:2400::/40", "134768"}, - {"2603:6080::/28", "11426"}, - {"2804:2cdc::/32", "263069"}, - {"2001:503:6810::/48", "7342"}, - {"2001:5014:400:4::/64", "6461"}, - {"2405:6e00:f810::/48", "133612"}, - {"2a02:26f7:ea81::/46", "20940"}, - {"2403:2500:300::/48", "36236"}, - {"2408:8256:3590::/44", "17623"}, - {"2804:29cc::/32", "264035"}, - {"2001:c20:c84d::/46", "9255"}, - {"2404:a800:2a01::/35", "9498"}, - {"2602:ffa5:100::/40", "53907"}, - {"2804:5e08::/39", "269007"}, - {"2001:559:461::/48", "7015"}, - {"2001:559:8420::/48", "7016"}, - {"240a:a3db::/32", "143637"}, - {"2a01:8840:d1::/48", "207266"}, - {"2a02:26f0:1701::/36", "20940"}, - {"2400:4a20:f000::/36", "141731"}, - {"2401:3c0:217::/44", "45528"}, - {"2407:b000:4016::/32", "17819"}, - {"2604:4c40::/32", "395555"}, - {"2606:4700:9ae0::/44", "13335"}, - {"2800:160:1bbc::/46", "14259"}, - {"2804:38:3403::/45", "19089"}, - {"2001:1a11:79::/46", "42298"}, - {"2402:800:3771::/44", "7552"}, - {"2806:267:2300::/37", "13999"}, - {"2a02:ad8:1200::/37", "12389"}, - {"2409:803c:3800::/40", "24444"}, - {"240e:44d:4a00::/42", "140345"}, - {"2804:2bc4::/32", "265174"}, - {"2a06:5040:10::/45", "4785"}, - {"2605:19c0::/32", "30697"}, - {"2620:1f7:3800::/37", "18703"}, - {"2800:bf0:3742::/42", "27947"}, - {"2803:9840::/32", "263765"}, - {"2804:145c:9000::/33", "263327"}, - {"2a03:8800:2::/32", "49687"}, - {"2c0f:eac0::/32", "37682"}, - {"2408:8409:9000::/40", "4808"}, - {"2607:f428:9360::/44", "12271"}, - {"2804:b18:8090::/41", "52941"}, - {"2001:fd8:261::/46", "4775"}, - {"2403:6200:7105::/37", "45629"}, - {"240e:67e:800::/37", "140329"}, - {"2600:370f:33c0::/46", "32261"}, - {"2605:2480::/32", "53454"}, - {"2804:448::/32", "262427"}, - {"2a00:4900::/32", "12390"}, - {"2a03:3200::/32", "8752"}, - {"2a0f:e404:10a::/48", "58057"}, - {"2408:84ee::/32", "140726"}, - {"2408:84f3:a440::/38", "17816"}, - {"2806:329::/32", "28429"}, - {"2a02:26f7:e949::/46", "20940"}, - {"2001:559:84bd::/48", "33490"}, - {"2001:67c:2f88::/48", "204082"}, - {"240a:a2bc::/32", "143350"}, - {"2600:141b:c01::/38", "20940"}, - {"2804:2168::/32", "53199"}, - {"2a02:970:1244::/47", "44002"}, - {"2a04:3740:3::/29", "35625"}, - {"2001:df0:de80::/48", "138762"}, - {"2400:1440::/32", "135666"}, - {"2406:3a00:10::/48", "136557"}, - {"240a:aa2d::/32", "145255"}, - {"2610:108:8004::/47", "11724"}, - {"2800:3c0:1130::/34", "19863"}, - {"2804:2634:2000::/39", "264332"}, - {"2a00:800:429::/41", "1257"}, - {"2001:67c:6a4::/48", "50370"}, - {"2402:800:b2e0::/39", "7552"}, - {"2607:f7a0:8::/47", "46562"}, - {"2804:14c:9b00::/40", "28573"}, - {"2806:288:4040::/47", "28469"}, - {"2a0e:aa00:301::/48", "41378"}, - {"2001:559:d::/48", "33662"}, - {"2404:7cc0:7f00::/47", "10100"}, - {"240a:a92a::/32", "144996"}, - {"2600:370f:20e1::/43", "32261"}, - {"2a02:26f0:8d01::/40", "20940"}, - {"2401:d800:9bf0::/37", "7552"}, - {"240a:a617::/32", "144209"}, - {"2602:fbfe::/48", "18944"}, - {"2602:fe45::/36", "35900"}, - {"2607:1280:13a0::/44", "394972"}, - {"2800:bf0:1c0::/45", "52257"}, - {"2804:500::/32", "262485"}, - {"2a02:26f7:c74c::/48", "36183"}, - {"2605:a401:8de1::/44", "33363"}, - {"2400:cd00::/35", "38794"}, - {"2402:7400:8000::/33", "38883"}, - {"2409:8055:3074::/30", "56040"}, - {"240a:a315::/32", "143439"}, - {"2800:160:2c18::/42", "14259"}, - {"2a00:c720::/32", "60323"}, - {"2a03:99a0::/32", "2606"}, - {"2001:678:75c::/48", "199819"}, - {"2001:49d0::/40", "2495"}, - {"2600:1400:2000::/48", "35994"}, - {"2804:8e8::/34", "262399"}, - {"2a07:1980:a::/45", "48851"}, - {"2a0c:b641:250::/44", "210821"}, - {"2a10:dfc0::/29", "62206"}, - {"2a00:4802:5110::/29", "8717"}, - {"2a04:4280:10::/48", "43260"}, - {"2a0e:97c0:a41::/46", "210667"}, - {"2001:4488:2005::/33", "7713"}, - {"2a04:3740:1::/46", "24935"}, - {"2a0a:2a40::/29", "50758"}, - {"2a00:c020:5000::/32", "200414"}, - {"2a0a:5000::/29", "57814"}, - {"2001:559:c050::/48", "7015"}, - {"2620:56:4000::/48", "31990"}, - {"2804:71b0::/34", "270805"}, - {"2001:559:581::/48", "33491"}, - {"2001:12f0:d00::/42", "1916"}, - {"240a:adb7::/32", "146161"}, - {"2a03:7600::/32", "34066"}, - {"2001:4478:1600::/36", "4802"}, - {"2400:addd::/30", "9541"}, - {"240e:14:7000::/37", "133775"}, - {"2a0c:b641:454::/48", "210344"}, - {"2001:559:8267::/48", "33650"}, - {"2001:559:c1fa::/48", "7015"}, - {"2001:fb0:10b5::/48", "138685"}, - {"2001:4878:c062::/47", "12222"}, - {"2406:840:fef9::/48", "141776"}, - {"2408:8459:8050::/38", "17816"}, - {"240e:fe::/35", "140317"}, - {"2600:370f:50af::/39", "32261"}, - {"2804:3a4c::/32", "266082"}, - {"2a07:ef40::/29", "204860"}, - {"240e:3be:2c00::/35", "134774"}, - {"2a02:26f7:cc00::/48", "36183"}, - {"2a09:9444::/32", "395092"}, - {"2a0e:97c0:5e0::/48", "210426"}, - {"2a11:aa80::/47", "35673"}, - {"2c0f:f698:8ff1::/33", "37693"}, - {"2804:3e98::/40", "266608"}, - {"2a00:5f80::/32", "57353"}, - {"2a06:1307::/32", "49392"}, - {"2001:400::/43", "293"}, - {"2401:5e80::/32", "132895"}, - {"2607:f500::/35", "6181"}, - {"2800:4b0:4013::/42", "12252"}, - {"2803:1a00:5213::/37", "262186"}, - {"2803:8040::/32", "263749"}, - {"2804:6790::/32", "269636"}, - {"2a04:6000::/29", "50477"}, - {"2001:ce0:9::/34", "3662"}, - {"240a:a07e::/32", "142776"}, - {"240a:a673::/32", "144301"}, - {"2606:1a40:2000::/44", "398962"}, - {"2001:559:3fb::/48", "33287"}, - {"2408:8456:440::/39", "17816"}, - {"240a:a9b4::/32", "145134"}, - {"2a00:8420::/32", "9304"}, - {"2a02:26f7:cfc4::/48", "36183"}, - {"2a03:3a40:2001::/32", "199629"}, - {"2a05:d050:8050::/42", "16509"}, - {"2001:df7:6c00::/48", "134633"}, - {"240a:a8ef::/32", "144937"}, - {"240e:438:3c40::/38", "4134"}, - {"2602:fce1:226::/48", "395886"}, - {"2804:19d8::/32", "61822"}, - {"2804:5164::/32", "268449"}, - {"2806:230:6027::/48", "11888"}, - {"2620:fa::/48", "293"}, - {"2a01:c9c0:801a::/48", "2285"}, - {"2a05:a880:de56::/48", "20765"}, - {"2a07:9540::/29", "206141"}, - {"2a0c:88c0::/46", "202344"}, - {"2a0e:b107:777::/48", "213105"}, - {"2401:a700::/32", "17726"}, - {"2408:8956:100::/40", "17816"}, - {"2606:ae00:a480::/42", "7287"}, - {"2804:8d4::/32", "262753"}, - {"2001:67c:13f4::/48", "1257"}, - {"2001:1490:101::/46", "8895"}, - {"2001:1b08::/32", "20900"}, - {"2406:d00:ddcc::/48", "132165"}, - {"2408:84f3:3090::/38", "17816"}, - {"2603:90d8::/30", "10838"}, - {"2620:171:f4::/47", "42"}, - {"2a00:c500::/32", "48661"}, - {"2a0d:9e00::/29", "204988"}, - {"2a10:13c0:ef1c::/48", "197816"}, - {"2001:6f0:4006::/29", "1257"}, - {"2800:190:4005::/32", "11664"}, - {"2800:370:46::/48", "28006"}, - {"2800:484:dd00::/38", "14080"}, - {"2804:1c4c:593::/35", "61648"}, - {"2a00:59c0:4::/32", "49232"}, - {"2001:ac0:30fd::/48", "12541"}, - {"2402:bc00::/29", "18144"}, - {"240a:a1ff::/32", "143161"}, - {"2800:ba0:16::/48", "263812"}, - {"2405:3140:3a::/48", "59068"}, - {"2804:49cc::/32", "52663"}, - {"2804:51b4:6a00::/35", "268471"}, - {"2806:2f0:23::/41", "17072"}, - {"2a03:2887:ff3f::/41", "63293"}, - {"2001:ac0:c880::/44", "12541"}, - {"2001:1900::/45", "3356"}, - {"2404:6c00::/32", "24324"}, - {"2406:5f40::/48", "135905"}, - {"2602:804:9000::/44", "11661"}, - {"2620:130:7004::/47", "27518"}, - {"2001:579:1c34::/40", "22773"}, - {"240a:aa8d::/32", "145351"}, - {"2600:803:270::/48", "12234"}, - {"2605:3380:4403::/45", "12025"}, - {"2800:bf0:800d::/46", "27947"}, - {"2803:c200::/47", "22411"}, - {"2804:3bcc:8000::/35", "266171"}, - {"2806:2f0:6163::/40", "17072"}, - {"2a00:86c0:1022::/41", "2906"}, - {"2a0f:607:130f::/48", "138181"}, - {"2402:9d80:3ff::/37", "131429"}, - {"2a01:7f8::/29", "15925"}, - {"2a04:e4c0:14::/44", "36692"}, - {"2001:56b:a00c::/33", "852"}, - {"2001:579:5104::/40", "22773"}, - {"2001:678:964::/48", "49697"}, - {"2405:9800:c91b::/45", "45430"}, - {"2600:1405:e001::/35", "20940"}, - {"2607:fce0::/32", "7151"}, - {"2a01:240:ab01::/48", "49030"}, - {"240e:438:2440::/38", "4134"}, - {"2001:678:7bc::/48", "197600"}, - {"2409:8958:ce54::/39", "56040"}, - {"2806:2f0:5263::/40", "17072"}, - {"2a01:5c40:7::/32", "12687"}, - {"2a02:5d80::/29", "48294"}, - {"2a11:1ec0::/29", "25145"}, - {"2001:8000::/20", "1221"}, - {"2803:f080::/33", "64120"}, - {"2001:388:7001::/32", "7575"}, - {"2001:7f8:5b::/48", "62047"}, - {"2001:978:6407::/48", "212711"}, - {"2404:0:1100::/36", "17709"}, - {"240e:678::/36", "140329"}, - {"2803:9840:a000::/33", "263765"}, - {"2a02:26f7:b945::/46", "20940"}, - {"2001:559:c01b::/48", "33659"}, - {"2408:8956:28c0::/38", "17816"}, - {"240a:a03a::/32", "142708"}, - {"2600:100d:9f10::/40", "22394"}, - {"2804:3b4c::/32", "266140"}, - {"2a00:8a01:10::/44", "18666"}, - {"2a01:6a00::/29", "13122"}, - {"2001:df5:3800::/48", "56285"}, - {"2408:8001:3180::/36", "17816"}, - {"2408:8456:40::/39", "17816"}, - {"2804:104c:e800::/40", "263629"}, - {"2804:6474::/33", "269429"}, - {"2a02:26f0:d201::/39", "20940"}, - {"2001:559:22::/48", "7922"}, - {"2408:8456:cb00::/42", "17622"}, - {"240a:ae56::/32", "146320"}, - {"2605:8680::/48", "25780"}, - {"2806:2f0:2023::/43", "22884"}, - {"2001:1b70:88ae::/48", "158"}, - {"2408:8256:99a::/38", "17622"}, - {"2408:8456:7400::/42", "17622"}, - {"2605:bec0::/32", "32313"}, - {"2a01:8d80::/48", "35157"}, - {"2001:559:814c::/48", "7922"}, - {"2402:2080::/32", "131144"}, - {"2406:2600:2::/44", "55569"}, - {"2408:8956:6400::/40", "17622"}, - {"2409:8c30:50::/39", "9808"}, - {"240e:981:1100::/33", "4134"}, - {"2801:15:b000::/48", "266700"}, - {"2a0a:1301::/29", "207028"}, - {"2001:913::/36", "60197"}, - {"2405:1c0:6a61::/46", "55303"}, - {"2600:370f:362a::/41", "32261"}, - {"2600:5c00:2542::/35", "20001"}, - {"2603:ff60::/24", "397165"}, - {"2804:54a0::/35", "27688"}, - {"2a01:2c0::/34", "8282"}, - {"2a04:4e40:4800::/48", "54113"}, - {"2804:59f0::/32", "268735"}, - {"2a02:f00::/48", "48137"}, - {"2001:df3:3200::/48", "135724"}, - {"2402:800:92b7::/41", "7552"}, - {"2402:ee40:50::/48", "134033"}, - {"240a:addb::/32", "146197"}, - {"2600:6c38:716::/47", "20115"}, - {"2605:a404:53c::/41", "33363"}, - {"2804:3220:1001::/48", "265058"}, - {"2804:52b8::/32", "268537"}, - {"2001:678:640::/48", "204302"}, - {"2408:84e2::/39", "17621"}, - {"2804:5ea4::/32", "269047"}, - {"2a02:2368:ffff::/48", "50270"}, - {"2a02:26f7:c105::/46", "20940"}, - {"2a02:26f7:f710::/48", "36183"}, - {"2001:559:c03a::/48", "13367"}, - {"2001:67c:2884::/48", "35003"}, - {"2401:d800:94f2::/39", "7552"}, - {"2406:2fc0::/32", "138997"}, - {"240a:a24b::/32", "143237"}, - {"240e:5a:4180::/38", "140292"}, - {"2600:1406:b401::/36", "20940"}, - {"2605:a404:70b::/42", "33363"}, - {"2607:f510::/32", "21719"}, - {"2a01:4d40:1::/48", "43994"}, - {"2804:14c:477::/44", "28573"}, - {"2a00:51c0::/32", "51758"}, - {"2a06:ffc0::/29", "203376"}, - {"2404:bf40:c100::/48", "7545"}, - {"2804:728::/33", "53201"}, - {"2a01:b740:a03::/48", "714"}, - {"2a0f:99c0::/32", "205240"}, - {"2604:5880::/48", "10980"}, - {"2620:126:4000::/44", "68"}, - {"2001:480:422::/39", "668"}, - {"240a:a9fc::/32", "145206"}, - {"240a:adda::/32", "146196"}, - {"2804:2974::/32", "264016"}, - {"2001:4078::/29", "16086"}, - {"2600:1407:b000::/48", "35994"}, - {"2a02:ee80:4224::/46", "3573"}, - {"2001:4350:2000::/48", "31245"}, - {"2804:4ec:1100::/38", "28668"}, - {"2a02:e5e::/32", "25057"}, - {"2a0b:86c0::/30", "202120"}, - {"2401:b180:4100::/48", "45102"}, - {"240a:a5ca::/32", "144132"}, - {"2600:6c38:b3f::/41", "20115"}, - {"2605:cc40::/32", "46713"}, - {"2402:800:73f0::/37", "7552"}, - {"2600:380:3200::/33", "20057"}, - {"2804:7018::/32", "270705"}, - {"2a02:d40:8::/32", "44592"}, - {"2a04:1a40::/48", "50362"}, - {"2a06:63c0::/29", "41937"}, - {"2a06:e881:7000::/44", "208226"}, - {"2402:4000:b1c1::/38", "18001"}, - {"240a:a9e8::/32", "145186"}, - {"2806:370:8300::/42", "28403"}, - {"2a02:239c::/48", "9166"}, - {"2a02:26f7:e0cc::/48", "36183"}, - {"2a09:a4c7:e000::/35", "208861"}, - {"2a10:4646:c0::/44", "210816"}, - {"2001:1700::/27", "6730"}, - {"2605:a401:80ba::/47", "33363"}, - {"2804:7220::/32", "270834"}, - {"2a00:1640::/32", "12389"}, - {"2a02:2b30::/32", "21390"}, - {"2402:9d80:266::/47", "131429"}, - {"2a0f:5707:ab21::/48", "49367"}, - {"2402:8100:2012::/41", "45271"}, - {"2001:df1:7f00::/48", "136726"}, - {"2404:bf40:e702::/48", "7545"}, - {"240a:a8d1::/32", "144907"}, - {"2800:160:2046::/47", "14259"}, - {"2803:7210::/32", "271915"}, - {"2a0b:440::/36", "39921"}, - {"2001:16d8:ef00::/35", "16150"}, - {"240a:aee0::/32", "146458"}, - {"2a04:5540::/29", "42557"}, - {"2001:559:c05c::/48", "7015"}, - {"2001:da8:800e::/43", "24364"}, - {"2401:d800:24f0::/39", "7552"}, - {"2620:5f:4000::/48", "17378"}, - {"2804:732c::/32", "270900"}, - {"2a00:f10:300::/32", "48635"}, - {"2001:559:5aa::/48", "33490"}, - {"2a0a:7600::/29", "207096"}, - {"2a0d:9dc0::/29", "40970"}, - {"2a11:6200::/29", "204790"}, - {"2001:868::/29", "12731"}, - {"2001:4478:2300::/33", "4802"}, - {"2400:5b60::/32", "131916"}, - {"2600:1400:8001::/35", "20940"}, - {"2c0f:5400::/48", "205897"}, - {"2001:559:8529::/48", "33651"}, - {"2001:559:86f7::/48", "7016"}, - {"2605:a404:b2::/44", "33363"}, - {"2a06:ef00::/29", "213222"}, - {"2a0f:17c0::/29", "60262"}, - {"240e:108:11d5::/48", "134769"}, - {"2001:18c8:600::/40", "8015"}, - {"2401:4900:52f0::/39", "45609"}, - {"2406:d7c0::/32", "38839"}, - {"240e:3b4:f700::/36", "4134"}, - {"2800:160:1d0e::/43", "14259"}, - {"2806:265:4300::/37", "28481"}, - {"2001:559:82d5::/48", "33650"}, - {"2001:7f8:3a::/48", "41692"}, - {"2001:4288::/39", "6713"}, - {"2606:2800:4aa8::/46", "15133"}, - {"2804:e04::/32", "52535"}, - {"2804:82a8::/32", "272532"}, - {"240e:67a:800::/37", "140329"}, - {"2600:1f70:c000::/40", "16509"}, - {"2a01:c50f:c380::/41", "12479"}, - {"2a0e:b107:381::/48", "211358"}, - {"2a11:6e01::/32", "57695"}, - {"2001:559:19a::/48", "33652"}, - {"2604:e780::/32", "15154"}, - {"2a0e:2c40::/43", "50581"}, - {"2001:57a::/39", "22773"}, - {"2400:1000::/32", "10021"}, - {"2401:2900:8000::/45", "23679"}, - {"2600:6c38:c0b::/45", "20115"}, - {"2604:a680:5::/48", "55079"}, - {"2804:6d9c::/32", "270544"}, - {"2a01:7d60::/32", "50181"}, - {"2a02:26f7:ecc8::/48", "36183"}, - {"2a02:7320::/32", "31222"}, - {"2001:559:c353::/48", "7016"}, - {"2402:800:f630::/41", "7552"}, - {"2607:fe28:5027::/43", "53347"}, - {"2a02:26f7:ecc1::/46", "20940"}, - {"2804:1b04:10::/46", "53048"}, - {"2804:5348::/32", "268574"}, - {"2a01:488:bb19::/48", "20773"}, - {"240e:37c:1a00::/34", "140330"}, - {"2001:250:343a::/47", "138438"}, - {"2001:550:2901::/38", "174"}, - {"2001:b28:4::/48", "31500"}, - {"2401:d800:d870::/40", "7552"}, - {"2403:8680::/47", "134630"}, - {"2600:1402:c801::/35", "20940"}, - {"2a02:2698:28::/46", "12768"}, - {"2a0e:8780::/29", "37289"}, - {"2409:807e:900::/35", "9808"}, - {"2409:8c28:802::/39", "56041"}, - {"2001:4878:b225::/48", "12222"}, - {"2400:cb00:331::/48", "13335"}, - {"2402:3a80:1c00::/42", "38266"}, - {"2408:80ea:6480::/42", "17622"}, - {"2604:ca00:1c8::/43", "36492"}, - {"2a07:8500::/32", "1104"}, - {"2c0f:f138::/32", "37577"}, - {"2c0f:fb08::/32", "16637"}, - {"2409:8908::/30", "9808"}, - {"2606:a600:4003::/36", "23005"}, - {"2804:78b4::/32", "271260"}, - {"2a0d:7a40:5::/48", "60254"}, - {"2a0f:1e00:def9::/48", "30633"}, - {"2401:d800:fe80::/42", "7552"}, - {"2408:8a22:9a00::/34", "139007"}, - {"2409:8904:8d90::/38", "24547"}, - {"2600:1900:4140::/40", "396982"}, - {"2600:9000:2386::/48", "16509"}, - {"2803:87a0::/32", "13489"}, - {"2a05:43c0::/30", "210139"}, - {"2001:4878:41e0::/44", "35994"}, - {"2401:a840::/38", "136917"}, - {"240e:37c::/35", "140329"}, - {"240e:698:2300::/40", "58519"}, - {"2606:9600::/32", "17018"}, - {"2a0a:2e80::/32", "210695"}, - {"2a11:5100::/29", "50304"}, - {"2404:8ec0::/32", "135780"}, - {"2600:6c38:42::/43", "20115"}, - {"2605:a404:7fb::/36", "33363"}, - {"2605:dcc0::/35", "398570"}, - {"2801:80:12e0::/48", "28650"}, - {"2804:1e20:19::/48", "264409"}, - {"2a03:3060::/29", "48635"}, - {"2001:df2:b600::/48", "132645"}, - {"2001:df6:2d80::/48", "141778"}, - {"2405:84c0:faaa::/48", "138990"}, - {"2406:7400::/46", "24309"}, - {"2600:9000:1160::/44", "16509"}, - {"2607:f740:e07b::/45", "398748"}, - {"2620:10f:a000::/47", "54496"}, - {"2a02:8880::/25", "5089"}, - {"2607:b580::/44", "19754"}, - {"2607:f740:45::/48", "63911"}, - {"2a02:7500::/32", "9155"}, - {"2a0e:97c0:366::/48", "211484"}, - {"2001:1248:56ff::/39", "11172"}, - {"2404:bf40:a341::/37", "139084"}, - {"2404:bf40:c3c4::/37", "139084"}, - {"240a:a3f3::/32", "143661"}, - {"240a:a891::/32", "144843"}, - {"2803:f340:1060::/40", "14754"}, - {"2804:4918::/32", "267164"}, - {"2a0d:b280::/29", "41720"}, - {"2408:8256:1466::/39", "17622"}, - {"2604:3400:dc3::/48", "209453"}, - {"2804:7c7c:200::/36", "271499"}, - {"2a01:c9c0:af::/48", "8891"}, - {"2a04:7180::/32", "28717"}, - {"2404:bf40:a441::/48", "7545"}, - {"2409:8053:2100::/37", "9808"}, - {"2409:8904:5fb0::/34", "24547"}, - {"240e:104:5000::/34", "4134"}, - {"2610:130:100::/40", "2698"}, - {"2620:171:1d::/48", "715"}, - {"2803:f00:64b::/48", "262182"}, - {"2804:104c:e000::/40", "263629"}, - {"2001:df0:2b40::/48", "149179"}, - {"2604:d600:15f4::/44", "32098"}, - {"2001:fd0:301::/37", "10029"}, - {"2001:12e0:200::/40", "10429"}, - {"2404:f4c0:f9c0::/48", "142281"}, - {"2405:8a00:2111::/40", "55824"}, - {"240a:a25c::/32", "143254"}, - {"2605:a401:8241::/40", "33363"}, - {"2803:9c60:a000::/33", "46198"}, - {"2804:39b0::/32", "266044"}, - {"2804:40cc::/32", "265982"}, - {"2001:250:340b::/45", "138393"}, - {"2001:678:5a8::/48", "8387"}, - {"240e:678:1a00::/34", "140330"}, - {"2a00:c2e0::/39", "30919"}, - {"2a06:e3c0::/29", "62159"}, - {"2a11:5702:b00b::/48", "212149"}, - {"2402:e000:2::/47", "24499"}, - {"240e:db:b801::/33", "4134"}, - {"2a12:fe00::/29", "206170"}, - {"2001:df1:9580::/48", "138433"}, - {"2405:400::/32", "24439"}, - {"2405:6e00:f830::/48", "133612"}, - {"2b10:3c84::/30", "53820"}, - {"240e:90d:f800::/30", "4134"}, - {"2803:f60::/32", "269832"}, - {"2804:6198::/32", "269244"}, - {"2001:4f8:12::/32", "1280"}, - {"2407:d340:f020::/44", "142586"}, - {"2409:8020:1011::/42", "56046"}, - {"2408:865c::/31", "4837"}, - {"2804:505c::/32", "268384"}, - {"2a04:c480::/29", "34241"}, - {"2400:fc00:8d20::/41", "45773"}, - {"2405:ba00:8efe::/48", "23885"}, - {"2a11:6f40::/29", "1239"}, - {"2001:df0:43::/48", "38629"}, - {"240a:a7c1::/32", "144635"}, - {"240a:ac5a::/32", "145812"}, - {"2804:352c::/32", "262662"}, - {"2a00:a7e0::/48", "200741"}, - {"2a04:4e40:1a00::/48", "54113"}, - {"2600:140f:c01::/39", "20940"}, - {"2604:cac0:118::/48", "11019"}, - {"2803:4120:50::/48", "64108"}, - {"2804:14c:4c8::/42", "28573"}, - {"2a0e:cd00::/37", "23031"}, - {"2001:470:f9::/39", "6939"}, - {"2001:559:30e::/48", "33650"}, - {"2001:559:8365::/48", "33660"}, - {"240e:b2:f000::/29", "4134"}, - {"2605:a880:8000::/48", "46261"}, - {"2a02:e300::/48", "60280"}, - {"2a0f:3980::/29", "202543"}, - {"2a10:4e80::/29", "203012"}, - {"2001:559:7c1::/48", "7016"}, - {"2001:559:c025::/46", "7922"}, - {"2001:da8:7013::/48", "138371"}, - {"2405:1c0:6271::/46", "55303"}, - {"2602::/24", "209"}, - {"2605:1980:401::/48", "13767"}, - {"2606:1980::/46", "54994"}, - {"2804:3e4c::/32", "266586"}, - {"2804:7784::/32", "271183"}, - {"2806:2f0:4401::/46", "17072"}, - {"2a0e:6b40::/48", "207580"}, - {"2403:5f40:ca05::/48", "16509"}, - {"2600:1405:5001::/37", "20940"}, - {"2600:9000:2334::/44", "16509"}, - {"2804:3d74:102::/48", "266532"}, - {"2a02:582:4c00::/35", "6799"}, - {"2a02:890::/32", "5631"}, - {"2a02:2430:80::/32", "39869"}, - {"2001:df5:b700::/48", "131418"}, - {"2804:6480::/32", "269431"}, - {"2a02:26f7:bf90::/48", "36183"}, - {"2001:559:5bd::/48", "22909"}, - {"2001:559:8635::/48", "33651"}, - {"2001:579:a11d::/41", "22773"}, - {"2001:fe8:8110::/47", "24435"}, - {"2001:1a68::/47", "15694"}, - {"2408:8459:6030::/41", "17622"}, - {"2409:807e:2c00::/35", "9808"}, - {"2804:629c::/32", "269307"}, - {"2001:559:74::/48", "33659"}, - {"2600:6c20:6d::/43", "20115"}, - {"2a0d:3c45::/32", "51659"}, - {"2001:559:8464::/48", "7015"}, - {"2001:678:d24::/48", "15830"}, - {"2001:16b8:1900::/37", "8881"}, - {"2406:38c0::/32", "140449"}, - {"240e:3b4:ec00::/35", "140314"}, - {"2a02:26f7:de45::/46", "20940"}, - {"2001:559:c215::/48", "7922"}, - {"2620:13f:700f::/48", "59116"}, - {"2804:28e4:e02a::/36", "28260"}, - {"2a0c:af00:f5a1::/48", "205321"}, - {"240a:ac32::/32", "145772"}, - {"2600:9000:238e::/48", "16509"}, - {"2a09:140::/29", "26636"}, - {"2001:44b8:204a::/45", "7545"}, - {"2405:206::/31", "55836"}, - {"2409:8710:2400::/30", "9808"}, - {"2600:1006:a020::/40", "22394"}, - {"2607:cf00::/30", "32522"}, - {"2001:67c:2248::/48", "31382"}, - {"2600:100a:b030::/44", "22394"}, - {"2607:4e00::/32", "10674"}, - {"2001:559:1e9::/48", "33662"}, - {"2001:559:588::/48", "33657"}, - {"2001:df1:3b00::/48", "134750"}, - {"2603:f340::/29", "397165"}, - {"2607:4b00::/32", "4307"}, - {"2803:4840::/32", "263757"}, - {"2804:221c::/32", "264592"}, - {"2402:800:3d7f::/40", "7552"}, - {"2404:e000::/32", "17673"}, - {"240a:a5d4::/32", "144142"}, - {"2600:1901:c0d0::/39", "15169"}, - {"2606:cb00:17::/48", "6643"}, - {"2804:8228::/32", "272502"}, - {"2408:8456:bc10::/42", "134543"}, - {"2620:149:a1a::/48", "6185"}, - {"2800:160:1ff5::/46", "14259"}, - {"2804:ad0::/32", "262773"}, - {"2804:b0c:f005::/36", "52935"}, - {"2804:2fe8::/32", "264920"}, - {"2806:264:4501::/48", "13999"}, - {"2a02:26f7:e6cc::/48", "36183"}, - {"2a0e:1d00::/32", "21263"}, - {"2001:250:806::/47", "23910"}, - {"2001:1248:9707::/44", "11172"}, - {"2800:485:fe00::/48", "14080"}, - {"2804:3b6c:c010::/45", "266148"}, - {"2001:67c:21d0::/48", "35096"}, - {"240a:ac5f::/32", "145817"}, - {"2607:fcd0:105:6c00::/46", "8100"}, - {"2001:18b8:116::/44", "29789"}, - {"2408:84f3:f890::/37", "17816"}, - {"2409:8e0c::/30", "56042"}, - {"2600:1407:9001::/37", "20940"}, - {"2600:1415:2401::/36", "20940"}, - {"2600:6c38:ac::/43", "20115"}, - {"2620:74:78::/48", "30060"}, - {"2a00:b920::/32", "60422"}, - {"2001:559:28a::/48", "7922"}, - {"2001:67c:83c::/48", "24840"}, - {"2a0b:8f80:200::/48", "200746"}, - {"2c0f:f738:3801::/46", "61317"}, - {"2001:559:3a9::/48", "7922"}, - {"2001:c20:c856::/48", "9255"}, - {"2402:800:f660::/40", "7552"}, - {"2405:8a00:c013::/42", "55824"}, - {"240a:aa45::/32", "145279"}, - {"2602:fbde:253::/48", "26057"}, - {"2620:118:c080::/42", "237"}, - {"2400:9380:8020::/47", "4134"}, - {"2401:ea00::/44", "55501"}, - {"2604:1740::/32", "37353"}, - {"2a03:6947:e00::/39", "61266"}, - {"2001:250:781d::/48", "23910"}, - {"2001:559:45e::/48", "7922"}, - {"2400:adc0:100::/48", "9541"}, - {"2600:140a:e001::/31", "20940"}, - {"2604:b900:6000::/36", "40900"}, - {"2803:6810::/32", "271829"}, - {"2a00:7320::/29", "49191"}, - {"2a02:26f7:ef44::/48", "36183"}, - {"2001:559:8599::/48", "7725"}, - {"2001:67c:1328::/48", "199268"}, - {"2409:8914:c00::/38", "56044"}, - {"2602:fc5d:573::/48", "399866"}, - {"2607:fad8:1101::/32", "22652"}, - {"2607:fe28:2030::/40", "53347"}, - {"2610:1c8:1c::/32", "23393"}, - {"2804:524c::/32", "268509"}, - {"2001:1248:98d0::/45", "11172"}, - {"2402:e580:10::/32", "40138"}, - {"2600:141a:8001::/31", "20940"}, - {"2804:1bc:115::/32", "10310"}, - {"2804:1a90::/32", "61868"}, - {"2804:259c:ab00::/35", "52772"}, - {"2a04:9a00:1114::/48", "198730"}, - {"2a0b:fac0::/29", "51920"}, - {"2001:250:240e::/48", "23910"}, - {"2001:dc8:3000::/48", "23962"}, - {"2407:62c0::/32", "38854"}, - {"2804:47ac::/32", "267070"}, - {"2001:559:80f7::/48", "33651"}, - {"2402:2400::/33", "9226"}, - {"2804:354::/44", "262874"}, - {"2a00:1728:2d::/48", "43548"}, - {"2a01:6ea0::/32", "199880"}, - {"2a02:26f7:c401::/46", "20940"}, - {"2a0e:eec5::/32", "62240"}, - {"2a0f:afc0::/29", "50782"}, - {"2001:678:264::/48", "16509"}, - {"2406:3003:1030::/41", "55430"}, - {"240a:a690::/32", "144330"}, - {"240e:3ba:c800::/37", "4134"}, - {"2c0f:ec98::/32", "328278"}, - {"2001:4de0:1006::/48", "50525"}, - {"2607:f870:2::/32", "11992"}, - {"2a07:bbc0::/48", "207085"}, - {"2c0f:f7b8::/32", "327824"}, - {"2404:ae00:ff27::/48", "45474"}, - {"2603:f430::/25", "397165"}, - {"2804:6e10::/32", "270573"}, - {"2a10:fb80::/29", "211969"}, - {"2401:d800:930::/41", "7552"}, - {"2409:8904:9290::/39", "24547"}, - {"240a:a4e4::/32", "143902"}, - {"240a:ad52::/32", "146060"}, - {"2804:63dc::/32", "269388"}, - {"2408:8456:7e40::/39", "17816"}, - {"2a00:fbe0::/32", "62113"}, - {"2a02:26f0:4e01::/35", "20940"}, - {"2001:610:120::/48", "1104"}, - {"2001:67c:153c::/48", "3301"}, - {"2409:8087:3001::/44", "9808"}, - {"2409:8d14:2100::/38", "56044"}, - {"2a02:26f7:c149::/46", "20940"}, - {"2001:678:ca0::/48", "58299"}, - {"2403:300:a0d::/48", "714"}, - {"2408:8957:3e00::/40", "17622"}, - {"240a:ade7::/32", "146209"}, - {"2800:5b0::/32", "27975"}, - {"2a04:9bc0::/29", "62186"}, - {"2a06:6541:3081::/48", "3549"}, - {"2a11:9080::/29", "204790"}, - {"2400:adcc:1000::/39", "9541"}, - {"2408:840d:d000::/42", "17621"}, - {"2607:4a80::/32", "3778"}, - {"2804:14c:bb91::/42", "28573"}, - {"240a:a6c5::/32", "144383"}, - {"2800:160:23e9::/37", "14259"}, - {"2a00:c020:1000::/34", "200414"}, - {"2001:44c8:4000::/41", "131445"}, - {"2800:160:1e82::/43", "14259"}, - {"2a00:96c0::/32", "198538"}, - {"2402:3a80:172b::/45", "38266"}, - {"2402:4000:b193::/42", "18001"}, - {"2804:eec:2000::/33", "28226"}, - {"2a00:9220::/32", "49867"}, - {"2001:df4:4980::/48", "140463"}, - {"2408:8256:3b60::/44", "17623"}, - {"2606:a400::/32", "11922"}, - {"2a00:1288:7c::/48", "43428"}, - {"2001:559:8278::/48", "33651"}, - {"2001:1b60::/29", "31103"}, - {"2409:8c70:3ad9::/32", "9808"}, - {"240a:a658::/32", "144274"}, - {"2606:2800:4006::/44", "15133"}, - {"2804:32a8::/32", "265091"}, - {"2001:1998:700::/36", "7843"}, - {"2400:aa00:4300::/32", "9873"}, - {"2401:4900:3da0::/44", "45609"}, - {"2401:5840:400::/32", "132113"}, - {"2408:8956:1000::/40", "17622"}, - {"2409:8020:3028::/43", "56046"}, - {"2409:8061:900::/35", "9808"}, - {"240e:85:8800::/30", "4134"}, - {"2a0d:f540::/29", "56786"}, - {"2400:a980:28ff::/48", "133111"}, - {"2409:4054:3000::/31", "55836"}, - {"240a:a561::/32", "144027"}, - {"2804:7c00::/32", "271469"}, - {"2a02:4020::/48", "60094"}, - {"2a03:6b00:b::/32", "48832"}, - {"240a:a723::/32", "144477"}, - {"2804:14c:9900::/40", "28573"}, - {"2a05:1280::/29", "200647"}, - {"2a0d:5380::/29", "204818"}, - {"2001:250:3423::/45", "138393"}, - {"2001:370::/44", "9607"}, - {"2001:579:6220::/43", "22773"}, - {"2001:4898::/32", "3598"}, - {"2409:8002:2c00::/31", "9808"}, - {"2604:2800:fff2::/44", "26793"}, - {"2a03:f080:1001::/37", "42685"}, - {"2a11:ee00::/29", "204790"}, - {"2c0f:f7a8:9220::/48", "4809"}, - {"2409:805c:3061::/43", "9808"}, - {"240a:a2b0::/32", "143338"}, - {"2602:fc23:120::/44", "60438"}, - {"2803:ecc0:3d00::/32", "264814"}, - {"2804:6854::/32", "269685"}, - {"2001:678:494::/48", "42135"}, - {"2406:9dc0:1010::/48", "141747"}, - {"2409:803c:900::/37", "9808"}, - {"2804:57c:c00::/32", "262517"}, - {"2804:532c:8900::/33", "268568"}, - {"2a02:888:8048::/47", "48695"}, - {"2a02:f68::/29", "15542"}, - {"2001:559:84cd::/48", "33650"}, - {"2001:b030:ae00::/31", "3462"}, - {"2602:803:5000::/48", "30330"}, - {"2a02:26f0:6101::/40", "20940"}, - {"2a07:9e40::/29", "1902"}, - {"2001:da8:3000::/45", "24358"}, - {"2402:800:399b::/41", "7552"}, - {"2806:2f0:9563::/40", "17072"}, - {"2001:559:54e::/48", "7922"}, - {"2001:559:5d1::/48", "33287"}, - {"2401:4900:52b0::/44", "45609"}, - {"240e:44d:6780::/41", "4134"}, - {"2803:fe10::/32", "271982"}, - {"2a10:b340::/29", "211629"}, - {"2804:71b0:ff00::/40", "270805"}, - {"2409:8730:8000::/33", "9808"}, - {"2804:6570::/33", "269490"}, - {"2a00:1760::/30", "42772"}, - {"2a02:6680:11f0::/44", "16116"}, - {"2a02:26f7:d44c::/48", "36183"}, - {"2a09:bac0:19::/48", "13335"}, - {"2a0f:9400:8004::/48", "208393"}, - {"2409:8914:b800::/39", "56044"}, - {"2a02:4e0:2100::/41", "16135"}, - {"2a02:a00:e::/47", "15987"}, - {"2a06:5680::/29", "210947"}, - {"2a09:bac0:184::/47", "13335"}, - {"2a0e:2580::/29", "197915"}, - {"2a0e:b107:1520::/48", "38173"}, - {"2001:559:786::/48", "33491"}, - {"2001:67c:2e38::/48", "31424"}, - {"2402:800:519b::/41", "7552"}, - {"2600:1406:46::/48", "20940"}, - {"2620:103:e049::/48", "16711"}, - {"2a00:cb20:1200::/34", "60266"}, - {"2a02:26f7:ce41::/46", "20940"}, - {"2a0a:7540:4::/29", "206066"}, - {"2001:468:1500::/40", "81"}, - {"2804:0:6c01::/32", "2716"}, - {"2a00:dd0:aaab::/35", "47869"}, - {"2a02:26f7:bbc6::/47", "20940"}, - {"2a03:f80:354::/48", "50613"}, - {"2001:250:2c06::/44", "138381"}, - {"2001:559:87b5::/48", "33650"}, - {"2400:9380:9205::/46", "4809"}, - {"2402:800:b620::/41", "7552"}, - {"2600:1419:1001::/38", "20940"}, - {"2001:678:984::/48", "207910"}, - {"240e:97c:5000::/32", "4134"}, - {"2610:20:8420::/47", "3477"}, - {"2610:a1:3040::/48", "12008"}, - {"2804:5108::/32", "268426"}, - {"2001:67c:12bc::/48", "199249"}, - {"2001:848::/32", "2595"}, - {"2001:4c28:1::/48", "39832"}, - {"2804:4870:1b1::/46", "267121"}, - {"2001:67c:13b8::/48", "196957"}, - {"2001:1248:845d::/42", "11172"}, - {"2804:470::/32", "53108"}, - {"2c0f:f700::/32", "327726"}, - {"2408:84eb::/29", "4837"}, - {"2610:20:8000::/43", "6629"}, - {"2a00:1630::/33", "49544"}, - {"2a07:2800::/29", "21473"}, - {"2400:c700:188::/38", "55644"}, - {"2401:d800:2770::/40", "7552"}, - {"2408:8456:cb40::/40", "17816"}, - {"240a:a3ec::/32", "143654"}, - {"2602:fdaa::/48", "27385"}, - {"2803:420::/32", "28120"}, - {"2a10:4ec0::/29", "57353"}, - {"2404:3d00:40c0::/46", "3573"}, - {"2a01:4020:3::/45", "25369"}, - {"2a02:26f7:b881::/46", "20940"}, - {"2a0d:2586::/47", "213115"}, - {"2001:1248:9cfe::/47", "11172"}, - {"240a:a659::/32", "144275"}, - {"2800:2a0:ffff::/48", "27947"}, - {"2803:6700::/47", "263210"}, - {"2804:3a28:4000::/34", "266074"}, - {"2804:8588::/32", "268186"}, - {"2a03:f003:400::/34", "25472"}, - {"2408:8456:800::/42", "17622"}, - {"240e:44d:7b80::/41", "4134"}, - {"2606:7980::/32", "54182"}, - {"2804:5978::/32", "268704"}, - {"2a09:eac0::/32", "205718"}, - {"2001:550:2100:300::/44", "174"}, - {"2001:6d0:6d08::/48", "205022"}, - {"2800:680:11::/48", "263719"}, - {"2803:4d60::/32", "269768"}, - {"2804:24e0::/32", "264246"}, - {"2804:67ac::/45", "269643"}, - {"2001:559:725::/48", "7015"}, - {"2403:5700::/47", "2497"}, - {"240a:afd9::/32", "146707"}, - {"2600:6c20:29::/43", "20115"}, - {"2804:5dc::/41", "53019"}, - {"2a00:cb00::/32", "25144"}, - {"2c0f:e8b0::/32", "327712"}, - {"2c0f:f7e8::/47", "62217"}, - {"2001:678:94::/48", "42"}, - {"240a:a92c::/32", "144998"}, - {"2804:7a94:2100::/32", "271380"}, - {"2804:7fb4:7f00::/32", "271704"}, - {"2001:df3:5b80::/48", "140389"}, - {"2602:ff64::/36", "3900"}, - {"2a02:26f7:bf04::/48", "36183"}, - {"2404:bf40:a5c2::/38", "139084"}, - {"240e:109:8021::/48", "4811"}, - {"2610:f0:21f::/39", "22925"}, - {"2a02:6c8:8000::/33", "202425"}, - {"2a03:53e0::/32", "49223"}, - {"240a:a1b3::/32", "143085"}, - {"2600:100b:9110::/34", "6167"}, - {"2607:fca8:b100::/33", "17139"}, - {"2a09:6bc0::/29", "51920"}, - {"2001:44b8:4066::/48", "7545"}, - {"2402:9e80:9::/48", "135103"}, - {"240e:965:8c00::/35", "4134"}, - {"2a01:7820::/32", "9063"}, - {"2a0c:ac80::/29", "201863"}, - {"2a0d:4d00:82::/47", "44794"}, - {"2001:559:8560::/48", "7922"}, - {"2804:2a74::/32", "52948"}, - {"2a0e:8f02:2140::/48", "211414"}, - {"2602:ff79::/32", "30257"}, - {"2602:ffd9:400::/40", "62874"}, - {"2804:390::/36", "52956"}, - {"2806:1080::/39", "8151"}, - {"2c0f:ed08::/32", "327764"}, - {"2001:559:c1eb::/48", "33650"}, - {"2001:4bb0::/32", "41497"}, - {"2400:8240::/32", "38719"}, - {"2408:882c::/32", "4837"}, - {"2409:8d15:1a00::/34", "56044"}, - {"2804:14d:a600::/40", "28573"}, - {"2a01:5a8:8::/48", "211526"}, - {"2a02:26f7:cf48::/48", "36183"}, - {"2001:559:7c5::/46", "7922"}, - {"2408:8957:7400::/40", "17622"}, - {"2409:8715:9800::/30", "56044"}, - {"2804:19c8:1007::/44", "61818"}, - {"2804:82e8::/32", "272164"}, - {"2a00:10e8::/46", "44574"}, - {"2a02:a68::/32", "39574"}, - {"2a02:26f7:e9cd::/42", "20940"}, - {"2a07:e740::/32", "43299"}, - {"2405:4803:d4c4::/36", "18403"}, - {"2408:8459:e050::/38", "17816"}, - {"2804:3ed0:1240::/32", "266622"}, - {"2804:7a48::/32", "271362"}, - {"2a06:4800::/32", "209283"}, - {"2001:559:40a::/48", "21508"}, - {"2001:559:56a::/47", "7015"}, - {"2001:df1:4600::/48", "4826"}, - {"2a04:4b00::/29", "12843"}, - {"2001:4830:2070::/48", "25623"}, - {"2602:fe76::/36", "399032"}, - {"2606:6c00:201::/48", "32787"}, - {"2001:7c0:2310::/44", "34878"}, - {"2408:8256:398e::/43", "17623"}, - {"2607:4000:400::/40", "73"}, - {"2a02:26f7:79::/48", "20940"}, - {"2001:b70::/32", "25061"}, - {"240a:af64::/32", "146590"}, - {"2804:234::/32", "262731"}, - {"2a00:1b30::/32", "25478"}, - {"2404:2440:d0d0::/48", "138521"}, - {"2409:8030:3100::/36", "9808"}, - {"240e:3bf:2800::/38", "4134"}, - {"2c0f:ed18::/32", "328200"}, - {"2c0f:f5c0:481::/46", "29465"}, - {"2001:fb0:109e::/48", "55476"}, - {"2404:bf40:8602::/41", "139084"}, - {"2405:9800:c642::/40", "45430"}, - {"240a:a002::/32", "142652"}, - {"240a:a449::/32", "143747"}, - {"2804:e0c:40::/48", "28176"}, - {"2001:559:55c::/48", "20214"}, - {"2001:559:828c::/47", "33660"}, - {"2001:7f8:94::/48", "51225"}, - {"2606:8e80:5001::/37", "32133"}, - {"2804:e0c:300::/48", "28176"}, - {"2a09:b280:ffbb::/45", "210025"}, - {"2a11:5e80::/29", "204790"}, - {"2400:cb00:190::/44", "13335"}, - {"2404:9dc0:cd01::/48", "138699"}, - {"2409:8020:3072::/47", "56046"}, - {"240a:ac79::/32", "145843"}, - {"2001:559:8223::/48", "33287"}, - {"2404:8d02:1053::/34", "9587"}, - {"2409:8d7d::/30", "9808"}, - {"240a:a85a::/32", "144788"}, - {"2600:1009:f110::/30", "22394"}, - {"2602:804:1006::/44", "14536"}, - {"2a09:d2c1:9::/48", "207530"}, - {"2001:67c:6c0::/48", "34984"}, - {"2001:df7:1180::/48", "138277"}, - {"240a:af2e::/32", "146536"}, - {"2610:100::/32", "8047"}, - {"2804:286c::/32", "262799"}, - {"2804:4760::/32", "267050"}, - {"2804:4a8c::/39", "267248"}, - {"2a02:26f7:f0c0::/48", "36183"}, - {"2001:480:501::/48", "37"}, - {"2001:559:84ec::/48", "33287"}, - {"2001:1248:442c::/43", "11172"}, - {"2404:e801:100f::/43", "55430"}, - {"2803:7d80:5011::/42", "11664"}, - {"2a0e:8f02:f034::/48", "211153"}, - {"240a:af50::/32", "146570"}, - {"240a:aff1::/32", "146731"}, - {"2a02:e80::/32", "39823"}, - {"2001:559:26b::/48", "7015"}, - {"2408:8347:1200::/28", "4837"}, - {"2a02:26f7:be51::/42", "20940"}, - {"2001:550:9001::/45", "174"}, - {"2001:559:82ee::/48", "7015"}, - {"2408:8956:f840::/40", "17622"}, - {"240e:108:1191::/45", "63835"}, - {"240e:97e:8000::/33", "4134"}, - {"2600:6c20:888::/43", "20115"}, - {"2a02:26f7:d195::/42", "20940"}, - {"2a09:4fc0::/48", "209562"}, - {"2001:19d0:306::/37", "2044"}, - {"2400:a980:1900::/37", "133111"}, - {"2602:ffce:31::/36", "63019"}, - {"2606:3380:ffff::/48", "53334"}, - {"2a00:db0::/32", "9092"}, - {"2a09:be40:1140::/45", "208755"}, - {"2001:520:5031::/48", "8103"}, - {"2402:800:3bc5::/43", "7552"}, - {"2408:8957:1dc0::/38", "17622"}, - {"2600:350f:3000::/32", "396998"}, - {"2a00:1778::/32", "42252"}, - {"2a04:16c0:200::/48", "24971"}, - {"2001:67c:278::/48", "51278"}, - {"2402:800:b860::/40", "7552"}, - {"2a0e:b107:5c0::/48", "213366"}, - {"2001:559:c504::/48", "7922"}, - {"2408:8459:4830::/41", "17622"}, - {"2409:8c85:aa05::/44", "9808"}, - {"2600:370f:3661::/45", "32261"}, - {"2605:3380:4156::/42", "12025"}, - {"2620:171:4::/48", "42"}, - {"2806:2a0:1000::/40", "28548"}, - {"2600:100e:b070::/36", "6167"}, - {"2600:6c10:142::/45", "20115"}, - {"2604:d7c0::/32", "11114"}, - {"2804:621c::/32", "269276"}, - {"2a0c:2040::/29", "47447"}, - {"2a10:a40::/32", "207271"}, - {"2001:67c:5bc::/48", "197915"}, - {"2400:fc00:70::/36", "45773"}, - {"2804:25b0::/32", "264295"}, - {"2804:43a0::/34", "267580"}, - {"2a01:b980::/32", "57228"}, - {"2a02:26f7:f444::/48", "36183"}, - {"2001:1520::/46", "8972"}, - {"2600:9000:a600::/43", "16509"}, - {"2804:1eb0::/32", "264444"}, - {"2804:29b0::/36", "61577"}, - {"2a02:26f7:e708::/48", "36183"}, - {"2001:4d0:2419::/48", "297"}, - {"2804:2974:b000::/33", "264016"}, - {"2804:43cc::/32", "267590"}, - {"2001:559:c112::/48", "33657"}, - {"2001:da8:e818::/46", "138373"}, - {"2600:9000:a210::/47", "16509"}, - {"2800:160:1c76::/40", "14259"}, - {"2800:bf0:8169::/40", "27947"}, - {"2a03:3b00:1::/46", "202053"}, - {"2a0e:b107:d91::/48", "213244"}, - {"2001:df3:8b80::/48", "139726"}, - {"2408:84f3:a040::/38", "17816"}, - {"2409:802f:2904::/48", "56041"}, - {"2604:3a00::/32", "33069"}, - {"2a01:4a0:c::/46", "201011"}, - {"2a03:7380:5c00::/42", "13188"}, - {"2a0c:e600::/29", "197036"}, - {"2a11:2b07:f000::/47", "210892"}, - {"2001:df4:e780::/48", "141206"}, - {"2400:1700:201::/44", "4628"}, - {"2406:4440:10::/48", "142641"}, - {"2804:40a0:acc2::/47", "265971"}, - {"2001:67c:1a4::/48", "15879"}, - {"2001:67c:2844::/48", "51458"}, - {"2406:840:eddd::/48", "38173"}, - {"2a02:26f7:ce04::/48", "36183"}, - {"2a0b:9400:1000::/48", "209505"}, - {"2a12:7d40::/32", "210035"}, - {"2001:129c:6000::/32", "22356"}, - {"2804:6834::/32", "269676"}, - {"2a03:1d20::/32", "201704"}, - {"2403:f440::/32", "134869"}, - {"2620:122:8001::/48", "393490"}, - {"2620:171:9f::/48", "42"}, - {"2001:480:b1::/39", "668"}, - {"2001:678:b50::/48", "62009"}, - {"2804:3d00::/32", "266247"}, - {"2a02:188:5402::/34", "31027"}, - {"2a02:26f7:dc05::/46", "20940"}, - {"2a04:cec0:1400::/29", "5410"}, - {"2a10:6080::/29", "33770"}, - {"2001:550:d09::/45", "174"}, - {"2406:9dc0:30::/44", "213262"}, - {"2001:559:c239::/48", "33650"}, - {"2409:8924:8900::/38", "56046"}, - {"2806:20d:5913::/40", "32098"}, - {"2401:d800:7010::/42", "7552"}, - {"240e:378:ac00::/33", "4134"}, - {"2600:140a:6001::/32", "20940"}, - {"2604:f980:2d00::/40", "19957"}, - {"2607:f330:a001::/46", "15130"}, - {"2001:559:86ed::/48", "22909"}, - {"2408:8459:1950::/38", "17816"}, - {"2600:1008:9010::/40", "22394"}, - {"2607:f368:2c00::/40", "46846"}, - {"2a04:5c85:f000::/47", "200584"}, - {"2a0e:97c0:a10::/47", "206895"}, - {"2401:d800:2fa0::/41", "7552"}, - {"2408:8957:e600::/40", "17622"}, - {"2806:2f0:30c1::/46", "17072"}, - {"2a00:fa00::/32", "12926"}, - {"2600:1001:b0d0::/44", "6167"}, - {"2800:830::/31", "19114"}, - {"2a0e:fd45:d90::/44", "44103"}, - {"2a11:7e00::/32", "43624"}, - {"2401:d800:77e0::/36", "7552"}, - {"2408:8256:3d9f::/28", "17816"}, - {"240a:a5c4::/32", "144126"}, - {"2804:4ab8::/32", "7155"}, - {"2a0b:640:4::/30", "35236"}, - {"2001:df0:220::/48", "55684"}, - {"2001:1b75:2000::/36", "28852"}, - {"2001:4878:2356::/48", "12222"}, - {"2404:f801:8021::/44", "3598"}, - {"2607:ffc8::/62", "17356"}, - {"2a03:f80:30::/48", "8280"}, - {"2a0d:4300::/47", "204920"}, - {"2a0d:6640::/29", "40970"}, - {"2a10:7f40::/29", "202505"}, - {"2001:678:2a0::/48", "35292"}, - {"2604:6940:100::/36", "11006"}, - {"2620:101:e000::/47", "46646"}, - {"2a02:ff0:2800::/40", "12735"}, - {"2a02:50c0:a000::/29", "29355"}, - {"2a0b:2f40::/32", "52176"}, - {"2a0c:79c0:2::/48", "12779"}, - {"2a0e:8900::/29", "44205"}, - {"2806:2f0:9821::/46", "17072"}, - {"2001:678:758::/48", "202144"}, - {"2001:1a11:10a::/48", "8781"}, - {"2408:8256:2f6c::/48", "17623"}, - {"2408:8957:f2c0::/37", "17816"}, - {"2409:8b71::/29", "9808"}, - {"2606:2800:4a1c::/46", "15133"}, - {"2804:2924::/32", "264000"}, - {"2806:230:402a::/48", "265594"}, - {"2a05:dfc7:30::/48", "36351"}, - {"2001:250:7032::/48", "24370"}, - {"2001:559:848d::/48", "7016"}, - {"2400:cb00:a130::/45", "13335"}, - {"240a:ae29::/32", "146275"}, - {"2606:7400::/32", "19310"}, - {"2803:9800:b039::/40", "11664"}, - {"2804:4b0:388::/43", "262459"}, - {"2001:67c:2b58::/48", "41980"}, - {"240a:a6ac::/32", "144358"}, - {"2604:4500:903::/40", "29802"}, - {"2605:bb00:8000::/35", "32940"}, - {"2800:160:17ab::/43", "14259"}, - {"2a02:26f7:f001::/46", "20940"}, - {"2a0e:b107:198::/48", "207740"}, - {"2001:67c:2030::/48", "33817"}, - {"2402:800:9871::/40", "7552"}, - {"240a:a48f::/32", "143817"}, - {"2602:fc38::/48", "6315"}, - {"2602:ff70::/36", "394367"}, - {"2604:e140::/32", "30174"}, - {"2804:2210::/32", "264589"}, - {"2a01:8ee0::/32", "50295"}, - {"2a04:4e41:53::/44", "54113"}, - {"2406:7ac0::/32", "141078"}, - {"240e:10:a800::/31", "4134"}, - {"2600:6c3a:401::/46", "20115"}, - {"2607:b600:12::/47", "10397"}, - {"2804:53b0:4::/33", "268600"}, - {"2a0e:e980::/29", "60781"}, - {"2001:da8:300e::/48", "24358"}, - {"2402:800:f8c2::/42", "7552"}, - {"2406:8540::/45", "141202"}, - {"2604:880:200::/45", "29802"}, - {"2606:2800:6a68::/48", "15133"}, - {"2607:f6f0:6002::/40", "27566"}, - {"2804:2728:8202::/33", "263880"}, - {"2804:3eec::/32", "266629"}, - {"2a00:801:4b::/48", "41819"}, - {"2a00:6901:1002::/47", "20926"}, - {"2001:559:809f::/48", "7922"}, - {"2408:8a26:c000::/35", "4837"}, - {"240a:ab9f::/32", "145625"}, - {"240e:3b9:d000::/36", "134772"}, - {"2803:2540:13::/40", "264668"}, - {"2a00:ed0::/32", "8426"}, - {"2c0f:fc60::/32", "30988"}, - {"2a06:a004:7000::/36", "61138"}, - {"2001:559:c43a::/48", "22909"}, - {"240a:a2f9::/32", "143411"}, - {"2806:2f0:9861::/46", "17072"}, - {"2a00:c340::/32", "57951"}, - {"2001:559:c34c::/48", "33287"}, - {"240a:a5f8::/32", "144178"}, - {"2a03:be80:d::/43", "15510"}, - {"2a05:6200:74::/48", "60068"}, - {"2c0f:fcb0:4000::/35", "36916"}, - {"2400:9700:111::/42", "24550"}, - {"2400:cb00:388::/48", "13335"}, - {"2804:6cc:8a00::/33", "262607"}, - {"2a02:26f7:d6c8::/48", "36183"}, - {"2a09:2340::/29", "43260"}, - {"2a02:26f7:c14d::/46", "20940"}, - {"2a11:8140::/29", "211199"}, - {"2400:cb00:a840::/48", "13335"}, - {"2401:4900:1a50::/44", "45609"}, - {"2406:2400:f1f0::/48", "45287"}, - {"240a:a99e::/32", "145112"}, - {"2801:80:25f0::/48", "268716"}, - {"2804:4010::/32", "265931"}, - {"2804:47a4::/32", "267067"}, - {"2804:68bc::/32", "269712"}, - {"2a02:2e02:d30::/41", "12479"}, - {"2001:13c7:7005::/44", "30133"}, - {"2400:3840:8000::/35", "23860"}, - {"2804:2508::/32", "264254"}, - {"2a10:5c0::/29", "201299"}, - {"2001:df5:8000::/48", "58885"}, - {"2406:1600::/38", "23871"}, - {"240e:1d:4000::/36", "136190"}, - {"2600:380:6880::/41", "7018"}, - {"2804:b4::/32", "28294"}, - {"2a02:ee80:4171::/45", "3573"}, - {"2a0a:d80::/29", "206795"}, - {"2a0e:aa07:e02b::/48", "210384"}, - {"2401:4900:1b80::/43", "45609"}, - {"2408:8456:a240::/37", "17816"}, - {"240e:3b4:9c00::/34", "140310"}, - {"2602:fe19:4005::/43", "26073"}, - {"2001:559:c3c9::/48", "7015"}, - {"2804:7d80::/32", "271565"}, - {"2a02:26f7:dbc8::/48", "36183"}, - {"2a05:9c00::/29", "47626"}, - {"2401:4900:4990::/42", "45609"}, - {"240e:900:100::/30", "4134"}, - {"2606:1400::/32", "10732"}, - {"2a03:1e82:90ff::/48", "2856"}, - {"2a0c:e640:6001::/46", "17830"}, - {"2600:2c01:3000::/33", "16858"}, - {"2a02:26f7:c891::/46", "20940"}, - {"2001:678:4b0::/48", "197942"}, - {"2001:df6:ff80::/48", "141818"}, - {"2408:8956:b500::/40", "17816"}, - {"2804:2bf0::/32", "262740"}, - {"2806:2f0:2041::/48", "22884"}, - {"2620:110:5000::/44", "6623"}, - {"2800:160:196f::/40", "14259"}, - {"2a03:1380::/32", "12423"}, - {"240e:9b:f00f::/43", "140250"}, - {"2620:1ec:90c::/48", "8068"}, - {"2803:9800:9995::/46", "11664"}, - {"2001:b08:13::/48", "51352"}, - {"2404:7a40:2000::/46", "132556"}, - {"2600:1419:3001::/38", "20940"}, - {"2606:2800:6037::/48", "14153"}, - {"2409:8907:7220::/39", "24547"}, - {"2a05:8900:28::/48", "199159"}, - {"2001:1248:99ff::/38", "11172"}, - {"240a:a934::/32", "145006"}, - {"2620:74:1b::/48", "397226"}, - {"2803:9800:a039::/40", "11664"}, - {"2804:14d:baa8::/41", "28573"}, - {"240a:a417::/32", "143697"}, - {"2804:6b78::/32", "270402"}, - {"2a01:1d8::/29", "8508"}, - {"2001:490:4008::/48", "1248"}, - {"2001:67c:245c::/48", "49762"}, - {"240a:abdc::/32", "145686"}, - {"240a:af72::/32", "146604"}, - {"2607:7e80:e000::/36", "27611"}, - {"2806:2f0:2221::/46", "17072"}, - {"2a11:1140::/29", "34907"}, - {"2001:400:a000:d::/64", "32982"}, - {"240e:438:a20::/43", "140647"}, - {"2a06:aa40:cadb::/48", "51931"}, - {"2a0c:b641:459::/48", "208771"}, - {"2a0d:187::/32", "16246"}, - {"2001:2e0::/32", "9293"}, - {"2001:918:ffb8::/41", "3303"}, - {"2404:9e80::/32", "64095"}, - {"2404:ca00::/32", "24295"}, - {"2600:6c34:251::/48", "33588"}, - {"2a00:4b00:12e::/43", "41935"}, - {"2a10:7a40:a::/48", "39910"}, - {"2602:fed2:7f00::/47", "203027"}, - {"2606:ae80:10::/48", "209242"}, - {"2804:188c::/32", "61939"}, - {"2a01:8f8::/32", "21334"}, - {"2a02:26f7:ecc9::/46", "20940"}, - {"2a03:9c40:200::/48", "34655"}, - {"2402:6800:0:3014::/64", "7473"}, - {"2800:160:1f7e::/40", "14259"}, - {"2804:6bc::/32", "53078"}, - {"2804:4ce0::/32", "267398"}, - {"2401:d800:7960::/40", "7552"}, - {"2804:2ffc::/32", "264924"}, - {"2600:6c38:f::/43", "20115"}, - {"2804:6c70::/32", "270468"}, - {"2a00:4802:3800::/44", "13124"}, - {"2a02:2b20::/32", "29422"}, - {"2a05:f700::/46", "50457"}, - {"2a0a:1540::/29", "43532"}, - {"2001:250:2012::/42", "24355"}, - {"2001:4d30::/32", "5555"}, - {"2404:6d00::/32", "45294"}, - {"240a:aca1::/32", "145883"}, - {"2602:ffb7:5a0::/46", "62874"}, - {"2001:250:6c1f::/48", "23910"}, - {"2001:559:c427::/48", "20214"}, - {"2804:4a24:6::/48", "267221"}, - {"2a02:26f7:da81::/46", "20940"}, - {"2001:67c:2908::/48", "209718"}, - {"2605:b200::/32", "26097"}, - {"2803:97a0::/32", "267778"}, - {"2a11:6c80::/29", "210785"}, - {"2001:559:c1a0::/48", "33651"}, - {"2602:80a:1000::/46", "11378"}, - {"2804:465c::/32", "266985"}, - {"2804:688c::/32", "269700"}, - {"2806:2f0:71a1::/46", "17072"}, - {"2a01:8840:c5::/48", "207266"}, - {"2a02:2530::/32", "43088"}, - {"2001:4878:c225::/48", "12222"}, - {"2402:800:3d0f::/43", "7552"}, - {"240e:980:4300::/40", "63835"}, - {"2600:6c38:a9b::/45", "20115"}, - {"2604:d600:1649::/46", "32098"}, - {"2804:6dd8::/32", "270559"}, - {"2a00:7a20::/32", "39194"}, - {"2402:800:bf60::/40", "7552"}, - {"2404:bf40:a4c0::/48", "7545"}, - {"2409:807c:3100::/36", "9808"}, - {"2800:160:17c2::/47", "14259"}, - {"2804:54c8::/32", "61595"}, - {"2a00:db8::/32", "3058"}, - {"2001:468:ef01::/48", "396955"}, - {"2001:da8:7fff::/48", "24363"}, - {"2001:16a0::/48", "39386"}, - {"2400:4d40:e001::/35", "134204"}, - {"240a:aa24::/32", "145246"}, - {"2602:fba1::/39", "60438"}, - {"2804:18:6800::/44", "26599"}, - {"2804:c48:ff09::/40", "52687"}, - {"2a02:ac80:31::/41", "25145"}, - {"2405:3340:e011::/48", "142437"}, - {"2600:1f14::/35", "16509"}, - {"2605:1680::/32", "18596"}, - {"2801:80:1e11::/48", "14026"}, - {"2806:2f0:310::/46", "22884"}, - {"240e:108:4e::/48", "136195"}, - {"240e:44d:1a00::/42", "140345"}, - {"2600:6c38:d1d::/46", "20115"}, - {"2804:14c:7573::/45", "28573"}, - {"2804:2474::/32", "264223"}, - {"2a00:6400::/32", "197558"}, - {"2a02:26f7:ef4d::/46", "20940"}, - {"2a04:41c0::/29", "199952"}, - {"240e:108:49::/48", "23724"}, - {"2600:1402:b::/45", "20940"}, - {"2001:1388:80b0::/38", "6147"}, - {"2604:d600:66a::/45", "32098"}, - {"2a02:ac80:401::/39", "25145"}, - {"2409:8054:8::/48", "9808"}, - {"240a:a98a::/32", "145092"}, - {"240a:ac15::/32", "145743"}, - {"2600:1408:6c00::/48", "35994"}, - {"2602:fd4a::/36", "53610"}, - {"2804:1708::/32", "263117"}, - {"2804:49f4::/32", "6453"}, - {"2a02:28:e::/29", "8359"}, - {"2a02:26f7:c9cc::/48", "36183"}, - {"2404:ae00:ffff::/48", "45474"}, - {"2406:b640:4100::/48", "139138"}, - {"240e:108:90::/48", "134420"}, - {"2803:29e0::/32", "270013"}, - {"2001:253:101::/48", "142067"}, - {"2001:678:9::/48", "199670"}, - {"2402:4440:a811::/33", "24423"}, - {"240e:983:1806::/48", "140330"}, - {"2806:3bf::/48", "270120"}, - {"240a:ac81::/32", "145851"}, - {"240a:af98::/32", "146642"}, - {"2606:6100::/32", "33262"}, - {"2804:2f40:f00f::/36", "264880"}, - {"2a02:26f7:c5c0::/48", "36183"}, - {"2620:10a:80f1::/48", "27299"}, - {"2803:3440:9004::/40", "64112"}, - {"2804:41e4::/32", "267463"}, - {"2a00:d58::/32", "12466"}, - {"2c0f:ec70::/32", "328341"}, - {"2001:67c:348::/48", "47426"}, - {"2400:4a00::/32", "9341"}, - {"2409:894a:8000::/34", "24445"}, - {"240a:a7d8::/32", "144658"}, - {"2804:2ad8::/32", "265122"}, - {"2402:800:342b::/41", "7552"}, - {"2403:4e00:303::/44", "45528"}, - {"2404:e9c0::/46", "134405"}, - {"2610:b0:40de::/42", "3573"}, - {"2a02:6c20:811::/44", "207167"}, - {"2a0f:100::/30", "7018"}, - {"2a07:b180::/29", "50963"}, - {"2001:388:607d::/40", "7575"}, - {"2001:19f8:212::/32", "4927"}, - {"240e:3be:2200::/37", "136198"}, - {"2620:108:a000::/44", "393601"}, - {"2a0b:1302::/33", "133142"}, - {"2400:9800:11::/46", "24203"}, - {"240e:d9:ad01::/38", "38283"}, - {"2400:e000::/32", "18070"}, - {"240a:a040::/32", "142714"}, - {"2605:1880::/32", "19257"}, - {"2804:6c0:400::/43", "262418"}, - {"2a02:b58::/32", "9125"}, - {"2a02:26f7:f209::/42", "20940"}, - {"240a:afc8::/32", "146690"}, - {"2803:2600::/32", "28114"}, - {"2a02:26f7:f6d4::/48", "36183"}, - {"2a11:2c0::/29", "210627"}, - {"2403:4f00:6000::/36", "63956"}, - {"2600:1406:a::/48", "35994"}, - {"240e:1a:10::/44", "137702"}, - {"240e:397:f00::/35", "140490"}, - {"2a02:6721::/32", "44631"}, - {"2001:708::/43", "1741"}, - {"2406:daa0:4060::/44", "16509"}, - {"240e:397::/38", "140483"}, - {"2605:7c80::/32", "393417"}, - {"2620:df:8000::/48", "30679"}, - {"2a02:26f7:dfc1::/46", "20940"}, - {"2001:559:c539::/48", "33668"}, - {"2401:d800:5b80::/42", "7552"}, - {"240a:a21e::/32", "143192"}, - {"2404:2200:18::/42", "18200"}, - {"2408:8956:2e00::/40", "17622"}, - {"2606:600::/32", "6639"}, - {"2804:54b0::/32", "268665"}, - {"240e:67b:8400::/38", "140329"}, - {"2605:8340::/32", "14315"}, - {"2c0f:eed8::/32", "328317"}, - {"2001:67c:23c8::/48", "49793"}, - {"2804:514:8001::/33", "262490"}, - {"2a02:730:1::/48", "42964"}, - {"2a02:26f7:ee81::/46", "20940"}, - {"2a0a:2786::/31", "206774"}, - {"2001:438:2f::/48", "17025"}, - {"2001:67c:15cc::/48", "210404"}, - {"2001:67c:24bc::/48", "42652"}, - {"2606:2800:4a7c::/46", "15133"}, - {"2a03:4a0::/32", "201888"}, - {"2a04:3280::/29", "21176"}, - {"2a05:fc1::/32", "49791"}, - {"2406:f900::/43", "132829"}, - {"240a:ab8a::/32", "145604"}, - {"240a:acbc::/32", "145910"}, - {"240e:267:5000::/38", "140333"}, - {"2a02:26f7:bd91::/42", "20940"}, - {"2a03:1400::/32", "50272"}, - {"2a09:405::/30", "208861"}, - {"2001:559:102::/48", "33287"}, - {"2001:df7:e480::/48", "138574"}, - {"2401:c00::/32", "17480"}, - {"2001:420:c0f0::/44", "109"}, - {"2001:1930:e80::/41", "11985"}, - {"2402:800:7610::/42", "7552"}, - {"240a:a5a5::/32", "144095"}, - {"2607:9800:d001::/34", "15085"}, - {"2800:bf0:80e7::/48", "27947"}, - {"2a02:26f7:ac::/48", "36183"}, - {"2a0b:d1c0::/32", "9188"}, - {"2001:500:2::/48", "2149"}, - {"2001:13c7:7002::/48", "28001"}, - {"2402:8100:25de::/42", "55644"}, - {"240a:ab58::/32", "145554"}, - {"2602:feda:e000::/36", "396303"}, - {"2604:f980:5c00::/40", "19957"}, - {"2a02:250:2::/48", "51013"}, - {"2a0b:eb40::/29", "41000"}, - {"2a0c:8f40::/29", "199216"}, - {"2a05:3343::/42", "36351"}, - {"2a0a:d6c0::/48", "61423"}, - {"2c0f:ff00::/32", "14988"}, - {"2620:17b:4::/48", "174"}, - {"2a02:bf0:1003::/36", "25106"}, - {"2a05:70c0::/35", "203455"}, - {"2a0d:82c7:5::/48", "47787"}, - {"2001:559:81b0::/48", "22909"}, - {"2001:678:f04::/48", "211646"}, - {"240a:a854::/32", "144782"}, - {"240a:aac3::/32", "145405"}, - {"2620:121:3000::/40", "54666"}, - {"2a02:26f7:b74d::/42", "20940"}, - {"2a04:3f83:44::/48", "213054"}, - {"2001:559:427::/44", "33491"}, - {"2001:c38:5000::/48", "4651"}, - {"2001:1980:2300::/37", "29838"}, - {"2403:2800::/47", "38566"}, - {"2403:5500::/32", "17537"}, - {"2600:6c34:5c::/48", "33588"}, - {"2607:9880::/32", "812"}, - {"2620:0:9c0::/48", "7941"}, - {"2806:230:302b::/48", "11888"}, - {"2a02:26f7:f64c::/48", "36183"}, - {"2a09:8ac0::/32", "205718"}, - {"2402:3a80:28::/46", "38266"}, - {"2806:322::/37", "28546"}, - {"2a02:f8c0::/29", "60713"}, - {"2001:559:72c::/48", "33287"}, - {"2001:df2:e200::/48", "133661"}, - {"2409:8904:a240::/39", "24547"}, - {"2409:8002::/40", "38019"}, - {"240e:44d:900::/41", "140345"}, - {"2604:f400:4800::/37", "29930"}, - {"2800:bf0:16::/44", "27947"}, - {"2a04:d80::/32", "20895"}, - {"2001:1248:a4b8::/45", "11172"}, - {"2001:4c28:3000::/48", "39832"}, - {"2402:8100:26c2::/45", "55644"}, - {"2620:8d:8000::/48", "4385"}, - {"2a02:26f7:f009::/42", "20940"}, - {"2001:1248:99ef::/43", "11172"}, - {"2408:8459:7e10::/42", "17623"}, - {"240a:a5aa::/32", "144100"}, - {"240a:ad45::/32", "146047"}, - {"2a06:e881:5301::/45", "209859"}, - {"2a10:9300::/29", "200736"}, - {"2001:559:c17c::/47", "33490"}, - {"2001:67c:810::/48", "210941"}, - {"2401:d800:f9b0::/41", "7552"}, - {"2402:4f00:4000:5::/46", "58453"}, - {"240a:ab9d::/32", "145623"}, - {"2600:6c20::/47", "20115"}, - {"2804:6330::/32", "269344"}, - {"2806:20d:1640::/46", "32098"}, - {"2a02:26f7:fac8::/48", "36183"}, - {"2a04:8a40::/29", "62283"}, - {"2001:df0:18c0::/48", "138277"}, - {"2401:2a80:2::/47", "58793"}, - {"2403:8940:10::/38", "135817"}, - {"2409:8057:10::/37", "56040"}, - {"2800:bf0:802b::/45", "52257"}, - {"2803:2ee0::/34", "269983"}, - {"2804:1314::/32", "263514"}, - {"2001:559:c020::/47", "7922"}, - {"2605:aec0::/32", "35932"}, - {"2806:230:6001::/48", "11888"}, - {"2001:67c:2808::/48", "197678"}, - {"240e:6ba::/36", "140314"}, - {"2405:800::/46", "7545"}, - {"2407:8b80::/32", "63631"}, - {"2804:14d:4cd7::/42", "28573"}, - {"2804:292c::/32", "264008"}, - {"2806:230:401d::/48", "11888"}, - {"2a07:1e00::/32", "197686"}, - {"2400:c800:4004::/29", "4515"}, - {"240e:7b0:1000::/31", "4134"}, - {"2a02:5a60::/32", "12685"}, - {"2a0a:2582::/32", "206568"}, - {"2001:559:8325::/48", "33652"}, - {"2001:1b00::/32", "20597"}, - {"2400:5680::/32", "55720"}, - {"2401:2500::/32", "7684"}, - {"2407:af40::/32", "142453"}, - {"2a01:b747:42a::/40", "714"}, - {"2a03:2260::/34", "201701"}, - {"2a0c:9a40:1060::/48", "34927"}, - {"2001:559:cb::/48", "7015"}, - {"240a:ad41::/32", "146043"}, - {"2600:6c38:41a::/47", "20115"}, - {"2620:6:2004::/44", "395460"}, - {"2804:644::/32", "53225"}, - {"2806:230:4032::/48", "265594"}, - {"2001:1a11:72::/48", "42298"}, - {"2409:8915:9400::/39", "56044"}, - {"240e:16:b207::/44", "38283"}, - {"2604:f582::/32", "399462"}, - {"2804:40:a000::/36", "28657"}, - {"2a00:4802:3410::/38", "8717"}, - {"2a05:f780:1000::/36", "57667"}, - {"2a0d:3840:110::/47", "57629"}, - {"2400:adc0:c100::/46", "9541"}, - {"2600:370f:9020::/46", "32261"}, - {"2800:6b0::/32", "6306"}, - {"2c0f:1500:6000::/36", "328888"}, - {"240a:a1b2::/32", "143084"}, - {"2620:3f:c009::/48", "62645"}, - {"2a05:6200::/41", "201630"}, - {"2804:3e14::/32", "266572"}, - {"2a0a:2842:15::/48", "136796"}, - {"2804:2cd8::/32", "265247"}, - {"2804:4d68::/32", "268194"}, - {"2a00:8a00:4000::/36", "8983"}, - {"2a02:540:6::/32", "35432"}, - {"2a10:2480::/29", "204790"}, - {"2401:4900:4530::/46", "45609"}, - {"240a:a389::/32", "143555"}, - {"2803:a100::/32", "262213"}, - {"2a00:aee0::/29", "60503"}, - {"2605:6c80:6::/48", "397423"}, - {"2607:f3e0::/32", "11647"}, - {"2620:131:8008::/45", "4966"}, - {"2620:171:fc::/46", "42"}, - {"2806:2f0:1082::/48", "22884"}, - {"2409:8c85:2802::/33", "9808"}, - {"2620:4d:4003::/45", "62597"}, - {"2806:103e:13::/42", "8151"}, - {"2001:559:3a4::/48", "33287"}, - {"2402:800:627e::/40", "7552"}, - {"2804:7140::/32", "270777"}, - {"2a10:8140::/29", "207886"}, - {"2001:559:82dc::/48", "33659"}, - {"2001:df2:ce00::/48", "45899"}, - {"2001:b032:ae00::/33", "3462"}, - {"2608:120:c::/48", "5927"}, - {"2804:5ac4:2080::/32", "268795"}, - {"2a04:4e40:7c30::/41", "54113"}, - {"2a07:3500:10c0::/48", "208973"}, - {"2001:dce:5::/48", "133532"}, - {"240a:a55c::/32", "144022"}, - {"2600:6c33:4c1::/48", "11351"}, - {"2602:fcbc:2::/48", "16509"}, - {"2606:5000::/37", "209"}, - {"2800:484:6100::/37", "14080"}, - {"2a02:26f7:e981::/46", "20940"}, - {"2a07:aa00::/47", "3549"}, - {"2001:678:7ec::/48", "210397"}, - {"240a:a6fe::/32", "144440"}, - {"2606:82c0:e005::/48", "32167"}, - {"2806:1008:cfff:2::/34", "8151"}, - {"2a00:ae40::/32", "50923"}, - {"2a02:26f7:c880::/48", "36183"}, - {"2a02:26f7:f541::/46", "20940"}, - {"2a0a:c0::/46", "29099"}, - {"240e:438:4040::/38", "4134"}, - {"2a00:4802:1b00::/40", "8717"}, - {"2a04:2fc0::/32", "8496"}, - {"2407:5d00::/32", "55720"}, - {"240a:ae82::/32", "146364"}, - {"2602:806:a002::/45", "398565"}, - {"2604:1380:1000::/34", "54825"}, - {"2604:5240::/34", "54614"}, - {"2604:cd40::/32", "32899"}, - {"2804:49c:3110::/48", "15201"}, - {"2804:5d34:2000::/32", "52690"}, - {"2409:8043:2c01::/48", "24444"}, - {"240e:438:c20::/43", "140647"}, - {"2a00:59c0::/46", "49232"}, - {"2a02:6300:31::/32", "50128"}, - {"2a0e:f400::/29", "42897"}, - {"240a:a85c::/32", "144790"}, - {"2600:6c10:aa::/43", "20115"}, - {"2607:fdf0:5ed0::/44", "8008"}, - {"2a03:6f80::/31", "35676"}, - {"2a0e:6080::/48", "212745"}, - {"2001:480:11::/44", "668"}, - {"2401:d800:5172::/40", "7552"}, - {"2406:c500:ffd0::/48", "20473"}, - {"2606:2800:5a74::/47", "15133"}, - {"2607:fc48:418::/48", "40009"}, - {"2800:68:40::/48", "27947"}, - {"2804:c08::/32", "52664"}, - {"2001:44b8:6056::/44", "7545"}, - {"2800:88:41::/32", "26210"}, - {"2804:6054::/32", "269160"}, - {"2a09:7440::/32", "31027"}, - {"2401:d800:9470::/40", "7552"}, - {"2409:8914:c800::/31", "56044"}, - {"2409:8c54:1800::/44", "9808"}, - {"2804:4424::/32", "267605"}, - {"2001:559:83ef::/48", "33651"}, - {"2001:6e0::/32", "8935"}, - {"2001:16a2:f000::/36", "25019"}, - {"2a00:7180:8014::/46", "210675"}, - {"2a02:b18::/32", "35339"}, - {"2a02:26f7:ca09::/46", "20940"}, - {"2403:8600:e080::/43", "45820"}, - {"2607:fad8:c8::/35", "22652"}, - {"2804:39c:f000::/36", "28329"}, - {"2001:fb0:10a2::/48", "55451"}, - {"240e:924:1000::/34", "4134"}, - {"2a02:26f7:d505::/46", "20940"}, - {"2400:a980:e0::/46", "133111"}, - {"2804:b18:8100::/37", "52941"}, - {"2001:df2:4080::/47", "55318"}, - {"2600:9000:10f8::/39", "16509"}, - {"2605:3380:4455::/46", "12025"}, - {"2606:2e00::/48", "29854"}, - {"2a00:8643::/29", "203993"}, - {"2a09:be40:4251::/40", "213349"}, - {"2a0e:b107:c90::/45", "140938"}, - {"2402:800:5701::/44", "7552"}, - {"2408:8936::/32", "4837"}, - {"2408:8956:9a00::/40", "17622"}, - {"2604:980:d000::/34", "21859"}, - {"2804:16a8::/32", "52817"}, - {"2804:2050:5a8c::/43", "264485"}, - {"2804:6df0::/33", "270565"}, - {"2a02:2b38::/32", "12703"}, - {"2001:559:566::/48", "33651"}, - {"2409:8730:3000::/33", "9808"}, - {"2a02:220e:290::/31", "6697"}, - {"2a0d:b201:8050::/40", "206026"}, - {"2400:c700:1086::/39", "55644"}, - {"2401:4900:54bd::/48", "45609"}, - {"2402:9d80:804::/47", "131429"}, - {"2405:c900::/32", "4739"}, - {"2600:1014:f110::/36", "22394"}, - {"2620:10a:8053::/48", "394354"}, - {"2804:7898:4000::/47", "271253"}, - {"2a01:c50f:3340::/40", "12479"}, - {"2a02:2698:3400::/38", "56330"}, - {"2403:3bc0::/32", "55933"}, - {"240a:a456::/32", "143760"}, - {"2a02:970:1186::/43", "44002"}, - {"2a0d:3180:7::/48", "49121"}, - {"2001:559:82c0::/48", "7015"}, - {"2001:1248:5b45::/42", "11172"}, - {"2400:9380:9260::/47", "4809"}, - {"2605:7780::/32", "26744"}, - {"2607:feb8::/32", "15083"}, - {"2a03:9b60::/32", "57184"}, - {"2001:250:20b::/48", "24350"}, - {"2001:67c:2038::/48", "197444"}, - {"2001:460:84::/39", "3561"}, - {"2001:1388:248a::/36", "6147"}, - {"2401:4900:2180::/45", "45609"}, - {"240a:a2b8::/32", "143346"}, - {"2600:141c:3801::/33", "20940"}, - {"2607:f6f0:20c::/48", "32550"}, - {"2a02:6fa0::/32", "51935"}, - {"2a03:c280::/32", "198330"}, - {"2a0c:b641:5b0::/48", "213015"}, - {"2406:daa0:7040::/44", "16509"}, - {"240a:ad08::/32", "145986"}, - {"240e:879:8000::/40", "137689"}, - {"2804:5bb8:2c::/40", "268865"}, - {"2a02:26f0:9501::/40", "20940"}, - {"2a10:9c80::/29", "29405"}, - {"2001:67c:2880::/48", "198311"}, - {"2406:3000:d::/48", "140928"}, - {"240a:a01d::/32", "142679"}, - {"240a:ae21::/32", "146267"}, - {"2607:fdf0:5eac::/43", "8008"}, - {"2620:171:fb::/48", "715"}, - {"2800:160:1faf::/41", "14259"}, - {"2a01:5b0::/47", "8391"}, - {"2a04:2180::/32", "61272"}, - {"2a0a:9740::/32", "206011"}, - {"2402:800:98c5::/42", "7552"}, - {"2402:800:f050::/42", "7552"}, - {"2804:2b90::/32", "265160"}, - {"2804:8434:387::/44", "272246"}, - {"2001:418:1451::/45", "2914"}, - {"2001:4c8:10a0::/47", "15290"}, - {"2404:bf40:8580::/46", "45887"}, - {"240e:3bc:7800::/39", "4134"}, - {"2600:6c3a:69::/43", "20115"}, - {"2806:2f0:4441::/46", "17072"}, - {"2804:1900::/32", "61768"}, - {"2001:44b8:3091::/44", "4739"}, - {"2405:c0:babe::/48", "138881"}, - {"2408:8957:7500::/40", "17816"}, - {"2600:380:1200::/36", "20057"}, - {"2804:5d0::/32", "28241"}, - {"2804:5ce8:9100::/33", "268938"}, - {"2804:676c::/36", "269627"}, - {"2806:230:6032::/48", "265594"}, - {"2a00:9d20:31::/48", "60781"}, - {"2a01:c50f:a880::/37", "12479"}, - {"2a02:26f7:dec4::/48", "36183"}, - {"2a12:ef00::/29", "204790"}, - {"2001:559:848e::/48", "33650"}, - {"2620:10d:6000::/46", "26722"}, - {"2a02:748:4000::/34", "29802"}, - {"2a0b:6e80::/29", "30745"}, - {"2a0b:b580::/48", "43304"}, - {"2001:678:f80::/48", "52158"}, - {"2606:f900:6104::/35", "812"}, - {"2620:11b:e0c2::/42", "3356"}, - {"2804:113c::/32", "53181"}, - {"2806:2f0:72e3::/39", "17072"}, - {"2a06:1e00:5::/48", "60695"}, - {"2a0a:1087::/32", "393954"}, - {"2001:559:38d::/48", "33662"}, - {"2408:84f3:be10::/42", "134543"}, - {"2806:230:500e::/48", "265594"}, - {"2407:ea00::/32", "56059"}, - {"2804:7898::/36", "271253"}, - {"2806:2f0:3443::/42", "17072"}, - {"2a0c:9a40:80c0::/48", "210529"}, - {"2001:678:c88::/48", "206161"}, - {"2001:da8:22e::/47", "23910"}, - {"2602:fc23:114::/47", "44406"}, - {"2602:ff49::/36", "10753"}, - {"2001:559:115::/48", "33650"}, - {"2402:53c0::/36", "137144"}, - {"240e:3ba:d000::/36", "134772"}, - {"2804:b04::/32", "52934"}, - {"2001:c20:4860::/45", "3758"}, - {"240a:a03c::/32", "142710"}, - {"240e:45c:400::/40", "131285"}, - {"240e:620::/30", "140061"}, - {"2600:370f:73a5::/46", "32261"}, - {"2607:fee0:2100::/33", "3599"}, - {"2a0c:4b80:4000::/34", "204810"}, - {"2406:dc0:88ca::/47", "9221"}, - {"2607:f208:d200::/43", "26496"}, - {"2a00:dd80:14::/48", "36236"}, - {"2a07:c400::/29", "34407"}, - {"240a:a922::/32", "144988"}, - {"2600:140f:2a01::/39", "20940"}, - {"2606:2800:4a84::/46", "15133"}, - {"2a0b:21c0:3004::/31", "21859"}, - {"2001:7d0::/32", "3249"}, - {"240a:a97c::/32", "145078"}, - {"2600:380:da00::/39", "7018"}, - {"2a02:26f7:d3ca::/42", "20940"}, - {"2a0e:a680:1::/48", "61157"}, - {"2001:4f8::/44", "1280"}, - {"2401:d800:b330::/41", "7552"}, - {"240a:abea::/32", "145700"}, - {"2604:9980:2::/48", "17216"}, - {"2803:ab60::/32", "269805"}, - {"2804:1624::/35", "263270"}, - {"2a01:cd20::/32", "47377"}, - {"2001:1400:ffef::/48", "2119"}, - {"2408:8456:ee40::/40", "17816"}, - {"2408:8956:d2c0::/37", "17816"}, - {"2620:10a:80e3::/45", "55195"}, - {"2801:86::/32", "53164"}, - {"2806:230:6016::/48", "265594"}, - {"2a0d:4fc0::/29", "49191"}, - {"2a0a:aa40::/32", "205668"}, - {"2a11:9940::/32", "205160"}, - {"2001:480:1610::/48", "518"}, - {"2001:da8:205::/44", "24350"}, - {"2408:8246::/35", "140726"}, - {"2806:2f0:81a3::/41", "17072"}, - {"2a02:5bf::/32", "35575"}, - {"2a07:6881::/32", "204860"}, - {"2001:5f8:7f0c::/48", "5056"}, - {"240e:a7:7fe4::/46", "140520"}, - {"2602:fc31::/47", "400071"}, - {"2804:4494::/32", "267640"}, - {"2a02:2370:1000::/48", "213120"}, - {"2c0f:fe08:305::/37", "36914"}, - {"2604:3cc0::/44", "396298"}, - {"2803:bfc0::/48", "265787"}, - {"2a05:f1c0::/29", "60924"}, - {"2001:559:8242::/48", "33651"}, - {"240a:af0c::/32", "146502"}, - {"2804:397c::/32", "52592"}, - {"2a02:26f7:d64c::/48", "36183"}, - {"2001:559:d6::/48", "33287"}, - {"2001:559:5e3::/45", "7015"}, - {"2001:14f0::/29", "12355"}, - {"2406:840:fef3::/48", "142553"}, - {"240e:3b6:1200::/39", "4134"}, - {"2605:cf40::/32", "15242"}, - {"2806:2a0:1200::/39", "28548"}, - {"2a09:3501::/30", "208861"}, - {"2400:61a0::/32", "38047"}, - {"2408:8957:c800::/39", "17622"}, - {"240a:a9a5::/32", "145119"}, - {"2607:ff28::/46", "62904"}, - {"2620:11b:400e::/47", "47870"}, - {"2804:cd8::/32", "52559"}, - {"2a04:7444::/30", "21413"}, - {"2a0d:3ec0::/32", "49981"}, - {"2a11:6e40::/32", "35913"}, - {"2400:34a0::/32", "147269"}, - {"2600:140b:6800::/48", "24319"}, - {"2a03:7480::/44", "60781"}, - {"2a05:b700::/29", "201086"}, - {"2a0c:b641:61e::/48", "208505"}, - {"2001:468:701::/48", "3681"}, - {"2001:559:423::/48", "7922"}, - {"2001:67c:b0::/48", "50673"}, - {"2001:dc7:9d0f::/33", "24151"}, - {"240a:a045::/32", "142719"}, - {"2804:4d58:1001::/32", "268191"}, - {"2a02:2230:4200::/40", "25467"}, - {"2a09:4b44:1::/44", "61317"}, - {"2a0c:8980::/29", "59562"}, - {"2001:3c8:5505::/48", "137850"}, - {"2400:9800::/45", "24203"}, - {"2408:8000:9ffe::/48", "17621"}, - {"2605:f300:ffff::/48", "29873"}, - {"2803:c210::/32", "271899"}, - {"2804:374c:100::/40", "266402"}, - {"2a05:adc2::/32", "206083"}, - {"2001:df3:9880::/48", "136969"}, - {"2600:380:8900::/40", "7018"}, - {"2a02:2e02:be0::/37", "12479"}, - {"2404:f4c0:ff04::/46", "139247"}, - {"2405:9800:b012::/48", "45430"}, - {"2600:100d:a100::/43", "6167"}, - {"2804:df0::/47", "262775"}, - {"2a00:14e0::/32", "41412"}, - {"2001:559:c003::/48", "33491"}, - {"2001:4878:141::/48", "12222"}, - {"2804:22fc::/32", "52612"}, - {"2603:c002::/39", "31898"}, - {"2605:6000::/37", "11427"}, - {"2800:160:1a7e::/40", "14259"}, - {"2a06:e380:9000::/33", "203507"}, - {"2001:1248:8600::/39", "11172"}, - {"240a:ae01::/32", "146235"}, - {"2607:ff10::/32", "10439"}, - {"2804:6078::/32", "269169"}, - {"2a00:ff0::/48", "25409"}, - {"2404:e00:81::/48", "15695"}, - {"2a00:1d58:8002::/34", "47524"}, - {"2a0d:7ac5::/30", "210206"}, - {"2001:4b27:ffff::11/126", "34288"}, - {"2001:4d78:fe17::/48", "15830"}, - {"2409:8753:d00::/38", "56047"}, - {"240e:e1:c300::/35", "4812"}, - {"2801:141:b::/48", "271958"}, - {"2a11:1080::/29", "204790"}, - {"2001:bf7:1310::/42", "206813"}, - {"2a01:7d80:2500::/35", "8990"}, - {"2a02:26f7:df8c::/48", "36183"}, - {"2a0d:6840::/29", "210232"}, - {"2001:559:485::/46", "7922"}, - {"2001:fd8:2010::/39", "4775"}, - {"2001:1310:7211::/48", "11340"}, - {"240a:a249::/32", "143235"}, - {"2a11:71c0::/29", "1239"}, - {"2401:78c0::/47", "56150"}, - {"240a:adc3::/32", "146173"}, - {"240e:378:2600::/32", "4134"}, - {"2600:370f:7181::/42", "32261"}, - {"2607:f600::/32", "12"}, - {"2a02:26f7:b1::/48", "20940"}, - {"2a06:1e86:babe::/48", "210089"}, - {"2405:c9c0:2a::/40", "138823"}, - {"2409:8017:2902::/48", "56044"}, - {"240a:aa14::/32", "145230"}, - {"2605:1b40::/32", "40389"}, - {"2804:3bfc:300::/37", "52607"}, - {"2a00:1288::/41", "10310"}, - {"2a04:b480::/43", "60110"}, - {"2a10:2780::/29", "3356"}, - {"2400:1700:212::/40", "4628"}, - {"2402:ef3f:2::/48", "9430"}, - {"2a0c:3400::/29", "205268"}, - {"2001:4490:d280::/46", "9829"}, - {"240e:44d:6300::/42", "140345"}, - {"2803:ff20::/32", "262186"}, - {"2a0a:d6c0:2157::/48", "211454"}, - {"2409:8a7f::/24", "9808"}, - {"2605:a1c0:1001::/32", "11738"}, - {"2606:2800:6a34::/47", "15133"}, - {"2a02:26f7:d4cc::/48", "36183"}, - {"2a07:3146::/32", "47688"}, - {"2a0f:e400::/32", "61218"}, - {"2607:8480::/34", "22639"}, - {"2600:370f:7371::/40", "32261"}, - {"2605:3380:445b::/42", "12025"}, - {"2804:90:6500::/38", "28580"}, - {"2806:345::/32", "265596"}, - {"2001:67c:4e8::/48", "62041"}, - {"2001:df3:3d00::/48", "9304"}, - {"2610:1d8::/32", "5078"}, - {"2a02:6800::/32", "43205"}, - {"2a0f:9400:8021::/48", "212995"}, - {"2405:f3c0::/48", "41378"}, - {"2600:1000:9f10::/40", "22394"}, - {"2620:74:7b::/40", "7342"}, - {"2a02:26f7:87::/48", "20940"}, - {"2404:bf40:a2c0::/47", "7545"}, - {"2408:8456:7a40::/39", "17816"}, - {"2606:aac0::/32", "399831"}, - {"2001:559:4e8::/48", "7922"}, - {"2409:8057:303e::/47", "9808"}, - {"2607:f038:fffe:1::/48", "21527"}, - {"2400:dd03:1009::/46", "7497"}, - {"240a:a982::/32", "145084"}, - {"2801:16a::/44", "269937"}, - {"2804:1254::/32", "263470"}, - {"2804:722c::/32", "270837"}, - {"2a02:26f7:f6f0::/48", "36183"}, - {"2001:338::/32", "4675"}, - {"240a:a623::/32", "144221"}, - {"2a01:7d20:100::/47", "203645"}, - {"2a01:b747::/39", "714"}, - {"2407:c3c0::/32", "142454"}, - {"2408:8956:c200::/40", "17622"}, - {"2409:408a:1000::/29", "55836"}, - {"2604:55c0::/48", "4138"}, - {"2a02:2d8:1:7809::/64", "9002"}, - {"240e:3bf:1800::/34", "4134"}, - {"2600:1fa0:50c0::/44", "16509"}, - {"2a01:238:10b::/38", "6724"}, - {"2001:67c:660::/48", "8881"}, - {"2602:fcd5:8::/47", "397373"}, - {"2804:772c::/32", "271160"}, - {"2a02:26f7:ed85::/46", "20940"}, - {"2001:559:7d1::/48", "7016"}, - {"2001:67c:2088::/48", "20902"}, - {"2408:8956:9800::/40", "17622"}, - {"2800:280:4002::/32", "27781"}, - {"2620:74:82::/45", "7342"}, - {"2a07:ee00::/32", "206711"}, - {"2a12:2c80::/29", "204790"}, - {"2c0f:f7c0::/34", "30986"}, - {"2001:250:23c::/47", "23910"}, - {"2001:df3:8d80::/48", "139521"}, - {"2001:1938:4100::/40", "33438"}, - {"2406:b480:200::/46", "38146"}, - {"2806:2f0:9161::/45", "17072"}, - {"2409:8004:3021::/43", "24547"}, - {"240a:a453::/32", "143757"}, - {"2806:230:301f::/48", "11888"}, - {"2a06:8800::/29", "12517"}, - {"2001:559:80e2::/48", "33287"}, - {"2408:8459:2c50::/38", "17816"}, - {"2600:1000:9e10::/40", "22394"}, - {"2600:40fc:1004::/44", "701"}, - {"2602:ffe4:c49::/45", "21859"}, - {"2a00:d220::/32", "206894"}, - {"2408:840c:dd00::/34", "17621"}, - {"2800:5f0:2037::/44", "22724"}, - {"2001:da8:4030::/48", "23910"}, - {"2401:3cc0::/39", "137409"}, - {"2804:3d7c::/32", "266534"}, - {"2804:6c08::/32", "270441"}, - {"2a0d:ac00:dc01::/48", "205202"}, - {"2001:4870:a250::/33", "3549"}, - {"240a:afcb::/32", "146693"}, - {"2600:5800:1601::/48", "33363"}, - {"2803:e600::/46", "18809"}, - {"2804:7840::/32", "271230"}, - {"2a01:8760::/32", "199758"}, - {"2402:800:978d::/43", "7552"}, - {"240a:aa94::/32", "145358"}, - {"240a:ac0f::/32", "145737"}, - {"2801:1c8:230::/46", "27817"}, - {"2804:204:247::/44", "28186"}, - {"2804:72c8::/32", "270875"}, - {"2a00:1728:e::/43", "34224"}, - {"2a02:26f0:83::/48", "20940"}, - {"2a02:26f7:f891::/42", "20940"}, - {"2001:1530::/32", "2586"}, - {"240e:183:8224::/46", "140657"}, - {"2602:fed2:7118::/48", "53356"}, - {"2607:f750:8000::/44", "23473"}, - {"2800:160:1a3f::/41", "14259"}, - {"240a:afe4::/32", "146718"}, - {"2620:c3:c000::/44", "46416"}, - {"2a02:503:2::/45", "5538"}, - {"2a0b:33c0:107::/48", "57395"}, - {"2001:678:d1c::/48", "56948"}, - {"2806:2f0:9d23::/41", "17072"}, - {"2a04:4e40:6a30::/41", "54113"}, - {"2c0f:f000:900::/37", "36891"}, - {"2001:559:861a::/48", "33287"}, - {"240a:a09c::/32", "142806"}, - {"240a:ab60::/32", "145562"}, - {"2600:c07::/48", "29791"}, - {"2600:1900:41f0::/31", "15169"}, - {"2610:10::/32", "6366"}, - {"2a00:8a01:8000::/44", "10455"}, - {"2a06:c701:eeef::/29", "6810"}, - {"2001:559:808b::/45", "7922"}, - {"2402:800:b0d0::/42", "7552"}, - {"2600:1901:ffa0::/41", "396982"}, - {"2604:a00:15::/46", "19318"}, - {"2a03:3400::/32", "20559"}, - {"2001:67c:1910::/48", "3301"}, - {"2409:8087:100c::/42", "9808"}, - {"240e:45c:5600::/34", "131285"}, - {"2804:41d4:1000::/32", "267459"}, - {"2804:54ec::/32", "268678"}, - {"2806:2f0:8041::/46", "17072"}, - {"2a0b:2f80::/29", "62412"}, - {"2001:df6:4280::/48", "142006"}, - {"2001:ee0:9740::/36", "45899"}, - {"2404:2200::/43", "18200"}, - {"2409:8904:4e60::/39", "24547"}, - {"240e:108:89::/48", "4134"}, - {"2a0a:a440::/29", "36459"}, - {"2001:678:a5c::/48", "209075"}, - {"240a:ac40::/32", "145786"}, - {"2804:5394::/32", "268593"}, - {"2a01:5c20::/35", "61419"}, - {"2a02:26f7:f94d::/42", "20940"}, - {"2a0e:aa07:e024::/48", "210934"}, - {"2405:1c0:7181::/46", "55303"}, - {"2600:1010:d170::/40", "22394"}, - {"2a07:4540:a::/48", "203116"}, - {"2001:1248:9c83::/44", "11172"}, - {"2408:84e3::/29", "4837"}, - {"2600:6c39:d::/38", "20115"}, - {"2804:80c::/32", "262343"}, - {"2a02:26f7:c244::/48", "36183"}, - {"2804:5aec::/32", "268805"}, - {"2806:2f0:9da3::/41", "17072"}, - {"2a00:8220::/32", "24971"}, - {"2a06:3840::/29", "204182"}, - {"2402:ab00:f0::/32", "24206"}, - {"2408:8459:3c50::/38", "17816"}, - {"240a:a13d::/32", "142967"}, - {"240e:966:cc00::/35", "4134"}, - {"2606:9580:fffa::/48", "394256"}, - {"2800:68:3d::/46", "61468"}, - {"2a02:2e02:82f0::/39", "12479"}, - {"2a0c:7500::/29", "205046"}, - {"2a0e:47c6::/32", "212362"}, - {"240a:ab32::/32", "145516"}, - {"240e:a65:2600::/32", "4134"}, - {"2602:fea7:e00::/40", "32181"}, - {"2604:a880::/45", "14061"}, - {"2607:3d00::/28", "12083"}, - {"2804:37d0::/46", "266437"}, - {"240e:e1:9900::/38", "4811"}, - {"2602:fbf7::/36", "400201"}, - {"2800:68:33::/48", "269844"}, - {"2a03:b900::/32", "196695"}, - {"2a04:2e80:7::/48", "6697"}, - {"2a09:bac0:97::/44", "13335"}, - {"2403:ac00::/32", "55826"}, - {"2600:1417:3000::/54", "24203"}, - {"2602:802:2000::/40", "55244"}, - {"2800:b70:e::/47", "262191"}, - {"2a01:b740:a18::/48", "6185"}, - {"2a04:4e40:3810::/41", "54113"}, - {"2001:559:c214::/48", "22909"}, - {"2001:67c:1058::/48", "50345"}, - {"2001:1a11:db::/48", "8781"}, - {"240e:3bc:2c00::/35", "134774"}, - {"2607:9b80:400::/43", "46558"}, - {"2800:160:1acc::/46", "14259"}, - {"2001:559:8207::/48", "33650"}, - {"2409:807c:1900::/34", "9808"}, - {"240a:a24f::/32", "143241"}, - {"240e:44d:1900::/42", "140345"}, - {"2602:fc6b::/36", "852"}, - {"2800:68:2a::/47", "61468"}, - {"2804:14d:d600::/40", "28573"}, - {"2804:4d3c:5dc0::/32", "267420"}, - {"2a02:26f7:bc04::/47", "36183"}, - {"2a12:1e01::/32", "41634"}, - {"2403:6d00:cf::/35", "56094"}, - {"2806:250:12::/48", "28509"}, - {"2a02:f784:30::/48", "25252"}, - {"2001:3c8:1203::/39", "4621"}, - {"2001:468:f100::/36", "11537"}, - {"2001:559:734::/48", "7016"}, - {"2001:559:c3ca::/48", "33489"}, - {"2001:579:e0bc::/39", "22773"}, - {"2402:800:b130::/41", "7552"}, - {"2403:9800:6100::/40", "4648"}, - {"2804:1878:196::/32", "61935"}, - {"2a02:5740:10::/48", "58065"}, - {"2a02:7dc0::/32", "559"}, - {"2a09:c400::/29", "13032"}, - {"2001:559:3f0::/48", "33490"}, - {"2001:67c:6b8::/48", "31477"}, - {"2404:200::/32", "7672"}, - {"240a:ab69::/32", "145571"}, - {"2a0b:5ec0::/29", "42926"}, - {"2602:fcf6:fff::/48", "48413"}, - {"2a02:26f7:e040::/48", "36183"}, - {"2001:559:8427::/48", "7725"}, - {"2a02:26f7:d204::/48", "36183"}, - {"2001:618::/32", "15716"}, - {"2409:8020:11::/42", "56046"}, - {"2600:d09:4000::/30", "20161"}, - {"2600:1408:d401::/34", "20940"}, - {"2804:28e4:20::/41", "28260"}, - {"2a01:b747:16e::/37", "714"}, - {"2a02:26f7:dc44::/48", "36183"}, - {"2001:550:3101::/38", "174"}, - {"2a0d:77c7:e908::/35", "7489"}, - {"2a0f:e440::/29", "205544"}, - {"2600:2501:3000::/28", "26801"}, - {"2804:e8c::/34", "52561"}, - {"2a02:2aa8:220::/39", "702"}, - {"2a0e:b107:1574::/47", "141011"}, - {"2402:800:9bc5::/43", "7552"}, - {"2406:fb00:1000::/48", "15224"}, - {"2804:3f58:7000::/32", "265886"}, - {"240a:ab4a::/32", "145540"}, - {"2602:803:b000::/44", "399214"}, - {"2803:9800:b88d::/41", "11664"}, - {"2a00:b900::/46", "51561"}, - {"2001:df3:ad00::/48", "137275"}, - {"2804:354c:4600::/32", "53018"}, - {"2804:4204::/32", "267472"}, - {"2a00:e480:1::/48", "12859"}, - {"2a02:1400::/26", "2119"}, - {"2a03:2de0::/32", "35444"}, - {"2600:80c::/40", "11486"}, - {"2602:fd92:500::/40", "206607"}, - {"2607:f220:412::/44", "3527"}, - {"2404:c0:30a0::/39", "23693"}, - {"2607:f180:7200::/40", "4213"}, - {"2a07:a343:e0f0::/44", "9009"}, - {"2001:559:c1fd::/48", "33652"}, - {"2600:6c7f:9111::/46", "19115"}, - {"2602:802:5000::/40", "19065"}, - {"2606:ae00:c500::/36", "7287"}, - {"2a01:8c8::/32", "3329"}, - {"2001:559:8382::/48", "7015"}, - {"2001:df0:c800::/48", "133173"}, - {"2001:fe8:8130::/47", "24435"}, - {"2804:3444::/32", "265446"}, - {"2a0e:c740::/29", "210661"}, - {"2001:559:841e::/48", "33491"}, - {"240a:a0f3::/32", "142893"}, - {"2600:1419:a::/47", "20940"}, - {"2a01:111:202f::/36", "8075"}, - {"2a01:130::/32", "8495"}, - {"2001:418:1401:2d::/57", "2914"}, - {"2605:88c0::/36", "398202"}, - {"2804:1b48::/32", "61718"}, - {"2806:2f0:2463::/43", "22884"}, - {"2a02:e982:1e::/48", "62571"}, - {"2a07:bbc2::/47", "50864"}, - {"2a11:dc00::/29", "42375"}, - {"2404:4880::/32", "135069"}, - {"2408:8456:1e40::/40", "17816"}, - {"240a:a474::/32", "143790"}, - {"240e:964:c600::/36", "4134"}, - {"2600:6c10:f241::/45", "20115"}, - {"2604:8540:fcd3::/48", "33353"}, - {"2620:10a:b0fd::/46", "15297"}, - {"2620:119:4043::/48", "7726"}, - {"2a00:8a02::/44", "8983"}, - {"2a0c:a7c0::/46", "202468"}, - {"2a11:5f80::/29", "18779"}, - {"2001:4878:b031::/48", "12222"}, - {"2400:cb00:274::/47", "13335"}, - {"2804:2984::/40", "53184"}, - {"2804:3e40:8000::/33", "266583"}, - {"2a00:19d0::/29", "12586"}, - {"2001:16a2:c2f4::/44", "39386"}, - {"2408:8456:6640::/39", "17816"}, - {"240a:afea::/32", "146724"}, - {"2a0d:9c80::/29", "49127"}, - {"2001:559:7a9::/48", "7922"}, - {"2001:559:86c9::/48", "20214"}, - {"2600:1005:b1d0::/42", "6167"}, - {"2804:6fa4::/32", "270674"}, - {"2001:1248:a67b::/40", "11172"}, - {"2404:c0:5e00::/34", "23693"}, - {"2607:a280::/32", "394117"}, - {"2610:1f0::/32", "4181"}, - {"2a04:4000::/29", "201020"}, - {"2409:8053:1002::/40", "56047"}, - {"2600:80c:f00::/40", "11486"}, - {"2a02:4720::/31", "201333"}, - {"2a0b:ec82::/32", "52000"}, - {"2c0f:f6d0:82::/47", "327687"}, - {"2804:1450::/32", "262861"}, - {"2001:559:c36a::/48", "33659"}, - {"2001:dda::/48", "18149"}, - {"240e:67e:1800::/32", "4134"}, - {"2600:1fa0:8180::/44", "16509"}, - {"2a02:26f7:f305::/46", "20940"}, - {"2a03:fbc0::/29", "61317"}, - {"2804:4f04::/32", "268298"}, - {"2a00:1b60::/32", "12552"}, - {"2a00:5884::/32", "204092"}, - {"2a0c:fac0::/48", "200076"}, - {"2604:9100:1001::/48", "14313"}, - {"2607:fa40::/47", "25899"}, - {"2a00:6d43:a00::/32", "31034"}, - {"2a00:a780:5::/36", "44229"}, - {"2a07:2911::/32", "21449"}, - {"2409:8a15:9800::/30", "56044"}, - {"2600:1404:a400::/48", "35994"}, - {"2602:fc09:a00::/40", "13780"}, - {"2602:ffe4:c2e::/43", "55836"}, - {"2603:90b0::/32", "10796"}, - {"2804:e4c:7000::/36", "269104"}, - {"240a:a872::/32", "144812"}, - {"240e:90d:b000::/33", "4134"}, - {"2804:37f0:d100::/36", "266445"}, - {"2001:559:805d::/48", "7725"}, - {"2403:a200:a3ff::/48", "58466"}, - {"2409:8907:7020::/39", "24547"}, - {"2606:2800:144::/48", "15133"}, - {"2607:2a00:3::/32", "29909"}, - {"2804:4e4::/32", "262476"}, - {"2806:230:6023::/48", "11888"}, - {"2a04:4e40:6600::/48", "54113"}, - {"2a07:e7c0:147::/48", "201076"}, - {"2406:2000:ef68::/48", "24506"}, - {"2a01:8840:ea::/45", "12041"}, - {"2a02:88d:20f::/48", "47794"}, - {"2a04:4e41:1::/46", "54113"}, - {"2a09:1400::/30", "42423"}, - {"2001:67c:2048::/48", "31317"}, - {"240a:a0ab::/32", "142821"}, - {"2a00:9bc0::/32", "57844"}, - {"2a02:26f0:1d::/48", "34164"}, - {"2a0b:4341:509::/48", "57695"}, - {"2a0c:b641:720::/47", "207363"}, - {"2402:8640:2::/44", "137491"}, - {"2406:b480:100::/46", "38146"}, - {"2600:140e:2::/48", "24319"}, - {"2a0a:cac0::/29", "31246"}, - {"2001:559:287::/48", "33662"}, - {"2001:df0:1a00::/48", "132779"}, - {"2402:4440:9c83::/34", "24423"}, - {"2804:e28:c0::/42", "52547"}, - {"2a00:7d00::/32", "41165"}, - {"2a03:aec0::/32", "199408"}, - {"2001:559:317::/48", "33489"}, - {"2405:b000:411::/39", "6262"}, - {"240e:95d:1000::/37", "136191"}, - {"2600:14c0:6::/44", "21342"}, - {"2806:230:2030::/48", "265594"}, - {"2a01:b747:a00::/34", "714"}, - {"2a0e:fd45:dd0::/38", "44103"}, - {"2401:d800:bf20::/41", "7552"}, - {"2406:e780:eb1::/48", "63679"}, - {"2605:1980:105::/46", "13951"}, - {"2a02:6b8:f::/42", "208722"}, - {"2001:559:868d::/48", "7922"}, - {"2001:67c:1028::/47", "12553"}, - {"2804:1ce4:4000::/32", "61681"}, - {"2a00:1d58:f021::/48", "47524"}, - {"2a07:12c0::/29", "25795"}, - {"2001:67c:ec::/48", "44097"}, - {"2001:1838:5100::/34", "23352"}, - {"2406:7bc0::/32", "141077"}, - {"2620:0:cc0::/48", "36692"}, - {"2806:2f0:24c2::/48", "17072"}, - {"2a02:26f7:f281::/46", "20940"}, - {"2a04:4e40:b600::/48", "54113"}, - {"2a05:6740:4060::/46", "206228"}, - {"2001:550:1e00:1::/47", "174"}, - {"2401:4900:6270::/40", "45609"}, - {"2804:14d:2a7f::/40", "28573"}, - {"2806:264:5501::/48", "13999"}, - {"2a04:e00:13::/48", "39855"}, - {"2a07:4880::/29", "24971"}, - {"2001:559:39e::/48", "33491"}, - {"2408:8456:b410::/42", "134543"}, - {"2a03:66e0::/32", "200538"}, - {"2804:12a4::/32", "263489"}, - {"2804:6d74::/32", "270534"}, - {"2806:101e:3::/45", "8151"}, - {"2a00:4802:1c00::/44", "13124"}, - {"2a00:a9a0::/32", "198721"}, - {"2408:8256:2f9c::/46", "17623"}, - {"240a:a610::/32", "144202"}, - {"240a:a6e0::/32", "144410"}, - {"2610:148::/32", "2637"}, - {"2803:c560:e000::/36", "207688"}, - {"2804:2e58::/32", "265340"}, - {"2804:806c::/32", "271749"}, - {"2a00:11c0:62::/48", "42354"}, - {"2a02:10:101::/29", "24785"}, - {"2a02:888:152::/47", "48695"}, - {"2a09:bac0:106::/47", "13335"}, - {"2a09:be40:3420::/48", "212348"}, - {"2a0f:ecc0::/29", "62167"}, - {"2602:fd1b::/36", "398871"}, - {"2001:550:102::/48", "16409"}, - {"2001:4818:4000::/36", "27272"}, - {"2a0a:4784::/32", "43317"}, - {"240a:a28d::/32", "143303"}, - {"2605:2680::/32", "393301"}, - {"2804:22c:e124::/35", "22689"}, - {"2c0e:2200::/32", "37457"}, - {"2001:678:4c0::/48", "41948"}, - {"2400:3620::/32", "149025"}, - {"2620:ac:4000::/48", "22652"}, - {"2804:6fc:bfff::/33", "28158"}, - {"2804:138b:b100::/33", "53037"}, - {"2a01:560::/29", "34087"}, - {"2a0c:b641:620::/44", "211851"}, - {"2001:4878:a246::/48", "12222"}, - {"2602:ffe2:ffe::/47", "53334"}, - {"2001:250:2411::/46", "23910"}, - {"2400:cb00:a300::/45", "13335"}, - {"2604:880:1::/46", "29802"}, - {"2606:4580::/32", "22684"}, - {"2620:0:880::/48", "29763"}, - {"2800:160:1b62::/45", "14259"}, - {"2804:6f34::/32", "28234"}, - {"2a0e:800:6666::/48", "139833"}, - {"2a10:4e40::/48", "209286"}, - {"2804:45e0::/32", "263065"}, - {"2806:202::/32", "28458"}, - {"2a06:1e00:14::/48", "60695"}, - {"2a07:4dc0::/29", "14576"}, - {"2407:c080:fc0::/35", "55990"}, - {"2001:67c:21ac::/48", "197727"}, - {"2401:d800:670::/40", "7552"}, - {"2801:1a0::/42", "52467"}, - {"2001:1248:9a60::/44", "11172"}, - {"2602:fed2:770a::/48", "53356"}, - {"2606:2800:4a20::/46", "15133"}, - {"2804:7c34::/32", "28361"}, - {"2a0e:84c0::/32", "24929"}, - {"2804:37d4::/32", "266438"}, - {"2001:559:384::/48", "33652"}, - {"240e:6b5:2000::/32", "4134"}, - {"2600:9000:2461::/48", "16509"}, - {"2607:4200::/32", "19214"}, - {"2a02:888:8052::/47", "48695"}, - {"2a07:c280::/32", "206892"}, - {"2001:559:1a8::/48", "7922"}, - {"2402:9d80:105::/48", "131429"}, - {"2408:8410::/29", "4837"}, - {"240e:67d:e600::/30", "4134"}, - {"2604:95c0::/32", "20130"}, - {"2804:3b20::/32", "266131"}, - {"2a04:5340::/47", "200081"}, - {"2400:3e20:e000::/35", "210542"}, - {"2406:c3c0::/32", "134823"}, - {"2606:4700:9640::/44", "13335"}, - {"2a00:6540::/29", "9032"}, - {"2a02:2b60:52::/39", "42947"}, - {"2a06:440::/29", "57842"}, - {"2a0b:4340:c3::/48", "44421"}, - {"2a0d:3640::/29", "8888"}, - {"2a11:2640::/31", "3170"}, - {"240a:a497::/32", "143825"}, - {"2602:feb4:110::/44", "25961"}, - {"2604:d600:625::/46", "32098"}, - {"2401:b200:46::/43", "24186"}, - {"2403:300:a04::/46", "6185"}, - {"2a00:1728:33::/32", "34224"}, - {"2a02:26f7:d700::/48", "36183"}, - {"2001:df7:6a80::/48", "137166"}, - {"2606:d680::/32", "4508"}, - {"2803:ab00::/40", "52471"}, - {"2804:7014:8100::/33", "270704"}, - {"240a:a955::/32", "145039"}, - {"240e:250:2907::/26", "4134"}, - {"2800:160:1886::/43", "14259"}, - {"2804:2728:3::/37", "263880"}, - {"2806:20d:16ff::/36", "32098"}, - {"2a01:5b0:25::/48", "48519"}, - {"2c0f:f578:30::/41", "24691"}, - {"2402:79c0:1179::/48", "26415"}, - {"2409:8028:30b3::/41", "56041"}, - {"240e:438:b360::/25", "4134"}, - {"240e:967:cc00::/35", "4134"}, - {"2620:137:5000::/42", "10851"}, - {"2804:3990::/32", "266036"}, - {"2a11:7980::/40", "210861"}, - {"2001:559:87c1::/48", "33667"}, - {"2400:3c00::/47", "38258"}, - {"2001:4888:8048::/45", "6167"}, - {"2405:9800:c92e::/41", "45430"}, - {"2407:cf40::/32", "146932"}, - {"240e:3bc:3e00::/33", "140308"}, - {"240e:6b1:2000::/32", "4134"}, - {"2620:da:4000::/48", "393945"}, - {"2a09:4c0:5701::/40", "58057"}, - {"2a0d:b201::/43", "206026"}, - {"2a0e:b107:ec0::/46", "212196"}, - {"2001:559:c1a1::/48", "33657"}, - {"240e:45c:c700::/40", "140538"}, - {"240e:60c:d800::/38", "137688"}, - {"240e:944:4000::/32", "4134"}, - {"2801:80:1a90::/48", "265490"}, - {"2a06:4400::/29", "50698"}, - {"2001:559:857e::/47", "33657"}, - {"2401:f4c0::/32", "132754"}, - {"2620:c2:4000::/48", "394101"}, - {"2a09:40c0::/48", "50007"}, - {"2c0f:ef00::/32", "327900"}, - {"2404:bf40:c580::/48", "2764"}, - {"2408:8956:900::/40", "17816"}, - {"2409:f:f3::/48", "142501"}, - {"2804:104c:a800::/40", "263629"}, - {"2a01:540:b000::/33", "12389"}, - {"2a02:26f7:bf50::/48", "36183"}, - {"2a12:7cc0::/29", "212986"}, - {"2401:6bff::/40", "9466"}, - {"2408:883a:7c0::/32", "4837"}, - {"2409:8d30::/29", "9808"}, - {"2a02:320::/29", "8351"}, - {"2405:9800:b022::/39", "45430"}, - {"2606:cd00:2::/43", "40845"}, - {"2a01:47c2::/32", "12301"}, - {"2a02:26f7:c9c0::/48", "36183"}, - {"2001:67c:214c::/48", "24909"}, - {"2401:3c0:106::/48", "45528"}, - {"2409:8a51:f00::/35", "56047"}, - {"2600:6c38:cc::/46", "20115"}, - {"2605:a900:9001::/33", "46887"}, - {"2a02:26f7:d448::/48", "36183"}, - {"2001:420:4488::/32", "109"}, - {"2401:c700::/42", "55639"}, - {"240a:a82e::/32", "144744"}, - {"2606:4f40::/32", "64227"}, - {"2610:108:3000::/48", "13506"}, - {"2402:b780:54::/32", "64047"}, - {"2409:874c:ce00::/30", "9808"}, - {"2a01:80a0:ffff::/48", "62156"}, - {"2001:559:c33c::/48", "7015"}, - {"2402:800:5355::/42", "7552"}, - {"2409:8a53:d00::/38", "56047"}, - {"2806:1080:101::/48", "19373"}, - {"2409:8e80:b000::/23", "9808"}, - {"2804:3734::/32", "266396"}, - {"2804:7c54::/32", "271489"}, - {"2a00:b7c0::/32", "47548"}, - {"2a02:cf80:3::/48", "35435"}, - {"2a04:b904::/48", "211321"}, - {"2001:240::/32", "2497"}, - {"2001:67c:324::/48", "30950"}, - {"2a02:2b00::/32", "702"}, - {"2600:9000:1e25::/44", "16509"}, - {"2605:1980:204::/47", "13951"}, - {"2a02:2008::/32", "49503"}, - {"2001:df0:264::/48", "132043"}, - {"2001:1900:2368::/47", "3356"}, - {"2604:d600:14::/44", "32098"}, - {"2a02:26f7:decc::/48", "36183"}, - {"2a04:f340:1100::/29", "8758"}, - {"2a0e:46c4:2910::/48", "138435"}, - {"2001:67c:2c90::/47", "31308"}, - {"2001:4c08::/34", "3356"}, - {"2620:52:2::/48", "22753"}, - {"2806:20d:1d31::/45", "32098"}, - {"2a02:20c8:1242::/34", "50304"}, - {"2a02:ee80:4011::/48", "3573"}, - {"2a06:db80::/29", "24631"}, - {"2a0e:b107:10c0::/44", "211495"}, - {"2001:df2:d100::/48", "136707"}, - {"240a:a27e::/32", "143288"}, - {"240a:acd9::/32", "145939"}, - {"2801:196::/48", "19429"}, - {"2a09:bac0:308::/48", "13335"}, - {"2408:8956:2140::/40", "17816"}, - {"2600:3000:5200::/31", "13649"}, - {"2602:fd10:8f0::/44", "398795"}, - {"2001:4388:7::/32", "8452"}, - {"2600:9000:114b::/48", "16509"}, - {"2a0e:b107:b10::/48", "212580"}, - {"2408:8256:356f::/48", "17816"}, - {"2001:559:121::/48", "33287"}, - {"2404:9200::/32", "2516"}, - {"240e:3b3:1800::/34", "4134"}, - {"2a0e:8f02:f002::/48", "213124"}, - {"2001:67c:600::/48", "20491"}, - {"2804:1e0c:fffe::/47", "264141"}, - {"2a0e:4180::/29", "25540"}, - {"240e:940:ce00::/40", "136197"}, - {"2804:69c0::/32", "270289"}, - {"2a01:e00::/30", "12322"}, - {"2a0c:e304:2::/30", "198985"}, - {"2a0f:f0c0::/32", "6830"}, - {"2001:67c:2b2c::/48", "212129"}, - {"2401:2d00::/46", "17625"}, - {"2607:f738:600::/41", "17184"}, - {"2a00:1851:8000::/34", "29357"}, - {"2001:559:859b::/48", "7015"}, - {"2001:559:c2bb::/48", "7015"}, - {"2600:1406:7400::/48", "35994"}, - {"2804:4ae4::/35", "267270"}, - {"2a06:4dc0::/29", "60501"}, - {"2a07:79c0::/29", "44920"}, - {"2001:678:5d8::/48", "3399"}, - {"2401:1d40:3f01::/48", "59019"}, - {"2401:ee00:2011::/40", "23951"}, - {"240a:abf6::/32", "145712"}, - {"2620:121:d000::/44", "19108"}, - {"2804:2ec0::/32", "265364"}, - {"2a09:ac40::/32", "57040"}, - {"2607:f110:e810::/38", "21889"}, - {"2a01:ae40::/32", "199163"}, - {"2001:250:700d::/43", "23910"}, - {"2001:559:876d::/48", "7015"}, - {"2001:fb1:fe1::/34", "17552"}, - {"2402:800:7470::/40", "7552"}, - {"2403:b4c0::/35", "138398"}, - {"2602:fe37::/36", "54987"}, - {"2610:f0:afb::/34", "22925"}, - {"2001:668:118::/45", "3257"}, - {"2402:800:3bfe::/37", "7552"}, - {"2606:1a40:2015::/48", "398962"}, - {"2607:f8f0:200::/48", "271"}, - {"2804:3d90::/32", "266539"}, - {"2a00:db00::/32", "47868"}, - {"2a03:90c0:999f::/48", "199524"}, - {"2a0c:fc0::/29", "204383"}, - {"2804:4680::/32", "266993"}, - {"2806:230:403c::/48", "265594"}, - {"2806:230:5010::/48", "265594"}, - {"2a02:26f0:6200::/48", "34164"}, - {"2400:4fc0:b::/48", "134146"}, - {"2401:c240::/35", "132847"}, - {"240a:a4b4::/32", "143854"}, - {"240a:adb4::/32", "146158"}, - {"2602:fca7:f01::/46", "399318"}, - {"2804:18:820::/44", "10429"}, - {"2804:642c::/32", "269411"}, - {"2804:791c::/32", "271285"}, - {"2806:310:130::/37", "16960"}, - {"2a07:7f00::/29", "43142"}, - {"2a0d:d900::/48", "61138"}, - {"2001:4888:8060::/48", "6167"}, - {"2605:5d00::/32", "27288"}, - {"2800:bf0:73::/44", "52257"}, - {"2a02:26f7:f688::/48", "36183"}, - {"2400:cb00:aa90::/47", "13335"}, - {"2405:8180:1100::/32", "135478"}, - {"2407:5280:300::/45", "133557"}, - {"2600:6c4a::/32", "20115"}, - {"2620:74:2b::/48", "40717"}, - {"2800:320:8403::/45", "27882"}, - {"2a02:e0:3003::/45", "34984"}, - {"2a02:26f7:f081::/46", "20940"}, - {"2a10:d640::/29", "211309"}, - {"2800:bf0:81c0::/47", "52257"}, - {"2804:391c:1a::/47", "262287"}, - {"2804:76c0::/32", "271132"}, - {"2a05:8dc0::/29", "15377"}, - {"2a0b:fd87:ffff::/48", "49419"}, - {"2a10:cc42:15e1::/45", "20473"}, - {"2602:803::/48", "393457"}, - {"2403:a200:a1ff::/48", "4811"}, - {"2605:db80::/32", "5742"}, - {"2804:57f4::/37", "268097"}, - {"2001:da8:a4::/48", "24364"}, - {"2602:fc9e::/40", "399525"}, - {"2402:800:5971::/44", "7552"}, - {"240a:a8e5::/32", "144927"}, - {"2600:1002:f110::/31", "22394"}, - {"2603:f348::/29", "63023"}, - {"2606:ae80:1c20::/43", "19834"}, - {"2a0c:c440::/29", "44489"}, - {"2001:1640::/32", "25394"}, - {"2404:f4c0:f703::/44", "138517"}, - {"2408:8245:1200::/32", "4837"}, - {"2605:a404:210::/45", "33363"}, - {"2620:0:890::/48", "54113"}, - {"2804:18c0:1a00::/32", "61951"}, - {"2001:250:1c0e::/39", "23910"}, - {"240a:a793::/32", "144589"}, - {"2602:fdc6::/36", "29768"}, - {"2a00:7142::/31", "51430"}, - {"2a03:2880:f022::/43", "32934"}, - {"2a05:c900::/32", "42463"}, - {"2001:678:17::/48", "43832"}, - {"2806:261:1400::/41", "13999"}, - {"2620:0:30::/45", "8075"}, - {"2804:3dd4::/32", "266556"}, - {"2806:20d:5a24::/39", "32098"}, - {"2a02:2a08::/32", "39923"}, - {"2403:fc0::/35", "398704"}, - {"2402:4f00:f000::/36", "58807"}, - {"2620:139:6004::/48", "22600"}, - {"2a00:1148:5::/48", "21051"}, - {"2a01:540:5000::/34", "12389"}, - {"2a02:26f7:eb45::/46", "20940"}, - {"2404:cf00:f001::/36", "38511"}, - {"2a09:407:e000::/36", "210625"}, - {"2a0b:db80::/29", "48004"}, - {"2a10:2240::/32", "205885"}, - {"2001:1a11:11d::/48", "8781"}, - {"2600:1007:9110::/36", "22394"}, - {"2600:6c38:150::/42", "20115"}, - {"2606:6680:15::/44", "40676"}, - {"2804:6e9c::/32", "270608"}, - {"2a03:4d41:900::/40", "199610"}, - {"2001:559:87c2::/48", "33490"}, - {"2001:df4:c200::/48", "58522"}, - {"2804:8644::/32", "272632"}, - {"2806:2f0:71e1::/46", "17072"}, - {"2a02:61a0::/32", "41937"}, - {"2400:3b00:40::/48", "18229"}, - {"2405:ec00::/45", "23955"}, - {"2408:8256:398b::/48", "17816"}, - {"240e:104:7c00::/40", "137690"}, - {"2600:40f1::/48", "46639"}, - {"2804:14c:bbe5::/43", "28573"}, - {"2804:105c::/32", "263631"}, - {"2804:1c84::/46", "61659"}, - {"2804:3460::/32", "265453"}, - {"2a0e:fd45:40f6::/48", "202297"}, - {"2403:1940::/47", "137935"}, - {"2a04:4e40:b400::/47", "54113"}, - {"2a0a:4940:1::/44", "208972"}, - {"2600:1003:b4e0::/36", "22394"}, - {"2804:63b4::/32", "269378"}, - {"2806:230:1023::/48", "11888"}, - {"2a05:2a80::/47", "200567"}, - {"2001:67c:2d8::/48", "13042"}, - {"2001:df3:f800::/48", "59216"}, - {"2404:0:70b0::/36", "131142"}, - {"2407:9f00::/32", "58834"}, - {"2408:8956:9400::/40", "17622"}, - {"240e:3b1:8200::/35", "140316"}, - {"2a02:26f7:db01::/46", "20940"}, - {"2a02:26f7:e68c::/48", "36183"}, - {"2001:400:6411::/41", "293"}, - {"2400:d280:a::/32", "45648"}, - {"2401:d800:ba60::/40", "7552"}, - {"2403:8600:c090::/42", "45820"}, - {"240a:a2c9::/32", "143363"}, - {"2804:14c:a785::/41", "28573"}, - {"2a05:24c0:1::/46", "211889"}, - {"2a0b:2900:1f00::/40", "48582"}, - {"2a11:8d00::/29", "61271"}, - {"2402:800:f600::/42", "7552"}, - {"2605:3a40:4::/48", "6233"}, - {"2607:fdf0:5e39::/41", "8008"}, - {"2a10:200::/47", "208059"}, - {"2001:1808::/32", "46650"}, - {"2804:5d6c::/32", "268971"}, - {"2a05:2100::/30", "198977"}, - {"2a0a:44c0::/29", "50083"}, - {"2a02:158:aa00::/39", "44946"}, - {"2800:1e0:2100::/40", "64124"}, - {"2a02:26f0:78::/45", "20940"}, - {"2001:559:5c1::/48", "33651"}, - {"2001:67c:d8::/48", "47708"}, - {"2600:1406:6400::/48", "35994"}, - {"2806:220::/32", "28503"}, - {"2001:252::/32", "23911"}, - {"240e:96b:6012::/45", "140370"}, - {"2604:da80::/32", "29886"}, - {"2a00:fcc0::/32", "9135"}, - {"2a0c:b642:200::/39", "206499"}, - {"2600:1402:f001::/31", "20940"}, - {"2606:2800:e400::/43", "15133"}, - {"2610:a1:301c::/48", "12008"}, - {"2803:b0e0:9985::/33", "269862"}, - {"2a0a:ce80::/29", "40970"}, - {"2a0b:b87:ff10::/48", "210902"}, - {"2a0e:fd45:40fa::/48", "7489"}, - {"2001:559:77a::/48", "7725"}, - {"2001:1248:970e::/43", "11172"}, - {"240e:438:ae20::/43", "140647"}, - {"2804:4b0:35c::/42", "262459"}, - {"2804:138b:b030::/40", "53037"}, - {"2804:2b38:e020::/35", "265141"}, - {"2402:8100:20e2::/48", "55644"}, - {"2801:80:460::/48", "52915"}, - {"2a0f:9400:7370::/44", "213092"}, - {"2600:1404:e401::/38", "20940"}, - {"2803:8d20::/32", "28007"}, - {"2804:15e4:6::/36", "53001"}, - {"2804:25d0::/32", "262656"}, - {"240a:a8db::/32", "144917"}, - {"2a01:b740:a11::/45", "714"}, - {"2a05:d050:9080::/44", "16509"}, - {"2a0e:4280::/29", "59717"}, - {"2001:559:82a1::/48", "33651"}, - {"2001:559:842c::/48", "33657"}, - {"2604:8d80::/32", "13427"}, - {"2620:11a:a01c::/48", "36040"}, - {"2a02:26f7:e140::/48", "36183"}, - {"2a03:2902::/32", "31400"}, - {"2a0a:b706:999f::/48", "204363"}, - {"2402:1d40:5005::/36", "58826"}, - {"240a:a1fb::/32", "143157"}, - {"2a0e:46c4:29f0::/44", "147047"}, - {"2400:2000:6::/47", "20940"}, - {"2402:800:94c5::/42", "7552"}, - {"2001:67c:1d4::/48", "2043"}, - {"2408:8956:de00::/40", "17622"}, - {"2606:2e00:800c::/48", "36351"}, - {"2803:9620:2501::/32", "265865"}, - {"2804:37f0:9100::/36", "266445"}, - {"2804:4984::/32", "267188"}, - {"2a09:4d42::/29", "44812"}, - {"2a0f:5707:abd0::/44", "210881"}, - {"2001:559:c2c9::/46", "7922"}, - {"2402:8100:31d2::/45", "55644"}, - {"240a:a696::/32", "144336"}, - {"2804:7d98::/32", "271571"}, - {"2a04:e840::/29", "47704"}, - {"2a0d:2406:11ea::/48", "212025"}, - {"2001:559:8763::/48", "33667"}, - {"2405:55c0:82::/32", "63991"}, - {"240a:a4ba::/32", "143860"}, - {"2a02:26f7:c000::/48", "36183"}, - {"2a04:5180::/29", "34855"}, - {"2c0f:ee78::/32", "61317"}, - {"2401:d800:2320::/41", "7552"}, - {"2407:b4c0:c::/47", "142366"}, - {"240a:a884::/32", "144830"}, - {"2803:5ce0:700::/40", "27887"}, - {"2804:2f30::/33", "53096"}, - {"2001:559:84e1::/48", "33657"}, - {"2400:cb00:a260::/47", "13335"}, - {"240e:44d:f00::/42", "140345"}, - {"2801:1a:a800::/48", "19429"}, - {"2804:15d4::/33", "263413"}, - {"2402:8100:2360::/43", "55644"}, - {"2403:5800:6::/27", "4764"}, - {"2a03:3180:f::/48", "47692"}, - {"2001:559:fc::/47", "33490"}, - {"240a:a3ab::/32", "143589"}, - {"2602:233::/32", "7782"}, - {"2804:4e1c::/32", "268240"}, - {"2a02:7940::/32", "9063"}, - {"2a04:f8c0::/29", "201698"}, - {"2001:67c:2a1c::/48", "24836"}, - {"240a:a8d7::/32", "144913"}, - {"2600:6c7f:91f0::/44", "20115"}, - {"2804:1110:ab00::/47", "262901"}, - {"2402:8100:267a::/45", "55644"}, - {"2406:e500:2::/33", "58593"}, - {"2602:804:1000::/45", "14536"}, - {"2604:81c0:1000::/36", "396422"}, - {"2606:6240:174::/48", "398447"}, - {"2a05:3fc0::/29", "201491"}, - {"2a06:d641::/32", "49981"}, - {"2a0b:4d80::/29", "206492"}, - {"2a0e:97c0:4f0::/48", "211013"}, - {"2a11:e487:affe::/48", "212568"}, - {"2001:559:c22a::/48", "33651"}, - {"2001:1aa8::/32", "24642"}, - {"2404:ba00:ff::/48", "17665"}, - {"240a:ae65::/32", "146335"}, - {"2602:ff5d::/36", "27382"}, - {"2605:f440:5600::/47", "50555"}, - {"2620:8f:4002::/44", "3424"}, - {"2001:559:8204::/48", "7015"}, - {"2001:67c:254c::/48", "39871"}, - {"2001:828::/32", "21155"}, - {"2801:116:a::/48", "271827"}, - {"2a00:17e0::/32", "49983"}, - {"2a02:ee80:2020::/43", "3573"}, - {"2a0d:3c42::/32", "25369"}, - {"2a0f:2f40::/29", "60262"}, - {"2001:da8:7006::/47", "132553"}, - {"240a:a3c2::/32", "143612"}, - {"2604:f980:4480::/43", "19957"}, - {"2001:559:82b9::/48", "33659"}, - {"2405:4cc1:c00::/40", "132468"}, - {"240e:f:d000::/27", "4134"}, - {"240e:964:9600::/39", "133776"}, - {"2804:7198::/32", "270799"}, - {"2001:c18::/32", "10204"}, - {"2401:d800:26c0::/42", "7552"}, - {"2408:8957:c400::/40", "17622"}, - {"240e:d9:a500::/36", "38283"}, - {"2804:1c8::/39", "53184"}, - {"2804:2674:c000::/40", "264344"}, - {"2606:2800:6a6a::/48", "15133"}, - {"2803:c100::/32", "28103"}, - {"2a04:4e40::/48", "54113"}, - {"2a10:340::/30", "207995"}, - {"2001:559:c249::/46", "33651"}, - {"2401:d800:2ee0::/39", "7552"}, - {"2603:90fb:20::/41", "19115"}, - {"2804:1120::/32", "52670"}, - {"2804:2d00::/32", "265256"}, - {"240a:a2dd::/32", "143383"}, - {"240a:a705::/32", "144447"}, - {"2620:12e:3009::/45", "25670"}, - {"2804:3a6c::/32", "266088"}, - {"2a04:d740::/29", "12907"}, - {"2600:6c10:ff06::/44", "20115"}, - {"2606:93c0::/32", "400220"}, - {"2607:2f80::/32", "2734"}, - {"2a0f:9a80::/29", "51290"}, - {"2a11:7440::/29", "204790"}, - {"2407:53c0::/44", "63630"}, - {"240a:acd6::/32", "145936"}, - {"2604:d600:1592::/44", "32098"}, - {"2804:93c:8101::/36", "52878"}, - {"2001:559:c066::/48", "7922"}, - {"2001:4b20:10:4101::/44", "34288"}, - {"2800:bf0:812e::/41", "27947"}, - {"2804:6d44:9000::/33", "270521"}, - {"2804:7de4::/32", "271589"}, - {"2a0d:63c0::/32", "200313"}, - {"2001:678:27c::/48", "203369"}, - {"2400:9380:9121::/48", "4809"}, - {"2800:68:53::/36", "61468"}, - {"2a0a:2842:481::/48", "42962"}, - {"2001:559:c083::/48", "33657"}, - {"2001:579:c9c0::/38", "22773"}, - {"2001:13d2:e801::/29", "7303"}, - {"2804:5a6c::/32", "268772"}, - {"2a06:80::/29", "206312"}, - {"2408:8646::/35", "140726"}, - {"2804:383c:300::/32", "52601"}, - {"2806:1016:4::/48", "8151"}, - {"2a04:b5c0::/29", "2611"}, - {"2a07:3500:19a8::/48", "38915"}, - {"2a0c:b641:210::/48", "209661"}, - {"2600:1802:5::/46", "16552"}, - {"2804:1270::/40", "262851"}, - {"2a03:ab80::/32", "197876"}, - {"2a04:27c0::/29", "197706"}, - {"2a0b:5a40::/29", "1764"}, - {"2a0c:14c0::/29", "204188"}, - {"2602:fed2:7113::/48", "53356"}, - {"2a00:7143:102::/29", "51430"}, - {"2a0a:5400::/29", "49010"}, - {"2001:559:856a::/48", "7016"}, - {"2001:1248:99ab::/41", "11172"}, - {"2408:84f3:9a40::/37", "17816"}, - {"240a:a608::/32", "144194"}, - {"2600:1406:5801::/34", "20940"}, - {"2602:fd58:1::/48", "32505"}, - {"2620:149:a16::/48", "6185"}, - {"2a00:1620::/32", "137"}, - {"2a02:26f7:5f::/48", "20940"}, - {"2a02:ed04:4710::/30", "50304"}, - {"2a06:f240::/29", "207355"}, - {"2a07:e345:3::/44", "211588"}, - {"2a0c:7180::/29", "35207"}, - {"2001:559:c2ad::/48", "7015"}, - {"2001:67c:2f1c::/48", "41847"}, - {"2402:800:3c71::/40", "7552"}, - {"2602:fdc2::/48", "397720"}, - {"2607:f428:9370::/44", "19115"}, - {"2a02:7b07::/48", "48328"}, - {"2401:c000::/32", "24323"}, - {"2403:cc0::/32", "131314"}, - {"2408:8456:3e10::/42", "134543"}, - {"2800:d302:20::/47", "11830"}, - {"2001:67c:1240::/48", "198812"}, - {"2001:ee0:8940::/38", "45899"}, - {"240a:a088::/32", "142786"}, - {"2605:a480::/32", "32703"}, - {"2800:160:1b28::/43", "14259"}, - {"2804:c00:d000::/34", "52655"}, - {"2a04:ad80::/47", "44684"}, - {"2401:d800:78a0::/41", "7552"}, - {"240a:a015::/32", "142671"}, - {"240a:a6a2::/32", "144348"}, - {"2803:1460::/32", "267837"}, - {"2001:4490:d780::/46", "9829"}, - {"2408:8957:5800::/40", "17622"}, - {"2a02:ae8::/29", "20625"}, - {"2a02:26f0:2901::/38", "20940"}, - {"2a0a:640::/32", "34762"}, - {"2001:559:8771::/46", "7922"}, - {"2001:67c:1734::/48", "60805"}, - {"2402:800:9655::/42", "7552"}, - {"2403:6000:900::/32", "24085"}, - {"2400:cb00:253::/44", "13335"}, - {"2404:fd00:facf::/37", "58552"}, - {"2408:8346::/35", "140726"}, - {"2600:1007:9000::/44", "6167"}, - {"2804:2050:4abd::/35", "264485"}, - {"2401:d800:95e0::/38", "7552"}, - {"2407:8b40::/32", "135188"}, - {"240a:afc1::/32", "146683"}, - {"2605:ba80::/32", "40473"}, - {"2a02:26f7:ae::/48", "36183"}, - {"240a:aa62::/32", "145308"}, - {"2605:a900::/45", "46887"}, - {"2a02:17d0::/32", "12668"}, - {"2a0b:6b84:1338::/32", "200639"}, - {"2c0f:ee28::/32", "37172"}, - {"240c:c0a8:9c02::/33", "24348"}, - {"240e:3b5:3e00::/33", "140308"}, - {"2001:1900:222c::/46", "3356"}, - {"2404:1940::/32", "136030"}, - {"240a:a933::/32", "145005"}, - {"2804:5da0::/32", "268983"}, - {"2a00:4920::/32", "202169"}, - {"2a07:6000::/29", "59586"}, - {"2001:df0:301::/48", "18402"}, - {"2405:b40:2a::/43", "55674"}, - {"2a02:26f7:f799::/42", "20940"}, - {"2a03:ec00:b900::/40", "24921"}, - {"2a06:7580::/29", "203460"}, - {"2001:559:8362::/48", "33491"}, - {"2001:559:c292::/48", "33287"}, - {"2405:9800:d200::/48", "134240"}, - {"240e:354:6400::/31", "4134"}, - {"2800:800:900::/44", "26611"}, - {"2a02:26f7:e808::/48", "36183"}, - {"2404:ae00:12::/47", "45474"}, - {"2800:160:1367::/43", "14259"}, - {"2a02:26f7:f605::/46", "20940"}, - {"2404:4a00:5543::/36", "45629"}, - {"2804:1408:a001::/33", "28635"}, - {"2a02:ad8:1600::/34", "12389"}, - {"2a0b:9780::/29", "41847"}, - {"2001:559:574::/48", "33657"}, - {"2404:4a00:3:1::/48", "45629"}, - {"2804:8244::/32", "272509"}, - {"2408:8434::/28", "4837"}, - {"2a00:1c10:fff0::/44", "50300"}, - {"2a01:a1e0:1::/48", "39293"}, - {"2a02:850:ffe5::/46", "1921"}, - {"2a0b:100::/29", "210858"}, - {"2001:67c:8f4::/48", "210189"}, - {"2400:6280:130::/48", "132280"}, - {"2408:8256:319f::/38", "17816"}, - {"240a:a319::/32", "143443"}, - {"240a:a3af::/32", "143593"}, - {"2803:2500::/32", "262253"}, - {"2804:1248:5000::/32", "263467"}, - {"2806:261:507::/48", "13999"}, - {"2a07:3501:1050::/48", "39686"}, - {"2a0b:6200::/29", "16010"}, - {"2804:fec::/32", "262493"}, - {"2a0a:f584::/32", "62240"}, - {"2a0f:de00::/29", "208253"}, - {"2a10:8441:112::/48", "8422"}, - {"2001:250:2807::/48", "23910"}, - {"2409:8904:4f60::/35", "24547"}, - {"2600:1002:f010::/40", "22394"}, - {"2605:3380:4474::/44", "12025"}, - {"2800:bf0:81e7::/44", "27947"}, - {"2a0e:8f02:1024::/46", "204446"}, - {"2001:253:138::/48", "142104"}, - {"2a0e:b107:178c::/47", "208679"}, - {"2001:67c:2980::/48", "196948"}, - {"2404:ba00:e::/48", "17665"}, - {"2405:9800:c909::/48", "55476"}, - {"2a01:62a0::/32", "206250"}, - {"240a:a4b5::/32", "143855"}, - {"240e:679:8400::/38", "140329"}, - {"2607:fd28:a006::/48", "3725"}, - {"2a00:7800::/32", "51929"}, - {"2a0f:d180::/31", "208041"}, - {"2a12:a4c1::/32", "35543"}, - {"2001:dce:3::/48", "133532"}, - {"2001:fd8:61::/46", "4775"}, - {"2400:ea00::/48", "23884"}, - {"2408:8957:4400::/40", "17622"}, - {"2409:8028:1090::/41", "56041"}, - {"2620:1ec:8fd::/46", "8075"}, - {"2a00:ee0::/29", "5603"}, - {"2a02:26f0:f401::/39", "20940"}, - {"2001:559:82fe::/48", "33660"}, - {"2407:b001::/35", "24121"}, - {"240e:97c:4000::/36", "4816"}, - {"2804:294:8100::/33", "28604"}, - {"2a09:6980::/29", "56598"}, - {"2001:da8:a005::/43", "24352"}, - {"2400:adc0:4300::/47", "9541"}, - {"240a:a2fc::/32", "143414"}, - {"2804:4d80::/36", "268200"}, - {"2a02:26f7:55::/48", "20940"}, - {"2a02:2e02:2f40::/40", "12479"}, - {"2001:dc7:5dcd::/42", "24151"}, - {"2606:2800:130::/48", "15133"}, - {"2a02:4b0:217::/32", "43751"}, - {"2a02:26f7:d405::/46", "20940"}, - {"2402:800:56c5::/43", "7552"}, - {"2404:e801:1004::/46", "55430"}, - {"2409:8904:5a40::/42", "24547"}, - {"2a10:5940::/29", "207603"}, - {"2402:800:9ec0::/43", "7552"}, - {"2600:370f:3101::/45", "32261"}, - {"2a02:26f7:b645::/46", "20940"}, - {"2a02:5a80::/29", "197729"}, - {"2a03:dc40:ffff::/48", "196904"}, - {"2400:1520::/44", "132829"}, - {"240e:37d::/35", "140329"}, - {"2602:fce1:250::/48", "395886"}, - {"2606:2800:50a0::/43", "15133"}, - {"2406:a1c0:2::/48", "131921"}, - {"2408:8756:2c00::/40", "135061"}, - {"240a:a59f::/32", "144089"}, - {"2600:1417:3801::/33", "20940"}, - {"2605:ee00:30::/41", "29990"}, - {"2a00:6fc0:c010::/44", "3215"}, - {"2a0b:b87:ffea::/48", "201331"}, - {"2401:d800:dea0::/41", "7552"}, - {"240e:3b0:4c00::/35", "136200"}, - {"2600:6000:fd41::/43", "12271"}, - {"2607:f670::/32", "10587"}, - {"2804:3cd0::/32", "266236"}, - {"2804:446c::/32", "28369"}, - {"2a02:2aa8:203::/43", "702"}, - {"2a05:d01a::/36", "16509"}, - {"2c0e:4000:a000::/36", "36994"}, - {"2001:559:37::/48", "7046"}, - {"2600:1009:9000::/44", "6167"}, - {"2600:1010:a100::/43", "6167"}, - {"2803:2e40:102::/44", "27796"}, - {"2804:6ba0::/32", "270413"}, - {"2804:6ec8::/32", "270618"}, - {"2a09:bac0:445::/48", "13335"}, - {"240e:438:ae40::/35", "4134"}, - {"2800:370:44::/48", "28006"}, - {"2a02:26f7:d249::/46", "20940"}, - {"2a10:b641::/36", "211607"}, - {"2001:559:c29e::/48", "33287"}, - {"2407:14c0:800::/32", "138077"}, - {"2a01:8c20::/32", "8368"}, - {"2a02:26f7:c7::/48", "20940"}, - {"2001:67c:2bd4::/48", "1257"}, - {"2406:e002:3000::/33", "23655"}, - {"2804:4734::/34", "267038"}, - {"2a06:26c0::/29", "31662"}, - {"2001:559:c4e9::/48", "33657"}, - {"2405:84c0:ff11::/48", "9886"}, - {"2602:ff36::/38", "395348"}, - {"2a00:4b40::/32", "51013"}, - {"2a03:96e0:8000::/33", "2119"}, - {"2001:559:868a::/48", "33657"}, - {"2001:da8:249::/48", "24350"}, - {"2407:3640::/32", "141995"}, - {"240a:a066::/32", "142752"}, - {"2001:67c:22a4::/48", "56825"}, - {"240a:a5e7::/32", "144161"}, - {"2803:fce0::/32", "269916"}, - {"2804:265c::/32", "264329"}, - {"2804:764c::/32", "271102"}, - {"2401:d800:be22::/41", "7552"}, - {"2600:1404:b401::/38", "20940"}, - {"2604:d600:554::/44", "32098"}, - {"2a02:26f7:c648::/48", "36183"}, - {"2a03:5100::/32", "197742"}, - {"2a04:ff07::/32", "202297"}, - {"2001:559:1b7::/48", "7922"}, - {"2600:141b:a000::/48", "35994"}, - {"2600:6c21:a0f::/43", "20115"}, - {"2606:ae00:6d40::/40", "7287"}, - {"2620:116:800a::/48", "16509"}, - {"2a00:1a28:101::/35", "42708"}, - {"2a10:e580:2000::/48", "399114"}, - {"2800:ba0:4::/48", "263812"}, - {"2804:28ac::/32", "263974"}, - {"2a02:2208::/47", "6697"}, - {"2a0e:1e40::/29", "64484"}, - {"2a11:fe80::/32", "209209"}, - {"2405:8a00:4020::/34", "55824"}, - {"2600:140b:15::/38", "20940"}, - {"2606:2800:5012::/48", "15133"}, - {"2804:8078::/32", "271752"}, - {"2a00:58c0::/48", "200774"}, - {"2a02:6b60::/28", "201838"}, - {"2001:559:8518::/42", "7015"}, - {"2001:67c:1050::/48", "58130"}, - {"2001:890:c000::/34", "8562"}, - {"2001:12d8::/40", "1251"}, - {"2408:8207:19d0::/32", "4808"}, - {"240a:aad7::/32", "145425"}, - {"2607:f9d0::/39", "11979"}, - {"2803:5440:4062::/45", "264738"}, - {"2803:9a40:8001::/46", "263824"}, - {"2803:c180:2110::/38", "52341"}, - {"2804:4448::/32", "267622"}, - {"2804:5f84::/32", "269105"}, - {"2a0d:2680:1100::/40", "20473"}, - {"2001:578:110::/46", "22773"}, - {"2408:840d:1e00::/42", "17621"}, - {"2804:6d04::/32", "270507"}, - {"2a0a:54c1:53::/45", "62240"}, - {"240a:a4b2::/32", "143852"}, - {"2604:f100::/32", "33234"}, - {"2620:f::/48", "3754"}, - {"2804:fdc::/32", "263608"}, - {"2a01:bf40::/32", "15691"}, - {"2a02:ee80:4042::/45", "3573"}, - {"2a09:bec0::/32", "12552"}, - {"2c0f:f2e8::/32", "37182"}, - {"2001:559:832c::/48", "7016"}, - {"2001:579:d184::/42", "22773"}, - {"2401:8d00:3::/48", "38345"}, - {"2607:ce00::/32", "53488"}, - {"2804:32c0::/32", "265097"}, - {"2a01:7ee0::/48", "1257"}, - {"2a02:26f7:d78c::/48", "36183"}, - {"2400:7400:e02a::/47", "23736"}, - {"2405:ef00:18::/32", "58779"}, - {"2804:5cc8:3300::/32", "268930"}, - {"2001:559:278::/48", "7015"}, - {"2001:5b0:2100::/37", "6621"}, - {"2402:e280:214f::/43", "134674"}, - {"240a:a6cf::/32", "144393"}, - {"2a02:26f7:f588::/48", "36183"}, - {"2a04:940:2::/35", "51407"}, - {"2605:6c80:2::/48", "14935"}, - {"2a01:4400:6::/48", "1257"}, - {"2a0c:d4c0::/29", "8823"}, - {"2406:4a00:15::/48", "56038"}, - {"2409:8043:2c02::/47", "9808"}, - {"2409:8c20:1832::/48", "56046"}, - {"2600:380:7680::/39", "20057"}, - {"2804:7fe0:4000::/34", "271715"}, - {"2a03:a0e0::/32", "44493"}, - {"2607:f598::/32", "32329"}, - {"2610:130:2301::/48", "14513"}, - {"2a03:31c0::/37", "43256"}, - {"2001:678:80c::/48", "29560"}, - {"2409:8914:c200::/39", "56044"}, - {"2804:9ec::/37", "263002"}, - {"2806:230:600c::/48", "265594"}, - {"2a07:b000::/29", "35902"}, - {"2001:250:810::/47", "138182"}, - {"2a00:de00::/32", "56566"}, - {"2001:559:1bc::/48", "33659"}, - {"2001:fd8:e1::/46", "4775"}, - {"2401:4900:4f52::/48", "45609"}, - {"240a:a2c1::/32", "143355"}, - {"2607:fd48:204::/39", "13536"}, - {"2a0e:f240::/29", "208348"}, - {"2602:fcff::/48", "40916"}, - {"2804:eec:11c5::/38", "28226"}, - {"2a01:ce85::/35", "51964"}, - {"240e:3b9:2200::/37", "136198"}, - {"2804:fe4::/32", "28343"}, - {"2a03:1a20:10::/48", "207467"}, - {"2a11:af40::/29", "210626"}, - {"2001:c20:48a5::/48", "3758"}, - {"2600:1006:b0d0::/42", "6167"}, - {"2602:fce1:241::/48", "395886"}, - {"2801:80:220::/48", "262483"}, - {"2804:14d:be84::/44", "28573"}, - {"2a04:6bc0::/36", "48635"}, - {"2a07:980::/29", "48213"}, - {"2606:4700:4700::/48", "13335"}, - {"2804:2ff0::/32", "264921"}, - {"2806:230:1002::/48", "265594"}, - {"2001:559:126::/48", "33659"}, - {"2001:559:236::/48", "7922"}, - {"2001:1248:97ff::/36", "11172"}, - {"2401:4900:3a00::/42", "45609"}, - {"240a:af16::/32", "146512"}, - {"240e:67a:e400::/39", "140330"}, - {"2804:1040:fb00::/37", "263626"}, - {"2804:1998::/32", "61805"}, - {"2a02:348:7a::/40", "35470"}, - {"2001:550:6c04::/48", "26824"}, - {"2a02:25c8::/32", "43557"}, - {"2a0e:c80:743::/48", "40676"}, - {"2001:57a:7008::/32", "22773"}, - {"2001:4408:8300::/44", "4758"}, - {"2406:1940::/32", "131925"}, - {"2409:8053:1100::/37", "9808"}, - {"2409:8087:2000::/45", "56046"}, - {"240a:a502::/32", "143932"}, - {"2a07:cc00::/29", "207988"}, - {"2a0a:144:400::/48", "16509"}, - {"2a0c:d100::/29", "202283"}, - {"2001:559:8423::/48", "7015"}, - {"2400:80c0::/32", "132453"}, - {"2402:800:7bb0::/41", "7552"}, - {"2803:9800:a8d0::/39", "11664"}, - {"2a01:8840:56::/44", "12041"}, - {"2a01:aac0::/32", "43391"}, - {"2c0f:800::/32", "328778"}, - {"240e:5f:600e::/48", "4134"}, - {"2607:4b80::/32", "7018"}, - {"2a00:a362::/32", "60435"}, - {"2a00:ad87:1300::/48", "15465"}, - {"2a05:8cc0::/29", "201210"}, - {"2a05:a040::/29", "43652"}, - {"2001:df3:809::/43", "22787"}, - {"2406:3400:1d::/41", "10143"}, - {"240e:3b6:2800::/38", "4134"}, - {"2801:141:9::/48", "271958"}, - {"2a01:55c0::/29", "21197"}, - {"240a:a8f2::/32", "144940"}, - {"2600:1403:11::/48", "21342"}, - {"2a01:190:151e::/48", "207791"}, - {"2001:559:84d4::/48", "33659"}, - {"2602:107:e500::/40", "11427"}, - {"2a10:f300::/29", "212263"}, - {"2001:559:81ef::/48", "7015"}, - {"2001:559:8629::/46", "7016"}, - {"2001:67c:17e0::/48", "207688"}, - {"240a:a86d::/32", "144807"}, - {"2602:fd60:11::/48", "49134"}, - {"2001:4d98:2200::/35", "3303"}, - {"2606:ae80::/44", "25751"}, - {"2a01:5860::/32", "199939"}, - {"2804:6f38::/32", "270646"}, - {"2a0f:5707:fff3::/48", "207469"}, - {"2001:df0:421::/48", "4826"}, - {"2001:fb0:10a3::/43", "7470"}, - {"2001:4490:7000::/46", "9829"}, - {"2806:230:2055::/48", "11888"}, - {"2a00:4bc0:2134::/32", "31004"}, - {"2a02:26f7:e445::/46", "20940"}, - {"2404:1b40::/47", "18230"}, - {"2600:1004:b000::/40", "6167"}, - {"2620:100:a005::/44", "19750"}, - {"2a00:1288:ef67::/48", "14778"}, - {"2001:559:4be::/48", "7015"}, - {"2402:800:379b::/41", "7552"}, - {"2605:a401:80d9::/45", "33363"}, - {"2806:370:4210::/40", "28403"}, - {"2607:4700::/32", "25720"}, - {"2801:1b:2000::/48", "61447"}, - {"2804:a20::/32", "263024"}, - {"2a02:e0:3128::/45", "34984"}, - {"2001:da8:3007::/44", "24358"}, - {"2001:1248:558a::/43", "11172"}, - {"2401:d800:59d0::/42", "7552"}, - {"2804:4a8c:200::/32", "267248"}, - {"2804:5090::/32", "263005"}, - {"2a04:d00::/29", "204326"}, - {"2402:9f80::/32", "9808"}, - {"2804:3d74:103::/32", "262617"}, - {"2a02:8801::/32", "5089"}, - {"2a03:74c0::/32", "203304"}, - {"2a0f:607:1100::/44", "212425"}, - {"2a10:e580:4000::/48", "399114"}, - {"2001:648:2c11::/42", "5408"}, - {"2407:9440:42::/43", "141626"}, - {"2409:8028:2000::/40", "56041"}, - {"2409:8904:5bb0::/37", "24547"}, - {"240a:a0b1::/32", "142827"}, - {"2804:5d04::/32", "268946"}, - {"2600:1f01:4870::/47", "16509"}, - {"2804:14::/32", "28360"}, - {"2804:14c:6b00::/40", "28573"}, - {"2804:3600::/32", "266320"}, - {"2a0c:1600::/32", "50537"}, - {"2001:559:c0da::/48", "33652"}, - {"2001:678:250::/48", "41038"}, - {"2400:7400:e027::/44", "23736"}, - {"2402:4000:1290::/34", "18001"}, - {"2600:6c20:10::/45", "20115"}, - {"2a05:2940::/32", "43740"}, - {"2402:800:f230::/41", "7552"}, - {"2604:980:1000::/33", "21859"}, - {"2001:559:c196::/48", "7922"}, - {"2401:fb00::/32", "17754"}, - {"2409:8907:8420::/39", "24547"}, - {"240a:abaf::/32", "145641"}, - {"2605:c880::/32", "63290"}, - {"2a06:1287:3310::/32", "61138"}, - {"2001:67c:210::/48", "51066"}, - {"2001:4c08:201e::/48", "3356"}, - {"2a0f:5707:ffa5::/46", "131668"}, - {"240e:45c:6d00::/40", "140531"}, - {"2a02:e980:f8::/45", "19551"}, - {"2a0c:d040::/32", "30781"}, - {"2001:468:f0ff::/48", "11164"}, - {"240a:a40a::/32", "143684"}, - {"240e:108:81::/48", "4134"}, - {"2a03:6947:b00::/40", "59819"}, - {"240d:c010:18::/47", "139341"}, - {"2800:430:a000::/35", "23487"}, - {"2804:64::/32", "27693"}, - {"2a01:4ce0:62::/39", "19624"}, - {"2a02:2370:101::/45", "32787"}, - {"2001:40b0::/32", "13041"}, - {"2408:8256:327d::/46", "17623"}, - {"2804:1f12::/32", "52950"}, - {"2a00:cc40::/48", "44395"}, - {"2001:559:8773::/48", "21508"}, - {"2001:648:24a0::/48", "12402"}, - {"240e:97d:1000::/36", "4134"}, - {"2408:8456:bc40::/38", "17816"}, - {"2606:2800:4270::/46", "15133"}, - {"2606:bbc0::/48", "400509"}, - {"2804:14d:7200::/40", "28573"}, - {"2804:fb4::/34", "263599"}, - {"2001:c20:402::/38", "3758"}, - {"240a:ad67::/32", "146081"}, - {"2600:1406:2201::/37", "20940"}, - {"2606:f180:7::/48", "3356"}, - {"2a00:c60::/32", "8851"}, - {"2a01:c50f:f6c0::/39", "12479"}, - {"2a04:92c7:3::/44", "62240"}, - {"2408:8256:34a0::/39", "17816"}, - {"240e:3bd:5600::/34", "4134"}, - {"2602:fe23::/36", "7018"}, - {"2803:50e0::/32", "269857"}, - {"2a09:bac0:373::/45", "13335"}, - {"2001:559:220::/48", "21508"}, - {"240a:ab82::/32", "145596"}, - {"2607:fdb8::/47", "30496"}, - {"2a02:4260::/29", "60163"}, - {"2a0c:3ec7::/32", "204310"}, - {"2a0e:fd40:be01::/43", "44103"}, - {"2001:7f8:6::/48", "9070"}, - {"240e:ff:f000::/36", "4816"}, - {"2607:ff28:b008::/43", "62904"}, - {"2602:fed2:711c::/48", "53356"}, - {"2804:8570::/32", "272579"}, - {"2a10:bb40::/29", "41050"}, - {"2001:418:4001:3::/64", "2914"}, - {"240e:438:3e40::/33", "4134"}, - {"240e:45c:6300::/40", "140530"}, - {"2806:2f0:44e3::/39", "17072"}, - {"2001:67c:2c88::/47", "60092"}, - {"2001:918:ff76::/47", "8300"}, - {"2001:1248:95b0::/38", "11172"}, - {"2001:1248:9879::/45", "11172"}, - {"240a:a8d8::/32", "144914"}, - {"2606:8e80:1000::/48", "394497"}, - {"2607:fcd0:cd80::/35", "8100"}, - {"2620:106:e00a::/48", "40428"}, - {"2804:36b4::/32", "266366"}, - {"2a02:26f7:de01::/46", "20940"}, - {"2001:fd8:3470::/44", "4775"}, - {"240e:108:1132::/47", "138991"}, - {"2a01:96e0::/32", "35179"}, - {"2a05:8140::/29", "12776"}, - {"2a0f:9400:772b::/48", "207941"}, - {"2a02:26f7:ca84::/48", "36183"}, - {"2001:128c:2004::/33", "25933"}, - {"240a:ab9c::/32", "145622"}, - {"2a0c:b0c0::/29", "64398"}, - {"240a:afd5::/32", "146703"}, - {"240e:108:1270::/44", "140061"}, - {"2607:fc30:200::/40", "396026"}, - {"2804:1c18::/32", "61637"}, - {"2001:559:81b2::/48", "33652"}, - {"2402:3580:9011::/48", "134118"}, - {"2409:8904:8990::/38", "24547"}, - {"240e:438:8c20::/43", "140647"}, - {"2600:1417:61::/48", "24319"}, - {"2804:119c::/32", "263427"}, - {"2a0a:d6c0:1::/48", "51658"}, - {"2401:13c0:6000::/36", "132652"}, - {"240a:a57a::/32", "144052"}, - {"2620:118:a004::/47", "26342"}, - {"2804:3ae8::/32", "266117"}, - {"2001:559:8716::/48", "7725"}, - {"2001:19f0:ccc::/47", "20473"}, - {"2407:8440::/32", "135981"}, - {"2605:4200::/32", "14543"}, - {"2605:a404:c48::/43", "33363"}, - {"2804:78d8::/32", "271269"}, - {"2402:800:332b::/41", "7552"}, - {"240a:a578::/32", "144050"}, - {"2607:f770:8464::/33", "22958"}, - {"2620:149:a15::/48", "714"}, - {"2800:4f0:8::/48", "28006"}, - {"2804:84dc::/32", "272543"}, - {"2a01:5900::/32", "29239"}, - {"2001:1248:8469::/46", "11172"}, - {"240e:9f:d800::/26", "4134"}, - {"2a0e:6200::/29", "8888"}, - {"2001:ac8:87::/48", "9009"}, - {"2600:6000:fb35::/37", "12271"}, - {"2a00:6800::/32", "42730"}, - {"2a0c:cc40::/29", "204790"}, - {"2600:80a:441::/36", "701"}, - {"2804:2178:4004::/47", "264556"}, - {"2409:8a50:900::/38", "56047"}, - {"240e:982:4000::/38", "134768"}, - {"2606:be80::/32", "394678"}, - {"2607:f798:2600::/36", "812"}, - {"2a05:8b80::/29", "201206"}, - {"2c0f:ef40::/32", "328337"}, - {"2401:3c0:101::/46", "45528"}, - {"2407:dc00:4::/39", "9714"}, - {"240e:3b8:c800::/37", "4134"}, - {"240e:45c:1d00::/40", "137401"}, - {"2a01:ce82::/34", "51964"}, - {"2408:834e::/27", "4837"}, - {"240a:a767::/32", "144545"}, - {"2806:20d:59ff::/38", "32098"}, - {"2a02:26f7:d90c::/48", "36183"}, - {"2a02:5680::/32", "41484"}, - {"2806:230:6031::/48", "11888"}, - {"2001:559:c47c::/48", "33651"}, - {"2620:100:e000::/47", "5662"}, - {"2602:feb4:70::/44", "25961"}, - {"2a00:1d70::/32", "39020"}, - {"2a00:aa00::/32", "15663"}, - {"2a00:b840:2::/29", "31472"}, - {"2a01:c9c0:c7::/48", "8891"}, - {"2a02:4e0:2d00::/40", "16135"}, - {"2403:e200::/43", "45543"}, - {"2803:e1c0::/32", "265684"}, - {"2804:28e4:e817::/42", "28260"}, - {"2804:6404::/32", "269398"}, - {"2a02:26f7:b901::/46", "20940"}, - {"2a07:10c0::/48", "203234"}, - {"2a09:4c2:2f::/48", "58133"}, - {"2a0e:fd40:be11::/29", "44103"}, - {"2804:2984:100::/40", "53184"}, - {"2806:2a0:28::/43", "28548"}, - {"2a03:1ac0:2e93::/33", "9049"}, - {"240e:982:d600::/40", "134756"}, - {"2605:8900:5000::/36", "3800"}, - {"2600:380:4180::/37", "20057"}, - {"2603:c010:c000::/36", "31898"}, - {"2607:f480:999::/48", "27435"}, - {"2806:2f0:2122::/48", "17072"}, - {"2a0e:9b42::/32", "213342"}, - {"2401:4900:4ca0::/44", "45609"}, - {"240a:a3b8::/32", "143602"}, - {"2801:80:36e0::/48", "269224"}, - {"2620:10a:8017::/44", "394354"}, - {"2800:be0:3e3::/45", "267848"}, - {"2804:4d84::/32", "268201"}, - {"2001:559:c155::/48", "33651"}, - {"2804:3dc:c2::/42", "52967"}, - {"2a0e:b800:aaaa::/48", "20473"}, - {"2001:579:5a94::/44", "22773"}, - {"240e:438:2c20::/43", "140647"}, - {"2a03:b980::/38", "56730"}, - {"2001:559:c442::/48", "7016"}, - {"2001:da8:225::/48", "24348"}, - {"2408:8256:328d::/43", "17623"}, - {"240a:0:100::/38", "9605"}, - {"2a0e:8f02:f03d::/48", "208223"}, - {"2001:559:80fc::/47", "33657"}, - {"2001:d30:3::/48", "4796"}, - {"2001:559:86cb::/48", "13367"}, - {"2001:559:c2a5::/48", "21508"}, - {"2409:8e00::/32", "56048"}, - {"2604:85c0:8::/47", "16524"}, - {"2a02:1c8:9::/48", "57128"}, - {"2a09:b600:5::/48", "61323"}, - {"240e:1f:1::/48", "58543"}, - {"2800:68::/44", "61468"}, - {"2804:19b0::/32", "61812"}, - {"2606:f900:7604::/46", "812"}, - {"2620:11:50::/47", "3486"}, - {"2804:6580::/32", "269495"}, - {"2a02:26f7:ce09::/42", "20940"}, - {"2001:559:827a::/48", "33651"}, - {"2001:4830:c101::/41", "27552"}, - {"240e:37b:aa00::/39", "140330"}, - {"2804:36f4:9000::/33", "266382"}, - {"2a02:2560:4::/40", "21127"}, - {"2001:4878:2204::/48", "12222"}, - {"2600:1400:2001::/36", "20940"}, - {"2800:bf0:b421::/48", "52257"}, - {"2001:550:1d06::/38", "174"}, - {"2401:4900:5388::/43", "45609"}, - {"2407:e700:12::/32", "132680"}, - {"2409:8959:c954::/38", "56040"}, - {"2803:f7e0:3000::/48", "271773"}, - {"2a03:240::/32", "25009"}, - {"2001:3c8:243::/48", "138685"}, - {"2800:bf0:814c::/48", "27947"}, - {"2001:67c:26c1::/46", "198478"}, - {"2409:8914:1300::/37", "56044"}, - {"2606:7d40:201::/48", "400042"}, - {"2804:7d44::/32", "271550"}, - {"2a10:cc46:100::/44", "58057"}, - {"240e:105:e800::/37", "4134"}, - {"2620:10f:b001::/48", "395700"}, - {"2804:3fd8::/39", "265919"}, - {"2804:6a08::/32", "270307"}, - {"2804:7758::/32", "271172"}, - {"2a07:3500:1a00::/48", "38915"}, - {"2001:559:37a::/48", "33651"}, - {"2001:678:b0::/46", "6736"}, - {"2610:a1:1002::/48", "397220"}, - {"2800:160:12d9::/45", "14259"}, - {"2806:2f0:33e1::/46", "17072"}, - {"2a00:1560:19::/35", "29684"}, - {"2a0d:da07::/32", "53755"}, - {"2a0e:fcc0::/29", "201963"}, - {"2a10:ee00::/32", "212401"}, - {"2c0f:2e00::/38", "328578"}, - {"2001:559:5e::/48", "33651"}, - {"2402:840:d000::/46", "63646"}, - {"2404:c6c0::/48", "135905"}, - {"2606:4700:110::/42", "13335"}, - {"2804:b0c:f003::/45", "52935"}, - {"2a02:26f7:d584::/48", "36183"}, - {"2a06:a004:3000::/33", "61138"}, - {"2a0f:2700:10::/48", "60781"}, - {"2401:d800:f350::/42", "7552"}, - {"240a:a445::/32", "143743"}, - {"2600:1488:a181::/38", "20940"}, - {"2804:7a44::/32", "271359"}, - {"2a00:1128::/32", "21069"}, - {"2a03::/32", "204094"}, - {"2001:4490:dbf0::/46", "9829"}, - {"240a:a1fd::/32", "143159"}, - {"2804:5730::/32", "268050"}, - {"2400:1000:8026::/33", "10021"}, - {"2403:9800:c071::/40", "4648"}, - {"240a:af3c::/32", "146550"}, - {"240e:104::/33", "4134"}, - {"240e:980:2f00::/40", "134760"}, - {"2a06:1e40::/29", "12941"}, - {"2001:1998:6f0::/44", "16787"}, - {"2600:1406:31::/48", "20940"}, - {"2800:bf0:a82b::/43", "52257"}, - {"2c0f:f030:8000::/33", "328137"}, - {"2408:8957:78c0::/39", "17816"}, - {"2607:fb90:c150::/48", "16509"}, - {"2a10:9040::/29", "212795"}, - {"240a:a0c8::/32", "142850"}, - {"240e:983:180a::/48", "133774"}, - {"2607:fb08:5::/32", "32703"}, - {"2620:130:5000::/44", "11714"}, - {"2804:240c::/32", "262289"}, - {"2a00:8a04::/44", "34414"}, - {"2a0d:c000::/29", "205345"}, - {"2c0e:2210::/21", "5713"}, - {"2001:559:82b7::/48", "21508"}, - {"2001:559:c05a::/48", "7016"}, - {"2400:cb00:aa20::/47", "13335"}, - {"240a:a7c3::/32", "144637"}, - {"2a02:26f7:ef80::/48", "36183"}, - {"2405:a6c0::/32", "58820"}, - {"2602:fd92:630::/45", "141011"}, - {"2605:a401:8177::/40", "33363"}, - {"2607:ac80::/40", "17"}, - {"2607:f108:e00::/35", "29838"}, - {"2a03:73a0::/29", "203368"}, - {"2408:8256:359d::/46", "17623"}, - {"2604:a00::/47", "19318"}, - {"2803:6604:c001::/37", "28075"}, - {"2804:4f18::/36", "268303"}, - {"2001:559:c498::/48", "7922"}, - {"2001:67c:18d0::/48", "60216"}, - {"2803:ba00:110::/37", "52286"}, - {"2804:4678::/32", "266991"}, - {"2804:4b94::/32", "267316"}, - {"2a02:27a8::/32", "15626"}, - {"2a0e:1cc0:9::/48", "207846"}, - {"2401:bf00::/32", "17530"}, - {"2804:cc8::/32", "52554"}, - {"2804:6320::/32", "269340"}, - {"2a01:7540::/32", "13097"}, - {"2001:559:84b3::/48", "33657"}, - {"2001:559:c48c::/47", "7922"}, - {"2400:e4c0::/32", "136093"}, - {"240a:a5ad::/32", "144103"}, - {"2804:14d:cc82::/45", "28573"}, - {"2804:22e4::/32", "264129"}, - {"2a02:26f7:50::/48", "36183"}, - {"2804:163c::/39", "263277"}, - {"2a04:5c80::/32", "201365"}, - {"2c0f:ea18::/32", "328519"}, - {"2001:67c:808::/48", "210945"}, - {"2408:8456:9e40::/34", "17816"}, - {"2806:1000:8001::/33", "8151"}, - {"2a02:13f0:8200::/48", "64398"}, - {"2a02:2e02:b50::/40", "12479"}, - {"2001:43d8::/32", "15022"}, - {"2402:800:59ee::/38", "7552"}, - {"2405:4000:800:8::/63", "38082"}, - {"2620:b0::/48", "16796"}, - {"2a03:e040:10::/48", "34879"}, - {"2001:43fe:c000::/48", "328913"}, - {"2401:d800:f752::/40", "7552"}, - {"2402:2b40:a000::/36", "55967"}, - {"2604:d600:1139::/41", "32098"}, - {"2001:df4:ba80::/48", "136306"}, - {"2402:800:52e0::/44", "7552"}, - {"2406:e300:5::/32", "45250"}, - {"2001:df4:ac80::/48", "141048"}, - {"2401:d800:b6b2::/39", "7552"}, - {"2600:370f:51a5::/43", "32261"}, - {"2a10:4b40::/29", "210107"}, - {"2001:1248:a452::/47", "11172"}, - {"2406:3003:207e::/47", "4657"}, - {"2a02:26f7:dc8d::/42", "20940"}, - {"2409:897b::/29", "9808"}, - {"2602:fe0b::/36", "23415"}, - {"2603:8079::/34", "33363"}, - {"2a00:bdc0:f000::/36", "47542"}, - {"2a03:8a00::/36", "13768"}, - {"2a04:b500::/32", "197540"}, - {"2a07:1cc0::/29", "48760"}, - {"2a0a:3c44::/32", "205415"}, - {"2001:43f8:d40::/48", "328998"}, - {"2403:1940:70::/48", "137935"}, - {"2408:8256:2c61::/40", "17623"}, - {"240a:a9f5::/32", "145199"}, - {"240a:ace8::/32", "145954"}, - {"2600:802:721::/36", "701"}, - {"2600:6c34:3e2::/48", "33588"}, - {"2800:160:16ea::/39", "14259"}, - {"2a06:bc0::/29", "213078"}, - {"2a0b:f1c0::/32", "198682"}, - {"2001:559:83::/48", "33652"}, - {"240a:a7e7::/32", "144673"}, - {"2600:9000:2346::/47", "16509"}, - {"2a04:5200::/41", "50113"}, - {"2001:67c:115c::/48", "31554"}, - {"2001:44b8:309c::/48", "4739"}, - {"240e:a50:5c00::/34", "134419"}, - {"2608:c185:1::/48", "6025"}, - {"2800:160:19de::/42", "14259"}, - {"2804:7ca0::/32", "271508"}, - {"2a02:26f7:cf8d::/46", "20940"}, - {"2a0c:9a44::/48", "34927"}, - {"2402:800:590f::/43", "7552"}, - {"2408:8256:3977::/44", "17623"}, - {"2409:8070:30ec::/47", "9808"}, - {"240e:107::/32", "4134"}, - {"2a00:e78:8000::/46", "47530"}, - {"2001:67c:2e18::/48", "50407"}, - {"2402:3a80:40::/46", "38266"}, - {"2804:790c::/32", "52602"}, - {"2a05:6e40::/29", "200552"}, - {"2400:1f00:b0::/44", "45769"}, - {"2600:40f1:1::/39", "701"}, - {"2605:f4c0::/32", "398717"}, - {"2a05:92c0::/29", "12859"}, - {"2606:6800:1000::/40", "394634"}, - {"2606:e480::/39", "55083"}, - {"2402:8100:20e1::/48", "45271"}, - {"2600:140b:c001::/36", "20940"}, - {"2604:d600:1036::/44", "32098"}, - {"2804:21bc:201::/32", "264570"}, - {"2804:60b8::/32", "269186"}, - {"2a00:8a84:1050::/34", "29119"}, - {"2408:8856:8100::/40", "134543"}, - {"2804:5984::/32", "268707"}, - {"2a00:fc20::/32", "200059"}, - {"2a02:2698:4c00::/42", "42682"}, - {"2a02:26f0:af00::/48", "34164"}, - {"2a04:7bc0::/29", "47232"}, - {"2a0e:46c3:202::/40", "208717"}, - {"2001:67c:2648::/48", "13030"}, - {"2402:b801:1900::/34", "18371"}, - {"2408:8001:3020::/41", "17816"}, - {"2804:141c::/32", "53130"}, - {"2804:7b8c::/32", "271438"}, - {"2a00:1eb8:c002::/47", "8764"}, - {"2001:49d0:8400::/38", "2496"}, - {"240a:a711::/32", "144459"}, - {"240e:45::/33", "17638"}, - {"2606:5dc0:e:c::/64", "395561"}, - {"2a01:47e0::/32", "49223"}, - {"2a02:26f0:97::/44", "20940"}, - {"2a04:62c2:1::/45", "47477"}, - {"2a07:4280::/29", "48147"}, - {"240a:a068::/32", "142754"}, - {"2a07:5480::/29", "203034"}, - {"2001:da8:e007::/48", "23910"}, - {"2001:dcd:1::/46", "397226"}, - {"2001:fd8:124::/46", "132199"}, - {"2606:5580:4000::/38", "63242"}, - {"2a10:f980::/29", "49801"}, - {"2001:df4:5100::/48", "18229"}, - {"2402:e280:106::/48", "134674"}, - {"240e:44d:6540::/42", "140348"}, - {"2804:2098::/32", "264500"}, - {"2804:2290::/32", "264108"}, - {"2a0a:9240::/32", "201543"}, - {"2a0e:46c4:2930::/48", "138435"}, - {"2001:678:d9c::/48", "3303"}, - {"2804:e0c:280::/48", "28176"}, - {"2a07:6800::/29", "203443"}, - {"2600:8802:8000::/29", "22773"}, - {"2620:101:900c::/47", "40934"}, - {"2803:d100:9500::/38", "52362"}, - {"2804:260::/32", "53214"}, - {"2804:30f8:b00::/40", "264984"}, - {"2804:5fcc::/32", "269124"}, - {"2a0e:b107:1070::/44", "211622"}, - {"2c0f:feb0::/31", "37100"}, - {"2001:510:207::/44", "376"}, - {"2001:648:2331::/37", "5408"}, - {"2001:67c:2e3c::/48", "57896"}, - {"2001:da8:b814::/44", "23910"}, - {"2001:fd8:f2c0::/42", "132199"}, - {"2408:8001:4000::/32", "4837"}, - {"2409:8915:2200::/39", "56044"}, - {"240a:a15f::/32", "143001"}, - {"240a:a485::/32", "143807"}, - {"2620:171:45::/46", "42"}, - {"2800:e00:4000::/34", "27665"}, - {"2a0c:93c0:8002::/48", "212465"}, - {"240e:14:6800::/37", "133774"}, - {"2605:340:cd02::/48", "396986"}, - {"2620:1e2::/36", "36502"}, - {"2801:14:8800::/48", "267896"}, - {"2804:77c::/37", "53222"}, - {"2804:12cc::/32", "263499"}, - {"2804:1f3c:4000::/35", "269679"}, - {"2001:da8:230::/48", "24349"}, - {"2001:df3:f280::/48", "140712"}, - {"2404:4a00:2:1::/48", "45629"}, - {"2803:6fa0:2::/48", "267790"}, - {"2804:840::/32", "262680"}, - {"2804:6904:4000::/34", "270243"}, - {"2408:84f3:9440::/38", "17816"}, - {"2409:8070:302b::/45", "9808"}, - {"2602:80c:1008::/48", "10796"}, - {"2800:160:206d::/43", "14259"}, - {"2804:42b0::/32", "267519"}, - {"2a0f:fb00::/29", "208178"}, - {"2001:da8:b80b::/45", "23910"}, - {"2400:1c00:64::/48", "45143"}, - {"2a0c:b641:6f0::/46", "210546"}, - {"2001:400:210:89::/55", "293"}, - {"2001:559:260::/48", "33659"}, - {"2600:6c38:364::/37", "20115"}, - {"2001:559:85f6::/48", "7725"}, - {"2804:4b0:588::/35", "262459"}, - {"2804:5800::/32", "52843"}, - {"2001:fb0:109f:8013::/61", "36040"}, - {"240e:44d:7c00::/42", "140345"}, - {"2600:140b:3401::/36", "20940"}, - {"2600:1fa0:6020::/44", "16509"}, - {"2001:1a11:ba::/47", "42298"}, - {"240e:107:c200::/34", "4134"}, - {"2804:1c9c::/32", "61665"}, - {"2804:8440::/32", "272249"}, - {"2a0a:6680:bee1::/48", "203500"}, - {"2001:559:8333::/48", "33287"}, - {"2403:40c0:4::/48", "45215"}, - {"2404:b300:133::/48", "131207"}, - {"2001:678:8f0::/48", "209619"}, - {"2405:1c0:6311::/45", "55303"}, - {"2804:16f8::/32", "263111"}, - {"2804:44e8:301::/32", "267660"}, - {"2a01:1000::/23", "5617"}, - {"2a06:6541:1201::/48", "8220"}, - {"2404:3fc0::/45", "32590"}, - {"240a:a73b::/32", "144501"}, - {"2605:d800::/32", "11067"}, - {"240e:44d:2340::/42", "140361"}, - {"2a02:26f7:a7::/48", "20940"}, - {"2001:44b8:30cb::/48", "4739"}, - {"2401:d800:be90::/42", "7552"}, - {"2605:2800:1201::/32", "6922"}, - {"2803:cae0:1::/48", "3816"}, - {"2a01:298::/40", "30880"}, - {"2a02:26f7:c64c::/48", "36183"}, - {"2a02:4540:5040::/46", "197207"}, - {"2a02:26f0:5401::/39", "20940"}, - {"2a0c:e642::/42", "211323"}, - {"2001:559:87d7::/48", "33287"}, - {"2001:1478:1101::/32", "3257"}, - {"2408:8256:357f::/48", "17816"}, - {"2607:fa00::/32", "30362"}, - {"2804:274::/32", "53217"}, - {"2a0a:eac0::/31", "31143"}, - {"2409:8008:d8::/48", "9808"}, - {"2602:801:c00a::/45", "397849"}, - {"2604:6400::/33", "29974"}, - {"2604:f880::/32", "62695"}, - {"2804:55e0::/32", "267962"}, - {"2a02:26f7:d0c0::/48", "36183"}, - {"2a03:f80:36::/48", "5483"}, - {"2600:6c39:51f::/38", "20115"}, - {"2806:2f0:9cc1::/46", "17072"}, - {"2a02:ac80:61::/43", "25145"}, - {"2a09:9c40::/29", "209148"}, - {"2001:cb0:209::/46", "4637"}, - {"2001:4ba0::/31", "24961"}, - {"2604:d600:155a::/45", "32098"}, - {"2001:579:4280::/36", "22773"}, - {"2804:22c0::/34", "264120"}, - {"2a02:c440::/29", "8399"}, - {"2402:800:7fb0::/41", "7552"}, - {"2803:b440::/32", "263785"}, - {"2a01:77c0:1180::/47", "34848"}, - {"2a02:26f7:ca88::/48", "36183"}, - {"2a11:4180::/29", "1239"}, - {"2001:da8:ab::/48", "24372"}, - {"2001:16a2:c3d0::/42", "39386"}, - {"2400:c400:a001::/31", "45570"}, - {"2404:bf40:a700::/48", "7545"}, - {"2600:2c00:f000::/36", "17378"}, - {"2a00:1850:6e1::/45", "29357"}, - {"2a0c:7780::/29", "21263"}, - {"2001:df1:9780::/48", "56150"}, - {"2409:8018::/34", "134810"}, - {"2a00:c6e0::/32", "12552"}, - {"2a04:4e40:f000::/48", "54113"}, - {"2a06:6c0::/46", "200738"}, - {"2001:559:c467::/44", "7922"}, - {"2600:140f:6800::/48", "9498"}, - {"2a02:26f0:b501::/38", "20940"}, - {"2a02:26f7:cd01::/46", "20940"}, - {"2a05:db80::/29", "41071"}, - {"2a05:edc0::/29", "58314"}, - {"2001:448a:6070::/40", "7713"}, - {"2402:800:f320::/41", "7552"}, - {"2408:80f1:230::/44", "17621"}, - {"2408:8957:e800::/40", "17622"}, - {"2605:b0c0::/32", "11282"}, - {"2a01:8280:3330::/48", "202818"}, - {"2a03:2880:f102::/44", "32934"}, - {"240a:a66e::/32", "144296"}, - {"2a00:5881:6000::/40", "199396"}, - {"2a0f:7b81::/48", "9009"}, - {"2001:67c:22b0::/48", "42564"}, - {"2001:4490:d970::/46", "9829"}, - {"2607:5c80::/32", "14713"}, - {"2804:14c:5b00::/40", "28573"}, - {"2001:c20:7807::/38", "3758"}, - {"2001:ec0:5300::/40", "131293"}, - {"2404:f4c0:6666::/48", "7721"}, - {"240a:abce::/32", "145672"}, - {"2804:18:1820::/41", "26599"}, - {"2804:7880::/32", "271247"}, - {"2a02:26f7:d844::/48", "36183"}, - {"2404:bf00:800::/40", "9303"}, - {"240a:aa90::/32", "145354"}, - {"2600:c10::/32", "19024"}, - {"2800:160:1c53::/45", "14259"}, - {"2804:4764::/32", "267051"}, - {"2a02:45c0:6::/48", "8881"}, - {"2a06:a900::/29", "213358"}, - {"2c0f:ffc8:6004::/32", "22355"}, - {"2001:559:146::/48", "33491"}, - {"2804:5a0c::/32", "268742"}, - {"2a00:edc0:1010::/48", "62597"}, - {"2a03:6080::/45", "16285"}, - {"2001:559:788::/48", "21508"}, - {"2001:1248:a55a::/45", "11172"}, - {"240a:a6ca::/32", "144388"}, - {"2001:4998:efe6::/48", "26085"}, - {"2405:205:9000::/33", "55836"}, - {"2409:8020:61::/43", "56046"}, - {"240a:a76b::/32", "144549"}, - {"2804:214:c009::/34", "26615"}, - {"2804:44c4::/32", "267652"}, - {"2001:559:8116::/47", "7922"}, - {"2001:eb0:104::/32", "9584"}, - {"240e:3b3:ac00::/35", "4134"}, - {"2803:6410::/32", "271855"}, - {"2a03:a080::/32", "198145"}, - {"2602:103:c000::/29", "20115"}, - {"2804:3d4c::/32", "266266"}, - {"2001:559:856f::/48", "33652"}, - {"2403:1cc0:2000::/48", "45352"}, - {"2604:5dc0::/32", "21788"}, - {"2804:33fc::/32", "265429"}, - {"2806:230:fff4::/44", "265594"}, - {"2a01:6e0::/32", "12976"}, - {"2a04:9444::/30", "25584"}, - {"2a0c:b641:510::/48", "209586"}, - {"2a0e:800:fff0::/48", "208328"}, - {"2001:559:8500::/48", "33490"}, - {"2a05:7380::/29", "201283"}, - {"2001:559:40e::/43", "33659"}, - {"2409:8c2f::/34", "56041"}, - {"2600:1003:9450::/36", "22394"}, - {"2600:1010:e010::/36", "22394"}, - {"2a06:e881:2000::/44", "206313"}, - {"2a11:df80::/29", "204790"}, - {"2a12:5780::/29", "204790"}, - {"2001:67c:2c3c::/48", "29226"}, - {"2409:896a:2400::/39", "9808"}, - {"240e:968:3000::/30", "4134"}, - {"2001:470:13a::/45", "6939"}, - {"2806:2f0:9ba3::/41", "17072"}, - {"2a05:7100::/29", "42673"}, - {"2804:21a4:3800::/32", "53190"}, - {"2a12:a640::/29", "400522"}, - {"2001:559:2d8::/47", "7922"}, - {"2409:8087:5803::/37", "9808"}, - {"2620:3a:4000::/44", "36711"}, - {"2806:20d:540b::/39", "32098"}, - {"2a02:26f7:dd48::/48", "36183"}, - {"2a0d:3000::/30", "205544"}, - {"2001:1838::/35", "23352"}, - {"2804:90c:102::/45", "262617"}, - {"2a04:2b00:14ee::/48", "212391"}, - {"2409:8051:1100::/37", "9808"}, - {"2804:4b18::/32", "267283"}, - {"2a01:5ec0:b000::/36", "44244"}, - {"2a03:b700::/32", "51269"}, - {"2402:800:38e0::/44", "7552"}, - {"2402:800:9c01::/43", "7552"}, - {"2405:7f00:92a0::/39", "133414"}, - {"2408:8256:b98::/37", "17622"}, - {"2604:6840:ff::/48", "20446"}, - {"2804:48fc::/32", "267157"}, - {"2a0b:ffc0::/40", "207013"}, - {"240a:a23b::/32", "143221"}, - {"2806:2f0:81a1::/46", "17072"}, - {"2806:322:2100::/37", "28546"}, - {"2a02:26f7:c0c8::/48", "36183"}, - {"2404:8d00::/35", "24378"}, - {"2804:14c:65e1::/45", "28573"}, - {"2001:253:130::/48", "142096"}, - {"2001:67c:2110::/48", "28734"}, - {"2403:3a40::/32", "55933"}, - {"2806:250:6::/47", "28554"}, - {"2a05:e40:1400::/34", "59909"}, - {"2001:df7:480::/48", "138754"}, - {"2400:cb00:a430::/45", "13335"}, - {"2402:e380:303::/48", "134496"}, - {"2804:1e0::/32", "262784"}, - {"2a02:800::/32", "9119"}, - {"2a03:2880:f265::/46", "32934"}, - {"2605:4c40:105::/43", "30081"}, - {"2a02:20b2::/32", "16278"}, - {"2801:0:4c0::/48", "266736"}, - {"2801:1f0:4050::/32", "3573"}, - {"2806:370:2150::/44", "28403"}, - {"2001:67c:27ec::/48", "50304"}, - {"2401:5ac0::/32", "131923"}, - {"2402:9e80::/47", "7489"}, - {"240a:a145::/32", "142975"}, - {"240e:3b7:dc00::/34", "4134"}, - {"2001:2022::/27", "1299"}, - {"2606:2800:41f::/42", "15133"}, - {"2804:854:a::/47", "61832"}, - {"2804:3a90::/32", "266096"}, - {"2a02:26f0:f501::/38", "20940"}, - {"2a06:7ec0::/29", "201011"}, - {"2a0f:2fc0::/32", "203115"}, - {"2a0b:8380::/29", "60580"}, - {"2a0b:cbc1::/29", "200780"}, - {"2401:ee00:2100::/32", "23951"}, - {"2803:5440:4038::/48", "264738"}, - {"2804:5ac4::/43", "268795"}, - {"2a01:ce80::/34", "51964"}, - {"2001:678:5dc::/48", "204675"}, - {"2406:3003:1000::/43", "55430"}, - {"240a:af17::/32", "146513"}, - {"2600:1003:f110::/37", "22394"}, - {"2600:1409:b000::/48", "35994"}, - {"2600:1480:e000::/40", "33905"}, - {"2804:4e70::/32", "268261"}, - {"2001:1b70:82ad::/46", "158"}, - {"240e:924::/36", "132147"}, - {"2620:f:8000::/48", "27500"}, - {"2804:7b00::/32", "271405"}, - {"2a02:26f7:ee80::/48", "36183"}, - {"2602:feda:be0::/48", "38173"}, - {"2a02:26f7:ea48::/48", "36183"}, - {"2a04:92c7:fa11::/37", "62240"}, - {"2001:678:55c::/48", "12552"}, - {"2401:b0c0:1011::/36", "136941"}, - {"2620:2e:40c0::/48", "394506"}, - {"2a02:26f7:e400::/48", "36183"}, - {"2a0b:4340:c0::/48", "44421"}, - {"2a0c:1140::/29", "48611"}, - {"240a:a904::/32", "144958"}, - {"240e:e4::/31", "4134"}, - {"2804:76c4::/32", "271133"}, - {"2a00:ee8::/32", "43503"}, - {"2a00:bbe0::/29", "60414"}, - {"2a02:26f0:c701::/36", "20940"}, - {"2a02:26f7:ca04::/48", "36183"}, - {"2a02:26f7:df08::/48", "36183"}, - {"2a07:4843::/48", "64245"}, - {"2001:579:9042::/44", "22773"}, - {"2400:cb00:326::/48", "13335"}, - {"240a:ae0a::/32", "146244"}, - {"2404:c0:9400::/36", "23693"}, - {"2408:8956:9100::/40", "17816"}, - {"2409:8b02::/32", "38019"}, - {"2604:5000::/35", "7752"}, - {"2803:3f80::/38", "263739"}, - {"2803:4220::/32", "27843"}, - {"2804:5a14::/32", "268747"}, - {"2a0e:46c4:101::/48", "137490"}, - {"2806:2f0:2060::/48", "17072"}, - {"2a02:26f7:c08c::/48", "36183"}, - {"2a06:6541:2001::/48", "46887"}, - {"2a0d:77c7:792d::/32", "7489"}, - {"2001:559:13a::/48", "7016"}, - {"2408:84f3:f660::/40", "17623"}, - {"2a0b:7040::/29", "208819"}, - {"2402:800:959b::/42", "7552"}, - {"2409:8050:900::/37", "9808"}, - {"2a02:2b80:393::/48", "45012"}, - {"2404:f340::/34", "139070"}, - {"2408:84f3:3040::/44", "17623"}, - {"240e:16:b800::/33", "4134"}, - {"2a02:7e80::/32", "20655"}, - {"2a0f:c100::/29", "56485"}, - {"2c0f:f7a8:9010::/47", "4809"}, - {"2c0f:f8f0::/32", "30969"}, - {"240e:44d:6d00::/42", "140345"}, - {"2604:5e40::/32", "16409"}, - {"2804:4b4c:400::/32", "267296"}, - {"2001:559:30a::/48", "7922"}, - {"2001:559:c32f::/48", "33659"}, - {"2607:6200::/32", "21817"}, - {"2804:3b84::/32", "266154"}, - {"2a07:2f00:1337::/48", "12502"}, - {"2605:1c00:50f0::/44", "16787"}, - {"2800:484:b00::/40", "14080"}, - {"2804:71c::/32", "53080"}, - {"2a0e:e580::/29", "204394"}, - {"2001:4840::/32", "7029"}, - {"2607:f3a0:a00b::/33", "23342"}, - {"2800:bf0:3460::/46", "52257"}, - {"2804:7c0::/32", "262316"}, - {"2a02:250:ffff::/48", "39570"}, - {"2a03:2880:f046::/44", "32934"}, - {"240a:a10b::/32", "142917"}, - {"240a:add4::/32", "146190"}, - {"2803:cae0:8020::/48", "3549"}, - {"2a02:26f7:c484::/48", "36183"}, - {"2a11:6880::/29", "204790"}, - {"2001:579:c0dc::/46", "22773"}, - {"2604:b300:ad03::/48", "394896"}, - {"2620:2d:4000::/46", "41231"}, - {"2a06:bdc0::/35", "62240"}, - {"2a0d:5600:33::/48", "63473"}, - {"2001:4350::/35", "2609"}, - {"2403:600:b001::/48", "7641"}, - {"2001:4c8:1069::/40", "15290"}, - {"2408:840c::/40", "17621"}, - {"240e:44d:7e00::/41", "140345"}, - {"2600:6c38:8b9::/41", "20115"}, - {"2806:230:6024::/48", "265594"}, - {"2a01:c910::/28", "3215"}, - {"2a0e:6440::/32", "208501"}, - {"2605:cd00::/32", "53907"}, - {"2a02:88d:4020::/44", "48695"}, - {"240a:a09b::/32", "142805"}, - {"240a:a2a6::/32", "143328"}, - {"240a:ae30::/32", "146282"}, - {"2605:a000:c0f::/35", "10796"}, - {"2804:2368::/32", "264160"}, - {"2c0f:f800::/28", "37053"}, - {"2600:141b:e801::/35", "20940"}, - {"2801:1ec::/42", "19429"}, - {"2a00:1108::/32", "8771"}, - {"2a07:b00::/29", "29468"}, - {"2400:ee80::/34", "45177"}, - {"2402:800:9671::/40", "7552"}, - {"2804:6b58::/32", "270394"}, - {"2001:559:c243::/48", "7922"}, - {"2404:8d06:8100::/36", "10089"}, - {"2001:559:83d8::/48", "33661"}, - {"240a:a532::/32", "143980"}, - {"2607:6100:1003::/48", "54380"}, - {"2804:7934::/34", "271291"}, - {"2a0a:ab40::/47", "205988"}, - {"2408:820c:6840::/32", "17621"}, - {"240e:6:d021::/39", "4134"}, - {"2a00:1b18::/32", "47527"}, - {"2a0b:7fc0::/29", "43668"}, - {"2a0e::/26", "31549"}, - {"2001:67c:25a0::/48", "41954"}, - {"2600:100b:9010::/39", "6167"}, - {"2606:4280:4000::/36", "16696"}, - {"2804:259c::/32", "52772"}, - {"2c0f:fc89:12f::/33", "36992"}, - {"2400:580:9::/48", "4766"}, - {"2801:80:1230::/48", "264347"}, - {"2a05:d03a:e000::/40", "16509"}, - {"2001:579:d124::/41", "22773"}, - {"240e:44d:5e80::/41", "4134"}, - {"2800:160:1c06::/44", "14259"}, - {"2a0b:3900::/31", "58310"}, - {"2a11:6f00::/29", "20592"}, - {"2001:250:700a::/45", "24370"}, - {"2001:4878:2261::/48", "12222"}, - {"2400:df40::/32", "18042"}, - {"240a:a545::/32", "143999"}, - {"2801:0:80::/48", "262148"}, - {"2804:2b4c::/32", "262960"}, - {"2a01:8160::/32", "44454"}, - {"2409:8028:3004::/47", "56041"}, - {"2620:149:522::/43", "714"}, - {"2a02:350::/29", "16246"}, - {"2a06:1280:ce05::/48", "204136"}, - {"2a0b:f4c0:400::/48", "205100"}, - {"2001:590:1006::/48", "20940"}, - {"2001:df6:4900::/48", "139195"}, - {"2806:250:8::/47", "28545"}, - {"2001:559:87a0::/48", "33650"}, - {"2001:df6:5080::/48", "137655"}, - {"2001:fd8:2138::/41", "4775"}, - {"2001:1b70:8600::/48", "395592"}, - {"2402:3a80:c041::/48", "38266"}, - {"2405:9800:c700::/47", "45458"}, - {"2a0f:1e40::/32", "58055"}, - {"2001:559:3b6::/48", "33659"}, - {"2a01:8840:fb::/48", "207266"}, - {"2c0f:3a00::/32", "328835"}, - {"2401:d900::/32", "10003"}, - {"2406:4440::/44", "38008"}, - {"240a:a9fb::/32", "145205"}, - {"240e:438:3640::/36", "4134"}, - {"240e:44d:2d00::/42", "140345"}, - {"2a0c:be00::/32", "209846"}, - {"2a0d:c00::/29", "29632"}, - {"2a02:26f7:e845::/46", "20940"}, - {"2610:20:500a::/48", "5744"}, - {"2803:3b60::/32", "269811"}, - {"2804:640:3e96::/32", "262713"}, - {"2a00:17a8::/32", "8478"}, - {"2001:df5:ac80::/48", "140768"}, - {"2408:8956:8400::/40", "17622"}, - {"2600:6c7f:9150::/44", "20115"}, - {"2804:e00:a000::/33", "11419"}, - {"2804:6838::/32", "269677"}, - {"2001:500:16::/42", "12041"}, - {"240a:ab4c::/32", "145542"}, - {"2600:140f:d800::/48", "55836"}, - {"2600:e009::/32", "22995"}, - {"2803:d100:ee80::/42", "52362"}, - {"2001:559:79a::/48", "33490"}, - {"2a00:e6c0::/32", "198385"}, - {"2a06:4101::/32", "394094"}, - {"2001:250:e03::/48", "23910"}, - {"2602:ffc5:cb0::/44", "395839"}, - {"2605:c4c0::/32", "398338"}, - {"2a04:11c0::/29", "48252"}, - {"2a0c:9a40:81fb::/48", "213253"}, - {"240a:a37c::/32", "143542"}, - {"2620:11d:9002:600::/56", "14805"}, - {"2405:9800:bc00::/40", "133481"}, - {"2408:8957:1600::/40", "17622"}, - {"2409:804c:31::/36", "9808"}, - {"240a:ab5c::/32", "145558"}, - {"2a02:26f7:d089::/42", "20940"}, - {"2620:a1::/48", "19285"}, - {"2400:7500::/32", "45325"}, - {"2402:ef34::/32", "7633"}, - {"2600:1012:a000::/43", "6167"}, - {"2620:171:6e::/43", "715"}, - {"2404:bfc0::/32", "135859"}, - {"2600:1409:7001::/36", "20940"}, - {"2804:18:900::/35", "26599"}, - {"2804:1c54::/32", "61650"}, - {"2a01:5ec0:d000::/34", "44244"}, - {"2a0a:16c0::/32", "48464"}, - {"2a0e:b107:c96::/48", "140938"}, - {"2402:ad80::/48", "59257"}, - {"240a:af80::/32", "146618"}, - {"2a0c:5900::/29", "202120"}, - {"2001:418:1401:1d::/58", "2914"}, - {"2402:6940:307::/37", "7645"}, - {"240a:a8b1::/32", "144875"}, - {"240a:a8d9::/32", "144915"}, - {"2600:1008:b140::/42", "6167"}, - {"2a01:8840:be::/41", "12041"}, - {"2a02:ac80:51::/42", "25145"}, - {"2001:559:23d::/48", "7922"}, - {"2001:4490:dfa8::/46", "9829"}, - {"240a:afc3::/32", "146685"}, - {"2804:c44::/32", "52917"}, - {"2804:69d4::/32", "270294"}, - {"2a01:a740::/32", "61157"}, - {"2a0e:2980::/48", "34568"}, - {"2001:978:8802::/39", "174"}, - {"2001:1248:596d::/46", "11172"}, - {"2001:57a:104::/40", "22773"}, - {"2804:224::/32", "262792"}, - {"2a07:7b00::/29", "60960"}, - {"2001:250:80d::/46", "138182"}, - {"2401:de00::/32", "7497"}, - {"2607:fb10:2042::/48", "55095"}, - {"2001:559:4e1::/48", "20214"}, - {"2001:1a40::/44", "5416"}, - {"2405:9800:b01a::/48", "45430"}, - {"2607:d500:300::/47", "13768"}, - {"2a01:488:bb0e::/48", "397513"}, - {"2605:dd40:1000::/33", "398549"}, - {"2a03:7580:4000::/40", "34530"}, - {"2001:ee0:400::/35", "45899"}, - {"2406:840:300::/48", "139317"}, - {"240a:aa53::/32", "145293"}, - {"2620:a9:8008::/45", "62872"}, - {"2620:101:1000::/42", "589"}, - {"2804:8:6::/33", "14840"}, - {"2a0a:340:1a00::/40", "56807"}, - {"2a0e:b107:3f8::/45", "57883"}, - {"2001:559:c1c3::/48", "7922"}, - {"2401:d800:b460::/40", "7552"}, - {"2a07:5200::/48", "213208"}, - {"2a0b:c700::/29", "204403"}, - {"2a0c:b641:5e0::/44", "212912"}, - {"2a0e:3dc0::/32", "49981"}, - {"2404:63c0:40::/44", "131645"}, - {"2a0b:d2c0::/29", "205452"}, - {"2a0e:3840:801::/48", "40676"}, - {"2a0e:8f02:f018::/48", "212057"}, - {"2409:8053:800::/40", "56047"}, - {"2600:1000:a120::/36", "22394"}, - {"2610:120:aab::/32", "33606"}, - {"2803:1ec0::/32", "265671"}, - {"2a02:26f7:ce40::/48", "36183"}, - {"2001:1280:2000::/36", "16685"}, - {"240a:a95f::/32", "145049"}, - {"2600:80d::/44", "6984"}, - {"2804:4260::/32", "267496"}, - {"2a0b:e880::/29", "205614"}, - {"240a:a490::/32", "143818"}, - {"2a03:ebc0:1000::/36", "31400"}, - {"2001:410:a002::/43", "8111"}, - {"2404:de80:400::/40", "137443"}, - {"240a:a24e::/32", "143240"}, - {"2600:1014:a110::/36", "22394"}, - {"2600:6c2e:c81::/39", "20115"}, - {"2602:feda:bf0::/44", "139328"}, - {"2803:d100:9780::/43", "52362"}, - {"2804:1094:c000::/34", "263641"}, - {"2804:27e0::/32", "262817"}, - {"2001:44b8:14::/46", "4739"}, - {"2620:1f:8004::/48", "10908"}, - {"2804:4004::/32", "265928"}, - {"2001:559:c0d0::/47", "20214"}, - {"2806:2f0:2103::/43", "22884"}, - {"2a00:d0c0::/39", "58010"}, - {"2001:67c:23b8::/48", "5524"}, - {"2408:8456:9810::/42", "134543"}, - {"2409:896d:5708::/27", "9808"}, - {"240e:bf:b8f4::/46", "138513"}, - {"2600:6c10:c2b::/43", "20115"}, - {"2600:6c3a:824::/43", "20115"}, - {"2600:6c38:104::/47", "20115"}, - {"2804:2674:a::/48", "264344"}, - {"2804:5b1c::/32", "268819"}, - {"2a02:4840::/46", "52048"}, - {"2a07:9944:1a::/48", "8100"}, - {"2605:1c00:1ff0::/44", "16787"}, - {"2804:4098::/34", "265969"}, - {"2a02:26f7:111::/48", "20940"}, - {"2a02:26f7:f6c0::/48", "36183"}, - {"2001:559:782::/45", "7015"}, - {"2406:840:5860::/47", "139317"}, - {"2409:8958:cc54::/39", "56040"}, - {"2600:6c38:a96::/44", "20115"}, - {"2603:c001:2410::/38", "31898"}, - {"2804:2abc::/32", "264091"}, - {"2a00:55a0:f000::/40", "9009"}, - {"2a02:26f7:b680::/48", "36183"}, - {"2804:d90::/32", "52639"}, - {"2001:559:c199::/48", "7015"}, - {"2804:cb0:b000::/33", "52742"}, - {"2804:3e04::/35", "266568"}, - {"2a0e:97c3:4c2::/48", "20473"}, - {"2a0e:b107:1408::/48", "208548"}, - {"2401:7400:8888:12::/33", "4773"}, - {"2409:802f:290b::/48", "9808"}, - {"2605:ea80::/32", "32709"}, - {"2a00:1bd8::/32", "8315"}, - {"2a05:1c47::/32", "201594"}, - {"240e:45c:cc00::/31", "131285"}, - {"2a02:26f7:e200::/48", "36183"}, - {"2a02:2e02:8ca0::/41", "12479"}, - {"2001:559:86b8::/47", "7922"}, - {"2408:840c:ba00::/40", "17621"}, - {"2408:8456:6000::/42", "17622"}, - {"2803:9800:5200::/34", "11664"}, - {"2804:2108::/32", "264528"}, - {"2a09:87c0:ffff::/48", "59497"}, - {"2001:559:803c::/48", "33491"}, - {"2401:d800:2b90::/42", "7552"}, - {"240a:a5b2::/32", "144108"}, - {"240a:ae67::/32", "146337"}, - {"2a01:68c0::/32", "35168"}, - {"2a02:26f7:bf05::/46", "20940"}, - {"2a05:1c0::/29", "201508"}, - {"2001:559:8331::/48", "33657"}, - {"2001:67c:2d88::/48", "3320"}, - {"2a00:9d80::/32", "28876"}, - {"2a09:1740::/29", "25582"}, - {"2001:df6:3e80::/48", "141993"}, - {"2600:900::/28", "7896"}, - {"2804:bb4:201::/32", "52812"}, - {"2a02:26f0:5701::/36", "20940"}, - {"2a02:26f7:e9c9::/46", "20940"}, - {"2a0c:b641:7af::/48", "207268"}, - {"2001:1378::/32", "52250"}, - {"2405:2300:ff46::/42", "13443"}, - {"2804:67f4::/32", "269661"}, - {"2a09:4c0:b01::/37", "58057"}, - {"240e:44d:3b80::/41", "4134"}, - {"240a:a2f0::/32", "143402"}, - {"2606:1980:104::/48", "54994"}, - {"2804:14c:4395::/41", "28573"}, - {"2804:9d0::/32", "262995"}, - {"2a03:efc0:1300::/40", "33438"}, - {"2a0b:4341:2e00::/48", "35487"}, - {"2001:559:7a5::/48", "7016"}, - {"2001:559:c388::/48", "33657"}, - {"2a0e:a3c0::/29", "33770"}, - {"2605:4c40:101::/45", "30081"}, - {"2804:6f8c::/32", "270668"}, - {"2a09:6880::/29", "56814"}, - {"2408:8256:3560::/44", "17623"}, - {"240c:c019::/26", "23910"}, - {"240e:3b4:8200::/35", "140316"}, - {"2620:146:d::/48", "16500"}, - {"2a02:7980::/39", "43937"}, - {"2a0c:4840::/29", "204296"}, - {"2001:c20:c83a::/45", "3758"}, - {"2001:4878:a031::/48", "12222"}, - {"2402:800:9301::/44", "7552"}, - {"2402:c800:caff::/34", "38639"}, - {"2a0d:2587::/34", "142553"}, - {"2603:c026:4000::/35", "31898"}, - {"2804:8214::/32", "272497"}, - {"2001:400:2411::/33", "293"}, - {"2409:8904:39a0::/38", "24547"}, - {"2409:8c50:402::/36", "56047"}, - {"2803:71e0::/32", "270007"}, - {"2803:c880::/32", "398712"}, - {"2a0d:82c7:1000::/48", "47787"}, - {"2a0e:eec6::/32", "398343"}, - {"2001:480:32::/47", "668"}, - {"2001:559:478::/48", "20214"}, - {"2409:8050:2::/40", "56047"}, - {"2800:9a7:3070::/32", "14522"}, - {"2001:559:c13b::/45", "7922"}, - {"2a01:8140::/32", "42331"}, - {"2404:2080::/32", "131270"}, - {"2409:8a0c::/30", "56042"}, - {"240a:a9b1::/32", "145131"}, - {"2801:1a2:6::/48", "269845"}, - {"2001:250:5872::/48", "23910"}, - {"2001:559:35d::/48", "33287"}, - {"2001:559:86d4::/48", "7015"}, - {"2804:6f0c::/32", "270635"}, - {"2a06:78c0:db::/48", "210079"}, - {"2a0a:2303::/32", "202572"}, - {"2a0b:d40::/29", "59437"}, - {"2400:3c00:2::/32", "38258"}, - {"2408:8459:610::/41", "17622"}, - {"2600:1003:b000::/41", "6167"}, - {"2800:bf0:1ce::/43", "27947"}, - {"2803:810:2021::/48", "271822"}, - {"2a00:10d0::/32", "5588"}, - {"2a01:c50f:d0c0::/39", "12479"}, - {"2a02:26f7:82::/48", "36183"}, - {"2a02:e980:117::/42", "19551"}, - {"2a03:2880:f13b::/45", "32934"}, - {"2400:a980:900::/37", "133111"}, - {"2403:df40:118::/32", "14630"}, - {"2607:fdf0:5e42::/43", "8008"}, - {"2800:bf0:79::/45", "27947"}, - {"2804:46ec:3400::/32", "267020"}, - {"2804:85c0::/34", "272598"}, - {"2a07:440::/30", "49532"}, - {"240a:adca::/32", "146180"}, - {"2600:2800::/30", "13490"}, - {"2804:2a10::/32", "264054"}, - {"2806:260:1015::/44", "13999"}, - {"2001:978:3c03::/45", "174"}, - {"2001:4878:8158::/48", "12222"}, - {"2404:7f40:ffff::/48", "138645"}, - {"2409:8904:37a0::/36", "24547"}, - {"240a:a360::/32", "143514"}, - {"2600:6400::/28", "14371"}, - {"2801:80:bf0::/48", "61867"}, - {"2806:2f0:70a3::/41", "17072"}, - {"2a00:1c18::/38", "31463"}, - {"2a01:d8::/45", "5537"}, - {"2a01:581:9::/45", "9136"}, - {"2a0b:1300::/34", "198018"}, - {"2402:800:57b7::/41", "7552"}, - {"2804:53c0::/32", "268604"}, - {"2a02:2698:800::/38", "57044"}, - {"2a0d:f480::/29", "57933"}, - {"2403:71c0::/48", "43959"}, - {"2800:4b0:880d::/46", "12252"}, - {"2a0c:32c0::/48", "61183"}, - {"2406:c80::/32", "132092"}, - {"2804:565c::/32", "267993"}, - {"2806:2f0:4083::/42", "17072"}, - {"2001:559:8462::/48", "33661"}, - {"2408:8256:3960::/44", "17623"}, - {"2600:1417:64::/47", "20940"}, - {"2605:6480::/32", "92"}, - {"2607:6b80:5e::/48", "133480"}, - {"2806:2fb::/32", "265547"}, - {"240a:a2f6::/32", "143408"}, - {"240e:3b7:9c00::/34", "140310"}, - {"2600:6c38:e6::/44", "20115"}, - {"2803:4e80::/32", "263232"}, - {"2a03:e140:f::/48", "42608"}, - {"2a06:a001:a0b2::/48", "210260"}, - {"2a09:a4c3::/29", "208861"}, - {"2a0b:8e00::/47", "1921"}, - {"2604:d600:110f::/43", "32098"}, - {"240e:5a:7000::/29", "4134"}, - {"2607:f450::/32", "19170"}, - {"2800:190:101::/44", "11664"}, - {"2804:4d3c:a48::/35", "267420"}, - {"2a01:8840:3d::/48", "207266"}, - {"2a02:26f7:d64d::/46", "20940"}, - {"240a:a90a::/32", "144964"}, - {"2804:60d4:4100::/34", "269194"}, - {"2a02:26f7:f9c4::/48", "36183"}, - {"2800:68:dc1::/35", "61468"}, - {"2804:2e4:ffaf::/41", "53234"}, - {"2a00:8da0::/32", "6696"}, - {"2001:559:9c::/46", "33651"}, - {"240e:40:d::/43", "4134"}, - {"2a02:46e0:1dd::/32", "60049"}, - {"2401:d800:9200::/42", "7552"}, - {"2607:fb10:70f0::/44", "55095"}, - {"2804:5154::/40", "268445"}, - {"2a00:d3c0::/32", "204165"}, - {"240e:397:1b00::/37", "140494"}, - {"2a04:4e40:bef0::/48", "54113"}, - {"240a:a8c5::/32", "144895"}, - {"2607:f170:180::/32", "6364"}, - {"2804:7224::/32", "270835"}, - {"2400:1680::/32", "58895"}, - {"240a:a2fd::/32", "143415"}, - {"2602:fed2:7034::/48", "62997"}, - {"2602:ffe4:c05::/46", "21859"}, - {"2a01:4ce0::/41", "19624"}, - {"2a0f:9100::/32", "212906"}, - {"2001:559:c2c3::/48", "7015"}, - {"2001:44c8:43e0::/37", "131445"}, - {"2001:4930:4000::/32", "19530"}, - {"2402:800:a000::/35", "7552"}, - {"2402:8100:30b0::/41", "55644"}, - {"240a:a83f::/32", "144761"}, - {"2804:1dd4::/32", "264397"}, - {"2a02:26f7:c901::/46", "20940"}, - {"2600:6c3a:831::/46", "20115"}, - {"2801:19:c800::/48", "64050"}, - {"2804:279c:d000::/34", "263913"}, - {"2804:2c58:1310::/32", "265211"}, - {"2a00:1288:80::/48", "203220"}, - {"2602:fefa::/32", "64267"}, - {"2603:90be::/32", "12271"}, - {"2607:f098:1100::/34", "33363"}, - {"2801:181::/48", "271954"}, - {"2804:69e8::/32", "270299"}, - {"2a02:5c80::/32", "5602"}, - {"2001:da8:e008::/43", "24367"}, - {"2a03:5f80:8::/46", "50952"}, - {"2408:8957:3d00::/40", "17816"}, - {"240a:a53f::/32", "143993"}, - {"2804:2658:800::/32", "264328"}, - {"2405:e400::/32", "9268"}, - {"2800:160:1c0f::/43", "14259"}, - {"2804:67a4:11a::/42", "269641"}, - {"2a0a:ed40::/29", "8881"}, - {"2001:503:d414::/48", "397197"}, - {"2001:1248:5969::/45", "11172"}, - {"2408:8256:3c80::/48", "17816"}, - {"2a0c:b641:73b::/45", "207338"}, - {"240e:3b7:2c00::/35", "134774"}, - {"2620:130:3011::/46", "62861"}, - {"2001:c20:48c3::/48", "3758"}, - {"2800:160:1936::/47", "14259"}, - {"2804:4f1c::/32", "268304"}, - {"2804:78b8::/32", "271261"}, - {"240e:44d:a00::/41", "140345"}, - {"2001:559:201::/48", "33660"}, - {"2401:af40::/32", "41690"}, - {"2606:5640::/32", "399673"}, - {"2a03:a1a0::/32", "201004"}, - {"2001:e48:48::/40", "9583"}, - {"2001:44b8:4053::/48", "4739"}, - {"240a:a3ba::/32", "143604"}, - {"2600:141d:3::/32", "20940"}, - {"2804:4a24:69::/48", "267221"}, - {"2a01:578:14::/32", "16509"}, - {"2a02:1c8:40::/44", "60095"}, - {"2a04:240::/29", "3222"}, - {"2001:738::/46", "1955"}, - {"2001:b80::/29", "12767"}, - {"2001:1260:500::/32", "13591"}, - {"2404:a700::/32", "33182"}, - {"2604:d600:1065::/43", "32098"}, - {"2804:3064::/32", "264948"}, - {"2001:559:8514::/48", "33491"}, - {"2001:678:1c::/48", "35052"}, - {"2001:49d0:1c0::/32", "2495"}, - {"2401:4900:5600::/42", "45609"}, - {"2405:6600:c44::/32", "45845"}, - {"240a:a2b1::/32", "143339"}, - {"2804:14d:c800::/40", "28573"}, - {"2a02:7100::/32", "12942"}, - {"2001:559:80e3::/48", "33659"}, - {"2001:67c:780::/48", "200643"}, - {"2001:df1:801::/48", "133752"}, - {"2001:4490:efe8::/43", "9829"}, - {"2408:8409:c00::/40", "4808"}, - {"2408:84f3:f860::/40", "17623"}, - {"240a:aabf::/32", "145401"}, - {"2804:3ebc::/32", "266618"}, - {"2001:268::/36", "2516"}, - {"240a:a12f::/32", "142953"}, - {"240a:af6c::/32", "146598"}, - {"2602:ffd8::/36", "29838"}, - {"2604:6600:fdb7::/41", "40676"}, - {"2804:7300::/32", "270889"}, - {"2a0a:2400::/32", "206157"}, - {"2a0b:5e00::/29", "50309"}, - {"2001:250:85c::/42", "138182"}, - {"2001:67c:28d8::/48", "48345"}, - {"2804:8238::/32", "272506"}, - {"2a02:f5c0::/32", "207388"}, - {"240e:438:c40::/38", "4134"}, - {"2804:2674:8000::/48", "264344"}, - {"2804:7a38::/32", "271356"}, - {"2a10:2f00:168::/48", "211640"}, - {"240a:a7c2::/32", "144636"}, - {"2804:145c:81d0::/37", "263327"}, - {"2804:2e20::/32", "265326"}, - {"2804:70a4::/32", "270739"}, - {"2001:448a:4050::/42", "7713"}, - {"2607:b580:15::/46", "19754"}, - {"2001:418:1401:7::/64", "20940"}, - {"2406:400::/32", "7654"}, - {"2406:4440:e000::/40", "140938"}, - {"2804:54e8::/32", "268677"}, - {"2a02:26f0:701::/36", "20940"}, - {"2a05:fa40::/29", "197524"}, - {"2400:d400:d51::/48", "45671"}, - {"2402:8100:2200::/42", "55644"}, - {"2607:fd48:10a:1::/56", "13536"}, - {"2610:20::/37", "33343"}, - {"2620:134:1000::/44", "30025"}, - {"2620:1e1::/36", "26848"}, - {"2804:14c:de8a::/43", "28573"}, - {"2804:7ea4::/32", "271637"}, - {"2804:8320::/32", "272178"}, - {"2a00:53c0::/32", "57084"}, - {"2001:b10:e000::/35", "13293"}, - {"2405:9800:5a::/45", "131445"}, - {"240e:1c:1000::/36", "58461"}, - {"2804:41f4:2000::/38", "267468"}, - {"2a02:dd00::/29", "57388"}, - {"2409:8061:2903::/35", "9808"}, - {"2600:1404:9c01::/38", "20940"}, - {"2604:ccc0::/32", "46506"}, - {"2804:bac::/32", "262317"}, - {"2804:673c:4000::/32", "269615"}, - {"2a00:9e20::/32", "60574"}, - {"2a02:5f0::/32", "35320"}, - {"2a0a:7e00::/30", "61317"}, - {"2804:7958::/32", "271300"}, - {"2a01:790::/32", "42926"}, - {"2001:559:c2c7::/48", "7015"}, - {"2001:678:804::/48", "12897"}, - {"2401:dd00::/32", "38229"}, - {"2404:b300:101::/48", "131207"}, - {"2602:fed2:7117::/48", "57257"}, - {"2001:559:d3::/48", "7015"}, - {"2401:3480:2000::/48", "4811"}, - {"2409:8b39::/30", "9808"}, - {"240a:ade8::/32", "146210"}, - {"2a01:cd00:80d0::/48", "28708"}, - {"2a0c:b641:570::/48", "209300"}, - {"2a11:2a47::/32", "35913"}, - {"2001:559:7f3::/48", "33491"}, - {"2001:fd8:1ef0::/39", "4775"}, - {"2403:5c80::/48", "23724"}, - {"2408:84f3:2c40::/44", "17623"}, - {"2a00:1020:8::/45", "24739"}, - {"2a0d:2f00::/48", "39691"}, - {"2001:df5:ab80::/48", "141309"}, - {"2403:1cc0:3201::/46", "45352"}, - {"2800:160:2c2c::/43", "14259"}, - {"2a02:26f0:1e01::/34", "20940"}, - {"2001:559:8656::/48", "33659"}, - {"2402:15c0:6::/48", "10222"}, - {"2607:7c80:53::/48", "398987"}, - {"2a05:f507:76::/44", "13443"}, - {"2001:500:86::/47", "26710"}, - {"2001:559:8565::/48", "33650"}, - {"2001:fd8:1f10::/41", "4775"}, - {"2001:1900:2100:3800::/56", "54030"}, - {"2001:1a68:8::/47", "15694"}, - {"2401:d800:b7a0::/41", "7552"}, - {"240a:a374::/32", "143534"}, - {"2804:3944::/32", "266022"}, - {"2a01:138::/32", "15598"}, - {"2001:44b8:30d0::/45", "7545"}, - {"2804:6e44::/32", "270585"}, - {"2a0d:d500::/29", "208861"}, - {"2409:8914:1900::/34", "56044"}, - {"2605:dd40:8ff0::/44", "16509"}, - {"2804:7554::/32", "271039"}, - {"2a0b:7240::/29", "43355"}, - {"2c0f:f038::/32", "36924"}, - {"2001:559:3bc::/48", "33657"}, - {"2401:4900:1c30::/46", "24560"}, - {"2404:2440:b0b0::/48", "138521"}, - {"2600:1f00:5000::/40", "16509"}, - {"2a00:89c0::/32", "197981"}, - {"2a02:26f7:d191::/46", "20940"}, - {"2a04:c440:2a00::/40", "47340"}, - {"2a11:b980::/29", "204790"}, - {"2c0f:f188:4::/46", "28683"}, - {"2620:149:a12::/48", "6185"}, - {"2607:1880:ffff::/48", "13499"}, - {"2c0f:6c00:fff0::/44", "51110"}, - {"2001:1248:55bf::/41", "11172"}, - {"240a:aca7::/32", "145889"}, - {"2600:1404:b801::/37", "20940"}, - {"2610:68:8000::/33", "5774"}, - {"2405:1c0:6561::/45", "55303"}, - {"240e:3b1:f700::/36", "4134"}, - {"2804:4c5c:f7c0::/36", "267366"}, - {"2804:5a10::/32", "268746"}, - {"2804:6660::/32", "269554"}, - {"2804:7110:3100::/33", "270764"}, - {"2a02:888:4051::/48", "47794"}, - {"2001:df5:a300::/48", "137925"}, - {"2620:1a:e000::/48", "396233"}, - {"2803:3b80::/44", "263702"}, - {"2a02:f406:fe50::/48", "206283"}, - {"2400:b640::/48", "64067"}, - {"2405:e000:1421::/32", "37963"}, - {"240a:af8a::/32", "146628"}, - {"2600:1488:b001::/33", "20940"}, - {"2804:41a0:4000::/32", "267446"}, - {"2600:370f:344a::/43", "32261"}, - {"2803:d000:fffe::/48", "393398"}, - {"2a05:b4c0::/47", "201093"}, - {"2a05:f700:fffe::/48", "42236"}, - {"2804:7e04::/32", "271597"}, - {"2a11:1b80::/29", "42375"}, - {"2001:559:c4d9::/48", "33657"}, - {"2401:d800:2cd0::/42", "7552"}, - {"2402:2700:100::/33", "132061"}, - {"2409:8904:68b0::/39", "24547"}, - {"240a:a536::/32", "143984"}, - {"2804:2e30:31::/46", "265330"}, - {"2001:559:8336::/48", "33657"}, - {"2402:3a80:c060::/48", "38266"}, - {"2408:8459:7210::/42", "17623"}, - {"2602:fd40:ca1::/48", "14618"}, - {"2806:2f0:24a3::/43", "22884"}, - {"2001:559:499::/48", "33651"}, - {"2a02:26f7:bd45::/46", "20940"}, - {"2a0e:2c47:b::/32", "50581"}, - {"2804:5820::/32", "268108"}, - {"2a03:2780::/32", "57238"}, - {"2603:c0fd::/36", "54253"}, - {"2001:67c:2e04::/48", "21473"}, - {"240e:3b2:7800::/39", "4134"}, - {"2a00:c000::/32", "41090"}, - {"2a02:26f7:edc1::/46", "20940"}, - {"2001:43f8:a40::/48", "31960"}, - {"240a:afd8::/32", "146706"}, - {"2602:fcdb::/36", "55103"}, - {"2804:1e10::/32", "53122"}, - {"2a01:abe0::/32", "199786"}, - {"2001:67c:238::/48", "49974"}, - {"2001:67c:15e0::/48", "50360"}, - {"2401:d800:280::/42", "7552"}, - {"2804:2c3c::/32", "265205"}, - {"2a02:26f7:f1c0::/48", "36183"}, - {"2a07:b7c0::/29", "35280"}, - {"2400:a980:1f00::/40", "133515"}, - {"2400:cb00:480::/48", "13335"}, - {"2402:800:f162::/40", "7552"}, - {"2409:8904:6870::/40", "24547"}, - {"240e:982:d800::/40", "134769"}, - {"2001:67c:10d8::/48", "211501"}, - {"2001:7c0:2320::/29", "553"}, - {"2400:9380:90b0::/45", "4809"}, - {"2402:800:3b55::/42", "7552"}, - {"2620:1f7::/36", "18703"}, - {"2803:9140::/32", "264609"}, - {"2804:4de8::/32", "268227"}, - {"2a11:b740::/29", "204790"}, - {"2c0f:4f00::/32", "328961"}, - {"2401:d800:ba30::/41", "7552"}, - {"2401:d800:bf80::/42", "7552"}, - {"2806:230:6013::/48", "11888"}, - {"2a01:8840:96::/44", "12041"}, - {"2001:559:8297::/48", "33657"}, - {"2607:fb91:1700::/36", "21928"}, - {"2403:2700::/45", "38500"}, - {"240a:a5e5::/32", "144159"}, - {"2602:fc47::/36", "20454"}, - {"2a02:5060::/32", "60144"}, - {"2001:250:2427::/48", "24356"}, - {"2409:8054:303c::/48", "9808"}, - {"2803:6660::/32", "267895"}, - {"2a00:ce60::/32", "8542"}, - {"2a0a:e2c6::/32", "202015"}, - {"2001:559:8248::/48", "7015"}, - {"2001:559:8755::/46", "33491"}, - {"2404:ec:311::/42", "703"}, - {"2407:ae80::/32", "45062"}, - {"2620:138:3020::/48", "11251"}, - {"2a03:2b20::/48", "202077"}, - {"2408:8a22:9200::/36", "139007"}, - {"2600:1009:b1d0::/42", "6167"}, - {"240a:a097::/32", "142801"}, - {"2605:ad80:ff::/48", "62887"}, - {"2800:440:46::/48", "27738"}, - {"2a00:19e8::/32", "31493"}, - {"2001:480:36::/48", "289"}, - {"2001:67c:15d4::/48", "47397"}, - {"2001:67c:1978::/48", "24956"}, - {"2607:6980:e1a0::/44", "16584"}, - {"2804:5f1c::/32", "269077"}, - {"2408:8459:ac10::/42", "17623"}, - {"2804:2ec::/32", "262848"}, - {"2a03:2480:81::/33", "41983"}, - {"2a0d:7c80::/32", "204425"}, - {"2404:e680:1102::/42", "18409"}, - {"2605:a401:87aa::/43", "33363"}, - {"2605:ad80::/40", "62887"}, - {"2800:200:b390::/42", "12252"}, - {"2402:2100::/32", "19855"}, - {"2600:1406:9c00::/48", "35994"}, - {"2604:fb00::/32", "19223"}, - {"2606:4880::/32", "26156"}, - {"2804:49b4::/32", "267198"}, - {"2804:5688::/32", "268007"}, - {"2001:559:78d::/48", "7015"}, - {"2408:840c:1c00::/40", "17621"}, - {"2600:1008:9000::/44", "6167"}, - {"2600:1408:b001::/37", "20940"}, - {"2620:10a:80aa::/48", "55195"}, - {"2804:698c::/32", "270277"}, - {"2a01:5042:2efd::/48", "202196"}, - {"2a02:b48:8017::/44", "39572"}, - {"2a09:8400::/29", "44016"}, - {"2a0e:fd80::/29", "208722"}, - {"2001:ce8::/32", "17511"}, - {"2600:380:f10c::/46", "20057"}, - {"2602:feda:3b0::/44", "134575"}, - {"2620:101:80f8::/48", "395622"}, - {"2804:44::/32", "28606"}, - {"2804:17f8:200::/32", "262628"}, - {"2a05:7dc2:1000::/36", "51324"}, - {"2001:550:109::/45", "174"}, - {"2402:8100:2800::/40", "45271"}, - {"2408:8459:a250::/37", "17816"}, - {"2600:1006:b100::/42", "6167"}, - {"2605:a7c0:140::/48", "14618"}, - {"2620:a6:2000::/48", "27566"}, - {"2800:200:b3f0::/37", "12252"}, - {"2a02:5840::/32", "49476"}, - {"2402:8100:26c8::/47", "45271"}, - {"240e:3be:d000::/36", "134772"}, - {"2606:9580::/37", "394256"}, - {"2a0a:8c40::/32", "50979"}, - {"2001:559:86f1::/48", "33659"}, - {"2001:da8:b807::/44", "24372"}, - {"2404:73c0:2102::/48", "48024"}, - {"2409:8924:a900::/38", "56046"}, - {"240a:a438::/32", "143730"}, - {"2804:356c::/32", "266285"}, - {"2a02:ed80::/29", "61303"}, - {"2001:fd8:220::/48", "132199"}, - {"2409:861e::/31", "24400"}, - {"2409:8924:9500::/38", "56046"}, - {"240a:a3d6::/32", "143632"}, - {"2801:b6:300::/36", "263083"}, - {"2a02:4a40:108::/48", "50994"}, - {"2a05:8900:aa1::/48", "42388"}, - {"2001:559:c02f::/43", "20214"}, - {"2001:df4:6480::/48", "140971"}, - {"240e:96b:6003::/45", "140365"}, - {"2a00:1d34:8000::/39", "47331"}, - {"2a09:4980::/32", "39360"}, - {"2001:559:818f::/48", "13367"}, - {"2403:5440::/32", "138033"}, - {"2604:2000::/32", "12271"}, - {"2620:118:e001::/44", "27418"}, - {"2804:5100:2100::/35", "268424"}, - {"2001:579:247c::/40", "22773"}, - {"2001:67c:864::/48", "210887"}, - {"2001:7f8:1::/64", "35277"}, - {"2401:d800:faa0::/41", "7552"}, - {"2402:5680:8000::/36", "133798"}, - {"2a02:530:1a::/42", "21191"}, - {"2a0a:56c4::/48", "42649"}, - {"240a:a54e::/32", "144008"}, - {"2600:c0c::/32", "11854"}, - {"2a0e:97c3:589::/48", "20473"}, - {"240e:108:11b0::/48", "58461"}, - {"2804:3ee0::/32", "266626"}, - {"2804:8430::/34", "272245"}, - {"2407:e740::/47", "59239"}, - {"240a:a46e::/32", "143784"}, - {"2602:feda:7::/44", "46997"}, - {"2800:4f0::/48", "28006"}, - {"2804:1b0:1a82::/47", "10429"}, - {"2804:802c:110::/42", "271734"}, - {"2a02:a00:e005::/35", "15987"}, - {"2a09:f1c0::/29", "57756"}, - {"2001:559:2bf::/48", "33667"}, - {"2804:53dc::/32", "268611"}, - {"2a06:b740::/29", "31027"}, - {"240e:108:85::/48", "133774"}, - {"2a0d:f407:1030::/48", "211030"}, - {"2600:6c38:1ca::/43", "20115"}, - {"2620:106:e00f::/48", "22518"}, - {"2a09:7700::/29", "211199"}, - {"2a12:8d40:2022::/48", "208171"}, - {"240a:a13c::/32", "142966"}, - {"2607:fa70:2490::/32", "19855"}, - {"2803:6e0::/32", "269950"}, - {"2001:67c:14dc::/48", "3301"}, - {"2402:600::/47", "38515"}, - {"2402:1d40:3::/33", "58826"}, - {"2408:8456:ac40::/38", "17816"}, - {"2600:9000:2368::/48", "16509"}, - {"2a02:898::/32", "8283"}, - {"2a05:b780::/29", "57809"}, - {"2a09:80::/29", "59615"}, - {"2409:8d14:700::/36", "56044"}, - {"240a:ae10::/32", "146250"}, - {"2a12:7340::/29", "400522"}, - {"2001:559:1fa::/48", "7922"}, - {"2404:b300:400::/48", "131207"}, - {"2408:8206:8510::/34", "4808"}, - {"2409:8080:2a30::/41", "9808"}, - {"2602:fc2d::/36", "3653"}, - {"2801:140:fffb::/45", "262249"}, - {"2a0c:640::/29", "328543"}, - {"2402:3a80:830::/38", "38266"}, - {"2402:ce00::/31", "7700"}, - {"2408:8956:3600::/40", "17622"}, - {"2408:8957:c600::/40", "17622"}, - {"240e:44d:2080::/41", "4134"}, - {"2a05:1602::/32", "207249"}, - {"2c0f:f698:cff1::/34", "37693"}, - {"2001:579:534c::/40", "22773"}, - {"2001:67c:2960::/48", "209844"}, - {"240a:ac9e::/32", "145880"}, - {"2804:80cc:7::/48", "272413"}, - {"240a:aa31::/32", "145259"}, - {"2804:6090::/32", "269177"}, - {"2a00:df8::/32", "24753"}, - {"2a02:26f7:c58d::/42", "20940"}, - {"2001:468:e00::/40", "2153"}, - {"2001:550:200:9::/44", "174"}, - {"2804:7cb8::/32", "271514"}, - {"2a02:cb80:4005::/46", "43766"}, - {"2001:4868:205::/44", "7046"}, - {"2400:d980::/32", "59340"}, - {"2407:c800::/32", "9365"}, - {"2620:12c:9004::/48", "395359"}, - {"2a02:26f7:e844::/48", "36183"}, - {"2a0d:b680::/29", "50304"}, - {"2408:8956:1600::/40", "17622"}, - {"2804:5ee8:c000::/34", "269064"}, - {"2a02:26f7:e181::/46", "20940"}, - {"240a:a8fa::/32", "144948"}, - {"240e:44d:2f00::/41", "140345"}, - {"2607:fb10:50c3::/34", "2906"}, - {"2620:117:2000::/40", "194"}, - {"2402:800:70f0::/39", "7552"}, - {"240a:a62e::/32", "144232"}, - {"2600:6c38:199::/42", "20115"}, - {"2804:6864::/39", "269689"}, - {"2a05:dfc7:dfc9::/34", "61138"}, - {"2001:43f8:10::/48", "36948"}, - {"2408:8957:5e00::/40", "17622"}, - {"240a:a931::/32", "145003"}, - {"2600:1008:9100::/44", "6167"}, - {"2804:75cc::/32", "271070"}, - {"2a00:1728:b::/45", "34224"}, - {"2a02:fd00::/29", "15613"}, - {"2a0a:a040::/31", "12552"}, - {"2001:df4:9980::/48", "141007"}, - {"2401:4900:1200::/42", "45609"}, - {"2406:ab40::/28", "63784"}, - {"2a01:8840:a5::/48", "207266"}, - {"2c0f:ec30::/32", "37722"}, - {"2001:67c:2e90::/48", "203918"}, - {"2a02:26f7:e801::/46", "20940"}, - {"2001:67c:25e4::/48", "198239"}, - {"2408:8957:f1c0::/42", "17622"}, - {"2606:4700:2001::/48", "395747"}, - {"2607:f750:2400::/38", "23473"}, - {"2001:559:87ca::/48", "33287"}, - {"240e:3ba:2200::/37", "136198"}, - {"2600:1402:5001::/34", "20940"}, - {"2620:107:f000::/40", "13541"}, - {"2801:80:3eb0::/48", "272519"}, - {"2804:593c::/32", "268177"}, - {"2804:7458::/32", "270975"}, - {"2a01:4280::/47", "31391"}, - {"2a01:8840:aa::/45", "12041"}, - {"2a02:6a80:5300::/48", "197997"}, - {"2a07:a880:3101::/48", "42675"}, - {"2a0b:6980::/29", "43414"}, - {"2001:48c0:4::/32", "14589"}, - {"2408:8256:66::/39", "17622"}, - {"2620:a8::/48", "237"}, - {"2804:1a04:c::/42", "61832"}, - {"2001:559:c1ef::/48", "33660"}, - {"2402:800:fa50::/42", "7552"}, - {"2804:8448::/32", "272251"}, - {"2604:6600:9a::/42", "40676"}, - {"2606:6800:c00::/40", "32940"}, - {"2607:f3a0:a003::/48", "399818"}, - {"2a02:2120::/30", "2119"}, - {"2a04:4e40:f200::/48", "54113"}, - {"2a06:8784::/32", "205112"}, - {"240a:a0bd::/32", "142839"}, - {"240e:44d:6940::/42", "140351"}, - {"2604:6840:ac19::/48", "20446"}, - {"2607:8700:102::/48", "25820"}, - {"2620:12c:b131::/48", "13448"}, - {"2a00:1d58::/32", "47524"}, - {"2001:559:c1e2::/47", "33651"}, - {"2404:8d02:20a7::/37", "9587"}, - {"2804:6a4c::/32", "270325"}, - {"2a0c:7e44:da38::/48", "20473"}, - {"2a0f:5fc0:beef::/48", "205036"}, - {"2001:4830:c400::/40", "33083"}, - {"240a:a638::/32", "144242"}, - {"2604:d600:54d::/46", "32098"}, - {"2a02:cb80:2a20::/48", "43766"}, - {"2406:66c0::/32", "62126"}, - {"2620:10a:9046::/48", "7018"}, - {"2a04:33c0::/40", "60671"}, - {"2a0e:b105:120::/44", "211659"}, - {"2001:2e8::/32", "10013"}, - {"2001:559:17b::/48", "7725"}, - {"2402:ad80:c0::/48", "138423"}, - {"2409:8004::/45", "24547"}, - {"2620:119:c000::/44", "46322"}, - {"2001:559:418::/48", "20214"}, - {"240a:acac::/32", "145894"}, - {"2607:f1e0:5200::/32", "19092"}, - {"2a02:d900::/29", "43809"}, - {"2c0f:4900::/32", "328870"}, - {"2409:8027:2b07::/37", "9808"}, - {"2803:fc40::/32", "264651"}, - {"2804:735c::/32", "270910"}, - {"2a0f:9400:772d::/48", "209533"}, - {"2401:d800:de0::/38", "7552"}, - {"2408:8256:317d::/46", "17623"}, - {"240a:aa6a::/32", "145316"}, - {"240e:45e::/26", "4134"}, - {"2001:250:681c::/38", "23910"}, - {"2001:fd8:228::/41", "4775"}, - {"240a:af19::/32", "146515"}, - {"2804:7080::/32", "270730"}, - {"2a02:26f7:f6d5::/46", "20940"}, - {"2001:559:f9::/48", "7015"}, - {"2600:6c2e:36::/40", "20115"}, - {"2606:2800:4050::/48", "14210"}, - {"2a00:1728::/47", "34224"}, - {"2001:559:c31a::/48", "33657"}, - {"240a:a9cd::/32", "145159"}, - {"2600:6c10:f612::/36", "20115"}, - {"2607:f330:5fa1::/48", "15130"}, - {"2607:f740:e630::/46", "63911"}, - {"2a02:2698:c00::/35", "39435"}, - {"2001:250:6428::/43", "24367"}, - {"2405:201:6400::/35", "55836"}, - {"2606:b400:8820::/48", "7160"}, - {"2804:3bfc:100::/40", "52607"}, - {"2a02:3f8:7::/48", "8359"}, - {"2a0e:f2c0::/29", "205243"}, - {"2001:67c:25c::/48", "51188"}, - {"2001:1900:2100:3900::/38", "3356"}, - {"2801:80:850::/48", "263428"}, - {"2605:b4c0:1234::/48", "25780"}, - {"2803:1a00:513::/35", "262186"}, - {"2a00:79c0::/32", "41998"}, - {"2a06:9380::/29", "203965"}, - {"2a0c:bf80::/48", "61295"}, - {"2402:800:5d8d::/43", "7552"}, - {"2404:3900:1::/48", "38320"}, - {"2804:3230::/32", "265061"}, - {"2804:3534::/32", "266274"}, - {"2c0f:ef28::/32", "328333"}, - {"2c0f:fc89:e1::/39", "36992"}, - {"2001:559:390::/46", "7922"}, - {"2001:678:c5c::/48", "50509"}, - {"2001:df1:6003::/48", "9318"}, - {"240a:ae9d::/32", "146391"}, - {"2001:1248:5a29::/46", "11172"}, - {"2403:2c00:f020::/36", "4058"}, - {"2602:feda:ca1::/48", "39753"}, - {"2804:800:ff01::/40", "16509"}, - {"2402:800:9bee::/43", "7552"}, - {"2600:9000:2035::/46", "16509"}, - {"2a02:587:1c00::/33", "6799"}, - {"2001:1960:100::/40", "32587"}, - {"2400:7400:e01a::/47", "38044"}, - {"2a00:8040::/32", "50792"}, - {"2001:559:c275::/48", "33650"}, - {"2001:56b:8000::/44", "852"}, - {"2001:1940::/32", "21947"}, - {"2a02:26f7:d1cd::/42", "20940"}, - {"2401:8800:200::/40", "17439"}, - {"2600:6:ff05::/48", "1239"}, - {"2801:1b:800::/48", "267855"}, - {"2803:7c10::/32", "271884"}, - {"2804:4b4c::/38", "267296"}, - {"2a02:26f7:d80a::/47", "20940"}, - {"2001:678:c00::/48", "49554"}, - {"2400:6280:12d::/48", "132280"}, - {"240e:44d:5000::/41", "140345"}, - {"2a00:82a0::/32", "21230"}, - {"2001:678:280::/48", "50169"}, - {"2001:df2:7f80::/48", "133803"}, - {"240e:878:640::/31", "4134"}, - {"2a02:568:fe00::/48", "31529"}, - {"2a02:26f7:c5c9::/46", "20940"}, - {"2a0c:b641:f2::/47", "210985"}, - {"2a10:6f00:ffff::/29", "399975"}, - {"2001:67c:2564::/48", "1133"}, - {"2806:2f0:12e3::/43", "17072"}, - {"2a02:26f7:d701::/46", "20940"}, - {"2a04:4e40:2200::/48", "54113"}, - {"2a0e:fc80::/36", "212286"}, - {"2804:5df0::/32", "269002"}, - {"2a00:eb20::/32", "8330"}, - {"2a0c:a9c7:225::/48", "44597"}, - {"2c0f:f7a0::/32", "37184"}, - {"2001:678:42c::/48", "205955"}, - {"2401:cf80:6045::/40", "55303"}, - {"2402:800:5755::/42", "7552"}, - {"2804:715c::/32", "270784"}, - {"2a03:38a0::/32", "60781"}, - {"2a04:4e40:9200::/48", "54113"}, - {"2a09:6f80::/29", "3320"}, - {"2600:1007:b0d0::/44", "6167"}, - {"2620:122:8000::/48", "18541"}, - {"2a01:358:8011::/33", "9121"}, - {"2403:bac0::/32", "133815"}, - {"240a:a51d::/32", "143959"}, - {"240e:698:2200::/40", "58466"}, - {"2606:f900:a201::/37", "812"}, - {"2620:1ec:8::/47", "8075"}, - {"2804:1b2:6000::/32", "18881"}, - {"2804:6d4::/32", "53045"}, - {"2804:2b34:f900::/37", "265140"}, - {"2a00:1ec0::/47", "8544"}, - {"2a03:2300::/29", "47975"}, - {"2001:df1:1400::/48", "133296"}, - {"2620:16:6000::/48", "27195"}, - {"2a06:6ec0::/29", "37478"}, - {"2a0d:4d80::/29", "1764"}, - {"2406:b400:6::/44", "18209"}, - {"240a:ab6c::/32", "145574"}, - {"240d:c010:12::/48", "132203"}, - {"2a03:28a0:4::/32", "201650"}, - {"2a04:c440:8000::/36", "2534"}, - {"2001:559:435::/46", "7922"}, - {"2600:1410:4001::/35", "20940"}, - {"2a02:26f7:7d::/48", "20940"}, - {"2a0e:38c0::/32", "207747"}, - {"2a11:f700::/29", "400522"}, - {"2001:4860:1025::/48", "36040"}, - {"2001:4998:1a0::/44", "10310"}, - {"2408:8957:b600::/40", "17622"}, - {"240a:a875::/32", "144815"}, - {"2001:da8:302f::/41", "24358"}, - {"2409:8948:8d00::/40", "24445"}, - {"240a:a802::/32", "144700"}, - {"2804:6adc::/32", "270362"}, - {"2001:559:8209::/48", "7015"}, - {"2001:978:1f01::/34", "174"}, - {"2001:1478::/35", "3257"}, - {"2406:4e40::/32", "140966"}, - {"2600:1004:b1f0::/44", "22394"}, - {"2600:6c10:11d::/46", "20115"}, - {"2607:f928:2::/48", "16905"}, - {"2620:107:9029::/48", "7018"}, - {"2804:43c8::/32", "267589"}, - {"2a02:ee80:41f0::/45", "3573"}, - {"2c0f:f000::/39", "36891"}, - {"2001:559:812f::/48", "7015"}, - {"2001:559:c147::/48", "7922"}, - {"2408:8256:357c::/48", "17816"}, - {"2a03:ee40::/32", "3170"}, - {"2a10:6100::/29", "399975"}, - {"240a:a1b7::/32", "143089"}, - {"240e:108:1134::/44", "4134"}, - {"2600:370f:3622::/45", "32261"}, - {"2620:13f:701e::/48", "59116"}, - {"2804:62c:2011::/32", "262569"}, - {"2a0b:9100::/32", "201098"}, - {"2001:250:5874::/48", "23910"}, - {"2001:559:c1db::/45", "7922"}, - {"2401:b8c0:e::/47", "64074"}, - {"2408:8456:2e50::/39", "17816"}, - {"2a05:7640:fb0::/44", "174"}, - {"2a0a:340:1000::/40", "48043"}, - {"2600:1415:2001::/37", "20940"}, - {"2620:110:f000::/44", "17012"}, - {"2806:2f0:24a0::/48", "17072"}, - {"2a06:e881:5508::/48", "212243"}, - {"2a0e:b107:32::/47", "209650"}, - {"2602:ff44::/36", "393524"}, - {"2602:ff96:1f::/48", "40676"}, - {"2a01:4040::/32", "25176"}, - {"2a03:5000::/32", "15854"}, - {"2001:67c:17a4::/48", "59891"}, - {"240a:ae50::/32", "146314"}, - {"2804:1b5c:2::/32", "28334"}, - {"2a02:27d0::/39", "49463"}, - {"2404:1b0::/32", "18059"}, - {"2404:5f40:2::/48", "38447"}, - {"2409:801a::/34", "132525"}, - {"2603:b010:2000::/33", "11796"}, - {"2620:1fb::/36", "12061"}, - {"2804:35ac::/32", "266300"}, - {"2a02:4fe0::/32", "60129"}, - {"2001:ae0::/32", "8925"}, - {"240e:83:ff00::/40", "23724"}, - {"2607:fb10:70d2::/44", "2906"}, - {"2804:6204::/32", "269271"}, - {"2806:10b0::/32", "8151"}, - {"2001:559:d9::/48", "13367"}, - {"2404:4e00:1003::/48", "32787"}, - {"2408:8456:3e40::/33", "17816"}, - {"2a02:26f7:e848::/48", "36183"}, - {"2a0f:9441:44::/29", "62240"}, - {"2401:4900:4940::/44", "45609"}, - {"2a04:7640::/48", "6730"}, - {"2a0e:3940:1000::/36", "60767"}, - {"240a:ae6c::/32", "146342"}, - {"2804:7a3c:f000::/36", "271357"}, - {"2a01:c8:400::/32", "20756"}, - {"2804:4bf8::/32", "267340"}, - {"2a01:8840:7d::/48", "207266"}, - {"2001:250:5824::/46", "24363"}, - {"2602:ffdf:400::/36", "63060"}, - {"2607:6d00::/32", "1798"}, - {"2804:3578::/32", "266288"}, - {"2804:4184::/32", "267438"}, - {"2a00:1d58:f01c::/46", "47524"}, - {"2a02:e9::/30", "12637"}, - {"2a0c:6400::/32", "207045"}, - {"2a0c:b640:14::/46", "34872"}, - {"2c0f:e890::/32", "60171"}, - {"2001:44b8:404f::/48", "4739"}, - {"2409:8904:6340::/42", "24547"}, - {"2a02:26f7:d608::/48", "36183"}, - {"2001:4f8:11::/48", "16509"}, - {"240e:b7:5000::/34", "58563"}, - {"2804:62c:2001::/45", "262569"}, - {"2804:3188::/32", "265022"}, - {"2401:1700:7c30::/32", "55666"}, - {"2620:121:5::/44", "55219"}, - {"2001:559:c2d0::/48", "33662"}, - {"2409:8028:3100::/37", "9808"}, - {"240e:438:4e40::/35", "4134"}, - {"2600:803:1200::/48", "15572"}, - {"2607:f7f8:4459::/48", "4459"}, - {"2801:80:b90::/48", "21506"}, - {"2806:2f0:46a3::/39", "17072"}, - {"2a02:2188:2000::/36", "60848"}, - {"2001:1978:1000::/39", "13768"}, - {"2409:8052:2100::/37", "9808"}, - {"240a:a192::/32", "143052"}, - {"2806:20d:1638::/46", "32098"}, - {"2a00:8640::/30", "203993"}, - {"2a03:2400::/29", "47295"}, - {"2001:250:21e::/48", "24349"}, - {"2001:579:9004::/43", "22773"}, - {"240a:a489::/32", "143811"}, - {"2606:6c00:4::/44", "32787"}, - {"2607:d500:603::/40", "13768"}, - {"2806:2f0:61a3::/41", "17072"}, - {"2a05:37c0::/29", "48091"}, - {"2401:13c0:a000::/36", "132652"}, - {"2605:a580::/32", "36103"}, - {"2800:160:2cdd::/42", "14259"}, - {"2804:11e4::/32", "52945"}, - {"2a0f:c087:b29::/48", "48108"}, - {"2a11:7347:7348::/32", "33171"}, - {"2001:559:86a4::/48", "33650"}, - {"2001:648:2010::/48", "8643"}, - {"2605:4180::/28", "35985"}, - {"2800:bf0:2ac3::/37", "27947"}, - {"2804:14c:4300::/40", "28573"}, - {"2001:4878::/48", "12222"}, - {"2409:8958:cf54::/31", "56040"}, - {"240e:95c:6000::/32", "4134"}, - {"2a0a:f240::/29", "205820"}, - {"2001:67c:207c::/48", "39913"}, - {"2001:df0:311::/48", "9255"}, - {"2001:f20:3000::/46", "9875"}, - {"2001:13d2:6805::/46", "7303"}, - {"240e:44d:5740::/42", "140350"}, - {"2620:12d:e010::/48", "29909"}, - {"2806:2f0:45a1::/46", "17072"}, - {"2408:80ea:77a0::/36", "17816"}, - {"2a07:1980:18::/48", "48851"}, - {"2a0f:9400:7721::/48", "20473"}, - {"2407:600::/32", "9268"}, - {"2600:6c20:846::/43", "20115"}, - {"2408:8956:3b00::/40", "17816"}, - {"2001:559:843f::/48", "33491"}, - {"2402:800:960f::/43", "7552"}, - {"240a:a67e::/32", "144312"}, - {"2804:2d0c:e0::/32", "262408"}, - {"2001:559:8441::/48", "33668"}, - {"2001:668:1f8::/46", "30371"}, - {"2600:1417:4800::/48", "8781"}, - {"2610:20:6f96::/47", "49"}, - {"2a07:6200::/29", "47820"}, - {"2001:1a10:1010::/33", "8781"}, - {"2405:e480:1::/46", "9507"}, - {"2408:8957:e00::/40", "17622"}, - {"2600:6c38:6::/44", "20115"}, - {"2801:0:20::/48", "28027"}, - {"2a00:4b80::/48", "43833"}, - {"2a04:4e40:1a20::/44", "54113"}, - {"240a:aa27::/32", "145249"}, - {"2600:1419:b001::/37", "20940"}, - {"2605:9380::/32", "32614"}, - {"2800:bf0:a800::/48", "52257"}, - {"2804:19cc::/32", "61819"}, - {"2a04:a2c0::/32", "9044"}, - {"2409:8924:5f00::/34", "56046"}, - {"2620:11a:a03d::/40", "43515"}, - {"2801:80:2240::/48", "267592"}, - {"2a02:27d8::/32", "20741"}, - {"2402:800:3b0f::/43", "7552"}, - {"240a:a3bc::/32", "143606"}, - {"2804:340::/33", "28165"}, - {"2804:145c:c530::/38", "263327"}, - {"2001:559:8144::/48", "33650"}, - {"2001:dc7:dd02::/45", "24151"}, - {"2606:96c0::/32", "26943"}, - {"2a05:a400::/29", "8492"}, - {"2a05:d540::/29", "47269"}, - {"2c0f:f418::/46", "37714"}, - {"2409:8000:5100::/40", "56048"}, - {"2800:160:168d::/42", "14259"}, - {"2800:bf0:2c22::/38", "27947"}, - {"2803:3a00::/36", "23243"}, - {"2806:20d:500a::/43", "32098"}, - {"2a02:26f7:f601::/46", "20940"}, - {"2a06:bc00::/29", "203732"}, - {"2001:559:dd::/46", "7922"}, - {"2401:8d00:f::/43", "38345"}, - {"2405:1c0:6341::/46", "55303"}, - {"240a:a525::/32", "143967"}, - {"2804:6448::/32", "269418"}, - {"2a03:4ba0:1::/48", "47697"}, - {"2a07:b280:100::/38", "212148"}, - {"2a0e:acc0::/48", "208414"}, - {"2a10:e541::/30", "211434"}, - {"2001:358::/32", "4680"}, - {"2001:df7:3f80::/48", "140819"}, - {"2400:4f00::/36", "17911"}, - {"2600:1415:6::/44", "20940"}, - {"2400:4880::/46", "131178"}, - {"2803:ec10::/47", "271880"}, - {"2a0a:2000::/29", "201057"}, - {"2001:fd8:304a::/39", "4775"}, - {"2602:feb4:f0::/44", "25961"}, - {"2605:5240:2500::/33", "397494"}, - {"2804:e2c::/32", "262938"}, - {"2a00:d900::/32", "58160"}, - {"2402:45c0::/48", "38221"}, - {"2604:cec0::/32", "36472"}, - {"2a02:210::/32", "6898"}, - {"2a05:48c0::/29", "207227"}, - {"2a0d:9480::/29", "50313"}, - {"2a11:e980::/29", "24940"}, - {"2406:ef40::/47", "133811"}, - {"2600:6c38:7a::/45", "20115"}, - {"2606:2800:4120::/48", "15133"}, - {"2a06:9f45:1200::/40", "211480"}, - {"2a07:9b00::/29", "202640"}, - {"2a0c:4880::/29", "212660"}, - {"2001:678:1e8::/48", "213151"}, - {"2401:3400:8000::/48", "45352"}, - {"240a:af8d::/32", "146631"}, - {"2a02:26f7:e1c4::/48", "36183"}, - {"2a02:4540:9040::/46", "197207"}, - {"2a0f:8740::/29", "34596"}, - {"2401:2000:8000::/33", "4608"}, - {"2402:ef03:d::/40", "7633"}, - {"2404:8e80:1::/48", "135168"}, - {"2406:20c0:4001::/34", "140423"}, - {"240e:3bd:8200::/35", "140316"}, - {"2605:ee00::/43", "29990"}, - {"2a02:2010:22d0::/45", "20978"}, - {"2001:559:2c0::/48", "33652"}, - {"2001:559:82a4::/48", "33287"}, - {"2001:67c:117c::/48", "207825"}, - {"2800:40:34::/47", "16814"}, - {"2a0a:7a06::/31", "61317"}, - {"2a12:8d06::/31", "57695"}, - {"2001:559:8652::/48", "7015"}, - {"2001:df0:4::/48", "681"}, - {"2408:8256:358e::/48", "17623"}, - {"240e:108:4d::/48", "4134"}, - {"2600:805:149::/37", "701"}, - {"2620:1c0:72::/47", "22773"}, - {"2801:12:b000::/48", "265884"}, - {"2804:59a8::/35", "268717"}, - {"2a03:4600::/32", "44334"}, - {"2a07:2918:6000::/36", "60115"}, - {"2a10:e5c0::/48", "58349"}, - {"240e:44d:1500::/41", "140345"}, - {"2806:2f0:1121::/46", "22884"}, - {"2a02:5420:627::/48", "43541"}, - {"2001:df0:69::/48", "41625"}, - {"2402:800:b0a0::/41", "7552"}, - {"2408:8456:200::/42", "17622"}, - {"240a:a6e7::/32", "144417"}, - {"2804:233c::/32", "264150"}, - {"2a0f:9400:7728::/48", "53356"}, - {"2001:250:22e::/48", "24349"}, - {"2001:559:472::/48", "7016"}, - {"240e:698:4400::/40", "134768"}, - {"2802:0:24::/41", "18747"}, - {"2403:cfc0:1003::/48", "135134"}, - {"240e:250:2900::/45", "4134"}, - {"2600:6c10:f064::/47", "20115"}, - {"2001:559:5d3::/48", "33657"}, - {"2801:80:1d30::/48", "265916"}, - {"2804:7024:8400::/33", "270708"}, - {"2804:7868::/32", "271240"}, - {"2a00:6380::/32", "51469"}, - {"2a02:eb8::/29", "51132"}, - {"2001:44b8:205b::/48", "4739"}, - {"2001:559:e8::/48", "22909"}, - {"2404:ef00::/32", "63515"}, - {"2600:370f:71a5::/41", "32261"}, - {"2a02:26f0:501::/46", "20940"}, - {"2001:559:794::/48", "33657"}, - {"2001:559:c1ba::/48", "13367"}, - {"2620:8d:4000::/48", "7954"}, - {"2803:7900::/32", "28094"}, - {"2a02:108::/32", "3292"}, - {"2001:250:342f::/48", "23910"}, - {"2408:8459:1c50::/39", "17816"}, - {"2620:11c:30a1::/41", "31764"}, - {"2a02:26f7:d0c5::/46", "20940"}, - {"2001:4878:261::/48", "12222"}, - {"2407:3e00:3000::/48", "9255"}, - {"2408:840c:d00::/40", "17621"}, - {"2620:0:2a0c::/48", "40344"}, - {"2804:6eb0::/32", "270613"}, - {"2409:8c20:28c2::/33", "56046"}, - {"2602:feda:3d2::/44", "213361"}, - {"2804:3184::/32", "265021"}, - {"2a00:ec40::/29", "34127"}, - {"2a0e:97c0:490::/44", "211044"}, - {"2405:8a00:a00e::/43", "55824"}, - {"2606:9b80::/32", "394487"}, - {"2620:117:80::/48", "10564"}, - {"2804:18:6010::/44", "10429"}, - {"2804:229c::/32", "264111"}, - {"2a0b:7a00:2::/47", "60689"}, - {"2606:6ec0::/32", "22773"}, - {"2a02:26f7:31::/48", "20940"}, - {"2a02:2e02:c60::/40", "12479"}, - {"2a0b:8780::/48", "16509"}, - {"2a0f:9400:700c::/48", "211144"}, - {"2804:540::/32", "262504"}, - {"2804:7c8::/35", "262323"}, - {"2404:bf40:e100::/48", "2764"}, - {"2a04:9f80::/29", "5432"}, - {"2400:adcc:1800::/39", "9541"}, - {"2405:9200:5100::/41", "131596"}, - {"2409:8c20:4826::/38", "56046"}, - {"240a:a488::/32", "143810"}, - {"240a:a7c9::/32", "144643"}, - {"2620:12d:e03f::/48", "7015"}, - {"2801:1c:1800::/48", "18678"}, - {"2001:df2:a780::/48", "140054"}, - {"2602:fd23::/48", "33185"}, - {"2602:fed2:7119::/48", "207414"}, - {"2804:2984:700::/41", "53184"}, - {"2804:3504::/32", "265495"}, - {"2804:6dc8::/32", "270555"}, - {"2001:4b98:aaaa::/47", "209453"}, - {"2405:9800:b010::/47", "133481"}, - {"2804:2230::/32", "264590"}, - {"2a02:2890:ffff::/31", "51185"}, - {"2a07:14c0:2::/34", "208861"}, - {"2001:678:ad8::/48", "208562"}, - {"2001:4878:8347::/48", "12222"}, - {"2602:ffd3::/36", "6140"}, - {"2605:29c0::/32", "397312"}, - {"2a05:b300::/30", "400177"}, - {"2a0f:607:1000::/47", "7480"}, - {"2001:16a0:4::/33", "39386"}, - {"2602:ff62:124::/40", "61317"}, - {"2604:f400:6000::/37", "40579"}, - {"2620:123:f008::/48", "20127"}, - {"2a01:8840:75::/48", "207266"}, - {"2a02:26f7:c8c5::/46", "20940"}, - {"2a04:53c0:80::/48", "47784"}, - {"2001:ac0:c890::/34", "8903"}, - {"2400:8b00:500::/42", "45727"}, - {"240a:ad5d::/32", "146071"}, - {"2001:200:e000::/35", "7660"}, - {"2607:f750:8010::/38", "23473"}, - {"2804:7674::/32", "271113"}, - {"2804:7b80::/32", "262610"}, - {"2a02:ac80:b001::/33", "25145"}, - {"2804:77f4::/32", "271210"}, - {"2a02:26f7:cfc5::/46", "20940"}, - {"2a04:3e00:2::/36", "56910"}, - {"240e:44d:6500::/42", "140345"}, - {"2606:840::/32", "3356"}, - {"2a02:26f7:bf88::/48", "36183"}, - {"2a03:12a0::/29", "3301"}, - {"2a07:2440::/29", "42695"}, - {"2001:559:108::/48", "33659"}, - {"2001:67c:10d4::/48", "58057"}, - {"2400:8500:9d07::/48", "7506"}, - {"2a02:26f7:ee89::/46", "20940"}, - {"2804:21fc::/32", "264584"}, - {"2804:54bc::/32", "268667"}, - {"2a02:26f7:ea89::/46", "20940"}, - {"2a0b:2a00::/32", "51933"}, - {"2804:4938::/32", "267171"}, - {"2a0c:1940:20::/44", "60354"}, - {"2a0e:b00::/29", "63023"}, - {"2401:d800:5cd2::/39", "7552"}, - {"2a0a:5780::/32", "47490"}, - {"2a0a:7cc0:2::/29", "60880"}, - {"2a0d:8fc0::/29", "44050"}, - {"2001:559:8203::/48", "33652"}, - {"2001:559:8678::/47", "7922"}, - {"2403:1ec0:1200::/48", "4808"}, - {"2804:4bd8:86::/47", "270891"}, - {"2804:8434::/48", "272246"}, - {"2a00:5020::/48", "60781"}, - {"2a04:e00:200::/46", "39855"}, - {"2001:559:8324::/48", "7922"}, - {"2400:1b20::/32", "141518"}, - {"240e:471::/32", "140486"}, - {"2602:fef2::/36", "396313"}, - {"2803:5100::/32", "263761"}, - {"2804:80c8::/32", "262626"}, - {"2a02:d40::/46", "44592"}, - {"2a02:e980:110::/46", "19551"}, - {"2405:7e00:4000::/36", "17408"}, - {"2600:1408:c::/43", "20940"}, - {"2800:160:18a4::/41", "14259"}, - {"2a02:26f7:e1c5::/46", "20940"}, - {"2a0a:3b80::/29", "205645"}, - {"2a0e:c180::/29", "25726"}, - {"240e:981:1000::/40", "137698"}, - {"2604:fb80:6000::/36", "15128"}, - {"2804:2c5c::/33", "265214"}, - {"2001:559:87e7::/48", "7015"}, - {"2001:559:c309::/48", "33651"}, - {"2409:8c85:5430::/36", "9808"}, - {"2a02:26f7:d644::/48", "36183"}, - {"2a02:2e02:89c0::/43", "12479"}, - {"2001:67c:2bf4::/48", "39036"}, - {"240a:a4e1::/32", "143899"}, - {"240a:a542::/32", "143996"}, - {"2605:b3c0::/32", "16576"}, - {"2800:160:1307::/44", "14259"}, - {"2804:70ac::/32", "270741"}, - {"2a01:6380::/32", "25540"}, - {"2a02:ee80:420f::/43", "3573"}, - {"2a10:c704::/32", "211858"}, - {"2606:4700:3108::/48", "13335"}, - {"2804:2778:8000::/35", "263903"}, - {"2a02:26f7:e001::/46", "20940"}, - {"2001:df7:f580::/48", "136496"}, - {"2001:f18::/32", "9916"}, - {"240a:a8a9::/32", "144867"}, - {"2a02:26f7:c48d::/46", "20940"}, - {"2001:579:4154::/42", "22773"}, - {"2804:492c::/32", "267168"}, - {"2806:2f0:3363::/40", "17072"}, - {"2a02:26f0:e1::/44", "20940"}, - {"2001:1af8:4410::/48", "38930"}, - {"2001:4cf8:6001::/32", "13167"}, - {"240e:964:9400::/39", "133776"}, - {"2001:559:70d::/48", "33657"}, - {"2408:8456:c200::/42", "17622"}, - {"240a:ae04::/32", "146238"}, - {"240e:a50:6400::/31", "4134"}, - {"2804:3bf8::/32", "266183"}, - {"2a0d:4707::/35", "207044"}, - {"240a:ac94::/32", "145870"}, - {"2804:13e4::/32", "61902"}, - {"2a09:5240::/48", "34775"}, - {"2400:c300::/47", "23881"}, - {"2409:8914:6c00::/39", "56044"}, - {"2600:100f:b140::/40", "22394"}, - {"2804:10c::/32", "28144"}, - {"2a07:3500:1c30::/48", "207894"}, - {"240a:af95::/32", "146639"}, - {"2600:6c38:9c::/47", "20115"}, - {"2804:5078::/32", "268391"}, - {"2a02:214e::/31", "1241"}, - {"2001:678:f68::/48", "211169"}, - {"2001:67c:18e8::/48", "49855"}, - {"2a02:920::/32", "12597"}, - {"2a0b:3880::/32", "62217"}, - {"2604:fb80:f00a::/47", "15128"}, - {"2a00:1c70::/32", "28890"}, - {"2407:5140::/32", "138235"}, - {"240a:a612::/32", "144204"}, - {"240a:aaff::/32", "145465"}, - {"2804:6150::/32", "269227"}, - {"2a02:26f0:cb00::/48", "9121"}, - {"2001:4490::/43", "9829"}, - {"2401:d800:5f20::/41", "7552"}, - {"2409:8c29::/29", "9808"}, - {"240e:62:a000::/35", "140310"}, - {"2604:d600:c3b::/45", "32098"}, - {"2804:7710:8000::/33", "271152"}, - {"2a02:e980:16b::/45", "19551"}, - {"2a03:7c60::/32", "201038"}, - {"2a10:4740:40::/42", "212806"}, - {"2001:1248:5500::/44", "11172"}, - {"2400:8b00:b80::/42", "45727"}, - {"2607:f110:11::/46", "21889"}, - {"2804:52f4:a30::/41", "268552"}, - {"2a09:4c0:306::/40", "58057"}, - {"2a0e:aa00:126::/41", "41378"}, - {"2402:800:7b50::/42", "7552"}, - {"240a:a238::/32", "143218"}, - {"2804:1c8:8200::/33", "53184"}, - {"2804:59fc:c000::/34", "268738"}, - {"240e:108:11e3::/48", "134763"}, - {"2a01:758:fff7::/44", "3326"}, - {"2a02:8383:8000::/29", "8412"}, - {"2402:800:7550::/42", "7552"}, - {"2405:9800:8::/48", "45430"}, - {"2409:8958:cf44::/43", "9808"}, - {"2402:800:3aee::/43", "7552"}, - {"240e:438:a620::/43", "140647"}, - {"2607:f380:864::/48", "23483"}, - {"2804:5f48::/32", "269089"}, - {"2a0c:e8c0::/29", "208861"}, - {"2001:559:87d4::/48", "33661"}, - {"2001:fd8:3300::/42", "132199"}, - {"2600:1415:b801::/33", "20940"}, - {"2620:3a:2000::/48", "396418"}, - {"2001:df5:e000::/48", "132885"}, - {"2402:800:3263::/43", "7552"}, - {"2402:800:3a01::/44", "7552"}, - {"2405:3740::/32", "38526"}, - {"240e:44d:7080::/41", "4134"}, - {"240e:91e::/32", "134761"}, - {"2804:ec4::/32", "262973"}, - {"2804:1614::/32", "263266"}, - {"2a0d:700::/29", "39104"}, - {"2409:8a52:b00::/37", "56047"}, - {"240e:5a:4540::/40", "140297"}, - {"2806:230:3026::/48", "265594"}, - {"2a04:9a00:104e::/47", "212157"}, - {"2001:3e0:3001::/32", "10013"}, - {"2404:b780::/32", "63967"}, - {"2409:8959:c844::/43", "9808"}, - {"2600:6000:faad::/39", "12271"}, - {"2600:6c38:f65::/31", "20115"}, - {"2605:380:38::/48", "42473"}, - {"2620:1ec:8f1::/45", "8075"}, - {"2a0b:b600:3000::/48", "15703"}, - {"2001:4d80:7358::/32", "5606"}, - {"2407:c840::/48", "140823"}, - {"240e:7b3::/36", "140315"}, - {"2a03:c980:b239::/48", "210079"}, - {"2001:559:8226::/48", "33657"}, - {"2001:67c:296c::/48", "211723"}, - {"2620:0:10::/48", "18694"}, - {"2806:20d:1614::/44", "32098"}, - {"2a02:26f7:d551::/42", "20940"}, - {"2a11:9ac0::/31", "210652"}, - {"2001:df0:2140::/48", "149048"}, - {"240e:929::/32", "17638"}, - {"2606:1b40:800::/40", "19740"}, - {"2a05:d580::/32", "199753"}, - {"2c0f:f6d0:14::/42", "327687"}, - {"2001:559:c3e9::/48", "21508"}, - {"2001:ee0:c240::/39", "45899"}, - {"2804:84a0::/32", "272272"}, - {"2001:df1:b80::/48", "139466"}, - {"240a:17:fcc::/48", "9605"}, - {"2620:0:dd0::/48", "46357"}, - {"2001:1328::/32", "1797"}, - {"2001:44b8:405c::/48", "7545"}, - {"2400:a980:60fa::/45", "133512"}, - {"2602:fbaf:ab::/48", "400519"}, - {"2804:e80::/32", "262676"}, - {"2804:3df8:6001::/46", "266566"}, - {"2a0b:af00::/29", "56708"}, - {"2001:df0:b5::/48", "46049"}, - {"2406:c140:65::/48", "132337"}, - {"240a:aeb0::/32", "146410"}, - {"2800:bf0:3500::/48", "52257"}, - {"2804:2674:b000::/39", "264344"}, - {"2a05:50a7::/32", "62445"}, - {"2400:8800:302::/37", "3491"}, - {"2401:e380:10::/48", "131091"}, - {"2409:8002:2100::/37", "9808"}, - {"2409:804f:1900::/34", "9808"}, - {"240a:a786::/32", "144576"}, - {"240e:96b:6018::/46", "140372"}, - {"2607:4e80::/32", "15165"}, - {"2620:121:5000::/46", "36351"}, - {"2800:160:3::/45", "14259"}, - {"2a02:61e0::/32", "31543"}, - {"2620:bb:c000::/48", "33151"}, - {"2620:10d:6004::/48", "26722"}, - {"2803:dfa0::/32", "267797"}, - {"2804:c6c:8103::/45", "52704"}, - {"2001:559:51a::/48", "33650"}, - {"2402:8100:2560::/43", "45271"}, - {"240a:a618::/32", "144210"}, - {"2600:1417:2d::/46", "20940"}, - {"2600:141b:2801::/37", "20940"}, - {"2600:1480:c100::/36", "20940"}, - {"2607:cd80:2000::/33", "6528"}, - {"2a00:6920::/48", "42020"}, - {"2001:1248:983d::/46", "11172"}, - {"2409:8b35::/28", "9808"}, - {"240a:a021::/32", "142683"}, - {"240e:924:5000::/32", "4134"}, - {"2607:f740:e00a::/48", "36217"}, - {"2620:132:e000::/48", "41690"}, - {"2a02:f38:2::/48", "15499"}, - {"2001:559:599::/48", "7922"}, - {"2400:5120::/32", "131642"}, - {"240e:37f:ac00::/24", "4134"}, - {"2804:4ddc::/32", "268224"}, - {"2a01:ce8d:9000::/30", "51964"}, - {"2a0a:4ec0::/29", "559"}, - {"2a0f:5707:aa80::/44", "56382"}, - {"2620:100:9000::/47", "26211"}, - {"2804:22a0::/44", "264112"}, - {"2a02:26f7:cb::/48", "20940"}, - {"2a05:b6c1::/32", "12637"}, - {"2001:250:6815::/46", "24368"}, - {"2001:468:500::/48", "14041"}, - {"2607:f7c0:4000::/40", "40819"}, - {"2806:2f0:8143::/42", "17072"}, - {"2a00:14c0::/32", "35382"}, - {"2001:559:87df::/48", "7725"}, - {"2001:799::/32", "21320"}, - {"2001:4ce0::/32", "25058"}, - {"240e:379::/35", "140329"}, - {"2605:4a00:211::/44", "14361"}, - {"2a00:18a8::/32", "29246"}, - {"2a02:20c8:2570::/32", "50304"}, - {"2401:d800:f860::/40", "7552"}, - {"2409:8054:3035::/44", "56040"}, - {"2607:b300:fd06::/48", "54994"}, - {"2804:5bd4::/32", "268871"}, - {"2a04:4e42:2e::/43", "54113"}, - {"2801:80:16f0::/48", "264895"}, - {"2a0d:2784::/30", "62068"}, - {"2001:428:6402:5::/64", "2639"}, - {"2001:559:c464::/48", "33651"}, - {"2401:d800:7420::/41", "7552"}, - {"2a03:a900:ffff::/48", "57707"}, - {"2a05:4800::/29", "12722"}, - {"2a07:3c0::/29", "34049"}, - {"2a0d:5440::/29", "48927"}, - {"2001:253:118::/48", "142084"}, - {"2001:df6:b981::/48", "136969"}, - {"2406:800::/32", "23661"}, - {"2409:8002:2000::/40", "38019"}, - {"240a:a36a::/32", "143524"}, - {"240a:aaca::/32", "145412"}, - {"2606:3240::/33", "399252"}, - {"2620:160:e300::/44", "4196"}, - {"2804:4c4::/32", "28271"}, - {"2804:ef0::/39", "263558"}, - {"2804:1e90::/35", "264436"}, - {"2a00:114f:4::/46", "199295"}, - {"2001:559:c218::/47", "33667"}, - {"2001:fd8:3370::/44", "4775"}, - {"2a00:4800::/40", "8717"}, - {"2a02:d58::/29", "44919"}, - {"2001:520:1001::/48", "8103"}, - {"2803:5c80:5054::/44", "64114"}, - {"2401:4900:3380::/44", "45609"}, - {"2404:9ec0:500::/48", "38136"}, - {"2408:8346:1200::/32", "4837"}, - {"2600:380:e010::/38", "7018"}, - {"2a00:7580:16::/48", "3257"}, - {"2a00:b900:3::/32", "51561"}, - {"2001:559:2f7::/48", "22258"}, - {"2001:dc7:5e00::/32", "24151"}, - {"2403:300:a08::/48", "6185"}, - {"2800:a30::/37", "262187"}, - {"2401:4900:4538::/45", "45609"}, - {"2402:e880::/32", "9808"}, - {"2404:bf40:8600::/47", "7545"}, - {"2606:4740::/32", "399116"}, - {"2606:7d00:d001::/34", "23248"}, - {"2803:8060::/32", "267803"}, - {"2803:d040::/32", "61497"}, - {"2804:2488::/43", "264228"}, - {"2804:7a84::/32", "271376"}, - {"2400:7400:e02c::/48", "38044"}, - {"2401:d800:50c0::/42", "7552"}, - {"2a03:8d60::/48", "203618"}, - {"2001:12b4::/32", "262983"}, - {"2401:1d40:3f02::/48", "58466"}, - {"2408:8409:6000::/40", "4808"}, - {"240a:af83::/32", "146621"}, - {"2600:140f:e01::/35", "20940"}, - {"2605:5c0:c085::/44", "28885"}, - {"2607:fdb0::/32", "3361"}, - {"2a06:fb80::/29", "21013"}, - {"2a0b:c340::/29", "205477"}, - {"2a0f:c480::/29", "56655"}, - {"2001:470:96::/48", "55243"}, - {"2001:559:119::/48", "33657"}, - {"2001:67c:8::/48", "196621"}, - {"2401:d800:7b10::/42", "7552"}, - {"2406:bfc0::/32", "131668"}, - {"240e:97e::/33", "58543"}, - {"2804:213c:4::/42", "264544"}, - {"2a01:8840:2a::/45", "12041"}, - {"2a0c:b641:456::/48", "208421"}, - {"2001:fb0:109f:12::/64", "36040"}, - {"240a:a0bc::/32", "142838"}, - {"240a:a9da::/32", "145172"}, - {"2a02:26f7:f60d::/42", "20940"}, - {"2a02:2da0::/32", "47447"}, - {"2a02:2e02:1af0::/39", "12479"}, - {"2a07:4300:31::/48", "209622"}, - {"2407:c280:30ff::/48", "24322"}, - {"2a00:fa60:1260::/37", "53550"}, - {"2a12:a2c0::/29", "400522"}, - {"2001:1398:1::/45", "27678"}, - {"2408:8957:5000::/40", "17622"}, - {"2409:8054:35::/46", "56040"}, - {"240a:ab2d::/32", "145511"}, - {"2620:107:9050::/48", "22787"}, - {"2620:149::/47", "714"}, - {"2a00:bdc0:e002::/45", "28709"}, - {"2a01:4020:17::/42", "25369"}, - {"2a04:8e80::/48", "199937"}, - {"2a04:8f40:ffff::/48", "205505"}, - {"2a02:26f7:ef41::/46", "20940"}, - {"2620:135:6000::/44", "22697"}, - {"2a0d:1fc0::/29", "8888"}, - {"2a0e:b107:220::/44", "208717"}, - {"2604:3b80::/34", "31857"}, - {"2803:d100:a000::/33", "52362"}, - {"2804:655c::/32", "269485"}, - {"2a04:4280:200::/48", "43260"}, - {"2a04:92c7:f::/42", "62240"}, - {"240a:a299::/32", "143315"}, - {"240e:965:ac00::/33", "4134"}, - {"2001:559:43b::/48", "21508"}, - {"2600:1404:bc01::/38", "20940"}, - {"2804:2b6c::/32", "262794"}, - {"2806:2f0:7321::/46", "17072"}, - {"2600:6c38:16e::/43", "20115"}, - {"2620:129:9001:2::/57", "13767"}, - {"2800:bf0:b422::/48", "27947"}, - {"2001:da8:21c::/48", "24349"}, - {"2001:df3:2580::/48", "140110"}, - {"2404:4a00:6500:1::/48", "45629"}, - {"2406:69c0:1000::/36", "17439"}, - {"2806:230:3022::/48", "265594"}, - {"2a02:26f7:e90c::/48", "36183"}, - {"2001:fd8:3022::/44", "132199"}, - {"2400:54a0:1030::/48", "149476"}, - {"2620:0:50c0::/48", "6939"}, - {"2a03:44a0:100::/48", "200521"}, - {"2001:250:681b::/48", "24368"}, - {"2604:f040::/32", "395927"}, - {"2605:72c0:3::/48", "32354"}, - {"2804:18:6060::/45", "26599"}, - {"2a01:be80::/32", "51401"}, - {"2001:579:10ac::/41", "22773"}, - {"2804:4f80:9200::/48", "268330"}, - {"2a04:4e40:2210::/44", "54113"}, - {"2a04:dbe0::/30", "201894"}, - {"2a0e:e704:46::/48", "210851"}, - {"2600:9000:21ca::/48", "16509"}, - {"2804:2bc8::/32", "265175"}, - {"2a02:26f7:cf88::/48", "36183"}, - {"2a02:26f7:f2c0::/48", "36183"}, - {"2a03:4300::/29", "51048"}, - {"2001:1900:22a3::/39", "3356"}, - {"2400:1c00:1a0::/43", "45143"}, - {"2408:8459:9210::/42", "17623"}, - {"2409:8e15:8000::/35", "56044"}, - {"2801:134::/43", "3549"}, - {"2a02:26f7:cec0::/48", "36183"}, - {"2407:e400::/32", "18390"}, - {"2804:2dd4::/32", "265306"}, - {"2806:2f0:2123::/43", "22884"}, - {"2409:8924:9b00::/37", "56046"}, - {"240a:a377::/32", "143537"}, - {"240e:95d:3000::/26", "4134"}, - {"2606:f900:a602::/36", "812"}, - {"2607:500::/32", "17049"}, - {"2803:2a80:8f0::/47", "262928"}, - {"2a0a:2c0:2::/48", "48648"}, - {"2001:6b0:5::/32", "1653"}, - {"240a:a720::/32", "144474"}, - {"240e:353:5c00::/34", "134419"}, - {"2a02:26f7:bed1::/42", "20940"}, - {"2a0a:b500::/29", "57878"}, - {"2401:7ec0::/32", "59127"}, - {"240e:438:3c20::/43", "140647"}, - {"2600:9000:10e8::/43", "16509"}, - {"2602:feda:d60::/47", "212034"}, - {"2604:5500:1000::/42", "19165"}, - {"2a00:a0c0::/32", "34233"}, - {"2a0e:b107:1130::/46", "212121"}, - {"2001:678:f30::/48", "211398"}, - {"2001:67c:6c4::/48", "38914"}, - {"2610:b0:4038::/47", "21433"}, - {"2a09:afc0::/48", "207597"}, - {"2a10:6740::/32", "60672"}, - {"2403:2c40::/32", "58668"}, - {"2600:6c38:604::/44", "20115"}, - {"2a02:26f7:c101::/46", "20940"}, - {"2a03:4800::/39", "21286"}, - {"2001:df0:2cc::/48", "55909"}, - {"2001:12f8:8::/47", "10906"}, - {"2409:896a:5600::/39", "9808"}, - {"2804:710c::/32", "270763"}, - {"240a:add3::/32", "146189"}, - {"2605:e000:c0b::/48", "10838"}, - {"2a01:821::/29", "3209"}, - {"2a0c:9a40:1::/48", "34927"}, - {"2001:559:c095::/48", "7015"}, - {"2001:1388:8a0b::/48", "6147"}, - {"240a:a9dd::/32", "145175"}, - {"2804:6d6c::/33", "270532"}, - {"2a01:5ec0::/34", "44244"}, - {"2001:67c:213c::/48", "43681"}, - {"2408:8957:6000::/40", "17622"}, - {"2606:2800:4a9c::/46", "15133"}, - {"2620:e8:c000::/48", "394545"}, - {"2804:a24::/32", "263025"}, - {"2804:1bd8:9000::/33", "28224"}, - {"2a0d:2902:caf7::/44", "204185"}, - {"240e:960:c00::/40", "148969"}, - {"2a02:ce0:1809::/32", "35819"}, - {"2a02:26f7:cccd::/42", "20940"}, - {"2001:250:3814::/38", "23910"}, - {"2001:1bf8::/29", "47814"}, - {"2401:d800:9a40::/40", "7552"}, - {"240a:a3be::/32", "143608"}, - {"240a:ab75::/32", "145583"}, - {"2600:140f:5401::/38", "20940"}, - {"2409:8f04:c300::/35", "24547"}, - {"240a:a212::/32", "143180"}, - {"2600:6c10:f84c::/37", "20115"}, - {"2606:82c0:31::/46", "32167"}, - {"2a00:6060:8000::/48", "199881"}, - {"2a02:ac80:7371::/32", "25145"}, - {"2a05:cfc0::/29", "48635"}, - {"2402:800:9571::/40", "7552"}, - {"2409:8904:5740::/42", "24547"}, - {"2605:dd40::/44", "398549"}, - {"2606:2800:5091::/48", "15133"}, - {"240a:a0e6::/32", "142880"}, - {"2804:56cc::/32", "268024"}, - {"2a00:1718::/32", "25176"}, - {"2a02:26f7:f6d8::/46", "36183"}, - {"2a11:2180::/29", "56897"}, - {"2800:484:9300::/36", "14080"}, - {"2001:da8:233::/45", "24349"}, - {"2401:c300::/32", "55353"}, - {"240a:acb8::/32", "145906"}, - {"2605:a401:8960::/40", "33363"}, - {"2801:1b:f000::/48", "267703"}, - {"2804:664::/32", "262582"}, - {"2804:59b0::/32", "268719"}, - {"2001:678:90::/48", "57801"}, - {"2401:d800:d680::/42", "7552"}, - {"2405:c0:10::/48", "138881"}, - {"240a:a5b9::/32", "144115"}, - {"2600:140b:7c00::/48", "31109"}, - {"2607:f0a0::/32", "32335"}, - {"2a02:26f0:7c01::/39", "20940"}, - {"2001:df2:9280::/48", "136375"}, - {"240a:a5ab::/32", "144101"}, - {"2804:1a70::/32", "61859"}, - {"2804:7fd0::/32", "271711"}, - {"2a05:3f40::/29", "60781"}, - {"2a08:600::/45", "206747"}, - {"2a0b:6800:3::/29", "16150"}, - {"240e:10:800::/37", "63835"}, - {"2600:6c38:108::/47", "20115"}, - {"2800:68:dc42::/34", "61468"}, - {"2806:370:4310::/40", "28403"}, - {"2a00:1930::/32", "34624"}, - {"2001:559:525::/48", "7922"}, - {"2001:67c:2a4c::/48", "20712"}, - {"2408:8347::/35", "140726"}, - {"2804:124c:800::/32", "263468"}, - {"2001:a98:100::/48", "5474"}, - {"2402:f080::/46", "38150"}, - {"240e:45c:8500::/40", "140533"}, - {"240e:45c:9100::/40", "140534"}, - {"240e:879:80c0::/30", "4134"}, - {"240e:982:8500::/36", "4134"}, - {"2600:1403:5c00::/48", "35994"}, - {"2001:550:6603::/40", "174"}, - {"2001:559:39a::/48", "7015"}, - {"2001:559:801d::/48", "7015"}, - {"2001:6d0:6d0b::/48", "45029"}, - {"2407:1e40:301::/37", "141732"}, - {"2607:fb10:5039::/48", "55095"}, - {"2804:8350::/32", "272190"}, - {"2a01:828::/29", "3209"}, - {"2a0e:9dc0::/29", "34919"}, - {"2401:4900:5ee0::/43", "45609"}, - {"2409:8e14:7000::/32", "56044"}, - {"240a:a6f9::/32", "144435"}, - {"2801:18:9001::/48", "14080"}, - {"2a02:26f7:bf85::/46", "20940"}, - {"2001:56a:4::/44", "852"}, - {"2001:1a68:ec00::/40", "57367"}, - {"2600:370f:20c1::/46", "32261"}, - {"2a05:e740:145::/48", "29108"}, - {"2001:559:8523::/48", "7725"}, - {"2607:b400::/40", "1312"}, - {"2607:f9a0::/32", "36149"}, - {"2a04:ec10::/47", "32066"}, - {"2001:678:2e4::/48", "31079"}, - {"2001:930::/39", "15924"}, - {"2408:840c:d400::/40", "17621"}, - {"2803:5e40::/32", "52510"}, - {"2804:20c::/32", "28172"}, - {"2804:6750::/32", "52648"}, - {"2806:1030:cefe::/48", "20940"}, - {"2a00:1d24::/30", "49544"}, - {"2a01:7860::/32", "12859"}, - {"2a07:e400::/29", "202282"}, - {"2001:44b8:205d::/48", "4739"}, - {"240e:44d:3840::/42", "140353"}, - {"2a04:2640::/29", "60460"}, - {"2001:559:843c::/48", "7725"}, - {"2001:1a11:f8::/39", "42298"}, - {"2804:3670::/32", "266348"}, - {"2a06:7a00::/48", "49544"}, - {"2403:5000:189::/38", "9304"}, - {"2405:7f00:9620::/36", "133414"}, - {"2804:9c4:30::/32", "53055"}, - {"2804:1bb8::/32", "61745"}, - {"2a0c:c7c0::/29", "202424"}, - {"2001:559:84ad::/48", "33287"}, - {"2408:8256:596::/38", "17622"}, - {"2803:d80::/29", "13489"}, - {"2804:156c::/32", "61905"}, - {"2001:559:744::/48", "33650"}, - {"240e:44d:6480::/41", "4134"}, - {"2804:73f8::/32", "270949"}, - {"2a0d:bc2::/29", "29384"}, - {"2a0f:2940::/29", "399975"}, - {"2001:c10:ff02::/48", "397942"}, - {"2400:32::/48", "4766"}, - {"2603:f0c8::/29", "63023"}, - {"2604:4bc0::/36", "11509"}, - {"2803:9800:b8cb::/45", "11664"}, - {"2001:ee0:f140::/36", "45899"}, - {"240a:a678::/32", "144306"}, - {"240a:ac25::/32", "145759"}, - {"2605:5240::/34", "397494"}, - {"2a00:1750::/32", "3257"}, - {"2a0a:3b40::/34", "207974"}, - {"2a0c:7e47:c909::/48", "20473"}, - {"2001:559:80ce::/48", "7922"}, - {"2001:44b8:2046::/48", "7545"}, - {"2409:8904:6040::/42", "24547"}, - {"2001:13c7:7000::/48", "28498"}, - {"2400:7400:42::/48", "38044"}, - {"2605:7b00::/32", "22110"}, - {"2607:f3a0:1014::/36", "23342"}, - {"240e:26c::/30", "4812"}, - {"2607:f368:2d00::/35", "32982"}, - {"2804:44e8:201::/39", "267660"}, - {"2803:3280::/32", "263218"}, - {"2a02:26f7:e484::/48", "36183"}, - {"2001:67c:24fc::/48", "57423"}, - {"2001:df3:5d00::/48", "137204"}, - {"2001:18b8::/45", "29789"}, - {"2603:fe10::/26", "397165"}, - {"2803:e600:aaab::/35", "18809"}, - {"2a00:c584::/32", "198813"}, - {"2a02:26f7:b749::/46", "20940"}, - {"2001:559:8181::/46", "33287"}, - {"2001:67c:2560::/48", "57763"}, - {"2404:bf40:a002::/42", "139084"}, - {"2801:80:1c30::/48", "266077"}, - {"2804:18:10f8::/36", "26599"}, - {"2a02:26f7:b609::/46", "20940"}, - {"2a09:7f40::/29", "209378"}, - {"2001:250:3c22::/38", "23910"}, - {"2404:e5:130::/38", "703"}, - {"2409:8055:10::/48", "9808"}, - {"2600:1012:b080::/44", "6167"}, - {"2804:1798::/32", "263156"}, - {"2806:102e:1b::/48", "8151"}, - {"2409:8a04:3100::/33", "24547"}, - {"240a:a316::/32", "143440"}, - {"240a:aaba::/32", "145396"}, - {"240a:ac14::/32", "145742"}, - {"2804:1bfc::/32", "61632"}, - {"2a0a:7840::/29", "25433"}, - {"2a0e:b107:14d3::/48", "50058"}, - {"2001:f80::/32", "23775"}, - {"2408:8256:3174::/48", "17816"}, - {"2803:e880:8108::/45", "52468"}, - {"2a0d:e7c7:ffff::/48", "210015"}, - {"2001:559:8477::/48", "33659"}, - {"2804:171c::/32", "263124"}, - {"2a03:8580::/32", "8464"}, - {"2620:74:2d::/48", "26415"}, - {"2801:80:3890::/48", "270327"}, - {"2804:78f0::/32", "271275"}, - {"2a0c:fc00::/31", "205250"}, - {"2001:44b8:2035::/44", "7545"}, - {"2408:8459:3050::/38", "17816"}, - {"2620:171:36::/48", "715"}, - {"2a02:dc8::/30", "42656"}, - {"2a02:26f7:eb09::/42", "20940"}, - {"2a03:700::/32", "35271"}, - {"2001:559:8454::/48", "33651"}, - {"2001:df2:fc00::/48", "59111"}, - {"2403:6200:7603::/36", "45629"}, - {"2a00:fd40:1::/48", "58272"}, - {"2a0e:f340::/29", "44205"}, - {"2001:1900:5:2:2::5a20/108", "3356"}, - {"2409:804d:1100::/36", "9808"}, - {"240a:af02::/32", "146492"}, - {"240e:45c:6e00::/35", "131285"}, - {"2408:8459:f300::/37", "17622"}, - {"2409:8d75::/28", "9808"}, - {"240e:44d:6b80::/41", "4134"}, - {"2600:140b:ac01::/35", "20940"}, - {"2606:200::/32", "11942"}, - {"2a02:26f7:c0::/48", "36183"}, - {"2a02:26f7:d9c0::/48", "36183"}, - {"2a06:e881:6600::/48", "208872"}, - {"2001:559:3af::/48", "33491"}, - {"2001:4b20:100:599::/54", "34288"}, - {"240e:438:1e20::/43", "140647"}, - {"2620:10a:80f4::/48", "27299"}, - {"2803:3140::/32", "27843"}, - {"2804:7f7c::/32", "271691"}, - {"2a02:26f0:7001::/39", "20940"}, - {"2001:43f8:240::/47", "37304"}, - {"2600:6c38:b05::/44", "20115"}, - {"2803:1920::/32", "266671"}, - {"2804:4300::/32", "267542"}, - {"2a02:d00::/32", "49101"}, - {"2409:8054:3040::/45", "56040"}, - {"2409:8907:7b20::/37", "24547"}, - {"2409:8c85:81::/37", "9808"}, - {"2607:4000:600::/32", "73"}, - {"2800:3a0:194::/32", "23201"}, - {"2804:14c:4e5::/44", "28573"}, - {"2806:105e:c::/48", "8151"}, - {"2a03:2480:6a::/45", "41983"}, - {"2a06:fac0::/29", "13182"}, - {"2001:44b8:404a::/48", "7545"}, - {"2804:14d:4283::/41", "28573"}, - {"2804:5c00::/32", "268882"}, - {"2a02:570::/32", "15935"}, - {"2a04:7340:7341::/29", "62172"}, - {"2a00:f826:9::/48", "34549"}, - {"2a02:2498:3::/48", "36351"}, - {"2a02:26f7:a3::/48", "20940"}, - {"2a02:26f7:bac0::/48", "36183"}, - {"2400:c3c0::/32", "136407"}, - {"2401:d800:2830::/41", "7552"}, - {"2607:4d00:2000::/35", "33398"}, - {"2803:86e0::/32", "269952"}, - {"2804:84:881b::/33", "14282"}, - {"2a09:28c0::/48", "25540"}, - {"240a:a5e0::/32", "144154"}, - {"240e:966:800::/37", "133774"}, - {"2605:2080:8000::/34", "394844"}, - {"2804:5140::/32", "268440"}, - {"2804:7dc8::/32", "271582"}, - {"2a04:5200:5977::/48", "202306"}, - {"2a0d:2581:8::/48", "209261"}, - {"2402:6800:6::/48", "26506"}, - {"2404:c800:8204::/29", "4760"}, - {"2408:840c:9300::/40", "17621"}, - {"2408:84f3:3410::/44", "17623"}, - {"2620:149:224::/44", "714"}, - {"2a09:4f40::/48", "209562"}, - {"2a0b:a200::/29", "208681"}, - {"2a00:5881:1000::/40", "203432"}, - {"2a01:248::/32", "28792"}, - {"2001:480:60::/48", "5957"}, - {"2001:df0:480::/48", "38532"}, - {"2401:14c0:31::/32", "136531"}, - {"2600:1408:3400::/48", "35994"}, - {"2401:4900:1b60::/44", "45609"}, - {"2a02:26f0:da01::/39", "20940"}, - {"2a02:ed02::/32", "50304"}, - {"2a03:2100:31::/48", "209127"}, - {"2001:550:105::/44", "174"}, - {"2001:559:c110::/48", "7016"}, - {"2001:67c:438::/48", "198337"}, - {"2402:800:3b9b::/41", "7552"}, - {"2408:8456:b240::/37", "17816"}, - {"2409:8904:9190::/38", "24547"}, - {"240e:964:ac00::/33", "4134"}, - {"240e:978:7000::/40", "137702"}, - {"2804:1b74::/32", "61729"}, - {"2804:44b0::/32", "267647"}, - {"2a09:2ac0::/29", "41563"}, - {"2001:1248:55a8::/47", "11172"}, - {"240a:a28a::/32", "143300"}, - {"2605:4a80:ef00::/40", "11055"}, - {"2a0b:7f80::/29", "13126"}, - {"2406:3000:f::/43", "4657"}, - {"240e:5a:4a80::/34", "4134"}, - {"2605:700::/32", "13750"}, - {"2a00:12c0::/29", "47215"}, - {"2a03:62c0::/32", "43402"}, - {"2a03:85c0:141::/31", "20561"}, - {"2a0b:a280::/48", "203377"}, - {"2001:1a11:12f::/48", "42298"}, - {"2404:a800:7::/35", "9498"}, - {"2408:840d:2b00::/42", "17621"}, - {"240a:a4d5::/32", "143887"}, - {"2a02:26f7:e94c::/48", "36183"}, - {"2a02:26f7:f8d8::/48", "36183"}, - {"2a0a:3140:600::/46", "15532"}, - {"2001:df4:4b00::/48", "137315"}, - {"2400:a980:30f2::/48", "38587"}, - {"2402:47c0:200::/32", "137280"}, - {"2407:e80::/47", "58689"}, - {"240a:a1b8::/32", "143090"}, - {"2600:9000:2452::/48", "16509"}, - {"2a00:5dc0::/29", "31313"}, - {"2a0e:fd45:2::/45", "44103"}, - {"2400:d400:5648::/48", "45671"}, - {"2001:ee0:305::/48", "45899"}, - {"240e:438:5220::/43", "140647"}, - {"240e:6b6::/36", "136199"}, - {"2600:370f:372a::/41", "32261"}, - {"2602:ff18:241::/46", "21973"}, - {"2804:693c::/33", "270257"}, - {"2804:7890::/32", "271251"}, - {"2001:418:8004::/47", "7019"}, - {"240a:aab0::/32", "145386"}, - {"2806:2f0:6181::/46", "17072"}, - {"2a06:3880::/29", "49981"}, - {"2001:678:adc::/48", "3320"}, - {"2605:2600::/32", "19842"}, - {"2800:430:2100::/33", "23487"}, - {"2a10:88c0::/29", "49808"}, - {"2001:559:8002::/47", "7922"}, - {"2001:559:c118::/48", "33657"}, - {"2001:41a0::/32", "6882"}, - {"2403:300:a0e::/48", "6185"}, - {"240a:a953::/32", "145037"}, - {"2804:431:c000::/35", "27699"}, - {"2a01:358:4014::/47", "9121"}, - {"2a06:1e00:27::/48", "210075"}, - {"2408:8956:b800::/40", "17622"}, - {"240a:a090::/32", "142794"}, - {"2620:115:c007::/44", "2635"}, - {"2802:0:47::/44", "18747"}, - {"2408:8459:b610::/42", "17623"}, - {"240a:a275::/32", "143279"}, - {"2804:2538:4ee0::/32", "28183"}, - {"2001:388:30c5::/43", "7575"}, - {"2001:67c:2268::/48", "56740"}, - {"2605:6fc0::/32", "19523"}, - {"2803:5440:100::/47", "264738"}, - {"2804:6370::/32", "269361"}, - {"2806:2f0:2182::/48", "17072"}, - {"240a:a9c0::/32", "145146"}, - {"2600:6c3a:44::/46", "20115"}, - {"2607:fba8::/32", "7029"}, - {"2804:2f48::/33", "53052"}, - {"2001:67c:2f80::/48", "42251"}, - {"2402:800:99e0::/44", "7552"}, - {"2a00:f940::/48", "12695"}, - {"2401:d800:692::/39", "7552"}, - {"2804:60d4::/33", "269194"}, - {"2806:2f0:2422::/48", "17072"}, - {"2a00:6dc0::/32", "202237"}, - {"2001:559:8435::/48", "22909"}, - {"2402:800:5ca9::/41", "7552"}, - {"2408:8459:ee50::/39", "17816"}, - {"2408:8912::/29", "4837"}, - {"2600:1409:a801::/37", "20940"}, - {"2602:fcd5:18::/46", "399122"}, - {"2604:d600:1216::/44", "32098"}, - {"2a0e:40c0:4::/48", "50979"}, - {"2c0f:ed00:44::/48", "328442"}, - {"2402:5300:4510::/38", "45903"}, - {"2600:1000:a100::/43", "6167"}, - {"2a11:82c0::/29", "1239"}, - {"2001:df4:2a00::/48", "132401"}, - {"2409:8820::/27", "9808"}, - {"240a:a078::/32", "142770"}, - {"2604:d600:154c::/46", "32098"}, - {"2804:400::/32", "262409"}, - {"2001:559:16b::/48", "7015"}, - {"2800:160:147b::/40", "14259"}, - {"2806:230:402d::/48", "11888"}, - {"2a0b:3f80::/29", "43019"}, - {"2403:a500::/32", "133495"}, - {"2804:48dc::/32", "267149"}, - {"2a02:f000::/32", "199490"}, - {"2001:67c:1094::/48", "210290"}, - {"2620:a2:c000::/48", "46875"}, - {"2a07:23c0:8::/47", "13213"}, - {"2001:1248:57a6::/43", "11172"}, - {"2606:5dc0:8800::/40", "395561"}, - {"2607:f750:2000::/39", "23473"}, - {"2400:6140::/32", "64006"}, - {"2607:f6f0:e000::/40", "398814"}, - {"2804:1040:888b::/34", "263626"}, - {"2804:2ac4::/32", "265117"}, - {"2a07:ae80::/29", "8455"}, - {"2405:c400::/48", "133104"}, - {"2605:6440:6006::/32", "396356"}, - {"2800:160:24ff::/39", "14259"}, - {"2a03:2880:f10b::/43", "32934"}, - {"2001:67c:2c74::/48", "9201"}, - {"240a:a428::/32", "143714"}, - {"240a:abf8::/32", "145714"}, - {"2602:fbdf::/36", "398355"}, - {"2606:f900:4407::/34", "812"}, - {"2a07:4d80::/32", "206332"}, - {"2a0b:b86:fe01::/48", "205749"}, - {"2001:559:8630::/47", "33287"}, - {"2001:16a2:401e::/47", "39386"}, - {"2001:559:c093::/48", "33657"}, - {"240a:a808::/32", "144706"}, - {"240a:adae::/32", "146152"}, - {"2602:fc99::/36", "400142"}, - {"2a01:4a60:ffc0::/42", "6768"}, - {"2a06:a001:a10e::/48", "210384"}, - {"2001:678:a14::/48", "13101"}, - {"240a:ab81::/32", "145595"}, - {"2a01:a480::/32", "15576"}, - {"2a02:6680:2100::/44", "16116"}, - {"2400:6980::/32", "7575"}, - {"2600:370f:34c5::/43", "32261"}, - {"2804:778c::/32", "271185"}, - {"2001:67c:2f18::/48", "56344"}, - {"2001:df7:400::/48", "134753"}, - {"2409:8a55:2800::/38", "56040"}, - {"2a00:1d60:f000::/36", "59990"}, - {"2a0c:b642:900::/47", "204625"}, - {"2001:4830:3101::/40", "22147"}, - {"2607:f148:6000::/47", "11734"}, - {"2001:559:c323::/48", "7016"}, - {"2001:fd8:32f0::/44", "4775"}, - {"2408:8026:40::/40", "17621"}, - {"240e:62:e000::/36", "140310"}, - {"2600:140b:d401::/36", "20940"}, - {"2603:90f5:b00::/40", "20115"}, - {"2804:38d4::/32", "266504"}, - {"2a00:5980::/32", "197869"}, - {"2a01:8840:26::/44", "12041"}, - {"2a0b:2080::/32", "36924"}, - {"2001:da8:25f::/48", "24351"}, - {"2001:df2:e500::/48", "14907"}, - {"2804:2580:4000::/35", "264284"}, - {"2a04:1600::/29", "61967"}, - {"240a:a568::/32", "144034"}, - {"240c:c001::/32", "59201"}, - {"2804:13c8::/32", "263551"}, - {"2804:4be4:9000::/33", "267335"}, - {"2804:7f84::/32", "271693"}, - {"2600:140b:2800::/48", "24319"}, - {"2607:f0d0::/46", "36351"}, - {"2610:b0:40d6::/47", "3573"}, - {"2800:160:1310::/45", "14259"}, - {"2a0d:60c0::/32", "59504"}, - {"2001:4b80::/29", "206557"}, - {"240a:ab5d::/32", "145559"}, - {"2a03:b4c0::/32", "61169"}, - {"2a09:b280:ff81::/48", "133846"}, - {"2a0d:5642:101::/48", "35487"}, - {"2001:559:839d::/42", "33652"}, - {"2001:67c:60c::/48", "201907"}, - {"2001:1248:882b::/43", "11172"}, - {"2402:800:55e0::/44", "7552"}, - {"2606:6c00:6001::/45", "49846"}, - {"2620:125:9014::/48", "397415"}, - {"2a01:4a8::/32", "33873"}, - {"2a02:22f0::/32", "52088"}, - {"2a03:dd41::/32", "39122"}, - {"2402:a700::/32", "7575"}, - {"2620:10f:400e::/48", "30037"}, - {"2001:fd8:f300::/42", "132199"}, - {"2600:1402:7801::/32", "20940"}, - {"2607:4100::/34", "19171"}, - {"2001:250:342e::/48", "138438"}, - {"2001:ee0:8a40::/37", "45899"}, - {"2409:0:100::/32", "142500"}, - {"2602:fc05::/40", "398355"}, - {"2607:fb10:7203::/42", "2906"}, - {"2607:fca8:534::/35", "17139"}, - {"2a06:8280:20::/44", "42978"}, - {"2803:fbe0:100::/46", "270092"}, - {"2a02:26f7:e08d::/42", "20940"}, - {"2a05:1a10:2002::/26", "43754"}, - {"2a0f:9400:7932::/45", "210718"}, - {"240a:afd6::/32", "146704"}, - {"2604:85c0:6::/47", "16524"}, - {"2804:6a64::/32", "270333"}, - {"2a00:8a00:a000::/36", "45769"}, - {"2001:559:477::/48", "33650"}, - {"2001:ee0:9140::/40", "45899"}, - {"2401:8d00:14::/48", "24149"}, - {"2607:fcd0:100:f01::/50", "8100"}, - {"2804:7598:c001::/44", "271057"}, - {"2a02:5f60::/32", "201955"}, - {"240a:ab5a::/32", "145556"}, - {"2600:14a0:1::/40", "20940"}, - {"2606:ae80:1470::/46", "26762"}, - {"2a01:280:1::/48", "12381"}, - {"2402:e380:313::/48", "139677"}, - {"2a02:26f7:dc40::/48", "36183"}, - {"2a04:9301::/29", "1764"}, - {"2001:67c:1544::/48", "3301"}, - {"2001:67c:2738::/48", "12628"}, - {"2001:df0:ac00::/44", "133729"}, - {"2405:17c0:2::/32", "139331"}, - {"2607:fb10:2015::/42", "2906"}, - {"2a0f:ca87:1::/48", "209389"}, - {"2001:67c:2488::/48", "48258"}, - {"2a03:2600::/32", "25353"}, - {"2a0a:5800::/29", "200428"}, - {"2c0f:f560::/32", "36939"}, - {"2402:800:7f80::/42", "7552"}, - {"2406:3000:3:2a::/63", "4657"}, - {"240a:ae11::/32", "146251"}, - {"2a00:1f08::/32", "28676"}, - {"2405:3200:102::/37", "17639"}, - {"240e:3b7:3e00::/33", "140308"}, - {"2a02:26f0:bf00::/48", "34164"}, - {"2408:8957:2ac0::/39", "17816"}, - {"2409:8e5d::/26", "9808"}, - {"2801:1fc:1c::/48", "27951"}, - {"2804:c84:26::/43", "52720"}, - {"2a01:328::/32", "31117"}, - {"2001:c20:48ae::/43", "9255"}, - {"240a:a9dc::/32", "145174"}, - {"2602:fd55:2::/48", "40564"}, - {"2804:e24:fffb::/45", "262417"}, - {"2804:1bac::/32", "61651"}, - {"2804:51b4::/33", "268471"}, - {"2a02:26f7:c8cd::/46", "20940"}, - {"2001:559:c459::/48", "33659"}, - {"2001:ee0:3208::/47", "45899"}, - {"2401:d800:440::/42", "7552"}, - {"2401:d800:a20::/41", "7552"}, - {"2409:8904:8790::/36", "24547"}, - {"240a:a77b::/32", "144565"}, - {"240a:a8f0::/32", "144938"}, - {"2a0c:9a40:2100::/38", "34927"}, - {"2001:67c:2ee0::/48", "51214"}, - {"240e:438:4840::/38", "4134"}, - {"2604:dc00:100a::/33", "19752"}, - {"2001:559:c203::/48", "33667"}, - {"2001:678:301::/48", "29551"}, - {"2001:67c:2e20::/48", "12945"}, - {"2408:8956:9f00::/40", "17816"}, - {"2800:bf0:3429::/43", "27947"}, - {"2001:559:565::/48", "33490"}, - {"2a02:52a0::/32", "202017"}, - {"2001:559:81d7::/44", "21508"}, - {"2605:47c0::/32", "397589"}, - {"2804:6ff0::/32", "270696"}, - {"2a0a:b780::/29", "51815"}, - {"2001:1248:9c9f::/42", "11172"}, - {"2402:28c0::/46", "136620"}, - {"2402:ef3c::/32", "7633"}, - {"2405:7f00:9ec0::/34", "133414"}, - {"2603:1061:7::/30", "8075"}, - {"2806:264:3300::/37", "13999"}, - {"2620:0:22b0::/48", "20144"}, - {"2803:6700:201::/46", "263210"}, - {"2804:14c:a700::/40", "28573"}, - {"2804:8660::/32", "272639"}, - {"2001:67c:158c::/48", "5539"}, - {"2001:df4:1580::/48", "137146"}, - {"2404:f4c0:f700::/47", "138517"}, - {"2804:62e4::/32", "269326"}, - {"2a06:f905::/36", "56630"}, - {"2001:559:86e3::/48", "33652"}, - {"240a:ad87::/32", "146113"}, - {"240a:ade4::/32", "146206"}, - {"2600:1480:b000::/48", "21342"}, - {"2806:2f0:4183::/41", "17072"}, - {"2a02:e50::/32", "49605"}, - {"2403:5000:29a::/32", "9304"}, - {"2408:8456:1b00::/42", "17622"}, - {"240e:108:8b::/48", "137695"}, - {"240e:438:1620::/43", "140647"}, - {"2a06:3e80::/32", "62217"}, - {"2a09:d380::/30", "35709"}, - {"2409:8b3d::/25", "9808"}, - {"2800:430:b600::/33", "23487"}, - {"2a02:26f7:cb81::/46", "20940"}, - {"2a02:26f7:fb81::/46", "20940"}, - {"2001:250:742e::/48", "24371"}, - {"240e:438:5820::/43", "140647"}, - {"2607:f6f0:7002::/40", "27330"}, - {"2a02:26f7:d004::/48", "36183"}, - {"2a0f:9400:7864::/47", "147028"}, - {"2001:4479:a000::/37", "7545"}, - {"2402:53c0:2000::/33", "137144"}, - {"240e:945:1000::/32", "4134"}, - {"2600:6c20:65::/44", "20115"}, - {"2001:559:19e::/48", "33652"}, - {"2001:678:b18::/48", "15507"}, - {"2001:fd8:3004::/47", "4775"}, - {"2a0e:1c80:7::/48", "50304"}, - {"2a0f:14c0::/29", "399975"}, - {"2001:559:5fb::/48", "33287"}, - {"2001:559:c328::/48", "33651"}, - {"2407:a3c0::/32", "136742"}, - {"2604:ca00:1d8::/42", "36492"}, - {"2806:2f0:3301::/46", "17072"}, - {"2a00:ede0::/32", "35804"}, - {"2a0f:2680::/29", "204188"}, - {"240a:a61f::/32", "144217"}, - {"2604:20c0:4000::/36", "40641"}, - {"2801:0:370::/48", "262245"}, - {"2806:230:602f::/48", "11888"}, - {"2a00:1be7::/32", "205005"}, - {"2a02:26f7:dcc4::/48", "36183"}, - {"2a03:d000:301::/48", "31213"}, - {"2001:16a2:c0e0::/44", "39386"}, - {"240a:af68::/32", "146594"}, - {"2604:e580:ffff::/48", "2900"}, - {"2804:4870:1b3::/41", "267121"}, - {"2a00:42a0::/32", "25108"}, - {"2405:9800:110::/32", "45430"}, - {"2408:8456:3000::/41", "17623"}, - {"240a:af88::/32", "146626"}, - {"2001:1248:8200::/39", "11172"}, - {"2001:16a2:200::/36", "25019"}, - {"2001:4878:a062::/48", "12222"}, - {"2607:fe28:2090::/42", "53347"}, - {"2a01:4020:15::/46", "213122"}, - {"2a02:2b60:101::/46", "42947"}, - {"2400:cb00:184::/44", "13335"}, - {"2406:3000:3c::/41", "4657"}, - {"240e:698:4300::/40", "63835"}, - {"2606:9100:2000::/36", "1421"}, - {"2803:34c0::/32", "264806"}, - {"2806:322:500::/36", "28546"}, - {"2a01:110f:5100::/21", "5617"}, - {"240a:ae6f::/32", "146345"}, - {"2804:14c:7d83::/45", "28573"}, - {"2804:2cbc::/35", "265240"}, - {"2a0b:ef00::/29", "205697"}, - {"2001:559:268::/48", "33651"}, - {"2001:4490:4078::/40", "9829"}, - {"2408:8956:bf00::/40", "17816"}, - {"240a:a27c::/32", "143286"}, - {"2606:8840::/32", "3136"}, - {"2804:100c::/32", "263616"}, - {"2804:6030::/32", "269151"}, - {"2a04:9a00:1010::/44", "212157"}, - {"2402:8100:27f8::/47", "45271"}, - {"2606:2800:547::/44", "15133"}, - {"2a01:298:fe::/32", "30880"}, - {"2a03:5a00:e::/48", "51028"}, - {"2a04:88c4::/32", "205544"}, - {"2001:df7:6e00::/48", "17665"}, - {"2402:800:3855::/42", "7552"}, - {"2408:8957:e900::/40", "17816"}, - {"2a02:2318::/32", "15766"}, - {"2409:8c50:a01::/32", "56047"}, - {"2607:cd80:6000::/36", "6528"}, - {"2806:230:601d::/48", "11888"}, - {"2a01:74c0::/43", "15540"}, - {"2a02:26f7:e509::/46", "20940"}, - {"2a04:26c0::/29", "60532"}, - {"2402:800:38ee::/39", "7552"}, - {"2606:ed00::/47", "47869"}, - {"2804:7cc:1000::/48", "28669"}, - {"2001:978:2204::/39", "174"}, - {"2001:13b2::/29", "3356"}, - {"2001:4b22:10::/64", "65505"}, - {"240e:3b4:dc00::/34", "4134"}, - {"2800:860:b0b::/48", "20299"}, - {"2803:1240:3502::/32", "27855"}, - {"2001:1b30::/29", "20783"}, - {"2404:8280::/32", "38719"}, - {"2804:4f28::/32", "268308"}, - {"2a00:8a02:8000::/44", "8983"}, - {"2a03:f80:44::/48", "24851"}, - {"2a04:cec0:1300::/40", "25117"}, - {"2a10:ac80::/31", "29405"}, - {"2401:d800:d900::/42", "7552"}, - {"2402:800:559b::/41", "7552"}, - {"2408:8459:7010::/42", "17623"}, - {"2600:6c10:80::/44", "20115"}, - {"2620:162::/36", "14381"}, - {"2804:1b30::/32", "61714"}, - {"2a02:26f7:dc8c::/48", "36183"}, - {"2a0f:5384:acab::/48", "208135"}, - {"2401:2fc0::/32", "149305"}, - {"2406:dc0:8850::/47", "9221"}, - {"240a:a761::/32", "144539"}, - {"2804:154c:c000::/34", "263382"}, - {"2a0e:b107:13de::/48", "59922"}, - {"2001:1260:113::/44", "13591"}, - {"2404:c2c0:2c0::/44", "135629"}, - {"2a00:1348::/44", "8879"}, - {"2001:1248:56ee::/43", "11172"}, - {"2600:1400:6::/44", "20940"}, - {"2604:1d80::/32", "54876"}, - {"2804:54fc::/32", "268682"}, - {"2a02:2ad0:640::/32", "702"}, - {"2a0a:3540::/29", "208861"}, - {"2001:559:797::/48", "33490"}, - {"2600:1415:f801::/30", "20940"}, - {"2a01:5043:efd::/48", "202196"}, - {"2a0b:4a40::/29", "47926"}, - {"2001:559:8492::/48", "33667"}, - {"2001:1248:9c41::/40", "11172"}, - {"240a:a4a9::/32", "143843"}, - {"240a:ae89::/32", "146371"}, - {"2602:fd92:637::/44", "141011"}, - {"2806:288:2a00::/40", "28469"}, - {"2a02:2339:c000::/34", "204652"}, - {"2402:c500::/32", "56284"}, - {"2a01:c50f:4680::/35", "12479"}, - {"2408:8459:4a10::/42", "17623"}, - {"2620:115:a::/45", "18888"}, - {"2804:3360::/32", "262725"}, - {"2804:5be0::/32", "268874"}, - {"2a00:afe0::/32", "60491"}, - {"2a0d:4c44:4::/30", "61317"}, - {"2001:678:378::/48", "57294"}, - {"2801:80:1610::/48", "2635"}, - {"2a04:55c0::/29", "207630"}, - {"2408:8456:b440::/38", "17816"}, - {"240e:980:8b00::/40", "137695"}, - {"2606:5d80::/32", "32613"}, - {"2a02:26f0:2b01::/35", "20940"}, - {"2a0f:29c0::/30", "208256"}, - {"2001:67c:2b24::/48", "1257"}, - {"2001:12f0:940::/38", "1916"}, - {"2401:5400:5001::/32", "4434"}, - {"2408:8768::/32", "4837"}, - {"2409:8060:900::/35", "9808"}, - {"2600:8807:6d22::/43", "22773"}, - {"2a0c:3140:ffff::/48", "48989"}, - {"2a0f:f4c1:2::/48", "36040"}, - {"2406:daa0:b040::/44", "16509"}, - {"240a:a246::/32", "143232"}, - {"2804:290::/32", "28669"}, - {"2a02:26f7:cec1::/46", "20940"}, - {"2a02:26f7:d14c::/48", "36183"}, - {"2001:550:1205::/46", "174"}, - {"2001:559:c32b::/48", "33650"}, - {"2600:1419:d801::/34", "20940"}, - {"2604:8e80:3400::/32", "32505"}, - {"2620:a7:c000::/47", "40035"}, - {"2804:77c:e100::/35", "53222"}, - {"2a09:0:11::/48", "3214"}, - {"2409:4063:5000::/29", "55836"}, - {"240a:a3b1::/32", "143595"}, - {"2a02:d300::/29", "15595"}, - {"2a00:1288:110::/47", "34010"}, - {"2a02:26f7:f890::/48", "36183"}, - {"2a02:cb80:2720::/48", "43766"}, - {"2a11:ba40::/29", "211199"}, - {"2001:559:8483::/48", "22258"}, - {"240a:af4c::/32", "146566"}, - {"2600:1413:3001::/33", "20940"}, - {"2001:250:2c2c::/48", "23910"}, - {"2001:559:87f2::/48", "7015"}, - {"240a:a522::/32", "143964"}, - {"2600:6:ff89::/42", "1239"}, - {"2600:80c:a00::/37", "11486"}, - {"2602:101:4008::/30", "20115"}, - {"2605:1900:2::/32", "12208"}, - {"2a00:7bc0::/32", "200727"}, - {"2001:df3:b500::/48", "135946"}, - {"2001:43f8:bc0::/48", "37399"}, - {"240e:3b0:c800::/37", "4134"}, - {"2804:2ab4::/32", "53149"}, - {"2a02:26f7:b949::/42", "20940"}, - {"240e:44d:3a80::/41", "4134"}, - {"2604:2e80:1400::/46", "30036"}, - {"2800:110:1025::/34", "4270"}, - {"2a00:1a20::/29", "21283"}, - {"2804:378c::/32", "266420"}, - {"2408:8957:1400::/40", "17622"}, - {"240e:6:d1a0::/44", "149178"}, - {"2620:13a:c000::/46", "53356"}, - {"2804:707c::/32", "270729"}, - {"240a:a582::/32", "144060"}, - {"240a:a952::/32", "145036"}, - {"2607:e880:1000::/48", "12220"}, - {"2a02:5580::/32", "34547"}, - {"240a:a4ad::/32", "143847"}, - {"2806:2f0:2142::/48", "17072"}, - {"2806:10b8::/32", "8151"}, - {"2a02:26f7:ef00::/48", "36183"}, - {"2409:8043:2c04::/48", "24444"}, - {"240e:3b4:7a00::/32", "140313"}, - {"240e:964:eac0::/42", "133775"}, - {"2600:9000:1e3c::/47", "16509"}, - {"2605:6440:4009::/35", "396356"}, - {"2607:3e00::/32", "14928"}, - {"2804:3d8::/32", "262402"}, - {"2804:78e4::/32", "271272"}, - {"2804:37a8:1219::/45", "266428"}, - {"2a02:120:3::/29", "29396"}, - {"2001:559:5cb::/48", "33651"}, - {"2404:aa00::/32", "10031"}, - {"2605:ba00:f000::/36", "14638"}, - {"2a0e:fd45:d35::/44", "207803"}, - {"2001:df0:2740::/48", "149063"}, - {"2a02:e5c::/32", "44530"}, - {"2a02:2270:3000::/32", "43939"}, - {"2001:559:814b::/48", "33651"}, - {"2800:4b0:4510::/32", "12252"}, - {"2a03:db80:3825::/33", "680"}, - {"2600:370f:7160::/47", "32261"}, - {"2606:3800::/32", "3912"}, - {"2606:b100::/32", "32393"}, - {"2a02:26f7:f088::/48", "36183"}, - {"240a:ae72::/32", "146348"}, - {"240e:438:1640::/36", "4134"}, - {"2804:da8:f7b0::/36", "262605"}, - {"2806:2f0:7083::/42", "17072"}, - {"2a01:73c0:690::/41", "21450"}, - {"2a02:888:43::/48", "47794"}, - {"2a04:2200::/31", "60955"}, - {"2001:559:c02e::/48", "7725"}, - {"2404:bf40:ea03::/48", "7545"}, - {"2a0e:97c0:2c0::/44", "211548"}, - {"2a10:e080::/32", "20473"}, - {"2001:c80:84::/32", "4673"}, - {"2409:4012:3000::/29", "55836"}, - {"2607:ffc8:0:3::/61", "17356"}, - {"2804:5cb0::/32", "268924"}, - {"2001:df5:2800::/48", "24558"}, - {"2607:f790::/32", "12129"}, - {"2800:160:2c3b::/41", "14259"}, - {"2801:174:3::/48", "27951"}, - {"240e:67f:8c00::/33", "4134"}, - {"2800:bf0:25e::/42", "27947"}, - {"2806:230:1025::/48", "11888"}, - {"2a0f:3800::/29", "198211"}, - {"2a0f:9c00::/29", "52031"}, - {"240a:ab93::/32", "145613"}, - {"2a02:26f7:bc85::/46", "20940"}, - {"2404:a140:20::/48", "138915"}, - {"2804:673c:c400::/34", "269615"}, - {"2001:579:d224::/41", "22773"}, - {"2607:4100:8000::/33", "19171"}, - {"2803:84a0::/32", "266820"}, - {"2804:2df8::/32", "265315"}, - {"2804:6a38:f0::/44", "270320"}, - {"2a03:2f40::/32", "3330"}, - {"2001:250:5::/38", "23910"}, - {"2620:ea:8000::/48", "2386"}, - {"2a00:4802:2c00::/42", "13124"}, - {"2001:500:4::/48", "10745"}, - {"2600:6c38:31c::/42", "20115"}, - {"2803:4600::/35", "14754"}, - {"2001:559:c449::/48", "7922"}, - {"2620:131:1066::/40", "26450"}, - {"2803:e800::/32", "13424"}, - {"2804:a84::/33", "262296"}, - {"2804:6500::/32", "269462"}, - {"2607:f400::/32", "7029"}, - {"2800:ba0:20::/48", "263812"}, - {"2804:7f20::/39", "271668"}, - {"2001:559:c06c::/48", "33287"}, - {"2804:3868::/38", "266475"}, - {"2a01:8840:8a::/45", "12041"}, - {"2a04:9500::/29", "62097"}, - {"2a0a:7cc0::/47", "60880"}, - {"2001:67c:256c::/48", "48091"}, - {"240e:3b0:7800::/39", "4134"}, - {"2600:1003:b0d0::/44", "6167"}, - {"2a06:100::/32", "200760"}, - {"2001:250:5816::/48", "138371"}, - {"240a:a4a7::/32", "143841"}, - {"2620:103:a00b::/45", "12148"}, - {"2800:160:f4d0::/36", "14259"}, - {"2804:1a54:2040::/32", "61854"}, - {"2001:df0:2e00::/48", "59022"}, - {"2401:d800:d310::/42", "7552"}, - {"2402:800:537f::/40", "7552"}, - {"2600:2c00:c000::/36", "7349"}, - {"2605:a401:80d2::/45", "33363"}, - {"2800:a90::/32", "262195"}, - {"2804:79c8::/32", "271327"}, - {"2806:2f0:30a1::/46", "17072"}, - {"2a0a:b600::/29", "61317"}, - {"2804:556c::/32", "267934"}, - {"2001:559:c3d2::/48", "7016"}, - {"2001:559:7df::/48", "33659"}, - {"2001:dce:6::/40", "23869"}, - {"2001:fd8:160::/48", "132199"}, - {"2001:1368::/32", "3551"}, - {"2602:808:7000::/44", "14618"}, - {"2800:160:190d::/42", "14259"}, - {"2804:7d78::/32", "271563"}, - {"2a00:5860::/32", "197308"}, - {"2a01:8000::/35", "60672"}, - {"2a02:2428::/32", "196845"}, - {"2a0e:b107:1350::/44", "212360"}, - {"2404:f4c0:fa81::/44", "142282"}, - {"2408:8456:5c00::/42", "17622"}, - {"2408:8456:9440::/38", "17816"}, - {"2604:8540:fcf2::/48", "33353"}, - {"2804:3e8:2002::/40", "28663"}, - {"2804:a8::/32", "4230"}, - {"2804:1c80::/32", "61657"}, - {"2a0c:5940::/29", "44668"}, - {"2c0f:ecd0::/32", "328433"}, - {"2605:9780:2000::/36", "36180"}, - {"2a00:8dc0:ff05::/40", "57811"}, - {"2a07:22c0::/48", "34854"}, - {"2600:370f:73ae::/47", "32261"}, - {"2800:490:4900::/37", "27951"}, - {"2a02:26f7:de48::/48", "36183"}, - {"2a0c:e340::/47", "30150"}, - {"2404:bf40:8701::/48", "7545"}, - {"2606:2800:7033::/48", "14153"}, - {"2620:3d:c000::/48", "22512"}, - {"2804:2bb4::/32", "265170"}, - {"2a04:3fc0::/46", "197669"}, - {"2001:16a2:ee00::/39", "39386"}, - {"2606:1000::/32", "20448"}, - {"2804:938::/32", "263062"}, - {"2a05:e202::/29", "39767"}, - {"2001:559:c006::/48", "33660"}, - {"2409:800b:2d00::/32", "9808"}, - {"2602:803:3000::/44", "21705"}, - {"2a07:a343:120::/44", "9009"}, - {"2600:3000:2412::/38", "13649"}, - {"2620:171:3b::/45", "42"}, - {"2804:618::/32", "28254"}, - {"2804:5adc::/32", "268801"}, - {"2001:1248:99a7::/44", "11172"}, - {"2402:2700::/40", "132061"}, - {"2404:f4c0:a000::/46", "210320"}, - {"2804:43d8::/32", "267594"}, - {"2803:1780::/47", "264646"}, - {"2803:2f40:ffff::/48", "36351"}, - {"2a01:260::/29", "34779"}, - {"2a01:5041:200b::/45", "202196"}, - {"2a04:a802:102::/32", "3549"}, - {"2a0f:cfc0::/32", "207729"}, - {"2001:579:5a9c::/37", "22773"}, - {"2404:ca40::/32", "134944"}, - {"2804:18:20::/44", "10429"}, - {"2a01:40e0:3::/32", "8315"}, - {"2a11:1b40::/29", "204790"}, - {"2001:559:87f0::/48", "33287"}, - {"2001:4998:c::/46", "36647"}, - {"2408:8459:1f10::/42", "17623"}, - {"2a07:4842::/48", "13213"}, - {"2a0e:f43::/48", "211935"}, - {"2001:559:82cb::/48", "33659"}, - {"2001:678:fcc::/48", "211023"}, - {"2001:67c:8e8::/48", "210409"}, - {"2605:9d80:9013::/48", "4809"}, - {"2803:e600:6::/48", "65500"}, - {"2804:44f0::/32", "267662"}, - {"2804:54d4::/32", "268672"}, - {"2400:a980:6900::/35", "133111"}, - {"2404:f4c0:f667::/40", "139328"}, - {"240e:3bd:2800::/38", "4134"}, - {"2606:2800:400c::/48", "15133"}, - {"2804:486c::/32", "267120"}, - {"2403:a100::/48", "55994"}, - {"240a:ab11::/32", "145483"}, - {"2604:cc00:801::/48", "53292"}, - {"2606:8e80:64::/48", "32133"}, - {"2a03:f80:39::/48", "9009"}, - {"2a04:4040::/29", "60610"}, - {"2406:3000:36::/44", "4657"}, - {"2605:fa80::/36", "11990"}, - {"2804:1d04:6::/37", "61689"}, - {"2804:53f8::/32", "268619"}, - {"2800:484:c800::/40", "10620"}, - {"2a00:11c0:47::/44", "47147"}, - {"2c0f:ed60::/32", "328474"}, - {"2405:6240::/32", "136700"}, - {"2600:370f:3545::/40", "32261"}, - {"2604:4e00::/33", "25764"}, - {"2607:fa18::/32", "6315"}, - {"2800:160:1f0b::/45", "14259"}, - {"2804:37f0:d900::/34", "266445"}, - {"240e:981:7100::/36", "4134"}, - {"2602:ffc5:34::/48", "25926"}, - {"2606:3a80:800::/48", "36007"}, - {"2a11:8080::/29", "210807"}, - {"2401:d800:fd90::/42", "7552"}, - {"2408:8710::/30", "4837"}, - {"2a02:73c0::/32", "59395"}, - {"2402:800:8400::/35", "7552"}, - {"2402:7500:4c0::/48", "24158"}, - {"2602:feda:c90::/44", "212360"}, - {"2606:6000::/34", "20001"}, - {"2800:bf0:83::/43", "52257"}, - {"2a00:1d60::/32", "30851"}, - {"2a05:1087::/32", "142438"}, - {"2001:559:3e9::/48", "22909"}, - {"2001:da8:cb::/48", "138370"}, - {"2400:f0c0:fcf::/32", "136477"}, - {"2605:a401:87c4::/36", "33363"}, - {"2803:5480::/32", "28038"}, - {"2a01:9e00:427a::/32", "41495"}, - {"2a02:26f7:bdd0::/48", "36183"}, - {"2a03:efc0:1100::/40", "33438"}, - {"2803:dd80::/32", "269918"}, - {"2804:2984:200::/40", "53184"}, - {"2a0c:7880::/31", "60781"}, - {"2001:559:8425::/48", "33287"}, - {"2001:fb0:109f:8009::/64", "36040"}, - {"2605:b600::/32", "53525"}, - {"2800:160:1dd5::/44", "14259"}, - {"2a06:a001:a101::/46", "210384"}, - {"2409:8a51:100::/38", "56047"}, - {"2803:e960::/32", "269738"}, - {"2804:c7c::/32", "52718"}, - {"240e:438:1240::/37", "4134"}, - {"2804:2608::/32", "264319"}, - {"2a02:2aa0:101::/43", "702"}, - {"2a02:2e02:10e0::/39", "12479"}, - {"2804:6c0c::/32", "270442"}, - {"2a0a:1a00::/29", "58130"}, - {"2001:559:825e::/48", "21508"}, - {"2001:e38:f001::/36", "17934"}, - {"240e:267:5400::/36", "4134"}, - {"2600:1801:7::/43", "16552"}, - {"2600:370f:2065::/40", "32261"}, - {"2602:fc23:159::/42", "8095"}, - {"2804:4878::/32", "267123"}, - {"2a01:8840:42::/45", "12041"}, - {"2408:8256:3b6b::/48", "17816"}, - {"2408:8456:ef00::/42", "17622"}, - {"2409:8080:3814::/44", "9808"}, - {"2610:60::/32", "29748"}, - {"2804:4a1c:1000::/32", "267219"}, - {"2a02:2e02:8b80::/37", "12479"}, - {"2001:559:803f::/41", "33657"}, - {"2400:7400:e035::/48", "38044"}, - {"2605:85c0::/32", "398196"}, - {"2620:4e::/48", "11872"}, - {"2803:a240::/32", "263805"}, - {"2803:e440::/32", "263780"}, - {"2a06:e881:5509::/48", "209864"}, - {"2a0a:d240::/29", "205916"}, - {"2a12:4940::/35", "211398"}, - {"240e:44d:3400::/41", "140345"}, - {"2a00:f7a0:100::/48", "204249"}, - {"2a02:582:7400::/29", "6799"}, - {"2a10:4a40:4ddc::/48", "31463"}, - {"2001:550:5400:100::/46", "174"}, - {"2402:8100:2470::/40", "55644"}, - {"2404:e6:200::/42", "703"}, - {"2407:1e40::/45", "141732"}, - {"2602:fd80::/47", "53612"}, - {"2603:c001:3a10::/39", "31898"}, - {"2800:bf0:8020::/44", "52257"}, - {"2a03:6f00:8::/48", "200088"}, - {"2a10:2680::/29", "212813"}, - {"2001:c38:9127::/38", "9931"}, - {"2405:b40:45::/37", "55674"}, - {"240e:44d:3880::/41", "4134"}, - {"2a02:26f7:d3c4::/48", "36183"}, - {"2a09:840::/32", "209634"}, - {"2a0b:b87:ffa4::/48", "212332"}, - {"2a11:fe80:fab4::/46", "209209"}, - {"2607:fdf0:5e6b::/43", "8008"}, - {"2804:6b28::/32", "270382"}, - {"2a04:7340::/33", "62172"}, - {"2a06:e881:3500::/44", "205117"}, - {"240a:a79c::/32", "144598"}, - {"2600:1406:47::/48", "35994"}, - {"2604:2340::/32", "32281"}, - {"2606:ce80:6100::/37", "33438"}, - {"2804:1854::/32", "53176"}, - {"2804:33b0::/32", "52662"}, - {"2a0a:b580::/29", "201296"}, - {"2001:559:81ba::/48", "13367"}, - {"2001:580::/32", "1798"}, - {"2600:6c10:f016::/42", "20115"}, - {"2602:fcfc:1::/48", "398868"}, - {"2804:1cac::/32", "61668"}, - {"2a02:6b8::/45", "208722"}, - {"2a04:4e42:7a::/45", "54113"}, - {"2400:c780::/32", "131590"}, - {"240e:a66:2600::/32", "4134"}, - {"2600:9000:2031::/46", "16509"}, - {"2606:2800:4af0::/47", "15133"}, - {"2a02:26f7:c48c::/48", "36183"}, - {"2a0f:7b80::/48", "62282"}, - {"2400:17a0::/44", "139351"}, - {"2a02:88d:820f::/48", "47794"}, - {"2a02:26f7:c845::/46", "20940"}, - {"2001:550:7202::/45", "174"}, - {"2409:8958:c844::/43", "9808"}, - {"2600:380:d800::/43", "20057"}, - {"2600:6c34:274::/48", "33588"}, - {"2602:fe3d::/36", "46246"}, - {"2605:3380:4501::/48", "12025"}, - {"2804:5b70::/32", "268845"}, - {"2a02:2b98::/32", "39642"}, - {"2001:559:da::/48", "7922"}, - {"2001:559:8782::/48", "33660"}, - {"2408:820c:2750::/33", "17621"}, - {"240c:c0a8:5c27::/41", "24348"}, - {"2600:5c00:3afe::/48", "11351"}, - {"2804:14c:b386::/47", "28573"}, - {"2001:559:555::/48", "7922"}, - {"2001:559:778::/48", "33652"}, - {"2001:67c:654::/48", "34244"}, - {"2404:300::/32", "38901"}, - {"2404:ba00:fd00::/46", "17665"}, - {"2804:232c::/32", "264146"}, - {"2001:49f0:a000::/44", "174"}, - {"2804:24b4::/32", "264239"}, - {"240e:3be:9200::/36", "140317"}, - {"2602:809:f000::/47", "23026"}, - {"2001:559:83cb::/48", "33657"}, - {"2a02:26f7:e0c9::/46", "20940"}, - {"2403:ff00::/48", "24535"}, - {"2409:8d14:1400::/38", "56044"}, - {"2602:fc97:40::/44", "399544"}, - {"2602:fe19:6401::/32", "26073"}, - {"2804:c00::/34", "52655"}, - {"2001:559:c2ae::/48", "21508"}, - {"2001:579:104::/43", "22773"}, - {"2400:9380:94c0::/44", "136167"}, - {"2620:10d:c09b::/45", "54115"}, - {"2800:b40:1::/48", "262220"}, - {"240e:983:1800::/48", "133775"}, - {"2803:2360::/32", "269782"}, - {"2804:601c::/32", "269146"}, - {"2a02:be8::/32", "42612"}, - {"2a02:26f7:c608::/47", "36183"}, - {"2607:f688::/32", "26935"}, - {"2804:4890::/33", "267129"}, - {"2001:470:e3::/48", "11282"}, - {"2408:8459:cf30::/41", "17622"}, - {"2a0c:8f00::/29", "205044"}, - {"2a0d:d200::/29", "54543"}, - {"2404:3d00:405a::/45", "3573"}, - {"2408:840c:b800::/40", "17621"}, - {"2600:6c39:625::/46", "20115"}, - {"2804:954::/42", "263073"}, - {"2806:264:400::/43", "13999"}, - {"2a02:ee80:4260::/46", "3573"}, - {"2001:129c::/33", "22356"}, - {"2a02:7aa0:161a::/33", "43513"}, - {"2a0f:d500::/29", "208425"}, - {"2402:800:318d::/43", "7552"}, - {"2402:c00::/32", "9268"}, - {"2409:877b::/29", "9808"}, - {"240e:3b5:7a00::/32", "140313"}, - {"240e:95d:2000::/37", "4134"}, - {"2600:1003:b100::/41", "6167"}, - {"2607:f7a8:827::/38", "46887"}, - {"2620:122:f001::/46", "14870"}, - {"2a00:1678:baba::/48", "49453"}, - {"2a00:5881:8100::/40", "60630"}, - {"2a02:ee80:412d::/43", "3573"}, - {"2a0f:607:150a::/48", "210932"}, - {"2001:df2:e700::/48", "136397"}, - {"2400:3a60:ff0::/35", "149051"}, - {"240a:a9d4::/32", "145166"}, - {"2600:100a:b040::/44", "6167"}, - {"2620:101:c000::/40", "3359"}, - {"2804:75c8::/32", "271069"}, - {"2806:28c:2000::/36", "265529"}, - {"2a02:868:8000::/34", "8820"}, - {"2405:d180:1::/46", "9506"}, - {"2408:8957:8500::/40", "17816"}, - {"240e:528::/25", "4134"}, - {"2605:6c00::/44", "2734"}, - {"2804:45f8::/32", "266958"}, - {"2804:53e8::/32", "268615"}, - {"2a00:fe0::/32", "34953"}, - {"2001:67c:19d0::/48", "43770"}, - {"2001:da8:302a::/45", "24358"}, - {"2001:1248:5a51::/44", "11172"}, - {"2001:4398::/32", "328411"}, - {"2400:cb00:120::/44", "13335"}, - {"2604:2dc0::/32", "16276"}, - {"2a05:3580:c400::/36", "35807"}, - {"2a07:a6c0::/29", "3267"}, - {"240a:ae62::/32", "146332"}, - {"2001:438:fffd:112::/60", "6461"}, - {"2001:560::/32", "18530"}, - {"2400:ed00:1::/48", "7595"}, - {"240a:ada6::/32", "146144"}, - {"2804:3e8::/47", "28663"}, - {"2804:4024:3001::/32", "265937"}, - {"2a02:28:2::/45", "8359"}, - {"2a02:4722::/29", "201333"}, - {"2a0c:6600:1::/46", "48011"}, - {"2001:559:507::/48", "33652"}, - {"2a06:1287:40::/48", "12406"}, - {"2001:559:80c7::/44", "33662"}, - {"2804:954:700::/36", "263073"}, - {"2a02:2e02:15c0::/38", "12479"}, - {"2a0e:97c0:170::/48", "58057"}, - {"2001:c20:48c4::/48", "9255"}, - {"2401:d800:5e0::/38", "7552"}, - {"2800:190:2::/45", "11664"}, - {"2001:559:7dc::/48", "33659"}, - {"2402:a00:96::/47", "45916"}, - {"2403:4c0::/33", "17639"}, - {"240a:a56b::/32", "144037"}, - {"240a:ad58::/32", "146066"}, - {"240e:49:6000::/32", "4134"}, - {"2607:fb10:7144::/43", "2906"}, - {"2804:79d0::/32", "271329"}, - {"2402:cf80:100a::/47", "136468"}, - {"240a:a551::/32", "144011"}, - {"2600:6c38:187::/44", "20115"}, - {"2620:1ec:912::/38", "8075"}, - {"2804:689c::/32", "269704"}, - {"2a0f:bb00::/29", "34856"}, - {"2001:4479:e000::/38", "7545"}, - {"2800:bf0:8300::/44", "52257"}, - {"2401:d800:7bd0::/37", "7552"}, - {"2406:e240::/48", "131976"}, - {"2408:8956:7600::/40", "17622"}, - {"240e:27f:3::/32", "4134"}, - {"2620:131:1000::/45", "26450"}, - {"2a00:16d8::/41", "42695"}, - {"2001:559:8199::/48", "7015"}, - {"2400:2000::/45", "17676"}, - {"2604:d600:503::/44", "32098"}, - {"2806:2f0:92c6::/42", "17072"}, - {"2a01:7a40::/32", "48483"}, - {"2a02:26f7:e480::/48", "36183"}, - {"2001:559:5bb::/48", "21508"}, - {"2001:559:c4d3::/48", "7015"}, - {"2620:ab:4000::/48", "393681"}, - {"2a02:26f7:b5::/48", "20940"}, - {"2a05:90c0::/29", "42812"}, - {"2409:8c00:7841::/32", "9808"}, - {"2620:115:6::/44", "18888"}, - {"2804:d84:cad::/32", "28171"}, - {"2a0b:3780::/32", "206487"}, - {"2a0d:b201:f090::/42", "206026"}, - {"2a10:2ec1::/32", "208861"}, - {"2001:559:809d::/48", "33652"}, - {"240a:a018::/32", "142674"}, - {"240a:a2df::/32", "143385"}, - {"2605:9d80:8041::/48", "4134"}, - {"2001:550:d0d::/38", "174"}, - {"2404:8d00:1c10::/32", "24378"}, - {"2001:250:818::/48", "23910"}, - {"240e:438:6e40::/35", "4134"}, - {"2a00:79e1:f11::/48", "395973"}, - {"2a00:b6c0::/29", "35170"}, - {"2402:dc40:4::/47", "134331"}, - {"2406:daa0:6080::/44", "16509"}, - {"2409:896a:9a00::/39", "9808"}, - {"2803:ca20::/32", "265849"}, - {"2804:23e0::/32", "264189"}, - {"2804:7298::/48", "270863"}, - {"2001:4238::/32", "30844"}, - {"2a0f:600:604::/46", "51044"}, - {"2804:5130::/34", "268436"}, - {"2804:6314::/32", "269337"}, - {"2001:7d8::/32", "12329"}, - {"2001:c20:484a::/43", "3758"}, - {"2401:d800:79f0::/38", "7552"}, - {"2800:3c0:10a0::/39", "19863"}, - {"2a02:e98::/32", "24641"}, - {"2a02:ee80:41b6::/44", "3573"}, - {"2a10:4646:70::/44", "211405"}, - {"2001:559:c424::/48", "7922"}, - {"2409:8924:2f00::/35", "56046"}, - {"240a:a8fd::/32", "144951"}, - {"2a0a:2846::/48", "136796"}, - {"2001:270::/32", "3786"}, - {"240a:a5db::/32", "144149"}, - {"240a:a87a::/32", "144820"}, - {"2a03:cc00:fc1::/32", "9183"}, - {"2001:559:41d::/46", "7922"}, - {"2402:e7c0:440::/36", "59078"}, - {"2606:18c0:26::/47", "14445"}, - {"2804:1590::/32", "263395"}, - {"2a02:26f7:63::/48", "20940"}, - {"2a02:26f7:d550::/48", "36183"}, - {"2001:678:63c::/48", "39566"}, - {"2001:4978:1002::/45", "13331"}, - {"2001:559:8390::/48", "33657"}, - {"2001:4be0::/32", "31703"}, - {"2a0d:b00:3502::/48", "205862"}, - {"2a11:ef80::/29", "204790"}, - {"2401:4900:30b0::/41", "45609"}, - {"2600:6c39:608::/42", "20115"}, - {"2602:fd86:1::/48", "400113"}, - {"2804:8dc::/32", "262395"}, - {"2a00:5ec0::/32", "197581"}, - {"2001:67c:184::/48", "25111"}, - {"2409:8902::/31", "38019"}, - {"2804:22a0:e::/40", "264112"}, - {"2a01:8e20::/32", "12843"}, - {"2001:5b0:6500::/38", "6621"}, - {"2001:df4:3500::/48", "17439"}, - {"2001:4600::/24", "2119"}, - {"240a:a30b::/32", "143429"}, - {"240e:13:801::/48", "140853"}, - {"2603:c0ec:2000::/40", "54253"}, - {"2a00:6d47::/36", "205727"}, - {"2404:0:7000::/40", "131142"}, - {"240a:a170::/32", "143018"}, - {"2800:160:201b::/42", "14259"}, - {"2804:6690::/32", "269568"}, - {"2a02:2978::/32", "15830"}, - {"2409:8057:306d::/43", "56040"}, - {"240a:a889::/32", "144835"}, - {"240a:af5f::/32", "146585"}, - {"2600:1d00::/28", "3128"}, - {"2804:197c::/32", "61797"}, - {"2804:383c:5::/38", "52601"}, - {"2804:5cbc:fa40::/37", "268927"}, - {"2a02:26f7:f784::/48", "36183"}, - {"2a06:f040::/32", "5420"}, - {"2001:3c8:1012::/48", "24475"}, - {"2600:1800:9::/43", "16552"}, - {"2603:fb48::/29", "40676"}, - {"2804:7f74::/46", "271689"}, - {"2a00:4802:a50::/42", "13124"}, - {"2a09:bac0:172::/48", "13335"}, - {"2a0f:5701:3100::/40", "205593"}, - {"2404:9ac0::/32", "37981"}, - {"2620:149:1b01::/32", "714"}, - {"2806:2f0:7081::/46", "17072"}, - {"2001:559:8680::/48", "33650"}, - {"240a:a1c5::/32", "143103"}, - {"240a:af2a::/32", "146532"}, - {"2620:12c:9030::/47", "395359"}, - {"2804:314:402e::/47", "61568"}, - {"2804:71e4::/32", "270818"}, - {"2804:5c58::/32", "268903"}, - {"2a0b:d580::/29", "206350"}, - {"2c0f:ea38::/32", "328527"}, - {"2402:800:517f::/40", "7552"}, - {"2405:f080:2a00::/48", "136907"}, - {"2804:30c0::/32", "264972"}, - {"2a0d:26c0::/32", "209041"}, - {"2a0e:7d40::/41", "209833"}, - {"2001:559:c2e8::/48", "7015"}, - {"2001:67c:2bac::/48", "12886"}, - {"2803:b300::/32", "52455"}, - {"2a01:280:338::/48", "42303"}, - {"2404:3d00:417a::/47", "21433"}, - {"2804:47d0::/32", "267078"}, - {"2a00:1138:7400::/32", "43782"}, - {"2604:1a00::/44", "46887"}, - {"2806:5:201::/32", "6503"}, - {"2a02:26f0:e201::/39", "20940"}, - {"2a05:d014::/36", "16509"}, - {"2a06:e80::/36", "43350"}, - {"2400:cb00:336::/44", "13335"}, - {"2406:840:fcc0::/44", "132623"}, - {"2408:84f3:2c50::/44", "17816"}, - {"2409:8914:b000::/39", "56044"}, - {"2600:6c2e:627::/43", "20115"}, - {"2800:4f0:560::/46", "28006"}, - {"2a0a:e440::/48", "42240"}, - {"2001:df0:37c0::/48", "141296"}, - {"2001:df4:f680::/48", "136360"}, - {"240e:438:6620::/43", "140647"}, - {"2600:6c2e:373::/37", "20115"}, - {"2804:7374::/32", "270916"}, - {"2a06:8a00::/32", "12307"}, - {"2409:8f04:d600::/34", "24547"}, - {"240c:c716::/26", "23910"}, - {"2600:6c38:851::/45", "20115"}, - {"2804:2050:5a7f::/40", "264485"}, - {"2401:d800:100::/42", "7552"}, - {"2402:e80:41::/48", "23901"}, - {"240a:af43::/32", "146557"}, - {"2602:fc09:d2f::/48", "13780"}, - {"2604:6600:fe9c::/39", "40676"}, - {"2a0e:8f02:2110::/44", "213326"}, - {"2407:3380::/32", "64063"}, - {"2604:1900::/40", "12182"}, - {"2804:206c::/32", "264490"}, - {"2a0d:e4c4:5000::/32", "208861"}, - {"2a0a:e8c0::/32", "205412"}, - {"2001:559:487::/48", "7015"}, - {"2404:7600:101::/32", "23853"}, - {"2803:77c0::/32", "52290"}, - {"2001:67c:14e0::/45", "25516"}, - {"2408:8907:9000::/44", "4808"}, - {"2409:8b54::/28", "56040"}, - {"2a01:cc00::/32", "47377"}, - {"2a04:e4c0:20::/45", "36692"}, - {"2001:e48:40:5::/64", "22317"}, - {"240a:a125::/32", "142943"}, - {"2804:5a94::/32", "268782"}, - {"2a0c:a580::/29", "62206"}, - {"2a0f:f980::/29", "60262"}, - {"2402:1440::/42", "63689"}, - {"2404:7ac0:607::/48", "139216"}, - {"2600:9000:22fd::/48", "16509"}, - {"2602:fff6:7::/48", "54561"}, - {"2603:c023::/35", "31898"}, - {"2604:ca00:116::/42", "36492"}, - {"2a01:52e0::/32", "57325"}, - {"2605:a401:8bc7::/42", "33363"}, - {"2a02:dc00:200::/48", "15493"}, - {"2a05:4145:1::/48", "211522"}, - {"2a05:9f40:1f::/48", "42831"}, - {"2001:dcd:23::/48", "14618"}, - {"240e:6:d020::/48", "140527"}, - {"2600:1006:b140::/42", "6167"}, - {"2a03:5640:f561::/36", "2906"}, - {"2001:559:8107::/48", "7725"}, - {"240a:a732::/32", "144492"}, - {"240e:3bb:9200::/36", "140317"}, - {"2806:2f0:9503::/42", "17072"}, - {"2a0f:5707:af05::/48", "211358"}, - {"2804:7b58:10::/32", "4"}, - {"2a02:26f7:bc80::/48", "36183"}, - {"2804:d70:50::/39", "52626"}, - {"2404:bf40:a481::/42", "139084"}, - {"2409:8a51:d00::/38", "56047"}, - {"240a:ab5e::/32", "145560"}, - {"240e:44d:5840::/42", "140350"}, - {"2600:80a:861::/31", "701"}, - {"2a01:280:348::/47", "3166"}, - {"2a0a:6bc0::/29", "60059"}, - {"2402:5380::/32", "63980"}, - {"240a:a920::/32", "144986"}, - {"2600:1404:d401::/38", "20940"}, - {"2607:f3f8:8001::/33", "17378"}, - {"2804:3774:2500::/33", "266416"}, - {"2a00:79e1:f0c::/47", "36384"}, - {"2a02:26f7:d744::/48", "36183"}, - {"2001:67c:510::/51", "15486"}, - {"240e:438:7640::/36", "4134"}, - {"2602:feda:de0::/46", "142641"}, - {"2a00:7ce0::/32", "60832"}, - {"2a0e:97c0:690::/46", "210354"}, - {"2a10:3ac0::/29", "204790"}, - {"2001:559:80be::/48", "7922"}, - {"2409:8771::/29", "9808"}, - {"240e:3ba:5600::/34", "4134"}, - {"2600:2000:1002::/47", "33517"}, - {"2001:559:80a8::/48", "33667"}, - {"240a:a791::/32", "144587"}, - {"2804:1b2:d000::/39", "18881"}, - {"2804:6384::/32", "269366"}, - {"2a06:3980::/29", "34694"}, - {"2405:f080:1500::/38", "136907"}, - {"240e:3b2:3e00::/33", "140308"}, - {"2804:1ac:581c::/40", "53175"}, - {"2a00:d520::/29", "15600"}, - {"2a0e:f42::/32", "208627"}, - {"2001:559:1a2::/48", "33652"}, - {"2a02:26f7:fa45::/46", "20940"}, - {"2001:559:c28f::/43", "21508"}, - {"2606:7100:1cac::/34", "21581"}, - {"2607:f110:47::/43", "21889"}, - {"2a0a:3340::/29", "25424"}, - {"2402:800:6381::/42", "7552"}, - {"240e:438:8240::/37", "4134"}, - {"240e:980:8e00::/39", "4134"}, - {"2a07:6fc0::/48", "205948"}, - {"2a11:29c1:b00b::/48", "212149"}, - {"240e:966:3000::/33", "4134"}, - {"2804:768:2000::/35", "52977"}, - {"2a02:26f7:f851::/42", "20940"}, - {"2a02:29a0::/32", "56472"}, - {"2a04:d340::/29", "60717"}, - {"2405:9000:81::/44", "7474"}, - {"2600:1406:3e01::/33", "20940"}, - {"2804:7b58::/44", "4"}, - {"2a0b:4540::/29", "42011"}, - {"2a0e:b107:150::/44", "62075"}, - {"2001:559:5c9::/48", "7922"}, - {"2001:4278::/32", "8346"}, - {"2001:448a:7090::/42", "7713"}, - {"2409:8054:21::/45", "56040"}, - {"240a:a189::/32", "143043"}, - {"2620:68:2000::/48", "397335"}, - {"2620:90::/48", "174"}, - {"2a02:26f7:fb80::/48", "36183"}, - {"2a05:3580:24::/46", "35807"}, - {"2001:678:474::/48", "205866"}, - {"2001:1248:9ad5::/42", "11172"}, - {"2001:44b8:1066::/44", "7545"}, - {"240a:ae91::/32", "146379"}, - {"2a07:1e01::/32", "207446"}, - {"2409:8907:7e20::/39", "24547"}, - {"2604:2d80:f400::/36", "30036"}, - {"2a0f:b100:300::/40", "208074"}, - {"2001:559:2eb::/48", "33651"}, - {"2603:fba0::/25", "397165"}, - {"2a02:26f7:d58c::/48", "36183"}, - {"2a07:2400::/29", "48402"}, - {"2a0e:fd45:da2::/45", "44103"}, - {"2800:bf0:8095::/44", "27947"}, - {"2605:a7c0:131::/44", "16509"}, - {"2607:4100:4000::/34", "19171"}, - {"2607:f0d0:2200::/36", "36351"}, - {"2620:119:1000::/48", "33004"}, - {"2620:130:1000::/48", "62649"}, - {"2804:be4::/44", "52840"}, - {"2804:454c::/32", "266917"}, - {"2a03:2880:f240::/46", "32934"}, - {"2a06:9880::/29", "203713"}, - {"2a0e:b107:23a::/45", "209419"}, - {"2a10:c5c1:c0de::/48", "211547"}, - {"2001:550:100:4::/63", "174"}, - {"2401:4900:1c88::/47", "24560"}, - {"240e:3be:7a00::/32", "140313"}, - {"2a00:eab::/32", "9211"}, - {"2a02:503:8::/48", "51955"}, - {"2a04:3800::/48", "44417"}, - {"2a05:1220::/29", "201625"}, - {"2001:559:c2db::/45", "7015"}, - {"2402:3a80:1368::/40", "38266"}, - {"2409:800b:2c04::/48", "9808"}, - {"2804:35f0:9000::/33", "266316"}, - {"2a02:26f7:d044::/48", "36183"}, - {"2a02:26f7:f3c5::/46", "20940"}, - {"2408:8956:8b00::/40", "17816"}, - {"240a:aa30::/32", "145258"}, - {"2001:678:ef8::/48", "202592"}, - {"240a:a837::/32", "144753"}, - {"2600:1419:1601::/36", "20940"}, - {"2804:3f5c::/32", "265887"}, - {"2407:e1c0:90::/32", "146872"}, - {"2804:2d1c::/32", "265262"}, - {"2a02:26f7:dc48::/48", "36183"}, - {"2a05:b0c1::/48", "198412"}, - {"2001:4998:15::/46", "10310"}, - {"2402:800:5263::/43", "7552"}, - {"2803:f100::/32", "52255"}, - {"2a06:e881:5800::/45", "204003"}, - {"2a09:fe40::/29", "400522"}, - {"2c0f:f130::/32", "37642"}, - {"2804:2440::/32", "52686"}, - {"2804:4098:f180::/36", "265969"}, - {"2a02:26f7:e589::/42", "20940"}, - {"2a0a:ec04::/32", "42692"}, - {"2001:559:853a::/48", "7015"}, - {"2409:8b18::/31", "134810"}, - {"240a:a277::/32", "143281"}, - {"240e:983:105::/38", "4134"}, - {"2606:1380::/32", "22079"}, - {"2606:e580::/32", "14237"}, - {"2620:0:2280::/48", "26827"}, - {"2804:2030:8000::/33", "262651"}, - {"2a00:e68::/29", "15743"}, - {"2a02:8060::/31", "6752"}, - {"2a0c:8480::/30", "5400"}, - {"2a10:dcc0::/29", "34907"}, - {"2408:840d:5000::/42", "17621"}, - {"2606:5000:5a00::/37", "209"}, - {"2404:a340::/32", "135273"}, - {"2408:8256:377b::/48", "17816"}, - {"240a:a69f::/32", "144345"}, - {"2600:6c38:45e::/39", "20115"}, - {"2607:f5d8:20::/48", "2553"}, - {"2a00:10a0:c::/32", "35745"}, - {"2a02:180::/32", "35366"}, - {"2a02:26f7:f901::/45", "20940"}, - {"2a0e:b107:1560::/45", "209209"}, - {"2a02:2e02:ff0::/35", "12479"}, - {"2001:1248:84dc::/46", "11172"}, - {"2406:b480:204::/48", "24538"}, - {"2409:8055:3020::/47", "9808"}, - {"2a0e:a780::/36", "16509"}, - {"2001:559:483::/48", "7016"}, - {"2001:559:80fb::/48", "33660"}, - {"2400:cb00:14::/46", "13335"}, - {"240e:960:d00::/29", "4134"}, - {"2620:138:301e::/48", "23344"}, - {"2a02:26f7:df85::/44", "20940"}, - {"2a03:e6c0::/32", "199420"}, - {"2001:559:73c::/48", "21508"}, - {"2603:c013:6000::/36", "31898"}, - {"2a02:26f7:e940::/48", "36183"}, - {"2a02:cb80:4010::/41", "43766"}, - {"2a11:2d40::/29", "204790"}, - {"2401:d800:b910::/42", "7552"}, - {"2402:e280:3da7::/43", "134674"}, - {"240a:a2ba::/32", "143348"}, - {"240a:a6f3::/32", "144429"}, - {"2a02:26f7:d14d::/46", "20940"}, - {"2a03:2880:f040::/46", "32934"}, - {"2001:678:270::/48", "206128"}, - {"2600:141b:b001::/36", "20940"}, - {"2804:5cac::/32", "268923"}, - {"2a07:241::/29", "3170"}, - {"2001:1248:870a::/45", "11172"}, - {"2402:8100:27d2::/44", "55644"}, - {"2a00:d68::/32", "24594"}, - {"2001:4878:c136::/48", "12222"}, - {"240e:6bd::/36", "140317"}, - {"2001:468:700::/48", "20080"}, - {"240e:5f::/33", "4134"}, - {"2603:c002:1310::/37", "31898"}, - {"2a00:79e0:101::/48", "36385"}, - {"2a09:dec0::/29", "43424"}, - {"2402:800:38d3::/44", "7552"}, - {"240a:ae19::/32", "146259"}, - {"2803:6900:609::/48", "52423"}, - {"2a00:8740:10::/47", "49037"}, - {"2a06:a001:a090::/45", "208814"}, - {"2a09:4d46::/32", "44066"}, - {"2a0e:b107:bf4::/48", "140938"}, - {"2600:1406:c401::/36", "20940"}, - {"2804:2348::/32", "264153"}, - {"2a0e:3780::/36", "41652"}, - {"2001:e60:d720::/43", "4766"}, - {"2a02:26f7:b6c8::/48", "36183"}, - {"2a02:6720::/32", "201890"}, - {"2a04:f580:9050::/48", "4809"}, - {"2a07:1e80::/29", "57795"}, - {"240a:add6::/32", "146192"}, - {"2001:559:ba::/47", "33654"}, - {"2620:13e:3000::/40", "397326"}, - {"2a10:7c40::/29", "212751"}, - {"2001:678:17c::/48", "201163"}, - {"2001:12e0:2000::/36", "10429"}, - {"2404:bf40:a701::/35", "139084"}, - {"2605:a7c0:110::/48", "14618"}, - {"2804:139c::/32", "52908"}, - {"2a00:1d58:f823::/45", "47524"}, - {"2a02:21b2:beee::/48", "57370"}, - {"2a02:26f7:f9c5::/46", "20940"}, - {"2a0a:56c4:8100::/47", "42649"}, - {"2a0c:9700::/29", "57376"}, - {"2806:230:100d::/48", "11888"}, - {"2001:559:86cd::/48", "7922"}, - {"2001:ac8::/44", "9009"}, - {"2403:2800:3::/32", "38566"}, - {"2804:7598:c000::/48", "265442"}, - {"2a00:60a0::/32", "42339"}, - {"2a01:8840:99::/48", "207266"}, - {"2a0a:4440::/32", "207242"}, - {"2001:df0:c80::/48", "58499"}, - {"240e:d:c000::/30", "4134"}, - {"2606:38c0::/32", "399307"}, - {"2607:d980::/32", "10271"}, - {"2804:45e4::/33", "262567"}, - {"2a02:13f8::/32", "25260"}, - {"2a02:2e02:1520::/41", "12479"}, - {"2a07:a380::/29", "15426"}, - {"2a02:26f0:504::/38", "20940"}, - {"2a07:2e40::/32", "2259"}, - {"2c0f:fd98:8110::/48", "28698"}, - {"2001:559:c3d0::/47", "7922"}, - {"240a:a3b3::/32", "143597"}, - {"2606:ae00:8300::/40", "7287"}, - {"2801:184:e::/47", "264817"}, - {"2001:678:3fc::/48", "197422"}, - {"2001:df6:b400::/48", "138148"}, - {"2001:e68::/46", "4788"}, - {"2408:8459:c10::/41", "17622"}, - {"2620:b0:4000::/48", "209"}, - {"2a01:820::/32", "30722"}, - {"2a0f:d480::/48", "205942"}, - {"2001:4878:2048::/48", "12222"}, - {"2405:da40::/32", "140220"}, - {"240a:a91c::/32", "144982"}, - {"2800:3e0::/32", "1239"}, - {"2001:559:812b::/48", "33490"}, - {"2001:67c:67c::/48", "15404"}, - {"2404:bf40:8185::/42", "139084"}, - {"240e:980:4100::/40", "4811"}, - {"2600:370f:4024::/43", "32261"}, - {"2800:400::/46", "27668"}, - {"2804:11d8::/32", "263443"}, - {"2a03:3ec0::/32", "61124"}, - {"2001:559:148::/48", "33491"}, - {"2408:8459:b230::/41", "17622"}, - {"2800:110:2801::/35", "4270"}, - {"2a04:4c0::/29", "58321"}, - {"2a04:5c85:4000::/36", "207161"}, - {"2408:8956:d100::/38", "17816"}, - {"2409:8050:1002::/40", "56047"}, - {"2803:c510::/32", "272019"}, - {"2804:2bec::/32", "265184"}, - {"2a0a:9e00::/44", "61317"}, - {"2c0f:f378::/32", "36941"}, - {"2001:550:a90a::/38", "174"}, - {"2001:628:453::/48", "1120"}, - {"240e:878:1d0::/44", "4134"}, - {"2804:5f00:11::/32", "269070"}, - {"2408:8459:ea50::/37", "17816"}, - {"2600:c02:b021::/33", "12182"}, - {"2a02:a30:173::/32", "8926"}, - {"2001:559:c1::/48", "33667"}, - {"2001:559:307::/48", "33489"}, - {"2605:7c0:1006::/44", "19382"}, - {"2804:7bf4::/32", "271465"}, - {"2001:559:4aa::/48", "13367"}, - {"2400:cb00:200::/44", "13335"}, - {"2402:6800:765::/32", "22822"}, - {"2804:527c::/32", "268521"}, - {"2a01:4c8:f401::/48", "2856"}, - {"2001:559:82d6::/48", "33287"}, - {"2a01:758:fffd::/46", "3326"}, - {"2402:800:341d::/42", "7552"}, - {"240a:a61e::/32", "144216"}, - {"2804:2e68::/32", "265344"}, - {"2a10:9902:73f::/48", "211972"}, - {"2402:800:7be0::/37", "7552"}, - {"240e:3bc:2200::/37", "136198"}, - {"2620:1d5:6f0::/36", "14773"}, - {"2800:ba0:22::/48", "263812"}, - {"2804:6c30::/32", "270451"}, - {"2a01:2c0:23db::/48", "9179"}, - {"2a01:758:8300::/45", "15785"}, - {"2a0d:2582:120::/43", "211367"}, - {"2a0f:c583::/29", "210625"}, - {"2001:4b20:1000:2515::/32", "34288"}, - {"240a:a9a0::/32", "145114"}, - {"2804:12e8::/32", "53082"}, - {"2a02:26f7:f3c1::/46", "20940"}, - {"2a06:940::/48", "207333"}, - {"2001:559:ac::/48", "33489"}, - {"2600:1010:9e10::/40", "22394"}, - {"2405:8a00:801d::/46", "55824"}, - {"2a00:f46:1000::/31", "43447"}, - {"2a0f:e200::/47", "60781"}, - {"2402:800:7780::/42", "7552"}, - {"2406:840:fbb3::/45", "139058"}, - {"2804:2df8:eebf::/41", "265315"}, - {"2409:8d80:9000::/34", "56040"}, - {"2001:559:768::/48", "7016"}, - {"2402:800:f8f2::/39", "7552"}, - {"2406:840:f100::/47", "39753"}, - {"2a00:fc80::/48", "60781"}, - {"2001:67c:1684::/48", "16104"}, - {"240e:58:d000::/31", "4812"}, - {"2804:5408::/32", "268624"}, - {"2a02:ec0::/38", "41653"}, - {"2a02:26f7:c3cc::/48", "36183"}, - {"2001:4c8:1104::/44", "15290"}, - {"2001:559:7d4::/48", "7725"}, - {"2001:4de0:aaa0::/44", "34343"}, - {"2408:84f3:4a40::/32", "17816"}, - {"2600:1419:1e01::/34", "20940"}, - {"2605:1640::/32", "19681"}, - {"2a09:27c0::/29", "209531"}, - {"2001:559:c3a0::/48", "7725"}, - {"2402:800:9ee0::/44", "7552"}, - {"2607:f690::/32", "7029"}, - {"2620:12d:4000::/44", "53988"}, - {"2a06:2800::/29", "25579"}, - {"2a11:b580::/29", "204790"}, - {"2c0f:f698::/32", "37693"}, - {"240e:64:c000::/24", "4134"}, - {"2600:1008:6000::/44", "6167"}, - {"2600:370f:3665::/40", "32261"}, - {"2804:1dc::/32", "53202"}, - {"2a06:6541:1241::/48", "8220"}, - {"2a0a:f000::/32", "207210"}, - {"2401:d800:d070::/40", "7552"}, - {"240a:aae0::/32", "145434"}, - {"2001:559:592::/48", "33491"}, - {"240a:a5c2::/32", "144124"}, - {"2602:ffe4:c1c::/48", "21859"}, - {"2a03:2c80::/32", "31084"}, - {"2804:14d:ecf3::/39", "28573"}, - {"2a04:f480::/34", "25373"}, - {"2001:df0:310::/48", "17547"}, - {"2602:feda:1bf::/48", "133846"}, - {"2620:74:77::/48", "11840"}, - {"2804:8184::/32", "272459"}, - {"2620:12e:1000::/47", "396075"}, - {"2a00:8d60::/32", "60720"}, - {"2001:400:2410::/48", "3152"}, - {"2408:802c::/32", "4837"}, - {"2804:41b0::/38", "267450"}, - {"2a03:8de0::/32", "41887"}, - {"2001:df0:45::/48", "37918"}, - {"2a05:3951::/32", "201503"}, - {"2001:250:2c12::/48", "23910"}, - {"2001:559:53f::/48", "33650"}, - {"2001:1248:5525::/44", "11172"}, - {"2401:d800:94a0::/41", "7552"}, - {"2804:67a4:3::/39", "269641"}, - {"2806:20d:191a::/40", "32098"}, - {"2a11:5701:b00b::/48", "212149"}, - {"2602:808:a000::/48", "14618"}, - {"2a03:b240::/32", "3250"}, - {"2a0a:e200:1511::/36", "33438"}, - {"2402:dfc0:40::/44", "137805"}, - {"2600:380:fe00::/31", "20057"}, - {"2604:f400:7::/48", "29930"}, - {"2803:760:7800::/32", "269816"}, - {"2804:a84:4400::/32", "262296"}, - {"2804:76cc:2000::/32", "271135"}, - {"2a04:4e40:cc00::/48", "54113"}, - {"2001:67c:1009::/48", "44522"}, - {"240a:aa6f::/32", "145321"}, - {"2606:4700:8d70::/44", "13335"}, - {"2a01:a520::/32", "62002"}, - {"2c0f:f250::/32", "37678"}, - {"2001:4cd0::/29", "8551"}, - {"2401:d800:5a00::/41", "7552"}, - {"2a02:e0:14::/34", "34984"}, - {"2001:7f8:49::/48", "20530"}, - {"2001:df4:a300::/48", "135817"}, - {"2001:1248:9737::/41", "11172"}, - {"2408:8456:dc40::/38", "17816"}, - {"240a:a6c6::/32", "144384"}, - {"2a09:9f40::/31", "1239"}, - {"2406:9740::/32", "131642"}, - {"240a:ab04::/32", "145470"}, - {"240e:d:b800::/37", "136194"}, - {"2602:fd86:2::/36", "33412"}, - {"2804:5374::/32", "268585"}, - {"2a06:e881:108::/48", "206633"}, - {"2001:200:600::/40", "7667"}, - {"2402:2600::/32", "17813"}, - {"240a:a919::/32", "144979"}, - {"240e:979:5f00::/34", "4134"}, - {"2604:5500:7000::/38", "19165"}, - {"2607:f928:13::/45", "22645"}, - {"2804:30a0::/32", "264965"}, - {"2804:78a8::/32", "271257"}, - {"2a0d:1a45::/42", "57782"}, - {"2c0f:fdf8::/32", "37028"}, - {"240e:44d:5300::/41", "140345"}, - {"2804:18:7820::/43", "10429"}, - {"2a06:5dc0::/29", "25542"}, - {"2a10:4640:ffff::/48", "212815"}, - {"2001:559:54::/46", "7922"}, - {"2404:ffc0:12::/45", "62707"}, - {"2405:7000:2c00::/40", "18281"}, - {"2600:1419:9c01::/34", "20940"}, - {"2604:5d00::/32", "11915"}, - {"2620:0:2f0::/48", "32629"}, - {"2a01:488:bb10::/45", "20773"}, - {"2a02:26f7:d845::/46", "20940"}, - {"2a05:9407::/32", "15626"}, - {"2001:1448::/32", "16245"}, - {"2400:89c0:3010::/44", "37936"}, - {"2408:84f3:3240::/44", "17623"}, - {"240a:a8f9::/32", "144947"}, - {"2604:6600:fdc1::/38", "40676"}, - {"2801:1e6::/44", "27951"}, - {"2a0b:3540:8::/47", "397964"}, - {"2001:559:9a::/47", "7922"}, - {"240a:a54d::/32", "144007"}, - {"2606:ce80:6900::/40", "33438"}, - {"2607:8300::/46", "13876"}, - {"2001:559:c503::/48", "33659"}, - {"2402:4d40::/32", "24479"}, - {"2406:35c0::/32", "38038"}, - {"2605:9cc0:302::/48", "14618"}, - {"2606:69c0:5000::/36", "11039"}, - {"2405:9800:9806::/43", "45430"}, - {"240a:a6f7::/32", "144433"}, - {"2804:408c::/32", "265966"}, - {"2804:4224::/32", "267480"}, - {"2a02:fa8:c410::/44", "399104"}, - {"2408:8956:800::/40", "17622"}, - {"2600:1417:f800::/48", "25019"}, - {"2804:3dcc::/32", "266554"}, - {"2001:559:8339::/48", "33661"}, - {"240e:978:1600::/36", "4134"}, - {"2806:230:1017::/48", "11888"}, - {"2001:250:340a::/48", "138438"}, - {"2409:8904:6270::/40", "24547"}, - {"2800:b70:801::/48", "262191"}, - {"2a0a:59c7:100b::/45", "204724"}, - {"2600:1012:b100::/42", "6167"}, - {"2600:6c21:416::/44", "20115"}, - {"2804:c48:ef01::/35", "52687"}, - {"2a00:9780::/32", "50928"}, - {"2a06:bdc7:1a::/32", "62240"}, - {"240a:ada1::/32", "146139"}, - {"2607:f7c0:c100::/34", "36444"}, - {"2a01:aea0:df3::/45", "40980"}, - {"2a0b:4342:1a30::/44", "57695"}, - {"2401:fd80:ffb1::/48", "139853"}, - {"2403:780::/44", "64098"}, - {"240e:55:4000::/30", "4134"}, - {"2804:83f0::/32", "272230"}, - {"2406:2d40::/34", "36492"}, - {"2406:3340::/35", "139139"}, - {"2a0b:6800:1::/46", "42695"}, - {"240a:af13::/32", "146509"}, - {"2602:fed0::/36", "396109"}, - {"2a10:52c0::/48", "60078"}, - {"2001:559:395::/48", "7922"}, - {"2001:16a2:3616::/39", "39386"}, - {"2405:9800:c90a::/47", "45430"}, - {"2408:8756:af1::/45", "136958"}, - {"240a:a118::/32", "142930"}, - {"240a:a17c::/32", "143030"}, - {"2806:2f0:3483::/42", "17072"}, - {"2a05:93c5::/32", "39134"}, - {"2a07:f80::/29", "45033"}, - {"2001:1248:98b8::/45", "11172"}, - {"240a:a4d9::/32", "143891"}, - {"240e:878:1f0::/44", "4134"}, - {"2a03:5440::/29", "42541"}, - {"2a0b:4d07:301::/48", "44239"}, - {"2001:559:8430::/46", "33287"}, - {"2404:8380::/32", "135158"}, - {"240a:a810::/32", "144714"}, - {"2a06:e881:5600::/48", "203478"}, - {"2001:559:8348::/48", "33287"}, - {"2001:4dc8::/36", "16316"}, - {"2406:8700::/32", "7575"}, - {"240a:ad21::/32", "146011"}, - {"2804:6b5c::/32", "270395"}, - {"2a02:26f7:d60d::/42", "20940"}, - {"2a10:1e40::/29", "206173"}, - {"2001:1248:4343::/45", "11172"}, - {"2409:8c30:150::/35", "9808"}, - {"2605:bb00:4000::/34", "18672"}, - {"2804:5df4::/32", "269003"}, - {"2a02:26f7:b908::/48", "36183"}, - {"2806:230:201f::/48", "11888"}, - {"2001:559:81bf::/48", "21508"}, - {"2402:800:5371::/44", "7552"}, - {"2402:c800:ff7b::/48", "18131"}, - {"2406:f240::/32", "131963"}, - {"2a02:26f7:c145::/46", "20940"}, - {"2a02:cb80:2110::/48", "43766"}, - {"2a04:7501::/32", "62373"}, - {"2001:559:162::/48", "7016"}, - {"2001:559:c437::/48", "7015"}, - {"2409:8915:8e00::/39", "56044"}, - {"2603:f470::/24", "397165"}, - {"2604:d600:1573::/44", "32098"}, - {"2806:370:7200::/44", "28403"}, - {"2a02:26f7:de49::/42", "20940"}, - {"2803:82c0::/32", "264832"}, - {"2804:14d:4000::/42", "28573"}, - {"2804:1b54:c000::/34", "61722"}, - {"2804:5954::/32", "268183"}, - {"2a07:3500:12c0::/48", "212778"}, - {"2001:218:3004::/48", "20940"}, - {"2001:438::/42", "6461"}, - {"240e:3b6:7800::/39", "4134"}, - {"2620:13c:a0a0::/47", "19367"}, - {"2001:67c:1088::/47", "8426"}, - {"2001:bf0:e000::/31", "12732"}, - {"2401:8a40:3c::/46", "45326"}, - {"2402:e380:306::/48", "135646"}, - {"2620:11b:4018::/48", "19210"}, - {"2804:1f34::/32", "262679"}, - {"2804:318c::/39", "265023"}, - {"2001:480:240::/48", "687"}, - {"2001:559:446::/48", "7015"}, - {"2001:559:847e::/48", "33657"}, - {"2a00:4802:2c0::/44", "13124"}, - {"2a02:26f7:c8c4::/48", "36183"}, - {"2a04:1700::/29", "41354"}, - {"2a0b:11c0:92::/48", "198682"}, - {"2a0e:fd45:4100::/34", "44103"}, - {"2401:b400::/48", "58536"}, - {"2402:8100:21a0::/43", "55644"}, - {"2804:33b4::/32", "265412"}, - {"2a02:26f7:ed80::/48", "36183"}, - {"2a09:65c0::/32", "48045"}, - {"2001:4888:8010::/44", "22394"}, - {"2607:f3f8:7000::/36", "17378"}, - {"2a03:47c0:2401::/40", "21277"}, - {"2a0a:3640::/29", "29504"}, - {"2001:7f0:3004::/33", "13237"}, - {"2001:44b8:400::/48", "7545"}, - {"2402:b500::/48", "38203"}, - {"240a:abaa::/32", "145636"}, - {"2804:694:4c90::/38", "262596"}, - {"2a04:1b00::/47", "61005"}, - {"2a05:8940::/30", "8468"}, - {"2a05:b7c0::/48", "61400"}, - {"2c0f:f128::/32", "37629"}, - {"2001:550:5c00:100::/45", "174"}, - {"2001:1248:871d::/46", "11172"}, - {"2401:5700::/32", "131447"}, - {"2407:4a00::/32", "56055"}, - {"2409:8051:3900::/32", "9808"}, - {"2607:fb10:70e4::/44", "2906"}, - {"2620:0:2220::/48", "15318"}, - {"2806:2f0:4063::/40", "17072"}, - {"2001:67c:233c::/48", "47438"}, - {"2800:160:1dca::/43", "14259"}, - {"2001:1a11:26::/48", "42298"}, - {"2604:9b00:c00::/46", "14230"}, - {"2001:fd8:161::/46", "4775"}, - {"2607:f3a0:2000::/35", "40061"}, - {"2804:27ec::/32", "263929"}, - {"2a03:6f20::/32", "201146"}, - {"2a05:e40::/35", "59909"}, - {"2a09:8900::/29", "210303"}, - {"2a11:b180::/29", "204790"}, - {"240a:aa68::/32", "145314"}, - {"2600:cc0e::/32", "32298"}, - {"2804:2bdc:900::/32", "265181"}, - {"2806:2f0:70e1::/46", "17072"}, - {"2001:559:156::/48", "7015"}, - {"2600:6c38:718::/47", "20115"}, - {"2a02:26f7:e505::/46", "20940"}, - {"240e:62:d000::/36", "140308"}, - {"2804:7e38::/32", "269561"}, - {"2a0c:140::/29", "31631"}, - {"2a0e:e2c0::/32", "42282"}, - {"2001:559:c4f9::/48", "7015"}, - {"2600:6c7f:9300::/44", "19115"}, - {"2804:4d2c::/32", "267416"}, - {"2a0c:9bc0::/29", "25415"}, - {"2001:678:f28::/48", "211523"}, - {"2804:1784:b::/39", "263152"}, - {"2804:37f0:b100::/36", "266445"}, - {"2001:559:809e::/48", "33668"}, - {"2001:559:c0e8::/48", "33662"}, - {"2001:1250:d000::/44", "22894"}, - {"2404:ea80::/38", "135373"}, - {"2804:14d:9eb1::/41", "28573"}, - {"2a0f:c707::/32", "39384"}, - {"2001:df3:4400::/48", "133969"}, - {"240a:a76c::/32", "144550"}, - {"2804:3f20::/32", "266641"}, - {"2001:678:b90::/48", "35407"}, - {"2404:a140:f::/48", "138915"}, - {"2606:ec0:2000::/36", "14618"}, - {"2a02:26f7:dfc4::/48", "36183"}, - {"2a02:26f7:f604::/48", "36183"}, - {"2a04:207:100::/40", "48101"}, - {"2a0e:e1c0::/29", "15391"}, - {"2401:3c0:113::/48", "45528"}, - {"2409:8a52:700::/36", "56047"}, - {"2a01:b340::/32", "15751"}, - {"2401:d800:db10::/42", "7552"}, - {"2406:da70:c000::/40", "16509"}, - {"240a:a109::/32", "142915"}, - {"2607:f558::/32", "33189"}, - {"2607:fb90:f800::/31", "21928"}, - {"2804:198c::/32", "61802"}, - {"2804:1a68::/32", "262420"}, - {"2a06:f300::/29", "203421"}, - {"2403:c00:11::/48", "17488"}, - {"240a:60:f010::/44", "9605"}, - {"2605:a401:8bbc::/41", "33363"}, - {"2806:230:2013::/48", "11888"}, - {"240e:1:7200::/32", "4134"}, - {"2602:fef4:300::/48", "54721"}, - {"2607:fee0:4100::/32", "3599"}, - {"2a00:86c0:2076::/47", "40027"}, - {"2001:579:e1bc::/38", "22773"}, - {"2804:2314:2::/32", "262811"}, - {"2804:2fc0:4041::/34", "264910"}, - {"2a02:5ba0::/32", "203354"}, - {"2a0c:2580::/30", "211186"}, - {"2405:cc00:5000::/32", "55943"}, - {"240e:951:2400::/38", "138991"}, - {"2600:6c10:40::/44", "20115"}, - {"2803:fe00::/32", "27650"}, - {"2001:559:c15b::/48", "33491"}, - {"2001:da8:2040::/36", "23910"}, - {"2402:800:b040::/42", "7552"}, - {"2804:5fb4::/32", "269118"}, - {"2804:66e4::/32", "269589"}, - {"2001:67c:2b78::/48", "59516"}, - {"2620:171:28::/48", "42"}, - {"2804:5de4::/34", "268999"}, - {"2a02:a48:f000::/36", "49025"}, - {"2a0e:5c41::/30", "57578"}, - {"2001:67c:1268::/48", "203383"}, - {"2804:1168:1e00::/39", "52904"}, - {"2806:108e:26::/48", "8151"}, - {"2001:550:a02::/45", "174"}, - {"240a:a237::/32", "143217"}, - {"2600:9000:1133::/45", "16509"}, - {"2620:107:9000::/43", "22787"}, - {"2a00:1020:e::/32", "24739"}, - {"2a0e:2440::/29", "60781"}, - {"2a11:af01::/32", "210625"}, - {"2001:df6:5e80::/48", "142029"}, - {"2407:b0c0::/32", "131988"}, - {"2409:8000:5200::/37", "9808"}, - {"2a02:878:1::/46", "42632"}, - {"2405:8a00:200b::/42", "55824"}, - {"2603:c002:1f00::/43", "31898"}, - {"2a0e:f600::/42", "60781"}, - {"2001:559:c397::/44", "33657"}, - {"2405:9800:9812::/47", "45430"}, - {"2406:23c0::/48", "131409"}, - {"240e:878:1e0::/44", "137689"}, - {"2604:8400::/32", "25689"}, - {"2620:14::/48", "6481"}, - {"2804:9c8::/32", "262992"}, - {"2402:c800:fff3::/45", "37900"}, - {"240a:ab14::/32", "145486"}, - {"2800:bf0:8312::/35", "27947"}, - {"2a09:5e40::/29", "209424"}, - {"2a0f:3140::/29", "37540"}, - {"2001:470:84::/44", "6939"}, - {"2001:559:85d3::/45", "7922"}, - {"2001:da8:7008::/46", "24363"}, - {"2800:160:11e1::/43", "14259"}, - {"2806:266:501::/48", "27672"}, - {"2a00:c00:f030::/46", "24467"}, - {"2a00:7e40:80e::/48", "1301"}, - {"2a02:8070::/31", "3209"}, - {"2001:559:845a::/48", "33651"}, - {"2001:1318::/35", "3597"}, - {"2400:4c80::/35", "7632"}, - {"2402:800:549b::/41", "7552"}, - {"2402:3a80:1cd0::/42", "38266"}, - {"2408:8957:6c00::/40", "17622"}, - {"2606:5240:f1bf::/36", "6649"}, - {"2001:559:c1f8::/47", "7922"}, - {"2804:46cc::/32", "267012"}, - {"2001:559:c3f3::/48", "7922"}, - {"2403:7300::/32", "55891"}, - {"2606:e800:200::/39", "25843"}, - {"2607:f4e8:411::/48", "23059"}, - {"2804:4e90::/32", "268269"}, - {"2a02:5f83:d0cd::/39", "39811"}, - {"2a0b:2180:1::/48", "204995"}, - {"2804:52f4:a50::/42", "268552"}, - {"2a02:5fa0::/32", "198545"}, - {"2a0e:5880::/29", "211626"}, - {"2405:1c0:6181::/46", "55303"}, - {"240a:ae51::/32", "146315"}, - {"2607:fdf0:5e19::/45", "8008"}, - {"2a02:fa0::/32", "35191"}, - {"2408:8456:c00::/42", "17622"}, - {"2603:c012:a000::/36", "31898"}, - {"2a0e:b107:b50::/44", "213064"}, - {"2400:cb00:a2e0::/47", "13335"}, - {"240a:a3ce::/32", "143624"}, - {"2600:1008:b1d0::/42", "6167"}, - {"2602:fe19:6400::/48", "62623"}, - {"2804:3050::/32", "264943"}, - {"2409:8753:f00::/35", "56047"}, - {"2409:8c0c:400::/30", "56042"}, - {"2803:5c80:6593::/48", "64114"}, - {"2a0c:bfc0::/29", "61998"}, - {"2a11:5b00::/32", "62269"}, - {"2001:559:1c9::/48", "33652"}, - {"2001:559:711::/48", "33490"}, - {"240a:ac01::/32", "145723"}, - {"2a03:fc80::/29", "15366"}, - {"2001:df1:2600::/48", "59151"}, - {"2406:c700::/32", "9358"}, - {"2620:109:a006::/44", "15294"}, - {"2001:559:8292::/48", "33657"}, - {"2620:74:27::/48", "396566"}, - {"2a0e:2c00::/29", "63023"}, - {"2403:ba00::/34", "24521"}, - {"240a:add7::/32", "146193"}, - {"2600:100f::/32", "22394"}, - {"2806:310:18::/46", "16960"}, - {"2a03:75a0::/32", "31736"}, - {"2401:d800:f920::/41", "7552"}, - {"2404:8d06:2100::/35", "10089"}, - {"240a:a8e1::/32", "144923"}, - {"2607:f0d0:4::/46", "36351"}, - {"2a05:ba00::/32", "207595"}, - {"2a0e:46c4:2940::/48", "138435"}, - {"2001:559:84a0::/46", "33660"}, - {"2602:fd2f:10::/44", "33229"}, - {"2600:e000:8000::/38", "22995"}, - {"2a03:2d40::/38", "198056"}, - {"2a05:e5c0::/29", "200977"}, - {"2a0b:4341:a0e::/48", "57695"}, - {"2804:14c:578c::/41", "28573"}, - {"2a00:5b00::/29", "33986"}, - {"2a01:4f0:4017::/48", "31027"}, - {"2a03:efc0:700::/40", "33438"}, - {"2001:559:8129::/46", "7922"}, - {"2001:559:c0cd::/46", "33287"}, - {"2401:d800:d810::/42", "7552"}, - {"2402:800:9563::/43", "7552"}, - {"2404:8e80:2::/47", "45881"}, - {"2405:9000:91::/38", "7474"}, - {"2409:8c3c:1300::/40", "9808"}, - {"240e:874:2c0::/42", "4134"}, - {"2803:9800:a083::/43", "11664"}, - {"2600:380:f10b::/48", "64011"}, - {"2600:1402:c01::/35", "20940"}, - {"2602:feda:adb::/45", "140362"}, - {"2804:84ac::/32", "28223"}, - {"2402:76c0::/32", "137449"}, - {"2a02:fe1:d100::/29", "41164"}, - {"2a0d:2e40::/29", "208861"}, - {"2406:3000:30::/47", "4657"}, - {"2406:cf00::/48", "23724"}, - {"240e:45c:b300::/40", "140537"}, - {"2600:1801:14::/30", "16552"}, - {"2800:5f0:2001::/42", "22724"}, - {"2804:802c:201::/46", "271734"}, - {"2a06:e881:531a::/48", "209859"}, - {"2406:9680::/32", "17635"}, - {"2408:8256:316c::/48", "17816"}, - {"240e:45c:c300::/40", "140536"}, - {"2604:d600:1580::/44", "32098"}, - {"2804:2cac:bbbc::/33", "265234"}, - {"2408:8256:d98::/38", "17622"}, - {"2600:6c10:41d::/46", "20115"}, - {"2801:80:3960::/44", "270693"}, - {"2a02:ab80::/28", "21334"}, - {"2001:559:49e::/48", "33287"}, - {"2001:678:604::/48", "49824"}, - {"2602:107:910::/48", "10838"}, - {"2604:9d40:1f9::/48", "7018"}, - {"2800:160:1ff9::/46", "14259"}, - {"2a0b:7980::/29", "208272"}, - {"2001:468:ef02::/40", "11537"}, - {"2001:678:898::/48", "62445"}, - {"2406:c500:ffd2::/48", "4764"}, - {"240a:abe3::/32", "145693"}, - {"2a00:e78:7000::/36", "34602"}, - {"2409:8055:28::/48", "9808"}, - {"2804:e24:fec0::/39", "262417"}, - {"2804:415c::/32", "267428"}, - {"2806:2f0:9dc3::/42", "17072"}, - {"2a06:dc40::/29", "29182"}, - {"2a10:c80::/29", "56786"}, - {"2403:7100:a::/48", "142033"}, - {"2401:1840::/32", "136001"}, - {"2401:ff40::/32", "137080"}, - {"2804:7be8:c00a::/45", "271462"}, - {"2a00:4b00:100::/42", "41935"}, - {"2a04:dc00::/29", "56990"}, - {"2a11:5580::/29", "61192"}, - {"2a01:358:401e::/47", "9121"}, - {"2a02:2010:22a0::/45", "20978"}, - {"2a02:2e02:86d0::/39", "12479"}, - {"2a11:5d00::/29", "210863"}, - {"240e:3b8:f100::/37", "134775"}, - {"2803:7200:800e::/43", "27696"}, - {"2a0a:7240::/32", "206082"}, - {"2001:43f8:1f3::/48", "37474"}, - {"2620:fe::/48", "19281"}, - {"2001:559:8231::/48", "33650"}, - {"2405:1c0:6481::/46", "55303"}, - {"2602:80b:a001::/48", "399791"}, - {"2001:fd8:331::/41", "4775"}, - {"2001:4408:8510::/38", "4758"}, - {"2402:800:51ee::/38", "7552"}, - {"2408:8456:8e40::/39", "17816"}, - {"2804:2138::/32", "264543"}, - {"2a0b:3140::/29", "204790"}, - {"2001:bf7::/39", "44194"}, - {"2001:4878:c164::/48", "12222"}, - {"2400:cb00:80::/47", "13335"}, - {"240a:a3ea::/32", "143652"}, - {"2600:1009:a000::/43", "6167"}, - {"2a00:1910::/29", "29551"}, - {"2a0c:b642:2000::/44", "34641"}, - {"2001:67c:219c::/48", "49542"}, - {"2804:7aa4::/32", "271383"}, - {"2a06:f900::/36", "56630"}, - {"2a0d:58c0::/29", "202932"}, - {"2804:2a84::/32", "264076"}, - {"2a00:4800:1b0::/41", "8717"}, - {"2a0c:3080::/48", "204809"}, - {"2001:4488::/45", "7713"}, - {"2001:4870:a24b::/45", "3549"}, - {"2404:bf40:f801::/48", "2764"}, - {"2607:f160:a::/45", "6167"}, - {"2a0b:3901:2::/29", "58310"}, - {"2001:559:82fc::/47", "7922"}, - {"2001:559:c2d9::/48", "33657"}, - {"2001:579:e22c::/39", "22773"}, - {"2400:4000::/22", "4713"}, - {"2402:800:fb10::/42", "7552"}, - {"2602:ff96:10::/48", "26548"}, - {"2804:8520::/32", "272559"}, - {"2405:e4c0::/32", "131677"}, - {"2409:8d28::/29", "56041"}, - {"240a:a288::/32", "143298"}, - {"2804:7388::/32", "270921"}, - {"2806:265:501::/48", "13999"}, - {"240a:a601::/32", "144187"}, - {"240e:44d:6440::/42", "140348"}, - {"2804:1b08:facf::/37", "61704"}, - {"2804:2820::/32", "263942"}, - {"2804:3c58::/32", "266205"}, - {"2804:7a28::/34", "271351"}, - {"2602:fd9d::/36", "26576"}, - {"2804:1ea8::/32", "264442"}, - {"2a10:3a40::/29", "204790"}, - {"2001:4408:4500::/45", "4758"}, - {"2600:140b:4400::/48", "31109"}, - {"2a00:7180:8000::/46", "208157"}, - {"2001:559:8393::/48", "7015"}, - {"2001:1a11:14c::/48", "8781"}, - {"2402:800:b3d0::/37", "7552"}, - {"2600:380:2600::/36", "20057"}, - {"2602:fd3a:228::/48", "16509"}, - {"2620:132:f3a1::/37", "394977"}, - {"2001:559:c024::/48", "33667"}, - {"2400:cb00:a4c0::/47", "13335"}, - {"2408:84ee:c000::/27", "4837"}, - {"2804:2ec4::/32", "265365"}, - {"2804:6ef4::/34", "270629"}, - {"2a05:bec0:41::/29", "197071"}, - {"2804:7e4:8100::/33", "52865"}, - {"2804:33c0::/32", "265415"}, - {"2a06:3f40::/29", "21466"}, - {"2406:4440:f00::/43", "38008"}, - {"2600:1010:b1d0::/42", "6167"}, - {"2804:1b08::/37", "61704"}, - {"2c0e:2201::/30", "37457"}, - {"2001:44b8:1052::/47", "7545"}, - {"2402:600:1001::/32", "38515"}, - {"2402:800:9201::/44", "7552"}, - {"2620:171:13::/48", "42"}, - {"2804:8370::/32", "272198"}, - {"2a05:5000::/29", "207225"}, - {"2001:df2:3c00::/45", "63950"}, - {"2402:3a80:c059::/48", "38266"}, - {"240e:f7:7000::/36", "136190"}, - {"240e:982:a100::/38", "4812"}, - {"2804:3694::/32", "266357"}, - {"2001:559:84e2::/44", "7016"}, - {"2602:fe59:30::/48", "46432"}, - {"2804:5218::/32", "268494"}, - {"2a0d:4d00:81::/48", "62303"}, - {"2400:4d40::/47", "134204"}, - {"2402:8100:2683::/44", "55644"}, - {"2600:9000:200f::/42", "16509"}, - {"2606:4600::/32", "23118"}, - {"2804:62f0:b102::/33", "269329"}, - {"2a10:4180::/29", "399975"}, - {"240a:4092:c000::/35", "58834"}, - {"2801:124::/44", "270030"}, - {"2a01:ac00::/32", "9066"}, - {"2a03:5b80::/32", "20870"}, - {"2001:df4:9300::/48", "134305"}, - {"2406:840:e112::/48", "141712"}, - {"2a01:cde0:c010::/48", "16028"}, - {"2001:7fd::/32", "25152"}, - {"2001:df0:4b00::/48", "9723"}, - {"2409:8087:4f1::/39", "24547"}, - {"240e:244:300::/28", "4134"}, - {"2600:1405:7801::/32", "20940"}, - {"2a10:bc0::/29", "62240"}, - {"2001:df3:800::/47", "22787"}, - {"2402:800:9c8d::/42", "7552"}, - {"240a:adb2::/32", "146156"}, - {"2600:141b:5801::/37", "20940"}, - {"2600:6c33:4c2::/38", "20115"}, - {"2600:6c38:a99::/46", "20115"}, - {"2608:121:d::/32", "721"}, - {"2620:c1:4000::/48", "26988"}, - {"2804:1250:c000::/34", "263469"}, - {"2a00:5a60::/48", "199274"}, - {"2a0d:1700::/29", "30791"}, - {"2001:2000:1::/36", "1299"}, - {"2409:8008:d2::/45", "24547"}, - {"2604:2e80:2400::/38", "30036"}, - {"2604:fd80::/32", "62688"}, - {"2803:1a00:1114::/37", "262186"}, - {"2804:2cb8:40::/32", "265239"}, - {"2001:1248:a51b::/42", "11172"}, - {"2001:1900:2356::/44", "3356"}, - {"2405:9800:c91e::/48", "45458"}, - {"2804:5dec::/32", "269001"}, - {"2804:67b0::/32", "269644"}, - {"2a0c:8fc0::/32", "202401"}, - {"2a10:c280::/32", "212059"}, - {"2001:3c8:2808::/48", "141714"}, - {"240e:3ba:f700::/36", "4134"}, - {"2804:7d68::/32", "271559"}, - {"2001:67c:26c::/48", "211731"}, - {"2001:1388:6644::/35", "6147"}, - {"2401:f400::/32", "9269"}, - {"240e:106:c000::/34", "4812"}, - {"2803:3a00:1800::/37", "23243"}, - {"2803:7200:8012::/45", "27696"}, - {"2804:504c:6000::/32", "268380"}, - {"2a10:5b80::/29", "25793"}, - {"2a11:2800:4::/48", "14445"}, - {"2001:d30::/46", "4717"}, - {"2403:7f40:ff00::/48", "20473"}, - {"2804:74a8::/39", "270995"}, - {"2a07:22c1:c002::/48", "207649"}, - {"2800:160:1f95::/46", "14259"}, - {"2806:106e:5::/48", "8151"}, - {"2a02:26f7:9c::/48", "36183"}, - {"2a03:8a80::/32", "12930"}, - {"2a0a:7880:1ff::/48", "206677"}, - {"2001:250:2c13::/42", "138381"}, - {"2409:896a:3200::/39", "9808"}, - {"2600:1f70:8000::/40", "14618"}, - {"2602:fed2:7189::/48", "53356"}, - {"2605:34c0:e000::/36", "397449"}, - {"2a02:88d:8210::/44", "48695"}, - {"2001:559:5fa::/48", "7725"}, - {"2600:1417:800::/48", "24319"}, - {"2602:feda:dd0::/44", "46997"}, - {"2605:dd40:5bbc::/37", "398549"}, - {"2803:9800:988d::/41", "11664"}, - {"2806:20d:5208::/46", "32098"}, - {"2a0d:2640::/29", "60501"}, - {"2001:250:6c42::/47", "138370"}, - {"2001:550:6800:2::/38", "174"}, - {"2001:559:2e2::/48", "33287"}, - {"2602:fde6::/36", "10796"}, - {"2a0c:55c0:1::/48", "43009"}, - {"2a0c:c181::/32", "46844"}, - {"2001:67c:528::/48", "50222"}, - {"2403:0:608::/32", "4755"}, - {"2408:870c::/44", "138421"}, - {"2001:67c:988::/48", "207716"}, - {"2001:1248:a024::/44", "11172"}, - {"2404:bf40:c4c1::/39", "139084"}, - {"2604:e100:3::/45", "33028"}, - {"2606:4a00:1100::/40", "18572"}, - {"2620:100:f00d::/48", "46571"}, - {"2001:678:944::/48", "34015"}, - {"2001:708:11::/32", "1741"}, - {"2801:11:8800::/48", "19429"}, - {"2806:286:a800::/33", "265524"}, - {"2a03:16a0::/32", "15397"}, - {"2a02:d8:800d::/33", "44654"}, - {"2a02:2e02:9cf0::/39", "12479"}, - {"2a0a:be80::/29", "43391"}, - {"2a0e:b107:1134::/44", "212121"}, - {"2001:559:c406::/48", "7015"}, - {"2001:67c:1b9c::/48", "9143"}, - {"2001:bf7:870::/35", "44194"}, - {"2a01:55e4::/30", "201709"}, - {"2a0b:2900:4100::/38", "48582"}, - {"2001:df7:3480::/48", "42960"}, - {"240a:a28c::/32", "143302"}, - {"2602:fed2:fd0::/44", "49134"}, - {"2605:a401:8758::/45", "33363"}, - {"2804:37f0:e900::/35", "266445"}, - {"2c0f:e9f0::/32", "328748"}, - {"2001:559:c0f6::/47", "21508"}, - {"2402:e380:312::/48", "139073"}, - {"2404:1c40:4f::/48", "24432"}, - {"2602:feb4:180::/44", "25961"}, - {"2602:feda:da0::/44", "142055"}, - {"2001:550:210b::/38", "174"}, - {"2400:7400:76::/48", "23736"}, - {"2405:8a40::/32", "139161"}, - {"2602:fd60:ff0::/48", "137908"}, - {"2804:8420::/32", "272241"}, - {"2a03:6300::/32", "15497"}, - {"2a04:4900::/29", "64401"}, - {"2a04:a900:2::/48", "43067"}, - {"2a0b:6800::/48", "12552"}, - {"2a0f:2a40::/29", "399975"}, - {"2001:480:121::/41", "668"}, - {"2001:df4:6180::/48", "132515"}, - {"2400:8f80::/47", "45638"}, - {"2400:c540:3::/45", "59238"}, - {"2403:2300::/32", "56309"}, - {"2a02:26f7:c585::/46", "20940"}, - {"2001:559:846f::/48", "33651"}, - {"2605:c5c0::/32", "395853"}, - {"2804:5d18::/32", "268950"}, - {"2a02:2000:5::/32", "35297"}, - {"2a09:3440::/29", "400522"}, - {"2a11:3e80::/29", "204790"}, - {"2401:d800:b262::/40", "7552"}, - {"240a:ae52::/32", "146316"}, - {"2a0f:7680::/29", "42316"}, - {"2c0f:fce8::/33", "37153"}, - {"2001:2093::/20", "1299"}, - {"2402:800:969b::/42", "7552"}, - {"2a00:8a20::/32", "60745"}, - {"2a01:8840:16::/44", "12041"}, - {"2407:c300::/32", "133043"}, - {"2604:9000:2101::/32", "19693"}, - {"2001:559:c222::/48", "33667"}, - {"2001:67c:2fc4::/48", "197936"}, - {"2001:4bd8::/41", "15725"}, - {"2400:dc00:4002::/48", "131111"}, - {"2401:d800:7760::/40", "7552"}, - {"2600:140f:7800::/48", "9498"}, - {"2a02:26f7:da88::/48", "36183"}, - {"2001:1388:8a00::/44", "264684"}, - {"2402:800:3ee0::/44", "7552"}, - {"2404:4a00:7a00::/64", "55423"}, - {"240a:a07f::/32", "142777"}, - {"2a06:a000:1e0::/48", "206804"}, - {"2a10:b600::/32", "212241"}, - {"2001:579:7f07::/32", "22773"}, - {"2607:fc48:bc6b::/48", "40009"}, - {"2620:131:1005::/42", "26450"}, - {"2804:5dc:880::/32", "53019"}, - {"2001:559:2a0::/48", "20214"}, - {"2001:559:c2b8::/48", "33287"}, - {"240a:a6cb::/32", "144389"}, - {"2604:d600:157a::/45", "32098"}, - {"2607:f6f0:203::/48", "19930"}, - {"2806:2f0:2240::/39", "17072"}, - {"2a0f:5680::/47", "60906"}, - {"2001:559:c294::/48", "33667"}, - {"2001:67c:16c4::/48", "199612"}, - {"2404:7ac0:608::/48", "4842"}, - {"2404:8500::/32", "55470"}, - {"240a:aa5a::/32", "145300"}, - {"2604:7a40:1200::/34", "394710"}, - {"2605:d9c0::/32", "32361"}, - {"2607:3380::/40", "395152"}, - {"2a02:cb43:8004::/48", "20546"}, - {"2a0f:2880:100::/38", "208164"}, - {"2404:e040::/32", "63773"}, - {"2405:9800:b013::/44", "133481"}, - {"240a:ad3b::/32", "146037"}, - {"2600:1405:3001::/36", "20940"}, - {"2600:370f:5090::/42", "32261"}, - {"2603:90c8::/30", "11955"}, - {"2804:44c0::/32", "267651"}, - {"2a00:4802:3a0::/44", "13124"}, - {"2400:4d40:302::/44", "134204"}, - {"2600:1407:c01::/35", "20940"}, - {"2804:30c4:1800::/37", "264973"}, - {"2a02:ee80:41d4::/46", "3573"}, - {"2001:250:7035::/48", "24369"}, - {"2001:559:4a8::/48", "33657"}, - {"2406:340::/32", "140576"}, - {"240a:aa83::/32", "145341"}, - {"240e:30f:5600::/27", "4134"}, - {"2804:2228::/32", "264595"}, - {"2804:83a0::/32", "272209"}, - {"2a00:54c0::/32", "41966"}, - {"2407:a640::/32", "146753"}, - {"2602:ff05::/36", "55009"}, - {"2804:20fc::/42", "264525"}, - {"2804:5cb8::/32", "268926"}, - {"2001:559:5dc::/48", "7922"}, - {"2409:8904:9090::/39", "24547"}, - {"2800:320:8003::/48", "27882"}, - {"2801:80:2a00::/44", "271107"}, - {"2804:5278::/32", "268520"}, - {"2804:6928::/32", "270252"}, - {"2a04:2b00:14bb::/48", "204055"}, - {"2001:c20:c816::/48", "3758"}, - {"2402:800:3571::/44", "7552"}, - {"2602:107:2c10::/48", "20115"}, - {"2a06:2980::/29", "42695"}, - {"2a0c:58c0::/29", "205254"}, - {"2405:9200:2100::/41", "131596"}, - {"2409:8055:55::/44", "56040"}, - {"2620:20:a000::/48", "16539"}, - {"2800:5f0:203b::/45", "22724"}, - {"2803:cae0:2::/48", "27951"}, - {"2804:1a94::/32", "61869"}, - {"2a07:7800:2::/48", "31727"}, - {"2a09:7::/48", "43959"}, - {"2a0a:aec0::/29", "6830"}, - {"2001:559:3ee::/48", "33491"}, - {"2804:3c9c::/32", "266224"}, - {"2001:250:fe01::/48", "24372"}, - {"2405:8a00:6036::/35", "55824"}, - {"2406:9600::/32", "10208"}, - {"2602:ff01::/48", "396101"}, - {"2607:fb10:70e0::/47", "2906"}, - {"2804:7da8::/32", "271575"}, - {"2a01:c9c0:8010::/48", "2285"}, - {"2407:4ec0::/45", "134012"}, - {"2408:8459:ed50::/38", "17816"}, - {"2409:8c28:2809::/39", "56041"}, - {"240a:a1e8::/32", "143138"}, - {"240e:438:9e40::/34", "4134"}, - {"2803:db00:a81::/32", "262234"}, - {"2804:1e60::/32", "264425"}, - {"2a05:ad00::/29", "56803"}, - {"2a06:5400::/29", "62341"}, - {"2001:1248:a002::/48", "11172"}, - {"2001:12f0:dc0::/38", "1916"}, - {"240a:a856::/32", "144784"}, - {"2a06:a004:8000::/33", "44570"}, - {"2406:45c0::/32", "64300"}, - {"2605:99c0::/32", "394775"}, - {"2800:3c0:2060::/40", "19863"}, - {"2804:4c7c::/32", "267373"}, - {"2600:9000:2170::/40", "16509"}, - {"2620:ee:8000::/48", "16881"}, - {"2804:104c:8800::/40", "263629"}, - {"2001:1a11:145::/48", "42298"}, - {"2620:0:2f00::/41", "693"}, - {"2803:5b20:2000::/33", "27735"}, - {"2402:ef19::/39", "7633"}, - {"2804:79d4::/32", "271330"}, - {"2403:9800:7800::/38", "4771"}, - {"240a:a739::/32", "144499"}, - {"2a06:52c0:1::/46", "201483"}, - {"2001:3c8:4008::/35", "4621"}, - {"2001:16a2:c3a0::/41", "39386"}, - {"240a:a3c9::/32", "143619"}, - {"2604:ee00::/48", "18865"}, - {"2620:13d:d000::/44", "6461"}, - {"2804:84cc:2100::/33", "272541"}, - {"2403:fbc0:2000::/48", "23959"}, - {"2804:37f0:1900::/34", "266445"}, - {"240a:a1cf::/32", "143113"}, - {"2600:380:b380::/37", "20057"}, - {"2801:0:180::/48", "19429"}, - {"2a02:26f7:bd01::/46", "20940"}, - {"2a0e:aa06:400::/45", "209306"}, - {"2001:67c:29ec::/48", "58298"}, - {"2402:5080::/32", "133959"}, - {"2408:8645:1200::/32", "4837"}, - {"2610:a1:1071::/48", "397228"}, - {"2a03:2881:3::/43", "32934"}, - {"240a:a331::/32", "143467"}, - {"240a:adf8::/32", "146226"}, - {"2600:1408:6401::/36", "20940"}, - {"2600:3006:1400::/31", "13649"}, - {"2600:370f:7265::/44", "32261"}, - {"2620:79:3::/45", "30013"}, - {"2620:11a:c081::/48", "394192"}, - {"2801:1e:e800::/48", "262186"}, - {"2804:6dc4::/32", "270554"}, - {"2409:8a15:3c00::/32", "56044"}, - {"240a:a017::/32", "142673"}, - {"2a01:7a0::/30", "29066"}, - {"2001:4de0:2000::/39", "33438"}, - {"2402:2f80:5::/46", "134451"}, - {"2001:559:845d::/48", "33667"}, - {"2404:e801:2015::/44", "55430"}, - {"2408:8256:1796::/41", "17622"}, - {"2a03:90c0:5d0::/42", "199524"}, - {"2a04:d480::/35", "25291"}, - {"2a07:fa00::/29", "8888"}, - {"2001:4490:da00::/46", "9829"}, - {"2804:268::/32", "262812"}, - {"2804:7fe4::/32", "271716"}, - {"2a02:120:2::/48", "41887"}, - {"2001:559:c2a7::/48", "21508"}, - {"2403:a040:1688::/48", "38047"}, - {"240e:925:4000::/30", "4134"}, - {"2a0c:1040::/29", "204382"}, - {"2a0e:b107:1600::/44", "210842"}, - {"2a0f:9400:800f::/48", "211767"}, - {"2607:d100::/32", "394844"}, - {"2001:4878:2215::/46", "12222"}, - {"2400:cb00:a880::/47", "13335"}, - {"2407:39c0::/32", "133653"}, - {"240a:a9e7::/32", "145185"}, - {"2607:ffd8:213::/48", "17048"}, - {"2804:568::/37", "262514"}, - {"2804:3ac0::/32", "266107"}, - {"2a03:5640:f51a::/42", "2906"}, - {"2001:250:813::/48", "138182"}, - {"2001:da8:4022::/44", "24353"}, - {"2001:16a2:c200::/44", "39891"}, - {"2408:8256:668::/39", "17622"}, - {"2409:8054:10::/48", "9808"}, - {"2605:64c0:2::/32", "63294"}, - {"2804:7b44::/32", "271421"}, - {"2001:67c:11ac::/48", "199470"}, - {"2a00:b3a1::/32", "31027"}, - {"2a02:c6c7::/32", "58061"}, - {"2a0f:f40::/29", "60262"}, - {"2409:8a29::/27", "9808"}, - {"2600:40f0:f::/40", "701"}, - {"2803:b3a0::/32", "267755"}, - {"2803:b510::/32", "272032"}, - {"2804:4780::/32", "267058"}, - {"2a01:190:151f::/40", "1764"}, - {"2a0c:9a40:8020::/44", "212925"}, - {"240a:a247::/32", "143233"}, - {"240e:3b9:5600::/34", "4134"}, - {"2620:115:10::/41", "18888"}, - {"2a00:bfc0::/35", "34757"}, - {"2a0e:fd40:200::/48", "60557"}, - {"2402:800:9c55::/42", "7552"}, - {"2606:f900:ae01::/33", "812"}, - {"2801:be::/32", "263610"}, - {"2804:850c::/32", "272554"}, - {"2a02:2168::/29", "42610"}, - {"2001:df5:c780::/48", "137033"}, - {"2606:18c0::/48", "14445"}, - {"2804:50fc::/34", "268423"}, - {"2c0f:e8e0:40d0::/34", "327926"}, - {"2001:4878:a228::/48", "12222"}, - {"2402:800:320f::/43", "7552"}, - {"2409:8904:d490::/39", "24547"}, - {"2605:a401:875e::/40", "33363"}, - {"2804:1094::/32", "263641"}, - {"2804:6f18::/32", "270638"}, - {"2804:333c::/32", "265383"}, - {"2a0e:fb47::/32", "29182"}, - {"2001:500:20a::/45", "394353"}, - {"2600:1407:b::/43", "20940"}, - {"2600:140b:9801::/38", "20940"}, - {"2602:fc51::/48", "399114"}, - {"2800:440:8004::/48", "27738"}, - {"2804:48cc::/32", "267145"}, - {"2001:559:84c6::/48", "20214"}, - {"2620:153::/40", "6498"}, - {"2001:49f0:d099::/46", "174"}, - {"2401:d800:5a60::/40", "7552"}, - {"2409:8d80:3000::/33", "9808"}, - {"2607:1d00::/32", "63003"}, - {"2804:405c::/32", "265954"}, - {"2404:9ec0:114::/48", "138919"}, - {"240a:afe5::/32", "146719"}, - {"2602:fcf6:ffc::/48", "210902"}, - {"2a02:808::/29", "35311"}, - {"2a03:a100::/32", "56635"}, - {"2a11:a780::/29", "204790"}, - {"2600:100d:9e10::/40", "22394"}, - {"2a10:5500::/34", "33874"}, - {"2001:470:34::/41", "6939"}, - {"2001:1388:14c4::/36", "6147"}, - {"2404:4c40::/32", "134937"}, - {"2a01:cd00:c000::/41", "28708"}, - {"2001:12ff::/32", "22548"}, - {"240a:aa46::/32", "145280"}, - {"240e:974:1201::/32", "4134"}, - {"2600:6000::/32", "12271"}, - {"2620:7f:e000::/48", "394719"}, - {"2804:196c::/32", "61794"}, - {"2804:4bd8:88::/37", "267332"}, - {"2a00:1ac0::/32", "35260"}, - {"2407:7a40::/32", "142412"}, - {"2a0a:2842:d853::/48", "136796"}, - {"2a0e:97c0:565::/46", "210659"}, - {"2001:4868:225::/37", "701"}, - {"2401:d800:2920::/41", "7552"}, - {"2403:6000:200::/36", "24085"}, - {"2404:af80:14::/47", "38026"}, - {"2407:2140::/32", "141532"}, - {"2605:aa40:c1e4::/48", "18792"}, - {"2a0f:78c0::/29", "205322"}, - {"2605:a401:8c7c::/40", "33363"}, - {"2804:1e58:4::/33", "264422"}, - {"2804:33c8::/32", "265417"}, - {"2a00:c700:c000::/34", "47609"}, - {"2a02:26f7:b78c::/48", "36183"}, - {"2a05:b0c6:6000::/48", "211139"}, - {"2600:140f:c801::/38", "20940"}, - {"2804:1834::/32", "61923"}, - {"2804:4614:e000::/35", "266967"}, - {"2a09:7c40::/32", "43624"}, - {"2a0c:7e42:993c::/48", "20473"}, - {"2001:288::/32", "1659"}, - {"2001:678:22c::/48", "25419"}, - {"2001:67c:144::/48", "41887"}, - {"2001:da8:ef01::/35", "23910"}, - {"2401:af80:9016::/33", "59103"}, - {"2402:6980::/32", "59278"}, - {"2602:fed2:710c::/48", "202479"}, - {"2606:2800:4247::/48", "15133"}, - {"2800:160:160a::/47", "14259"}, - {"2a02:17b8::/32", "34040"}, - {"2a02:26f7:e585::/46", "20940"}, - {"2a0f:3a00::/29", "8647"}, - {"2001:67c:1591::/48", "61317"}, - {"2407:5040:2100::/32", "134715"}, - {"2606:1a40::/45", "398962"}, - {"2620:112:3000::/44", "36459"}, - {"2620:149:a11::/48", "714"}, - {"2800:160:174c::/43", "14259"}, - {"2a02:26f7:b986::/47", "20940"}, - {"2a0c:a9c7:1::/48", "12938"}, - {"2a0f:11c0::/29", "45671"}, - {"2606:4f00:2::/48", "19324"}, - {"2800:300:6240::/37", "27651"}, - {"2a02:2310::/32", "39817"}, - {"2a04:e00:1e::/47", "54103"}, - {"2001:559:c513::/44", "7922"}, - {"2407:a800:3e11::/51", "3949"}, - {"2600:6c20:a92::/45", "20115"}, - {"2804:7188::/32", "270795"}, - {"2a09:7:2006::/48", "205758"}, - {"240a:a3a4::/32", "143582"}, - {"240e:982:d500::/40", "134769"}, - {"2602:fed2:711b::/48", "210715"}, - {"2804:d78::/32", "262444"}, - {"2a03:5d00::/30", "29399"}, - {"2a05:a840::/29", "29424"}, - {"2a12:a540::/29", "400522"}, - {"240a:a676::/32", "144304"}, - {"2600:1003:9440::/44", "6167"}, - {"2600:1806:311::/48", "16552"}, - {"2a00:1110::/29", "5483"}, - {"2a00:1928::/32", "12898"}, - {"2a0e:97c0:2bf::/48", "211553"}, - {"2001:250:400c::/43", "24358"}, - {"2401:4900:4020::/44", "45609"}, - {"2402:e280:2107::/44", "134674"}, - {"2a06:2a80::/29", "201791"}, - {"2001:b08:19::/48", "197467"}, - {"2402:ef21::/36", "7633"}, - {"240e:44d:1000::/42", "140345"}, - {"2a02:2e02:8a10::/40", "12479"}, - {"2a0d:2146:9900::/40", "56894"}, - {"2a0d:e4c4:c000::/34", "208861"}, - {"2400:cb00:a550::/46", "13335"}, - {"240a:a280::/32", "143290"}, - {"2600:5c00:21d0::/48", "20001"}, - {"2607:2c00:9000::/33", "14265"}, - {"2607:ffb0:5001::/46", "6327"}, - {"2804:14d:ac92::/47", "28573"}, - {"2804:95c::/32", "28654"}, - {"2a00:1480:3::/48", "50819"}, - {"240e:3b1:9c00::/34", "140310"}, - {"2607:f710:35::/48", "19624"}, - {"2800:160:1e38::/47", "14259"}, - {"2804:5a78::/32", "268775"}, - {"2a00:e300::/32", "43711"}, - {"2001:67c:25ac::/48", "24597"}, - {"2a02:9e0::/32", "25459"}, - {"2800:110:1020::/48", "61496"}, - {"2804:36f4::/32", "266382"}, - {"2001:4158::/29", "8201"}, - {"2001:4908::/32", "7029"}, - {"2001:4998:170::/48", "10880"}, - {"240a:a1f7::/32", "143153"}, - {"2001:460:a::/41", "3561"}, - {"2001:678:c4::/48", "9066"}, - {"2408:8878::/31", "4837"}, - {"2602:ff65::/36", "33083"}, - {"2620:13f:7008::/48", "51439"}, - {"2a05:1080:10::/48", "61004"}, - {"2001:da8:b010::/48", "23910"}, - {"2804:3b0::/33", "53062"}, - {"2a03:2f00::/32", "29467"}, - {"2001:559:82b6::/48", "7922"}, - {"2800:bf0:a80a::/45", "52257"}, - {"2a0b:b600:2000::/38", "57758"}, - {"2001:13b4:4005::/32", "3356"}, - {"2a0b:2600::/29", "57878"}, - {"2a0b:2900:216d::/40", "48582"}, - {"2a11:7ec0::/29", "204790"}, - {"2001:df4:1b80::/48", "140874"}, - {"240a:a3f9::/32", "143667"}, - {"2804:35f8::/32", "266318"}, - {"2804:4400::/32", "267615"}, - {"2001:559:32f::/48", "33491"}, - {"2404:34c0:2::/48", "138536"}, - {"2409:801e:3009::/45", "9808"}, - {"2606:42c0::/40", "399078"}, - {"2804:2d0c::/40", "262408"}, - {"2a01:8840:f::/48", "40490"}, - {"2a04:c147::/32", "60786"}, - {"2001:67c:2138::/48", "31348"}, - {"2401:d800:5d02::/42", "7552"}, - {"2402:a300:23e8::/48", "55427"}, - {"240a:aadc::/32", "145430"}, - {"2602:fb9d:80::/48", "400554"}, - {"2a09:4e01::/30", "210625"}, - {"2402:800:f380::/42", "7552"}, - {"2001:559:81e8::/48", "33489"}, - {"2001:559:86e2::/48", "33659"}, - {"2604:bb80::/38", "14602"}, - {"2001:1248:5a8d::/43", "11172"}, - {"2001:1a11:87::/43", "42298"}, - {"2406:840:e10f::/48", "134477"}, - {"2409:8a7b::/29", "9808"}, - {"2600:1406:5000::/48", "35994"}, - {"2800:160:1bab::/43", "14259"}, - {"2a00:d78::/32", "1140"}, - {"2c0f:eb00:800::/39", "61266"}, - {"2c0f:fd28::/32", "29091"}, - {"2408:8256:3380::/43", "17623"}, - {"2409:8904:e240::/42", "24547"}, - {"2800:160::/46", "14259"}, - {"2a02:26f7:f6e8::/47", "36183"}, - {"2a04:f580:9270::/48", "4809"}, - {"2001:16a2:803c::/39", "39386"}, - {"2600:1417:6d::/46", "9498"}, - {"2602:fe26::/36", "53740"}, - {"2620:129:1009::/48", "36821"}, - {"2800:160:1857::/44", "14259"}, - {"2001:67c:1134::/48", "205915"}, - {"2001:da8:c000::/44", "24354"}, - {"2001:19f0:c000::/38", "20473"}, - {"2605:41c0:300::/40", "397042"}, - {"2a02:26f7:cfc8::/48", "36183"}, - {"2a03:a420::/32", "51007"}, - {"2a0d:ac00::/48", "205202"}, - {"2001:500:122::/47", "396574"}, - {"2001:559:c382::/48", "13367"}, - {"2401:2880::/32", "17452"}, - {"2401:d800:f530::/41", "7552"}, - {"2604:8540:fc00::/48", "33353"}, - {"2605:4c40:223::/41", "30081"}, - {"2606:4ec0::/32", "399551"}, - {"2804:7998::/32", "271315"}, - {"2a0a:f586::/32", "51837"}, - {"2403:5400::/35", "38450"}, - {"2602:fffa::/36", "29889"}, - {"2804:248:4003::/45", "28598"}, - {"2804:8234::/32", "272505"}, - {"2806:230:6033::/48", "11888"}, - {"2a00:9800::/32", "25227"}, - {"2001:67c:17c0::/48", "204896"}, - {"240a:ad1f::/32", "146009"}, - {"2a02:20f8::/32", "34510"}, - {"2a02:26f7:d::/48", "20940"}, - {"2001:42d0:7a00::/44", "33764"}, - {"2402:800:39c5::/43", "7552"}, - {"2404:bf40:8a00::/47", "7545"}, - {"2409:8a74:1000::/32", "9808"}, - {"2600:370f:5064::/46", "32261"}, - {"2620:0:1654::/48", "6984"}, - {"2804:588::/32", "53014"}, - {"2804:7918::/36", "271743"}, - {"2a00:1230::/29", "20902"}, - {"2402:800:3963::/43", "7552"}, - {"2408:8956:1800::/39", "17622"}, - {"2804:1d0::/32", "262770"}, - {"2a02:c180:1fff::/48", "701"}, - {"2a02:26f7:f648::/48", "36183"}, - {"2404:7f40::/48", "138645"}, - {"2602:ffbc:1::/48", "16628"}, - {"2800:160:783f::/32", "14259"}, - {"2c0f:f6d0:29::/46", "327687"}, - {"2001:67c:484::/48", "35044"}, - {"240e:67e:e200::/39", "140329"}, - {"2607:6b80:1::/46", "46562"}, - {"2607:ff58::/32", "40475"}, - {"2a02:9010:6d::/43", "3352"}, - {"2600:d05:4000::/30", "20161"}, - {"2607:ffd8::/38", "33333"}, - {"2a01:358:401c::/47", "9121"}, - {"2a09:1780::/34", "205718"}, - {"2a10:2f01:3df::/48", "134666"}, - {"2400:9380:9ac0::/44", "136167"}, - {"2620:bc:4000::/48", "394858"}, - {"2a07:6c0::/29", "62116"}, - {"2a0f:fa40::/29", "213162"}, - {"2600:1005:a020::/40", "22394"}, - {"2a09:be40:b200::/40", "34641"}, - {"2a09:e683:4::/48", "213143"}, - {"2a0b:f300:4::/37", "62240"}, - {"2001:559:c113::/48", "7922"}, - {"2a06:a8c0:1::/48", "29017"}, - {"2001:250:4418::/38", "23910"}, - {"2001:559:8093::/48", "7922"}, - {"2001:67c:2918::/48", "212034"}, - {"2001:df7:8380::/48", "131990"}, - {"2409:895a:83f0::/44", "9808"}, - {"2a09:4c0:2d01::/33", "58057"}, - {"240c:ca23::/32", "138371"}, - {"2606:8180::/32", "31769"}, - {"2804:2888:4000::/32", "263967"}, - {"2a11:8f00::/29", "60345"}, - {"2001:67c:12b4::/48", "200564"}, - {"2a00:12a8::/29", "6855"}, - {"2c0f:f400:10fe::/47", "3741"}, - {"240a:aa85::/32", "145343"}, - {"2001:559:87ff::/48", "33651"}, - {"2401:2d00:10::/48", "17625"}, - {"240e:13:803::/48", "140855"}, - {"2001:da8:a022::/48", "23910"}, - {"2400:8b00:c00::/42", "45727"}, - {"2401:1c00:3081::/41", "38809"}, - {"2409:40f3::/29", "55836"}, - {"2409:8080:2aaf::/48", "56040"}, - {"2a0c:a9c7:166::/48", "45029"}, - {"2401:300::/32", "4658"}, - {"2a05:3600::/29", "201290"}, - {"2a07:d881::/30", "43357"}, - {"2a11:9e00::/29", "204790"}, - {"2001:4370::/32", "36915"}, - {"2607:fdf8:1c1::/38", "13649"}, - {"2800:160:1cbc::/41", "14259"}, - {"2800:bf0:282a::/43", "52257"}, - {"2a02:26f7:e8::/48", "36183"}, - {"2a11:3980::/29", "34734"}, - {"2607:f740:14::/46", "36236"}, - {"2804:31b4::/32", "265032"}, - {"2a05:4140:181::/48", "211358"}, - {"2001:df4:ac00::/48", "134347"}, - {"2407:fe80:200::/32", "134749"}, - {"240e:67c:e600::/31", "4134"}, - {"2801:b8::/32", "52886"}, - {"2804:269c:fe45::/48", "47065"}, - {"2a03:5b00::/32", "202695"}, - {"240e:808::/27", "4134"}, - {"2600:6c21:41a::/40", "20115"}, - {"2620:113:8000::/41", "3680"}, - {"2804:84fc:900::/35", "272550"}, - {"2a03:9c40:600::/48", "34655"}, - {"2a07:a980::/32", "1764"}, - {"2a0a:a3c0::/40", "41955"}, - {"240e:f9:8000::/34", "134773"}, - {"2803:2180:8000::/33", "27941"}, - {"2804:1d48::/32", "264358"}, - {"2804:6e04::/35", "270570"}, - {"2804:3bc4::/32", "266169"}, - {"2400:8b00:1800::/42", "45727"}, - {"2607:f140::/32", "25"}, - {"2a02:26f7:b994::/48", "36183"}, - {"2604:4d40:3a00::/40", "213073"}, - {"2800:160:123e::/41", "14259"}, - {"2a00:1ca8:46::/43", "50673"}, - {"2a0b:86c3::/29", "202120"}, - {"2a10:a240::/29", "211694"}, - {"2c0f:f548::/32", "327963"}, - {"2803:9800:a898::/41", "11664"}, - {"2804:3acc::/32", "266110"}, - {"2804:7e48::/32", "271614"}, - {"2001:67c:6fc::/48", "29551"}, - {"2804:15c::/32", "11835"}, - {"2001:fb0:109f:14::/64", "36040"}, - {"2402:8100:20da::/45", "55644"}, - {"2406:4540::/32", "140464"}, - {"2001:559:7d6::/48", "33491"}, - {"2400:4e80:1001::/33", "131584"}, - {"2401:d800:d122::/41", "7552"}, - {"2404:3d00:40a5::/46", "3573"}, - {"2610:20:8020::/44", "40623"}, - {"2804:6918:5000::/32", "270248"}, - {"2a09:bac0:20::/46", "13335"}, - {"2001:559:c2b6::/48", "7016"}, - {"2401:8800:c06::/40", "17439"}, - {"2409:804c:900::/35", "9808"}, - {"2605:3380:ffff::/48", "12025"}, - {"2804:1ad8::/32", "52589"}, - {"2804:47a0::/35", "267066"}, - {"2001:559:c273::/48", "33287"}, - {"2001:678:780::/48", "201626"}, - {"2a01:7080:25::/46", "42848"}, - {"2001:9e8::/34", "8881"}, - {"2001:df2:8c80::/48", "137655"}, - {"2001:1b78::/32", "28855"}, - {"2404:3d00:4144::/47", "21433"}, - {"2404:c000:4004::/47", "55818"}, - {"2600:141b:9001::/36", "20940"}, - {"2600:40f0:a::/48", "7046"}, - {"2806:2f0:4723::/41", "17072"}, - {"2a00:5c60:e::/47", "43329"}, - {"2001:559:244::/48", "7016"}, - {"2001:df7:6400::/48", "134809"}, - {"2402:fa80::/32", "24516"}, - {"240a:a481::/32", "143803"}, - {"2600:3001:25::/46", "13649"}, - {"2604:af80:2048::/37", "18859"}, - {"2800:440:34::/47", "27738"}, - {"2a02:26f7:f90d::/42", "20940"}, - {"2402:a300:8000::/45", "55427"}, - {"240a:a00f::/32", "142665"}, - {"2600:1413:e000::/48", "24319"}, - {"2a04:ac00:4::/48", "201848"}, - {"2001:559:c2d6::/47", "7922"}, - {"2001:c38:4000::/36", "9931"}, - {"2404:8680:1000::/36", "135161"}, - {"240a:a38a::/32", "143556"}, - {"2804:4370::/32", "267570"}, - {"2a03:4940::/32", "3292"}, - {"2a0c:b641:170::/44", "211364"}, - {"2001:1248:5992::/42", "11172"}, - {"2800:160:116f::/43", "14259"}, - {"2804:66d8::/32", "269586"}, - {"2804:7260::/32", "52926"}, - {"2a02:888:52::/47", "48695"}, - {"2a04:e3c0::/29", "57736"}, - {"2a0a:7d80:f::/48", "6697"}, - {"2a00:1ce8::/32", "34525"}, - {"2001:678:d8::/48", "35407"}, - {"2001:978:3b00:3::/37", "174"}, - {"2001:1248:98b6::/48", "11172"}, - {"2405:84c0:faab::/41", "9886"}, - {"2406:2400:1000::/48", "45287"}, - {"2408:8456:6c00::/42", "17622"}, - {"2a06:9500:8::/29", "204028"}, - {"2001:67c:1270::/48", "20712"}, - {"2803:480:6::/32", "52458"}, - {"2a00:10a0:7::/44", "35745"}, - {"2a03:2880:f055::/44", "32934"}, - {"2a0b:bc7::/32", "39122"}, - {"2a0d:9b80:fe::/47", "43519"}, - {"2409:8019:4000::/32", "9808"}, - {"2600:1419:7c01::/38", "20940"}, - {"2806:2f0:7301::/46", "17072"}, - {"2a02:26f0:c200::/48", "34164"}, - {"2404:bf00:8000::/40", "9303"}, - {"2600:6c38:b76::/47", "20115"}, - {"2605:f500:10a::/43", "1828"}, - {"2800:160:1b8e::/43", "14259"}, - {"2001:67c:17a0::/48", "24929"}, - {"2409:8704:e300::/31", "24547"}, - {"2409:8904:e0b0::/39", "24547"}, - {"2409:8e44::/28", "24445"}, - {"2a00:f8c0::/32", "198288"}, - {"2001:579:f0bf::/41", "22773"}, - {"2001:1248:9a93::/42", "11172"}, - {"2001:1b70:82a3::/48", "158"}, - {"2603:c002:9610::/39", "31898"}, - {"2620:4e:2000::/48", "14694"}, - {"2800:160:1d52::/44", "14259"}, - {"2a03:5a00:3b::/48", "60299"}, - {"2001:13d0:1300::/31", "7303"}, - {"2806:105e:1::/48", "8151"}, - {"2001:678:60c::/48", "207608"}, - {"2001:67c:9c::/48", "35733"}, - {"2001:67c:8a4::/48", "210648"}, - {"2001:1a10:c2::/44", "8781"}, - {"2405:9800:7::/48", "45458"}, - {"2620:115:83::/41", "18888"}, - {"2800:e00::/34", "27665"}, - {"2801:80:17a1::/43", "61580"}, - {"2400:cb00:303::/45", "13335"}, - {"2403:89c0::/48", "55824"}, - {"240a:aa18::/32", "145234"}, - {"2604:b180:40::/44", "23278"}, - {"2800:2a0::/38", "27947"}, - {"2a01:b740:a80::/35", "714"}, - {"2a03:3600::/32", "49285"}, - {"2a05:d050:9040::/44", "16509"}, - {"2001:2001:6000::/40", "1759"}, - {"2402:800:929b::/42", "7552"}, - {"240a:ace0::/32", "145946"}, - {"2620:12d:400b::/45", "395853"}, - {"2806:230:2041::/48", "11888"}, - {"2001:1248:9aae::/43", "11172"}, - {"2401:d800:b940::/42", "7552"}, - {"2402:e280:2246::/44", "134674"}, - {"240a:ad9a::/32", "146132"}, - {"2801:1e:4800::/48", "269792"}, - {"2804:3da4:1100::/32", "266544"}, - {"2a00:1ba0:2::/48", "6720"}, - {"2a02:26f7:ad::/48", "20940"}, - {"2a02:26f7:c808::/48", "36183"}, - {"2a09:bac0:151::/44", "13335"}, - {"2001:df0:ab00::/48", "4739"}, - {"2402:800:3471::/44", "7552"}, - {"2406:da70:1000::/40", "16509"}, - {"240e:109:8022::/48", "58466"}, - {"2607:f6a0::/32", "11563"}, - {"2a01:7c8:f0::/46", "34762"}, - {"2a0e:8f02:212e::/47", "211635"}, - {"2409:8c70:3ab0::/44", "140105"}, - {"2804:1624:2000::/32", "263270"}, - {"2a0f:dc0::/29", "60262"}, - {"2001:559:8345::/48", "22258"}, - {"2001:559:83b2::/48", "33659"}, - {"2408:805d::/44", "17623"}, - {"2408:80f1:250::/40", "17621"}, - {"2605:7900:16::/44", "19133"}, - {"2804:34dc::/32", "265485"}, - {"2a02:888:143::/48", "47794"}, - {"2a02:ac80:e001::/35", "25145"}, - {"2a04:c442:8300::/36", "2534"}, - {"2001:559:83cf::/48", "7725"}, - {"2a01:3f0::/31", "8674"}, - {"2603:fa10::/26", "397165"}, - {"2803:c180:2210::/39", "52341"}, - {"2001:678:958::/48", "197069"}, - {"2804:1c24::/32", "28670"}, - {"2a02:26f7:f70c::/48", "36183"}, - {"2a0f:fa80::/29", "60262"}, - {"2001:559:84d2::/48", "33491"}, - {"240a:acce::/32", "145928"}, - {"2604:8ac0::/32", "35889"}, - {"2a03:5e00::/32", "203975"}, - {"2a0a:2306:f000::/45", "20853"}, - {"2001:559:354::/47", "7922"}, - {"2001:1401::/29", "9201"}, - {"2400:ee00:ffff::/48", "17962"}, - {"2605:a404:74a::/40", "33363"}, - {"2803:e360::/32", "264824"}, - {"2804:658::/32", "262578"}, - {"2804:1e08::/32", "264406"}, - {"2a02:26f7:6f::/48", "20940"}, - {"240a:abfa::/32", "145716"}, - {"2a01:5041:2002::/48", "202196"}, - {"2803:8920::/33", "266673"}, - {"2a02:26f7:d250::/48", "36183"}, - {"2404:4a00:6000:1::/37", "45629"}, - {"2405:c0:50::/48", "138881"}, - {"2620:10c:7009::/45", "2906"}, - {"2a02:88d:803f::/40", "47794"}, - {"2001:559:8384::/48", "33491"}, - {"2001:da8:901f::/36", "23910"}, - {"240e:5f:600f::/48", "134774"}, - {"2001:5a0:3f07::/33", "6453"}, - {"2408:8459:250::/37", "17816"}, - {"2600:380:e880::/41", "20057"}, - {"2600:1007:b150::/40", "22394"}, - {"2a09:5fc0::/29", "35360"}, - {"2a11:3a80::/29", "34734"}, - {"2001:559:85::/46", "7922"}, - {"2400:d8c0::/32", "38525"}, - {"2409:8d63::/28", "9808"}, - {"240e:6b0:1000::/32", "4134"}, - {"2a06:800::/40", "207257"}, - {"2001:559:8405::/48", "7725"}, - {"2001:bf0:c000::/35", "29670"}, - {"240a:ac30::/32", "145770"}, - {"240a:ad9d::/32", "146135"}, - {"2600:1fa0:4080::/41", "16509"}, - {"2801:80:35c0::/47", "269086"}, - {"2804:3e40:f400::/36", "266583"}, - {"2a0e:2240:3::/48", "1239"}, - {"2001:559:14b::/48", "33660"}, - {"2001:559:462::/48", "33652"}, - {"2403:300:1540::/36", "714"}, - {"240a:a7bf::/32", "144633"}, - {"240e:958:1000::/40", "142608"}, - {"2603:f870::/24", "397165"}, - {"2a0e:fd45:a00::/40", "44541"}, - {"2a0f:85c1:214::/48", "206751"}, - {"2001:1af8:4411::/32", "60781"}, - {"2403:27c0:c03::/48", "139866"}, - {"2406:7400:50::/44", "24309"}, - {"2409:8915:4e00::/39", "56044"}, - {"2a0f:ca84::/40", "208046"}, - {"2001:550:4a03::/37", "174"}, - {"2001:da8:2d03::/38", "23910"}, - {"2001:44b8:403c::/47", "7545"}, - {"2001:4b27:ffff::49/48", "34288"}, - {"240a:a77e::/32", "144568"}, - {"2603:c002:9f20::/34", "31898"}, - {"2804:37f0:3900::/33", "266445"}, - {"2a02:f406:fe90::/48", "206283"}, - {"2001:678:f08::/48", "202325"}, - {"2406:840:f900::/48", "139833"}, - {"2600:100a:f100::/44", "6167"}, - {"2a0e:8f02:20fa::/45", "212008"}, - {"2001:559:8074::/48", "7922"}, - {"2001:4160::/32", "8586"}, - {"2408:8956:400::/40", "17622"}, - {"2409:8d44::/28", "24445"}, - {"2408:8256:317f::/48", "17816"}, - {"2409:8924:af00::/35", "56046"}, - {"240a:a44e::/32", "143752"}, - {"2a02:26f7:f789::/46", "20940"}, - {"2a05:dfc7:7::/48", "61138"}, - {"2001:559:83e2::/48", "33660"}, - {"2404:ab00::/32", "132347"}, - {"2620:30:6000::/48", "14936"}, - {"2804:1be8::/32", "61756"}, - {"2a04:4e40:4600::/48", "54113"}, - {"2803:de80::/32", "262186"}, - {"2a0a:7540::/46", "206066"}, - {"2407:ef00:911::/42", "12422"}, - {"240a:aaa6::/32", "145376"}, - {"240e:14:8000::/36", "140329"}, - {"2620:1ec:a::/45", "8068"}, - {"2a01:5b0:7::/48", "8391"}, - {"2001:df1:3b80::/48", "139609"}, - {"2a02:26f7:e548::/48", "36183"}, - {"2a0b:7d80::/29", "59889"}, - {"2400:3080::/32", "55424"}, - {"2401:b0c0:a::/48", "136941"}, - {"2602:fc5d:c0a::/48", "399866"}, - {"2605:a404:85a::/40", "33363"}, - {"2001:df0:a180::/48", "135977"}, - {"2001:e20::/32", "17435"}, - {"2001:4d20::/33", "8569"}, - {"2400:c540:53::/48", "59238"}, - {"2406:4b00:b::/32", "132602"}, - {"2803:5ee0::/32", "269986"}, - {"2a00:ed20::/32", "64401"}, - {"2a03:42c0::/32", "50818"}, - {"2a0e:fd45:b30::/48", "42831"}, - {"2a10:4440::/29", "212693"}, - {"2001:559:85b3::/48", "7015"}, - {"2001:be8::/32", "13189"}, - {"2804:56b4:1000::/34", "268019"}, - {"2a01:b740:a10::/48", "6185"}, - {"2a02:2010:6002::/48", "20978"}, - {"2a02:e981:3d::/41", "19551"}, - {"2a01:ce83:8000::/35", "51964"}, - {"2c0f:fe28:e::/48", "36951"}, - {"2001:df5:fa80::/47", "141564"}, - {"240e:83::/37", "23724"}, - {"2600:6c38:18c::/43", "20115"}, - {"2806:230:2014::/48", "265594"}, - {"2a02:26f7:b9a9::/43", "20940"}, - {"2a02:26f7:d304::/48", "36183"}, - {"2a0e:b107:ef0::/44", "212129"}, - {"2407:5040::/38", "134715"}, - {"2408:84f3:3450::/44", "17816"}, - {"2602:fe90:700::/48", "35913"}, - {"2804:43bc::/32", "267587"}, - {"2a00:8e00:1::/48", "20712"}, - {"2a02:26f7:b681::/46", "20940"}, - {"2a02:2e02:3160::/43", "12479"}, - {"2404:f801:8020::/48", "45139"}, - {"240a:a6b1::/32", "144363"}, - {"2a00:1b70::/29", "39642"}, - {"2a0e:1d80::/47", "203523"}, - {"2400:6280:135::/48", "132280"}, - {"2405:f600:61::/48", "45117"}, - {"2a0e:b980::/29", "208644"}, - {"240a:af7f::/32", "146617"}, - {"2800:3b0:2000::/36", "263173"}, - {"2a01:ce90:9000::/34", "51964"}, - {"2a10:9100:5::/48", "267784"}, - {"2a10:fc80::/29", "47447"}, - {"2001:4b22::/64", "65505"}, - {"240e:978:8100::/31", "4134"}, - {"2804:72d4::/32", "270878"}, - {"2a01:190:3a::/39", "1764"}, - {"2001:559:c33e::/48", "7725"}, - {"2605:8300::/47", "33059"}, - {"2a02:26f7:bc40::/48", "36183"}, - {"2a0d:6600::/29", "39650"}, - {"2001:559:3e1::/48", "7015"}, - {"2604:11c0:200::/40", "395822"}, - {"2620:149:2::/43", "714"}, - {"2804:5d2c:2::/32", "268955"}, - {"2a00:1e88:c000::/34", "12389"}, - {"2a00:68c0::/32", "30781"}, - {"2406:e400:2::/32", "7642"}, - {"2408:8756:ea0::/41", "17622"}, - {"2a02:26f7:86::/48", "36183"}, - {"2a05:2a44:601::/46", "201411"}, - {"2a0f:9207:1::/42", "45009"}, - {"2402:e380:11f::/48", "139073"}, - {"240e:1c:c000::/31", "4134"}, - {"2a07:1980:16::/48", "25773"}, - {"2001:49f0:a06c::/43", "174"}, - {"2a02:26f7:bf0d::/42", "20940"}, - {"2001:559:84a9::/48", "7922"}, - {"2804:6e00::/32", "270569"}, - {"2806:2f0:61c3::/42", "17072"}, - {"2a02:26f7:ec50::/48", "36183"}, - {"2a0a:1c40::/29", "198024"}, - {"2406:daa0:e080::/44", "16509"}, - {"2408:8456:7440::/39", "17816"}, - {"2803:f9e0::/32", "270026"}, - {"2a02:2090:9800::/48", "47595"}, - {"2a02:f540::/30", "15692"}, - {"2610:1e8::/32", "11814"}, - {"2620:4e:4000::/48", "18472"}, - {"2406:2ac0::/32", "140736"}, - {"2407:a500::/39", "18356"}, - {"2408:8456:9210::/42", "134543"}, - {"240a:a45d::/32", "143767"}, - {"2803:280::/32", "52498"}, - {"2a01:5c0::/32", "42652"}, - {"2a03:7fc0::/32", "35717"}, - {"2001:559:82bf::/48", "33491"}, - {"2600:140f:600::/48", "55836"}, - {"2606:5200:c000::/36", "11115"}, - {"2600:370f:7080::/45", "32261"}, - {"2a00:79e1:f22::/40", "36384"}, - {"2a01:8840:5e::/42", "12041"}, - {"2a0f:9400:7708::/48", "20473"}, - {"240a:aca0::/32", "145882"}, - {"2a02:26f7:e609::/42", "20940"}, - {"240a:a9a1::/32", "145115"}, - {"2606:1980:7::/44", "54994"}, - {"2607:f220:41f::/48", "393689"}, - {"2804:9d4:2001::/35", "262996"}, - {"2804:bc4::/32", "52824"}, - {"2a00:1b58::/32", "50621"}, - {"2a0c:b641:200::/48", "209710"}, - {"2a0f:8641:b00c::/30", "25682"}, - {"2001:559:823b::/48", "7015"}, - {"2001:67c:2b3c::/48", "47127"}, - {"2400:9800:b010:1200::/33", "24203"}, - {"240e:44d:3380::/41", "4134"}, - {"2600:1002:9110::/36", "22394"}, - {"2620:1f:4000::/48", "14086"}, - {"2804:534::/37", "22177"}, - {"2804:2c7c::/32", "265222"}, - {"2806:250:24::/46", "28512"}, - {"2a04:e00:10::/46", "54103"}, - {"2a0d:2e00:2000::/48", "33932"}, - {"2001:57a:505::/46", "33438"}, - {"2400:e500:3b::/32", "38742"}, - {"2409:896a:1900::/38", "9808"}, - {"2606:2800:5a01::/48", "15133"}, - {"2a02:26f7:ca08::/48", "36183"}, - {"2a04:e080::/29", "201949"}, - {"2a09:bac0:216::/44", "13335"}, - {"240a:a158::/32", "142994"}, - {"2804:72a0::/32", "270865"}, - {"2806:20d:5224::/47", "32098"}, - {"2a02:26f7:c3d0::/48", "36183"}, - {"2001:559:860f::/43", "33667"}, - {"240c:c0a9:1000::/40", "4538"}, - {"2804:41f0::/32", "267467"}, - {"2a02:26f0:c4::/48", "34164"}, - {"2a05:7640:21c0::/38", "174"}, - {"240a:a4f8::/32", "143922"}, - {"2600:1004:b170::/40", "22394"}, - {"2600:1404:5::/48", "35994"}, - {"2604:7640::/32", "393796"}, - {"2804:14c:a782::/45", "28573"}, - {"2603:f2b0::/25", "397165"}, - {"2a0c:d0c0::/29", "48390"}, - {"2001:67c:14bc::/48", "44594"}, - {"2001:67c:2dd8::/48", "43351"}, - {"240a:a6bb::/32", "144373"}, - {"2804:161c::/43", "263268"}, - {"2804:36e4::/32", "266379"}, - {"2804:3908::/32", "266519"}, - {"2806:2f0:6241::/46", "17072"}, - {"2001:1418::/29", "12779"}, - {"2604:2900::/32", "16527"}, - {"2a07:1480::/29", "59626"}, - {"2001:1a11:155::/48", "42298"}, - {"2409:8055:301b::/45", "56040"}, - {"2602:fd5b::/36", "398280"}, - {"2a05:1084:2::/33", "59598"}, - {"2001:559:84b1::/48", "13367"}, - {"2001:67c:dc::/48", "50273"}, - {"2801:80:2350::/48", "267300"}, - {"2803:78a0::/32", "266815"}, - {"2804:37d0:8000::/33", "266437"}, - {"2a04:5380::/29", "202292"}, - {"2001:250:7023::/48", "24369"}, - {"2001:df4:1780::/48", "38074"}, - {"2403:300:a30::/48", "6185"}, - {"2a01:8600::/32", "8636"}, - {"2a02:26f0:127::/48", "20940"}, - {"2a0c:ed40::/29", "8888"}, - {"2001:6a8:a002::/35", "2611"}, - {"2620:112:9000::/44", "36225"}, - {"2804:b8c::/32", "52794"}, - {"2804:3d28:13::/32", "7063"}, - {"2a02:2010:22e0::/45", "20978"}, - {"2a12:c100::/29", "204790"}, - {"2607:f1c0:fe::/47", "15418"}, - {"2804:6604::/32", "269528"}, - {"2a04:2b00:13ee::/48", "201304"}, - {"2a0e:5f40::/29", "41529"}, - {"2a11:5840::/29", "18779"}, - {"2001:559:8156::/48", "7922"}, - {"240c:cd22:cd22::/48", "24357"}, - {"2a01:8840:f7::/48", "207266"}, - {"2a11:1d40::/47", "210937"}, - {"2804:3868:800::/37", "266475"}, - {"2804:637c::/32", "269364"}, - {"2804:70d0:c000::/34", "270750"}, - {"2a04:e00:107::/44", "39855"}, - {"2001:918:dedf::/34", "3303"}, - {"240a:a526::/32", "143968"}, - {"2600:1417:3800::/48", "24319"}, - {"2605:dd40:8213::/45", "398549"}, - {"2800:160:1e3a::/47", "14259"}, - {"2804:14d:cc85::/41", "28573"}, - {"2a00:7840::/32", "197403"}, - {"2a07:380::/29", "49596"}, - {"2001:470:68::/48", "12266"}, - {"2400:cb00:298::/47", "13335"}, - {"2405:5940::/32", "17473"}, - {"2a0d:df80::/31", "52091"}, - {"2a12:83c0::/29", "43202"}, - {"2001:550:8e03::/35", "174"}, - {"2001:df0:a6::/48", "55536"}, - {"2a01:600::/32", "25148"}, - {"2a07:e02:1000::/40", "210083"}, - {"2001:559:c28b::/48", "33650"}, - {"240e:bf:b900::/37", "134768"}, - {"2600:6c34:71::/48", "33588"}, - {"2607:fd08::/32", "36610"}, - {"2a01:c50e:f400::/36", "12479"}, - {"2a10:20c0::/29", "207265"}, - {"2a01:528::/32", "6775"}, - {"2a03:ae60:8::/32", "202847"}, - {"2a0f:9400:7386::/44", "53356"}, - {"2408:84f3:4410::/42", "134543"}, - {"240a:a131::/32", "142955"}, - {"2600:1000:b090::/42", "22394"}, - {"2803:5ce0:800::/40", "19114"}, - {"2803:aea0::/32", "18678"}, - {"2806:230:2021::/48", "11888"}, - {"2400:a980:1000::/40", "133517"}, - {"2406:da00:a000::/40", "16509"}, - {"2804:6458::/32", "269422"}, - {"2408:8956:1d40::/40", "17816"}, - {"2409:408c:2000::/32", "55836"}, - {"2804:382c::/32", "266462"}, - {"2400:a980:7100::/37", "133111"}, - {"2a02:26f7:e405::/46", "20940"}, - {"2a0a:8880:aaaa::/48", "50937"}, - {"2a0d:3e80::/29", "202914"}, - {"2001:559:8275::/48", "33650"}, - {"2001:ee0:cd40::/35", "45899"}, - {"2403:d600::/32", "4826"}, - {"240a:a5de::/32", "144152"}, - {"240e:978:3900::/40", "146966"}, - {"2620:d1:8000::/48", "36726"}, - {"2804:30ac::/32", "264968"}, - {"2a02:ac80:a1::/43", "25145"}, - {"2a0f:5701:3519::/45", "206499"}, - {"2001:1308::/32", "6400"}, - {"2408:8459:9c50::/38", "17816"}, - {"240a:aef2::/32", "146476"}, - {"2600:100f:b000::/42", "6167"}, - {"2602:ff93:1000::/36", "26968"}, - {"2a01:8840:4e::/43", "12041"}, - {"2a02:26f7:ee40::/48", "36183"}, - {"2a0c:9f40::/32", "41785"}, - {"2001:880::/32", "24973"}, - {"2402:800:62b7::/41", "7552"}, - {"240e:109:8045::/48", "58461"}, - {"240e:438:5c20::/43", "140647"}, - {"2607:fb58:f000::/46", "36086"}, - {"2a03:aa00:1001::/48", "204169"}, - {"2400:8500:3300::/48", "55907"}, - {"2804:14d:12fa::/45", "28573"}, - {"2804:6930::/34", "270254"}, - {"2a02:26f7:f1c4::/48", "36183"}, - {"2001:4490:f020::/46", "9829"}, - {"2604:bc40::/33", "22188"}, - {"2607:a500:9::/45", "12025"}, - {"2804:1aa8::/32", "61874"}, - {"2a00:4802:260::/44", "13124"}, - {"2a02:26f7:66::/48", "36183"}, - {"2a03:4bc0:1015::/48", "202687"}, - {"2001:559:74b::/48", "33657"}, - {"240a:a7d0::/32", "144650"}, - {"240e:3b7:5600::/34", "4134"}, - {"2001:250:4834::/48", "23910"}, - {"2001:678:340::/48", "206480"}, - {"2400:9bc0::/46", "55313"}, - {"2408:8256:3b8a::/48", "17623"}, - {"2600:6c38:70f::/43", "20115"}, - {"2603:c0ec:1000::/39", "54253"}, - {"2800:440:9400::/42", "27738"}, - {"2804:25b4::/32", "264297"}, - {"2a0a:3440::/29", "207092"}, - {"2a0a:e200:1300::/37", "33438"}, - {"2c0f:fb20::/32", "36925"}, - {"2400:f340:100::/47", "131746"}, - {"2600:1008:e000::/44", "6167"}, - {"2804:6630::/32", "269540"}, - {"2a01:8640:a::/48", "59711"}, - {"2001:559:150::/48", "13367"}, - {"2001:559:c210::/48", "33659"}, - {"2804:1b1c::/32", "61709"}, - {"2806:2f0:7201::/46", "17072"}, - {"2402:3180:3::/48", "141706"}, - {"2606:1980:15::/44", "54994"}, - {"2804:1be4::/32", "61755"}, - {"2804:5534::/37", "268696"}, - {"2a00:13f0::/32", "39662"}, - {"240a:a5e3::/32", "144157"}, - {"2600:1008:b0d0::/42", "6167"}, - {"2600:140f:3200::/48", "55644"}, - {"2620:13a:7000::/44", "5078"}, - {"2804:6310:1000::/37", "269336"}, - {"2a06:7100::/29", "48520"}, - {"2a0c:a300::/29", "44486"}, - {"2401:1c00::/34", "38809"}, - {"2402:800:5a1d::/42", "7552"}, - {"240a:aa2e::/32", "145256"}, - {"2800:160:204c::/47", "14259"}, - {"2806:20d:9100::/38", "32098"}, - {"2001:559:c153::/48", "33490"}, - {"240a:af22::/32", "146524"}, - {"2604:d9c0::/32", "36222"}, - {"2804:14c:6100::/40", "28573"}, - {"2a0c:e040:132::/35", "200629"}, - {"240e:104:8000::/33", "4134"}, - {"2607:f1d8::/40", "7795"}, - {"2a02:e981:60::/47", "19551"}, - {"2001:418:1::/48", "3130"}, - {"2001:559:84c4::/48", "33659"}, - {"2a00:1368::/32", "28933"}, - {"2a04:4e40:4630::/41", "54113"}, - {"2403:89c0:1::/46", "137661"}, - {"2804:6e30::/32", "270581"}, - {"2a10:5dc0::/32", "212033"}, - {"2604:4080::/32", "54858"}, - {"2804:109c::/32", "262854"}, - {"2a02:26f7:e14c::/48", "36183"}, - {"2a11:1bc0::/32", "59639"}, - {"2407:e500::/46", "17929"}, - {"240e:60c:6000::/36", "137688"}, - {"2a04:4e40:5420::/44", "54113"}, - {"2a06:3fc0::/29", "42344"}, - {"2001:253:139::/48", "142105"}, - {"2001:8b0:2::/35", "20712"}, - {"2a0c:4300:90::/41", "43722"}, - {"2605:3c80:e00::/41", "36180"}, - {"2804:802c::/39", "271734"}, - {"2806:2f0:9723::/41", "17072"}, - {"2a04:1000::/29", "61001"}, - {"2a10:8c00::/32", "20473"}, - {"2605:c780::/32", "30674"}, - {"2a02:26f7:bf45::/46", "20940"}, - {"2001:678:91c::/48", "206671"}, - {"2001:df3:f380::/48", "140718"}, - {"2001:e60:a018::/42", "4766"}, - {"2401:d800:dc30::/41", "7552"}, - {"2402:6000::/32", "9790"}, - {"2406:57c0:2130::/48", "134672"}, - {"240a:a1f1::/32", "143147"}, - {"240e:44d:4880::/41", "4134"}, - {"2001:67c:17f0::/48", "702"}, - {"2001:67c:2574::/48", "25148"}, - {"2001:df4:2c80::/48", "140896"}, - {"2a07:da80::/29", "209372"}, - {"2a10:7a40::/47", "39910"}, - {"2001:67c:2d04::/48", "198463"}, - {"2408:8957:7300::/40", "17816"}, - {"2409:8070:30e9::/48", "9808"}, - {"2408:8456:e640::/36", "17816"}, - {"2600:1406:4::/44", "20940"}, - {"2620:134:c000::/48", "394887"}, - {"2804:c00:a100::/38", "52655"}, - {"2804:1084::/32", "52847"}, - {"2804:68ac:8000::/33", "269708"}, - {"2a04:8880::/31", "52102"}, - {"2406:daa0:1080::/44", "16509"}, - {"2600:c0a::/32", "12180"}, - {"2608:149:b::/48", "27064"}, - {"2a03:2f80::/32", "197308"}, - {"2a07:cc80::/29", "42908"}, - {"2001:250:781e::/47", "24372"}, - {"2001:559:80d2::/48", "7015"}, - {"2400:9380:8fc0::/44", "136167"}, - {"2408:8456:1400::/42", "17622"}, - {"240a:a1f0::/32", "143146"}, - {"240e:965:5000::/37", "58772"}, - {"2600:1415:2801::/37", "20940"}, - {"2a0c:a9c7:240::/48", "42139"}, - {"2001:559:51c::/48", "33657"}, - {"2001:559:8137::/48", "33660"}, - {"240a:a030::/32", "142698"}, - {"2600:9000:223c::/41", "16509"}, - {"2604:6e00:2000::/37", "13977"}, - {"2804:3024::/32", "264932"}, - {"2804:79b8::/32", "271323"}, - {"2806:2f0:9bc1::/46", "17072"}, - {"2001:559:8194::/48", "22909"}, - {"2405:4f00::/32", "132432"}, - {"2800:370:c004::/40", "28006"}, - {"2803:2040::/32", "28050"}, - {"2804:3d0c::/32", "266250"}, - {"2402:800:5301::/44", "7552"}, - {"240a:a265::/32", "143263"}, - {"240a:abb8::/32", "145650"}, - {"2801:80:1bf0::/48", "52608"}, - {"2a05:b9c0::/29", "201057"}, - {"2405:b40:23::/44", "55674"}, - {"2409:8057:2060::/35", "56040"}, - {"240a:ab13::/32", "145485"}, - {"2804:14c:de00::/41", "28573"}, - {"2804:37f0:6100::/36", "266445"}, - {"2804:6fe8::/32", "270692"}, - {"2a00:da60::/32", "25581"}, - {"2a0d:ce00::/29", "200428"}, - {"2001:4408:7900::/38", "4758"}, - {"240a:a8cb::/32", "144901"}, - {"2a00:1e88:5::/46", "12389"}, - {"2a04:2e80:19::/48", "62351"}, - {"2a0c:9a40:c004::/36", "209022"}, - {"2001:67c:2d50::/48", "201173"}, - {"2001:18e0::/32", "6062"}, - {"2409:4073:5000::/24", "55836"}, - {"2600:1403:12::/45", "20940"}, - {"2804:22dc::/32", "264127"}, - {"2001:559:43f::/41", "33287"}, - {"2001:df1:e300::/48", "132402"}, - {"2409:8915:2900::/40", "56044"}, - {"240a:ac2c::/32", "145766"}, - {"2a00:4c40:2000::/36", "197965"}, - {"2a02:e70::/39", "33965"}, - {"2001:559:8b::/45", "33667"}, - {"2a00:89e0::/32", "198024"}, - {"2a02:26f0:6001::/39", "20940"}, - {"2a02:26f7:c7ca::/42", "20940"}, - {"2001:678:2d8::/48", "39285"}, - {"2600:1410:6001::/35", "20940"}, - {"2800:a30:6a6::/35", "262187"}, - {"2001:500:96::/48", "15135"}, - {"2001:559:5c0::/48", "22909"}, - {"2001:16d8::/41", "16150"}, - {"2001:4c00::/32", "34695"}, - {"2404:f4c0:ea00::/47", "140731"}, - {"2800:200:bc10::/39", "12252"}, - {"2801:80:12d0::/48", "263892"}, - {"2804:2784:d000::/34", "263906"}, - {"2a06:1c80::/31", "60011"}, - {"2a0d:9a00::/32", "39401"}, - {"2001:550:1404::/38", "174"}, - {"2402:800:3301::/44", "7552"}, - {"2407:8c00:ffe1::/48", "131317"}, - {"240a:a64e::/32", "144264"}, - {"2602:ffa6:303::/40", "62731"}, - {"2a00:f2a0::/32", "12555"}, - {"2a02:26f7:f18c::/48", "36183"}, - {"2a07:3500:1240::/46", "33915"}, - {"2a11:29c7:b00b::/48", "212149"}, - {"2409:896a:3400::/39", "9808"}, - {"240e:978:2a00::/37", "4134"}, - {"2607:f358:16::/42", "18779"}, - {"2a06:e881:1800::/48", "206885"}, - {"2a0a:2100::/29", "199624"}, - {"2001:559:533::/48", "33287"}, - {"240e:3b8:7a00::/32", "140313"}, - {"2600:1004:9110::/36", "22394"}, - {"2605:4400:2::/45", "40715"}, - {"2001:250:400::/48", "55826"}, - {"2600:1488:a401::/42", "20940"}, - {"2602:fe62::/36", "394356"}, - {"2620:11d:5000::/46", "393732"}, - {"2804:125c::/32", "263472"}, - {"2a01:590::/32", "8492"}, - {"2a03:c80::/32", "8829"}, - {"2a07:3480::/29", "47759"}, - {"2001:559:169::/48", "7016"}, - {"2001:678:c30::/48", "39591"}, - {"2001:67c:1bfc::/48", "3264"}, - {"2001:df7:1000::/48", "59216"}, - {"2001:43fd::/48", "327811"}, - {"240e:965:ec00::/35", "4134"}, - {"2604:5b80::/32", "22898"}, - {"2a10:cc42:1200::/40", "20473"}, - {"2001:67c:2a68::/48", "198944"}, - {"2804:dd4:4100::/32", "53024"}, - {"2a01:b740:a1a::/48", "6185"}, - {"2a02:2e02:a60::/40", "12479"}, - {"2a0a:e5c3::/32", "207996"}, - {"2a11:7e04::/32", "61424"}, - {"2c0f:f158::/32", "328220"}, - {"2001:559:39b::/45", "7922"}, - {"2408:8957:e200::/40", "17622"}, - {"2607:e580::/32", "36601"}, - {"2804:958::/32", "263077"}, - {"2a02:26f7:f501::/46", "20940"}, - {"2a03:c980:db::/48", "210079"}, - {"2a0e:b107:1901::/48", "207111"}, - {"2a10:2880::/32", "51968"}, - {"2404:1f00:9000::/33", "55947"}, - {"2404:3d00:4124::/46", "21433"}, - {"2803:5c80:6591::/48", "64114"}, - {"2403:0:119::/46", "4755"}, - {"2408:840c:5400::/40", "17621"}, - {"240e:13:802::/48", "140854"}, - {"2a02:26f7:eb::/48", "20940"}, - {"2a02:26f7:bc89::/42", "20940"}, - {"2001:da8:304f::/48", "23910"}, - {"2001:df5:6400::/48", "55380"}, - {"240a:a700::/32", "144442"}, - {"240a:afc0::/32", "146682"}, - {"2604:b3c0::/40", "53989"}, - {"2803:5700:8000::/33", "28024"}, - {"2001:550:90a::/48", "32489"}, - {"2600:7402::/28", "29933"}, - {"2a01:5b0:5::/46", "50611"}, - {"2a02:2090:a800::/48", "47595"}, - {"2a04:280::/29", "28917"}, - {"2001:470:bd::/48", "16621"}, - {"2001:df0:8a80::/48", "139250"}, - {"2605:a408::/41", "33363"}, - {"2804:65ec::/32", "269523"}, - {"2a01:6bc0::/32", "50061"}, - {"2a0a:fc40::/29", "29075"}, - {"2001:4c8:10ff::/39", "15290"}, - {"2001:c38:20f9::/36", "9335"}, - {"2401:d800:bf50::/42", "7552"}, - {"2407:f800:800::/40", "38182"}, - {"2408:8656:2f00::/35", "17816"}, - {"2001:4490:7400::/46", "9829"}, - {"2605:1b80::/32", "26153"}, - {"2a02:26f0:fb01::/37", "20940"}, - {"2a0b:b86:fe03::/48", "205749"}, - {"240a:ad5b::/32", "146069"}, - {"2606:ae00:6dd0::/35", "7287"}, - {"2607:8280:5::/32", "27027"}, - {"240a:abf4::/32", "145710"}, - {"2606:5e80:ff01::/28", "22379"}, - {"2620:96:c000::/48", "399932"}, - {"2a00:c4e0::/32", "200133"}, - {"2a04:a980::/29", "206833"}, - {"2001:4060:4052::/48", "197439"}, - {"2405:8a00:a01e::/42", "55824"}, - {"2409:804b:2a00::/39", "24445"}, - {"240e:96b:6024::/46", "140376"}, - {"2001:550:7206::/37", "174"}, - {"2001:1a98::/29", "6677"}, - {"240a:ad69::/32", "146083"}, - {"2600:1405:b001::/33", "20940"}, - {"2604:5c40::/32", "14078"}, - {"2a02:16c0::/29", "56402"}, - {"2600:1014:b1f0::/33", "22394"}, - {"2606:b400:8024::/48", "1216"}, - {"2607:4d00::/35", "33260"}, - {"2a0b:4d07:901::/48", "44239"}, - {"2a0d:f740::/32", "43182"}, - {"2408:8756:2d00::/35", "17816"}, - {"2600:140f:5001::/39", "20940"}, - {"2620:119:5004::/47", "13443"}, - {"2804:284c::/33", "263954"}, - {"2001:648::/35", "5408"}, - {"2620:1e0:111::/46", "10801"}, - {"2806:2f0:364::/43", "17072"}, - {"2a00:ad44:3084::/48", "199875"}, - {"2a0f:f640::/48", "12731"}, - {"2409:8e1e::/31", "24400"}, - {"240a:a94e::/32", "145032"}, - {"240e:438:9c40::/38", "4134"}, - {"2a07:3440::/29", "201873"}, - {"2001:250:7036::/37", "23910"}, - {"2001:559:8319::/48", "33652"}, - {"2001:4408:5241::/43", "4758"}, - {"2404:bf40:f200::/47", "7545"}, - {"2600:1017:b8d0::/44", "22394"}, - {"2600:1f01:48d0::/46", "16509"}, - {"2607:f388::/32", "59"}, - {"2804:3784::/34", "53121"}, - {"2a06:1ec7::/32", "49832"}, - {"2001:678:9e8::/48", "208447"}, - {"2610:b0::/34", "3573"}, - {"2605:b40:f0c1::/36", "397142"}, - {"2408:8256:2e87::/43", "17623"}, - {"2804:14d:800::/40", "28573"}, - {"2804:1f4a::/32", "271354"}, - {"2a05:2d00::/32", "62217"}, - {"2001:559:834a::/47", "7016"}, - {"2001:df0:13::/48", "38244"}, - {"2001:4878:4055::/48", "35994"}, - {"2404:8c00::/32", "3605"}, - {"2408:8957:5300::/40", "17816"}, - {"2804:298::/34", "53087"}, - {"2804:6c84::/32", "270473"}, - {"2001:559:c43b::/45", "33651"}, - {"2001:579:40d8::/42", "22773"}, - {"2001:678:458::/48", "8422"}, - {"2408:8456:4810::/42", "134543"}, - {"2409:8904:55b0::/38", "24547"}, - {"240e:44d:5180::/41", "4134"}, - {"2804:336c::/32", "265395"}, - {"2a00:86c0:ff0b::/40", "2906"}, - {"2001:250:e0d::/48", "23910"}, - {"2401:4900:2e80::/43", "45609"}, - {"2403:8600:80e0::/43", "45820"}, - {"2409:8720::/32", "56046"}, - {"2804:3690::/32", "266356"}, - {"2a00:41c0::/32", "48971"}, - {"2a09:4c0:304::/47", "58057"}, - {"2001:559:86b5::/48", "7016"}, - {"2409:8004:3900::/31", "24547"}, - {"240a:a423::/32", "143709"}, - {"2804:2ef0::/32", "264862"}, - {"2a00:5400:f000::/45", "43766"}, - {"2001:67c:2188::/48", "197500"}, - {"2408:8956:8d00::/40", "17816"}, - {"2a02:26f7:f808::/48", "36183"}, - {"2001:678:3e0::/48", "42718"}, - {"2804:1048::/32", "263628"}, - {"2a01:5041:b::/45", "202196"}, - {"2a02:ac80:f1::/39", "25145"}, - {"2a09:aac0::/29", "209289"}, - {"2a09:bac0:63::/45", "13335"}, - {"2a0d:3842:1220::/48", "57629"}, - {"2408:8459:4410::/42", "17623"}, - {"240e:2e:8000::/25", "4134"}, - {"2800:580::/32", "27695"}, - {"2804:4130::/32", "266009"}, - {"2a02:26f0:2101::/37", "20940"}, - {"2a0a:59c7:1000::/45", "204724"}, - {"2800:d302:a::/43", "11830"}, - {"2a05:b500:53::/48", "39176"}, - {"2a0c:b641:76a::/48", "207292"}, - {"2a0d:1ac3::/32", "44050"}, - {"240a:a30e::/32", "143432"}, - {"2605:7900:100::/48", "19133"}, - {"2804:7808::/32", "271216"}, - {"2001:559:8261::/48", "33651"}, - {"2001:13c7:600e::/48", "52374"}, - {"2406:7400:c0::/45", "24309"}, - {"2804:768::/36", "52977"}, - {"2804:78ec::/32", "271274"}, - {"2a0f:85c1:70::/44", "209267"}, - {"2001:559:53d::/48", "33491"}, - {"2001:67c:1030::/48", "3257"}, - {"2001:4350:fff0::/44", "2609"}, - {"2606:ca00:408::/32", "14537"}, - {"2607:fa48::/39", "5769"}, - {"2803:5960::/32", "269743"}, - {"2a02:26f7:f6c9::/46", "20940"}, - {"2a03:e280::/32", "60781"}, - {"2001:16a2:c290::/42", "39386"}, - {"2a03:5880::/39", "12757"}, - {"2001:559:82d3::/48", "33650"}, - {"2001:67c:2120::/48", "31710"}, - {"2a01:758:8308::/33", "3326"}, - {"2a02:26f7:f845::/46", "20940"}, - {"2001:503:39c1::/48", "397197"}, - {"2402:7400::/34", "38883"}, - {"2404:5780::/47", "9558"}, - {"2804:4be0::/32", "267334"}, - {"2a0b:6000::/29", "60721"}, - {"2404:f380::/46", "38614"}, - {"2804:2554::/32", "264274"}, - {"2a02:26f7:ec89::/46", "20940"}, - {"2a03:41e0::/32", "201510"}, - {"2a03:6bc0::/29", "43439"}, - {"2409:8080:3825::/29", "9808"}, - {"240a:aafe::/32", "145464"}, - {"2604:9980:230::/48", "17216"}, - {"2804:14c:fc88::/46", "28573"}, - {"2804:5f5c::/32", "269094"}, - {"2001:250:680d::/48", "24368"}, - {"2001:67c:68::/48", "24971"}, - {"2001:c20:4888::/46", "3758"}, - {"240a:a53b::/32", "143989"}, - {"2a02:998::/32", "9197"}, - {"2a0f:85c1:212::/48", "207529"}, - {"2a10:ba80::/29", "211360"}, - {"2408:8956:3d00::/40", "17816"}, - {"2610:a1:2016::/48", "19905"}, - {"2803:d8c0::/40", "264787"}, - {"2402:800:95a9::/43", "7552"}, - {"2607:f778:c300::/34", "32035"}, - {"2a02:26f7:f8c1::/46", "20940"}, - {"2a09:f9c0::/29", "211626"}, - {"2001:4878:2062::/47", "12222"}, - {"2620:132:f181::/38", "394977"}, - {"2804:436c::/32", "267569"}, - {"2a02:26f7:f309::/42", "20940"}, - {"2001:559:8284::/48", "22909"}, - {"2001:559:c12e::/48", "7015"}, - {"2001:678:ac8::/48", "47988"}, - {"2001:16a2:c370::/40", "39386"}, - {"2404:2800::/32", "9942"}, - {"2001:559:c3da::/48", "33659"}, - {"2407:a740:8::/48", "38852"}, - {"240a:ad01::/32", "145979"}, - {"240e:40:14::/48", "139767"}, - {"240e:45c:9500::/40", "140534"}, - {"2602:feda:b42::/45", "142130"}, - {"2402:800:560f::/43", "7552"}, - {"2402:800:b5f0::/38", "7552"}, - {"2405:6600:70a::/36", "45845"}, - {"2803:7820:8000::/45", "267708"}, - {"2804:a1c::/32", "262727"}, - {"2402:1::/36", "10197"}, - {"2402:3a80:1c38::/47", "38266"}, - {"2804:549c::/32", "268661"}, - {"2001:579:b849::/45", "22773"}, - {"2402:800:79a0::/41", "7552"}, - {"240e:3be:7800::/39", "4134"}, - {"2801:80:35a0::/48", "269045"}, - {"2806:2f0:9463::/43", "17072"}, - {"2a07:dc00:1330::/44", "14627"}, - {"2a0d:b201:5030::/41", "206026"}, - {"2406:e6c0::/48", "140766"}, - {"2408:8459:7a30::/41", "17622"}, - {"2604:4540::/32", "88"}, - {"2806:230:1007::/48", "11888"}, - {"2a02:26f7:f5::/46", "20940"}, - {"2001:559:c0c6::/48", "33657"}, - {"240e:67d:e400::/39", "140330"}, - {"2800:bf0:3703::/42", "27947"}, - {"2804:6e08::/32", "270571"}, - {"2a0f:ca87:5::/48", "208333"}, - {"2600:370f:340b::/45", "32261"}, - {"2603:4:1204::/48", "44273"}, - {"2804:904::/32", "263046"}, - {"240a:aa84::/32", "145342"}, - {"2604:f400:12::/48", "18923"}, - {"2607:f740:e608::/48", "63911"}, - {"2a0a:4180::/48", "57724"}, - {"2001:4818:5000::/36", "30715"}, - {"2001:48c8:16::/47", "29791"}, - {"2402:800:39d3::/44", "7552"}, - {"2605:3b80:cad::/48", "9009"}, - {"2800:4d0:2485::/44", "52489"}, - {"2001:67c:380::/48", "41599"}, - {"2001:67c:1110::/47", "21406"}, - {"2001:e60:a028::/38", "4766"}, - {"2001:4350:e009::/35", "2609"}, - {"2600:140f:1a00::/48", "9498"}, - {"2a00:1248:e283::/35", "3216"}, - {"2a01:5041:4000::/48", "202196"}, - {"2a0c:9a40:8110::/46", "204438"}, - {"2001:559:c2a6::/48", "33659"}, - {"2001:da8:a9::/48", "24370"}, - {"2408:80c2::/33", "4837"}, - {"2a07:aa00:3::/45", "3549"}, - {"2a0e:aa07:f094::/44", "208884"}, - {"2401:8ac0:100::/48", "4671"}, - {"2a02:2518:12::/29", "28917"}, - {"2a11:1280::/29", "56485"}, - {"2401:d800:2d82::/42", "7552"}, - {"2804:75ac::/32", "271062"}, - {"2a0b:a840::/32", "206894"}, - {"2400:9800:6028::/32", "24203"}, - {"2409:8924:1500::/38", "56046"}, - {"2606:2800:4212::/48", "15133"}, - {"2607:fb91:1a00::/37", "21928"}, - {"2620:117:7000::/47", "26955"}, - {"2404:5440::/44", "56272"}, - {"2804:1b3:8080::/35", "18881"}, - {"2a00:1860::/32", "35369"}, - {"2401:d800:b390::/42", "7552"}, - {"2001:559:578::/48", "7016"}, - {"2001:559:83f7::/48", "33650"}, - {"2001:fb0:109f:8015::/42", "7470"}, - {"2402:800:62a0::/44", "7552"}, - {"2402:7280:cfa2::/48", "46014"}, - {"240e:788::/29", "4812"}, - {"2a02:26f0:6300::/48", "34164"}, - {"2a0a:1f40::/32", "209372"}, - {"2001:13c7:7012::/48", "52224"}, - {"2409:8070:30ea::/47", "140105"}, - {"240a:a52b::/32", "143973"}, - {"2801:80:3990::/48", "270807"}, - {"2804:a00:12::/36", "262838"}, - {"2001:559:4e7::/48", "33651"}, - {"2408:8459:1e50::/39", "17816"}, - {"2620:1f:8002::/48", "10908"}, - {"2a0c:2e00::/29", "56708"}, - {"2c0f:eaa8::/32", "37540"}, - {"2401:fc0::/32", "136523"}, - {"240a:ac8c::/32", "145862"}, - {"2607:a400::/45", "21859"}, - {"2804:2a8c::/32", "264078"}, - {"2a02:1688::/32", "48362"}, - {"2a0f:f940::/29", "62412"}, - {"240a:aa9a::/32", "145364"}, - {"240e:44d:6e00::/42", "140345"}, - {"2a0f:ca85:11::/48", "207616"}, - {"2c0f:f0b0:1100::/48", "37069"}, - {"2001:559:8475::/48", "7922"}, - {"2409:805a:2903::/31", "56040"}, - {"240a:a2bf::/32", "143353"}, - {"2604:f940:7::/32", "397134"}, - {"2600:100f:d040::/34", "22394"}, - {"2606:a700:2000::/32", "17378"}, - {"2801:164::/40", "27951"}, - {"2804:3d84::/32", "266536"}, - {"2804:4bd8::/40", "267332"}, - {"2804:5bd0::/32", "268870"}, - {"2a02:420::/29", "38927"}, - {"2a02:26f7:61::/48", "20940"}, - {"2001:559:808d::/48", "7016"}, - {"240e:3bf:4c00::/35", "136200"}, - {"2600:1001:d060::/40", "22394"}, - {"2606:ed00:2::/47", "47869"}, - {"2a03:8520:1206::/48", "200981"}, - {"2001:df6:180:8100::/49", "141731"}, - {"2804:1a54::/34", "61854"}, - {"2a0e:b107:14c2::/44", "211042"}, - {"2001:559:c11c::/46", "7922"}, - {"2600:140f:4200::/48", "9498"}, - {"2804:4cac::/32", "267384"}, - {"2a0c:b641:c0::/44", "212201"}, - {"240e:56:c800::/31", "4134"}, - {"2804:910::/32", "53075"}, - {"2804:1918:180::/46", "52862"}, - {"2806:2f0:4801::/35", "17072"}, - {"2001:44b8:30ef::/43", "7545"}, - {"2804:3bc::/32", "28624"}, - {"2c0f:ebd0::/34", "328608"}, - {"2402:ab00::/40", "24206"}, - {"240a:aa80::/32", "145338"}, - {"2600:6c38:a56::/44", "20115"}, - {"2600:7f00::/28", "6465"}, - {"2a00:f28:3000::/29", "15802"}, - {"2a02:26f7:becd::/46", "20940"}, - {"2804:293c::/32", "264005"}, - {"2001:480:1671::/32", "668"}, - {"2001:fd0:1201::/39", "10029"}, - {"2402:800:b9d2::/38", "7552"}, - {"240e:109:8024::/48", "134768"}, - {"2804:6fc4::/32", "270683"}, - {"2a02:970:1069::/39", "44002"}, - {"2406:840:e666::/47", "211843"}, - {"2600:370f:7088::/42", "32261"}, - {"2a02:26f0:a0::/47", "20940"}, - {"2a09:7:2002::/48", "57969"}, - {"2a0b:8f80:100::/45", "29290"}, - {"2a02:26f7:c350::/47", "36183"}, - {"2600:1402:3::/48", "35994"}, - {"2804:8128::/32", "272436"}, - {"2a02:26f7:f549::/46", "20940"}, - {"2001:250:5865::/48", "24363"}, - {"2001:559:7b::/45", "7922"}, - {"2408:8779:4000::/32", "4837"}, - {"240a:a4f4::/32", "143918"}, - {"240a:a82c::/32", "144742"}, - {"2804:1810::/34", "263262"}, - {"2804:1954::/32", "61787"}, - {"2a07:7400::/29", "203964"}, - {"2001:c20:48aa::/47", "9255"}, - {"2001:1900:221a::/45", "3356"}, - {"2604:2680:10::/47", "2386"}, - {"2604:fac0::/30", "398481"}, - {"2605:3e00::/32", "13706"}, - {"2804:774c::/32", "271169"}, - {"2a12:b200::/29", "44592"}, - {"2402:4000:c002::/34", "18001"}, - {"240a:ab02::/32", "145468"}, - {"240a:ad8f::/32", "146121"}, - {"2804:108c:c500::/35", "28146"}, - {"2a0e:b102:12f::/48", "20473"}, - {"2001:470:142::/48", "22989"}, - {"2001:550:4102::/38", "174"}, - {"2001:67c:1a8::/48", "1200"}, - {"2001:67c:2244:8000::/49", "50448"}, - {"2001:df0:fc00::/47", "59173"}, - {"2001:fd8:b270::/44", "4775"}, - {"240a:a589::/32", "144067"}, - {"2800:c30:ad00::/40", "265705"}, - {"2804:6e54::/32", "270589"}, - {"2408:8956:ba00::/40", "17622"}, - {"240d:c010:69::/48", "139341"}, - {"2806:230:600d::/48", "11888"}, - {"2a00:f320::/48", "24586"}, - {"2a02:26f7:e8c9::/46", "20940"}, - {"2a11:e080::/29", "204790"}, - {"2001:559:83a5::/48", "33652"}, - {"2401:d800:9f70::/40", "7552"}, - {"2406:3000:32::/45", "4657"}, - {"240e:40:15::/32", "4134"}, - {"240e:44d:6680::/41", "4134"}, - {"2600:6c38:87d::/40", "20115"}, - {"2607:fe28:20b1::/41", "53347"}, - {"2a02:4ba::/32", "200271"}, - {"2a04:12c0::/48", "48749"}, - {"2604:8280::/32", "27618"}, - {"2806:370:5600::/40", "28403"}, - {"2a09:1e80::/29", "21769"}, - {"2001:1900:2812::/45", "3356"}, - {"2408:8459:6c30::/41", "17622"}, - {"2409:8924:b900::/38", "56046"}, - {"2a02:970:1249::/40", "44002"}, - {"2a02:26f0:db01::/40", "20940"}, - {"2a02:26f0:dd01::/38", "20940"}, - {"2a02:26f7:bf::/48", "20940"}, - {"2001:4408:5d00::/38", "4758"}, - {"2401:4900:1c36::/44", "24560"}, - {"2604:880:231::/41", "29802"}, - {"2604:8540:fcc0::/48", "33353"}, - {"2606:4700:2::/43", "13335"}, - {"2a07:80c0::/29", "202829"}, - {"2a0b:f300::/46", "62240"}, - {"2a0c:b641:610::/47", "208505"}, - {"2a0e:5cc0::/29", "43282"}, - {"2001:559:8233::/48", "7015"}, - {"2001:559:c038::/48", "7922"}, - {"2001:67c:2108::/48", "41446"}, - {"2606:740::/32", "7018"}, - {"2803:5440:4050::/47", "264738"}, - {"2a00:1030::/32", "24956"}, - {"2a01:4f0::/33", "28717"}, - {"2405:8a00:a053::/45", "55824"}, - {"2607:f740:e60c::/48", "63911"}, - {"2804:2e1c:e503::/45", "265324"}, - {"2001:67c:1b70::/48", "2488"}, - {"2001:44b8:6030::/46", "7545"}, - {"240c:cec1::/32", "138440"}, - {"2600:370f:740a::/42", "32261"}, - {"2a00:1bc8::/32", "50554"}, - {"2a06:e881:3200::/44", "31798"}, - {"2a0a:c3c0::/29", "208861"}, - {"2001:559:86bd::/48", "7016"}, - {"2001:678:b60::/48", "12496"}, - {"2001:df6:e500::/47", "18030"}, - {"2402:800:31e0::/44", "7552"}, - {"240a:ad2c::/32", "146022"}, - {"2001:1b70:83::/48", "32094"}, - {"2408:8256:3195::/48", "17623"}, - {"240a:ac8d::/32", "145863"}, - {"2804:5d20::/32", "268952"}, - {"2a04:e4c4:1::/45", "36692"}, - {"2401:7b40:4300::/44", "38071"}, - {"2405:1500:b1::/32", "58717"}, - {"2408:8000:a019::/45", "4837"}, - {"240a:af5e::/32", "146584"}, - {"2804:1b28::/32", "61712"}, - {"2a02:f48:2000::/40", "50613"}, - {"2001:559:819d::/48", "7922"}, - {"2001:14a0::/32", "15879"}, - {"2406:b400:f9::/48", "18209"}, - {"240a:a565::/32", "144031"}, - {"2600:100d:b070::/40", "22394"}, - {"2a04:ac00:2::/48", "203004"}, - {"2402:8100:2420::/43", "55644"}, - {"240e:3b7:f700::/36", "4134"}, - {"2600:6c38:c6::/47", "20115"}, - {"2409:8054:60::/48", "9808"}, - {"2a03:f080:1800::/48", "47515"}, - {"2001:df7:480a::/48", "131893"}, - {"2600:1406:4801::/37", "20940"}, - {"2603:c000:1f00::/34", "31898"}, - {"2800:160:1547::/44", "14259"}, - {"2801:1e0::/41", "27875"}, - {"2803:7bc0:4000::/32", "265761"}, - {"2a09:3d00::/32", "210625"}, - {"2a0d:b201:3060::/43", "206026"}, - {"2001:1248:55ff::/38", "11172"}, - {"2001:44b8:205c::/48", "7545"}, - {"2402:800:511d::/42", "7552"}, - {"2407:e700::/43", "132680"}, - {"2408:8256:3d6b::/48", "17816"}, - {"240a:a7dd::/32", "144663"}, - {"2603:c027:c000::/35", "31898"}, - {"2605:8000:23a::/32", "4261"}, - {"2605:b100:a81::/39", "577"}, - {"2804:3998::/32", "266038"}, - {"2a0e:97c0:3b5::/48", "211484"}, - {"2001:559:8125::/48", "33489"}, - {"2a02:5f80::/32", "39811"}, - {"2001:3c8:e10f::/35", "4621"}, - {"2001:559:844d::/48", "33650"}, - {"2600:1010:bf0e::/33", "22394"}, - {"2605:3380:ff05::/46", "12025"}, - {"2605:a900:8::/48", "26793"}, - {"2800:440:8064::/48", "27738"}, - {"2a0c:5240::/31", "59504"}, - {"2804:2bdc:2::/37", "265181"}, - {"2a04:ecc0::/29", "207992"}, - {"2401:1700:a::/43", "55666"}, - {"2401:4900:1978::/40", "45609"}, - {"2408:8256:3861::/40", "17623"}, - {"2600:6c38:f18::/42", "20115"}, - {"2a04:4e40:3800::/48", "54113"}, - {"2804:5940::/32", "268179"}, - {"2a01:b220::/32", "202164"}, - {"2001:df0:7c80::/48", "6461"}, - {"2401:1d40:f21::/45", "23724"}, - {"2401:d800:ba0::/41", "7552"}, - {"2403:2e40:1::/46", "137959"}, - {"240a:a354::/32", "143502"}, - {"2606:a600:4002::/48", "397933"}, - {"2800:160:1ff7::/44", "14259"}, - {"2a01:520::/32", "2116"}, - {"2001:559:c3ec::/47", "7015"}, - {"2804:297c:aaab::/33", "262907"}, - {"2602:804:d000::/44", "27587"}, - {"2a02:18::/32", "44569"}, - {"2402:800:35d3::/44", "7552"}, - {"2409:8904:cba0::/37", "24547"}, - {"2409:896a:2000::/39", "9808"}, - {"2a01:79e0::/32", "199791"}, - {"2a09:b440::/48", "20473"}, - {"2001:559:83c5::/48", "33652"}, - {"2804:656c::/32", "269489"}, - {"2001:559:fa::/47", "33660"}, - {"2001:678:e70::/48", "211607"}, - {"2001:fd8:3480::/42", "132199"}, - {"2001:16a2:c360::/44", "39891"}, - {"240a:a68b::/32", "144325"}, - {"2604:ca00:434::/41", "36492"}, - {"2606:4700:8040::/44", "13335"}, - {"2001:67c:2094::/48", "12695"}, - {"2001:67c:21c0::/48", "39265"}, - {"2001:1330::/29", "11830"}, - {"240a:a603::/32", "144189"}, - {"2600:6c3b:21::/43", "20115"}, - {"2a02:26f0:37::/44", "20940"}, - {"2a02:2838::/32", "31264"}, - {"2001:250:6c00::/43", "138370"}, - {"2001:559:c458::/48", "7922"}, - {"2804:c::/32", "28343"}, - {"2804:343c::/32", "263665"}, - {"2804:46f0:41::/40", "267021"}, - {"2a02:26f7:ec08::/48", "36183"}, - {"2a04:e00:100::/47", "48806"}, - {"2a0a:9200::/29", "61317"}, - {"2401:e380:8522::/47", "131091"}, - {"2408:8444:100::/31", "140726"}, - {"2a05:26c0::/40", "201536"}, - {"2406:e001:c800::/34", "23655"}, - {"2409:8020:1091::/42", "56046"}, - {"2409:804c:3025::/40", "9808"}, - {"2a0c:9c80::/29", "204760"}, - {"2001:559:868c::/48", "22909"}, - {"2803:b4e0::/32", "263218"}, - {"2a00:1d58:f800::/43", "47524"}, - {"2a07:a300::/30", "400177"}, - {"2a0b:b87:ffbb::/48", "212831"}, - {"2001:559:48e::/47", "33657"}, - {"2001:678:dbc::/48", "213067"}, - {"2001:df0:5d40::/48", "142394"}, - {"2001:4978:1000::/47", "19255"}, - {"2409:8c39::/30", "9808"}, - {"2804:14d:a400::/40", "28573"}, - {"2804:522c::/32", "268500"}, - {"2a04:b907::/48", "211321"}, - {"2400:180:9::/48", "4766"}, - {"2403:a140:100::/40", "141771"}, - {"240a:a4f0::/32", "143914"}, - {"2804:1224::/32", "263459"}, - {"2a00:8a00:4f02::/35", "8983"}, - {"2a02:26f7:b8c9::/46", "20940"}, - {"2001:4090::/31", "12312"}, - {"2401:d800:7f52::/40", "7552"}, - {"2804:1784:12a::/45", "263152"}, - {"2a0e:aa07:e027::/48", "210815"}, - {"240a:a63e::/32", "144248"}, - {"2600:6c38:84b::/43", "20115"}, - {"2603:c0f0:2820::/39", "6142"}, - {"2a0c:5247:8000::/36", "208861"}, - {"2a0e:bf01:101::/32", "202539"}, - {"2600:5c01:e0a::/48", "11351"}, - {"2603:c0e0:2110::/40", "54253"}, - {"2620:10b:b000::/44", "11807"}, - {"2801:13e:6::/40", "19429"}, - {"2a02:2298:4000::/36", "15544"}, - {"2a02:28c8::/32", "42353"}, - {"2a0c:8d80::/29", "212991"}, - {"2a0f:85c1:50::/48", "210202"}, - {"240a:a1a4::/32", "143070"}, - {"240a:a3e0::/32", "143642"}, - {"2607:e600::/32", "32719"}, - {"2803:160::/32", "267932"}, - {"2a01:9420::/29", "62099"}, - {"2401:d800:fd60::/40", "7552"}, - {"2409:8020:1081::/43", "56046"}, - {"2600:1419:2601::/36", "20940"}, - {"2001:253:12a::/45", "38272"}, - {"2401:d800:12::/42", "7552"}, - {"2001:44b8:503a::/34", "4739"}, - {"2606:7f00:400::/40", "32307"}, - {"2620:112:4000::/47", "36204"}, - {"2001:250:102e::/38", "23910"}, - {"2a03:ad40:420::/48", "54995"}, - {"2a0a:7c00::/29", "38955"}, - {"2402:800:7da0::/41", "7552"}, - {"2409:8e75::/28", "9808"}, - {"2600:141c:6801::/35", "20940"}, - {"2804:1e74::/32", "264430"}, - {"2a12:8f40::/32", "60488"}, - {"2001:44b8:2048::/48", "7545"}, - {"2800:300:89a0::/41", "27986"}, - {"2a05:e380::/46", "15739"}, - {"2a0c:b641:d0::/46", "212196"}, - {"2409:8054:300a::/43", "56040"}, - {"240a:ac52::/32", "145804"}, - {"240e:44d:340::/42", "140346"}, - {"2600:6c38:e0c::/47", "20115"}, - {"2804:3b8:9::/41", "52965"}, - {"2001:559:819c::/48", "33652"}, - {"2001:678:3e8::/48", "206108"}, - {"2a02:2190::/29", "44134"}, - {"2a0e:46c4:2900::/48", "138435"}, - {"2001:fd8:2a0::/48", "132199"}, - {"2401:9d00::/47", "9835"}, - {"2409:8235::/23", "9808"}, - {"2800:c80::/32", "61510"}, - {"2a01:4a0:1f::/42", "201011"}, - {"2a0c:9640::/29", "197248"}, - {"2c0f:ef20::/32", "37611"}, - {"2001:559:8719::/48", "33651"}, - {"2406:3540::/48", "17415"}, - {"2408:8957:8f00::/40", "17816"}, - {"2a00:c980::/29", "52148"}, - {"2001:57a:f210::/46", "22773"}, - {"2408:8456:d010::/42", "134543"}, - {"240a:af3b::/32", "146549"}, - {"2801:12:e800::/48", "271885"}, - {"2a02:88d:f::/48", "47794"}, - {"2a03:dc0::/32", "61428"}, - {"2a04:fa80:2::/44", "2635"}, - {"2a05:3580:28::/34", "35807"}, - {"2001:408:ff02::/40", "14793"}, - {"2001:559:7c7::/48", "20214"}, - {"2001:9e8:2004::/39", "8881"}, - {"2400:cb00:70::/44", "13335"}, - {"2600:1419:e801::/37", "20940"}, - {"2602:fdd3::/36", "46573"}, - {"2620:8::/41", "6327"}, - {"2a02:26f0:bb01::/37", "20940"}, - {"2604:d700::/32", "53824"}, - {"2001:559:54b::/48", "33657"}, - {"2001:559:c0cb::/48", "33651"}, - {"2400:cb00:a6a0::/45", "13335"}, - {"2a0a:b300::/29", "206951"}, - {"2001:559:3b9::/48", "21508"}, - {"2404:a800:2002::/36", "9498"}, - {"2406:7440::/32", "131970"}, - {"240c:ca22::/32", "23910"}, - {"2603:90bd::/32", "11955"}, - {"2620:a0:2000::/48", "397994"}, - {"2804:3c50::/32", "266203"}, - {"2804:7898:5ff0::/44", "271253"}, - {"2a01:440:510::/29", "29551"}, - {"2a02:218::/29", "44973"}, - {"2a0d:2406:1134::/48", "202656"}, - {"2001:4830:100::/40", "27552"}, - {"2804:22c:f002::/37", "22689"}, - {"2a03:9960::/32", "208719"}, - {"2a07:a100::/29", "202701"}, - {"240a:a5d6::/32", "144144"}, - {"2600:1004:b0f0::/44", "22394"}, - {"2a02:26f7:de8c::/48", "36183"}, - {"2a07:1180::/29", "203311"}, - {"2a0c:89c0::/29", "43260"}, - {"2a11:e180::/29", "204790"}, - {"240a:a7b7::/32", "144625"}, - {"240a:aa76::/32", "145328"}, - {"2604:d600:161a::/47", "32098"}, - {"2620:4f:e000::/48", "22652"}, - {"2804:19c8::/35", "61818"}, - {"2405:4802:1270::/37", "18403"}, - {"2409:806b:900::/35", "9808"}, - {"2803:140::/32", "264622"}, - {"2001:500:4e::/47", "207266"}, - {"2001:559:85f0::/48", "33657"}, - {"2804:1b2:f080::/41", "10429"}, - {"2a00:ad87:1303::/48", "198573"}, - {"2a06:cd40:1::/46", "43927"}, - {"2600:6c10:f608::/43", "20115"}, - {"2600:cc04:e100::/35", "32298"}, - {"2a0f:2c80::/48", "40676"}, - {"2001:559:2d1::/48", "33491"}, - {"2001:49f0:d0d9::/46", "30058"}, - {"2804:18:1850::/44", "10429"}, - {"2804:6c18:8000::/33", "270445"}, - {"2a02:26f7:d4d1::/42", "20940"}, - {"2400:dd06:1006::/28", "7497"}, - {"2402:d000:1065::/44", "9329"}, - {"2001:559:c159::/48", "7922"}, - {"2409:8c2f:3820::/32", "56041"}, - {"2804:510::/32", "28163"}, - {"2a01:4f00::/34", "35047"}, - {"2a02:fe80:20::/46", "30148"}, - {"2a07:7d40::/29", "202876"}, - {"2a0a:5ec0::/29", "206123"}, - {"2804:7ec8::/32", "271647"}, - {"2001:559:8798::/47", "7922"}, - {"2803:d700:4000::/32", "61461"}, - {"2a02:26f7:d1c9::/46", "20940"}, - {"2001:df7:6c80::/48", "146963"}, - {"2403:5000:166::/43", "9304"}, - {"240e:44d:2600::/41", "140345"}, - {"2620:104:4000::/45", "15248"}, - {"2804:2838:21a::/32", "263948"}, - {"2a03:220:f001::/36", "61400"}, - {"2001:da8:3009::/48", "23910"}, - {"2401:4900:43a0::/44", "45609"}, - {"2409:8924:1100::/38", "56046"}, - {"240a:acad::/32", "145895"}, - {"2600:1308::/32", "20021"}, - {"2600:2500::/31", "26801"}, - {"2a01:7e00::/31", "63949"}, - {"2a10:9880::/29", "39050"}, - {"2001:42d0:1500::/40", "33764"}, - {"2408:8956:6300::/40", "17816"}, - {"2001:678:870::/48", "199815"}, - {"2401:2900::/40", "23679"}, - {"2404:6140::/33", "138143"}, - {"2405:4803:270::/40", "18403"}, - {"2600:6c1c::/30", "20115"}, - {"2607:f368:1003::/48", "46846"}, - {"2a00:fb8::/33", "8881"}, - {"2a00:c1e0::/29", "59891"}, - {"240a:ac82::/32", "145852"}, - {"2600:100d:b100::/42", "6167"}, - {"2600:6c7f:9410::/44", "20001"}, - {"2606:a4c0::/32", "400290"}, - {"2001:559:c2d5::/48", "33652"}, - {"2402:800:34fe::/39", "7552"}, - {"240a:aa47::/32", "145281"}, - {"2602:805:2000::/45", "394392"}, - {"2602:fc23:162::/36", "8095"}, - {"2602:fc3b:201::/39", "399970"}, - {"2607:f478::/32", "18540"}, - {"2804:136c::/32", "262372"}, - {"2804:2f74::/32", "264892"}, - {"2a07:a680::/29", "60111"}, - {"2a0e:b107:790::/44", "208680"}, - {"2001:559:c10b::/48", "33657"}, - {"2405:7000:500::/34", "9354"}, - {"2a05:ec0::/29", "56828"}, - {"2001:559:760::/48", "33659"}, - {"2401:4900:3bc0::/42", "45609"}, - {"240a:aa0e::/32", "145224"}, - {"2a0f:c087:f51c::/48", "212521"}, - {"2001:67c:20dc::/48", "51740"}, - {"2607:f738:400::/39", "17184"}, - {"2610:a1:1025::/48", "397228"}, - {"2804:2e4c::/32", "265337"}, - {"2001:4928::/32", "13819"}, - {"240e:1a:40::/44", "137702"}, - {"2806:2f0:6061::/46", "17072"}, - {"2806:10be:2::/45", "8151"}, - {"2a02:6f00:ec0::/48", "59518"}, - {"2001:559:271::/48", "7725"}, - {"2001:de4::/48", "131621"}, - {"2604:d680::/48", "29757"}, - {"2a02:26f7:dd80::/48", "36183"}, - {"2a03:d940::/32", "6833"}, - {"2a07:ac80::/29", "44812"}, - {"2607:f360::/39", "32592"}, - {"2804:4054::/32", "265952"}, - {"2a02:26f7:b9c0::/48", "36183"}, - {"2409:8914:f00::/35", "56044"}, - {"240a:a0de::/32", "142872"}, - {"240a:ae4d::/32", "146311"}, - {"2804:6944::/32", "270259"}, - {"2a01:65c0::/32", "3242"}, - {"2a06:140::/29", "47704"}, - {"2404:4a00:6501:1::/36", "45629"}, - {"2603:90fb:10::/44", "20115"}, - {"2804:48e4::/32", "267151"}, - {"2804:6ac8:2704::/32", "270358"}, - {"2a11:f0c0::/29", "204790"}, - {"2001:470:120::/48", "63343"}, - {"2803:32e0::/32", "269928"}, - {"2804:6830::/32", "269674"}, - {"2a0e:c80:403::/48", "40676"}, - {"2001:559:8720::/48", "33491"}, - {"2606:4700:ff02::/48", "395747"}, - {"2402:1d40:4001::/45", "58826"}, - {"240e:30c:4a00::/35", "137688"}, - {"2607:f108:4900::/32", "29838"}, - {"2a02:26f7:ed00::/48", "36183"}, - {"2a0c:c640::/29", "50489"}, - {"2400:9380:9070::/47", "4809"}, - {"2404:fc40::/32", "133971"}, - {"2407:4d00::/48", "38841"}, - {"2a0b:20c0::/39", "205766"}, - {"2001:559:86ce::/48", "7016"}, - {"2602:fd91::/36", "399533"}, - {"2607:9f00:3::/48", "25875"}, - {"2001:480:90::/48", "5980"}, - {"2001:da8:24f::/43", "24350"}, - {"2408:8456:3850::/39", "17816"}, - {"2607:ff60:4::/43", "3900"}, - {"2804:57c4::/32", "268085"}, - {"2a0e:cd40::/29", "35048"}, - {"2a0f:bd40::/32", "197560"}, - {"2803:9c0:100::/40", "265695"}, - {"2803:2280::/32", "264663"}, - {"2804:1600::/32", "263421"}, - {"2401:d800:76d0::/42", "7552"}, - {"2405:8a00:8034::/34", "55824"}, - {"2408:8459:26c0::/36", "17816"}, - {"2a02:26f7:e608::/48", "36183"}, - {"2a04:d900::/29", "8470"}, - {"2a10:bec0::/29", "13247"}, - {"2404:ae00::/48", "45474"}, - {"2a00:7180::/33", "15557"}, - {"2a0d:cc80::/29", "59493"}, - {"2a0f:85c1:cafe::/48", "207781"}, - {"2400:9380:8001::/48", "4134"}, - {"2406:da1a::/36", "16509"}, - {"2602:ffe4:c09::/46", "21859"}, - {"2620:8a::/48", "19574"}, - {"2a02:26f7:f58c::/48", "36183"}, - {"2a05:dfc0::/29", "61138"}, - {"2a0a:7c0::/29", "34909"}, - {"2401:d800:5060::/40", "7552"}, - {"240e:67c:1000::/37", "140330"}, - {"2a05:91c0::/32", "56430"}, - {"2001:559:8220::/48", "33650"}, - {"2001:fd8:b3f0::/33", "4775"}, - {"2401:d800:d570::/40", "7552"}, - {"240a:aac0::/32", "145402"}, - {"2604:7100::/32", "32391"}, - {"2605:2700::/32", "47066"}, - {"2001:df7:2b00::/48", "58965"}, - {"2804:3dc0:e000::/35", "266551"}, - {"2607:fdf0:5e86::/44", "8008"}, - {"2607:ffd0::/45", "13767"}, - {"2001:559:3cb::/48", "33491"}, - {"2404:bf40:ea01::/46", "139084"}, - {"2407:f100::/45", "133075"}, - {"2804:2060::/32", "264489"}, - {"2804:4850::/39", "267113"}, - {"2a05:4140:187::/48", "211358"}, - {"2a04:4e40:2800::/48", "54113"}, - {"2a05:b0c6:200f::/48", "208753"}, - {"2001:559:218::/48", "33651"}, - {"2001:559:c334::/48", "33660"}, - {"2001:1248:9c15::/44", "11172"}, - {"2404:8d00:1410::/36", "24378"}, - {"2406:e000:37a::/40", "23655"}, - {"2408:8956:1bc0::/37", "17622"}, - {"2a05:9bc0::/44", "51559"}, - {"2a0e:b107:14c0::/47", "211042"}, - {"2a12:a740::/29", "400522"}, - {"2001:250:3800::/45", "138440"}, - {"2801:13a::/44", "270028"}, - {"2804:80b8::/36", "271769"}, - {"2a06:f901:4000::/36", "8849"}, - {"2001:16a2:360a::/43", "25019"}, - {"2a00:83e0::/32", "199496"}, - {"2a0c:93c0:6002::/48", "212465"}, - {"2001:559:c3bb::/41", "33287"}, - {"2001:978:6713::/45", "174"}, - {"2001:ee0::/38", "45899"}, - {"240a:ad7d::/32", "146103"}, - {"2600:1f01:4810::/47", "16509"}, - {"2a02:26f0:7101::/37", "20940"}, - {"2001:678:de0::/48", "21158"}, - {"2405:8000::/32", "38462"}, - {"2800:bf0:a801::/45", "27947"}, - {"2804:ff8::/32", "263611"}, - {"2804:25bc::/44", "264299"}, - {"2001:1900:2265::/46", "3356"}, - {"240e:6:d013::/44", "4134"}, - {"2602:fcd7::/36", "6939"}, - {"2800:160:137f::/40", "14259"}, - {"2804:22e0::/32", "264128"}, - {"2804:483c::/32", "267106"}, - {"2a0b:f5c0::/29", "205377"}, - {"2001:559:3eb::/48", "33657"}, - {"2001:559:426::/48", "22258"}, - {"2600:1415:3801::/37", "20940"}, - {"2602:feda:ce0::/48", "141237"}, - {"2804:5660::/32", "267994"}, - {"2804:8028::/32", "271733"}, - {"2a07:14c0:8000::/29", "208861"}, - {"2a0e:b107:100::/44", "211972"}, - {"2a0e:b107:ff0::/48", "42394"}, - {"2001:250:341a::/47", "138438"}, - {"2405:7f00:a560::/36", "133414"}, - {"2409:8d14:2400::/38", "56044"}, - {"2600:1008:b070::/40", "22394"}, - {"2801:80:2210::/48", "267525"}, - {"2a00:fa60:1510::/44", "200077"}, - {"2a0b:71c0:1::/48", "56583"}, - {"2a10:a380::/29", "196777"}, - {"2a02:2858::/29", "8315"}, - {"2001:559:740::/48", "21508"}, - {"2400:dd02:1013::/31", "7497"}, - {"240a:ad73::/32", "146093"}, - {"2001:559:c3f2::/48", "33657"}, - {"2404:e0::/29", "703"}, - {"2406:9900::/32", "17936"}, - {"2407:e940::/48", "18403"}, - {"2600:6c10:816::/47", "20115"}, - {"2606:6c00:2::/48", "32787"}, - {"2a03:db80:2c14::/48", "47610"}, - {"2a11:28c0::/47", "212688"}, - {"2c0f:fb30::/32", "37412"}, - {"2001:559:8417::/44", "7016"}, - {"2803:2e0::/32", "269917"}, - {"2a10:2f00:13a::/48", "213069"}, - {"2001:559:c161::/46", "7922"}, - {"2001:697::/32", "199155"}, - {"2404:1c40:b0::/45", "24432"}, - {"2409:8704:7d00::/32", "24547"}, - {"2606:2ac0::/32", "46962"}, - {"2607:f110:140::/32", "21889"}, - {"2804:670::/32", "262665"}, - {"2a03:61a0::/32", "202719"}, - {"2a12:4946:1658::/48", "211398"}, - {"2001:468:c0f::/41", "10886"}, - {"2402:800:7820::/41", "7552"}, - {"240e:397:1500::/38", "140492"}, - {"2602:fca6::/36", "399466"}, - {"2804:6e34::/32", "270582"}, - {"2001:67c:1e8::/48", "49820"}, - {"2404:b0::/44", "4750"}, - {"240e:438:6840::/38", "4134"}, - {"2804:4e34::/32", "268246"}, - {"240a:ab77::/32", "145585"}, - {"2620:104:e000:ad::/64", "13536"}, - {"2800:160:142e::/43", "14259"}, - {"2a0a:2bc0::/32", "206894"}, - {"2001:559:45c::/48", "33652"}, - {"2001:559:7b7::/48", "7922"}, - {"2001:978:2100:100::/38", "174"}, - {"240a:a999::/32", "145107"}, - {"2603:ffb8::/25", "397165"}, - {"2801:80:c90::/48", "61656"}, - {"2a10:8980::/29", "15623"}, - {"2804:778::/32", "262411"}, - {"2804:eec::/35", "28226"}, - {"2a02:26c8::/32", "13156"}, - {"2a0f:ae40::/32", "207489"}, - {"2001:550::/47", "174"}, - {"2001:49f0:a00b::/43", "174"}, - {"240e:438:9420::/43", "140647"}, - {"2800:484:b800::/40", "10620"}, - {"2a00:cd80::/33", "24848"}, - {"2a0b:300::/29", "61317"}, - {"2607:fb90:c151::/36", "21928"}, - {"2a00:1288:ef99::/41", "10310"}, - {"2a04:fa87:fffd::/46", "2635"}, - {"2600:1415:9::/48", "20940"}, - {"2801:104:20::/44", "27828"}, - {"2804:128::/32", "28634"}, - {"2a02:2698:1c00::/38", "34590"}, - {"2a02:26f7:bec1::/46", "20940"}, - {"2a03:4b27:d000::/36", "206452"}, - {"2602:fd75:1::/46", "46793"}, - {"2001:7f8:69::/48", "201925"}, - {"240a:af9e::/32", "146648"}, - {"2804:8610::/32", "272618"}, - {"2a02:26f7:f68c::/48", "36183"}, - {"2001:4b58::/32", "6802"}, - {"2401:d800:5142::/42", "7552"}, - {"2402:9f00::/32", "58740"}, - {"2602:ff50:200::/48", "63452"}, - {"2602:ff62:203::/45", "61317"}, - {"2605:c140::/32", "32674"}, - {"2a00:ff40::/32", "6782"}, - {"2a0c:b641:493::/48", "53356"}, - {"2c0f:ea00::/32", "327733"}, - {"2610:1c0::/31", "11403"}, - {"2620:74:a9::/45", "7342"}, - {"2804:5d80::/33", "268976"}, - {"2806:2f0:9b83::/42", "17072"}, - {"2001:67c:1d0::/48", "42061"}, - {"2404:3d00:40e0::/47", "21433"}, - {"240e:67b:e400::/39", "140330"}, - {"2804:3900::/32", "266517"}, - {"2a00:1ef8::/32", "29690"}, - {"2a03:32c0:17::/34", "48503"}, - {"2a09:6a80::/48", "50007"}, - {"2001:559:567::/48", "33657"}, - {"2001:d38::/32", "2914"}, - {"2001:1980:6300::/36", "29838"}, - {"2804:7d00::/32", "271532"}, - {"2404:4600:fce::/48", "45991"}, - {"2409:8057:380f::/48", "56040"}, - {"2602:ff52::/48", "394923"}, - {"2607:f738:900::/41", "17184"}, - {"2804:690::/32", "262595"}, - {"2a0f:9400:8019::/48", "213262"}, - {"2001:559:87dd::/48", "7016"}, - {"2001:559:c012::/48", "33657"}, - {"2001:df0:1740::/48", "142369"}, - {"240e:980:4700::/40", "131325"}, - {"2a0c:2f07:9459::/48", "206924"}, - {"2403:1480:1000::/36", "36351"}, - {"2404:fa00:d000::/36", "45780"}, - {"240a:ae9f::/32", "146393"}, - {"2a03:a3a0::/32", "25780"}, - {"2a0b:4fc1::/32", "205688"}, - {"2c0f:fa78::/32", "37387"}, - {"2001:559:21e::/48", "7922"}, - {"2001:1248:5627::/43", "11172"}, - {"2001:4403:deae::/34", "9500"}, - {"2404:9600:400::/32", "7600"}, - {"2804:4f8:6200::/36", "28263"}, - {"2804:1408:6001::/35", "28635"}, - {"2a01:238:20b::/37", "6724"}, - {"2a0b:f940:1af3::/34", "205373"}, - {"2001:480:21::/46", "668"}, - {"2001:da8:c8::/48", "138442"}, - {"2001:4cc0::/32", "8426"}, - {"2404:bf40::/32", "139084"}, - {"2a02:b48::/33", "39572"}, - {"2a0e:97c3:631::/48", "20473"}, - {"2c0f:f140:e000::/35", "327700"}, - {"2001:67c:294c::/48", "210211"}, - {"2409:804c:25::/44", "9808"}, - {"2409:8078:2100::/36", "9808"}, - {"240a:a5cc::/32", "144134"}, - {"240e:e9:6800::/37", "134770"}, - {"240e:438:2c40::/38", "4134"}, - {"2800:bf0:3000::/44", "52257"}, - {"2804:3dc::/46", "52967"}, - {"2804:14a4::/32", "263341"}, - {"2001:7f8:31::/48", "24957"}, - {"2001:4d78:fe13::/48", "15830"}, - {"2804:695c::/32", "270265"}, - {"2403:6200:7602::/48", "138685"}, - {"2a02:26f7:e244::/48", "36183"}, - {"2a06:2540::/29", "44994"}, - {"2001:559:82d8::/47", "7922"}, - {"2001:67c:18c0::/48", "62311"}, - {"2404:bf40:e006::/48", "7545"}, - {"2a03:85c1:925d::/29", "20561"}, - {"2408:8459:6050::/38", "17816"}, - {"240e:965:e400::/39", "133775"}, - {"2800:b10:100::/44", "27884"}, - {"2a04:9a00:1001::/46", "202553"}, - {"2a0e:b107:16::/48", "208191"}, - {"2001:cb0:20c::/47", "4637"}, - {"2605:f700:10::/48", "18978"}, - {"2607:f7d8::/32", "26554"}, - {"2804:85a4::/32", "272592"}, - {"2806:2f0:50c1::/46", "17072"}, - {"2408:8957:a900::/40", "17816"}, - {"2600:8804:3f07::/32", "22773"}, - {"2605:6080::/32", "62833"}, - {"2607:3200:13::/45", "11240"}, - {"2804:ef8::/32", "262302"}, - {"2c0f:f0c8::/32", "328037"}, - {"2404:8640::/32", "17675"}, - {"2600:1008:e010::/36", "22394"}, - {"2804:3cb8::/32", "53221"}, - {"2806:2f0:8460::/35", "17072"}, - {"2403:7a40::/32", "133317"}, - {"240a:a789::/32", "144579"}, - {"2404:5540::/37", "134715"}, - {"240e:965:f400::/39", "58772"}, - {"2600:370f:3725::/44", "32261"}, - {"2800:160:15f0::/38", "14259"}, - {"2a03:5d80::/32", "44858"}, - {"240a:a72f::/32", "144489"}, - {"2605:32c0::/32", "5670"}, - {"2a00:cb0::/34", "29624"}, - {"2a03:5a00:4::/48", "34518"}, - {"2001:44b8:30a3::/48", "4739"}, - {"2404:bf40:f804::/37", "139084"}, - {"2409:8950::/30", "56047"}, - {"240e:3b0:2c00::/35", "134774"}, - {"2a02:26f7:d194::/48", "36183"}, - {"2a02:26f7:e988::/48", "36183"}, - {"2401:7200::/47", "55328"}, - {"2404:d500:6::/44", "132370"}, - {"240a:a6e2::/32", "144412"}, - {"240c:c030::/24", "23910"}, - {"2610:a1:3060::/48", "12008"}, - {"2804:59cc::/32", "268726"}, - {"2a01:5b80::/32", "13226"}, - {"2a0b:b140::/29", "62000"}, - {"2001:559:866c::/48", "33651"}, - {"2602:fec2::/32", "16713"}, - {"2a02:26f7:18::/48", "36183"}, - {"2a04:4e40:b410::/41", "54113"}, - {"2a0c:b641:45a::/48", "208850"}, - {"2a0d:a740::/48", "208673"}, - {"2602:10d::/33", "20115"}, - {"2806:2f0:50e3::/39", "17072"}, - {"2001:559:c108::/48", "33287"}, - {"240e:1a:150::/44", "134770"}, - {"2600:9000:117e::/48", "16509"}, - {"2605:4c0::/32", "6939"}, - {"2401:b780:5010::/47", "65435"}, - {"2405:1e40:2::/32", "58475"}, - {"2405:ba00:8804::/48", "7160"}, - {"2801:80:17b3::/41", "61580"}, - {"2001:918:ffab::/43", "3303"}, - {"2404:3d00:40d7::/48", "21433"}, - {"2408:8256:378c::/43", "17623"}, - {"2620:112:c000::/40", "29899"}, - {"2804:60:40::/32", "53066"}, - {"2804:5bf4::/32", "268879"}, - {"2804:7d60::/32", "20473"}, - {"2a06:a000:1d0::/44", "142594"}, - {"2a0b:3c40:fca6::/48", "208258"}, - {"2001:ee0:cc40::/40", "45899"}, - {"2600:9000:1188::/46", "16509"}, - {"2804:66b4::/32", "269577"}, - {"2a02:e982:27::/43", "19551"}, - {"2600:1006:9140::/44", "6167"}, - {"2603:c013:e000::/36", "31898"}, - {"2806:230:1014::/48", "265594"}, - {"2a02:6ea0:e000::/38", "60068"}, - {"2a07:22c1:4::/48", "212845"}, - {"2a07:2680::/29", "8823"}, - {"2001:559:82aa::/48", "7015"}, - {"2408:8456:f140::/28", "17816"}, - {"240a:a271::/32", "143275"}, - {"2620:119:50d2::/48", "13443"}, - {"2804:7b1c::/32", "271411"}, - {"2400:cb00:a310::/45", "13335"}, - {"2401:d800:52a0::/41", "7552"}, - {"240a:a935::/32", "145007"}, - {"2803:ad80:69::/48", "42473"}, - {"2a00:ebe0::/32", "62423"}, - {"2a04:9ac0::/32", "62242"}, - {"240e:44d:6f80::/41", "4134"}, - {"2605:2800:c300::/48", "11481"}, - {"2804:a80::/32", "262293"}, - {"2804:539c::/32", "268595"}, - {"2404:b0:1005::/48", "135586"}, - {"240e:108:99::/48", "4816"}, - {"2604:180:9::/45", "3842"}, - {"2800:160:1770::/44", "14259"}, - {"2804:1884::/32", "61937"}, - {"2804:6374::/32", "269362"}, - {"2a00:ece1:2::/48", "43474"}, - {"2a10:57c0::/29", "8767"}, - {"2403:5180:5::/48", "134666"}, - {"2409:804c:23::/45", "9808"}, - {"2607:fa48:fc11::/29", "5769"}, - {"2610:a8::/32", "600"}, - {"2a05:f507::/45", "13443"}, - {"2a07:9140::/29", "57475"}, - {"2001:250:6408::/43", "24367"}, - {"2001:dd8:12::/48", "18366"}, - {"2408:8459:cc10::/42", "17623"}, - {"2607:9800:c117::/35", "15085"}, - {"2a03:1aa0::/33", "201730"}, - {"2a03:4d43:2800::/32", "199610"}, - {"2a10:2f00:15d::/48", "39282"}, - {"2001:504:35::/48", "14432"}, - {"2001:559:86c4::/47", "33490"}, - {"2001:67c:130::/48", "30857"}, - {"2401:c900:1400::/38", "36351"}, - {"2405:ba00:8004::/48", "1217"}, - {"2600:1403:6c00::/48", "35994"}, - {"2602:ff62:82::/39", "61317"}, - {"2804:4398::/32", "267578"}, - {"2804:6fdc::/32", "270689"}, - {"2a06:62c0:51::/40", "204138"}, - {"2a06:b5c0::/30", "400177"}, - {"2a07:a540::/29", "394545"}, - {"2001:559:8694::/48", "33651"}, - {"2001:559:c4ea::/48", "7922"}, - {"2604:3d80:808::/48", "394302"}, - {"2804:ae0:8500::/38", "28352"}, - {"2804:7dd8::/32", "271586"}, - {"2001:559:c16c::/48", "33489"}, - {"2001:da8:22c::/48", "23910"}, - {"2001:df7:e180::/48", "137165"}, - {"2406:2000:fc::/46", "10229"}, - {"2a02:26f7:cd41::/46", "20940"}, - {"2a03:6920::/32", "60592"}, - {"2a04:1b00:a::/47", "61007"}, - {"2a04:a4c0::/48", "59789"}, - {"2403:e200:405::/36", "45543"}, - {"2804:83b8::/33", "272214"}, - {"2408:8957:3000::/40", "17622"}, - {"240a:a4cd::/32", "143879"}, - {"240e:a65::/35", "140329"}, - {"2600:9000:1e05::/48", "16509"}, - {"2001:678:f0c::/48", "211638"}, - {"2402:ef02::/31", "7633"}, - {"2409:8004:807::/44", "9808"}, - {"2600:1011::/32", "6167"}, - {"2607:f220:41e::/48", "70"}, - {"2804:40dc::/32", "265986"}, - {"2a01:1b0:c000::/44", "51923"}, - {"2a03:2880:f267::/44", "32934"}, - {"2001:559:87a1::/45", "7015"}, - {"2403:2200::/48", "45148"}, - {"240e:9:7000::/32", "4134"}, - {"2a00:d600::/32", "24778"}, - {"2001:559:8389::/48", "33651"}, - {"2405:9800:100::/44", "131445"}, - {"2602:fd3a:229::/48", "14618"}, - {"2804:104c:2800::/40", "263629"}, - {"2a02:d880::/32", "41960"}, - {"2a07:3740::/29", "47132"}, - {"2804:5f68::/32", "269097"}, - {"2a0b:b87:ffee::/48", "213361"}, - {"2001:559:85c0::/48", "7922"}, - {"2001:1620:2015::/48", "35663"}, - {"2001:49f0:d200::/48", "30058"}, - {"2403:7cc0::/32", "138179"}, - {"2a02:730:4001::/36", "29278"}, - {"2401:0:8001::/48", "23966"}, - {"2607:f390:7200::/39", "17244"}, - {"2a02:26f7:d580::/48", "36183"}, - {"2804:8280::/37", "272521"}, - {"2a01:c9c0:bf::/48", "24600"}, - {"2a02:26f7:b889::/42", "20940"}, - {"2a02:7b07:fff::/48", "48328"}, - {"2a03:2ca0:3136::/32", "59865"}, - {"2a03:87c0::/29", "31042"}, - {"2a04:9a00:100e::/48", "202553"}, - {"2a0e:e280::/29", "208740"}, - {"2001:b68::/32", "2108"}, - {"2001:da8:a2::/48", "24357"}, - {"2407:6e00:4::/48", "38332"}, - {"2606:3080::/32", "16423"}, - {"2804:108c:fa00::/37", "28146"}, - {"2a10:1c0::/29", "207297"}, - {"2001:559:834d::/48", "33651"}, - {"2600:1f15::/36", "16509"}, - {"2620:0:2ee0::/48", "20144"}, - {"2801:1fc:36::/48", "27951"}, - {"2804:3440::/32", "265445"}, - {"2001:559:8645::/46", "33651"}, - {"2001:448a:50d0::/42", "7713"}, - {"2607:fe68::/32", "15146"}, - {"2402:800:f7e0::/36", "7552"}, - {"2600:1006:f150::/31", "22394"}, - {"2600:1010:9100::/44", "6167"}, - {"2a01:5041:5000::/48", "202196"}, - {"2001:250:218::/48", "24349"}, - {"2402:e380:319::/48", "141374"}, - {"2403:4c00::/32", "24453"}, - {"2405:1c0:7151::/48", "55303"}, - {"2804:6df0:8000::/33", "270565"}, - {"2001:fc0::/32", "17547"}, - {"2404:f780::/46", "136557"}, - {"240a:aee5::/32", "146463"}, - {"240e:67f:e600::/24", "4134"}, - {"2604:dfc0::/32", "14727"}, - {"2605:640f:640f::/48", "211066"}, - {"2607:fc88::/32", "30475"}, - {"2801:8e::/36", "11993"}, - {"2804:3b0:4002::/32", "53062"}, - {"2804:164c:fad::/32", "263280"}, - {"2806:20d:504b::/43", "32098"}, - {"2001:67c:2674::/48", "57684"}, - {"2a0c:dec0:3008::/48", "207063"}, - {"2001:559:86c6::/44", "7922"}, - {"2001:4de0:2101::/48", "34305"}, - {"2606:1b00::/32", "11722"}, - {"2801:16:800::/48", "19429"}, - {"2a02:5320:100::/40", "12189"}, - {"2a0d:8480::/48", "48282"}, - {"2001:559:806b::/45", "7725"}, - {"2001:1248:84e4::/44", "11172"}, - {"2404:140::/32", "37992"}, - {"2409:8904:d070::/40", "24547"}, - {"2806:310:d::/43", "16960"}, - {"2001:559:143::/45", "7922"}, - {"2001:df4:4700::/48", "137107"}, - {"2001:1248:561b::/42", "11172"}, - {"240e:983:1301::/40", "4134"}, - {"2a02:2af8::/39", "702"}, - {"2a0c:f440::/29", "200319"}, - {"2001:550:9101::/38", "174"}, - {"2401:1740:3000::/48", "136600"}, - {"240a:aba6::/32", "145632"}, - {"2804:14d:6887::/44", "28573"}, - {"2804:2a30::/32", "264063"}, - {"2804:6290::/32", "269304"}, - {"2806:2f0:1181::/48", "22884"}, - {"2a0f:8d40::/29", "207670"}, - {"2404:f4c0:ea02::/40", "140731"}, - {"2605:a401:8369::/40", "33363"}, - {"2607:fc48:bc08::/48", "40009"}, - {"2804:cd0::/32", "52557"}, - {"2a04:ce40::/29", "13157"}, - {"2001:480:31::/48", "5887"}, - {"2001:4940:2002::/32", "21547"}, - {"2408:80e9:4000::/34", "4837"}, - {"240a:aee6::/32", "146464"}, - {"2401:1800::/32", "45187"}, - {"2402:e280:2157::/44", "134674"}, - {"2403:2880::/32", "131905"}, - {"2a0b:5080::/29", "43402"}, - {"2606:9400::/32", "3737"}, - {"2800:484:7700::/36", "14080"}, - {"2a03:2480:8023::/48", "200107"}, - {"2602:fd10:e00::/40", "399980"}, - {"2001:559:c3de::/47", "7922"}, - {"2401:4900:4f00::/45", "45609"}, - {"2402:800:398d::/43", "7552"}, - {"2402:e280:222d::/43", "134674"}, - {"2620:52:6::/48", "21785"}, - {"2804:72e4::/34", "270882"}, - {"2a02:ac80:b01::/37", "25145"}, - {"2a10:77c0::/29", "212144"}, - {"2001:4868:4300::/32", "701"}, - {"2620:74:2c::/48", "396574"}, - {"2408:8957:7840::/40", "17622"}, - {"2a01:ce9e:1000::/31", "51964"}, - {"2409:8924:2100::/38", "56046"}, - {"2409:896a:3000::/39", "9808"}, - {"240e:980:4c00::/40", "58519"}, - {"2602:809:c000::/44", "54364"}, - {"2607:fdf0:5e7a::/40", "8008"}, - {"2804:6acc::/32", "270359"}, - {"2a02:2818:5::/48", "196705"}, - {"2001:559:83d7::/48", "7015"}, - {"2001:559:85a5::/46", "33659"}, - {"2001:559:c192::/48", "7015"}, - {"2400:9380:97c0::/44", "136167"}, - {"2620:125:b000::/47", "15092"}, - {"2800:4b0:400d::/43", "12252"}, - {"2804:811c::/32", "272433"}, - {"240e:109:8048::/48", "134769"}, - {"2620:126:5040::/47", "27632"}, - {"2804:248:9::/39", "28598"}, - {"2a00:9801:e001::/48", "199072"}, - {"2a02:720:300::/32", "34427"}, - {"2404:c400:dc05::/48", "58735"}, - {"2800:160:1a1b::/42", "14259"}, - {"2a0a:b440::/29", "212755"}, - {"2a0d:8f80::/29", "204790"}, - {"240e:109:8029::/48", "4134"}, - {"2604:5c80::/32", "21981"}, - {"2804:dd4::/33", "53024"}, - {"2804:1c90::/32", "61662"}, - {"2804:4d44::/32", "262978"}, - {"2804:6a54::/32", "270329"}, - {"2a03:e1c0::/32", "199421"}, - {"2001:67c:170c::/48", "60829"}, - {"2001:dce:7400::/48", "45285"}, - {"240a:af1e::/32", "146520"}, - {"2a02:26f0:75::/46", "20940"}, - {"2a0b:22c0::/29", "59939"}, - {"2a0c:9380::/29", "328543"}, - {"2404:bf40:a101::/46", "7545"}, - {"2406:20c0:a001::/33", "140423"}, - {"2a00:1c90::/32", "29486"}, - {"2402:1580:297::/34", "17682"}, - {"2a03:b840:2::/47", "61221"}, - {"2a0b:8880::/29", "51164"}, - {"2001:4b20:0:194::/43", "34288"}, - {"240e:6:d012::/48", "142608"}, - {"2600:1480:5000::/40", "33905"}, - {"2602:101::/33", "20115"}, - {"2604:14c0::/32", "22121"}, - {"2806:2f0:9da1::/46", "17072"}, - {"2a01:1ee::/32", "33843"}, - {"2001:559:80a6::/48", "33659"}, - {"2600:1008:a120::/36", "22394"}, - {"2600:140f:3600::/48", "9498"}, - {"2800:160:1f97::/42", "14259"}, - {"240e:3b3:f700::/36", "4134"}, - {"2804:6b4::/32", "53224"}, - {"2001:559:5ef::/43", "7922"}, - {"2402:800:9b47::/43", "7552"}, - {"2404:bf40:8783::/41", "139084"}, - {"2606:2800:6030::/46", "15133"}, - {"2001:200:e00::/40", "4690"}, - {"2402:c340::/32", "38047"}, - {"240a:a9b3::/32", "145133"}, - {"2600:6c10:f248::/45", "20115"}, - {"2a03:9ba0:201::/46", "209082"}, - {"2620:104:f000::/44", "33517"}, - {"2801:80:34a0::/48", "268807"}, - {"2a0b:6cc1:8::/29", "202984"}, - {"2400:ac40:a10::/41", "136255"}, - {"2409:8087:3c00::/40", "24444"}, - {"2804:a8c::/38", "264159"}, - {"2804:4fe4::/32", "53086"}, - {"2001:dc8:8000::/48", "24089"}, - {"2402:8000::/32", "24541"}, - {"2406:da00:1000::/40", "16509"}, - {"240e:101:4000::/30", "4134"}, - {"2803:3010::/32", "271808"}, - {"2803:9800:9505::/46", "11664"}, - {"2803:b800::/32", "262202"}, - {"2001:559:c479::/48", "33650"}, - {"2001:67c:2740::/48", "198543"}, - {"2001:4d50:fe00::/39", "34309"}, - {"2409:8a35::/28", "9808"}, - {"2a02:26f0:13d::/48", "8966"}, - {"2a02:26f7:be11::/42", "20940"}, - {"2c0f:f590:0:203::/32", "36974"}, - {"2001:559:c3a6::/48", "7922"}, - {"2001:678:7d8::/48", "2643"}, - {"2400:cb00:a2c0::/48", "13335"}, - {"2610:a1:3024::/48", "12008"}, - {"2804:54:6008::/32", "28220"}, - {"2804:48e0::/32", "267150"}, - {"2001:559:833b::/48", "33659"}, - {"2600:6c38:b42::/45", "20115"}, - {"2a01:a620::/45", "56911"}, - {"2001:418:8006::/48", "3927"}, - {"2605:4ac0::/32", "23503"}, - {"2607:ae80:192::/48", "26558"}, - {"2607:f380:a69::/32", "2152"}, - {"2a01:6f0::/39", "42366"}, - {"2a09:dd40::/32", "205718"}, - {"2401:d800:96f0::/39", "7552"}, - {"2605:a401:8120::/43", "33363"}, - {"2a03:2880:f300::/36", "32934"}, - {"2401:2200:10::/48", "55420"}, - {"240a:a599::/32", "144083"}, - {"2604:d680:5::/48", "29757"}, - {"2800:160:1397::/42", "14259"}, - {"2804:810::/32", "262344"}, - {"2a02:2a8::/32", "29655"}, - {"2001:388:20c5::/35", "7575"}, - {"2409:8750:500::/38", "56047"}, - {"2604:9e40::/46", "29457"}, - {"2804:4800::/32", "267091"}, - {"2804:7e74::/33", "271625"}, - {"2800:3c0:3060::/40", "19863"}, - {"2803:5d20::/32", "267757"}, - {"2a02:ac80:d001::/34", "25145"}, - {"2a06:56c0:11::/46", "51776"}, - {"2a09:8380:a::/48", "209561"}, - {"2402:3a80:400::/41", "38266"}, - {"2804:339c::/32", "265407"}, - {"2a00:1288:f044::/36", "10310"}, - {"2a12:6fc0::/31", "204957"}, - {"2001:559:87c4::/46", "7015"}, - {"2001:7f0::/39", "13237"}, - {"240a:a84f::/32", "144777"}, - {"2607:f7a8:603::/45", "46887"}, - {"2806:2f0:4281::/46", "17072"}, - {"2a02:4340::/32", "51551"}, - {"2a0d:3200::/29", "61161"}, - {"2001:df7:4e80::/48", "138754"}, - {"2001:1248:98fb::/45", "11172"}, - {"2402:800:5001::/39", "7552"}, - {"2404:60c0::/32", "131911"}, - {"240a:a335::/32", "143471"}, - {"240a:aa7f::/32", "145337"}, - {"2804:6378::/32", "269363"}, - {"2a00:bae0::/32", "14381"}, - {"2402:800:552b::/41", "7552"}, - {"2403:2c00:7::102/63", "4058"}, - {"2602:fe19::/43", "26073"}, - {"2a06:ac80:11::/48", "205427"}, - {"240a:aed2::/32", "146444"}, - {"2402:cec0::/32", "137566"}, - {"2800:160:1679::/40", "14259"}, - {"2a0e:b107:9d4::/47", "213262"}, - {"2001:4268:201::/40", "15964"}, - {"2407:e1c0::/42", "146872"}, - {"2620:12b:4081::/41", "395568"}, - {"2804:49dc::/32", "267205"}, - {"2804:8244:8400::/33", "272509"}, - {"2806:2f0:4321::/46", "17072"}, - {"2a00:1ec8:28::/43", "2854"}, - {"2a01:a980::/29", "197524"}, - {"2001:559:331::/48", "7015"}, - {"2001:67c:209c::/48", "212430"}, - {"2402:5580::/32", "133817"}, - {"2409:8a14:7000::/32", "56044"}, - {"2600:1901:ff80::/44", "396982"}, - {"2806:230:400e::/48", "265594"}, - {"2806:2f0:3463::/40", "17072"}, - {"2602:feda:185::/48", "142586"}, - {"2804:884::/47", "262375"}, - {"2804:cb0::/32", "52742"}, - {"2a01:c50e:f000::/39", "12479"}, - {"2a0d:f840::/29", "57756"}, - {"2001:67c:2f98::/48", "29691"}, - {"2404:4800::/46", "9892"}, - {"2804:14d:ac81::/43", "28573"}, - {"2804:6c90::/32", "270477"}, - {"2a0e:8f02:213d::/48", "211722"}, - {"240a:a218::/32", "143186"}, - {"2804:14c:65ca::/43", "28573"}, - {"2804:108c::/32", "28146"}, - {"2a00:5080::/32", "204119"}, - {"2a02:2e02:16b0::/39", "12479"}, - {"2001:559:86bb::/48", "7922"}, - {"2402:3880::/32", "23791"}, - {"2409:8008:1900::/34", "24547"}, - {"2409:8087:6c70::/35", "9808"}, - {"2409:8924:ab00::/37", "56046"}, - {"2602:fc80::/40", "396503"}, - {"2804:5d80:4100::/32", "268976"}, - {"2a02:188:6202::/29", "31027"}, - {"2a0e:a280::/29", "208254"}, - {"2001:67c:19ac::/48", "48919"}, - {"2001:67c:2ed4::/48", "6890"}, - {"2804:1398:12::/34", "263541"}, - {"2804:1460::/32", "28308"}, - {"2a0c:9280::/29", "42316"}, - {"2001:ee0:300::/47", "135905"}, - {"2407:4800::/33", "139759"}, - {"2620:100:4::/46", "19637"}, - {"2620:139:6008::/48", "22600"}, - {"2a02:128:7::/48", "50245"}, - {"2a02:26f7:f34b::/48", "20940"}, - {"2001:559:842e::/48", "33287"}, - {"2400:bb40:2005::/44", "141039"}, - {"2402:800:7410::/42", "7552"}, - {"240e:60c:b000::/37", "137688"}, - {"2600:6c10:c39::/38", "20115"}, - {"2a02:8200::/27", "9145"}, - {"240a:a1f8::/32", "143154"}, - {"2600:141c:7801::/32", "20940"}, - {"2a09:4c0:e01::/39", "58057"}, - {"2602:ffbd::/36", "14440"}, - {"2804:48f0::/32", "61589"}, - {"2001:559:c21d::/48", "33491"}, - {"2402:8100:2442::/44", "55644"}, - {"2408:8957:9500::/40", "17816"}, - {"240a:a47a::/32", "143796"}, - {"240a:a997::/32", "145105"}, - {"2604:bc40:6001::/39", "22188"}, - {"2a00:7ec0::/47", "8528"}, - {"2a01:7d20:e00::/40", "203645"}, - {"2001:520:101c::/42", "8103"}, - {"2806:2f0:1100::/46", "22884"}, - {"2402:ee40:5f::/48", "134033"}, - {"240a:aaed::/32", "145447"}, - {"2602:feda:b8c::/47", "200334"}, - {"2803:1000::/32", "263783"}, - {"2a04:4e40:2600::/48", "54113"}, - {"2001:1960:3::/43", "5650"}, - {"2409:8f1e::/31", "24400"}, - {"2605:18c0::/32", "25892"}, - {"2804:1570::/32", "263388"}, - {"2804:7be8:c00e::/43", "271462"}, - {"2a00:1348:10::/48", "57837"}, - {"2a0b:b40::/29", "51815"}, - {"2001:4d40::/32", "13237"}, - {"2604:ca00:156::/42", "36492"}, - {"2804:43fc:ff00::/40", "267614"}, - {"2404:ea80:300::/36", "135373"}, - {"2408:8456:8400::/42", "17622"}, - {"2001:559:c4fc::/48", "7725"}, - {"2a02:e980:19c::/42", "19551"}, - {"2400:dcc0::/32", "38631"}, - {"2405:ca40::/32", "134918"}, - {"2409:8087:3100::/36", "9808"}, - {"240a:a7aa::/32", "144612"}, - {"2602:fd23:3::/44", "33185"}, - {"2605:db40::/32", "398326"}, - {"2800:484:2800::/37", "14080"}, - {"2800:bf0:a810::/44", "27947"}, - {"2a02:26f7:eacc::/48", "36183"}, - {"2a0b:6b81:1::/48", "203729"}, - {"2a0e:b107:f60::/48", "207466"}, - {"2403:4c0:8000::/33", "17639"}, - {"2404:8000:a0:609::/44", "17451"}, - {"2606:2800:257::/44", "15133"}, - {"2801:80:6d0::/48", "52750"}, - {"2804:5fd4::/32", "269126"}, - {"2a03:82e0::/35", "200991"}, - {"2001:559:3cf::/48", "33654"}, - {"2001:57a:2203::/35", "22773"}, - {"2401:5a40::/32", "136759"}, - {"240e:3b9:f700::/36", "4134"}, - {"2001:559:4df::/42", "7725"}, - {"2400:dcc0:ab04::/37", "38631"}, - {"2603:b0e0:feee::/39", "11796"}, - {"2620:129:6020::/48", "395363"}, - {"2804:11bc:c000::/38", "263435"}, - {"2a00:7146::/48", "51430"}, - {"2a00:8a02:8010::/44", "200656"}, - {"2a02:e0c0:1000::/38", "9100"}, - {"2001:559:1ff::/48", "33491"}, - {"2001:559:8541::/48", "22909"}, - {"2408:2000::/24", "4608"}, - {"2a04:1bc3::/32", "60982"}, - {"2a09:800::/29", "209975"}, - {"2408:8459:8010::/42", "17623"}, - {"2600:1011:9010::/39", "6167"}, - {"2602:fbf0::/32", "400312"}, - {"2602:fd06::/36", "22150"}, - {"2803:8960::/39", "269736"}, - {"2a00:ec8::/37", "38930"}, - {"2a02:26f7:fbc9::/42", "20940"}, - {"2001:67c:674::/48", "12552"}, - {"2001:4870:e00b::/48", "21928"}, - {"2409:8904:8240::/39", "24547"}, - {"240e:438:7220::/43", "140647"}, - {"2620:0:690::/47", "13371"}, - {"2804:10d4::/32", "262376"}, - {"2804:3a48::/32", "266081"}, - {"2a02:26f7:be0c::/48", "36183"}, - {"2a0c:6180::/29", "47648"}, - {"2001:559:86f4::/47", "33651"}, - {"2001:978:8e01::/39", "174"}, - {"240a:a7a8::/32", "144610"}, - {"240a:a840::/32", "144762"}, - {"2806:2f0:20e2::/48", "17072"}, - {"2c0f:fc00::/27", "3741"}, - {"2001:559:8535::/48", "21508"}, - {"2001:df3:b380::/48", "38238"}, - {"2604:8100::/32", "26292"}, - {"2800:bf0:100::/46", "52257"}, - {"2404:3d00:40d4::/46", "21433"}, - {"240a:a11f::/32", "142937"}, - {"240a:a2d7::/32", "143377"}, - {"2403:5400:1811::/32", "38450"}, - {"2804:1dd8::/32", "264398"}, - {"2a00:13d0::/32", "48961"}, - {"2a02:26f7:c358::/48", "36183"}, - {"2a03:5640:f533::/41", "2906"}, - {"2c0f:f608:f200::/40", "21351"}, - {"2403:e040::/33", "138399"}, - {"2620:54:a000::/48", "396024"}, - {"2401:d800:7782::/41", "7552"}, - {"2401:d800:fca0::/41", "7552"}, - {"2804:5c70::/32", "268909"}, - {"2804:6710::/32", "269601"}, - {"2a05:dd80::/29", "1764"}, - {"2001:678:d30::/48", "59570"}, - {"240a:a11d::/32", "142935"}, - {"240a:a32d::/32", "143463"}, - {"2800:160:1c14::/42", "14259"}, - {"2800:160:2197::/42", "14259"}, - {"2804:204:231::/45", "28186"}, - {"2804:7a94::/35", "271380"}, - {"2001:559:727::/48", "33287"}, - {"2001:44b8:6066::/48", "7545"}, - {"2404:e801:1015::/44", "55430"}, - {"240e:3b5:7800::/39", "4134"}, - {"2a10:a8c0::/29", "211678"}, - {"2406:b700::/32", "58504"}, - {"2402:800:991d::/42", "7552"}, - {"2605:a900:6000::/32", "46887"}, - {"2804:14c:87fd::/46", "28573"}, - {"2a09:58c0:1::/48", "9186"}, - {"2a0f:8644:b00c::/31", "25682"}, - {"2a11:fac0::/32", "41044"}, - {"2001:4de0:3005::/39", "33438"}, - {"2804:1784:8900::/33", "263152"}, - {"2001:559:84dc::/47", "7015"}, - {"240e:966:9800::/34", "4134"}, - {"2804:c80::/32", "52719"}, - {"2804:4118::/32", "266003"}, - {"2806:36a::/32", "265613"}, - {"2a00:50c0::/48", "31415"}, - {"2409:8904:9490::/39", "24547"}, - {"2a02:2698:2400::/38", "41786"}, - {"2a05:1500:400::/40", "205631"}, - {"2a0e:1c80:8::/48", "3399"}, - {"2605:b780::/32", "54555"}, - {"2a00:1d58:ff00::/44", "47524"}, - {"2804:53e0:8200::/33", "28258"}, - {"2806:2f0:7063::/40", "17072"}, - {"2400:8b00:1600::/42", "45727"}, - {"2605:5340::/32", "62532"}, - {"2401:7400:e002::/36", "4773"}, - {"240a:a598::/32", "144082"}, - {"240a:a752::/32", "144524"}, - {"2600:9000:11b6::/47", "16509"}, - {"2603:c0e1:2000::/36", "54253"}, - {"2803:94c0::/32", "52273"}, - {"2806:230:4007::/48", "11888"}, - {"2a0d:6100::/29", "60781"}, - {"2400:4500::/32", "24167"}, - {"2402:800:54c5::/43", "7552"}, - {"240e:679:1000::/37", "140330"}, - {"2806:230:1206::/48", "265594"}, - {"2a06:e881:690f::/48", "208434"}, - {"2001:579:8c4::/43", "22773"}, - {"2001:1388:8a47::/43", "6147"}, - {"240e:940:8f00::/33", "4134"}, - {"2803:f2e0::/32", "269931"}, - {"2804:30::/32", "28169"}, - {"2804:6c0:500::/43", "262418"}, - {"2a02:cb43:8000::/48", "20546"}, - {"240e:3b9:7a00::/32", "140313"}, - {"2600:370f:60c1::/43", "32261"}, - {"2a03:fd80::/29", "200781"}, - {"2a0d:10c0::/29", "31566"}, - {"2401:d800:9640::/42", "7552"}, - {"2404:e100:2001::/48", "55685"}, - {"2408:8256:3681::/43", "17623"}, - {"240e:309::/35", "137691"}, - {"2803:aa80::/32", "263698"}, - {"2804:3a08::/32", "266066"}, - {"2a02:26f7:d745::/46", "20940"}, - {"2a03:db80:4815::/37", "680"}, - {"2400:9940:2001::/32", "136224"}, - {"2605:940:400::/40", "396919"}, - {"2606:2800:4af4::/47", "15133"}, - {"2804:c78::/32", "52714"}, - {"2a03:d5c0:1c00::/42", "199391"}, - {"2001:559:8332::/48", "20214"}, - {"2400:adc7:1000::/39", "9541"}, - {"240e:5a:46c0::/39", "140299"}, - {"2604:d600:532::/45", "32098"}, - {"2804:65e8::/32", "269522"}, - {"2806:260:1009::/48", "27672"}, - {"2a02:ee80:410b::/43", "3573"}, - {"2400:6100::/32", "137549"}, - {"2403:8740:1::/48", "138202"}, - {"240a:af46::/32", "146560"}, - {"2600:806:300::/48", "12234"}, - {"2a00:f28:20::/48", "57187"}, - {"2a0b:ae00:1c00::/29", "207044"}, - {"2607:f3a0::/43", "23342"}, - {"2406:2400:f01d::/48", "45287"}, - {"240a:abca::/32", "145668"}, - {"2001:678:d74::/48", "197058"}, - {"2001:67c:112c::/48", "212760"}, - {"2604:b300:ad01::/48", "394896"}, - {"2001:559:822b::/48", "33650"}, - {"2001:559:c2f3::/48", "33652"}, - {"2602:fed2:7128::/48", "53356"}, - {"2a02:26f7:cd05::/46", "20940"}, - {"2a03:6980::/32", "15830"}, - {"2405:19c0::/48", "18403"}, - {"2407:6180::/32", "138466"}, - {"2806:250:700::/40", "28509"}, - {"2001:579:d144::/42", "22773"}, - {"2001:6a8:8a01::/34", "2611"}, - {"2001:1248:5bdb::/42", "11172"}, - {"2409:8027:2a07::/39", "9808"}, - {"2620:46:8000::/48", "17234"}, - {"2801:c4:b4::/48", "28392"}, - {"2a02:1620:8004::/48", "4637"}, - {"2a02:26a8:f000::/36", "49675"}, - {"2001:480:1670::/48", "213"}, - {"2408:8256:337f::/48", "17816"}, - {"2605:a7c0:120::/48", "14618"}, - {"2804:4d50:e000::/36", "268189"}, - {"2a03:f040::/32", "48133"}, - {"2a0a:e5c0:8::/48", "207996"}, - {"2001:d88::/32", "4694"}, - {"2408:8456:7c00::/42", "17622"}, - {"2600:1004:d000::/41", "6167"}, - {"2605:c740::/32", "395510"}, - {"2a00:79e0:504::/48", "395973"}, - {"2a02:26f7:c3c0::/48", "36183"}, - {"2a02:d500::/29", "48596"}, - {"2606:7d00::/32", "23248"}, - {"2a04:1b00:10::/47", "61005"}, - {"2400:1d60::/32", "45727"}, - {"2406:3540:ffec::/46", "18041"}, - {"2408:8957:d6c0::/36", "17816"}, - {"2409:8c70:3ad4::/48", "140105"}, - {"2607:f220:f0::/48", "7046"}, - {"2a01:7ce0::/32", "62102"}, - {"2a0c:6580:2::/48", "35365"}, - {"2001:678:bc4::/48", "62126"}, - {"2001:1248:846b::/45", "11172"}, - {"2804:84fc:500::/36", "272550"}, - {"2a02:8380::/30", "8412"}, - {"2001:428:6809::/32", "209"}, - {"2401:1780::/32", "18046"}, - {"2a05:6740:40c0::/48", "206228"}, - {"2001:67c:4a4::/48", "3301"}, - {"240e:44d:6600::/42", "140345"}, - {"240e:965:800::/37", "133774"}, - {"2602:fcd8:1c::/46", "399141"}, - {"2a01:c9c0:800f::/48", "2280"}, - {"2a03:56a0::/32", "50971"}, - {"2001:67c:88c::/48", "42441"}, - {"2408:8459:8c50::/38", "17816"}, - {"2409:8c54:4900::/35", "56040"}, - {"2606:4180::/35", "393775"}, - {"2800:160:17fd::/36", "14259"}, - {"2a03:97c0:1::/48", "58076"}, - {"2a07:acc0::/29", "39899"}, - {"2a0d:d900:1::/48", "57164"}, - {"2402:3a80:1c88::/42", "38266"}, - {"240e:45c:c600::/40", "131285"}, - {"2a00:79e1:f20::/48", "36384"}, - {"2a07:3b80:4::/29", "47869"}, - {"2c0f:efd0::/36", "328336"}, - {"2001:510:101::/44", "376"}, - {"2400:8000:2421::/35", "4800"}, - {"2804:984:f800::/37", "263097"}, - {"2a00:e40::/32", "9127"}, - {"2400:9380:9dc0::/44", "136167"}, - {"240a:a84b::/32", "144773"}, - {"2800:bf0:806b::/43", "27947"}, - {"2001:250:3c11::/46", "138369"}, - {"2620:134:a000::/47", "40907"}, - {"2804:1b0:e000::/31", "18881"}, - {"2804:60e0::/32", "269197"}, - {"2804:7d64::/32", "271558"}, - {"2a0d:ca47:863::/32", "8423"}, - {"2001:559:8217::/48", "33651"}, - {"2408:80ea:7500::/41", "17816"}, - {"2406:840:e20f::/48", "142112"}, - {"2a04:ad80:2::/48", "60011"}, - {"2001:550:b701::/36", "174"}, - {"2403:4100::/32", "24210"}, - {"2804:2be4::/32", "263004"}, - {"2804:5e68::/32", "269031"}, - {"2a02:5600::/32", "31430"}, - {"2001:559:c30f::/48", "33650"}, - {"2001:40e8::/32", "30798"}, - {"2402:800:539b::/41", "7552"}, - {"2407:a8c0::/32", "135772"}, - {"2408:8256:398c::/48", "17623"}, - {"2a02:26f7:f881::/46", "20940"}, - {"2408:84e9::/32", "4837"}, - {"240e:3b0:1800::/34", "4134"}, - {"2607:f428:93b0::/44", "20115"}, - {"2800:bf0:34::/44", "52257"}, - {"2a02:fa8:4400::/44", "25751"}, - {"2408:8256:2f9f::/35", "17816"}, - {"240a:af6e::/32", "146600"}, - {"240e:67c:e200::/39", "140329"}, - {"2604:880:54::/48", "29802"}, - {"2804:27d8::/32", "263925"}, - {"2a02:88d:4010::/44", "48695"}, - {"2a0f:9980:6::/48", "40676"}, - {"2001:559:3de::/48", "7922"}, - {"2400:9380:9270::/46", "4809"}, - {"2404:3d00:4058::/47", "21433"}, - {"240a:a682::/32", "144316"}, - {"240a:a7f1::/32", "144683"}, - {"2600:1004:f010::/40", "22394"}, - {"2801:80:3f00::/48", "272616"}, - {"2400:cb00:83::/44", "13335"}, - {"2402:800:340f::/43", "7552"}, - {"2a02:26f7:7c::/48", "36183"}, - {"2a0b:6900:1ad::/48", "212461"}, - {"2001:480:aa::/47", "5132"}, - {"2001:67c:448::/48", "1257"}, - {"2001:1a11:d6::/48", "8781"}, - {"2605:bf80:100::/40", "11889"}, - {"2607:1b00:93b2::/48", "54456"}, - {"2607:fdc0:300::/32", "20326"}, - {"2804:e0:4::/37", "28330"}, - {"2a02:2fc0::/29", "12586"}, - {"2a0c:b641:a0::/44", "212299"}, - {"2a0f:5707:aa30::/44", "207306"}, - {"2001:678:b5c::/48", "60033"}, - {"2001:4408:8508::/45", "55824"}, - {"2001:4878:2246::/48", "12222"}, - {"240e:108:28::/48", "133775"}, - {"2a07:2f00::/48", "203132"}, - {"2a0b:ecc0::/29", "205390"}, - {"2404:7180:a000::/48", "23848"}, - {"2804:6148::/32", "269226"}, - {"2806:230:1022::/48", "265594"}, - {"2a02:26f7:c8d0::/48", "36183"}, - {"2c0f:ed48::/32", "328467"}, - {"2407:3e00:e000::/48", "24075"}, - {"2407:f0c0::/32", "140151"}, - {"2409:894a:6400::/35", "24445"}, - {"2a06:d980::/29", "51539"}, - {"2407:3c80::/47", "55705"}, - {"2803:c600::/44", "27901"}, - {"2804:1680::/32", "263289"}, - {"2806:269:4300::/37", "13999"}, - {"2a0e:fd45:40fb::/48", "136620"}, - {"2c0f:f3d0::/32", "3491"}, - {"2001:559:52e::/48", "33662"}, - {"2001:559:58e::/48", "7015"}, - {"2001:1248:a006::/44", "11172"}, - {"240a:a004::/32", "142654"}, - {"240a:a734::/32", "144494"}, - {"2804:e0:501::/32", "28330"}, - {"2a02:26f7:bac9::/42", "20940"}, - {"2a02:e980:15e::/42", "19551"}, - {"2a0a:4f80::/32", "206281"}, - {"2402:4e00:50::/39", "45090"}, - {"2405:7f00:c220::/36", "133414"}, - {"2804:14d8:c000::/34", "263354"}, - {"2a03:c6c0::/48", "42421"}, - {"2a0f:6440::/29", "200899"}, - {"2001:67c:2acc::/48", "205046"}, - {"2409:8027:290a::/38", "9808"}, - {"240e:356:6400::/31", "4134"}, - {"2600:1480:9001::/37", "20940"}, - {"2804:346c::/32", "265457"}, - {"2a00:4802:370::/44", "8717"}, - {"2a05:1083:ff03::/48", "211876"}, - {"2001:1658::/29", "719"}, - {"2402:f100::/38", "38902"}, - {"2804:605c::/32", "269162"}, - {"2804:6794::/32", "269637"}, - {"2403:41c0::/32", "63969"}, - {"2607:8300:1010::/48", "13876"}, - {"2a0c:4ac0:1100::/38", "58212"}, - {"2409:896a:6100::/38", "9808"}, - {"240e:a5:4000::/36", "137693"}, - {"2605:a404:e00::/32", "33363"}, - {"2a01:ad00:129::/32", "51865"}, - {"2a02:26f7:da80::/48", "36183"}, - {"2001:559:2b9::/46", "7015"}, - {"2001:978:6000:1::/37", "174"}, - {"2806:230:6009::/48", "11888"}, - {"2a0d:7380::/29", "202918"}, - {"2c0e:40:402::/39", "24863"}, - {"2001:559:85ee::/48", "7016"}, - {"240e:44d:1140::/42", "140358"}, - {"2801:16e::/48", "19429"}, - {"2804:14d:8e92::/41", "28573"}, - {"2406:6cc0:a300::/48", "63515"}, - {"2409:806c:3900::/27", "9808"}, - {"2001:520:103b::/48", "8103"}, - {"2604:f980:4300::/44", "19957"}, - {"2a02:26f7:cc8d::/46", "20940"}, - {"2a0e:5100::/29", "30823"}, - {"2a10:9906::/36", "39409"}, - {"2001:559:8082::/48", "33490"}, - {"2408:870c:3010::/36", "17621"}, - {"2408:8956:3000::/40", "17622"}, - {"240a:aaf2::/32", "145452"}, - {"2001:fd8:f0b0::/44", "4775"}, - {"2001:1a11:131::/44", "42298"}, - {"2402:b801:2b00::/35", "18371"}, - {"2602:fe02::/47", "16816"}, - {"2604:940:30::/48", "40386"}, - {"2804:4388::/32", "267576"}, - {"2a07:bbc0:1::/48", "35365"}, - {"2001:559:75c::/48", "33659"}, - {"2001:1248:992a::/43", "11172"}, - {"2406:1600:301::/32", "23871"}, - {"2407:d40:8001::/33", "139009"}, - {"2800:bf0:1c5::/48", "27947"}, - {"2a0a:ad00:9a::/48", "42352"}, - {"2803:2a80:1265::/48", "262928"}, - {"2804:1784:130::/32", "263152"}, - {"2804:4058::/32", "265953"}, - {"2a02:2698:8c00::/38", "57026"}, - {"2001:559:c42c::/48", "33287"}, - {"2001:678:568::/48", "58116"}, - {"2001:678:cac::/48", "39702"}, - {"2401:78c0:2::/32", "56150"}, - {"2401:d800:f042::/42", "7552"}, - {"2404:4e00:3::/45", "32787"}, - {"240a:ae1f::/32", "146265"}, - {"2a00:10d8:11::/31", "42005"}, - {"2a00:dd80:20::/48", "36236"}, - {"2a02:26f7:d305::/46", "20940"}, - {"2408:8956:fd00::/40", "17622"}, - {"2a00:e520::/32", "35551"}, - {"2a02:26f7:65::/48", "20940"}, - {"2001:4890::/32", "3257"}, - {"2401:b300::/32", "131999"}, - {"2402:1940::/32", "38198"}, - {"2403:1e40::/39", "137967"}, - {"2408:8956:af00::/40", "17816"}, - {"240a:a27f::/32", "143289"}, - {"2600:370f:5200::/45", "32261"}, - {"2804:9d8::/32", "262997"}, - {"2804:78c0::/32", "271263"}, - {"2a11:2800:2::/48", "42244"}, - {"2001:250:c0c::/48", "23910"}, - {"2401:d600::/32", "45204"}, - {"2403:51c0::/32", "138022"}, - {"2600:1006:b170::/40", "22394"}, - {"2804:10bc:500::/32", "263646"}, - {"2a03:90c0:9990::/46", "199524"}, - {"2a04:4100::/29", "31712"}, - {"2a0f:3300::/29", "208543"}, - {"2600:370f:40a2::/47", "32261"}, - {"2603:c002:8350::/36", "31898"}, - {"2001:1424::/48", "47578"}, - {"2409:896a:7a00::/39", "9808"}, - {"2600:5c00:f8e5::/37", "20001"}, - {"2800:310:3::/43", "18678"}, - {"2804:4b0:348::/43", "262459"}, - {"2a02:26f7:eec4::/48", "36183"}, - {"2402:800:9401::/44", "7552"}, - {"2406:840:f4cf::/48", "142586"}, - {"2409:8069:2a08::/39", "9808"}, - {"240a:a43b::/32", "143733"}, - {"2600:1419:a001::/37", "20940"}, - {"2610:b0:40d8::/47", "21433"}, - {"2804:16f0::/33", "263109"}, - {"2804:1bd8:4901::/40", "28224"}, - {"2a0e:8f02:2000::/44", "213045"}, - {"2001:559:7fd::/48", "7725"}, - {"2001:4490:3d00::/42", "9829"}, - {"2402:800:362b::/41", "7552"}, - {"2403:9800:11::/48", "4771"}, - {"2404:f4c0:f200::/48", "139589"}, - {"240a:ae36::/32", "146288"}, - {"2806:1008::/32", "8151"}, - {"2409:896a:2c00::/39", "9808"}, - {"240e:438:aa40::/37", "4134"}, - {"2605:46c0::/44", "395658"}, - {"2804:3e04:2000::/32", "266568"}, - {"2a11:2480::/29", "61192"}, - {"2001:67c:1198::/47", "47805"}, - {"2409:8054:3c::/48", "9808"}, - {"2601::/20", "7922"}, - {"2620:0:61f::/48", "6223"}, - {"2a02:ee80:4248::/47", "21433"}, - {"2a06:e881:6700::/44", "208751"}, - {"240a:a317::/32", "143441"}, - {"240e:96b:601b::/45", "140373"}, - {"2800:bf0:1cc::/47", "52257"}, - {"2804:14d:4cef::/43", "28573"}, - {"2a02:26f7:b580::/48", "36183"}, - {"2600:1403:3c01::/33", "20940"}, - {"2a02:23c0::/32", "45011"}, - {"2001:418:1401:1c::/64", "20940"}, - {"2409:8057:3810::/48", "9808"}, - {"2409:805f:3100::/36", "9808"}, - {"2620:89:c000::/48", "20099"}, - {"2804:bd8:6100::/32", "52838"}, - {"2a0a:2842:100::/48", "42962"}, - {"2a0e:46c4:22ad::/48", "136918"}, - {"2001:678:d84::/48", "207908"}, - {"2001:41f8::/32", "13115"}, - {"2804:1398:2::/43", "263541"}, - {"2a0c:3300::/32", "211215"}, - {"2001:67c:2748::/48", "51810"}, - {"2001:67c:27ac::/48", "8881"}, - {"2402:9e80:43::/48", "138631"}, - {"2404:0:8040::/38", "131591"}, - {"240a:a0fd::/32", "142903"}, - {"2605:3c80:fa::/48", "20115"}, - {"2a06:41c0::/45", "51559"}, - {"2a06:e881:110::/48", "206551"}, - {"2a10:a600::/32", "201641"}, - {"2a11:e40::/29", "204790"}, - {"2401:4900:4bd5::/44", "45609"}, - {"2402:800:338d::/43", "7552"}, - {"240a:af9f::/32", "146649"}, - {"2604:c0c0:2000::/35", "14525"}, - {"2605:a401:8665::/40", "33363"}, - {"2803:d180::/48", "263245"}, - {"2804:e94:800::/38", "262468"}, - {"2a06:b7c0::/29", "203740"}, - {"2a0a:40c0::/29", "49596"}, - {"2602:fc42:1::/48", "398017"}, - {"2a00:6720::/32", "34031"}, - {"2404:8000:101a::/42", "17451"}, - {"2603:c0ee::/35", "54253"}, - {"2606:c00:35::/48", "10126"}, - {"2a00:4bc0:700::/34", "31004"}, - {"2a0e:1c04:1::/30", "61317"}, - {"2604:fb80:601::/36", "15128"}, - {"2800:160:127f::/40", "14259"}, - {"2404:e200:101::/45", "18353"}, - {"2803:c010:e6::/48", "271799"}, - {"2804:17f0::/32", "263259"}, - {"2001:67c:1560::/46", "41231"}, - {"240a:aea9::/32", "146403"}, - {"2001:579:4204::/41", "22773"}, - {"2400:8800:1800::/37", "3491"}, - {"2404:bf40:a103::/41", "139084"}, - {"2404:fd00::/44", "58552"}, - {"2409:8904:5340::/42", "24547"}, - {"2620:11d:9002:100::/56", "33186"}, - {"2a05:df00::/31", "47891"}, - {"2001:938:4022::/45", "8437"}, - {"240a:a3b5::/32", "143599"}, - {"2a07:be00::/29", "31723"}, - {"2001:559:846b::/48", "22909"}, - {"2001:da8:e805::/44", "24368"}, - {"2001:1a11:146::/47", "8781"}, - {"2408:8459:f010::/42", "17623"}, - {"2801:18:800::/48", "267740"}, - {"2402:800:3afe::/39", "7552"}, - {"2409:8053::/47", "56047"}, - {"2800:bf0:95::/44", "27947"}, - {"2a00:1a90:8000::/48", "33854"}, - {"2a0e:b107:31f::/48", "57164"}, - {"2404:1f00:ffa0::/47", "9498"}, - {"2606:6dc0::/35", "13781"}, - {"2606:d101::/36", "395563"}, - {"2a10:7a80::/29", "213317"}, - {"2402:800:bb30::/41", "7552"}, - {"2408:8459:ea10::/42", "17623"}, - {"240e:3bd:7600::/39", "140313"}, - {"2804:62a4::/32", "269309"}, - {"2a00:15f8::/32", "25532"}, - {"2a0c:6cc0::/29", "203082"}, - {"2a0c:a680::/29", "21331"}, - {"2a0f:2cc0::/29", "60262"}, - {"2001:14a8::/32", "15547"}, - {"2402:c180::/32", "134503"}, - {"240a:a900::/32", "144954"}, - {"2600:1012:f100::/44", "6167"}, - {"2620:1b:4000::/48", "54722"}, - {"2806:2f0:34c3::/42", "17072"}, - {"2a0b:bbc0::/39", "205388"}, - {"2804:5e0c::/32", "269008"}, - {"2a00:8440::/32", "198508"}, - {"2001:bf7:180::/37", "44194"}, - {"240e:5e:10d0::/44", "140320"}, - {"2800:160:15c3::/43", "14259"}, - {"2804:3258::/32", "265072"}, - {"2a00:13c8:4::/32", "25291"}, - {"2401:cf80:60ff::/39", "55303"}, - {"2407:cdc0:eeee::/48", "38136"}, - {"2620:128:2011::/40", "395287"}, - {"2800:160:1279::/45", "14259"}, - {"2803:bc60::/32", "264773"}, - {"2804:4b1c::/32", "267284"}, - {"2a0a:b706:9992::/45", "204363"}, - {"2001:1900:228d::/43", "3356"}, - {"2a01:cde0:40::/48", "16028"}, - {"2001:559:8185::/48", "33652"}, - {"2402:8100:27a0::/47", "45271"}, - {"2600:1408:d400::/48", "36183"}, - {"2a02:26f7:22::/48", "36183"}, - {"2c0f:f5c0::/46", "29465"}, - {"2001:4490:de24::/46", "9829"}, - {"2400:a980:60f0::/44", "133512"}, - {"2a06:cd40:200::/48", "43927"}, - {"2a0e:15c0:34b::/31", "60781"}, - {"2a0e:97c0:3b0::/48", "211484"}, - {"2001:678:5e0::/48", "204671"}, - {"2001:df3:c180::/48", "140671"}, - {"2408:8256:2f8c::/48", "17623"}, - {"2607:f170:120::/41", "6364"}, - {"2801:80:3540::/48", "268850"}, - {"2806:230:2049::/48", "11888"}, - {"2a02:26f0:b6::/44", "20940"}, - {"2001:b000:100::/37", "3462"}, - {"2603:c0e9:2000::/36", "1218"}, - {"2804:297c:c921::/37", "262907"}, - {"2804:5534:f000::/37", "268696"}, - {"2a02:2e02:9d40::/38", "12479"}, - {"2400:adc0:4020::/48", "9541"}, - {"2400:fa40::/32", "58768"}, - {"2604:3040::/32", "394907"}, - {"2803:a600::/32", "52388"}, - {"2a02:2e02:9c70::/40", "12479"}, - {"2a0a:9080::/29", "60981"}, - {"2001:728:0:5000::15ea/127", "29632"}, - {"2001:4d78:fe19::/48", "15830"}, - {"2401:d800:f700::/42", "7552"}, - {"2406:da70:a000::/40", "16509"}, - {"2409:807c:3900::/33", "9808"}, - {"2604:4000:6800::/37", "32636"}, - {"2605:6404::/32", "53667"}, - {"2804:1b0::/36", "10429"}, - {"2806:206::/32", "28398"}, - {"2a02:16a8::/32", "5404"}, - {"2001:418:1401:72::/60", "2914"}, - {"2406:3003:2060::/43", "55430"}, - {"240e:983:a00::/40", "4134"}, - {"2a02:26f7:e805::/46", "20940"}, - {"240a:a219::/32", "143187"}, - {"2607:fb10:7192::/38", "2906"}, - {"2800:b70:2000::/48", "262191"}, - {"2a02:26f7:b804::/48", "36183"}, - {"2a05:47c0::/36", "199167"}, - {"2600:1fa0:c020::/44", "16509"}, - {"2804:2b44:8100::/33", "265144"}, - {"2804:3364:500::/32", "265393"}, - {"2a00:ed80::/32", "34100"}, - {"2001:559:1b4::/48", "33652"}, - {"2001:559:7a1::/48", "33657"}, - {"2001:559:c251::/46", "7015"}, - {"2407:f700:2000::/32", "132215"}, - {"2a02:6ea0:1000::/39", "212238"}, - {"2a0c:eb00::/32", "204983"}, - {"2604:b300:ad0a::/48", "394896"}, - {"2800:280::/33", "27781"}, - {"2803:bc40:a003::/45", "52468"}, - {"2a0b:1306:1dc::/48", "209915"}, - {"2001:250:7008::/47", "24369"}, - {"2408:8957:e100::/40", "17816"}, - {"2001:1900:2211::/46", "3356"}, - {"2600:1417:3001::/37", "20940"}, - {"2606:18c0:f::/48", "14445"}, - {"2620:11a:a011::/48", "36040"}, - {"2800:bf0:292::/44", "27947"}, - {"2a01:2e1:ffff:6::/64", "21243"}, - {"2a02:ee80:424d::/46", "3573"}, - {"240a:a541::/32", "143995"}, - {"2602:fc23:110::/48", "57401"}, - {"2001:559:871c::/48", "7015"}, - {"2001:df0:66::/48", "45894"}, - {"2407:a080::/33", "133480"}, - {"2409:8000:5d00::/31", "9808"}, - {"2610:a1:30fd::/48", "397226"}, - {"2803:8240:db::/32", "52511"}, - {"2803:fbc0::/45", "265762"}, - {"2001:67c:2aa4::/48", "8447"}, - {"2402:c4c0::/32", "132933"}, - {"2a0c:bf81::/48", "61295"}, - {"240e:45c:6600::/40", "131285"}, - {"2800:5f0:3028::/33", "22724"}, - {"2a01:6f0:ffff::/48", "63473"}, - {"2a02:26f7:e9c5::/46", "20940"}, - {"240a:acd1::/32", "145931"}, - {"2602:107:610::/48", "20001"}, - {"2604:5500:8000::/38", "19165"}, - {"2a00:11c0:78::/48", "42473"}, - {"2a03:b7c0::/32", "29286"}, - {"2603:c002:9910::/38", "31898"}, - {"2a03:3ca0::/32", "59785"}, - {"2a10:5f00::/29", "399975"}, - {"2001:559:7cf::/48", "7015"}, - {"2001:559:814a::/48", "33652"}, - {"240a:a267::/32", "143265"}, - {"2620:80:8000::/48", "16796"}, - {"2620:104:c000::/44", "13462"}, - {"2804:4234:8001::/33", "26104"}, - {"2a02:26f7:e800::/48", "36183"}, - {"2001:df0:cd80::/48", "139279"}, - {"2001:16a2:3c00::/39", "39386"}, - {"2804:6ddc::/32", "270560"}, - {"2001:559:259::/48", "33651"}, - {"2405:3d40::/32", "139523"}, - {"2620:12d:d000::/48", "63415"}, - {"2804:eb4:780::/32", "61890"}, - {"2804:6c88::/32", "270474"}, - {"2001:448a:2050::/40", "7713"}, - {"240e:983:1701::/48", "134238"}, - {"2403:9800:b056::/44", "4648"}, - {"2405:7f80::/32", "137510"}, - {"2407:3880:101::/32", "133012"}, - {"240a:a30a::/32", "143428"}, - {"2606:4700:22::/41", "13335"}, - {"2803:b2c0:1100::/48", "264851"}, - {"2806:2f0:31e3::/38", "17072"}, - {"2a02:26f7:dd08::/48", "36183"}, - {"2610:1a0:301::/33", "40193"}, - {"2806:230:204e::/48", "265594"}, - {"2806:2f0:9165::/40", "17072"}, - {"2a02:26f7:d4::/48", "36183"}, - {"2001:67c:24cc::/48", "12464"}, - {"2001:df6:b380::/48", "142288"}, - {"2401:d800:2980::/42", "7552"}, - {"2a01:4b40:7000::/32", "21299"}, - {"2a02:7a60::/47", "47674"}, - {"240a:aaf7::/32", "145457"}, - {"2604:9380::/32", "33230"}, - {"2620:185::/41", "11396"}, - {"2001:da8:20a::/48", "24351"}, - {"2602:fda3::/46", "397942"}, - {"2a02:cd8::/32", "42760"}, - {"2a0e:b107:a5f::/48", "209606"}, - {"2408:8957:5b00::/40", "17816"}, - {"2605:b100:800::/40", "577"}, - {"240a:a96d::/32", "145063"}, - {"2600:2c00:8000::/34", "7349"}, - {"2607:f5c0::/32", "10326"}, - {"2607:f750:1000::/40", "23473"}, - {"2a04:e4c0:40::/44", "36692"}, - {"2a07:3500:1b90::/48", "33915"}, - {"2600:1417:7b::/37", "20940"}, - {"2a09:7:2008::/48", "3258"}, - {"2001:559:8604::/48", "7922"}, - {"240a:acc2::/32", "145916"}, - {"2605:8400::/32", "10242"}, - {"2620:131:5000::/40", "395468"}, - {"2a01:4840::/32", "43942"}, - {"2a03:73c0::/48", "8426"}, - {"2a0a:f80::/29", "51546"}, - {"2a0e:8f02:f013::/48", "212279"}, - {"2a0f:5381:1313::/42", "208135"}, - {"2402:800:5563::/43", "7552"}, - {"2404:bf40:e104::/38", "139084"}, - {"2406:8800:9025::/44", "17465"}, - {"2408:8459:a830::/41", "17622"}, - {"240a:a503::/32", "143933"}, - {"240a:aaaf::/32", "145385"}, - {"2804:474c::/32", "267044"}, - {"2a01:aea0::/36", "42473"}, - {"2a0e:b107:f28::/48", "212268"}, - {"2a0e:fd45:2ba0::/48", "211041"}, - {"2409:8924:5900::/38", "56046"}, - {"2602:fc52:315::/48", "209864"}, - {"2604:c240::/32", "22952"}, - {"2804:3c3c::/32", "266198"}, - {"2001:fd8:3280::/42", "132199"}, - {"2401:d800:f640::/42", "7552"}, - {"2404:9600::/38", "7600"}, - {"2600:140f:bc01::/38", "20940"}, - {"2600:1413:d001::/36", "20940"}, - {"2602:ff10::/36", "19544"}, - {"2804:218:e002::/35", "27715"}, - {"2804:7b48::/32", "271422"}, - {"2a01:170:1050::/48", "208545"}, - {"2001:559:2bd::/46", "7015"}, - {"2001:67c:7ac::/48", "13030"}, - {"2001:67c:104c::/48", "59524"}, - {"240a:ac1b::/32", "145749"}, - {"2620:129:9001::/63", "13767"}, - {"2806:3d6::/32", "270142"}, - {"2a02:ee80:411e::/42", "3573"}, - {"2001:da8:e814::/48", "24368"}, - {"2620:115:c000::/46", "2635"}, - {"2620:171:5e::/47", "715"}, - {"2620:18c:f2::/36", "396507"}, - {"2a02:26f7:2::/48", "36183"}, - {"2a02:26f7:a6::/48", "36183"}, - {"2a09:bac0:59::/48", "13335"}, - {"2001:df5:3b00::/48", "17439"}, - {"2600:100f:b030::/41", "22394"}, - {"2600:6c32::/31", "20115"}, - {"2a00:ea20::/29", "28884"}, - {"2001:559:80c0::/48", "33650"}, - {"2001:1b40::/34", "20860"}, - {"2600:1407:8800::/48", "35994"}, - {"2602:ff96:4::/48", "8100"}, - {"2606:8440::/32", "400030"}, - {"2a0e:fd45:40f1::/48", "48646"}, - {"2001:da8:e01b::/45", "24367"}, - {"2603:c002:8b30::/37", "31898"}, - {"2620:64:4000::/48", "54480"}, - {"2a01:510::/32", "43708"}, - {"2a02:b28::/29", "42605"}, - {"2a06:4a80::/32", "57685"}, - {"2a07:c3c0::/29", "50033"}, - {"2001:67c:191c::/48", "35445"}, - {"2600:1406:36::/48", "20940"}, - {"2600:9000:10c8::/48", "16509"}, - {"2804:399c::/32", "266039"}, - {"2a0f:607:1300::/44", "7603"}, - {"2001:678:ac4::/48", "208505"}, - {"2400:ac40:cb0::/41", "136255"}, - {"2620:10b:3000::/40", "55166"}, - {"2a02:1c8:a::/48", "60095"}, - {"240e:8f:e000::/35", "134761"}, - {"2806:230:4041::/46", "11888"}, - {"2a00:77a0::/32", "39586"}, - {"2a01:a580::/29", "30972"}, - {"2604:8540:fcf0::/48", "33353"}, - {"2604:f240::/32", "30317"}, - {"2a02:26f7:b7c5::/46", "20940"}, - {"2a03:1980:d400::/40", "48260"}, - {"2a03:f003:4::/38", "25472"}, - {"2605:f400:2::/47", "54641"}, - {"2804:630c::/32", "269335"}, - {"2a02:26f7:c541::/46", "20940"}, - {"2a0f:7180::/29", "43995"}, - {"240a:a117::/32", "142929"}, - {"2600:1419:f401::/36", "20940"}, - {"2603:60b3::/32", "11426"}, - {"2604:9cc0:7::/44", "50131"}, - {"2804:17b8::/32", "262434"}, - {"2a01:2a8::/29", "1836"}, - {"2a07:5080::/29", "49223"}, - {"240a:a2f4::/32", "143406"}, - {"240e:96b:602a::/45", "140378"}, - {"2804:3aa0::/32", "266100"}, - {"2a01:8340::/39", "59410"}, - {"2a06:7400::/29", "59398"}, - {"2c0f:fe38:2260::/39", "33771"}, - {"2001:559:838c::/48", "7922"}, - {"2001:df5:b80::/48", "141107"}, - {"2400:3b00:20::/48", "18229"}, - {"2404:a640:114::/42", "133827"}, - {"2804:14d:5000::/40", "28573"}, - {"2804:2650:d000::/34", "264340"}, - {"2a01:488:bb0d::/48", "398107"}, - {"2a0a:e5c0:e::/47", "207996"}, - {"2400:1120:168::/48", "56308"}, - {"2409:4021:2000::/29", "55836"}, - {"2409:805e:100::/36", "9808"}, - {"2a00:1ce0::/32", "50530"}, - {"2a03:34e0::/32", "12695"}, - {"2a06:8187:fb00::/40", "64475"}, - {"240e:97d:2000::/36", "134764"}, - {"2607:fcd0:fac0::/37", "8100"}, - {"2620:1d6:ff4::/44", "2571"}, - {"2a04:4cc0::/29", "47215"}, - {"2001:df0:f500::/48", "142379"}, - {"2401:3c00:d8::/45", "38322"}, - {"2607:6100:1005::/48", "23026"}, - {"2400:cb00:360::/48", "13335"}, - {"2a04:5e80::/29", "60243"}, - {"2a0d:40::/29", "39204"}, - {"2001:559:873f::/48", "33491"}, - {"240a:a4f2::/32", "143916"}, - {"2804:14d:e650::/42", "28573"}, - {"2804:cb0:d000::/38", "52742"}, - {"2804:6574::/32", "269491"}, - {"2a04:f310::/31", "12344"}, - {"2001:388:a099::/33", "7575"}, - {"2402:8100:26d8::/47", "45271"}, - {"2403:780:e400::/35", "64098"}, - {"2600:1405:a001::/35", "20940"}, - {"2610:a1:3070::/48", "12008"}, - {"2a03:2887:ff37::/44", "63293"}, - {"2001:559:c4d5::/48", "33667"}, - {"2001:da8:b013::/37", "23910"}, - {"240a:af73::/32", "146605"}, - {"2600:1015:b030::/41", "6167"}, - {"2a01:5040:21::/41", "43996"}, - {"2402:b400:41f0::/37", "45960"}, - {"2409:8c14:2000::/36", "56044"}, - {"240a:a6d1::/32", "144395"}, - {"2604:2680:5::/46", "2386"}, - {"2a02:ce80::/46", "200183"}, - {"2a10:2f00:181::/48", "207556"}, - {"2408:8256:3b6c::/43", "17623"}, - {"2804:2190::/32", "264562"}, - {"2a0a:54c1:28::/47", "9053"}, - {"2803:7260::/46", "52238"}, - {"2001:470:156::/48", "25948"}, - {"2001:559:c3b4::/48", "7922"}, - {"2001:df1:3100::/48", "64050"}, - {"2620:55:8000::/48", "53804"}, - {"2804:4950::/32", "267177"}, - {"2804:6fd4::/32", "270687"}, - {"2a03:9da0::/40", "42831"}, - {"2a0e:9100::/29", "212872"}, - {"2a0f:5ac0::/32", "60472"}, - {"2001:559:84bb::/48", "33491"}, - {"2001:fd8:3006::/44", "132199"}, - {"2402:800:f2f0::/39", "7552"}, - {"2402:8100:39a0::/44", "45271"}, - {"2408:8656:3100::/38", "17816"}, - {"2408:8957:19c0::/38", "17622"}, - {"2a04:3a00::/29", "60703"}, - {"240a:a72c::/32", "144486"}, - {"2600:6c38:f2e::/47", "20115"}, - {"2a01:b740:a0b::/45", "714"}, - {"2400:adc7:800::/39", "9541"}, - {"2408:8459:6450::/38", "17816"}, - {"2804:14c:bba9::/45", "28573"}, - {"2804:4b9c::/32", "267318"}, - {"2a01:8840:b9::/48", "207266"}, - {"2001:250:21b::/45", "23910"}, - {"2408:8756:4cf2::/44", "136959"}, - {"2620:1f8:f011::/46", "40443"}, - {"2804:6d8::/32", "262609"}, - {"2804:3ca4::/32", "266226"}, - {"2804:6588::/32", "269497"}, - {"2a04:6b40::/29", "8681"}, - {"2a11:f740:2::/48", "210560"}, - {"2001:579:b04c::/43", "22773"}, - {"2402:8100:259e::/42", "55644"}, - {"2804:e94:8000::/44", "262468"}, - {"2a02:26f7:f008::/48", "36183"}, - {"2a11:af04::/30", "208861"}, - {"2401:d800:b232::/41", "7552"}, - {"2804:180::/32", "26615"}, - {"2804:3f34::/32", "262351"}, - {"2804:7668::/32", "271110"}, - {"2a0d:240::/29", "8881"}, - {"2402:8100:2000::/43", "45271"}, - {"2402:ef0f::/32", "9430"}, - {"240a:ac8f::/32", "145865"}, - {"2804:37f0:4100::/36", "266445"}, - {"2804:5ef8::/32", "269068"}, - {"2804:8638::/32", "272629"}, - {"2600:6c34:1d8::/48", "33588"}, - {"2600:9000:2061::/40", "16509"}, - {"2620:109:c001::/46", "14413"}, - {"2800:484:cb00::/40", "10620"}, - {"2804:204:301::/46", "28186"}, - {"2806:3dd::/32", "28443"}, - {"2a01:4a0:f::/43", "201011"}, - {"2a0c:7040::/32", "203488"}, - {"2001:1248:971b::/45", "11172"}, - {"2001:4d40:840f::/29", "13237"}, - {"2409:8904:2ea0::/39", "24547"}, - {"2409:8a51:900::/38", "56047"}, - {"240a:a135::/32", "142959"}, - {"240a:abe4::/32", "145694"}, - {"240e:3bb:2200::/37", "136198"}, - {"2804:2b20::/32", "265136"}, - {"2a03:fec0::/32", "47747"}, - {"2a11:9680::/29", "204790"}, - {"2001:559:3ca::/48", "33657"}, - {"2804:4c14:8a01::/39", "267348"}, - {"2a00:cb8:31::/48", "15695"}, - {"2a00:55a0:12::/47", "57717"}, - {"2a03:4ca0::/32", "208154"}, - {"2a03:b040::/32", "60981"}, - {"2001:468:502::/48", "12145"}, - {"2804:14d:7e84::/44", "28573"}, - {"2402:3a80:1760::/48", "38266"}, - {"2403:e000::/32", "9555"}, - {"2409:8924:5500::/38", "56046"}, - {"240a:a20e::/32", "143176"}, - {"2806:20d:5222::/47", "32098"}, - {"2a07:8180::/29", "202680"}, - {"2001:df7:4d80::/48", "138754"}, - {"240a:a78e::/32", "144584"}, - {"2604:fb40::/32", "46939"}, - {"2a00:d1c0::/32", "20559"}, - {"2a00:d4e0::/29", "15600"}, - {"2001:418:3807::/48", "4128"}, - {"2001:559:1fd::/48", "7922"}, - {"2001:559:86fa::/48", "7016"}, - {"2001:4878:2151::/48", "12222"}, - {"240e:e:b800::/37", "136195"}, - {"2605:a401:80be::/41", "33363"}, - {"2804:490:8100::/37", "28613"}, - {"2804:3e54::/32", "266588"}, - {"2001:1248:9c00::/44", "11172"}, - {"2402:8100:399f::/48", "55644"}, - {"240e:438:4640::/36", "4134"}, - {"2603:ff40::/27", "397165"}, - {"2606:18c0:2::/48", "14445"}, - {"2a01:c50f:c400::/41", "12479"}, - {"2409:8050:2802::/38", "56047"}, - {"2603:f4b8::/25", "397165"}, - {"2604:f400:5::/48", "19406"}, - {"2800:484:7200::/37", "14080"}, - {"2a03:1b20:1::/44", "39351"}, - {"2a05:3580:e100::/35", "35807"}, - {"2404:3900:a92::/48", "38320"}, - {"240e:944:1000::/34", "4134"}, - {"2606:acc0::/32", "20055"}, - {"2803:7260:11::/42", "52238"}, - {"2a02:1ba::/29", "47692"}, - {"2a03:d000:6400::/39", "31205"}, - {"2405:4803:2da::/42", "18403"}, - {"240a:a7ab::/32", "144613"}, - {"2001:4408:5f00::/34", "4758"}, - {"2405:9800:c601::/42", "45430"}, - {"2408:8756:f0a::/40", "136958"}, - {"240a:a887::/32", "144833"}, - {"2800:160:1d3f::/41", "14259"}, - {"2a00:8120::/32", "41480"}, - {"2a02:26f0:f8::/48", "20940"}, - {"2001:559:51d::/46", "7922"}, - {"2402:800:93c5::/42", "7552"}, - {"2600:1901:c0a0::/41", "396982"}, - {"2605:80::/32", "11831"}, - {"2803:9e20::/32", "265877"}, - {"2804:1b2c:1003::/32", "61713"}, - {"2a0b:33c0:117::/44", "57395"}, - {"2001:559:a7::/48", "33651"}, - {"240e:45c:600::/35", "131285"}, - {"2a0b:8f80:301::/48", "12859"}, - {"2407:500:500::/48", "58940"}, - {"240a:a39b::/32", "143573"}, - {"2620:119:4044::/42", "7726"}, - {"2804:7f44::/32", "271677"}, - {"2a00:1480::/47", "39737"}, - {"2409:8e20::/29", "9808"}, - {"2a09:bac0:189::/48", "13335"}, - {"2001:559:3ed::/48", "33662"}, - {"2001:559:c133::/48", "33657"}, - {"2400:c700:1182::/47", "55644"}, - {"2603:f1c0::/26", "397165"}, - {"2607:1c00::/32", "40395"}, - {"2804:2048::/32", "264483"}, - {"2a01:40e0::/47", "8315"}, - {"2a05:f440::/44", "35280"}, - {"2001:678:480::/48", "3320"}, - {"2404:1c40:b6::/41", "24432"}, - {"240e:90:3000::/30", "4134"}, - {"2800:bf0:240::/43", "52257"}, - {"2804:59a8:2000::/32", "268717"}, - {"2806:230:4031::/48", "11888"}, - {"2a02:2578::/35", "51375"}, - {"2a02:2f0c:d000:41::/30", "8708"}, - {"2a06:e881:5504::/48", "209864"}, - {"2001:67c:18c8::/47", "30857"}, - {"2605:9f00:300::/32", "36473"}, - {"2804:7054::/32", "270720"}, - {"2804:8138:2000::/32", "272440"}, - {"2a01:4a00::/32", "44395"}, - {"2a0c:8540:10::/47", "42198"}, - {"2001:df7:200::/47", "135871"}, - {"2400:c800:610::/44", "4760"}, - {"2401:e740::/32", "135607"}, - {"240a:aeb8::/32", "146418"}, - {"2600:6c39:441::/43", "20115"}, - {"2001:559:8406::/48", "7922"}, - {"2001:13d2:811::/46", "7303"}, - {"240e:983:b01::/37", "4134"}, - {"2607:f4e8:ac3::/32", "22822"}, - {"2620:0:1c00::/40", "32934"}, - {"2a02:ac80:d1::/42", "25145"}, - {"2001:49f0:d100::/47", "30058"}, - {"2405:4cc1:1000::/40", "55891"}, - {"2620:ed:8000::/48", "36288"}, - {"2600:803:618::/48", "3495"}, - {"2800:160:1511::/42", "14259"}, - {"2804:24a4::/32", "264235"}, - {"2a02:26f7:f805::/46", "20940"}, - {"2a02:4600::/32", "200831"}, - {"2001:56b:e00c::/35", "852"}, - {"2604:ca00:4f4::/44", "36492"}, - {"2a03:6000::/32", "60131"}, - {"2803:35e0::/32", "270040"}, - {"2803:9800:9039::/40", "11664"}, - {"2a00:52c0::/32", "29396"}, - {"2403:5a40:20::/48", "134562"}, - {"2409:8959:cd54::/38", "56040"}, - {"2a0f:8444::/32", "16262"}, - {"2001:df0:24f::/48", "58436"}, - {"2403:71c0:ff00::/48", "43959"}, - {"2406:2000:9d::/46", "10310"}, - {"240e:3b4:d000::/36", "134772"}, - {"2800:bf0:160::/44", "52257"}, - {"2806:2f0:5443::/40", "17072"}, - {"2a01:8840:ee::/43", "12041"}, - {"2a02:26f7:1f::/48", "20940"}, - {"2a03:5620::/32", "51090"}, - {"2001:6f0:3603::/33", "1257"}, - {"2409:8021::/34", "9808"}, - {"2600:370f:7260::/47", "32261"}, - {"2603:c0f9:2000::/36", "20054"}, - {"2804:59e4::/32", "268732"}, - {"2804:6ecc::/32", "270619"}, - {"2a0a:6700::/45", "40676"}, - {"2001:559:2e9::/48", "7725"}, - {"2001:da8:23a::/48", "24350"}, - {"2400:adda::/35", "9541"}, - {"2a02:26f7:bac6::/47", "20940"}, - {"2a05:c340::/29", "61157"}, - {"2001:b18:1014::/48", "47787"}, - {"240e:44d:4180::/41", "4134"}, - {"2a02:45c0:14::/48", "3209"}, - {"2a12:cd00::/29", "204790"}, - {"2001:508:a:1::/32", "32020"}, - {"2409:8c85:1a01::/37", "9808"}, - {"2400:dd0a:1006::/31", "7497"}, - {"2408:84f3:3e10::/42", "134543"}, - {"2801:b6::/38", "263083"}, - {"2804:c0::/32", "53100"}, - {"2806:230:2008::/48", "265594"}, - {"2a0d:6800::/29", "14576"}, - {"2001:559:c090::/48", "20214"}, - {"2600:1002:6000::/44", "6167"}, - {"2600:1409:9801::/37", "20940"}, - {"2606:4680::/32", "19116"}, - {"2620:74:28::/48", "396568"}, - {"2001:758::/32", "35393"}, - {"2403:fc00:400::/32", "9443"}, - {"2607:fc48:1000::/48", "40009"}, - {"2620:114:2000::/40", "5707"}, - {"2804:1e2c::/40", "264412"}, - {"2a0f:641::/32", "201086"}, - {"2400:9380:8dc0::/44", "136167"}, - {"2405:1c0:6551::/46", "55303"}, - {"2a0a:7d80:3::/48", "35594"}, - {"2a0d:5e00::/29", "25577"}, - {"2404:bf40:80c2::/39", "139084"}, - {"2404:e800::/46", "55430"}, - {"2800:200:bd50::/33", "12252"}, - {"2a02:26f7:cccc::/48", "36183"}, - {"2001:dc8:6000::/48", "45554"}, - {"2408:8956:2a40::/40", "17622"}, - {"2a02:888:8147::/48", "47794"}, - {"2a09:bd00:ffbc::/48", "42385"}, - {"2001:67c:1944::/48", "61430"}, - {"2001:da8:7030::/48", "23910"}, - {"240a:ae5e::/32", "146328"}, - {"2602:102:1018::/48", "33588"}, - {"2a02:26f7:e74d::/42", "20940"}, - {"2a02:26f7:f809::/46", "20940"}, - {"2001:678:12c::/48", "29405"}, - {"2001:678:b44::/48", "25526"}, - {"2001:67c:1b4::/48", "50188"}, - {"2001:df1:2900::/48", "136301"}, - {"2001:ee0:4600::/36", "45899"}, - {"2803:9800:a4c1::/46", "11664"}, - {"2a00:9080::/32", "30736"}, - {"2a02:26f7:cd40::/48", "36183"}, - {"2a0b:d000::/29", "34665"}, - {"2400:12::/48", "4766"}, - {"2401:d800:870::/40", "7552"}, - {"2408:8862::/29", "4837"}, - {"2602:fd21::/37", "398488"}, - {"2a02:6c20:808::/45", "207167"}, - {"2a03:5780:197::/44", "25122"}, - {"2001:559:3f8::/48", "33287"}, - {"2001:559:810e::/48", "33657"}, - {"2607:b600:11::/48", "25645"}, - {"2610:20:3000::/44", "3635"}, - {"2001:559:85b2::/48", "33659"}, - {"2402:4000:2290::/32", "18001"}, - {"2406:840:e030::/47", "142418"}, - {"2600:1010:b100::/42", "6167"}, - {"2602:ffe4:c11::/44", "21859"}, - {"2604:c200::/32", "33544"}, - {"2804:8088::/32", "271757"}, - {"2a02:26f7:d5::/48", "20940"}, - {"2001:410:e000::/40", "7860"}, - {"2400:8800:101::/38", "3491"}, - {"240a:a827::/32", "144737"}, - {"2804:1e38:2000::/43", "264415"}, - {"2804:6b98::/32", "270411"}, - {"2804:7644::/32", "271100"}, - {"2a0f:89c0::/29", "212238"}, - {"2001:4268:1120::/32", "15964"}, - {"2405:ec01:a000::/33", "137412"}, - {"2600:6c34:19d::/48", "33588"}, - {"2803:5840:e004::/35", "262145"}, - {"2803:5ba0::/32", "267766"}, - {"2a04:85c0::/29", "51890"}, - {"2a0e:1380::/35", "209987"}, - {"2402:800:76f0::/39", "7552"}, - {"2606:62c0:7000::/32", "399686"}, - {"2804:7f30::/33", "271672"}, - {"2a06:1a80::/29", "207481"}, - {"2408:840c:af00::/40", "17621"}, - {"240e:438:3e20::/43", "140647"}, - {"2600:6c10:40b::/43", "20115"}, - {"2a11:b080::/29", "211737"}, - {"2001:559:3df::/42", "33652"}, - {"2001:678:f14::/48", "8767"}, - {"2001:44b8:30fb::/36", "4739"}, - {"240e:91f::/32", "4134"}, - {"2804:2ac::/32", "28300"}, - {"2804:81e4::/32", "272484"}, - {"2a02:f181::/48", "197573"}, - {"2001:559:505::/48", "33659"}, - {"2001:b08:18::/48", "8684"}, - {"2401:2700:1:1::/48", "9286"}, - {"2a02:26f0:3501::/40", "20940"}, - {"2a10:cc42:1e00::/40", "20473"}, - {"240a:a3f2::/32", "143660"}, - {"2600:5c01:319c::/48", "11351"}, - {"2804:53d0::/32", "268608"}, - {"2a00:1688::/32", "34056"}, - {"2a02:9b0:405f::/32", "35819"}, - {"2a02:26f7:8d::/48", "20940"}, - {"2001:da8:bc::/48", "24351"}, - {"2408:8459:8030::/41", "17622"}, - {"2409:8038:1900::/34", "9808"}, - {"2a02:2578:1309::/45", "51375"}, - {"2a02:26f7:bd00::/48", "36183"}, - {"2a06:cc80::/29", "203659"}, - {"2001:1388:10c::/37", "6147"}, - {"2401:6c0::/32", "136514"}, - {"2600:1404:a000::/48", "35994"}, - {"2804:31c4::/32", "265036"}, - {"2a00:1458::/32", "50083"}, - {"2a02:26f7:bd80::/48", "36183"}, - {"2a02:26f7:e70d::/42", "20940"}, - {"2001:559:82d0::/48", "7922"}, - {"2602:ffe4:c3e::/41", "21859"}, - {"2804:4030::/32", "265943"}, - {"2a02:26f7:d201::/46", "20940"}, - {"2a06:1287:30::/44", "203909"}, - {"2001:5b0:6900::/40", "6621"}, - {"2402:5300:4f00::/35", "45903"}, - {"240a:acb6::/32", "145904"}, - {"240a:af3e::/32", "146552"}, - {"2a06:e382::/29", "203507"}, - {"2401:d800:5be0::/37", "7552"}, - {"2806:2f0:6143::/42", "17072"}, - {"2a05:2cc0::/29", "44439"}, - {"240a:a108::/32", "142914"}, - {"240a:a9f7::/32", "145201"}, - {"2600:1488:6101::/41", "20940"}, - {"2804:2214:e::/32", "28177"}, - {"2804:6ac8:103::/45", "270358"}, - {"2a02:88d::/44", "48695"}, - {"2405:b000::/39", "6262"}, - {"2603:c021:c000::/35", "31898"}, - {"2a0e:8f01:10b::/45", "38230"}, - {"2001:559:7fc::/48", "7015"}, - {"2001:44b8:30c3::/48", "4739"}, - {"240e:45c:2c00::/35", "131285"}, - {"2603:c001::/38", "31898"}, - {"2606:6240:b00b::/48", "212149"}, - {"2620:10c:7000::/44", "2906"}, - {"2801:c4:15::/48", "262922"}, - {"2804:4db0::/34", "268213"}, - {"2a03:560::/47", "201832"}, - {"2a0a:3cc0::/29", "62035"}, - {"2600:6c38:726::/44", "20115"}, - {"2a00:5b20::/32", "39816"}, - {"2a09::/48", "6233"}, - {"2001:550:2801::/48", "63199"}, - {"240a:a747::/32", "144513"}, - {"2604:a880:400::/48", "14061"}, - {"2607:fe50::/32", "5661"}, - {"2001:678:374::/48", "52003"}, - {"2405:5500::/32", "54187"}, - {"2405:d300:20::/48", "38809"}, - {"2602:80c:2015::/40", "399976"}, - {"2605:bb00::/35", "4213"}, - {"2804:6d98::/32", "270543"}, - {"2a0b:32c0::/29", "205739"}, - {"2a0c:ee00::/39", "206805"}, - {"2404:a300::/48", "23884"}, - {"2a02:d140::/29", "49788"}, - {"2405:5240::/35", "398704"}, - {"2a02:26f0:5201::/39", "20940"}, - {"2a09:4c2:2d::/48", "58057"}, - {"2409:8704:9900::/38", "24547"}, - {"2603:c001:3210::/37", "31898"}, - {"2604:8540:fc02::/45", "33353"}, - {"2a02:26f7:b9a0::/48", "36183"}, - {"2a02:26f7:d901::/46", "20940"}, - {"240a:affe::/32", "146744"}, - {"2a0d:c340::/29", "206123"}, - {"2001:67c:7bc::/48", "8949"}, - {"2001:67c:1580::/48", "50277"}, - {"240a:a2cf::/32", "143369"}, - {"240a:a394::/32", "143566"}, - {"2804:3e90:8b01::/33", "266606"}, - {"2a00:cc0::/46", "13237"}, - {"2a07:3b80:1::/48", "47447"}, - {"2a0c:8b40::/29", "42908"}, - {"2001:19f0:8000::/38", "20473"}, - {"2400:fd80:100::/40", "55891"}, - {"240e:13:7000::/37", "139201"}, - {"2607:f250:d000::/48", "7046"}, - {"2a07:6a86::/32", "203568"}, - {"2a0f:5701:3517::/44", "205593"}, - {"2803:ad60::/32", "271920"}, - {"2a0c:b641:750::/44", "210546"}, - {"2405:8a00:601d::/42", "55824"}, - {"2801:80:1400::/48", "11097"}, - {"2804:58a8::/32", "268142"}, - {"2a02:1211::/28", "3303"}, - {"2a02:26f7:bd84::/48", "36183"}, - {"2a04:4e40:7630::/41", "54113"}, - {"2a06:6240::/29", "20643"}, - {"2401:4900:c80::/44", "45609"}, - {"240b:4003:fee3::/48", "45102"}, - {"2a07:3500:11e0::/48", "39686"}, - {"2a0e:e44::/32", "208638"}, - {"2409:8061:1100::/36", "9808"}, - {"240e:44d:2b80::/41", "4134"}, - {"2605:3380:4802::/48", "14532"}, - {"2804:43c::/34", "262422"}, - {"2804:646c::/32", "269427"}, - {"2a02:26f7:e081::/46", "20940"}, - {"2001:559:ae::/48", "33657"}, - {"240a:ad40::/32", "146042"}, - {"2600:370f:7292::/42", "32261"}, - {"2a02:26f7:f5c4::/48", "36183"}, - {"2001:559:8637::/48", "7015"}, - {"2402:800:93ee::/37", "7552"}, - {"2600:380:2100::/37", "20057"}, - {"2600:140f:6801::/37", "20940"}, - {"2600:370f:522a::/41", "32261"}, - {"2804:3d50::/32", "266267"}, - {"2a09:57c0::/29", "63023"}, - {"2600:6c38:723::/45", "20115"}, - {"2a01:b740:921::/40", "714"}, - {"2a0e:46c4:2c33::/48", "142597"}, - {"2001:67c:2c80::/48", "198217"}, - {"2804:42fc::/32", "267541"}, - {"2804:5564::/32", "264173"}, - {"2c0f:3200:2::/32", "37558"}, - {"2001:67c:1b78::/48", "61411"}, - {"2607:fee0:a100::/33", "3599"}, - {"2801:80:12c0::/48", "263890"}, - {"2a01:8640:f::/48", "59711"}, - {"2001:678:bb4::/48", "43962"}, - {"2603:9000::/28", "33363"}, - {"2605:3380:4459::/48", "12025"}, - {"2606:2800:4016::/44", "15133"}, - {"2800:110:3c01::/38", "4270"}, - {"2a02:c390::/29", "31304"}, - {"2606:2800:504c::/48", "15133"}, - {"2800:200:e890::/35", "12252"}, - {"2a0b:9440::/29", "34766"}, - {"2a0e:8f02:f029::/48", "207071"}, - {"2001:df0:411::/48", "17439"}, - {"2001:1248:9803::/44", "11172"}, - {"2409:8060:3100::/36", "9808"}, - {"2620:49:3::/45", "16686"}, - {"2a02:26f7:ecc0::/48", "36183"}, - {"2a0a:15c0::/29", "206273"}, - {"2a0b:e300::/32", "44808"}, - {"2a0c:fe80::/29", "200490"}, - {"2409:8c7f::/24", "9808"}, - {"2600:1a00::/28", "46650"}, - {"2804:2e00::/32", "265317"}, - {"2a00:dbc0::/32", "48885"}, - {"2a04:c040::/29", "212694"}, - {"2804:7bc::/32", "52861"}, - {"2a06:bcc0:11::/48", "203724"}, - {"2a09:3800::/29", "208861"}, - {"2001:4128::/32", "28788"}, - {"2600:141c:f001::/31", "20940"}, - {"2a00:1450::/33", "15169"}, - {"2a00:5a00::/32", "197529"}, - {"2001:559:c15a::/48", "7725"}, - {"2401:75c0::/32", "136793"}, - {"240a:a076::/32", "142768"}, - {"2602:210::/32", "11290"}, - {"2804:7db0::/32", "271576"}, - {"2a00:4802:230::/41", "8717"}, - {"2a05:46c0::/29", "200780"}, - {"2a0b:b7c0::/29", "57717"}, - {"2a10:a000::/45", "42201"}, - {"2606:2800:5a0c::/47", "15133"}, - {"2a0f:dac0::/29", "60781"}, - {"2001:16f8:666::/48", "30870"}, - {"2401:d800:d592::/41", "7552"}, - {"2804:14d:68b1::/41", "28573"}, - {"2806:20d::/35", "32098"}, - {"2a02:26f0:b100::/48", "12956"}, - {"2c0f:1d00::/32", "60171"}, - {"2001:559:94::/48", "7015"}, - {"2001:678:ffc::/48", "210959"}, - {"2001:1a11:bd::/41", "42298"}, - {"2a04:4e40:f600::/48", "54113"}, - {"2a09:d2c1:6::/48", "209117"}, - {"2403:8600:2080::/43", "45820"}, - {"2407:c600:1::/48", "56140"}, - {"240a:a6d6::/32", "144400"}, - {"2605:a401:8118::/45", "33363"}, - {"2804:18:40::/42", "26599"}, - {"2804:66a8::/32", "269574"}, - {"2804:385c:200::/32", "262687"}, - {"2a05:1d40::/30", "58239"}, - {"2a06:1783::/32", "202134"}, - {"2602:ff75::/36", "8100"}, - {"2804:37c0::/32", "266434"}, - {"2a09:6f00::/29", "208861"}, - {"240e:5a:40c0::/39", "140291"}, - {"2001:559:872d::/48", "33491"}, - {"2001:67c:488::/48", "1257"}, - {"240a:a3ac::/32", "143590"}, - {"2804:245c::/32", "264217"}, - {"2a06:aa40::/32", "51944"}, - {"2a0b:e740::/29", "47787"}, - {"2a10:6340::/48", "49981"}, - {"2401:d800:b600::/42", "7552"}, - {"2600:140f:b800::/48", "9498"}, - {"2602:ff19::/36", "395033"}, - {"2804:33a0::/32", "265408"}, - {"2a05:a1c0::/32", "201155"}, - {"2401:d7c0::/32", "45355"}, - {"2406:c800::/32", "38016"}, - {"240a:a367::/32", "143521"}, - {"2a05:9a40::/29", "212144"}, - {"2a07:de80::/29", "35779"}, - {"2001:4878:228::/48", "12222"}, - {"240a:ae4c::/32", "146310"}, - {"2620:74:1c::/48", "397228"}, - {"2a01:ad00:7::/39", "51865"}, - {"2001:4998:60::/48", "14196"}, - {"2a02:548::/32", "35087"}, - {"2001:559:c354::/48", "33287"}, - {"240a:a2f5::/32", "143407"}, - {"240a:a8e8::/32", "144930"}, - {"2400:4b20::/32", "149330"}, - {"2405:1c0:6541::/46", "55303"}, - {"2408:8956:6900::/40", "17816"}, - {"2408:8957:2d00::/40", "17816"}, - {"2801:12:2800::/48", "269972"}, - {"2803:70e0::/32", "263235"}, - {"2804:1a7c::/32", "61862"}, - {"2a00:13c8::/46", "25291"}, - {"2a10:c941:11:11::/39", "35277"}, - {"2602:fc26:16::/48", "211562"}, - {"2800:650:5::/39", "28032"}, - {"2804:1010:4500::/36", "263617"}, - {"2804:7110:7100::/32", "270764"}, - {"2804:8568::/32", "272577"}, - {"2a01:2000::/20", "3269"}, - {"2001:4998:160::/48", "7280"}, - {"2401:d800:b542::/40", "7552"}, - {"240a:a691::/32", "144331"}, - {"2600:140f:201::/39", "20940"}, - {"2a10:5980::/29", "208254"}, - {"2a02:26f7:ff::/48", "20940"}, - {"2a02:26f7:b9cc::/48", "36183"}, - {"2a02:26f7:ee09::/42", "20940"}, - {"2a09:bac0:199::/48", "13335"}, - {"2603:c024:4000::/35", "31898"}, - {"2a0f:5707:b101::/48", "211684"}, - {"2001:559:8135::/48", "7922"}, - {"2001:559:63::/48", "7015"}, - {"2001:559:7f8::/48", "33657"}, - {"2602:fd9a:1000::/32", "54613"}, - {"2607:f368:3221::/46", "32982"}, - {"2607:f7a8:400::/39", "16657"}, - {"2804:51c:7001::/38", "262495"}, - {"2a01:8100:2000::/36", "39729"}, - {"2a02:b000::/23", "1267"}, - {"2400:cb00:490::/46", "13335"}, - {"240e:13:806::/48", "140858"}, - {"2602:fe12:9::/48", "139267"}, - {"2605:a7c0:141::/44", "16509"}, - {"2804:14c:ce00::/40", "28573"}, - {"2a00:11d8::/32", "39598"}, - {"2a02:24c0::/32", "197307"}, - {"2001:250:343e::/48", "23910"}, - {"2800:160:140e::/42", "14259"}, - {"2804:3b8:6a::/39", "52965"}, - {"2404:168::/32", "24229"}, - {"2409:4061:3000::/30", "55836"}, - {"240a:a6ce::/32", "144392"}, - {"2603:b010:fffe::/47", "11796"}, - {"2804:b30::/32", "52748"}, - {"2a10:1ac0::/29", "209886"}, - {"2001:13c7:7001::/48", "28000"}, - {"2401:50c0::/32", "136732"}, - {"2402:6800:761::/46", "22822"}, - {"2404:e100:4009::/48", "133840"}, - {"240c:ca30::/32", "24363"}, - {"2804:5a9c::/32", "268784"}, - {"2001:559:816f::/48", "20214"}, - {"2401:4900:20:84::/46", "45609"}, - {"2a00:1981::/32", "39603"}, - {"2001:668:200::/29", "3257"}, - {"2001:4408:8609::/33", "4758"}, - {"2803:d640::/32", "27729"}, - {"2804:3da4::/35", "266544"}, - {"2c0f:fe08:14b::/38", "36914"}, - {"2001:250:3808::/43", "138440"}, - {"2001:559:810f::/48", "33287"}, - {"2001:559:8149::/48", "7016"}, - {"2400:a980:d6::/44", "133111"}, - {"240a:aa73::/32", "145325"}, - {"2a02:26f7:e004::/48", "36183"}, - {"2a06:a005:400::/44", "211358"}, - {"2a0f:c085::/30", "48108"}, - {"2606:8200::/32", "32400"}, - {"2800:370:bc::/39", "28006"}, - {"2803:c010::/48", "271799"}, - {"2a02:26f7:e5c9::/42", "20940"}, - {"2001:67c:828::/48", "210833"}, - {"2408:870c:20::/44", "138421"}, - {"240a:a49a::/32", "143828"}, - {"2620:b1:4000::/48", "393238"}, - {"2a00:6f00::/32", "31273"}, - {"2a01:58a0::/39", "51018"}, - {"2a05:fc87::/32", "39540"}, - {"2a0b:2180::/48", "206502"}, - {"2c0f:fe98::/32", "30844"}, - {"2804:d7c:1100::/32", "52634"}, - {"2804:4530::/32", "262873"}, - {"2804:4afc:8000::/33", "267276"}, - {"2a01:8200:ff01::/40", "31216"}, - {"2001:67c:1bc::/48", "1921"}, - {"2001:1578::/48", "12657"}, - {"2401:d800:5510::/42", "7552"}, - {"2404:82c0::/42", "135377"}, - {"2408:8420::/30", "4837"}, - {"2600:5c00:3b7d::/37", "20001"}, - {"2804:3e8:2::/39", "28663"}, - {"2a02:250:4::/33", "39570"}, - {"2a06:9dc4::/32", "41917"}, - {"2a0e:a2c0::/32", "39702"}, - {"2803:6604:e001::/37", "28075"}, - {"2804:8354::/32", "272191"}, - {"2001:559:82e9::/46", "7922"}, - {"2001:559:c12b::/48", "7922"}, - {"2400:cc00:3000::/36", "140637"}, - {"2401:7000:f000::/36", "45177"}, - {"2a00:12d0::/29", "13101"}, - {"2001:4490:d080::/46", "9829"}, - {"2607:6480:6000::/35", "30377"}, - {"2402:e380:15::/48", "135646"}, - {"2600:5c01:1a3::/36", "10796"}, - {"2602:ffd1:2::/47", "393336"}, - {"2001:559:4c4::/47", "7015"}, - {"2001:559:81f6::/48", "33491"}, - {"2409:8715:3c00::/32", "56044"}, - {"2001:559:8745::/48", "33651"}, - {"2001:df0:1e:4000::/64", "45796"}, - {"240a:ac7c::/32", "145846"}, - {"2600:1413:3000::/48", "24319"}, - {"2800:4b0::/33", "12252"}, - {"2804:7960::/32", "271302"}, - {"2a0c:8187::/32", "206994"}, - {"2001:250:2c0d::/43", "138381"}, - {"2001:559:877b::/48", "33657"}, - {"2404:8840::/32", "32519"}, - {"2605:3380:4000::/39", "12025"}, - {"2607:f6e0::/32", "22346"}, - {"2806:230:101d::/48", "11888"}, - {"2a05:8c40::/29", "201172"}, - {"2400:4480:8000::/48", "17426"}, - {"2402:79c0:1154::/46", "26415"}, - {"2403:8500:1200::/40", "45804"}, - {"2409:805a:2901::/48", "56040"}, - {"2607:f7c0::/34", "36444"}, - {"2a02:610:7502::/32", "2588"}, - {"2001:1248:56c5::/43", "11172"}, - {"2600:5800:f78b::/36", "11426"}, - {"2804:5dac::/32", "52984"}, - {"2001:da8:a003::/45", "23910"}, - {"2402:9c00::/32", "9676"}, - {"2408:8956:5800::/40", "17622"}, - {"240a:a6f2::/32", "144428"}, - {"240a:a792::/32", "144588"}, - {"240a:a809::/32", "144707"}, - {"2001:df1:2980::/48", "55654"}, - {"240a:a408::/32", "143682"}, - {"240e:980:8400::/40", "63835"}, - {"2804:fbc::/32", "61894"}, - {"2a00:dca0::/29", "60175"}, - {"2c0f:4480::/32", "329028"}, - {"2804:640::/41", "262713"}, - {"2804:1b08:700::/34", "61704"}, - {"2804:1bc8::/32", "61750"}, - {"2a03:70e0::/32", "58243"}, - {"2607:f750:5000::/40", "23473"}, - {"2800:160:1d92::/42", "14259"}, - {"2800:c70::/43", "23201"}, - {"2804:46c4::/32", "267010"}, - {"2a0c:3fc0::/29", "206268"}, - {"2001:4c8:1020::/44", "15290"}, - {"2001:df0:93::/48", "45128"}, - {"2806:230:203b::/48", "11888"}, - {"2a05:1083:ff00::/48", "211876"}, - {"2a10:f2c0::/29", "207003"}, - {"2405:58c0:3a00::/40", "133101"}, - {"2604:bac0::/32", "19748"}, - {"2803:1fc0::/32", "265781"}, - {"2804:615c::/32", "269230"}, - {"2806:230:2033::/48", "11888"}, - {"2a01:558::/32", "15516"}, - {"2401:7200:2128::/48", "55328"}, - {"2a05:d050:2080::/44", "16509"}, - {"2a0b:3c40:13::/48", "209280"}, - {"2404:b0:1009::/36", "4750"}, - {"2408:84f3:b840::/38", "17816"}, - {"240a:a44c::/32", "143750"}, - {"2804:204:254::/46", "28186"}, - {"2804:1540::/32", "263380"}, - {"2804:5b18::/32", "268818"}, - {"2a01:688::/32", "20694"}, - {"2a06:8e00::/48", "7489"}, - {"2001:559:8033::/48", "7922"}, - {"2001:1260:7::/48", "28532"}, - {"2620:34:2000::/48", "395763"}, - {"2804:14c:f400::/42", "28573"}, - {"2a03:65e0::/32", "207426"}, - {"2001:1248:5ae3::/45", "11172"}, - {"2801:1d:e000::/48", "18747"}, - {"2804:14d:728a::/45", "28573"}, - {"2804:15e4::/46", "53001"}, - {"2a02:4e0:2900::/42", "16135"}, - {"2a02:1308::/29", "196922"}, - {"2a02:26f7:e851::/42", "20940"}, - {"2001:978:4204::/37", "174"}, - {"2001:df6:6300::/47", "133225"}, - {"2603:ffb0::/29", "40676"}, - {"2803:d100:9810::/42", "52362"}, - {"2804:ef4::/46", "28642"}, - {"2001:df0:8::/48", "18149"}, - {"2404:9400::/45", "133159"}, - {"240e:64:a000::/35", "140317"}, - {"2800:370:53::/44", "28006"}, - {"2801:1c:c800::/48", "269883"}, - {"2804:2b28::/32", "265138"}, - {"2a0f:a307::/32", "44326"}, - {"2001:67c:16c8::/48", "206479"}, - {"2001:1a30::/32", "29488"}, - {"2404:6d40::/32", "138810"}, - {"2404:8000:e2::/35", "17451"}, - {"2404:f4c0:fe1f::/48", "138632"}, - {"2800:190:9::/40", "11664"}, - {"2804:6c0:900::/43", "262418"}, - {"2804:3c1c::/32", "266191"}, - {"240a:a510::/32", "143946"}, - {"2604:5500:c00::/42", "19165"}, - {"2a0f:7700::/29", "47787"}, - {"2001:559:c051::/45", "7922"}, - {"2602:fc5c:4::/48", "29802"}, - {"2604:5940::/32", "395839"}, - {"2800:110:2200::/48", "264630"}, - {"2a0b:8240::/31", "205581"}, - {"2a0f:9180::/29", "21217"}, - {"2001:4490:d660::/45", "9829"}, - {"2600:6c04:be::/30", "20115"}, - {"2604:b180::/44", "11192"}, - {"2620:a9:8000::/45", "16991"}, - {"2001:559:83b8::/48", "33652"}, - {"2001:67c:72c::/48", "61337"}, - {"2602:102:1004::/46", "20115"}, - {"2804:5eb8::/32", "262866"}, - {"2a0e:b107:147a::/48", "142164"}, - {"2a10:4a80::/32", "210072"}, - {"2800:68:f::/43", "61468"}, - {"2a02:26f7:d108::/48", "36183"}, - {"2a04:ee00::/29", "56724"}, - {"2001:4d0:241a::/48", "1848"}, - {"2001:1900:2365::/48", "3356"}, - {"2409:8751:d00::/38", "56047"}, - {"2600:6c3a:e04::/31", "20115"}, - {"2001:559:c129::/48", "33657"}, - {"240a:aba4::/32", "145630"}, - {"240e:44d:2580::/41", "4134"}, - {"2604:50::/45", "393950"}, - {"2620:32:4000::/48", "395956"}, - {"2620:12a:600a::/45", "32578"}, - {"2804:151:63::/30", "10954"}, - {"2a02:2450::/29", "20880"}, - {"2001:500:3::/48", "20144"}, - {"240a:a20c::/32", "143174"}, - {"2c0f:f7a8:805f::/48", "4134"}, - {"2001:569:c::/30", "852"}, - {"2409:806b:3100::/36", "9808"}, - {"240e:4e:800::/27", "4134"}, - {"2603:6035::/32", "20001"}, - {"2804:111c:5::/32", "52818"}, - {"2a06:e881:140e::/47", "202540"}, - {"2a02:1378::/32", "39775"}, - {"2a02:26f7:e508::/48", "36183"}, - {"2001:500:90::/48", "33517"}, - {"2001:48a8::/33", "237"}, - {"2800:68:25::/44", "61468"}, - {"2804:79a0::/32", "271317"}, - {"2a03:6440:2001::/46", "199055"}, - {"2a12:3e80:100::/48", "48314"}, - {"2001:559:44a::/48", "33659"}, - {"2401:3c0:108::/47", "45528"}, - {"2403:9800:6d00::/38", "4771"}, - {"2804:1718::/32", "263121"}, - {"2a03:1f60::/32", "8787"}, - {"2400:df80::/32", "133444"}, - {"2600:370f:5268::/47", "32261"}, - {"2804:3b48::/32", "52591"}, - {"2a00:5300::/32", "45031"}, - {"2a06:e540:203::/29", "203600"}, - {"2a0e:a1c0::/29", "206576"}, - {"2a12:5240::/48", "209626"}, - {"2001:4998:3c::/48", "14780"}, - {"2408:8256:3980::/44", "17623"}, - {"240a:a6d2::/32", "144396"}, - {"240a:a83e::/32", "144760"}, - {"2804:7348::/32", "262690"}, - {"2a01:c50e:2900::/33", "12479"}, - {"2a02:26f7:ee04::/48", "36183"}, - {"2001:559:1cc::/48", "7725"}, - {"2401:2d80::/48", "58641"}, - {"240a:a10a::/32", "142916"}, - {"240a:ae08::/32", "146242"}, - {"240e:3b6:9200::/36", "140317"}, - {"2600:1407:1c01::/34", "20940"}, - {"2803:bc40:a006::/43", "52468"}, - {"2804:22b4:c8::/32", "264117"}, - {"2a07:22c1:c100::/40", "213021"}, - {"2001:12a0::/45", "28292"}, - {"2401:d800:7e40::/42", "7552"}, - {"2401:d800:de70::/40", "7552"}, - {"2402:a1c0::/39", "137526"}, - {"2a01:8840:45::/48", "207266"}, - {"2a02:6c00:f00b::/36", "44971"}, - {"2a02:cb80:4100::/43", "43766"}, - {"2a07:6cc0:10::/46", "61098"}, - {"2001:44c8:4700::/42", "131445"}, - {"240a:ad1a::/32", "146004"}, - {"240e:379:2600::/32", "4134"}, - {"2a0c:4a40::/29", "210107"}, - {"2001:1248:98c6::/44", "11172"}, - {"2406:2000:1a8::/46", "10310"}, - {"2806:230:1026::/48", "265594"}, - {"2001:559:c0ae::/48", "7922"}, - {"2409:8c3c:905::/35", "24444"}, - {"240a:a365::/32", "143519"}, - {"2600:cc04::/32", "32298"}, - {"2606:98c0::/32", "400333"}, - {"2a01:c50f:1600::/36", "12479"}, - {"2a02:6460::/32", "201875"}, - {"2a0f:cc83::/32", "208861"}, - {"2001:559:8400::/48", "33287"}, - {"2409:8035::/28", "9808"}, - {"2a02:26f0:119::/48", "34164"}, - {"2a02:26f7:c449::/42", "20940"}, - {"2a0f:4a80::/48", "50673"}, - {"2001:480:332::/37", "668"}, - {"2001:4860:4806::/41", "15169"}, - {"240e:1c:2000::/36", "4134"}, - {"2a00:1e6b::/29", "42861"}, - {"2a0c:b641:1a0::/47", "57470"}, - {"2c0f:fde8:1000::/36", "37712"}, - {"2001:49f0:d097:8000::/44", "174"}, - {"240e:f7:e000::/35", "136190"}, - {"2600:6c10:c37::/44", "20115"}, - {"2804:7e20::/32", "271604"}, - {"2a09:a0c0::/29", "34515"}, - {"2001:559:c2e3::/48", "7922"}, - {"2001:44b8:404c::/48", "7545"}, - {"2408:8459:ee30::/41", "17622"}, - {"2409:8928::/31", "56041"}, - {"2804:47c0::/32", "263665"}, - {"2804:4998::/32", "267192"}, - {"2a01:8840:ce::/43", "12041"}, - {"2a02:888:8247::/48", "47794"}, - {"2400:5ba0::/48", "149079"}, - {"2806:2f0:6283::/43", "17072"}, - {"2a01:4540::/29", "199554"}, - {"2603:c024:c000::/35", "31898"}, - {"2804:694:3900::/33", "262596"}, - {"2a00:cb40::/32", "48972"}, - {"2607:f6f0:b000::/40", "64275"}, - {"2804:7db8::/32", "271578"}, - {"2a0c:b641:69c::/48", "209297"}, - {"2401:4900:4ce0::/44", "45609"}, - {"2a02:26f7:c7c1::/46", "20940"}, - {"240a:a9d1::/32", "145163"}, - {"2604:e8c0:7::/48", "6233"}, - {"2800:150::/48", "22047"}, - {"2801:80:330::/48", "53046"}, - {"2a02:2b18::/32", "35816"}, - {"2001:df7:6800:2000::/48", "59194"}, - {"240a:a92b::/32", "144997"}, - {"240e:6bb::/36", "140316"}, - {"2804:46ec:2300::/35", "267020"}, - {"2804:6698::/32", "269570"}, - {"2a00:1358:1001::/32", "6866"}, - {"2a02:26f7:eccd::/42", "20940"}, - {"2a0d:3842:1260::/48", "57629"}, - {"2404:bf40:a504::/42", "139084"}, - {"2602:fc26:14::/48", "211562"}, - {"2a02:e30:f008::/48", "51426"}, - {"2001:559:4::/48", "33490"}, - {"2804:14d:ca00::/40", "28573"}, - {"2a02:26f7:c780::/48", "36183"}, - {"2001:559:871e::/48", "33491"}, - {"2804:66a0::/43", "269572"}, - {"2a01:8840:d2::/45", "12041"}, - {"2a02:26f7:be48::/48", "36183"}, - {"2a02:26f7:cf84::/48", "36183"}, - {"2001:67c:298::/48", "51307"}, - {"2400:c540:c827::/41", "59238"}, - {"2401:4900:1000::/41", "45609"}, - {"2804:1b3:3000::/39", "18881"}, - {"2a02:418::/29", "29691"}, - {"2a02:25b0:aaaa::/48", "42422"}, - {"2a04:4e40:5600::/48", "54113"}, - {"2a11:5ec0::/48", "16509"}, - {"2408:8956:b200::/40", "17622"}, - {"2604:700::/32", "10384"}, - {"2607:1280:1490::/44", "394972"}, - {"2804:56c:200::/35", "28210"}, - {"2a06:4b02::/29", "51191"}, - {"2001:559:299::/48", "33660"}, - {"2401:d800:5850::/42", "7552"}, - {"2408:8459:1c10::/42", "17623"}, - {"2800:630::/32", "7049"}, - {"2801:80:1c70::/48", "266122"}, - {"2804:4088::/32", "265965"}, - {"2001:559:84d5::/46", "7015"}, - {"2403:5800::/47", "4764"}, - {"2409:8030::/36", "9808"}, - {"2604:a640::/32", "54980"}, - {"2a01:ce95:8002::/33", "51964"}, - {"2a02:26f0:84::/48", "8966"}, - {"2a03:69c0:100::/40", "49981"}, - {"2a03:9520::/32", "42220"}, - {"2a03:c5c0::/32", "198484"}, - {"2a0e:46c6:8d5::/48", "208696"}, - {"2401:3280:1000::/34", "133613"}, - {"240a:a2b9::/32", "143347"}, - {"240a:ad8c::/32", "146118"}, - {"2600:8807:4782::/36", "22773"}, - {"2804:297c:c400::/36", "262907"}, - {"2a02:70::/47", "3326"}, - {"2a02:26f7:4e::/48", "36183"}, - {"2001:559:5de::/48", "7922"}, - {"2001:559:f2::/48", "7922"}, - {"2001:148f:fffc::/48", "59747"}, - {"2405:6e00:690::/41", "133612"}, - {"2a01:cde0:8010::/48", "16028"}, - {"2a02:26f7:ce44::/48", "36183"}, - {"2a03:1e02::/32", "203865"}, - {"2a0e:ba40::/29", "207547"}, - {"2600:6c38:f0e::/43", "20115"}, - {"2001:253:11a::/45", "38272"}, - {"2001:550:aa02::/35", "174"}, - {"2001:559:593::/48", "33287"}, - {"2001:df0:d1::/48", "55857"}, - {"2401:4900:5910::/44", "45609"}, - {"2402:8100:26a0::/46", "45271"}, - {"2406:840:fd10::/48", "134993"}, - {"2408:8957:9a00::/40", "17622"}, - {"2600:140f:7001::/38", "20940"}, - {"2620:122:b000::/48", "46656"}, - {"2804:2074::/32", "264491"}, - {"2a03:efc0:200::/40", "33438"}, - {"2a09:3c00:2::/29", "6939"}, - {"2a0a:6640::/29", "42658"}, - {"2001:559:728::/48", "7922"}, - {"2001:559:8015::/44", "7922"}, - {"2001:678:ef4::/48", "202592"}, - {"2001:13b0::/32", "3549"}, - {"2403:a340::/32", "134823"}, - {"2404:2f40::/32", "133938"}, - {"240a:a3e8::/32", "143650"}, - {"2800:bf0:118::/42", "27947"}, - {"2a04:f580:9230::/48", "4809"}, - {"2a05:6c0::/36", "203043"}, - {"2a0b:4d07:159::/48", "44239"}, - {"2001:16a0:6000::/48", "25019"}, - {"2409:8028:2c00::/38", "9808"}, - {"2a02:26f7:d4d0::/48", "36183"}, - {"2804:28e0::/32", "262550"}, - {"2a0b:dbc0::/29", "207003"}, - {"2402:c040::/32", "137567"}, - {"2408:8459:6e30::/41", "17622"}, - {"240e:44d:7700::/42", "140345"}, - {"2a01:aea0:dd3::/45", "40980"}, - {"2001:f98::/32", "17683"}, - {"2408:840d:dd00::/42", "17621"}, - {"240e:3bf:ec00::/35", "140314"}, - {"2804:3df8:6004::/35", "266566"}, - {"2a06:e881:5501::/46", "209864"}, - {"2a0b:b5c0::/29", "54543"}, - {"2001:1938:2000::/40", "33438"}, - {"240a:a961::/32", "145051"}, - {"2600:1407:f801::/28", "20940"}, - {"2600:140f:a01::/39", "20940"}, - {"2607:f110:e170::/40", "21889"}, - {"2620:0:1601::/48", "33052"}, - {"2804:1d70::/32", "264368"}, - {"2a02:868::/33", "13247"}, - {"2a02:26f7:dc04::/48", "36183"}, - {"2001:550:2802::/45", "174"}, - {"2600:100b:f010::/39", "6167"}, - {"2620:0:b30::/48", "32982"}, - {"2804:5640:f800::/37", "267986"}, - {"2a03:6580::/32", "19855"}, - {"240a:acef::/32", "145961"}, - {"2804:4cf8:2000::/32", "267404"}, - {"2001:559:81cf::/48", "33287"}, - {"2404:63c0:10::/44", "131645"}, - {"2406:e00:104::/47", "55740"}, - {"2604:d400:ff11::/48", "25934"}, - {"2606:4700:3055::/46", "13335"}, - {"2800:6c0::/32", "27823"}, - {"2a01:8840:66::/44", "12041"}, - {"2a0b:b87:ffef::/48", "20473"}, - {"240e:44d:2900::/41", "140345"}, - {"2804:1698::/32", "263295"}, - {"2c0f:fcb0:6000::/32", "36916"}, - {"2602:feca::/36", "6939"}, - {"2801:80:ae0::/48", "61779"}, - {"2806:2f0:3543::/42", "17072"}, - {"2a10:6c0::/29", "207324"}, - {"2600:1413:c001::/35", "20940"}, - {"2602:fd41::/36", "53859"}, - {"2a06:a005:14::/47", "210925"}, - {"2408:8957:9600::/40", "17622"}, - {"240a:ae92::/32", "146380"}, - {"2620:135:7001::/48", "7029"}, - {"2803:ca0::/32", "266831"}, - {"2a05:2080::/29", "204819"}, - {"240a:a302::/32", "143420"}, - {"2a02:4560::/46", "60157"}, - {"2001:df1:9000::/48", "58820"}, - {"2400:a980:500::/36", "133111"}, - {"2402:a00:fffa::/45", "45916"}, - {"2a02:47e0::/29", "201984"}, - {"2a0d:d740::/48", "210036"}, - {"2001:18c8:500::/40", "26326"}, - {"2001:4408:5227::/41", "4758"}, - {"2407:de40:4200::/48", "146886"}, - {"2001:1248:982a::/48", "11172"}, - {"2400:4d40:100a::/34", "134204"}, - {"2408:8956:e000::/40", "17622"}, - {"2804:316c::/32", "265014"}, - {"2804:7974::/32", "271306"}, - {"2a02:4e0:2800::/41", "16135"}, - {"2a0c:f040::/48", "51765"}, - {"2804:24dc::/32", "264245"}, - {"2a00:79e1:f1f::/48", "395973"}, - {"2610:20:6f15::/48", "49"}, - {"2804:5220::/32", "268496"}, - {"2a02:8f0::/32", "29003"}, - {"2a04:c940::/29", "25081"}, - {"2001:4878:4321::/45", "12222"}, - {"2401:4900:1c26::/44", "24560"}, - {"2402:1580:2100::/36", "17682"}, - {"2404:7a40::/43", "132556"}, - {"2800:bf0:a103::/45", "27947"}, - {"2803:6e80::/32", "27923"}, - {"2a02:cf40::/29", "62121"}, - {"240a:a0b6::/32", "142832"}, - {"240a:a66b::/32", "144293"}, - {"2600:1009:a120::/36", "22394"}, - {"2600:370f:36e5::/46", "32261"}, - {"2605:a401:8000::/47", "33363"}, - {"2605:de00:bc::/32", "30083"}, - {"2800:160:182e::/41", "14259"}, - {"2804:24c::/32", "262605"}, - {"2a03:9e00:406::/32", "14537"}, - {"2408:80fa:4000::/34", "17816"}, - {"2600:6c20:a10::/44", "20115"}, - {"2602:ff68::/36", "63436"}, - {"2800:160:19fa::/38", "14259"}, - {"2a0d:b201:6030::/41", "206026"}, - {"2408:870c:3000::/44", "138421"}, - {"240a:a164::/32", "143006"}, - {"240a:a633::/32", "144237"}, - {"2600:6c10:ffe4::/46", "20115"}, - {"2606:3b00::/32", "4906"}, - {"2607::/32", "19016"}, - {"2804:1530::/32", "262481"}, - {"2804:48a4::/32", "267135"}, - {"2a02:888:14a::/45", "47794"}, - {"2a02:26f7:cd45::/48", "20940"}, - {"2001:559:a4::/48", "33651"}, - {"2401:d800:b5a0::/41", "7552"}, - {"2409:8053:3002::/40", "56047"}, - {"240a:a650::/32", "144266"}, - {"240e:3b0:3e00::/33", "140308"}, - {"2607:f8d8::/32", "3580"}, - {"2801:2:101::/32", "17147"}, - {"2001:678:148::/48", "16302"}, - {"2001:67c:137c::/48", "49638"}, - {"2001:1988::/32", "16467"}, - {"2600:6:ff80::/44", "10507"}, - {"2804:319c::/32", "265026"}, - {"2a00:8140::/35", "60351"}, - {"2a11:e487:beef::/48", "212580"}, - {"2001:16e8:1118::/32", "25542"}, - {"2401:fa00::/42", "45566"}, - {"2600:5c01:2bd6::/37", "10796"}, - {"2804:90:5100::/38", "28580"}, - {"2804:7710::/34", "271152"}, - {"2a01:c50f:c040::/39", "12479"}, - {"2a03:2887:ff0f::/43", "35819"}, - {"240a:a6f6::/32", "144432"}, - {"2804:63a8:1002::/32", "269375"}, - {"2a02:f480::/29", "60717"}, - {"2404:ec:520::/32", "703"}, - {"2804:f78:cecf::/34", "263587"}, - {"2a02:26f7:72::/48", "36183"}, - {"2a02:ee80:415e::/42", "3573"}, - {"2a09:da80::/29", "15830"}, - {"2620:52:7::/48", "40955"}, - {"2a00:ca0::/32", "29286"}, - {"2a01:8000:1ffe::/32", "60672"}, - {"2a0b:f840::/32", "205376"}, - {"2001:c20:48b6::/48", "3758"}, - {"2404:6800:480f::/32", "15169"}, - {"240a:a005::/32", "142655"}, - {"240e:3b2:7600::/39", "140313"}, - {"2610:108:4000::/48", "13506"}, - {"2a05:d4c0::/29", "201011"}, - {"2406:d00:5555::/48", "132165"}, - {"2409:8904:5540::/42", "24547"}, - {"240a:ab8e::/32", "145608"}, - {"2a04:eb40::/29", "21183"}, - {"2a04:f580:9030::/48", "4809"}, - {"2a07:3500:13b8::/48", "212151"}, - {"2a0a:c540::/29", "205940"}, - {"2001:559:c036::/47", "20214"}, - {"2401:13c0:4000::/36", "132652"}, - {"2804:154c:4404::/35", "263382"}, - {"2804:4da8::/32", "268211"}, - {"2a00:5600::/32", "31727"}, - {"2a00:8c60:1::/48", "60706"}, - {"2a00:90c0:301::/29", "197745"}, - {"2a03:59e0::/32", "31736"}, - {"2001:559:4dc::/48", "7922"}, - {"2001:559:511::/48", "7016"}, - {"2001:67c:4d0::/48", "43354"}, - {"2403:4000:1a::/32", "24122"}, - {"240a:a552::/32", "144012"}, - {"240e:44d:2b40::/42", "140349"}, - {"2607:fb10:7152::/42", "2906"}, - {"2a00:6760::/32", "202140"}, - {"2a02:26f7:d049::/42", "20940"}, - {"2405:84c0:fade::/48", "138990"}, - {"2409:8924:900::/38", "56046"}, - {"2800:950::/32", "10299"}, - {"2804:78e8::/32", "271273"}, - {"2a00:4b00:13e::/38", "41935"}, - {"2400:c400::/32", "45570"}, - {"240e:44d:3f80::/41", "4134"}, - {"2620:3c::/42", "35929"}, - {"2804:1274::/32", "263477"}, - {"2001:418:2::/36", "2914"}, - {"2001:470:e7::/48", "15011"}, - {"2001:57a:1206::/34", "22773"}, - {"2404:7240:2009::/33", "59074"}, - {"2600:6c10:d7::/39", "20115"}, - {"2605:3380:440e::/48", "12025"}, - {"2804:4c14:eb01::/35", "267348"}, - {"2a00:c440::/29", "2116"}, - {"2001:559:c428::/48", "7922"}, - {"2402:1c80:4000::/32", "133957"}, - {"2804:2984:380::/37", "53184"}, - {"2a01:6e80:fffe::/48", "198156"}, - {"2001:590:3c01::/48", "34164"}, - {"2001:df7:fc80::/48", "136897"}, - {"2600:2002:3000::/36", "33517"}, - {"2600:6c21:403::/45", "20115"}, - {"2803:e880:fff1::/44", "52468"}, - {"2804:81a4::/32", "272467"}, - {"2a03:9120::/32", "43232"}, - {"2c0f:fe78:6000::/32", "37239"}, - {"2001:559:e::/48", "7922"}, - {"240e:44d:7d80::/41", "4134"}, - {"2804:4f90:300::/32", "268335"}, - {"2a03:25a0::/32", "201656"}, - {"2405:ba00:8701::/48", "136025"}, - {"2407:2ec0::/48", "135967"}, - {"2a02:f800::/29", "20485"}, - {"2001:579:408c::/41", "22773"}, - {"240a:60:f00e::/48", "9605"}, - {"240a:abd0::/32", "145674"}, - {"2804:67c0::/32", "269648"}, - {"2a02:750:15::/30", "42708"}, - {"2a05:3580:d000::/38", "35807"}, - {"2001:559:264::/47", "7922"}, - {"240a:a3b9::/32", "143603"}, - {"2a06:dd40:5600::/47", "203416"}, - {"2c0f:f350::/32", "328471"}, - {"2001:44b8:44::/38", "4739"}, - {"2600:6c7f:9072::/48", "20115"}, - {"2409:8052:3800::/47", "56047"}, - {"2804:2984:300::/41", "53184"}, - {"2001:c20::/43", "3758"}, - {"2a02:e980:1fa::/38", "19551"}, - {"2408:8956:edc0::/38", "17622"}, - {"240a:a34a::/32", "143492"}, - {"2606:2800:3::/48", "15133"}, - {"2804:884:2::/32", "262375"}, - {"2a0f:cd00::/29", "44885"}, - {"2001:678:2f0::/48", "20847"}, - {"2400:8000:8004::/33", "4800"}, - {"2600:6c39:23a::/40", "20115"}, - {"2800:160:1656::/47", "14259"}, - {"2a02:2e02:1bc0::/42", "12479"}, - {"2a03:7500::/29", "20810"}, - {"2800:bf0:81e9::/46", "52257"}, - {"2a02:26f7:53::/48", "20940"}, - {"2a0c:8540:a::/47", "42198"}, - {"2a07:a40::/44", "48821"}, - {"2a0f:3500::/29", "201188"}, - {"2408:8957:1500::/40", "17816"}, - {"2409:8087:4401::/40", "24445"}, - {"2a04:83c0::/29", "41561"}, - {"2a10:84c0::/29", "44103"}, - {"240a:a379::/32", "143539"}, - {"2600:370f:2022::/45", "32261"}, - {"2607:d580::/32", "16717"}, - {"2409:8a51:b00::/37", "56047"}, - {"2a09:ea00::/48", "16509"}, - {"2a0d:2c80::/29", "204647"}, - {"2001:978:7501::/38", "174"}, - {"2001:16a2:c00::/34", "39386"}, - {"2a01:c50e:a400::/35", "12479"}, - {"2a05:6e00::/29", "30781"}, - {"2c0f:ee88::/32", "328285"}, - {"2001:559:c177::/48", "33491"}, - {"2402:5300:4310::/37", "45903"}, - {"240a:a15e::/32", "143000"}, - {"2804:2644::/32", "264336"}, - {"2804:37f0::/35", "266445"}, - {"2001:df0:6800::/48", "23620"}, - {"2001:1248:9701::/46", "11172"}, - {"2404:8d06:b000::/40", "133543"}, - {"2804:211c:fe40::/39", "264536"}, - {"2804:22d0::/32", "264124"}, - {"2a02:2ad8::/39", "702"}, - {"2a04:c840::/29", "197830"}, - {"2a0a:5f40::/32", "207242"}, - {"2a0e:97c0:2f0::/44", "211540"}, - {"2c0f:ec08::/32", "328384"}, - {"2408:8469::/27", "4837"}, - {"2600:2c00:b000::/36", "17378"}, - {"2a05:a880:dc20::/48", "36351"}, - {"2a10:8001:c000::/36", "8551"}, - {"2a12:ba00::/29", "204790"}, - {"2404:f780:100::/48", "136557"}, - {"2804:18:6858::/39", "10429"}, - {"2804:c9c::/32", "52729"}, - {"2806:230:204c::/48", "265594"}, - {"2400:9380:8201::/48", "4134"}, - {"2607:d600::/32", "13576"}, - {"2a09:c80::/29", "41743"}, - {"2a02:26f7:f609::/46", "20940"}, - {"240a:afb6::/32", "146672"}, - {"2606:a680::/32", "393706"}, - {"2804:7918:1000::/32", "271284"}, - {"2a02:26f7:f508::/48", "36183"}, - {"2001:559:27b::/48", "33491"}, - {"2402:800:951d::/41", "7552"}, - {"2606:ae00:bee1::/39", "7287"}, - {"2620:f4:c000::/48", "13543"}, - {"2804:78::/32", "262684"}, - {"2a01:7640::/38", "21282"}, - {"2001:559:55d::/48", "7015"}, - {"2001:1490:104::/32", "8895"}, - {"2606:5580:c000::/38", "63242"}, - {"2607:f148:2005::/36", "11734"}, - {"2803:bb20::/32", "266752"}, - {"2a06:1287:330e::/47", "206499"}, - {"2401:5e40::/35", "63770"}, - {"2602:ffb9::/36", "16621"}, - {"2804:3b64::/32", "266146"}, - {"2403:9800:7f0d::/46", "4771"}, - {"2409:8904:d270::/40", "24547"}, - {"2804:640:112::/34", "262713"}, - {"2804:6d2c::/32", "270517"}, - {"2a00:ccc1:100::/40", "44486"}, - {"2600:1001:b100::/42", "6167"}, - {"2a01:7640:9000::/48", "206768"}, - {"2001:678:2ac::/48", "206763"}, - {"2001:df1:6c00::/48", "138685"}, - {"2001:df5:b000::/48", "45637"}, - {"2406:da00:e000::/40", "16509"}, - {"2600:6c20:80d::/42", "20115"}, - {"2606:2800:154::/48", "15133"}, - {"2607:fcd0:105:2700::/49", "8100"}, - {"2803:2fa0:ff00::/40", "265705"}, - {"2804:3358:4000::/32", "265390"}, - {"2804:41ec::/33", "267466"}, - {"2804:4fd4:c000::/34", "268352"}, - {"2a0b:6b86:d00::/43", "212232"}, - {"2a0e:8f02:f022::/48", "211479"}, - {"2001:250:1020::/44", "24353"}, - {"2001:15b0::/32", "21221"}, - {"2400:cb00:340::/45", "13335"}, - {"2405:6e00:2488::/45", "133612"}, - {"2606:2800:4a30::/46", "15133"}, - {"2401:3cc0:501::/38", "137409"}, - {"2600:1419:6400::/48", "35994"}, - {"2602:fe68::/36", "26370"}, - {"2804:81b0::/32", "272470"}, - {"240a:ad5c::/32", "146070"}, - {"2001:559:1e0::/48", "33659"}, - {"2001:559:c283::/45", "7015"}, - {"2603:c0f0:2000::/43", "6142"}, - {"2804:7d0::/32", "262324"}, - {"2a01:5f7::/32", "5588"}, - {"2a03:f80:381::/48", "9009"}, - {"2001:680::/32", "3257"}, - {"2605:a404:68b::/43", "33363"}, - {"2804:f2c:5800::/32", "53191"}, - {"2804:5238::/32", "268503"}, - {"2a02:26f7:e101::/46", "20940"}, - {"2a09:9a00::/29", "212417"}, - {"2401:cec0::/32", "55996"}, - {"2401:d800:b060::/40", "7552"}, - {"2402:2680::/32", "63873"}, - {"2607:180::/32", "395663"}, - {"2a00:4802:310::/44", "8717"}, - {"2001:4878:4158::/48", "12222"}, - {"2405:9800:c000::/37", "45430"}, - {"2607:f790:fff1::/45", "12129"}, - {"2607:fc58:1:29::/64", "13536"}, - {"2a00:a920::/36", "60486"}, - {"2a11:2780::/29", "21040"}, - {"2804:14c:65fa::/45", "28573"}, - {"2a0f:9207:24::/48", "61421"}, - {"2400:adc2:900::/38", "9541"}, - {"2405:ec00:5::/39", "23955"}, - {"2c0f:f578:70::/32", "24691"}, - {"2400:c6c0::/32", "58909"}, - {"2803:be20::/32", "52444"}, - {"2804:4db4::/32", "268214"}, - {"2001:559:1c5::/48", "33660"}, - {"2804:45e4:7410::/36", "262567"}, - {"2001:559:c14c::/47", "7015"}, - {"2620:c0::/48", "6492"}, - {"2803:f080:8800::/41", "64120"}, - {"2804:3110::/32", "264990"}, - {"2804:4488:2010::/44", "262480"}, - {"2a0c:1880::/29", "211594"}, - {"2a0c:7d40::/32", "209418"}, - {"2001:df0:d::/48", "24088"}, - {"2408:8459:a450::/38", "17816"}, - {"2804:1644::/38", "262903"}, - {"2a02:26f0:e301::/40", "20940"}, - {"2a0b:4340:520::/44", "134098"}, - {"2600:1403:9401::/36", "20940"}, - {"2801:1:8800::/48", "64102"}, - {"2a01:728::/29", "16347"}, - {"2a02:26f7:ec45::/46", "20940"}, - {"2a0c:3dc0::/29", "61323"}, - {"2408:840c:400::/40", "17621"}, - {"2607:fdf0::/33", "8008"}, - {"2a02:26f7:d788::/48", "36183"}, - {"2001:13d2:3805::/44", "7303"}, - {"2620:11e:1000::/48", "20052"}, - {"2001:250:1e0a::/39", "23910"}, - {"2001:fd8:b3b0::/44", "4775"}, - {"2402:1980::/32", "4818"}, - {"2600:370f:34c0::/45", "32261"}, - {"2804:28d0::/32", "263982"}, - {"2408:84f3:2c10::/44", "17623"}, - {"2603:f4b0::/29", "63023"}, - {"2804:20fc:2500::/32", "264525"}, - {"2a02:26f7:d585::/46", "20940"}, - {"2408:8956:cbc0::/37", "17622"}, - {"2600:140b:2201::/39", "20940"}, - {"2804:f88::/32", "28665"}, - {"2403:e00::/32", "38437"}, - {"2800:160:17b4::/44", "14259"}, - {"2a0a:6680:a000::/36", "206398"}, - {"2a0d:b201:c000::/43", "206026"}, - {"2804:827c::/32", "262937"}, - {"2806:2f0:9783::/42", "17072"}, - {"2a03:d7c0::/29", "42695"}, - {"2a06:e881:7100::/46", "207748"}, - {"2001:67c:890::/48", "49881"}, - {"2803:48e0::/47", "52468"}, - {"2001:559:82d7::/48", "33668"}, - {"2001:1ba0::/32", "5578"}, - {"2401:d280::/32", "133771"}, - {"2404:3d00:4132::/47", "21433"}, - {"2409:8904:8040::/39", "24547"}, - {"240a:a366::/32", "143520"}, - {"2a02:28e8::/32", "34347"}, - {"2600:4800::/41", "54004"}, - {"2a04:ac00::/48", "56534"}, - {"2001:468:f000::/48", "11164"}, - {"2804:5ef4::/32", "269067"}, - {"2806:2f0:1103::/42", "22884"}, - {"2a00:dc8::/32", "39637"}, - {"2a0d:c480::/29", "60721"}, - {"2001:579:50f8::/39", "22773"}, - {"2800:481::/32", "14080"}, - {"2804:1410::/32", "262360"}, - {"2001:44b8:30c8::/48", "4739"}, - {"2001:4818:2000::/36", "36030"}, - {"2606:a800::/32", "4922"}, - {"2800:5f0:3026::/47", "22724"}, - {"2806:2ea::/32", "139235"}, - {"2001:1960:200::/32", "5650"}, - {"2620:7e:3::/44", "22414"}, - {"2804:3a88::/32", "266094"}, - {"2804:414c::/32", "28204"}, - {"2a01:758::/48", "15785"}, - {"2a02:26f7:bb46::/47", "20940"}, - {"2a02:26f7:e1c1::/46", "20940"}, - {"2a11:8b80::/32", "13030"}, - {"2600:1406:43::/48", "35994"}, - {"2605:8d80:900::/34", "812"}, - {"2001:559:c20b::/48", "7922"}, - {"2001:67c:2444::/48", "43018"}, - {"2402:a900::/32", "9877"}, - {"2a0d:8580::/32", "204572"}, - {"2001:44b8:605d::/48", "4739"}, - {"2400:4ec0:8d01::/38", "64300"}, - {"2804:4020::/32", "265936"}, - {"2a02:54e0::/29", "50606"}, - {"2a0e:1106:fd::/46", "62142"}, - {"2c0f:f000:200::/37", "36891"}, - {"2001:da8:201::/48", "59201"}, - {"2001:dce:d454::/48", "38064"}, - {"2402:800:529b::/41", "7552"}, - {"240a:ae1c::/32", "146262"}, - {"2a10:2f00:15e::/48", "212227"}, - {"2600:6c21:805::/46", "20115"}, - {"2001:559:819e::/48", "22909"}, - {"2001:c20:c836::/44", "3758"}, - {"2001:dc7:cd01::/43", "24151"}, - {"2604:71c0::/32", "10423"}, - {"2a0b:1306:2::/48", "198018"}, - {"2001:cb0:2207::/35", "4637"}, - {"2602:fd7d:200::/37", "16925"}, - {"2800:bf0:3b42::/42", "27947"}, - {"2804:348:8000::/33", "28133"}, - {"2a0b:ed40::/31", "212547"}, - {"2a0c:6200::/29", "48655"}, - {"2a10:8441:113::/29", "50455"}, - {"2001:4998:68::/48", "5779"}, - {"2401:d800:f670::/40", "7552"}, - {"2a0c:cf00::/29", "205002"}, - {"2a0e:8f02:f010::/48", "212331"}, - {"2a10:2140::/29", "205843"}, - {"2a10:2f01:330::/44", "44024"}, - {"2001:850::/29", "8447"}, - {"2405:201:c800::/35", "55836"}, - {"240a:aae4::/32", "145438"}, - {"2607:f3d8::/32", "21513"}, - {"2803:dac0:201::/32", "265634"}, - {"2804:1368:f0d1::/36", "262808"}, - {"2804:8620::/32", "272623"}, - {"2001:559:c070::/48", "33652"}, - {"2408:8256:3176::/48", "17816"}, - {"240e:979:e00::/40", "134770"}, - {"2801:80:19c0::/48", "265101"}, - {"2804:b18:8009::/41", "52941"}, - {"2806:2f0:9dc1::/46", "17072"}, - {"2a02:13b0:1::/48", "48635"}, - {"2404:97c0::/32", "138814"}, - {"240a:a9d0::/32", "145162"}, - {"2600:1017:b4e0::/38", "6167"}, - {"2804:8a8::/32", "262385"}, - {"2804:7c7c::/39", "271499"}, - {"2a02:26f0:77::/48", "34164"}, - {"2a07:a343:f210::/44", "9009"}, - {"2a0b:2900:1000::/38", "48582"}, - {"2a11:8481::/32", "210852"}, - {"2001:559:7ec::/48", "33491"}, - {"240e:44d:a80::/41", "4134"}, - {"240e:67d:1800::/32", "4134"}, - {"2600:370f:7505::/44", "32261"}, - {"2620:125:9003::/48", "397415"}, - {"2806:34b::/32", "398013"}, - {"2a04:c41::/29", "61098"}, - {"2404:4e00:2000::/48", "32787"}, - {"2404:8000:31::/41", "17451"}, - {"240a:a67b::/32", "144309"}, - {"2605:e000:1b00::/40", "10838"}, - {"2606:8e80:800::/37", "32133"}, - {"2a02:26f7:e104::/48", "36183"}, - {"2a02:26f7:edc5::/42", "20940"}, - {"2a03:4d41:110::/38", "199610"}, - {"2001:559:86ad::/48", "7016"}, - {"2604:d600:111e::/42", "32098"}, - {"2804:15ec::/36", "28599"}, - {"2a02:26f1::/29", "20940"}, - {"2a0e:ec0::/29", "211147"}, - {"2001:559:84fe::/47", "33659"}, - {"2001:fd8:f230::/44", "4775"}, - {"2a00:1d36:c00::/40", "47331"}, - {"2a10:6800::/29", "399975"}, - {"2403:73c0::/32", "135244"}, - {"2408:8256:328c::/48", "17816"}, - {"240e:e:c800::/37", "137690"}, - {"2604:8f40::/32", "23423"}, - {"2806:335:100::/37", "265580"}, - {"2402:ab00:caff::/34", "24206"}, - {"2602:fca3:10::/48", "2165"}, - {"2607:fd80::/32", "14103"}, - {"240a:a034::/32", "142702"}, - {"240a:adf7::/32", "146225"}, - {"2804:6424::/32", "269409"}, - {"2001:df1:2000::/48", "9268"}, - {"240a:40a2:c000::/35", "58834"}, - {"240e:13::/37", "4134"}, - {"2800:590:1000::/34", "7004"}, - {"2803:bb40::/32", "52507"}, - {"2a02:26f0:fe01::/39", "20940"}, - {"2a0b:3380::/29", "28686"}, - {"2001:559:87e6::/48", "33491"}, - {"2001:da8:b009::/48", "23910"}, - {"2001:df7:ed00::/48", "138806"}, - {"2001:1248:59c3::/45", "11172"}, - {"2605:ca40:2::/48", "16158"}, - {"2607:1c80::/32", "18615"}, - {"2a02:4e0:2700::/41", "16135"}, - {"2a10:4646:14::/48", "212065"}, - {"2001:dce:5201::/40", "23869"}, - {"2001:df1:b200::/48", "135343"}, - {"2400:9380:9060::/47", "4809"}, - {"240e:44d:1d80::/41", "4134"}, - {"2804:3a44::/32", "266080"}, - {"2a02:d107:f001::/48", "200088"}, - {"2001:550:2602::/45", "174"}, - {"2001:43f8:1440::/48", "328578"}, - {"2401:e180::/32", "9674"}, - {"2407:4340::/32", "142014"}, - {"2409:8924:9f00::/34", "56046"}, - {"2409:8c20:5022::/45", "56046"}, - {"2604:d600:104d::/42", "32098"}, - {"2801:80:1970::/48", "265049"}, - {"2801:15a::/40", "267788"}, - {"2804:558::/32", "262509"}, - {"2001:559:b0::/47", "33491"}, - {"2401:4900:2580::/38", "45609"}, - {"2404:bf40:f000::/48", "7545"}, - {"2a02:990::/32", "25459"}, - {"2001:468:2810::/48", "396961"}, - {"2406:b2c0::/32", "40676"}, - {"240a:a43a::/32", "143732"}, - {"240a:a687::/32", "144321"}, - {"2600:370f:3585::/46", "32261"}, - {"2600:6c38:324::/43", "20115"}, - {"2620:12c:9020::/48", "395359"}, - {"2800:160:19ce::/43", "14259"}, - {"2a01:190:15f0::/29", "1764"}, - {"2a0d:5600:57::/44", "9009"}, - {"2001:559:8205::/48", "7922"}, - {"2001:559:c105::/48", "33659"}, - {"2409:8904:4760::/36", "24547"}, - {"2607:f408:10::/45", "19871"}, - {"2620:11a:a036::/44", "36040"}, - {"2a02:26f7:ba80::/48", "36183"}, - {"2001:67c:2e1c::/48", "6848"}, - {"240a:af76::/32", "146608"}, - {"2a02:26f7:cac8::/48", "36183"}, - {"2a0a:8ec0::/29", "48918"}, - {"2408:8656:c53::/35", "17622"}, - {"240a:a88f::/32", "144841"}, - {"2804:6768::/32", "269626"}, - {"2a02:26f7:e3c5::/46", "20940"}, - {"2a11:e487:1::/46", "212580"}, - {"2001:da8:8031::/48", "23910"}, - {"2001:fd8:b1f0::/44", "4775"}, - {"2607:c400::/33", "5555"}, - {"2804:74f4:8000::/33", "271014"}, - {"2a01:c50f:fa00::/37", "12479"}, - {"2001:559:c50e::/48", "7016"}, - {"2001:df5:af80::/48", "18229"}, - {"2403:d400::/32", "24364"}, - {"240e:109:8023::/48", "4134"}, - {"2804:3ef4::/32", "266631"}, - {"2804:4394::/32", "267577"}, - {"2a0b:5400:1::/48", "13030"}, - {"2a11:e680::/29", "60022"}, - {"2408:8459:9410::/42", "17623"}, - {"2803:12a0::/32", "266855"}, - {"2804:14d:7400::/40", "28573"}, - {"2a05:d050:20c0::/44", "16509"}, - {"2a0a:4a40::/34", "206754"}, - {"2a0d:5642:129::/48", "35487"}, - {"2001:cb8::/32", "7687"}, - {"2804:2d0::/32", "53230"}, - {"2804:4f8:c000::/36", "28263"}, - {"2a00:1978::/32", "12579"}, - {"2001:fd8:31b0::/44", "4775"}, - {"2408:8459:6a10::/42", "17623"}, - {"2607:fc58:1004::/48", "12055"}, - {"2804:4928::/32", "28161"}, - {"2a01:b740:16::/37", "714"}, - {"2a03:5400:100::/47", "6279"}, - {"240a:a320::/32", "143450"}, - {"240e:109:8047::/48", "131325"}, - {"240e:3b5:6400::/35", "140312"}, - {"2a07:eec0::/29", "201240"}, - {"2400:dcc0:a704::/36", "38631"}, - {"2409:8c28:6193::/36", "56041"}, - {"2600:140f:7801::/32", "20940"}, - {"2804:71e0::/32", "270817"}, - {"2a02:26f7:e5c5::/46", "20940"}, - {"2001:67c:28ac::/48", "25400"}, - {"2401:4900:4cc0::/44", "45609"}, - {"2409:8754:3c00::/39", "56040"}, - {"240e:947:3000::/33", "139887"}, - {"2600:1410:3001::/33", "20940"}, - {"2806:230:6030::/48", "265594"}, - {"2a02:e00:fff1::/44", "29141"}, - {"2c0f:fe38:2220::/41", "33771"}, - {"2001:559:c1f1::/48", "7015"}, - {"2408:8957:aa00::/40", "17622"}, - {"240e:108:1010::/48", "137698"}, - {"2a02:9010:75::/23", "3352"}, - {"2001:1540::/32", "47886"}, - {"2a0b:6b86:d13::/45", "212232"}, - {"2402:800:62dc::/39", "7552"}, - {"240e:438:9840::/38", "4134"}, - {"2607:f5e8::/32", "22926"}, - {"2804:117c:800d::/46", "262182"}, - {"2a00:5540:5014::/48", "198362"}, - {"2a02:7a0:908::/29", "12586"}, - {"2a02:2ad0:503::/43", "702"}, - {"2001:559:c072::/48", "33489"}, - {"2001:67c:1364::/48", "41289"}, - {"2001:4b20:100:570::/60", "65505"}, - {"2405:ba00:8800::/48", "63295"}, - {"2409:8904:4b60::/37", "24547"}, - {"240a:a10f::/32", "142921"}, - {"240e:b1:f800::/30", "4134"}, - {"2600:1000:f000::/44", "6167"}, - {"2001:559:3a1::/48", "33657"}, - {"2606:4700:4400::/44", "13335"}, - {"2620:12:2000::/48", "394756"}, - {"2804:8160::/32", "272450"}, - {"2c0e:2000::/29", "5713"}, - {"2400:7400:43::/45", "23736"}, - {"2402:800:92ee::/39", "7552"}, - {"2600:1415:13::/45", "20940"}, - {"2800:200:bd10::/42", "12252"}, - {"2804:4580:503::/38", "266931"}, - {"2804:4f80:c000::/46", "268330"}, - {"2804:5370::/32", "268584"}, - {"240a:a6e4::/32", "144414"}, - {"2600:370f:72a5::/46", "32261"}, - {"2602:fe8a::/36", "62663"}, - {"2610:a1:3018::/48", "12008"}, - {"2a02:7260::/29", "201898"}, - {"2a06:e881:7300::/47", "213151"}, - {"2a0f:9884::/32", "210625"}, - {"2001:250:205::/48", "24349"}, - {"2001:559:300::/48", "33659"}, - {"2001:559:72b::/48", "7922"}, - {"2001:559:c1b4::/48", "33668"}, - {"2600:381:200::/39", "20057"}, - {"2803:6604:6a00::/32", "28075"}, - {"2404:f4c0:fe10::/44", "139249"}, - {"240a:a855::/32", "144783"}, - {"2600:1800:16::/31", "16552"}, - {"2400:ca07:f020::/43", "23688"}, - {"2607:f740:e619::/45", "63911"}, - {"2a02:2698:5000::/38", "43478"}, - {"2a02:c6a0::/30", "680"}, - {"2a0a:3e00::/29", "64411"}, - {"2a0f:7c80::/29", "50113"}, - {"2001:16a2:8300::/34", "39386"}, - {"2405:7f00:81a0::/38", "133414"}, - {"240a:a914::/32", "144974"}, - {"2001:67c:7e4::/48", "57243"}, - {"2401:d800:bcb0::/41", "7552"}, - {"2600:100d:b170::/40", "22394"}, - {"2a02:26f7:ec05::/46", "20940"}, - {"2a03:b300::/32", "35399"}, - {"2a0f:e402::/32", "61218"}, - {"2c0f:fef8:11::/32", "15399"}, - {"2001:c20:4886::/48", "3758"}, - {"2001:df2:7900::/48", "6939"}, - {"2401:4900:55a0::/41", "45609"}, - {"2408:8256:3b6a::/48", "17623"}, - {"2804:14d:4400::/40", "28573"}, - {"2c0f:fec8:201::/35", "37197"}, - {"2001:579:5044::/40", "22773"}, - {"240a:afb3::/32", "146669"}, - {"2604:7a00:ffc0::/42", "11055"}, - {"2804:20e8::/32", "264520"}, - {"2a01:7e80:321::/32", "197990"}, - {"2a07:3d00::/29", "49088"}, - {"2001:559:c490::/46", "33287"}, - {"2001:67c:394::/48", "47698"}, - {"2001:da8:901e::/48", "24370"}, - {"240a:aa63::/32", "145309"}, - {"2600:1fa0:60a0::/44", "16509"}, - {"2604:8500::/32", "25769"}, - {"2605:89c0::/32", "16556"}, - {"2a01:94a0::/32", "8680"}, - {"2001:250:3433::/48", "138438"}, - {"2001:df0:5b40::/48", "140825"}, - {"2001:16a2:400a::/43", "25019"}, - {"2408:84f3:f610::/44", "17623"}, - {"2801:c4:10::/48", "28383"}, - {"2804:1464::/32", "52630"}, - {"2804:3dec::/32", "266563"}, - {"2400:cb00:a940::/47", "13335"}, - {"2400:da00:5ff1::/48", "58540"}, - {"2402:9e80:60::/48", "138351"}, - {"2803:a10::/32", "265822"}, - {"2803:37c0::/32", "265772"}, - {"2804:1030::/32", "53163"}, - {"2804:665c::/32", "269553"}, - {"2a01:3f1:3000::/38", "56908"}, - {"2a01:5042:e::/48", "202196"}, - {"2a02:6621::/32", "47723"}, - {"2a05:5ec0::/47", "201364"}, - {"2001:559:c346::/48", "33662"}, - {"2408:8456:1040::/38", "17816"}, - {"2602:fea7:f00::/40", "397270"}, - {"2620:26:c000::/47", "55243"}, - {"2a0f:9400:8018::/48", "213316"}, - {"2806:322:d00::/35", "28546"}, - {"2001:fb0:100e::/47", "37992"}, - {"2600:1415:c01::/35", "20940"}, - {"2606:cb80::/32", "394752"}, - {"2a03:dec0::/32", "48524"}, - {"2a0e:97c3:539::/48", "20473"}, - {"2001:dc7:ffc3::/45", "24151"}, - {"2401:4900:1aa0::/44", "45609"}, - {"2a00:7d20::/32", "44671"}, - {"2a03:b500::/40", "41135"}, - {"2a06:e881:5101::/46", "210090"}, - {"2001:3c8:c10c::/38", "4621"}, - {"2001:559:c272::/48", "7922"}, - {"2804:14c:5f88::/41", "28573"}, - {"2a06:e881:5402::/45", "209808"}, - {"2806:230:2017::/48", "11888"}, - {"2602:ff62:208::/45", "61317"}, - {"2804:37bc::/32", "266433"}, - {"2804:3ef0:e100::/47", "266630"}, - {"2001:559:842b::/48", "7015"}, - {"2001:67c:11cc::/48", "3301"}, - {"2001:67c:2910::/48", "3301"}, - {"2001:43f8:13c0::/48", "328522"}, - {"2001:44b8:2045::/48", "4739"}, - {"240e:838:50::/25", "4134"}, - {"2602:feb4:220::/44", "25961"}, - {"2a00:fbc0::/32", "29512"}, - {"2a01:8800::/29", "15693"}, - {"240e:108:13a0::/44", "4811"}, - {"2804:5158::/32", "268446"}, - {"2804:6eb4::/32", "270614"}, - {"2806:20d:1b04::/37", "32098"}, - {"2a02:26f7:f645::/46", "20940"}, - {"2a11:c780::/29", "210799"}, - {"2001:559:5b5::/48", "22909"}, - {"2001:49f0:a017::/44", "174"}, - {"2001:67c:2b8::/48", "51413"}, - {"2401:d800:bd0::/37", "7552"}, - {"2407:3100::/32", "10118"}, - {"2407:8780:2::/47", "135628"}, - {"240a:a1df::/32", "143129"}, - {"240a:a740::/32", "144506"}, - {"240e:44d:5600::/42", "140345"}, - {"240e:46c::/30", "4812"}, - {"2804:7bbc::/32", "271451"}, - {"2a10:d501::/32", "398464"}, - {"2001:559:c26c::/48", "33668"}, - {"240a:a4c9::/32", "143875"}, - {"2804:269c:fe41::/46", "47065"}, - {"2a10:cc42:1c00::/40", "20473"}, - {"2409:8c1f:5b80::/34", "9808"}, - {"2600:370f:31c3::/42", "32261"}, - {"2620:171:cc::/48", "42"}, - {"2800:320:8406::/48", "27882"}, - {"2804:1f04::/32", "53046"}, - {"2804:3828::/32", "266460"}, - {"2a06:cb00::/29", "203615"}, - {"2001:df0:99::/48", "45304"}, - {"2806:230:4011::/48", "11888"}, - {"2a06:45c1::/32", "200416"}, - {"2a0c:b641:24f::/48", "141694"}, - {"2405:d300:21::/40", "17477"}, - {"2600:140b:bc01::/33", "20940"}, - {"2804:348::/33", "28133"}, - {"2804:bd4::/32", "52836"}, - {"2804:3bf0:4001::/32", "266181"}, - {"2a0e:8f02:f001::/48", "213126"}, - {"2a0e:b107:13d6::/48", "211168"}, - {"2408:8957:b200::/40", "17622"}, - {"2607:f3f8:8000::/48", "19019"}, - {"2408:8656:3d00::/28", "17816"}, - {"2800:160:1b1f::/42", "14259"}, - {"2800:3c0:2130::/35", "19863"}, - {"2001:fd8:b0b0::/41", "4775"}, - {"2605:380:53::/44", "42473"}, - {"2804:44c:e001::/35", "262761"}, - {"2a00:1ca8:9c::/48", "58061"}, - {"2400:c700:381::/35", "55644"}, - {"240a:a424::/32", "143710"}, - {"2604:d600:ca1::/44", "32098"}, - {"2a02:26f7::/48", "36183"}, - {"2a10:5200::/29", "399975"}, - {"2803:4540::/32", "264658"}, - {"2a01:c50f:1bc0::/34", "12479"}, - {"2a02:26f7:c909::/42", "20940"}, - {"2001:df5:5d80::/48", "9930"}, - {"2401:d800:990::/42", "7552"}, - {"240a:a43f::/32", "143737"}, - {"2803:16a0:2::/48", "262206"}, - {"2a04:5d86::/31", "61310"}, - {"2a0c:e640::/47", "211876"}, - {"2a0f:ca00::/33", "43309"}, - {"240e:3bf:9c00::/34", "140310"}, - {"2605:b100:700::/41", "577"}, - {"2800:160:1bf3::/37", "14259"}, - {"2a01:a240::/32", "49984"}, - {"2409:8020:3035::/41", "56046"}, - {"2605:6440:100a::/34", "396356"}, - {"2804:960::/32", "263078"}, - {"2a0a:2c0::/48", "48648"}, - {"2001:df3:3080::/48", "137123"}, - {"2001:49f0:d09c::/46", "174"}, - {"2408:8256:3461::/40", "17623"}, - {"2408:8956:a500::/40", "17816"}, - {"240a:a435::/32", "143727"}, - {"2408:8957:7600::/40", "17622"}, - {"2600:6c10:608::/46", "20115"}, - {"2804:782c::/32", "271225"}, - {"2a02:26f7:b849::/46", "20940"}, - {"2a0a:e202:8000::/48", "33438"}, - {"2402:800:5739::/41", "7552"}, - {"240a:a702::/32", "144444"}, - {"2600:6c38:50a::/45", "20115"}, - {"2a01:b420::/44", "60162"}, - {"2a02:188:5108::/48", "35678"}, - {"2a04:3d80::/29", "50628"}, - {"2a05:4ac0::/32", "201453"}, - {"2001:4870:a24a::/48", "26402"}, - {"2401:3c00:100::/42", "38322"}, - {"2401:c680::/47", "133854"}, - {"2404:bf40:a580::/48", "2764"}, - {"2408:8647::/35", "140726"}, - {"2600:1000:be0e::/40", "22394"}, - {"2606:a100::/32", "394285"}, - {"2a02:a28::/32", "210958"}, - {"2407:a00::/32", "9268"}, - {"2806:203::/32", "13999"}, - {"2a00:c00:f033::/48", "24467"}, - {"2a02:26f7:d70a::/42", "20940"}, - {"2a02:6700::/32", "51695"}, - {"2001:67c:4e0::/48", "48550"}, - {"2001:dd8:5::/48", "55439"}, - {"2001:4410:2100::/35", "132040"}, - {"2401:4900:4040::/44", "45609"}, - {"2401:8f40:1::/48", "136950"}, - {"2404:4580::/47", "63526"}, - {"2600:6c20:806::/44", "20115"}, - {"2804:eec:4003::/32", "28226"}, - {"2a06:c480::/29", "203698"}, - {"2409:8b06::/28", "9808"}, - {"2803:ba80::/32", "262932"}, - {"2804:2050:7a8c::/32", "264485"}, - {"2001:559:c4c8::/47", "21508"}, - {"2606:b040:100::/43", "399726"}, - {"2a05:7600:2::/48", "203438"}, - {"2001:559:81a5::/48", "33652"}, - {"2400:7bc0:20::/43", "42962"}, - {"2401:d800:160::/40", "7552"}, - {"2402:800:562b::/41", "7552"}, - {"2607:7a00::/32", "26241"}, - {"2620:106:6000::/45", "3562"}, - {"2a06:7c00::/29", "50307"}, - {"2a0a:a540::/28", "8422"}, - {"2001:250:819::/46", "138182"}, - {"2407:e1c0:22::/41", "146872"}, - {"2804:6af4::/32", "270368"}, - {"2a03:8800::/48", "49687"}, - {"2001:400:b20::/48", "45"}, - {"2403:ad80:10::/48", "36351"}, - {"2404:9700::/32", "10023"}, - {"240a:a606::/32", "144192"}, - {"240e:1c6:c000::/34", "4812"}, - {"2804:5178::/32", "268454"}, - {"2a01:7d0::/32", "8612"}, - {"2a02:26f0:5::/44", "20940"}, - {"2a0d:f802::/32", "20278"}, - {"2a11:f040::/29", "204790"}, - {"2405:f600:1d::/46", "45117"}, - {"2409:8087:3010::/42", "9808"}, - {"2607:f0b0:8::/32", "13319"}, - {"2800:160:1a57::/42", "14259"}, - {"2a02:26f0:3001::/39", "20940"}, - {"2401:5a00:b000::/48", "10032"}, - {"2402:800:9aee::/43", "7552"}, - {"2408:8459:50c0::/38", "17816"}, - {"2804:1bc::/39", "10310"}, - {"2a00:8200::/32", "3292"}, - {"240a:a9f3::/32", "145197"}, - {"240e:44d:1680::/41", "4134"}, - {"2804:61c4::/32", "269255"}, - {"2a01:758:ffe1::/44", "3326"}, - {"2a02:ff0:1ef1::/44", "12735"}, - {"2a0b:b2c0:2::/48", "8892"}, - {"2402:4200:1200::/48", "24284"}, - {"2408:8957:5c00::/40", "17622"}, - {"2a09:8b00::/29", "38913"}, - {"240e:640:ee00::/40", "136197"}, - {"2001:da8:22d::/48", "24349"}, - {"240e:982:5300::/37", "149178"}, - {"2604:bc0:2::/48", "47869"}, - {"2a0a:6fc0::/29", "56864"}, - {"2a0f:6500::/34", "208183"}, - {"2001:250:5837::/48", "23910"}, - {"2001:559:c46f::/43", "7922"}, - {"2403:b300:ff01::/40", "16509"}, - {"2605:6c80:9::/48", "53340"}, - {"2804:60f0::/32", "269201"}, - {"2001:fd8:391::/42", "4775"}, - {"2400:aa00::/33", "9873"}, - {"2402:800:329b::/41", "7552"}, - {"240a:af40::/32", "146554"}, - {"2001:67c:11d8::/48", "200144"}, - {"2001:44b0::/32", "17940"}, - {"240a:ac4c::/32", "145798"}, - {"2001:67c:2f5c::/48", "21100"}, - {"2401:d800:250::/42", "7552"}, - {"240a:ac37::/32", "145777"}, - {"2607:6100:100a::/48", "23026"}, - {"2a0d:d8c0::/48", "395092"}, - {"2a0e:6400::/32", "209094"}, - {"2409:8a51:300::/37", "56047"}, - {"240a:a007::/32", "142657"}, - {"2602:fde8::/36", "398020"}, - {"2804:195c::/32", "61790"}, - {"2407:41c0::/32", "142015"}, - {"2409:8904:a940::/38", "24547"}, - {"2620:12f:c004::/48", "21581"}, - {"2806:2f0:9de3::/38", "17072"}, - {"2806:10a8::/32", "8151"}, - {"2a00:1908:fffc::/48", "205365"}, - {"2a02:2dc0::/32", "9063"}, - {"2a0e:46c4:2400::/46", "211579"}, - {"2001:43f8:d60::/48", "328162"}, - {"2405:9800:15::/41", "45430"}, - {"2406:2000:f01f::/36", "10310"}, - {"2604:7580::/32", "46873"}, - {"2a02:a00:100a::/42", "15987"}, - {"2a02:c840::/29", "8607"}, - {"2a0b:a880::/29", "42316"}, - {"2c0f:fe30::/32", "37006"}, - {"2403:4440::/32", "9367"}, - {"2404:f4c0:6660::/48", "7721"}, - {"2408:840c:5d00::/40", "17621"}, - {"2804:2484:8190::/36", "28258"}, - {"2a02:26f7:bcc0::/48", "36183"}, - {"2a0e:97c0:6ca::/45", "210013"}, - {"2407:e300::/31", "55536"}, - {"240a:a014::/32", "142670"}, - {"240e:fb:c000::/36", "140317"}, - {"2800:200:e2b1::/41", "12252"}, - {"2804:6d38::/32", "270518"}, - {"2a0f:4b41::/32", "29802"}, - {"2402:800:391d::/42", "7552"}, - {"2801:80:2a0::/48", "262534"}, - {"2401:d800:5300::/42", "7552"}, - {"2804:39e8:3e90::/32", "266058"}, - {"2804:5b5c::/32", "268837"}, - {"2a0c:9a40:1057::/48", "34927"}, - {"2403:ad80:20::/48", "36351"}, - {"2404:5740::/48", "395266"}, - {"2409:8924:500::/38", "56046"}, - {"2602:ff39:99::/36", "63318"}, - {"2600:2c00:7000::/36", "17378"}, - {"2602:808:5000::/44", "13578"}, - {"2804:3e84::/32", "266602"}, - {"2806:2f0:9963::/40", "17072"}, - {"2a0b:6b86:3ff::/48", "202562"}, - {"2001:4cb8:267::/37", "28878"}, - {"2607:6900::/32", "14818"}, - {"2001:8d8:100::/32", "8560"}, - {"2403:9800:c100::/40", "4771"}, - {"2405:9800:c600::/48", "45458"}, - {"2604:d600:67b::/40", "32098"}, - {"2806:2f0:3423::/41", "17072"}, - {"2400:8b00:100::/42", "45727"}, - {"2804:2a9c::/32", "264084"}, - {"2a06:8500::/29", "35684"}, - {"2a06:fa00::/29", "207395"}, - {"2001:df0:410::/48", "132228"}, - {"2602:feda:184::/48", "38308"}, - {"2a0f:9400:6228::/48", "48741"}, - {"2001:559:8198::/48", "20214"}, - {"2406:db00::/32", "59216"}, - {"240a:aaa2::/32", "145372"}, - {"2607:ca00::/33", "15290"}, - {"2001:559:835e::/48", "7922"}, - {"2400:9380:87c0::/44", "136167"}, - {"240a:a0d7::/32", "142865"}, - {"2620:138:300f::/48", "11251"}, - {"2804:4b2c::/32", "267288"}, - {"2a00:1880::/32", "15897"}, - {"2a02:21b2:b3ee::/48", "57370"}, - {"2403:ec00::/39", "17806"}, - {"2804:858::/32", "262365"}, - {"2804:76ec::/32", "271143"}, - {"2804:7fe8::/32", "271717"}, - {"2a0b:9040::/29", "9009"}, - {"240e:63:8000::/34", "140316"}, - {"240e:818::/26", "4134"}, - {"2600:141c:7::/48", "8151"}, - {"2803:e4e0::/32", "269890"}, - {"2a04:4e40:1800::/48", "54113"}, - {"2a0a:e5c0:1d::/48", "207996"}, - {"2402:800:7c80::/42", "7552"}, - {"2404:c800::/32", "4760"}, - {"2604:9b00:c04::/38", "14230"}, - {"2605:9d80:8011::/48", "4134"}, - {"2a07:7a80::/29", "206616"}, - {"240e:3b6:2200::/37", "136198"}, - {"2804:1330::/32", "263520"}, - {"2804:6c74::/32", "270469"}, - {"2a00:b000::/32", "48326"}, - {"2400:7700::/32", "56214"}, - {"2404:f4c0:fb00::/48", "139796"}, - {"2408:8459:ce50::/39", "17816"}, - {"2409:8057:3801::/45", "56040"}, - {"2620:95:4000::/45", "40138"}, - {"2a00:19c0::/32", "15922"}, - {"2a0f:6bc0::/29", "60404"}, - {"2001:559:c301::/48", "33491"}, - {"2406:6d40::/32", "141056"}, - {"240a:a6fa::/32", "144436"}, - {"2600:370f:40c8::/43", "32261"}, - {"2a10:c580::/29", "212041"}, - {"2001:da8:a01d::/48", "23910"}, - {"2804:7ab8::/32", "271388"}, - {"2a06:1700::/46", "200651"}, - {"2a0c:dd80:2000::/48", "52000"}, - {"2001:559:c2::/48", "33659"}, - {"2406:1400::/48", "24342"}, - {"240a:a23d::/32", "143223"}, - {"2620:128:7002::/47", "32030"}, - {"2804:37f0:e100::/36", "266445"}, - {"2804:6ae0::/32", "270363"}, - {"2a10:2f00:138::/48", "213105"}, - {"2401:d800:2690::/42", "7552"}, - {"2404:8d06:4000::/40", "133543"}, - {"2406:1d40::/32", "138259"}, - {"240a:a6df::/32", "144409"}, - {"2800:bf0:177::/48", "52257"}, - {"2a0f:e040:3::/48", "60781"}, - {"2001:19c0::/32", "36666"}, - {"2801:16:5000::/44", "266906"}, - {"2804:15b4::/32", "263405"}, - {"2a03:3ac0::/32", "57077"}, - {"2a0a:b640:1::/46", "9009"}, - {"2a0c:2100::/29", "208861"}, - {"2a0e:7a80::/29", "9009"}, - {"2a10:9d80::/29", "15447"}, - {"2406:3003:1060::/43", "55430"}, - {"2001:559:81f8::/48", "7015"}, - {"2001:da8:b5::/48", "24368"}, - {"2001:da8:dfff::/48", "24362"}, - {"2401:d800:7730::/41", "7552"}, - {"240a:a304::/32", "143422"}, - {"240a:a57c::/32", "144054"}, - {"240e:838::/44", "140647"}, - {"2800:440:104::/48", "27738"}, - {"2804:4044::/35", "265948"}, - {"2401:f2c0::/32", "63760"}, - {"2408:8806::/41", "4808"}, - {"2604:2d80:fc00::/48", "30036"}, - {"2605:a404:be9::/37", "33363"}, - {"2804:7bec::/32", "271463"}, - {"2a0c:e640:2::/45", "211876"}, - {"2803:3540::/32", "61519"}, - {"2804:4790::/32", "267062"}, - {"2a0e:c6c0::/32", "62075"}, - {"2001:df7:6680::/48", "146961"}, - {"2400:cb00:a6b0::/46", "13335"}, - {"240e:1d:1000::/34", "58461"}, - {"240e:44d:5500::/42", "140345"}, - {"2804:3b54::/32", "266142"}, - {"2a02:26f7:ec4c::/48", "36183"}, - {"2a02:e982:3::/43", "19551"}, - {"2a05:dfc7:47::/40", "61138"}, - {"240e:980:2700::/40", "133774"}, - {"2804:49ec::/32", "267209"}, - {"2804:4c20::/32", "267351"}, - {"2804:7c38::/32", "271482"}, - {"2806:2f0:5083::/42", "17072"}, - {"2001:df0:bc0::/48", "149013"}, - {"2400:8b00:e00::/42", "45727"}, - {"2402:800:63ab::/43", "7552"}, - {"2402:ee40:28::/41", "17754"}, - {"2406:2000:ef67::/48", "10229"}, - {"2610:b0:4120::/45", "3573"}, - {"2804:3bb8::/32", "266167"}, - {"2804:3bcc::/35", "266171"}, - {"2806:268:501::/48", "13999"}, - {"2a00:1fb8::/32", "29462"}, - {"2a02:26f7:c9c8::/48", "36183"}, - {"2a0e:ed80::/29", "6735"}, - {"240e:3b8:ac00::/35", "4134"}, - {"2a0e:b107:140::/45", "57883"}, - {"2001:df2:b780::/47", "140068"}, - {"2605:3380:43fe::/48", "12025"}, - {"2800:160:2583::/41", "14259"}, - {"2804:2dc:8000::/33", "28277"}, - {"2a0f:607:1051::/48", "131668"}, - {"2001:559:82d2::/48", "7725"}, - {"2001:559:c4dd::/48", "7015"}, - {"2409:8c54:1060::/37", "56040"}, - {"2607:fc48:450::/48", "40009"}, - {"2606:ab00::/47", "55106"}, - {"2a0a:ec02:ff00::/48", "42692"}, - {"2a0e:8f00:dfc0::/42", "213018"}, - {"2a10:7140::/29", "204007"}, - {"2405:a000:14::/32", "7693"}, - {"2409:8000:2000::/40", "56048"}, - {"2603:c0f8:1000::/43", "20054"}, - {"2605:4300:f001::/48", "22616"}, - {"2c0f:f4b0::/32", "328471"}, - {"2409:8730:f000::/31", "9808"}, - {"2620:149:108a::/43", "714"}, - {"2803:3110::/32", "271996"}, - {"2804:16d8:1a00::/40", "262729"}, - {"2a01:98c0::/48", "44882"}, - {"2600:370f:36a5::/46", "32261"}, - {"2607:f5d8:21::/32", "11096"}, - {"2804:5d10:c000::/34", "268948"}, - {"2c0f:ffd0::/32", "36968"}, - {"2001:559:8481::/48", "33491"}, - {"2402:e7c0:c00::/38", "134366"}, - {"2602:107:2810::/48", "20115"}, - {"2604:d600:1514::/46", "32098"}, - {"2606:c800::/32", "36012"}, - {"2607:f6f0:204::/48", "29884"}, - {"2001:ee0:c340::/37", "45899"}, - {"2407:d080::/32", "133120"}, - {"2605:d780::/32", "30162"}, - {"2804:5d4::/46", "262545"}, - {"2a01:c50e:fc00::/38", "12479"}, - {"2a02:f40::/32", "20960"}, - {"2a02:26f7:fb05::/46", "20940"}, - {"2a03:bf01::/32", "43529"}, - {"2001:df5:2d80::/48", "139727"}, - {"2001:1260::/47", "13591"}, - {"240a:a790::/32", "144586"}, - {"2605:3380:414d::/43", "12025"}, - {"2800:bf0:824a::/48", "27947"}, - {"2803:7760::/32", "269829"}, - {"2806:2f0:3081::/42", "17072"}, - {"2806:2f0:4463::/40", "17072"}, - {"2a01:8960::/32", "202136"}, - {"2001:590:3800::/46", "3257"}, - {"2001:67c:22a0::/48", "1764"}, - {"2001:df6:3600::/48", "132559"}, - {"2401:7500:1112::/36", "133296"}, - {"2405:6040::/32", "134021"}, - {"240a:aeeb::/32", "146469"}, - {"2a05:9a00::/45", "59441"}, - {"2001:559:1ef::/48", "33668"}, - {"2001:ee0:2820::/37", "45899"}, - {"2402:800:5a7f::/40", "7552"}, - {"2404:bf40:8682::/41", "139084"}, - {"2804:5b8::/32", "262535"}, - {"2a00:ad87:3b01::/46", "22216"}, - {"2a0b:f4c0:16c::/48", "205100"}, - {"2001:b08:15::/48", "3267"}, - {"2404:e6:810::/39", "703"}, - {"2603:90f5:c::/48", "20115"}, - {"2402:c800:ff7c::/40", "38639"}, - {"240a:abcf::/32", "145673"}, - {"2001:bf0:41::/32", "12732"}, - {"2001:c20:4000::/36", "3758"}, - {"2406:da70:e000::/40", "16509"}, - {"2408:8256:339a::/45", "17623"}, - {"2605:a40e:10::/37", "33363"}, - {"2a00:9100::/32", "196925"}, - {"2a06:1e00:60::/48", "60695"}, - {"2408:84f3:e000::/44", "17622"}, - {"2408:8660::/32", "4837"}, - {"2620:0:7f00::/48", "395262"}, - {"2804:548c::/32", "268657"}, - {"2a00:1728:1a::/47", "34224"}, - {"2a02:26f7:d15e::/47", "20940"}, - {"2a10:cc42:1191::/45", "20473"}, - {"2408:80f1:70::/44", "138421"}, - {"2408:883a:700::/40", "140716"}, - {"2600:6c20:e0f::/43", "20115"}, - {"2602:ff96:7::/48", "31863"}, - {"2604:8600::/34", "14453"}, - {"2605:a40::/32", "39944"}, - {"2806:20d:5a0e::/43", "32098"}, - {"2001:678:e4c::/48", "212622"}, - {"2400:4ec0:ff13::/44", "64300"}, - {"2401:ce80:1000::/46", "396417"}, - {"2620:12b::/48", "13993"}, - {"2803:41e0::/32", "269995"}, - {"2c0f:fb10::/48", "21003"}, - {"2001:df5:2a80::/47", "141371"}, - {"2001:44b8:30c0::/48", "7545"}, - {"2604:9d40:100::/44", "393290"}, - {"2a0e:17c0::/29", "59668"}, - {"2001:67c:7fc::/48", "201460"}, - {"2606:4700:91b0::/44", "13335"}, - {"2806:2f0:2460::/48", "17072"}, - {"2806:312::/32", "265562"}, - {"2a0a:4640::/44", "206177"}, - {"2408:8207:8510::/34", "4808"}, - {"2600:2000:600::/44", "33517"}, - {"2804:7528::/32", "271027"}, - {"2a05:1c40::/29", "203208"}, - {"2a09:b280:ffb0::/46", "210025"}, - {"2400:9380:9280::/46", "4809"}, - {"2406:9c80::/48", "45544"}, - {"2620:53:c000::/48", "62821"}, - {"2a0d:b980::/29", "56708"}, - {"2a11:de40::/29", "1239"}, - {"2402:800:b8f0::/39", "7552"}, - {"2605:3600:a::/48", "30452"}, - {"2804:e18::/32", "52544"}, - {"2804:6e64::/32", "270594"}, - {"2a02:26f7:f34d::/42", "20940"}, - {"2409:8914:9900::/40", "56044"}, - {"2600:1480:2000::/40", "33905"}, - {"2801:80:a80::/44", "11242"}, - {"2801:80:2260::/48", "267630"}, - {"2803:e140::/32", "264631"}, - {"2a02:26f7:ee85::/46", "20940"}, - {"2401:d800:5f50::/42", "7552"}, - {"2a01:8840::/46", "12041"}, - {"2a02:2e02:8910::/42", "12479"}, - {"2406:f00:7::/48", "24186"}, - {"2407:9880::/32", "23856"}, - {"240a:ac35::/32", "145775"}, - {"2a02:d8:800b::/45", "44654"}, - {"2001:4878:164::/48", "12222"}, - {"240e:983:1803::/48", "140329"}, - {"2801:80:210::/48", "52998"}, - {"2804:756c::/32", "271045"}, - {"2a00:1ec8::/42", "2854"}, - {"2a02:db8::/32", "48417"}, - {"2a03:b8c0:27::/48", "137922"}, - {"2a04:2f81::/47", "16509"}, - {"2001:678:2dc::/48", "786"}, - {"2804:204:216::/44", "28186"}, - {"2804:1e88::/32", "264434"}, - {"2a05:9b80::/29", "50083"}, - {"2c0f:eb80:4000::/34", "328029"}, - {"2001:559:15b::/48", "22909"}, - {"2602:fc5f::/36", "399772"}, - {"2800:484:9a00::/34", "10620"}, - {"2801:80:1210::/48", "264314"}, - {"2a00:1478::/32", "43190"}, - {"2a03:a320::/32", "203457"}, - {"2a06:e881:5380::/41", "209859"}, - {"2001:579:18cc::/39", "22773"}, - {"2a00:7ec0:2::/32", "8528"}, - {"2a02:26f7:b689::/46", "20940"}, - {"2a02:d107:e000::/47", "200088"}, - {"2a09:5303::/32", "50113"}, - {"2a0b:2d83::/32", "49542"}, - {"2402:2dc0::/32", "135607"}, - {"2403:300:a0b::/48", "714"}, - {"2804:dfc::/35", "263042"}, - {"2408:8656:2ef9::/45", "17816"}, - {"2804:1a04:8000::/33", "61832"}, - {"2a02:26f7:fc00::/48", "36183"}, - {"2600:1002:b100::/41", "6167"}, - {"2607:f6f0:2001::/48", "394749"}, - {"2803:9800:b8d0::/39", "11664"}, - {"2804:46d0::/32", "267013"}, - {"2a10:2ec7:3000::/36", "208861"}, - {"2603:c002:1510::/38", "31898"}, - {"2402:3a80:1ad8::/42", "38266"}, - {"2404:580::/32", "56268"}, - {"2406:840:f48f::/48", "142554"}, - {"240a:af00::/32", "146490"}, - {"2600:1407:4401::/38", "20940"}, - {"2800:160:1ddc::/42", "14259"}, - {"2804:3fd8:c001::/34", "265919"}, - {"2804:7b78::/32", "271434"}, - {"2a06:340::/29", "34942"}, - {"2001:1248:870d::/43", "11172"}, - {"240a:a5d1::/32", "144139"}, - {"2001:470:57::/48", "6939"}, - {"2401:21c0::/32", "59362"}, - {"2a05:7400:8000::/34", "208221"}, - {"2a06:8200::/32", "208355"}, - {"2a10:fa80:216::/48", "57050"}, - {"2a05:c1c0::/29", "31662"}, - {"2001:559:c2d2::/47", "7922"}, - {"2409:8915:7600::/39", "56044"}, - {"2804:572c::/32", "268049"}, - {"2804:858c::/33", "272586"}, - {"2806:10a8:cbff:100::/34", "8151"}, - {"2a06:9ac0::/32", "209242"}, - {"2a07:3505:80::/44", "31477"}, - {"2a07:3e00::/29", "559"}, - {"2401:1740:2000::/48", "7586"}, - {"240a:a45a::/32", "143764"}, - {"2803:a920::/32", "266668"}, - {"2a0e:97c3:6e0::/48", "20473"}, - {"2001:1a80::/29", "20676"}, - {"2600:6000:fd53::/48", "11351"}, - {"2804:7e14::/32", "271601"}, - {"2a02:26f7:11e::/48", "36183"}, - {"2408:8256:356e::/48", "17623"}, - {"240a:ad1d::/32", "146007"}, - {"240e:13:80b::/48", "140863"}, - {"2402:8100:2110::/44", "45271"}, - {"2403:9800:6600::/36", "4771"}, - {"2405:201:aa00::/37", "55836"}, - {"2405:6e00:f812::/47", "133612"}, - {"240e:982:5000::/40", "140527"}, - {"2804:41d8::/32", "267460"}, - {"2a03:2380::/45", "198818"}, - {"2001:da8:a1::/48", "24358"}, - {"2600:140f:c::/48", "20940"}, - {"2a00:1728:4::/44", "34224"}, - {"2a09:adc0::/47", "64466"}, - {"2001:4b22:12::/64", "65505"}, - {"2405:da00:2::/43", "38235"}, - {"240a:aeb4::/32", "146414"}, - {"2605:3380:3000::/36", "62947"}, - {"2800:bf0:40::/43", "27947"}, - {"2a00:a200::/32", "5520"}, - {"2a0d:6e80::/29", "204562"}, - {"2a0e:68c0::/48", "34907"}, - {"2001:4478::/35", "4802"}, - {"2402:7800:3003::/32", "4826"}, - {"2408:8459:8e30::/41", "17622"}, - {"240a:aeec::/32", "146470"}, - {"2001:559:8035::/46", "7922"}, - {"2407:0:0:3d::/64", "36040"}, - {"2600:370f:7503::/45", "32261"}, - {"2600:6c20:893::/38", "20115"}, - {"2600:6c38:501::/45", "20115"}, - {"2604:ca00:216::/48", "36492"}, - {"2606:e480:4800::/32", "55083"}, - {"2804:6724::/32", "269606"}, - {"2a0b:4341:b02::/48", "57695"}, - {"2a0d:7140::/29", "208861"}, - {"2a0d:fec0:98::/47", "47481"}, - {"2001:678:184::/48", "34953"}, - {"2a0a:f980::/29", "50877"}, - {"2001:559:2c9::/48", "7015"}, - {"2001:559:42e::/48", "33287"}, - {"2001:c20:c842::/48", "9255"}, - {"2001:df7:bb00::/48", "138051"}, - {"2406:840:20::/48", "139317"}, - {"2406:2000:1a4::/46", "24506"}, - {"2600:140f:dc00::/48", "55836"}, - {"2a02:1658::/32", "12290"}, - {"2602:fd9a:b::/36", "54613"}, - {"2605:5fc9::/29", "1239"}, - {"2a0c:2f06::/32", "207080"}, - {"2001:760::/32", "137"}, - {"2602:fff9:fff::/48", "54839"}, - {"2800:bf0:8048::/43", "27947"}, - {"2a04:5b81:2050::/44", "202265"}, - {"2406:daa0:8080::/44", "16509"}, - {"2804:d0c:8080::/33", "53112"}, - {"2a02:26f7:ef51::/42", "20940"}, - {"2a02:4540:5000::/43", "197207"}, - {"2001:4878:a261::/48", "12222"}, - {"2620:111:b000::/48", "22517"}, - {"2804:1d6c::/32", "262521"}, - {"2804:4074::/32", "265960"}, - {"2001:559:82ec::/48", "33659"}, - {"2001:67c:6c8::/48", "31229"}, - {"2401:4900:3a60::/40", "45609"}, - {"240e:3b2:6400::/35", "140312"}, - {"2607:f2b1:f080::/44", "1294"}, - {"2803:5200:1000::/36", "28319"}, - {"2806:2f0:51a3::/38", "17072"}, - {"2a02:26f7:ca0c::/48", "36183"}, - {"2a06:d640::/48", "56601"}, - {"2a0d:27c0::/29", "197706"}, - {"2404:c2c0:8000::/36", "135629"}, - {"2409:8924:9d00::/38", "56046"}, - {"2620:fd:8000::/48", "7922"}, - {"2001:470:a4::/48", "395681"}, - {"2001:559:c269::/48", "13367"}, - {"2001:4490:3600::/42", "9829"}, - {"2400:b000:100::/48", "23862"}, - {"2402:800:339b::/41", "7552"}, - {"2405:b900:1000::/48", "55701"}, - {"2804:58cc::/32", "268150"}, - {"2a03:ba40::/32", "39280"}, - {"2a04:92c7:b::/45", "62240"}, - {"2407:5200:402::/33", "55915"}, - {"2408:8459:7630::/41", "17622"}, - {"2408:8957:4f00::/40", "17816"}, - {"240e:96b:6000::/46", "140364"}, - {"2600:370f:36e8::/39", "32261"}, - {"2620:13f:3019::/40", "46842"}, - {"2804:294::/33", "28604"}, - {"2804:4564::/32", "266923"}, - {"2a07:e340::/32", "9009"}, - {"2a11:1980::/29", "204790"}, - {"2001:678:618::/48", "206006"}, - {"2620:1bc:1027::/44", "7726"}, - {"2804:4d90::/32", "268205"}, - {"2c0f:f3c8:21::/32", "328112"}, - {"2001:550:3405::/40", "174"}, - {"2001:da8:e821::/48", "138373"}, - {"2a02:ca80::/29", "49515"}, - {"2a0e:b107:960::/44", "207427"}, - {"2001:400:6410::/48", "43"}, - {"240e:44d:2200::/42", "140345"}, - {"2605:3380:4171::/44", "12025"}, - {"2403:3440::/36", "4787"}, - {"240a:acab::/32", "145893"}, - {"2a02:26f0:9701::/36", "20940"}, - {"2a02:26f7:fa01::/46", "20940"}, - {"2001:e60:8778::/40", "4766"}, - {"240a:a036::/32", "142704"}, - {"2610:a1:305c::/48", "12008"}, - {"2a0b:f940::/35", "205373"}, - {"2a0c:4100::/29", "204823"}, - {"2406:e000:c05::/43", "23655"}, - {"2407:34c0::/48", "140788"}, - {"2600:1406:3401::/38", "20940"}, - {"2800:800:580::/43", "26611"}, - {"2804:1b0:1a00::/41", "10429"}, - {"2804:2968::/32", "264013"}, - {"2a00:1ff8::/32", "47138"}, - {"2a00:8960::/48", "62082"}, - {"2a01:b8c0::/32", "198869"}, - {"2a02:618::/45", "20485"}, - {"2001:13d2:813::/45", "7303"}, - {"2408:84e1::/39", "4808"}, - {"2607:f928:6::/43", "22645"}, - {"2620:115:7000::/47", "55091"}, - {"2804:1b38::/32", "61716"}, - {"2804:6494::/32", "269436"}, - {"2a0f:c540::/29", "42487"}, - {"2a11:33c0::/29", "211199"}, - {"2001:550:a902::/45", "174"}, - {"2001:559:1e8::/48", "33659"}, - {"2a0c:1d03::/32", "39614"}, - {"2610:a0:17::/42", "7786"}, - {"2804:3480::/32", "265462"}, - {"2001:678:254::/48", "47251"}, - {"2400:6400::/32", "38201"}, - {"2602:fcac::/40", "400260"}, - {"2804:1130::/32", "263664"}, - {"2a09:5080:2::/47", "42652"}, - {"2a11:a480::/29", "204790"}, - {"2001:fd0:405::/35", "10029"}, - {"240a:aeae::/32", "146408"}, - {"240a:af12::/32", "146508"}, - {"2600:9000:1180::/48", "16509"}, - {"2803:ba40::/46", "263756"}, - {"2804:32f0::/32", "265106"}, - {"2001:4888:1c::/32", "6167"}, - {"2804:14c:a985::/44", "28573"}, - {"2804:4bcc::/32", "267330"}, - {"2600:370f:3425::/44", "32261"}, - {"2804:14c:9bfa::/45", "28573"}, - {"2a0a:100::/29", "40970"}, - {"2404:d940:f000::/36", "134877"}, - {"2407:d000::/32", "23674"}, - {"2408:8459:ca50::/39", "17816"}, - {"2606:2800:5042::/48", "15133"}, - {"2804:550c:a000::/35", "268686"}, - {"2804:66d0::/32", "269584"}, - {"2c0e:0:402::/39", "24863"}, - {"2409:8907:6d20::/38", "24547"}, - {"2600:1417:72::/47", "20940"}, - {"2610:a1:3030::/48", "12008"}, - {"2804:d64::/32", "52617"}, - {"2804:6390::/36", "269369"}, - {"2001:1800::/32", "10381"}, - {"240a:ad27::/32", "146017"}, - {"2804:1f26:cafe::/48", "265020"}, - {"2a01:cd01:1f2c::/43", "28708"}, - {"2a02:26f7:47::/48", "20940"}, - {"2401:d800:d152::/40", "7552"}, - {"2604:1b40::/32", "396006"}, - {"2606:6680:409::/48", "40676"}, - {"2804:4248:8001::/35", "267490"}, - {"2a0d:8980::/29", "42237"}, - {"2001:559:c028::/47", "33491"}, - {"2804:7bd0::/32", "271456"}, - {"2a02:e40::/32", "6700"}, - {"2a02:26f7:ebcd::/42", "20940"}, - {"2404:2480:6501::/32", "135391"}, - {"2600:6c38:d19::/45", "20115"}, - {"2401:4900:18e0::/44", "45609"}, - {"2604:980:7006::/32", "21859"}, - {"2001:bf7:1350::/44", "213106"}, - {"2001:df0:2c1::/48", "58624"}, - {"2001:df4:6b00::/48", "136493"}, - {"240a:a05e::/32", "142744"}, - {"240e:980:2800::/40", "133775"}, - {"2600:6c10:ff8f::/43", "20115"}, - {"2803:9800:b0d4::/42", "11664"}, - {"2804:76cc::/35", "271135"}, - {"2804:8484::/32", "272265"}, - {"2001:16d8:55::/46", "16150"}, - {"2404:bf40:c043::/40", "139084"}, - {"2804:2b8::/32", "28130"}, - {"2001:44b8:30f3::/44", "7545"}, - {"2604:7a40:3000::/32", "394710"}, - {"2804:bf8:5000::/32", "52653"}, - {"2001:df6:e100::/48", "138359"}, - {"2001:18c8:900::/32", "8015"}, - {"2600:1408:6000::/48", "35994"}, - {"2804:816c::/32", "272453"}, - {"2a03:b8c0:19::/48", "396253"}, - {"2a09:7d80::/29", "16245"}, - {"2a0c:6880::/32", "204796"}, - {"2a0d:7980:2::/39", "48635"}, - {"2a0e:b107:934::/48", "204446"}, - {"2001:4818:1000::/36", "36031"}, - {"2405:f600:70::/40", "45117"}, - {"2804:58fc::/33", "268162"}, - {"2804:5a34::/38", "268755"}, - {"2a05:b680:10::/48", "44682"}, - {"2001:250:c1d::/48", "23910"}, - {"2a00:b280::/32", "15557"}, - {"2a01:5b0:9::/48", "50611"}, - {"2001:559:80bc::/47", "7015"}, - {"2804:93c:c1::/35", "52878"}, - {"2a02:2e02:1c20::/41", "12479"}, - {"2600:1010:d120::/41", "6167"}, - {"2804:20bc::/32", "264511"}, - {"2804:4a98:f000::/36", "267251"}, - {"2a02:26f7:cb05::/46", "20940"}, - {"2a0e:fb45::/32", "62240"}, - {"2400:a980:6100::/37", "133111"}, - {"2401:d800:d540::/42", "7552"}, - {"2408:8256:2d6d::/43", "17623"}, - {"2001:43f8:360::/48", "328206"}, - {"2401:b80:4000::/32", "133334"}, - {"2a0b:6640::/32", "213158"}, - {"2a0b:8700::/29", "61317"}, - {"2407:6400::/32", "9484"}, - {"2620:13f:3018::/48", "27538"}, - {"2001:559:31a::/48", "33660"}, - {"2001:43f8:1d0::/48", "37288"}, - {"2001:44b8:4049::/48", "4739"}, - {"2403:c00:f00::/45", "17488"}, - {"240a:aca2::/32", "145884"}, - {"2a01:1e8::/32", "33843"}, - {"2a0a:f200::/29", "208861"}, - {"2001:559:8201::/48", "21508"}, - {"2001:fd8:f080::/42", "132199"}, - {"2406:8100::/35", "24182"}, - {"240a:a5da::/32", "144148"}, - {"2620:171:43::/45", "715"}, - {"2804:14d:bac1::/43", "28573"}, - {"2804:6a68::/32", "270334"}, - {"2a0b:880:7::/36", "210834"}, - {"2001:df6:2180::/48", "135738"}, - {"2606:5480:2000::/36", "395309"}, - {"2804:3098::/32", "264963"}, - {"2a02:f401::/30", "206283"}, - {"2a0f:301::/30", "398559"}, - {"2001:559:2aa::/47", "7922"}, - {"240a:a625::/32", "144223"}, - {"2602:fc5d:100::/47", "399866"}, - {"2620:131:104e::/43", "26450"}, - {"2a02:26f7:2f::/48", "20940"}, - {"2409:806a:3100::/36", "9808"}, - {"2001:559:17f::/48", "7922"}, - {"240a:a735::/32", "144495"}, - {"2602:107:2e10::/48", "20115"}, - {"2606:2800:4a2c::/46", "15133"}, - {"2804:70ec::/32", "270756"}, - {"240e:67a:8c00::/33", "4134"}, - {"2607:9480:f000::/44", "14338"}, - {"2a00:b703:fff1::/46", "210352"}, - {"2001:678:e88::/48", "212548"}, - {"2402:f740:1000::/36", "131477"}, - {"2606:4700:310c::/48", "13335"}, - {"2607:f6f0:3001::/48", "394749"}, - {"240a:a744::/32", "144510"}, - {"2607:f8c8::/32", "23308"}, - {"2620:fe:2040::/48", "174"}, - {"2804:1b04:6::/44", "53048"}, - {"2a02:b78::/32", "6894"}, - {"2a02:26f7:d641::/46", "20940"}, - {"2001:559:868b::/48", "33665"}, - {"2001:8b0:0:70::/47", "20712"}, - {"240a:a8e9::/32", "144931"}, - {"2602:107:e400::/40", "12271"}, - {"2a04:5200:68::/48", "200740"}, - {"2a11:3000::/29", "204790"}, - {"2001:43f8:100::/48", "6968"}, - {"2800:1a0::/32", "27933"}, - {"2a0b:91c0::/29", "203489"}, - {"2600:6c38:d06::/43", "20115"}, - {"2606:b400:8830::/46", "7160"}, - {"2620:0:8a0::/48", "3495"}, - {"2a0b:9480::/29", "50308"}, - {"2a0d:9cc0::/29", "57782"}, - {"2c0f:2b00::/32", "328984"}, - {"2001:678:e74::/48", "196994"}, - {"2001:dd8:25::/48", "45494"}, - {"2400:3ca0::/40", "136373"}, - {"2405:ed00::/32", "10000"}, - {"2a02:e30:f0a0::/48", "60755"}, - {"2a05:c700::/32", "24989"}, - {"2a0e:aa06:100::/48", "138631"}, - {"240c:ca47::/32", "24363"}, - {"2a02:26f7:d541::/45", "20940"}, - {"2a09:4bc7:d020::/47", "140096"}, - {"2a0a:1c80::/29", "44407"}, - {"2001:67c:220::/48", "43911"}, - {"2605:a404:c4::/46", "33363"}, - {"2602:febb::/39", "394989"}, - {"2800:ba0:24a::/48", "263812"}, - {"2402:2700:8000::/33", "132618"}, - {"240e:6bb:2000::/36", "140316"}, - {"2605:45c0::/35", "62217"}, - {"2a07:e345::/46", "211588"}, - {"2001:559:86ef::/43", "7922"}, - {"2001:67c:22bc::/48", "34086"}, - {"2400:4480::/47", "17426"}, - {"2403:e040:8000::/33", "16509"}, - {"2404:c680::/32", "135330"}, - {"2606:4700:9760::/44", "13335"}, - {"2804:6060:c000::/34", "269163"}, - {"2a0a:85c0::/29", "35189"}, - {"2a0d:5a00::/29", "3175"}, - {"2001:559:85ca::/48", "33650"}, - {"240a:aede::/32", "146456"}, - {"240e:146:c000::/34", "4812"}, - {"240e:45c:7700::/40", "140532"}, - {"2600:1404:c000::/48", "35994"}, - {"2600:1409:b001::/36", "20940"}, - {"2620:a8:c000::/48", "32425"}, - {"2804:1354:facf::/37", "52892"}, - {"2a09:bac0:196::/47", "13335"}, - {"2401:d800:3000::/33", "7552"}, - {"2a05:d03a:2000::/40", "16509"}, - {"2001:559:855f::/48", "20214"}, - {"240a:a142::/32", "142972"}, - {"2602:fe54:12::/42", "16584"}, - {"2607:e880:8221::/48", "12220"}, - {"2804:300:2001::/48", "53237"}, - {"2a02:2e02:8500::/42", "12479"}, - {"2c0f:f590::/54", "36974"}, - {"2001:4998:1c1::/32", "10310"}, - {"2405:1c0:6741::/46", "55303"}, - {"2001:978:1d00:2::/47", "174"}, - {"2001:1900:2383::/45", "10753"}, - {"2400:fb00::/32", "55670"}, - {"2600:1406:8c01::/38", "20940"}, - {"2a00:a7a0:ffff::/48", "60212"}, - {"2a01:c50f:b400::/39", "12479"}, - {"2a11:6d40::/29", "204790"}, - {"2001:1248:97cc::/42", "11172"}, - {"2001:18e8:c02::/47", "10680"}, - {"2405:201:8800::/35", "55836"}, - {"2600:1005:9000::/44", "6167"}, - {"2804:442c::/32", "267607"}, - {"2001:678:1d8::/48", "8339"}, - {"2401:4900:3c70::/40", "45609"}, - {"2407:5200:4924::/32", "55915"}, - {"2600:370f:36a8::/41", "32261"}, - {"2607:f078::/32", "18750"}, - {"2806:230:400f::/48", "11888"}, - {"2a00:f46::/44", "43447"}, - {"2a02:ee80:4083::/45", "3573"}, - {"2a0a:54c1:15::/42", "62240"}, - {"240a:a642::/32", "144252"}, - {"2620:149:ac3::/42", "714"}, - {"2804:6bec::/32", "270434"}, - {"2001:250:2e01::/39", "23910"}, - {"2001:559:b8::/47", "33657"}, - {"2405:bc0::/32", "136842"}, - {"240e:980:4f00::/34", "4134"}, - {"2620:128:e040::/48", "22317"}, - {"2804:5580::/32", "267938"}, - {"2a0a:e5c0:19::/48", "213081"}, - {"2a0d:6140::/29", "8823"}, - {"2001:559:87cd::/46", "33654"}, - {"2600:1014:f010::/40", "22394"}, - {"240e:3bc:c800::/37", "4134"}, - {"2620:135:7003::/48", "3257"}, - {"2804:5540::/32", "268427"}, - {"2408:8459:6a30::/41", "17622"}, - {"2600:1003:a100::/44", "6167"}, - {"2a00:1a68::/32", "38955"}, - {"2401:d800:9260::/40", "7552"}, - {"2804:145c:fe00::/39", "263327"}, - {"2001:678:c18::/48", "207487"}, - {"2408:8957:a800::/40", "17622"}, - {"240e:5e:10c0::/44", "140319"}, - {"2a00:1e68::/39", "42861"}, - {"2a02:26f7:f849::/46", "20940"}, - {"240e:87c:600::/42", "137692"}, - {"2600:100d:9000::/44", "6167"}, - {"2a0c:b641:771::/48", "207299"}, - {"2001:67c:1174::/48", "12552"}, - {"2001:67c:18a4::/48", "56881"}, - {"2001:48c8:8::/43", "29791"}, - {"2404:11c0::/32", "134806"}, - {"2404:3100:1::/48", "45669"}, - {"2803:8180:2::/32", "263237"}, - {"2a00:eaa0::/32", "59842"}, - {"2403:8000:11::/32", "4796"}, - {"2803:3f60::/32", "264744"}, - {"2804:57f4:801::/32", "268097"}, - {"2a02:26f7:f544::/48", "36183"}, - {"2001:559:c1f0::/48", "33657"}, - {"2402:800:b440::/39", "7552"}, - {"240a:aef3::/32", "146477"}, - {"240e:108:1160::/48", "58563"}, - {"2600:1407:6800::/48", "35994"}, - {"2600:6c10:f288::/39", "20115"}, - {"2800:bf0:a807::/44", "52257"}, - {"2804:3b04::/32", "266124"}, - {"2804:50a8::/32", "268402"}, - {"2a06:2900:125::/48", "39063"}, - {"2001:559:75::/48", "7015"}, - {"2001:df0:6480::/48", "63752"}, - {"2408:8256:3272::/48", "17816"}, - {"2604:880:39::/48", "29802"}, - {"2804:82c0::/32", "272538"}, - {"2a00:4802:2810::/39", "8717"}, - {"2a00:8a01::/44", "10455"}, - {"2a04:e00:207::/48", "39855"}, - {"2a05:d80::/29", "51257"}, - {"2001:67c:1210::/48", "45029"}, - {"2001:43f8:13b0::/48", "328501"}, - {"2400:8500:d37d::/48", "7506"}, - {"2803:ae80::/32", "263197"}, - {"2804:11dc:5000::/32", "263444"}, - {"2804:21e4::/32", "264580"}, - {"2a03:9e41::/32", "32611"}, - {"2a0f:3786::/40", "64475"}, - {"2001:4930::/34", "6263"}, - {"2408:8459:3e10::/42", "17623"}, - {"2408:8957:6e00::/40", "17622"}, - {"2600:1406:ec00::/48", "35994"}, - {"2800:e00:7000::/31", "27665"}, - {"2804:138b:c100::/34", "53037"}, - {"2804:3dc0:b000::/33", "266551"}, - {"2a0a:ec02:101::/48", "42692"}, - {"2a11:4e80::/29", "211344"}, - {"2001:67c:1508::/48", "47692"}, - {"2800:bf0:8107::/44", "52257"}, - {"2001:500:134::/48", "396566"}, - {"2001:559:8707::/48", "33287"}, - {"2406:ef80:100::/40", "63473"}, - {"2409:8052:3002::/40", "56047"}, - {"2409:8a53:100::/38", "56047"}, - {"240e:3b4:9200::/36", "140317"}, - {"2600:370f:340e::/42", "32261"}, - {"2607:f710:47::/48", "19624"}, - {"2804:6298::/32", "269306"}, - {"2a02:e0:5000::/32", "34984"}, - {"2a02:4e0:10::/48", "16135"}, - {"2402:3a80:1452::/44", "38266"}, - {"240e:3b9:f100::/37", "134775"}, - {"2602:107:50d::/48", "11351"}, - {"2604:9d40:1e0::/44", "393290"}, - {"2607:fb08:8001::/33", "32703"}, - {"2804:529c::/40", "268529"}, - {"2a02:26f7:fac4::/48", "36183"}, - {"2001:559:c14f::/48", "7922"}, - {"2406:f00:4::/48", "23770"}, - {"2409:807c:900::/35", "9808"}, - {"240e:108:80::/48", "23724"}, - {"2800:200:b9f0::/37", "12252"}, - {"240e:45c:a700::/40", "140535"}, - {"2600:6c21:224::/43", "20115"}, - {"2001:44b8:2052::/48", "7545"}, - {"2403:6d00:2000::/32", "56094"}, - {"2604:b180:20::/44", "32776"}, - {"2804:3b6c:c008::/46", "266148"}, - {"2602:fed2:7309::/48", "20473"}, - {"2605:5c0:10::/44", "26517"}, - {"2804:19e8::/32", "61826"}, - {"2804:23c8::/32", "264182"}, - {"2a00:fa0::/32", "13237"}, - {"2a01:53c0:ffd2::/48", "36408"}, - {"2a0d:2940::/29", "206028"}, - {"2c0f:fc90::/35", "16284"}, - {"2404:4a00:1:1::/48", "45629"}, - {"2804:648::/32", "53038"}, - {"2804:7c28::/32", "271479"}, - {"2a0b:cd00::/29", "206372"}, - {"2400:6280::/47", "132876"}, - {"2408:8456:8800::/42", "17622"}, - {"2804:7e90:fc00::/38", "271632"}, - {"2405:f600::/44", "45117"}, - {"2603:f600::/29", "40676"}, - {"2607:f110:e470::/39", "21889"}, - {"2a05:e140::/29", "6735"}, - {"2a0c:52c0::/29", "203973"}, - {"240a:a8f6::/32", "144944"}, - {"240a:ad43::/32", "146045"}, - {"2804:640:80::/44", "262713"}, - {"2a06:d900::/29", "208861"}, - {"2001:559:c2f4::/48", "7015"}, - {"2400:8700::/39", "55394"}, - {"2401:d800:5710::/42", "7552"}, - {"2406:2000:a0::/48", "24376"}, - {"2409:8008:3100::/36", "24547"}, - {"2603:c0f8:2800::/43", "20054"}, - {"2a01:358:401a::/47", "9121"}, - {"2a03:2880:f11a::/45", "32934"}, - {"2a03:44a0:300::/48", "200521"}, - {"2001:559:83d0::/48", "33652"}, - {"2402:800:3bd3::/44", "7552"}, - {"2804:2484:80a0::/39", "28258"}, - {"2804:617c::/32", "269237"}, - {"2a0f:9400:7395::/46", "210815"}, - {"2001:ac0:30fe::/32", "8903"}, - {"2001:16f0::/32", "49220"}, - {"2600:1410:1001::/34", "20940"}, - {"2605:1900:8380::/37", "12208"}, - {"2a02:88d:8020::/44", "48695"}, - {"2a02:26f7:b642::/47", "20940"}, - {"2a03:6947:1b00::/40", "61266"}, - {"2a0c:5247:1000::/36", "59504"}, - {"2001:67c:21a8::/48", "51421"}, - {"2607:fb10:50a4::/41", "2906"}, - {"2804:5ebc::/32", "269053"}, - {"2a02:26f7:e904::/48", "36183"}, - {"2001:579:c800::/39", "22773"}, - {"2001:df4:5d00::/48", "58820"}, - {"2600:1488:c241::/26", "20940"}, - {"2600:6c7f:9330::/41", "40294"}, - {"2801:1a:2800::/48", "269977"}, - {"2001:67c:2a7c::/48", "15598"}, - {"2408:8001:e800::/37", "10206"}, - {"2602:feda:2a7::/44", "204185"}, - {"2607:f110:a2::/39", "21889"}, - {"2a02:26f7:ca05::/46", "20940"}, - {"2001:44b8:4060::/48", "7545"}, - {"2801:154:10::/42", "266669"}, - {"2803:50c0:1::/48", "264763"}, - {"2804:40e8::/32", "265990"}, - {"2a06:8640::/29", "55081"}, - {"2001:ac0:c800::/44", "12541"}, - {"2409:8a56:2200::/37", "9808"}, - {"2600:6c38:de::/42", "20115"}, - {"2620:49:f::/48", "16686"}, - {"2a04:5c85:2000::/36", "47936"}, - {"2602:ff96:5::/48", "40676"}, - {"2001:678:2cc::/48", "16509"}, - {"2001:67c:20fc::/48", "210564"}, - {"2400:adc0:4030::/47", "9541"}, - {"2600:9000:20b5::/41", "16509"}, - {"2604:2e8b:b400::/33", "30036"}, - {"2607:f110:ea20::/35", "21889"}, - {"2c0f:f1c0::/32", "328178"}, - {"2806:2f0:1023::/41", "22884"}, - {"2806:2f0:4203::/42", "17072"}, - {"2a02:26f0:1301::/37", "20940"}, - {"2a02:26f7:ea04::/48", "36183"}, - {"2408:80ea:7980::/43", "17623"}, - {"2804:59fc::/35", "268738"}, - {"2a01:5b0:2f::/48", "8391"}, - {"2a01:6780:4::/48", "12676"}, - {"2a02:26f0:cd01::/40", "20940"}, - {"2001:559:85e7::/48", "33659"}, - {"2610:1a0:7000::/32", "40193"}, - {"2804:ac8:100::/47", "262672"}, - {"2a02:26f7:da01::/46", "20940"}, - {"2a03:d000:1300::/46", "31163"}, - {"2a05:4200:4::/47", "21534"}, - {"240e:438:4020::/43", "140647"}, - {"2a02:21b4::/32", "57370"}, - {"240e:44d:6840::/42", "140351"}, - {"2606:2ec0::/32", "399356"}, - {"2607:f6f0:2c00::/40", "15830"}, - {"2804:82c4::/32", "272539"}, - {"2a11:b280::/29", "204790"}, - {"2001:678:a3c::/48", "8867"}, - {"2600:6c10:f258::/40", "20115"}, - {"2600:9000:234c::/43", "16509"}, - {"2605:a3c0::/32", "395731"}, - {"2806:230:1104::/40", "265594"}, - {"2a0e:6c40::/29", "37221"}, - {"2001:67c:24f8::/48", "57407"}, - {"2408:8456:b210::/42", "134543"}, - {"2409:804b:2901::/45", "9808"}, - {"2600:380:e980::/41", "20057"}, - {"2800:160:175a::/42", "14259"}, - {"2a03:2560::/32", "8982"}, - {"2408:8456:2c50::/39", "17816"}, - {"240e:982:d300::/40", "134756"}, - {"2600:1902::/31", "19527"}, - {"2804:788::/32", "262300"}, - {"2a00:4802:3810::/38", "8717"}, - {"2a01:c50e:b300::/36", "12479"}, - {"2a02:26f7:f3c9::/46", "20940"}, - {"2001:da8:b9::/46", "23910"}, - {"2402:8100:2041::/42", "45271"}, - {"2409:8e15:a000::/30", "56044"}, - {"240a:ad39::/32", "146035"}, - {"2620:122:8008::/48", "30069"}, - {"2a04:2400::/27", "12302"}, - {"2a0c:6740::/29", "58061"}, - {"2a04:5c87::/32", "201365"}, - {"2605:a404:77::/40", "33363"}, - {"2800:4f0:21::/48", "28006"}, - {"2a0b:f303:464::/29", "62240"}, - {"2a0e:b107:14ff::/48", "398355"}, - {"2001:c20:c817::/48", "58562"}, - {"2403:c200::/32", "9790"}, - {"240a:a654::/32", "144270"}, - {"2806:2f0:31c3::/42", "17072"}, - {"2a00:4802:290::/44", "8717"}, - {"2a07:aa00:80::/48", "3356"}, - {"2403:bb00:abcd::/48", "24528"}, - {"2a0b:e480::/29", "206331"}, - {"2406:8800:9033::/45", "17465"}, - {"2408:8456:2200::/42", "17622"}, - {"2603:c012:e000::/36", "31898"}, - {"2a00:c280:101::/29", "50463"}, - {"2001:4d78:2000::/40", "15830"}, - {"2402:800:999b::/42", "7552"}, - {"2804:14d:7685::/41", "28573"}, - {"2403:fc80::/32", "63501"}, - {"2409:8c54:2800::/43", "9808"}, - {"240e:44d:5c00::/41", "140345"}, - {"2806:230:1011::/48", "11888"}, - {"2001:44b8:18::/47", "7545"}, - {"2404:f440::/32", "58460"}, - {"2a00:ce0::/32", "8553"}, - {"2a01:7c8::/40", "20857"}, - {"2a06:ff40::/29", "15738"}, - {"2a0f:d000::/29", "35048"}, - {"2a0f:f180::/32", "60682"}, - {"2001:67c:2664::/48", "42525"}, - {"2804:18:6820::/41", "26599"}, - {"2804:161c:a00::/45", "263268"}, - {"2a00:c080::/32", "5524"}, - {"2001:559:452::/47", "33659"}, - {"2001:559:85fa::/45", "7922"}, - {"2001:57a:f300::/46", "62957"}, - {"2400:fc00:40b0::/39", "45773"}, - {"2620:9c:2000::/48", "54406"}, - {"2800:310:2::/48", "262589"}, - {"2a02:5c0::/32", "21232"}, - {"2a02:26f7:e2c8::/48", "36183"}, - {"2a06:3b80:110::/48", "200478"}, - {"2001:559:103::/48", "20214"}, - {"2001:559:7ad::/48", "33656"}, - {"2400:11c0::/32", "133296"}, - {"2408:8459:3850::/38", "17816"}, - {"2804:299c::/32", "264025"}, - {"2a0e:c680::/32", "208654"}, - {"2001:550:a07::/43", "174"}, - {"2001:559:c312::/48", "22909"}, - {"2001:da8:cc::/48", "138371"}, - {"2a0e:aa07:f0e0::/44", "208680"}, - {"2001:fd8:221d::/35", "4775"}, - {"2400:3680::/32", "45582"}, - {"240a:a134::/32", "142958"}, - {"2600:6c10:f31d::/41", "20115"}, - {"2a04:81c0::/29", "56665"}, - {"2400:6280:114::/48", "132280"}, - {"2406:d500:9::/48", "136557"}, - {"2605:a404:180::/42", "33363"}, - {"2a03:e100::/29", "52144"}, - {"240a:a02c::/32", "142694"}, - {"240e:978:1500::/40", "131325"}, - {"2a06:bdc0:1a40::/29", "62240"}, - {"2604:bb00::/32", "46692"}, - {"2620:129:f003::/48", "393462"}, - {"2a00:4802:2a10::/39", "8717"}, - {"2a01:bca0::/32", "202114"}, - {"2a02:888:de::/39", "47794"}, - {"2a03:3b40::/38", "24971"}, - {"2001:4220:800f::/43", "24835"}, - {"2803:7820::/45", "267708"}, - {"2a10:7b00::/29", "399975"}, - {"240a:a29f::/32", "143321"}, - {"2803:84e0::/32", "27951"}, - {"2806:20d:3230::/45", "32098"}, - {"2001:418:1401:600::/42", "2914"}, - {"2a01:8f00::/32", "197063"}, - {"2a09:58c0::/48", "8426"}, - {"2a0d:2480::/29", "328543"}, - {"2001:559:58f::/48", "33287"}, - {"2001:1388:8a0e::/42", "6147"}, - {"2402:9e80:41::/48", "138558"}, - {"2408:8957:300::/40", "17816"}, - {"240a:aa51::/32", "145291"}, - {"2800:160:216f::/40", "14259"}, - {"2804:8528::/40", "272561"}, - {"2a02:26f7:c445::/46", "20940"}, - {"2404:2f80:ff01::/48", "58495"}, - {"2804:4d4c::/32", "267422"}, - {"2804:7f6c:71::/32", "271687"}, - {"2a0e:c885::/44", "208759"}, - {"2401:d800:92c0::/42", "7552"}, - {"2402:7800:3002::/48", "21775"}, - {"2408:8956:da40::/40", "17622"}, - {"240a:a008::/32", "142658"}, - {"240a:a60d::/32", "144199"}, - {"240e:950:5c00::/31", "4134"}, - {"2606:2000:16::/32", "1616"}, - {"2a02:26f7:df45::/46", "20940"}, - {"2a0e:a940::/32", "210499"}, - {"2c0f:f5e0::/32", "25139"}, - {"2001:559:85cf::/43", "33662"}, - {"2400:7fc0::/40", "55960"}, - {"240a:abbf::/32", "145657"}, - {"2607:f768:4000::/32", "33152"}, - {"2a03:2880:f200::/47", "32934"}, - {"2a0e:97c0:770::/44", "212935"}, - {"2a11:fc80:6277::/48", "20473"}, - {"2001:67c:730::/48", "60754"}, - {"2409:802e:2906::/32", "9808"}, - {"2409:8053:2c02::/48", "56047"}, - {"240e:438:8a20::/43", "140647"}, - {"2804:824c:2000::/32", "272511"}, - {"2a00:1068::/32", "47998"}, - {"2001:67c:2670::/48", "43451"}, - {"2600:1014:b030::/44", "22394"}, - {"2804:3798:10::/32", "266423"}, - {"2401:d800:2050::/42", "7552"}, - {"240a:a3dc::/32", "143638"}, - {"2804:3c::/32", "28576"}, - {"2402:800:522b::/41", "7552"}, - {"2403:8300:e00::/46", "204527"}, - {"2404:bf40:f080::/48", "2764"}, - {"240e:d9:e801::/30", "4134"}, - {"2600:1003:a010::/40", "22394"}, - {"2a00:11c0:3d::/48", "42354"}, - {"2a00:ff80::/29", "8264"}, - {"2a02:f48::/40", "44515"}, - {"2a0b:2180:2::/32", "206502"}, - {"2001:df7:880::/48", "45325"}, - {"2401:d800:640::/42", "7552"}, - {"240a:a6d0::/32", "144394"}, - {"240e:3b3:4c00::/35", "136200"}, - {"2804:14d:b000::/40", "28573"}, - {"2a00:1c78:1::/48", "49340"}, - {"2a0c:4500::/32", "207517"}, - {"2001:559:219::/48", "33657"}, - {"2400:3c20::/32", "18196"}, - {"240a:a2d5::/32", "143375"}, - {"240a:a40f::/32", "143689"}, - {"2a03:23e0::/32", "201688"}, - {"2a05:1c00::/29", "6718"}, - {"2001:559:c08c::/48", "33287"}, - {"2402:4380::/32", "132162"}, - {"2806:2f0:1303::/43", "22884"}, - {"2a00:4802:d10::/40", "8717"}, - {"2a02:df8::/29", "20799"}, - {"2a02:2a90:8110::/33", "702"}, - {"2a03:f80:65::/48", "9009"}, - {"2a0c:b280::/48", "16509"}, - {"2a0c:bcc0::/34", "206476"}, - {"2a0e:ed00::/29", "208839"}, - {"2001:559:8748::/48", "33662"}, - {"240a:a73e::/32", "144504"}, - {"2607:ff28:5003::/36", "62904"}, - {"2804:40bc::/32", "265978"}, - {"2804:45d0::/32", "266951"}, - {"2001:1998:2000::/35", "3456"}, - {"2401:7500:ff1::/48", "133296"}, - {"2610:20:8c20::/44", "3477"}, - {"2a00:1f30::/29", "29081"}, - {"2001:67c:838::/48", "24840"}, - {"240a:a846::/32", "144768"}, - {"2607:fb91:3000::/33", "21928"}, - {"2a02:26f7:e080::/48", "36183"}, - {"2a0d:f8c0::/42", "209122"}, - {"2600:1408:1001::/36", "20940"}, - {"2604:4d40:8000::/36", "13830"}, - {"2a0d:ea80::/29", "43350"}, - {"240a:a2e8::/32", "143394"}, - {"2804:248:3::/45", "28598"}, - {"2a01:c9c0:a1::/45", "8891"}, - {"2a04:4e40:d200::/48", "54113"}, - {"2408:84f3:3620::/43", "17816"}, - {"2409:8c4c:e02::/31", "9808"}, - {"240a:a044::/32", "142718"}, - {"240e:3bd:2c00::/35", "134774"}, - {"2a01:8840:6::/44", "12041"}, - {"2a06:e881:4800::/48", "134666"}, - {"2a09:5500::/29", "49010"}, - {"2a0b:6b82::/32", "42615"}, - {"2001:550:4002::/39", "174"}, - {"2001:1960:12::/48", "26127"}, - {"2605:2180:901::/43", "12422"}, - {"2606:c00:33::/45", "9505"}, - {"2001:559:594::/48", "33650"}, - {"2001:df0:23e::/48", "9752"}, - {"2602:fed2:7305::/48", "53356"}, - {"2a02:d6a0::/30", "20692"}, - {"2a0d:3c40:d498::/48", "49542"}, - {"240a:ab84::/32", "145598"}, - {"2607:fcc8::/33", "10796"}, - {"2a02:26f7:f0::/48", "36183"}, - {"2a0b:9e80::/32", "15576"}, - {"2a0c:5247:e000::/36", "59504"}, - {"2a0d:9b84:1000::/36", "25180"}, - {"2405:55c0:40::/40", "63991"}, - {"2804:14d:7e8d::/41", "28573"}, - {"2606:2680:a000::/48", "7138"}, - {"2804:e30:405::/44", "11338"}, - {"2806:2a0:2f2::/37", "28548"}, - {"2806:2f0:9761::/46", "17072"}, - {"2001:fb0:1075::/48", "55498"}, - {"2403:600:b002::/33", "135391"}, - {"2804:3fd8:8001::/33", "265919"}, - {"2a01:470::/29", "35189"}, - {"2a02:26f7:ef49::/46", "20940"}, - {"2001:dc7:fffe::/47", "24409"}, - {"2400:db00::/32", "23881"}, - {"2800:bf0:3700::/46", "52257"}, - {"2a06:f140::/29", "42034"}, - {"2620:10a:30f1::/44", "10349"}, - {"2804:18:870::/40", "26599"}, - {"2804:7cf4::/32", "271529"}, - {"2a02:26f7:ef88::/48", "36183"}, - {"2a09:db40::/48", "60781"}, - {"2a10:7700::/32", "399975"}, - {"240a:a1ca::/32", "143108"}, - {"2a0a:d00::/29", "207023"}, - {"2a0c:9540::/32", "202516"}, - {"2401:d800:9a10::/42", "7552"}, - {"2607:ffd0:900::/32", "13767"}, - {"2620:11d:9002:700::/48", "33186"}, - {"2804:1c04:fe00::/39", "61633"}, - {"2804:51cc::/32", "268478"}, - {"2a0c:b642:1a01::/48", "60404"}, - {"2c0f:4600::/32", "328839"}, - {"2001:579:f184::/36", "22773"}, - {"2001:4b78::/29", "12637"}, - {"2600:1409:a001::/36", "20940"}, - {"2804:75a8::/32", "271061"}, - {"2408:8957:6500::/40", "17816"}, - {"2001:978:3400::/48", "9009"}, - {"2001:c20:48a6::/48", "9255"}, - {"240a:ad88::/32", "146114"}, - {"2600:100::/28", "32703"}, - {"2602:fd3f::/46", "6939"}, - {"2a02:26f7:c408::/48", "36183"}, - {"2a05:7a80::/29", "204269"}, - {"2a10:9902:730::/46", "211972"}, - {"2001:559:84ab::/48", "22258"}, - {"2602:fdfe::/36", "17177"}, - {"2a02:26f0:b601::/39", "20940"}, - {"2001:678:384::/48", "207207"}, - {"2401:4900:4bdc::/46", "45609"}, - {"2401:d800:9140::/42", "7552"}, - {"240e:982:3400::/36", "4134"}, - {"2804:6d18::/32", "270512"}, - {"2a01:8840:65::/48", "207266"}, - {"2c0f:fa60::/32", "36917"}, - {"2001:559:50e::/48", "33650"}, - {"2600:1017:f800::/44", "22394"}, - {"2804:718c::/32", "270796"}, - {"2a02:2e02:12d0::/42", "12479"}, - {"2600:6c2e:692::/39", "20115"}, - {"2c0f:c00::/32", "328327"}, - {"2001:67c:218c::/48", "12986"}, - {"2001:df4:2880::/48", "7545"}, - {"2405:f600:ba::/47", "45117"}, - {"240a:ac6a::/32", "145828"}, - {"2600:1006:b000::/42", "6167"}, - {"2600:1800::/45", "16552"}, - {"2406:5800:ff00::/48", "45577"}, - {"2409:8915:2600::/40", "56044"}, - {"240a:a067::/32", "142753"}, - {"240a:a5a6::/32", "144096"}, - {"240c:c604::/23", "23910"}, - {"240e:108:11c1::/48", "38283"}, - {"2806:230:1020::/48", "265594"}, - {"2a02:26f7:cc44::/48", "36183"}, - {"2a02:26f7:fa89::/42", "20940"}, - {"2001:4a0::/32", "8134"}, - {"2405:203:886::/47", "55836"}, - {"2600:6c20:a03::/44", "20115"}, - {"2803:580::/32", "61449"}, - {"2a0d:6680::/29", "50782"}, - {"2001:1248:9818::/42", "11172"}, - {"2804:194c::/32", "61785"}, - {"2a0f:c800::/29", "198385"}, - {"2001:559:1e3::/48", "33491"}, - {"240a:a2a0::/32", "143322"}, - {"240a:a5f5::/32", "144175"}, - {"2600:6c10:f055::/46", "20115"}, - {"2607:6b80:41::/44", "13213"}, - {"2800:bf0:a809::/48", "27947"}, - {"2a01:bb24:2::/48", "16509"}, - {"2605:c680::/32", "63251"}, - {"2a00:1728:1d::/48", "44796"}, - {"2404:f300::/43", "56258"}, - {"240a:a37a::/32", "143540"}, - {"2600:1007:b1e0::/43", "22394"}, - {"2a02:26f7:f600::/48", "36183"}, - {"2a03:a200::/32", "43451"}, - {"2401:2f80::/32", "27568"}, - {"2800:484:e300::/40", "14080"}, - {"2a02:2698:400::/38", "50512"}, - {"2a04:5ec7:1::/32", "60239"}, - {"2404:a8:5::/48", "24514"}, - {"2405:f080:1e0a::/47", "136907"}, - {"2409:8c14:e00::/35", "9808"}, - {"240a:a860::/32", "144794"}, - {"2602:feb4:270::/44", "25961"}, - {"2a03:57e0::/32", "60481"}, - {"2a0c:b640:17::/32", "34872"}, - {"2a10:3ec0:32::/48", "198417"}, - {"2001:b60::/32", "20836"}, - {"240e:d6:6800::/37", "133775"}, - {"2600:140b:2400::/48", "31109"}, - {"2804:3dc:a10::/32", "52967"}, - {"2804:27a4::/32", "263914"}, - {"2a0b:20c0:3000::/32", "205766"}, - {"2602:feb4:e0::/44", "25961"}, - {"2a0f:e6c2::/32", "62240"}, - {"2c0f:ec78::/32", "328088"}, - {"240a:a455::/32", "143759"}, - {"2607:f6f0:9001::/48", "394749"}, - {"2620:13d:2060::/46", "209"}, - {"2804:2b64::/32", "265151"}, - {"2804:76a4::/32", "271125"}, - {"2a11:3800::/29", "43624"}, - {"2001:480:631::/35", "668"}, - {"2404:2940:4000::/32", "132257"}, - {"2607:fb28::/44", "9"}, - {"2803:e600:ff01::/40", "18809"}, - {"2001:1a38::/32", "34081"}, - {"2402:93c0::/48", "59073"}, - {"2600:370f:73e8::/37", "32261"}, - {"2001:df2:e900::/48", "137035"}, - {"2409:8959:ce54::/39", "56040"}, - {"2600:1005:b180::/41", "22394"}, - {"2804:2fc8::/32", "262611"}, - {"2a02:26f7:b991::/46", "20940"}, - {"2405:5700::/32", "17882"}, - {"2600:1000:10::/32", "22394"}, - {"2620:13f:7014::/46", "10975"}, - {"2804:7280::/33", "270857"}, - {"2a02:26f7:d885::/46", "20940"}, - {"2a0e:b107:1165::/48", "58057"}, - {"2a05:10c0::/29", "207594"}, - {"240a:afdb::/32", "146709"}, - {"2806:1080:102::/32", "8151"}, - {"2a0a:6d00::/29", "206988"}, - {"2800:310:407::/44", "18678"}, - {"2602:802:b040::/47", "399788"}, - {"2a00:c2e0:101::/32", "30919"}, - {"2a02:26f7:d980::/48", "36183"}, - {"2804:6230::/32", "269281"}, - {"2a02:26f7:e245::/46", "20940"}, - {"2a0b:fd81::/48", "49419"}, - {"2001:253:136::/48", "142102"}, - {"2001:6f8::/38", "3257"}, - {"2408:8459:fe20::/30", "17816"}, - {"2804:1d20:440::/38", "264349"}, - {"2a00:4600::/32", "25451"}, - {"2a0b:6b83:4225::/41", "202562"}, - {"2405:9800:9802::/47", "45458"}, - {"2602:fbfd::/36", "395019"}, - {"2604:1380:4500::/42", "54825"}, - {"2804:104c:c800::/40", "263629"}, - {"2804:5030::/32", "268374"}, - {"2a04:4e40:b810::/42", "54113"}, - {"2a0c:b641:e1::/48", "206877"}, - {"2409:8924:2900::/38", "56046"}, - {"240a:a5c1::/32", "144123"}, - {"240a:aeea::/32", "146468"}, - {"2620:11d:500f::/48", "393732"}, - {"2402:9b00::/40", "45796"}, - {"2402:ca40::/32", "137707"}, - {"2406:840:fbba::/48", "139058"}, - {"240e:44d:4d80::/41", "4134"}, - {"2620:10a:80ab::/48", "394354"}, - {"2804:4254::/32", "267493"}, - {"2a0d:41c0::/32", "204179"}, - {"240e:438:2a20::/43", "140647"}, - {"2a11:4140::/29", "5405"}, - {"240a:a07c::/32", "142774"}, - {"2804:64a0::/32", "269439"}, - {"2a02:1a8::/32", "203865"}, - {"2a05:7640:f40::/42", "174"}, - {"2001:678:a80::/48", "56796"}, - {"2001:1388:5548::/34", "6147"}, - {"2405:1500:91::/42", "58717"}, - {"240a:a882::/32", "144828"}, - {"2604:2d80:be80::/33", "30036"}, - {"2607:ff00:300::/40", "19437"}, - {"2620:15:8000::/48", "26039"}, - {"2c0f:f900::/32", "36864"}, - {"2405:df80::/32", "38719"}, - {"240a:afa9::/32", "146659"}, - {"2a00:1288:f03f::/41", "10310"}, - {"2a02:7b02:2000::/36", "48328"}, - {"2a07:3500:1778::/48", "34373"}, - {"2001:df0:3980::/48", "135942"}, - {"2a0e:97c0:410::/46", "211275"}, - {"2800:160:1658::/45", "14259"}, - {"2804:51c:7400::/36", "262495"}, - {"2804:8044::/32", "271740"}, - {"2a02:26f7:e84c::/48", "36183"}, - {"2405:9800:f000::/48", "45458"}, - {"240e:397:300::/37", "140484"}, - {"2800:8e0:2::/32", "14259"}, - {"2a02:26f7:c384::/48", "36183"}, - {"2401:f540:6::/47", "134094"}, - {"2402:73c0::/32", "131929"}, - {"2402:c100:c001::/34", "23673"}, - {"2a0c:46c0::/29", "29262"}, - {"2001:da8:c800::/45", "24356"}, - {"2405:203:986::/47", "55836"}, - {"2804:30a8::/32", "264967"}, - {"2804:37f0:8100::/36", "266445"}, - {"2a03:1440::/32", "9063"}, - {"2a0b:3200::/31", "201080"}, - {"2001:559:542::/48", "22909"}, - {"2001:df7:f300::/48", "138653"}, - {"2001:44b8:4046::/48", "7545"}, - {"2400:5880::/32", "58983"}, - {"2804:3dc4::/34", "266552"}, - {"2001:559:2d7::/48", "7016"}, - {"2001:559:539::/46", "7922"}, - {"2402:800:41ff::/38", "7552"}, - {"2a05:1083:407e::/48", "209870"}, - {"2a0e:46c4:2d0d::/48", "208753"}, - {"2001:559:c1bb::/45", "33287"}, - {"2409:8907:8120::/38", "24547"}, - {"240e:3b8:1400::/38", "134773"}, - {"2600:1408:8001::/37", "20940"}, - {"2804:1928::/32", "61775"}, - {"2a04:52c0::/32", "60404"}, - {"2a0e:aa06:490::/45", "24239"}, - {"2c0f:f850:155::/46", "327979"}, - {"2001:559:86b3::/45", "7922"}, - {"2401:d800:7220::/41", "7552"}, - {"2408:890c::/31", "17621"}, - {"2602:fff6:f::/48", "29802"}, - {"2001:67c:924::/48", "13030"}, - {"240a:a2ff::/32", "143417"}, - {"2806:2f0:9d01::/46", "17072"}, - {"2a00:139b::/32", "204680"}, - {"2001:559:8001::/48", "26868"}, - {"2001:559:c3f5::/48", "33660"}, - {"2001:678:454::/48", "1257"}, - {"2001:fe8:9000::/48", "24435"}, - {"2001:1868:a10c::/33", "11404"}, - {"2a02:26f7:ec51::/46", "20940"}, - {"2001:559:c0d9::/48", "33489"}, - {"2402:800:9dee::/43", "7552"}, - {"2402:e380:100::/43", "139073"}, - {"2600:2c01:5000::/34", "17378"}, - {"240a:a73c::/32", "144502"}, - {"2605:7900:42::/48", "19133"}, - {"2804:6684::/32", "269565"}, - {"2804:6c9c::/32", "270480"}, - {"2a0d:2406:200::/39", "64425"}, - {"2c0f:eb98::/32", "328594"}, - {"2001:250:7410::/42", "24371"}, - {"2400:5400:10::/48", "18245"}, - {"2404::/35", "17709"}, - {"2409:8054:303e::/47", "9808"}, - {"240a:adf4::/32", "146222"}, - {"2a04:1740::/29", "42159"}, - {"2001:559:c23b::/45", "7922"}, - {"2001:67c:1514::/48", "3257"}, - {"2409:8915:2000::/39", "56044"}, - {"2606:9e80::/32", "32212"}, - {"240a:a22a::/32", "143204"}, - {"2804:14c:3b91::/44", "28573"}, - {"2a01:878::/32", "12302"}, - {"2400:5200:1800::/40", "55410"}, - {"2602:fe10:ff5::/44", "394119"}, - {"2620:101:80f2::/48", "395642"}, - {"2804:54e4::/32", "268676"}, - {"2804:8478::/32", "272262"}, - {"2806:230:6003::/48", "11888"}, - {"2a03:7380:2140::/37", "13188"}, - {"2402:800:9d55::/42", "7552"}, - {"2405:7f00:c1a0::/38", "133414"}, - {"240a:a9b5::/32", "145135"}, - {"2602:fd10:820::/44", "398795"}, - {"2a0f:5707:aae0::/44", "44592"}, - {"2001:13d1:c04::/34", "7303"}, - {"240a:a749::/32", "144515"}, - {"2607:f208:df05::/48", "21499"}, - {"2406:8800:9015::/44", "17465"}, - {"2409:8915:7c00::/32", "56044"}, - {"240e:108:29::/48", "4134"}, - {"2600:141b:3000::/48", "35994"}, - {"2a01:879::/24", "3209"}, - {"2001:c20:840a::/38", "3758"}, - {"2408:8256:3760::/44", "17623"}, - {"2a02:2e02:18a0::/39", "12479"}, - {"2001:559:85c1::/48", "21508"}, - {"2001:fb0:101d::/42", "7470"}, - {"2403:0:208::/37", "4755"}, - {"2409:8087:200::/40", "38019"}, - {"240a:a938::/32", "145010"}, - {"2600:1005:f110::/30", "22394"}, - {"2804:2a0:400::/32", "28272"}, - {"2806:230:302e::/48", "265594"}, - {"2a0c:a640:1::/48", "42298"}, - {"2a0e:aac0::/32", "209974"}, - {"2001:e58::/32", "18266"}, - {"240a:a5e6::/32", "144160"}, - {"240a:ae34::/32", "146286"}, - {"2001:559:127::/48", "7725"}, - {"2804:13dc:8008::/33", "262428"}, - {"2a01:40a0::/32", "62297"}, - {"2001:1248:98e5::/43", "11172"}, - {"2402:e280:4001::/39", "134674"}, - {"2a01:320::/29", "31252"}, - {"2402:800:b7d0::/36", "7552"}, - {"2404:c000::/46", "45147"}, - {"240a:a94c::/32", "145030"}, - {"2a0f:8443::/32", "29182"}, - {"2a10:8003:8000::/27", "8551"}, - {"2001:250:3c14::/46", "138369"}, - {"2001:503:bfb0::/48", "7342"}, - {"240e:938:f901::/44", "4134"}, - {"2600:100d:b0f0::/44", "22394"}, - {"2600:1010:b030::/44", "22394"}, - {"2620:106:7000::/48", "11795"}, - {"2804:254c::/32", "264272"}, - {"2804:5770::/32", "268065"}, - {"2804:7694::/32", "271121"}, - {"2a10:9a80:dc01::/48", "1764"}, - {"2001:559:8508::/46", "33287"}, - {"2408:8956:df00::/40", "17816"}, - {"240a:a950::/32", "145034"}, - {"2804:1594::/32", "263396"}, - {"2a03:6960::/32", "198944"}, - {"2001:559:589::/48", "20214"}, - {"2409:4003:1000::/34", "55836"}, - {"2409:8038:100::/36", "9808"}, - {"240a:aa5c::/32", "145302"}, - {"2604:61c0:1201::/33", "29831"}, - {"2620:48:a000::/48", "32242"}, - {"2801:80:1b70::/48", "266455"}, - {"2a0d:ca40::/29", "8423"}, - {"2001:ac0:c810::/41", "8903"}, - {"2400:fc00:8190::/42", "45773"}, - {"2602:fbae::/40", "400495"}, - {"2605:2400:300::/37", "19528"}, - {"2a0c:e640:1012::/45", "141011"}, - {"2001:67c:27d4::/48", "42177"}, - {"2405:1c0:6431::/45", "55303"}, - {"2409:8057:3028::/47", "9808"}, - {"2605:a401:8b41::/42", "33363"}, - {"2803:2800:6000::/32", "52368"}, - {"2a03:e581:1::/46", "49282"}, - {"2602:fea4::/36", "399584"}, - {"2620:131:4000::/40", "394015"}, - {"2a0f:eb80:10::/32", "47267"}, - {"2408:84f3:e640::/36", "17816"}, - {"2804:5f7c::/32", "269103"}, - {"2a0b:7e00::/38", "198622"}, - {"2405:9800:b900::/38", "133481"}, - {"2409:8c2f:3800::/48", "9808"}, - {"240e:108:2b::/48", "58563"}, - {"2800:8c0::/32", "18840"}, - {"2a05:88c0::/29", "210107"}, - {"2a0c:aa40::/29", "50113"}, - {"2a0d:b4c0::/29", "210101"}, - {"2408:8957:c700::/40", "17816"}, - {"2804:4b00::/32", "267277"}, - {"2804:6918:2000::/33", "270248"}, - {"2a02:26f7:e6c8::/48", "36183"}, - {"2a02:8010::/29", "13037"}, - {"2a11:840:1::/45", "9009"}, - {"2606:c100::/32", "36545"}, - {"2620:12a:8000::/44", "54113"}, - {"2a02:ee80:424a::/45", "3573"}, - {"2001:559:158::/48", "33662"}, - {"2600:c08:2015::/48", "27385"}, - {"2605:a401:89f4::/44", "33363"}, - {"2001:4490:c00::/43", "9829"}, - {"2402:8100:27d0::/47", "45271"}, - {"2620:11a:a0f1::/48", "36040"}, - {"2a03:b500:100::/34", "41135"}, - {"2a06:e600::/29", "43826"}, - {"2001:559:875f::/48", "21508"}, - {"2401:d800:bb50::/42", "7552"}, - {"2602:feda:b66::/48", "146950"}, - {"2804:4f3c::/32", "268314"}, - {"2a02:26f0:9b01::/37", "20940"}, - {"2a0f:df00:dead::/48", "41281"}, - {"2001:67c:2210::/48", "49167"}, - {"2001:4900::/32", "13657"}, - {"2603:c002:1410::/39", "31898"}, - {"2a0b:ea40::/32", "198188"}, - {"2001:559:3fc::/47", "33652"}, - {"2606:7e00:4::/48", "7215"}, - {"2804:1b3:4003::/45", "10429"}, - {"2804:751c::/32", "271024"}, - {"2804:83f4::/32", "52918"}, - {"2a00:9860::/37", "44789"}, - {"2001:502:2eda::/48", "397226"}, - {"2001:4408:5225::/46", "4758"}, - {"2401:4900:3920::/43", "45609"}, - {"2804:3b90::/36", "266157"}, - {"2a01:488:bb06::/48", "39779"}, - {"2001:df1:a100::/48", "136758"}, - {"2804:291c:2000::/33", "263998"}, - {"2a0e:e42::/32", "208638"}, - {"2a0f:7040::/32", "203622"}, - {"2001:559:4a4::/48", "7016"}, - {"2001:1a40:120::/38", "5416"}, - {"2401:a580::/46", "55403"}, - {"2407:680:8000::/33", "7656"}, - {"240e:45c:a500::/40", "140535"}, - {"2600:140f:4e00::/48", "38266"}, - {"2801:1fc::/48", "27951"}, - {"2804:56c0::/32", "268021"}, - {"2806:2f0:61c1::/46", "17072"}, - {"2400:f1::/30", "4766"}, - {"2408:8409:a800::/40", "4808"}, - {"2605:a900:9::/46", "46887"}, - {"2a0f:5707:aa8a::/45", "56382"}, - {"2001:504:40:108::/64", "6461"}, - {"2001:48f8:c000::/34", "11232"}, - {"2a06:b840::/29", "203608"}, - {"2404:3280::/44", "9287"}, - {"2600:6c10:805::/44", "20115"}, - {"2a02:13e0:1::/48", "7018"}, - {"2405:b7c0::/32", "139112"}, - {"2605:60c0::/40", "395846"}, - {"2803:4640::/32", "61506"}, - {"2a01:270:eaeb::/37", "29657"}, - {"2a02:26f7:c6c8::/48", "36183"}, - {"2803:9640::/32", "264605"}, - {"2804:14c:6b82::/41", "28573"}, - {"2a02:88d:403f::/34", "47794"}, - {"2a02:2891:10::/46", "51185"}, - {"2a04:30c0::/32", "20473"}, - {"2a01:6b0::/32", "1820"}, - {"2a03:4b22::/32", "39835"}, - {"2a0d:3341:7000::/36", "36492"}, - {"2001:559:3c9::/48", "33491"}, - {"240a:a6fb::/32", "144437"}, - {"2602:fca7:4::/44", "399318"}, - {"2604:ad40::/32", "395795"}, - {"2a03:6a0::/32", "56925"}, - {"2a04:4e42:201::/37", "54113"}, - {"2001:67c:1878::/48", "3301"}, - {"2001:978:230b::/37", "174"}, - {"2607:f868:8000::/45", "20141"}, - {"2a00:a8a0::/32", "60533"}, - {"240e:5f:6000::/48", "134773"}, - {"2600:9000:2206::/48", "16509"}, - {"2804:14d:2400::/40", "28573"}, - {"2a02:2e02:8ff0::/35", "12479"}, - {"2001:44b8:30a5::/48", "4739"}, - {"2400:1a00::/45", "17501"}, - {"240a:a614::/32", "144206"}, - {"2a00:1b00::/48", "47862"}, - {"2a02:ee80:4022::/45", "3573"}, - {"2a10:fa00::/29", "52193"}, - {"2801:1b:a000::/48", "265700"}, - {"2804:3dbc:8000::/35", "266550"}, - {"2a00:1148::/45", "47764"}, - {"2a07:a343:bc70::/44", "9009"}, - {"2804:15fc::/32", "28359"}, - {"2a02:fe80:11::/44", "30148"}, - {"2a12:4946:1800::/48", "211398"}, - {"2001:470:69::/43", "6939"}, - {"2001:c20:4887::/48", "9255"}, - {"2001:4b26:0:100::/31", "34288"}, - {"2800:160:1d44::/46", "14259"}, - {"2806:2f0:4123::/41", "17072"}, - {"2a0f:76c0::/29", "202709"}, - {"2001:559:8459::/48", "7015"}, - {"2408:8956:eb00::/40", "17816"}, - {"240a:af63::/32", "146589"}, - {"2602:ffc5:10a::/48", "19969"}, - {"2001:1900:2231::/45", "3356"}, - {"240a:a4b0::/32", "143850"}, - {"2a02:26f0:124::/46", "34164"}, - {"240a:a6de::/32", "144408"}, - {"2602:fd2a::/40", "17326"}, - {"2801:80:22f0::/48", "267111"}, - {"2804:7468::/32", "270979"}, - {"2a0a:6040::/33", "61138"}, - {"2a0b:2900:2100::/41", "48582"}, - {"2408:8256:396e::/43", "17623"}, - {"2409:8918::/31", "134810"}, - {"2409:8c28:1201::/39", "56041"}, - {"240a:a640::/32", "144250"}, - {"2604:2f40::/38", "29749"}, - {"2001:550:9f00:1::/46", "174"}, - {"2001:559:83c6::/48", "7015"}, - {"2600:1417:2a::/47", "24319"}, - {"2605:c540:c000::/46", "398378"}, - {"2800:bf0:175::/48", "52257"}, - {"2600:370f:5221::/46", "32261"}, - {"2a02:26f7:b644::/48", "36183"}, - {"2a0f:5707:aaf0::/44", "211301"}, - {"2001:559:c137::/48", "7015"}, - {"2402:ef1c::/31", "7633"}, - {"2404:4fc0::/32", "38047"}, - {"2408:80fa:a000::/33", "17816"}, - {"240a:a913::/32", "144973"}, - {"240a:afc6::/32", "146688"}, - {"2602:ffc5:d10::/44", "7489"}, - {"2a02:26f7:d985::/46", "20940"}, - {"2803:9800:a847::/44", "11664"}, - {"2001:67c:1b8c::/48", "197087"}, - {"2803:bf40::/32", "264764"}, - {"2804:6848::/32", "269682"}, - {"2a0e:aa07:e025::/48", "210903"}, - {"2001:df0:f400::/47", "133657"}, - {"2804:51ac::/32", "268469"}, - {"2a0a:3900::/29", "208425"}, - {"2a0e:2700::/30", "203136"}, - {"2a0e:e7c0::/29", "204348"}, - {"2001:250:3011::/48", "23910"}, - {"2001:559:84b9::/48", "33287"}, - {"2001:67c:182c::/48", "47667"}, - {"2402:f800:ff01::/40", "7602"}, - {"2408:8957:6300::/40", "17816"}, - {"2600:140f:5400::/48", "9498"}, - {"2600:370f:5322::/41", "32261"}, - {"2800:310:40d::/36", "18678"}, - {"2a01:a860::/32", "202212"}, - {"2a02:2e02:1c70::/40", "12479"}, - {"2a03:6e60::/48", "9085"}, - {"2c0f:fdc8::/32", "37049"}, - {"2001:559:824f::/48", "33657"}, - {"2408:84f3:b010::/42", "134543"}, - {"240e:44d:8000::/41", "140345"}, - {"2001:559:e6::/48", "22909"}, - {"2001:df0:9e80::/48", "45926"}, - {"2804:478c::/32", "267061"}, - {"2804:75f4::/32", "271080"}, - {"2001:559:c410::/48", "7922"}, - {"2001:1248:5b07::/42", "11172"}, - {"2409:8051:2::/40", "56047"}, - {"2a0d:3340:c000::/31", "36492"}, - {"2001:1248:8427::/44", "11172"}, - {"2600:1408:2c00::/48", "35994"}, - {"2604:8bc0::/32", "14932"}, - {"2a05:8900:36::/48", "199159"}, - {"2a0e:46c4:1314::/48", "142598"}, - {"2a11:bd80::/32", "16509"}, - {"240a:a448::/32", "143746"}, - {"240a:a51e::/32", "143960"}, - {"240a:a787::/32", "144577"}, - {"2804:774:8600::/39", "52858"}, - {"2804:6564::/32", "269487"}, - {"2402:8400:600::/39", "17820"}, - {"2405:1c0:6631::/45", "55303"}, - {"2409:8a34:aa00::/33", "9808"}, - {"240a:a0a3::/32", "142813"}, - {"2804:36bc::/32", "266368"}, - {"2a02:26f7:d001::/46", "20940"}, - {"2001:559:3f9::/48", "33652"}, - {"2406:cb42::/48", "395092"}, - {"240e:438:440::/38", "4134"}, - {"2602:fbda:700::/44", "149506"}, - {"2606:2800:4a8c::/48", "15133"}, - {"2800:160:12ce::/43", "14259"}, - {"2804:49c:3104::/48", "15201"}, - {"2a10:640::/32", "1680"}, - {"2c0f:eb00:500::/38", "61266"}, - {"2001:67c:2f64::/48", "34393"}, - {"2001:4b20:100:206::/53", "34288"}, - {"2405:8a00:21be::/33", "55824"}, - {"2803:5c80:5001::/48", "64114"}, - {"2a02:26f7:e901::/46", "20940"}, - {"2001:1a11:b9::/48", "8781"}, - {"2400:3b00:30::/48", "18229"}, - {"240e:438:2220::/43", "140647"}, - {"2804:3f48::/32", "266650"}, - {"2001:67c:26ec::/48", "6908"}, - {"2001:df3:8600::/48", "131418"}, - {"2001:ec0:2000::/40", "131293"}, - {"2800:160:1824::/47", "14259"}, - {"2804:8500::/32", "272551"}, - {"2a02:26f7:bf51::/42", "20940"}, - {"2a02:26f7:fa85::/46", "20940"}, - {"2401:a400:5000::/34", "7477"}, - {"2402:e280:1104::/47", "134674"}, - {"2408:84f3:9840::/38", "17816"}, - {"240a:a668::/32", "144290"}, - {"240e:108:1011::/41", "4134"}, - {"2804:2144:307::/44", "52795"}, - {"2a0f:b480::/29", "213152"}, - {"240e:e9:4000::/37", "137702"}, - {"2620:13f:4000::/44", "397386"}, - {"2801:80:1d0::/48", "8075"}, - {"2804:1cc0:6000::/32", "61673"}, - {"2a0f:9a00::/29", "328543"}, - {"2408:8456:b040::/38", "17816"}, - {"240e:3b4:7600::/39", "140313"}, - {"240e:438:4c40::/38", "4134"}, - {"2607:b600:10::/48", "10397"}, - {"2a02:e58:3::/32", "209523"}, - {"2001:df1:1580::/48", "137130"}, - {"2001:4de0:1004::/47", "34343"}, - {"2401:d800:fc0::/42", "7552"}, - {"2403:9800:c049::/45", "133124"}, - {"2803:e600:cac4::/44", "18809"}, - {"2a0f:607:1003::/48", "7480"}, - {"2001:4868:10d::/40", "23148"}, - {"2620:10c:c072::/48", "15009"}, - {"2804:3404::/32", "52539"}, - {"2804:5bc0::/32", "268867"}, - {"2001:1b70:4293::/45", "8147"}, - {"2401:d800:7340::/42", "7552"}, - {"240e:3b8:9200::/36", "140317"}, - {"2804:1054::/32", "53135"}, - {"2a09:2dc3::/29", "30860"}, - {"2c0f:fe38:8::/34", "33771"}, - {"2001:ad0::/33", "3327"}, - {"2800:160:10ab::/43", "14259"}, - {"2804:1c04:8000::/33", "61633"}, - {"2001:559:70a::/48", "33659"}, - {"2801:80:b80::/48", "61841"}, - {"2a06:7c80::/29", "204030"}, - {"2a06:8000::/29", "50673"}, - {"2a0e:f200:164::/48", "30633"}, - {"2a0e:fd45:40f8::/48", "60404"}, - {"2400:f940:11::/46", "45766"}, - {"2804:54d8::/32", "268673"}, - {"2a00:c00:f050::/46", "8373"}, - {"2a00:1050::/32", "12470"}, - {"2a01:6d00:13::/32", "28726"}, - {"2a0e:b107:3f0::/46", "57883"}, - {"2001:480:254::/39", "668"}, - {"2402:800:96a9::/43", "7552"}, - {"2405:57c0:100::/48", "137799"}, - {"2602:ffe4:402::/36", "21859"}, - {"2a0f:4c40::/29", "207923"}, - {"2a0f:e841::/32", "30633"}, - {"2001:df0:23b::/48", "18188"}, - {"2a07:76c0:2::/48", "29107"}, - {"240a:af28::/32", "146530"}, - {"2607:fcd0:100:9a01::/50", "8100"}, - {"2804:7e4::/32", "52865"}, - {"2001:559:c478::/48", "33657"}, - {"2001:67c:2b20::/48", "59467"}, - {"2405:1c0:6841::/46", "55303"}, - {"240a:a2c8::/32", "143362"}, - {"2800:160:2080::/46", "14259"}, - {"2804:3c60::/32", "266207"}, - {"2a0a:e5c1:c00::/40", "213081"}, - {"2401:d800:2890::/42", "7552"}, - {"2401:f200::/32", "9988"}, - {"2407:c280:da02::/48", "138510"}, - {"240a:a486::/32", "143808"}, - {"2a00:9500::/32", "43608"}, - {"2001:19e8:d::/46", "2576"}, - {"2603:f0d0::/26", "397165"}, - {"2620:139:6002::/48", "22600"}, - {"2804:204:245::/46", "28186"}, - {"2a00:f48::/32", "47447"}, - {"2a03:6607::/32", "197838"}, - {"2001:19e8:8001::/48", "4046"}, - {"2406:6cc0:a200::/48", "63515"}, - {"2606:55c0::/32", "399969"}, - {"2a01:8840:e6::/44", "12041"}, - {"2409:8924:8700::/36", "56046"}, - {"2600:140b:11::/46", "20940"}, - {"2607:5580::/32", "18747"}, - {"2620:104:1f::/48", "6356"}, - {"2804:1ca4::/32", "263010"}, - {"2806:2f0:3461::/46", "17072"}, - {"2001:43ff::/48", "328813"}, - {"2401:d800:cf0::/39", "7552"}, - {"2600:6c38:408::/43", "20115"}, - {"2602:fc42:2::/48", "203690"}, - {"2605:ee00:fff0::/44", "29990"}, - {"2a03:8c60::/46", "51920"}, - {"2a03:b000:200::/40", "42695"}, - {"2407:5200::/42", "55915"}, - {"2602:ffc5:10d::/48", "398395"}, - {"2606:2800:4003::/48", "15133"}, - {"2001:559:f7::/48", "21508"}, - {"2001:559:c314::/48", "7016"}, - {"2404:4e00:1::/48", "32787"}, - {"2409:8c28:34b1::/39", "56041"}, - {"240a:aac2::/32", "145404"}, - {"2804:14c:4e9::/43", "28573"}, - {"2804:2050:3abd::/33", "264485"}, - {"2a07:b780::/29", "50601"}, - {"2806:230:1031::/48", "11888"}, - {"2401:8800:800::/40", "17439"}, - {"240a:a707::/32", "144449"}, - {"240e:438:2040::/38", "4134"}, - {"240e:983:204::/37", "4134"}, - {"2602:fe09::/36", "397072"}, - {"2806:2f0:3503::/42", "17072"}, - {"2403:60c0::/32", "134734"}, - {"2a09:f4c0::/32", "205718"}, - {"2a10:2f00:109::/48", "207650"}, - {"2001:559:860e::/48", "33668"}, - {"2001:dcc:1000::/48", "23600"}, - {"2001:1b70:a1::/48", "158"}, - {"2401:d800:f3d2::/37", "7552"}, - {"240e:44d:1b00::/41", "140345"}, - {"2001:df0:25e::/48", "131159"}, - {"2001:579:92f2::/39", "22773"}, - {"2804:1c84:700::/32", "61659"}, - {"2804:3994::/34", "266037"}, - {"2a0a:1000::/29", "31507"}, - {"2001:559:38b::/48", "7725"}, - {"2404:bf40:8141::/48", "7545"}, - {"2602:fbc8::/36", "400413"}, - {"2804:12c4::/32", "263497"}, - {"2001:1980:4444::/48", "32903"}, - {"2400:ca02:f122::/43", "23688"}, - {"240a:a8cd::/32", "144903"}, - {"240a:aecc::/32", "146438"}, - {"240e:37a:2600::/32", "4134"}, - {"2604:fb80::/37", "15128"}, - {"2804:5704::/32", "268038"}, - {"2804:7604:8000::/34", "271084"}, - {"2a0a:da80::/29", "213112"}, - {"2a0e:fd45:2b00::/41", "44103"}, - {"2804:1020::/32", "262544"}, - {"2804:4b78::/32", "267308"}, - {"2a04:4e40:6c00::/48", "54113"}, - {"2801:1a:6800::/48", "13489"}, - {"2804:14c:cc00::/40", "28573"}, - {"2a00:18c8::/29", "33915"}, - {"2a02:ef8::/32", "57793"}, - {"2a0c:1b80::/29", "50873"}, - {"2804:34f8::/32", "265492"}, - {"2a00:5840::/32", "5631"}, - {"2a03:fc0::/32", "60294"}, - {"2a04:4e40:8600::/48", "54113"}, - {"2a0f:e080::/48", "202971"}, - {"2409:8c04:1116::/31", "24547"}, - {"2607:fcd0:100:5900::/50", "8100"}, - {"2801:8e:a000::/36", "11993"}, - {"2a00:e200:104::/48", "198127"}, - {"2a09:a4c7:5000::/34", "208861"}, - {"2a0e:3940:f000::/36", "60767"}, - {"2001:559:1aa::/48", "33287"}, - {"2408:84f3:3220::/43", "17816"}, - {"2600:6c10:f498::/38", "20115"}, - {"2806:230:2012::/48", "265594"}, - {"2a02:d48::/40", "34913"}, - {"2405:1c0:6881::/46", "55303"}, - {"2409:8a51:1100::/30", "56047"}, - {"2a03:c200::/32", "33814"}, - {"2001:930:130::/48", "8386"}, - {"240a:a9d3::/32", "145165"}, - {"2804:1434::/32", "262492"}, - {"2405:42c0::/32", "139379"}, - {"2407:7c0:14::/40", "138128"}, - {"2602:102:1008::/43", "20115"}, - {"2604:b040:3::/48", "26282"}, - {"2803:c9e0::/32", "270012"}, - {"2804:14c:8581::/41", "28573"}, - {"2804:65e0::/32", "269520"}, - {"2a02:26f7:f848::/48", "36183"}, - {"2a0a:3b00::/32", "206497"}, - {"2001:559:85d7::/48", "33662"}, - {"2001:559:c396::/48", "7922"}, - {"2605:3380:4125::/44", "12025"}, - {"2800:860:2::/45", "262197"}, - {"2a02:26f7:bb86::/47", "20940"}, - {"2a0e:97c0:7ec::/46", "270014"}, - {"2804:228c:c000::/48", "264107"}, - {"2a00:fc00:e003::/48", "47266"}, - {"2001:559:438::/48", "7016"}, - {"2600:6c39:632::/44", "20115"}, - {"2806:230:300d::/48", "11888"}, - {"2a00:1fa2:ba00::/40", "42087"}, - {"2403:ecc0::/32", "58750"}, - {"240e:fd:a000::/36", "140308"}, - {"2600:1012:a100::/43", "6167"}, - {"2600:141b:6000::/48", "3257"}, - {"2806:2f0:4661::/46", "17072"}, - {"2a02:26f7:cd46::/48", "36183"}, - {"2409:4014:3000::/26", "55836"}, - {"2604:b000:3000::/32", "14638"}, - {"2607:6b80:3a::/48", "46562"}, - {"2804:4a28::/32", "53194"}, - {"2c0f:f7f8:3::/32", "3356"}, - {"2001:559:865d::/42", "33651"}, - {"240e:438:2620::/43", "140647"}, - {"2404:3d40::/32", "138544"}, - {"2407:4d40:f::/43", "142050"}, - {"2600:140b:4401::/36", "20940"}, - {"2620:88:8001::/48", "46269"}, - {"2800:300:6940::/40", "27651"}, - {"2a00:1990::/32", "34442"}, - {"2a01:c50f:4200::/40", "12479"}, - {"2a02:26f7:c08d::/42", "20940"}, - {"2408:8240::/32", "4837"}, - {"2001:559:c05b::/48", "33657"}, - {"2600:1406:e801::/38", "20940"}, - {"2602:fe92::/36", "13752"}, - {"2803:c0c0::/32", "264759"}, - {"2804:67c8::/32", "269650"}, - {"2409:8904:8540::/38", "24547"}, - {"2607:9800:c109::/43", "15085"}, - {"2a00:c827:7::/44", "60330"}, - {"2a05:7440:c14b::/48", "200165"}, - {"2a06:c040::/31", "61430"}, - {"2a0c:4187:8001::/48", "47596"}, - {"2001:67c:2b10::/48", "60275"}, - {"2408:8957:ad00::/40", "17816"}, - {"2804:2050:facf::/37", "264485"}, - {"2806:2f0:47e1::/36", "17072"}, - {"2a00:1d20::/30", "49544"}, - {"2a12:72c0::/29", "400522"}, - {"2404:bf40:a2c2::/42", "139084"}, - {"2407:9440:2::/41", "141626"}, - {"2607:f3f8::/34", "17378"}, - {"2620:a:d::/48", "36008"}, - {"2804:6254::/32", "269290"}, - {"2001:67c:149c::/48", "44968"}, - {"2402:6d00::/32", "55943"}, - {"2404:f4c0:feff::/48", "139249"}, - {"240a:ad6a::/32", "146084"}, - {"2001:470:bc::/48", "6939"}, - {"2405:6e00:f82e::/48", "133612"}, - {"240a:aa25::/32", "145247"}, - {"240e:97a:2d01::/48", "131325"}, - {"2a03:76e0::/32", "44424"}, - {"2408:8459:8c30::/41", "17622"}, - {"2801:1f0:4026::/41", "3573"}, - {"2804:4fd4::/32", "268352"}, - {"2a02:26f0:5c01::/39", "20940"}, - {"2a02:26f7:c749::/46", "20940"}, - {"2a02:2748::/32", "49779"}, - {"240a:ad77::/32", "146097"}, - {"2600:1419:bc01::/33", "20940"}, - {"2409:8054:18::/48", "9808"}, - {"2605:3380:446b::/48", "12025"}, - {"2a03:d000:8400::/39", "31133"}, - {"2001:388:1031::/45", "7575"}, - {"2001:57a:508::/45", "22773"}, - {"2001:16c0:feff::/29", "31732"}, - {"2a00:15b8::/37", "31122"}, - {"2604:d801::/32", "36372"}, - {"2a02:26f0:9101::/38", "20940"}, - {"2001:559:339::/48", "33659"}, - {"240a:a32c::/32", "143462"}, - {"2602:feb4:2b0::/36", "25961"}, - {"2806:370:8260::/40", "28403"}, - {"240a:a364::/32", "143518"}, - {"2602:ffc8:105::/38", "20278"}, - {"2607:f028::/48", "2158"}, - {"2804:6f48::/32", "270650"}, - {"2a02:26f7:e041::/46", "20940"}, - {"2a0d:cc0::/29", "60501"}, - {"2001:4de0:ac13::/48", "33438"}, - {"2402:9d80:4::/48", "131429"}, - {"2a00:1780:dd00::/34", "8194"}, - {"2a0d:9340:2::/37", "35761"}, - {"2a0e:c886::/44", "208759"}, - {"2001:67c:2050::/48", "199118"}, - {"240e:3bf:2c00::/35", "134774"}, - {"2600:1001:d020::/41", "6167"}, - {"2001:559:8616::/48", "7015"}, - {"2406:840:1110::/48", "139317"}, - {"2804:18::/43", "26599"}, - {"2001:559:35::/48", "33491"}, - {"2620:4d:400f::/43", "62597"}, - {"2a00:4802:2300::/37", "8717"}, - {"2a02:26f7:f481::/46", "20940"}, - {"2a03:fe40::/32", "60793"}, - {"2a0d:3842:1250::/48", "57629"}, - {"240e:3b9:8200::/35", "140316"}, - {"2801:80:2600::/40", "263261"}, - {"2a02:590::/29", "21263"}, - {"2a03:5f80:2:11::/47", "31500"}, - {"2a04:5200:69::/33", "50113"}, - {"2a10:4741:21::/48", "208914"}, - {"2800:484:c00::/40", "10620"}, - {"2a00:1418:8000::/36", "41391"}, - {"2a02:26f7:f405::/46", "20940"}, - {"2a0f:8642:b00b::/48", "212149"}, - {"2001:67c:22e4::/48", "47886"}, - {"2400:8480:1100::/48", "133385"}, - {"2800:bf0:60::/45", "52257"}, - {"2804:8400::/32", "272233"}, - {"2a00:ad04::/30", "41897"}, - {"2a02:2498:8000::/40", "13213"}, - {"240a:a075::/32", "142767"}, - {"240e:44d:1080::/41", "4134"}, - {"2602:ff1d::/36", "31843"}, - {"2800:160:1e07::/43", "14259"}, - {"2804:706c::/32", "270726"}, - {"2a0b:6b84::/44", "200639"}, - {"2001:67c:19c4::/48", "62159"}, - {"2a02:26f7:e085::/46", "20940"}, - {"240e:87c:640::/40", "4134"}, - {"2804:14d:8e00::/40", "28573"}, - {"2804:1b1:e000::/36", "10429"}, - {"2804:7d14::/32", "271537"}, - {"2001:400:211:52::/58", "293"}, - {"2001:559:183::/48", "33652"}, - {"2602:feda:af7::/48", "138919"}, - {"2a11:2e00::/29", "48755"}, - {"2001:559:79f::/48", "7922"}, - {"2408:8956:e900::/40", "17816"}, - {"2603:b0e1::/27", "11796"}, - {"2604:9b00:3c00::/38", "14230"}, - {"2607:f3a0:1a::/35", "23342"}, - {"2803:9800:9024::/43", "11664"}, - {"2001:16d8:b00c::/36", "16150"}, - {"2403:eb40::/32", "138418"}, - {"2407:8100:5::/48", "56308"}, - {"240a:a1d8::/32", "143122"}, - {"2607:a500::/45", "12025"}, - {"2804:75e0::/32", "271075"}, - {"2a02:26f0:c901::/38", "20940"}, - {"2a05:fb47::/32", "208861"}, - {"2001:dce:9401::/40", "23869"}, - {"2001:df0:232::/48", "9355"}, - {"240e:44d:1f00::/41", "140345"}, - {"2600:6c10:ff0e::/42", "20115"}, - {"2607:b380::/32", "19635"}, - {"2803:4a10::/32", "271916"}, - {"2001:559:c232::/48", "33660"}, - {"2607:f428:9330::/41", "40294"}, - {"2620:103:e0f9::/48", "13893"}, - {"2a06:1980::/48", "58321"}, - {"240a:ae9a::/32", "146388"}, - {"2804:24a8::/32", "264236"}, - {"2a02:24d8:ffff::/48", "15945"}, - {"2a0e:5e86::/32", "44176"}, - {"2001:559:8244::/48", "33651"}, - {"2607:f358:22::/45", "18779"}, - {"2800:5d0:214::/36", "52302"}, - {"2001:1440:201::/46", "5401"}, - {"2402:e380:30c::/48", "138351"}, - {"240a:aa44::/32", "145278"}, - {"2803:e340::/32", "264694"}, - {"2804:c00:8100::/34", "52655"}, - {"2a01:620:d000::/34", "12389"}, - {"2a0c:1d00::/43", "39614"}, - {"2a11:b8c0::/29", "204790"}, - {"2001:559:c143::/48", "7015"}, - {"2408:8a05:6002::/32", "17816"}, - {"240a:a8ae::/32", "144872"}, - {"240e:108:2a::/48", "63835"}, - {"2610:b0:40f0::/45", "3573"}, - {"2620:104:6003::/48", "14618"}, - {"2804:2404::/32", "264197"}, - {"2001:67c:920::/48", "62256"}, - {"2401:d800:7700::/42", "7552"}, - {"2402:3bc0::/32", "137225"}, - {"2409:8020:1041::/43", "56046"}, - {"2620:106:e001::/46", "40428"}, - {"2800:40:30::/47", "16814"}, - {"2804:1f54::/32", "272220"}, - {"2804:3de8:e000::/36", "266562"}, - {"2806:2f0:3281::/46", "17072"}, - {"2a05:9f04:25::/40", "210374"}, - {"2001:559:8598::/48", "7922"}, - {"2403:d140::/32", "133187"}, - {"240a:a774::/32", "144558"}, - {"2a02:26f7:3b::/48", "20940"}, - {"2a04:94c0::/30", "202746"}, - {"2a09:4c0:8701::/34", "58057"}, - {"2001:418:1401:5::/62", "2914"}, - {"2001:559:83f9::/48", "7015"}, - {"2405:84c0:fd01::/46", "51089"}, - {"2409:8020:41::/43", "56046"}, - {"2a01:8640:7::/48", "61046"}, - {"2001:559:718::/48", "33657"}, - {"2401:d800:9230::/41", "7552"}, - {"2604:d600:1119::/45", "32098"}, - {"2620:18c::/40", "396507"}, - {"2a0a:d6c0:194::/48", "211447"}, - {"2001:16a0:6001::/31", "39386"}, - {"240e:438:7440::/38", "4134"}, - {"2604:66c0::/32", "6528"}, - {"2804:70f4::/32", "270758"}, - {"2604:cc00:a1::/48", "53292"}, - {"2605:e480::/32", "393398"}, - {"2a03:2480:8033::/48", "200107"}, - {"2a09:1500::/48", "208175"}, - {"2404:b8c0::/32", "55933"}, - {"240a:abcb::/32", "145669"}, - {"2600:40ff:fcfa::/47", "701"}, - {"2620:1d9::/40", "20164"}, - {"2a0c:cb40::/29", "48571"}, - {"2001:448a:3052::/42", "7713"}, - {"2403:300:a17::/42", "714"}, - {"2405:3040::/32", "139370"}, - {"2806:264:5300::/37", "13999"}, - {"2a02:26f7:d348::/48", "36183"}, - {"2001:559:3bf::/48", "33657"}, - {"2001:559:81c4::/47", "7725"}, - {"2804:908:4900::/32", "263047"}, - {"2a01:baa0::/38", "57795"}, - {"2a11:980::/29", "208861"}, - {"2001:df6:780::/48", "141384"}, - {"2402:e380:30e::/48", "138564"}, - {"2600:1407:d801::/34", "20940"}, - {"2606:d380::/32", "7829"}, - {"2804:1dd0::/32", "262332"}, - {"2804:5550::/39", "263067"}, - {"2a01:580::/31", "9136"}, - {"2a02:26f7:e1c8::/48", "36183"}, - {"2a03:5a00:1::/48", "47196"}, - {"2001:678:368::/48", "15935"}, - {"2402:8100:21c8::/45", "55644"}, - {"2404:8d02:3000::/33", "9587"}, - {"240a:a1eb::/32", "143141"}, - {"240e:44d:2000::/42", "140345"}, - {"2602:ffe4:c1f::/42", "21859"}, - {"2804:2968:c000::/34", "264013"}, - {"2a00:1808::/32", "196843"}, - {"2a06:5b40::/29", "59402"}, - {"2001:4e0:1008::/48", "25979"}, - {"2001:559:8065::/48", "33650"}, - {"2001:dc0::/35", "4777"}, - {"2001:1b80::/29", "12912"}, - {"2408:8459:54c0::/38", "17816"}, - {"2600:6c38:10f::/43", "20115"}, - {"2c0f:fdc0::/32", "36930"}, - {"2001:4878:8136::/48", "12222"}, - {"2401:d800:d9c0::/42", "7552"}, - {"240a:a516::/32", "143952"}, - {"2620:12c:f001::/45", "19833"}, - {"2804:1eac::/32", "264443"}, - {"2a02:26f7:f6e2::/47", "20940"}, - {"2a04:ff00:b00b::/48", "200299"}, - {"240e:874::/40", "140638"}, - {"2804:1878:192::/45", "61935"}, - {"2a04:7800::/29", "200697"}, - {"2a0f:607:1500::/48", "210932"}, - {"2001:da8:7021::/44", "24363"}, - {"2804:8180::/32", "272458"}, - {"2001:559:8692::/48", "7922"}, - {"2607:7c00::/32", "21898"}, - {"2607:f990::/32", "16866"}, - {"2804:7af8::/32", "271403"}, - {"2a0e:eac0:2100::/44", "204582"}, - {"2001:44b8:30c9::/46", "7545"}, - {"240a:aa22::/32", "145244"}, - {"2607:fc30:300::/32", "19740"}, - {"2801:15:7000::/48", "269867"}, - {"2803:fbe0:800::/38", "270092"}, - {"2a0e:d602::/32", "50113"}, - {"2001:559:515::/48", "7016"}, - {"2001:559:c526::/44", "7922"}, - {"2400:a300::/32", "18278"}, - {"2402:840:e000::/48", "63646"}, - {"2604:880:4c::/48", "29802"}, - {"2604:a240::/32", "53449"}, - {"2803:2a80:2::/48", "262928"}, - {"2a0e:3040::/32", "49696"}, - {"2001:559:8639::/45", "7015"}, - {"240a:a17b::/32", "143029"}, - {"240a:a30d::/32", "143431"}, - {"2604:d600:154f::/43", "32098"}, - {"2607:f308::/32", "6405"}, - {"2a0b:3080::/43", "206516"}, - {"2001:559:189::/46", "33659"}, - {"2402:800:b340::/42", "7552"}, - {"2405:30c0::/32", "45687"}, - {"2001:1248:5abc::/47", "11172"}, - {"2401:b780:5001::/48", "45410"}, - {"240a:a6cd::/32", "144391"}, - {"2620:171:4a::/45", "715"}, - {"2a02:26f7:f6dd::/46", "20940"}, - {"2c0f:f140::/33", "327700"}, - {"2c0f:f8e8::/32", "37282"}, - {"2001:1618::/32", "15702"}, - {"2400:cb00:a140::/45", "13335"}, - {"2401:3200::/32", "10019"}, - {"2620:20:4000::/48", "32019"}, - {"2803:5440:face::/48", "264738"}, - {"2408:84f3:4840::/38", "17816"}, - {"240e:44d:f80::/41", "4134"}, - {"2001:44b8:3d::/46", "4739"}, - {"2804:5060::/32", "268385"}, - {"2804:784c:8000::/33", "271233"}, - {"2a01:330::/32", "15517"}, - {"2001:559:805c::/48", "33657"}, - {"2a02:560::/32", "13045"}, - {"2806:20d:1a00::/39", "32098"}, - {"2a02:26f7:d4c4::/48", "36183"}, - {"2001:6d0:ffd9::/48", "3316"}, - {"2404:c140:210::/44", "149030"}, - {"2804:2050::/35", "264485"}, - {"2001:908::/30", "8326"}, - {"2001:16e8::/47", "25542"}, - {"2602:807:6005::/48", "399652"}, - {"2804:998:11::/40", "28589"}, - {"2001:559:8269::/48", "33651"}, - {"2400:cb00:470::/46", "13335"}, - {"2602:feda:e36::/48", "147028"}, - {"2607:d00::/32", "14325"}, - {"2804:310:c000::/34", "262688"}, - {"2804:266c::/32", "12989"}, - {"2a00:1c10:40::/44", "50300"}, - {"2a02:26f7:de40::/48", "36183"}, - {"2400:adc7:2000::/39", "9541"}, - {"240a:aa3f::/32", "145273"}, - {"2602:fce1::/48", "395886"}, - {"2804:8068::/32", "271748"}, - {"240e:3b1:1200::/39", "4134"}, - {"2800:160:15aa::/43", "14259"}, - {"2a06:2240::/29", "31726"}, - {"2001:5e0:23::/48", "395394"}, - {"240a:a8b8::/32", "144882"}, - {"2806:230:201d::/48", "11888"}, - {"2001:550:1c01::/39", "174"}, - {"2001:d80::/32", "2687"}, - {"2402:e280:222a::/45", "134674"}, - {"2607:6b80:67::/48", "46562"}, - {"2602:fb9d::/44", "400554"}, - {"2607:a300::/32", "36222"}, - {"2a03:900::/32", "20574"}, - {"2a07:e00:bb::/45", "210083"}, - {"2001:650::/32", "28748"}, - {"240e:983:1603::/40", "4134"}, - {"2600:1005:d170::/34", "22394"}, - {"2800:440:1600::/42", "27738"}, - {"2804:3afc::/32", "266123"}, - {"2a0f:b507::/32", "206313"}, - {"2407:7200::/47", "10098"}, - {"2408:8957:200::/40", "17622"}, - {"240a:abb9::/32", "145651"}, - {"2a00:1288:efc2::/47", "10310"}, - {"2a03:e40::/41", "202042"}, - {"2001:b030:9400::/34", "3462"}, - {"2402:800:7632::/40", "7552"}, - {"2804:4618:2200::/35", "266968"}, - {"2402:800:5155::/42", "7552"}, - {"2804:7b94::/34", "271441"}, - {"2a03:2880:f251::/45", "32934"}, - {"2001:678:bd8::/48", "51895"}, - {"2001:ce0:2901::/32", "3662"}, - {"2400:5740::/32", "23953"}, - {"2804:4bc:4001::/35", "262462"}, - {"2804:243c::/32", "264210"}, - {"2a01:afa0::/32", "47715"}, - {"240a:a8ed::/32", "144935"}, - {"240e:965:9400::/38", "133776"}, - {"2605:a401:8188::/42", "33363"}, - {"2a00:1338::/32", "8878"}, - {"2a00:1390::/32", "34139"}, - {"2a01:4020::/46", "25369"}, - {"2a02:26f7:ba41::/46", "20940"}, - {"2a02:26f7:ec0d::/46", "20940"}, - {"2001:559:c0e3::/48", "33287"}, - {"2001:4d40:8407::/44", "13237"}, - {"2402:800:bb00::/42", "7552"}, - {"2404:bf40:c301::/40", "139084"}, - {"2409:8c85:aa18::/48", "134810"}, - {"2620:30:4000::/48", "1226"}, - {"2804:f58::/32", "28343"}, - {"2804:27f8::/32", "263932"}, - {"2806:2f0:3303::/42", "17072"}, - {"2a02:26f7:bd10::/48", "36183"}, - {"2a03:f300::/29", "47834"}, - {"2001:559:8556::/47", "7015"}, - {"2402:800:9755::/42", "7552"}, - {"2405:2500:25::/46", "136565"}, - {"2806:2f0:99e3::/38", "17072"}, - {"2001:559:8444::/48", "33657"}, - {"240e:44d:4540::/42", "140359"}, - {"2806:230:1308::/37", "265594"}, - {"2a03:e140:34::/48", "43465"}, - {"2001:559:36::/48", "7922"}, - {"2605:4680::/32", "54665"}, - {"2607:5180::/33", "54501"}, - {"2803:a0a0::/40", "266790"}, - {"2804:14d:8400::/40", "28573"}, - {"2804:5640::/35", "267986"}, - {"2a02:d0c0::/31", "39150"}, - {"2001:1250:1000::/44", "22894"}, - {"2400:89c0:6000::/48", "23724"}, - {"2409:8054:55::/44", "56040"}, - {"2600:1406:34::/48", "20940"}, - {"2604:8540:fcc2::/48", "33353"}, - {"2001:5b0:1f00::/40", "6621"}, - {"2403:1480:9000::/36", "49544"}, - {"2408:8957:7200::/40", "17622"}, - {"2a07:8000::/29", "199575"}, - {"2a09:6380::/32", "51269"}, - {"2a0e:3940:d000::/36", "60767"}, - {"2a0e:b107:17f0::/44", "142553"}, - {"2a0f:9e00::/29", "60781"}, - {"2001:67c:910::/48", "209693"}, - {"2405:8f00:edca::/48", "15133"}, - {"240e:3b3:3e00::/33", "140308"}, - {"2600:6c20:118::/47", "20115"}, - {"2001:df0:295::/46", "58516"}, - {"2402:ef30::/30", "7633"}, - {"2804:20fc:601::/46", "264525"}, - {"2a03:b000:400::/40", "42695"}, - {"2a07:4300:972::/48", "209622"}, - {"2a0d:82c7:c::/47", "47787"}, - {"2001:559:8700::/48", "7015"}, - {"2402:8100:26d0::/47", "45271"}, - {"240a:abd9::/32", "145683"}, - {"2404:9540::/48", "24242"}, - {"2409:8054:31::/46", "56040"}, - {"2800:160:144a::/47", "14259"}, - {"2806:2f0:20c2::/48", "17072"}, - {"2a04:4e40:f440::/44", "54113"}, - {"2001:df4:6280::/48", "45553"}, - {"2409:8915:3000::/39", "56044"}, - {"2802:0:1c::/42", "18747"}, - {"2001:df2:ff00::/48", "58537"}, - {"2404:7180:f000::/48", "23848"}, - {"240a:a824::/32", "144734"}, - {"2800:160:1cb2::/44", "14259"}, - {"2803:f0c0::/32", "264773"}, - {"2a02:9b0:28::/33", "35819"}, - {"2a02:26f0:5d::/42", "20940"}, - {"2a0a:e5c0:14::/48", "207996"}, - {"2001:678:8d4::/48", "1205"}, - {"2402:800:7240::/42", "7552"}, - {"2404:2380::/32", "135025"}, - {"2607:ff28:a::/33", "62904"}, - {"2a03:4c40::/32", "197964"}, - {"2001:44b8:3c::/48", "7545"}, - {"2404:f340:8000::/33", "15169"}, - {"2604:7a80:1000::/36", "26548"}, - {"2803:ed40::/32", "264676"}, - {"2804:18:7030::/44", "10429"}, - {"2a00:6780::/29", "57809"}, - {"2a03:2960::/39", "201590"}, - {"2408:8957:c500::/40", "17816"}, - {"240e:183:8103::/40", "4134"}, - {"2602:80e:c002::/45", "198622"}, - {"2606:4700:12::/42", "13335"}, - {"2804:1784:fe03::/43", "263152"}, - {"2001:559:8531::/48", "33491"}, - {"2001:559:c453::/45", "33657"}, - {"2001:678:c64::/48", "207341"}, - {"2001:2000::/48", "3301"}, - {"2405:4802:3190::/42", "18403"}, - {"2600:6c21:60a::/36", "20115"}, - {"2804:48f8::/32", "267156"}, - {"240a:a2c0::/32", "143354"}, - {"2804:2cac:ddde::/34", "265234"}, - {"2804:511c::/32", "268431"}, - {"2001:579:6288::/45", "22773"}, - {"2001:67c:2c70::/48", "9201"}, - {"2001:df0:45d::/48", "132556"}, - {"2001:1b98::/32", "51184"}, - {"2620:13a:c021::/40", "53356"}, - {"2803:2fe0::/32", "271781"}, - {"2a02:2892:32::/48", "51185"}, - {"2a04:1b40::/29", "20861"}, - {"2a05:3400::/29", "200675"}, - {"2a0f:95c0:4000::/34", "208662"}, - {"2001:4478:1313::/40", "4802"}, - {"2403:bf40::/47", "131386"}, - {"2405:10c0::/48", "135905"}, - {"2600:6c38:41c::/41", "20115"}, - {"2804:13dc:ffb0::/41", "262428"}, - {"2a0c:5540:16::/39", "204020"}, - {"240e:438:5a20::/43", "140647"}, - {"2a02:26f7:f4c4::/48", "36183"}, - {"2a05:8880:4::/48", "203589"}, - {"2a06:fd00::/32", "5488"}, - {"2600:c04:1022::/48", "10480"}, - {"2a02:26f7:43::/48", "20940"}, - {"2a02:26f7:cd08::/48", "36183"}, - {"2a10:b4c0::/29", "59852"}, - {"2001:67c:96c::/48", "16095"}, - {"2602:809:9004::/48", "399201"}, - {"2603:c011:a000::/36", "31898"}, - {"2620:13c:1000::/40", "397085"}, - {"2801:bc::/35", "28601"}, - {"2a02:f59::/32", "49409"}, - {"2a07:23c0::/48", "13213"}, - {"2001:559:198::/48", "33652"}, - {"2001:678:47c::/48", "42214"}, - {"2606:8d40::/32", "400209"}, - {"2a02:298::/32", "6908"}, - {"2a0f:7d00::/29", "60781"}, - {"2a12:4940:e710::/35", "211398"}, - {"2001:1248:59b0::/46", "11172"}, - {"240a:a60a::/32", "144196"}, - {"240a:aef7::/32", "146481"}, - {"240e:30d:4a00::/35", "137688"}, - {"2a02:cc40::/29", "2116"}, - {"2401:d800:da20::/41", "7552"}, - {"240e:983:2::/45", "23724"}, - {"2600:2000:3010::/47", "15135"}, - {"2600:6c38:339::/45", "20115"}, - {"2806:230:102d::/48", "11888"}, - {"2a04:2f80::/32", "61157"}, - {"2a07:a342:7000::/36", "56655"}, - {"2001:1388:2f0a::/45", "6147"}, - {"2404:b300:31::/46", "59318"}, - {"240a:a214::/32", "143182"}, - {"2602:fcc6::/36", "394737"}, - {"2804:5418::/32", "268628"}, - {"2a09:bac0:275::/48", "13335"}, - {"2001:559:c201::/48", "7922"}, - {"2409:8020:10a1::/43", "56046"}, - {"2804:45ec::/32", "266955"}, - {"2a05:e40:2400::/29", "59909"}, - {"2001:559:1f4::/48", "33659"}, - {"2a02:26f7:c388::/46", "36183"}, - {"2a04:4e42::/45", "54113"}, - {"2a06:e040:7604::/32", "198507"}, - {"2a0f:e840::/32", "7018"}, - {"2001:da8:a000::/48", "55826"}, - {"2402:5100::/45", "9902"}, - {"2405:7c00:b000::/33", "24028"}, - {"240a:adce::/32", "146184"}, - {"2602:fcd5:10::/47", "399122"}, - {"2804:2bf8::/32", "265185"}, - {"2a02:ff0:600::/40", "12735"}, - {"2408:8956:a600::/40", "17622"}, - {"240e:640:e00::/40", "136197"}, - {"2800:200:e291::/42", "12252"}, - {"2a0a:7d80:9::/48", "35594"}, - {"240a:a90b::/32", "144965"}, - {"2a02:26f7:f045::/46", "20940"}, - {"2001:67c:2994::/48", "62452"}, - {"2600:100f:b1d0::/44", "6167"}, - {"2804:19f8::/32", "61829"}, - {"2806:2f0:8081::/46", "17072"}, - {"2600:1402:6001::/36", "20940"}, - {"2605:a040::/32", "14077"}, - {"2a02:26f7:e3c8::/48", "36183"}, - {"2001:fd8:128::/41", "4775"}, - {"2400:54a0:1010::/48", "34927"}, - {"2401:4900:1d00::/41", "45609"}, - {"240e:60c:7000::/32", "4134"}, - {"2600:1405:2801::/35", "20940"}, - {"240e:438:9040::/38", "4134"}, - {"240e:44d:4980::/41", "4134"}, - {"2600:1f70:6000::/40", "16509"}, - {"2620:124:b000::/47", "32521"}, - {"2800:160:19da::/45", "14259"}, - {"2a04:4e40:1610::/42", "54113"}, - {"2404:e3c0::/32", "134676"}, - {"2800:6d0::/32", "19889"}, - {"2803:7200::/46", "27696"}, - {"2804:9d4:5106::/34", "262996"}, - {"2806:230:3027::/48", "11888"}, - {"2a00:c660::/32", "60341"}, - {"2a0f:e880::/29", "6898"}, - {"2409:8c28:a3c1::/33", "56041"}, - {"2605:cdc0::/48", "398088"}, - {"2804:3f80::/32", "265897"}, - {"2a07:e02:1200::/40", "210083"}, - {"2804:18:7040::/43", "26599"}, - {"2a00:4180:1000::/36", "56665"}, - {"2001:43f8:610::/48", "37419"}, - {"2405:4240:1::/48", "135370"}, - {"2620:a::/48", "36008"}, - {"2620:57:4002::/48", "62831"}, - {"2a02:7900:ff01::/48", "43044"}, - {"2001:67c:20c8::/48", "42836"}, - {"2607:e400::/34", "7459"}, - {"2a02:7d00::/32", "52130"}, - {"2400:f6::/32", "4766"}, - {"2401:4900:4820::/41", "45609"}, - {"2402:800:5b1d::/42", "7552"}, - {"2402:800:9901::/44", "7552"}, - {"2a06:f787:1::/48", "6905"}, - {"2001:250:602f::/48", "23910"}, - {"2001:df3:e500::/48", "135934"}, - {"2604:d600:634::/44", "32098"}, - {"2803:5440:cace::/48", "264738"}, - {"2409:8948:9300::/40", "24445"}, - {"240a:adf9::/32", "146227"}, - {"2a03:e500::/29", "35297"}, - {"2c0f:fec8:9::/41", "37197"}, - {"2607:f858::/44", "4136"}, - {"2a00:1c18:334::/29", "31463"}, - {"2001:da8:212::/47", "23910"}, - {"2408:8957:bf00::/40", "17816"}, - {"2620:10a:801e::/48", "394354"}, - {"2a02:26f7:f689::/46", "20940"}, - {"2001:1bb0::/32", "8342"}, - {"2604:f980:6100::/40", "19957"}, - {"2a09:0:10::/48", "34854"}, - {"2001:579:926c::/40", "22773"}, - {"2001:16a2:82a0::/43", "39386"}, - {"2405:9600::/32", "20940"}, - {"2600:4407:c036::/34", "6130"}, - {"2804:14c:6593::/42", "28573"}, - {"2a03:f80:61::/48", "9009"}, - {"2001:250:6c3a::/45", "23910"}, - {"2402:ef3f::/48", "9430"}, - {"240a:ad84::/32", "146110"}, - {"240e:13:805::/48", "140857"}, - {"2604:3d80:200::/40", "11030"}, - {"2803:e880:8101::/45", "52468"}, - {"2804:7f24::/47", "271669"}, - {"2806:2f0:23e2::/48", "17072"}, - {"2a00:dd8::/48", "31012"}, - {"2a02:aa8::/29", "30892"}, - {"2a02:e980:a0::/45", "19551"}, - {"2a09:6905::/32", "208861"}, - {"2a09:e940::/32", "34762"}, - {"2a0d:4500::/29", "205119"}, - {"2620:171::/48", "715"}, - {"2a03:4bc0:2300::/48", "30893"}, - {"2a04:d3c0::/29", "61155"}, - {"2408:8456:c940::/40", "17816"}, - {"2602:ffc5:108::/48", "20473"}, - {"2605:3380:42fd::/39", "12025"}, - {"2610:b0:40b1::/44", "3573"}, - {"2804:34e8::/32", "265487"}, - {"2001:44b8:10::/46", "7545"}, - {"2401:d800:2950::/42", "7552"}, - {"2405:201:5e00::/34", "55836"}, - {"2406:6940:60::/32", "141047"}, - {"2804:3594::/32", "28240"}, - {"2804:4d94::/32", "268206"}, - {"2a05:8f80::/31", "201722"}, - {"2401:4900:1973::/45", "45609"}, - {"2605:c8c0::/32", "10546"}, - {"2806:230:3029::/48", "11888"}, - {"2a10:cc40:130::/44", "210659"}, - {"2001:559:c430::/48", "33491"}, - {"2406:c00::/32", "45224"}, - {"2607:1280:1170::/44", "394972"}, - {"2800:160:1d47::/44", "14259"}, - {"2a00:1728:2a::/47", "34224"}, - {"2607:f480:9900::/40", "27435"}, - {"2804:14d:448b::/43", "28573"}, - {"2001:678:d2c::/48", "213318"}, - {"2001:4490:fffc::/46", "9829"}, - {"240e:37f:aa00::/39", "140330"}, - {"2620:0:ed0::/48", "22787"}, - {"2804:328::/32", "262868"}, - {"2804:1ae0::/46", "61696"}, - {"2a00:11c0:76::/48", "42473"}, - {"2a0c:6ac0::/32", "213050"}, - {"2401:fd80:9ff::/48", "138177"}, - {"2409:8055:41::/46", "56040"}, - {"2a00:4802:1810::/39", "8717"}, - {"2001:559:8760::/47", "7016"}, - {"2001:559:c11f::/48", "33489"}, - {"2001:559:c20d::/48", "33651"}, - {"2600:1fa0:10c0::/44", "16509"}, - {"2a02:26f7:f840::/48", "36183"}, - {"2a0e:ff40::/29", "207902"}, - {"2001:559:8632::/47", "33651"}, - {"2001:b08:e::/48", "9111"}, - {"2402:1b80:2000::/35", "63956"}, - {"2620:57::/48", "2640"}, - {"2801:1f:2000::/48", "263831"}, - {"2a00:1a60::/32", "15826"}, - {"2a0b:2d40:eeef::/35", "209135"}, - {"240e:3ba:2c00::/35", "134774"}, - {"2600:1406:c801::/37", "20940"}, - {"2804:35f0:5000::/32", "266316"}, - {"2a01:cd00:80f0::/48", "28708"}, - {"2a0e:b107:1910::/47", "211139"}, - {"2001:559:857c::/48", "33659"}, - {"2605:a401:884a::/40", "33363"}, - {"2804:be8::/32", "52841"}, - {"2804:1168:1001::/36", "52904"}, - {"2804:64a8::/32", "269438"}, - {"2a0d:9340::/47", "35761"}, - {"2a0e:b704:4::/48", "210960"}, - {"2001:df0:3840::/48", "149306"}, - {"2804:85e4::/32", "272607"}, - {"2a02:26f7:e98c::/48", "36183"}, - {"2a02:cbf7:101::/32", "61157"}, - {"2402:9e80:58::/48", "139677"}, - {"2403:9800::/47", "4648"}, - {"2607:f110:e410::/42", "21889"}, - {"2801:1c8:300::/48", "14080"}, - {"2a07:3500:19b0::/48", "38915"}, - {"2001:67c:2e5c::/48", "39299"}, - {"2407:c080:1800::/37", "58519"}, - {"2409:8a55:7800::/39", "56040"}, - {"2803:6a0::/32", "266884"}, - {"2001:559:84b4::/48", "33491"}, - {"2407:9d00::/32", "45179"}, - {"2a02:26f7:b845::/46", "20940"}, - {"2a03:2b20:ff::/48", "202077"}, - {"2a10:6747::/44", "210777"}, - {"2001:559:c3f1::/48", "33659"}, - {"2001:44b8:39::/48", "4739"}, - {"240a:a227::/32", "143201"}, - {"2804:314:4011::/45", "61568"}, - {"2001:559:233::/48", "33666"}, - {"2406:f0c0:111::/48", "138654"}, - {"2604:7e00:32::/41", "17378"}, - {"2800:160:1315::/46", "14259"}, - {"2800:310:400::/45", "18678"}, - {"2804:1b10::/32", "61706"}, - {"2a02:26f7:f184::/48", "36183"}, - {"2402:800:3801::/44", "7552"}, - {"2a01:5940::/35", "31034"}, - {"2001:559:82fa::/48", "7015"}, - {"2401:df00::/31", "17916"}, - {"2605:6c80:7::/44", "397373"}, - {"2a02:71a0::/32", "60003"}, - {"2a0c:6380::/29", "24971"}, - {"2001:67c:1b6c::/48", "8767"}, - {"2803:4c60:8::/32", "267845"}, - {"2806:2f0:90a2::/45", "17072"}, - {"2401:4900:38c0::/44", "45609"}, - {"2403:e200:14::/44", "45543"}, - {"2404:3d00:4106::/44", "21433"}, - {"2405:d200::/32", "2907"}, - {"2804:54e0::/32", "268675"}, - {"2a01:9b40::/32", "59554"}, - {"2001:250:5820::/46", "138371"}, - {"2001:df3:7600::/48", "132060"}, - {"2001:1978:803::/48", "54002"}, - {"2800:160:1e93::/45", "14259"}, - {"2804:178c::/32", "263154"}, - {"2804:2e98::/32", "265354"}, - {"2a02:26f0:36::/48", "34164"}, - {"2a0e:97c0:390::/44", "211437"}, - {"2a0f:e6c1::/32", "60781"}, - {"2607:f038:2:1::/44", "21527"}, - {"2406:4a00:1100::/48", "56038"}, - {"240a:a2a2::/32", "143324"}, - {"240e:3bc:1800::/34", "4134"}, - {"2804:3844::/32", "266457"}, - {"2001:df1:bf00::/48", "136773"}, - {"2401:3cc0:201::/37", "137409"}, - {"2600:1480:580e::/37", "20940"}, - {"2607:e300::/32", "40948"}, - {"2607:f1c0:100::/32", "8560"}, - {"2607:fb90:9200::/34", "21928"}, - {"2a0d:d1c0::/32", "209582"}, - {"2001:16a2:c000::/40", "39891"}, - {"240a:adf6::/32", "146224"}, - {"2801:80:810::/48", "263662"}, - {"2804:68d0::/32", "269718"}, - {"2a02:26f0:7d01::/40", "20940"}, - {"2001:559:57e::/48", "33650"}, - {"2001:db0:2800::/35", "17766"}, - {"2405:1e00:ff01::/40", "17771"}, - {"240e:bc0::/21", "4134"}, - {"2607:6b80:38::/48", "9009"}, - {"2803:e600:bc00::/33", "18809"}, - {"2a01:8840:86::/44", "12041"}, - {"2001:559:3f6::/47", "7922"}, - {"2001:559:833c::/48", "33651"}, - {"2402:7d80:7778::/32", "63582"}, - {"2409:896a:8e00::/39", "9808"}, - {"240a:aec4::/32", "146430"}, - {"240e:967:ca00::/39", "133776"}, - {"2607:a800:773::/48", "15695"}, - {"2a02:2148::/31", "1241"}, - {"2a0b:8100::/44", "51559"}, - {"2402:800:37ee::/43", "7552"}, - {"2600:1407:a801::/37", "20940"}, - {"2804:61d0::/32", "269258"}, - {"2a01:41c0::/32", "199092"}, - {"2600:1419:4201::/37", "20940"}, - {"2804:365c::/32", "266343"}, - {"2a01:aa00::/32", "34144"}, - {"2001:559:813f::/48", "20214"}, - {"2001:16b8::/36", "8881"}, - {"240a:a0fb::/32", "142901"}, - {"2600:6c10:64::/46", "20115"}, - {"2604:5500:c000::/34", "19165"}, - {"2a00:1eb8:4000::/35", "8764"}, - {"2a0f:6780::/29", "20766"}, - {"2408:8306::/28", "4808"}, - {"2602:808:1::/46", "25948"}, - {"2a04:2f81:2::/47", "61157"}, - {"2a09:bac0:83::/45", "13335"}, - {"2402:800:3b1d::/42", "7552"}, - {"240e:979:f00::/40", "138950"}, - {"2604:26c0:500::/40", "36815"}, - {"2608:129:b::/48", "27064"}, - {"2a02:26f7:bec5::/46", "20940"}, - {"2001:559:c170::/48", "13367"}, - {"2001:af0::/32", "13036"}, - {"2001:df6:180::/55", "141731"}, - {"2403:a200:999a::/34", "17428"}, - {"2405:203:89b::/45", "55836"}, - {"240a:a750::/32", "144522"}, - {"2620:16d:3000::/32", "7862"}, - {"2a0c:b1c0::/32", "202090"}, - {"2001:500:6d::/46", "30133"}, - {"2620:171:8::/48", "42"}, - {"2803:f420::/32", "265827"}, - {"2600:1001:b0e0::/43", "22394"}, - {"2804:1838::/32", "61925"}, - {"2a00:4802:4a00::/42", "13124"}, - {"2a05:26c0:d2::/29", "201536"}, - {"2405:55c0::/42", "63991"}, - {"2a0f:4200::/29", "207614"}, - {"2404:3d80:400::/32", "61138"}, - {"2800:160:226e::/47", "14259"}, - {"2804:4bb4:200::/39", "267325"}, - {"2804:5930::/32", "268174"}, - {"2806:20d:1601::/45", "32098"}, - {"2a00:b1e0:f001::/48", "60497"}, - {"2400:a040:a::/48", "137995"}, - {"2404:aac0::/32", "131642"}, - {"2405:3c00::/32", "24437"}, - {"2405:6400:4000::/36", "45121"}, - {"2801:14e:1::/45", "27951"}, - {"2804:74b8::/32", "270999"}, - {"2a02:730:4000::/48", "42371"}, - {"2a02:ee80:4176::/47", "2856"}, - {"2a0e:97c0:252::/44", "211685"}, - {"2001:da8:a800::/46", "24370"}, - {"2001:40a0::/32", "8607"}, - {"240e:3b0:9c00::/34", "140310"}, - {"2604:cc00:c::/47", "53292"}, - {"2605:2c40:100::/48", "7979"}, - {"2001:559:8172::/45", "7922"}, - {"2001:1aeb::/29", "13036"}, - {"2401:e900:1000::/48", "23991"}, - {"2620:0:a16::/48", "71"}, - {"2804:5550:facf::/37", "263067"}, - {"2001:1248:8720::/46", "11172"}, - {"2402:800:b370::/40", "7552"}, - {"2403:3d00::/32", "133720"}, - {"2404:bc0:4300::/44", "137735"}, - {"240e:6b0::/36", "134773"}, - {"2607:f428:9111::/48", "19115"}, - {"2a0f:5707:ab26::/48", "41108"}, - {"2c0f:fe90::/32", "36943"}, - {"2403:4940::/32", "135217"}, - {"2605:3380:42f0::/48", "12025"}, - {"2a00:1ba8::/32", "57653"}, - {"2a00:b4c0::/32", "47764"}, - {"2a02:2430:4::/48", "39869"}, - {"2a02:ac80:21::/43", "25145"}, - {"2001:df7:d80::/48", "138754"}, - {"2001:44b8:4001::/42", "4739"}, - {"2401:4d44::/30", "131925"}, - {"2405:6e00:2490::/41", "18291"}, - {"2804:30b8:ac::/43", "28154"}, - {"2804:3ff4::/32", "265924"}, - {"2a02:ca8::/32", "44981"}, - {"2a0e:2c80::/29", "24940"}, - {"2001:559:c3b0::/48", "33657"}, - {"2409:8e4c::/30", "9808"}, - {"240b:4003:1bf::/48", "45102"}, - {"2603:f3b0::/25", "397165"}, - {"2001:df0:213::/48", "17477"}, - {"2001:13b0:9002::/33", "3549"}, - {"2404:bf40:8140::/48", "2764"}, - {"240a:a152::/32", "142988"}, - {"2804:20d8::/32", "264516"}, - {"2a02:26f7:ec5c::/48", "36183"}, - {"2a0e:97c3:4f9::/48", "20473"}, - {"2a02:26f7:54::/48", "36183"}, - {"2a07:ca80::/29", "34762"}, - {"2a11:d540:530::/44", "207586"}, - {"2620:112:d000::/44", "11297"}, - {"2803:e880::/32", "52468"}, - {"2804:43e8::/32", "267598"}, - {"2806:20d:1d18::/46", "32098"}, - {"2a00:e7a0:4::/47", "204167"}, - {"2001:5e0:24::/32", "16713"}, - {"240a:ae8d::/32", "146375"}, - {"2804:da8::/32", "262605"}, - {"2804:1478::/32", "263332"}, - {"2804:489c::/32", "267133"}, - {"2804:73a0::/32", "270927"}, - {"2a02:28b0::/31", "51790"}, - {"2001:559:8422::/48", "22909"}, - {"2001:559:c45f::/42", "21508"}, - {"2408:8956:e400::/40", "17622"}, - {"2409:8027:2c0a::/32", "9808"}, - {"240e:e9:b800::/33", "23650"}, - {"2600:370f:726e::/40", "32261"}, - {"2607:fda8::/32", "6128"}, - {"2a02:ae0::/32", "8375"}, - {"2a12:7440::/29", "400522"}, - {"2001:559:5d0::/48", "7725"}, - {"2400:5900::/32", "18021"}, - {"2407:f800::/38", "38182"}, - {"240e:3b4:1200::/39", "4134"}, - {"2600:1419:7401::/36", "20940"}, - {"2800:590:206c::/48", "16629"}, - {"2a01:8840:1d::/48", "207266"}, - {"2a0f:5707:aad0::/47", "212591"}, - {"2409:8087:2095::/37", "56046"}, - {"2409:8c62:e20::/39", "9808"}, - {"2602:ff8d:1::/48", "14744"}, - {"2606:2800:5140::/48", "15133"}, - {"2607:fed0::/32", "40076"}, - {"2806:2f0:61e3::/38", "17072"}, - {"2a00:ad07:4000::/32", "41897"}, - {"2001:559:8349::/48", "33490"}, - {"2001:67c:960::/48", "212774"}, - {"2404:2440:f0f0::/48", "138521"}, - {"2a05:c4c0::/29", "48635"}, - {"2a0c:a780::/31", "200748"}, - {"2a10:8f00::/29", "39018"}, - {"240a:aa20::/32", "145242"}, - {"2610:a1:1014::/48", "397226"}, - {"2800:160:1386::/43", "14259"}, - {"2804:5a58::/32", "268767"}, - {"2001:559:864d::/48", "7015"}, - {"2606:ae00:bd31::/41", "7287"}, - {"2a03:4260::/29", "201476"}, - {"2409:8028:3800::/40", "56041"}, - {"2803:88e0::/32", "269868"}, - {"2806:2f0:10a0::/48", "22884"}, - {"2001:428:1004::/34", "209"}, - {"2001:67c:1b60::/48", "13040"}, - {"2402:9e80:24::/48", "137219"}, - {"2408:8459:2e50::/35", "17816"}, - {"240e:3b1:2800::/38", "4134"}, - {"2804:404c:67::/35", "265950"}, - {"2804:5b8c::/32", "268854"}, - {"2a03:4b27:e000::/36", "200491"}, - {"2a05:e1c0::/29", "50673"}, - {"2405:1c0:6511::/45", "55303"}, - {"2409:8089::/35", "9808"}, - {"2804:3ab4::/33", "266104"}, - {"2804:5eb0:2000::/32", "269050"}, - {"2a02:26f7:101::/45", "20940"}, - {"2a03:5343::/43", "28723"}, - {"2a04:9a02:1000::/36", "42894"}, - {"2001:559:7f9::/48", "33491"}, - {"2001:678:1c8::/48", "47543"}, - {"2001:67c:61c::/48", "200943"}, - {"2602:fc8e::/40", "399522"}, - {"2800:160:2048::/46", "14259"}, - {"2803:8600::/32", "27759"}, - {"2a02:7f84::/30", "56510"}, - {"2a04:3e00::/47", "56910"}, - {"2001:559:c2b4::/48", "7922"}, - {"2405:9800:9804::/47", "45430"}, - {"2406:4440:f20::/40", "38008"}, - {"2408:8256:3b89::/48", "17816"}, - {"240c:4082::/28", "38365"}, - {"240e:44d:1380::/41", "4134"}, - {"2607:fb10:17::/42", "2906"}, - {"2804:3f10:8201::/33", "262566"}, - {"2804:5534:d000::/37", "268696"}, - {"2a00:6901:c005::/48", "20926"}, - {"2a02:26f7:ed::/48", "20940"}, - {"2600:3c00::/29", "63949"}, - {"2804:91c::/32", "52877"}, - {"2a0c:3e00::/29", "49601"}, - {"2001:550:1906::/38", "174"}, - {"2001:559:83e8::/48", "7922"}, - {"2605:e740:300::/40", "174"}, - {"2803:fbe0:300::/46", "270092"}, - {"2605:3b80:11::/48", "9009"}, - {"2806:2e1::/32", "265505"}, - {"2a10:cc47:100::/40", "39282"}, - {"2001:250:7816::/48", "23910"}, - {"2401:4900:5f70::/44", "45609"}, - {"2402:680::/32", "24213"}, - {"2404:4300::/32", "9930"}, - {"2c0f::/32", "328001"}, - {"2605:4500::/32", "46636"}, - {"2804:81d0::/32", "272478"}, - {"2a02:ab8::/32", "48943"}, - {"2a05:3484:272::/48", "20655"}, - {"2001:c20:c847::/48", "9255"}, - {"2a01:750:2::/32", "6702"}, - {"2a02:26f7:be8c::/48", "36183"}, - {"2402:d1c0::/32", "137816"}, - {"240a:a174::/32", "143022"}, - {"240e:45c::/40", "131285"}, - {"2804:4ec:1700::/32", "28668"}, - {"2001:67c:2d7c::/48", "12859"}, - {"240a:a3f5::/32", "143663"}, - {"2804:29c0:c000::/34", "264032"}, - {"2a00:ff0:8888::/48", "12672"}, - {"2a01:288:4004::/48", "42794"}, - {"2a02:26f7:3d::/48", "20940"}, - {"2a03:5fe0::/30", "43191"}, - {"2a0a:9300:aaaa::/48", "207569"}, - {"2c0f:f6d0:c2::/39", "327687"}, - {"2001:5000:b04::/37", "1273"}, - {"2602:fe34::/36", "397095"}, - {"2604:eb40:6::/48", "6233"}, - {"2a0c:cd00::/32", "41913"}, - {"2001:470:11c::/48", "7175"}, - {"2407:1400:8a::/32", "23752"}, - {"2604:d600:132f::/43", "32098"}, - {"2a02:b90::/32", "16082"}, - {"2602:ff7f::/32", "7219"}, - {"2804:1398::/47", "263541"}, - {"2a00:9e00::/32", "25220"}, - {"2001:559:8246::/48", "33491"}, - {"2401:d800:f7e0::/36", "7552"}, - {"2406:e002:5000::/29", "23655"}, - {"2600:1480:8100::/37", "20940"}, - {"2600:3000:1b05::/34", "13649"}, - {"2804:908:a00::/33", "263047"}, - {"2804:35a0::/32", "266297"}, - {"2a0c:4dc0:1::/48", "47945"}, - {"2409:8087:4500::/36", "9808"}, - {"240a:a6ad::/32", "144359"}, - {"240a:afb5::/32", "146671"}, - {"240e:679:c600::/34", "4134"}, - {"2401:d800:5970::/40", "7552"}, - {"2409:806a:81a::/40", "9808"}, - {"2605:f080::/40", "29869"}, - {"2607:f038:aaad::/33", "21527"}, - {"2001:250:507a::/38", "23910"}, - {"240a:a6e9::/32", "144419"}, - {"2600:1417:3::/45", "20940"}, - {"2804:7940::/32", "271294"}, - {"2a04:6c80::/48", "6718"}, - {"2a10:6300::/29", "399975"}, - {"2001:559:c3ab::/48", "7015"}, - {"2404:8000:16::/42", "17451"}, - {"2804:2ae4:4000::/36", "13878"}, - {"2804:371c:8000::/48", "266390"}, - {"2a04:4940::/29", "60278"}, - {"2001:1248:a4d4::/47", "11172"}, - {"240a:a908::/32", "144962"}, - {"2604:af40::/32", "14099"}, - {"2606:6280::/32", "31914"}, - {"2607:f870::/47", "11992"}, - {"2801:1fe::/40", "19429"}, - {"2a02:b50:8003::/34", "48910"}, - {"2001:559:c29a::/48", "7922"}, - {"240e:37d:ac00::/33", "4134"}, - {"2602:ffa5::/40", "20141"}, - {"2804:6118::/32", "269212"}, - {"2a00:4802:3b0::/36", "8717"}, - {"2403:75c0::/32", "136716"}, - {"2600:5c00::/39", "10838"}, - {"2602:fcc3:ab0::/48", "399135"}, - {"2800:440:186::/48", "27738"}, - {"2803:2a80:800::/48", "262928"}, - {"2a0f:9400:7244::/48", "213163"}, - {"2401:d800:7100::/42", "7552"}, - {"2402:800:5a63::/43", "7552"}, - {"2602:fc23:11c::/46", "8095"}, - {"2607:f6f0:7001::/48", "394749"}, - {"2620:60:8000::/44", "22953"}, - {"2620:149:a13::/48", "714"}, - {"2a07:dd00::/32", "39485"}, - {"2401:d800:7500::/42", "7552"}, - {"240a:ac59::/32", "145811"}, - {"240e:3c0::/21", "4134"}, - {"2602:fdd5::/36", "30685"}, - {"2607:f4d0:a00::/32", "17054"}, - {"2620:11d:3000::/44", "7872"}, - {"2804:3608::/32", "266322"}, - {"2a02:2790::/32", "51796"}, - {"2001:559:549::/48", "33651"}, - {"2408:8256:3194::/48", "17816"}, - {"2409:8904:a540::/38", "24547"}, - {"2600:6c20:a1f::/40", "20115"}, - {"2806:342:fa00::/37", "265591"}, - {"2403:1940:1000::/34", "137935"}, - {"240a:ad32::/32", "146028"}, - {"2804:b18:8d00::/38", "52941"}, - {"2804:3ae4::/32", "266116"}, - {"2a01:666:100::/37", "48951"}, - {"2a02:26f7:be::/48", "36183"}, - {"2a02:2e02:1c00::/43", "12479"}, - {"2a0d:1d00::/29", "212974"}, - {"2001:428:3808::/33", "209"}, - {"2a00:1098::/32", "44684"}, - {"2a00:86c0:2008::/47", "40027"}, - {"2a03:7900::/37", "197731"}, - {"2001:44b8:4047::/48", "4739"}, - {"2401:b00:f000::/36", "17564"}, - {"2600:1480:5100::/36", "20940"}, - {"2a00:66a0::/35", "199270"}, - {"2a01:498:8600::/33", "42018"}, - {"2a03:7020:10::/48", "59625"}, - {"2a0c:f840::/29", "28716"}, - {"2c0f:fa18::/32", "36884"}, - {"2402:4e00:d020::/34", "45090"}, - {"240a:a5eb::/32", "144165"}, - {"240a:aed9::/32", "146451"}, - {"240e:982:3000::/39", "137693"}, - {"2602:fc16:1::/48", "203380"}, - {"2607:fc48:c48::/48", "40009"}, - {"2603:c0f0::/39", "6142"}, - {"2606:5b40::/32", "399821"}, - {"2001:67c:454::/48", "62083"}, - {"2001:ab7::/34", "15594"}, - {"2404:138:4005::/43", "38022"}, - {"2404:bf40:8480::/48", "7545"}, - {"240a:aa12::/32", "145228"}, - {"240e:44d:7f00::/41", "140345"}, - {"2600:1419:6001::/38", "20940"}, - {"2606:ae00:64f8::/36", "7287"}, - {"2620:58:4c00::/48", "6122"}, - {"2804:1e00::/32", "52566"}, - {"2a02:38::/35", "6881"}, - {"2001:c20:488b::/45", "9255"}, - {"2405:1c0:6761::/45", "55303"}, - {"240a:a0fc::/32", "142902"}, - {"240a:acb0::/32", "145898"}, - {"2600:9000:1092::/45", "16509"}, - {"2a00:c98::/34", "28753"}, - {"2a02:26f7:c404::/48", "36183"}, - {"2a0a:2c00::/29", "48506"}, - {"2a0b:e43:1::/48", "205809"}, - {"240a:a356::/32", "143504"}, - {"2602:ffc5:168::/47", "211169"}, - {"2804:204:25b::/42", "28186"}, - {"240a:ab85::/32", "145599"}, - {"2600:6c10:f842::/44", "20115"}, - {"2801:80:3500::/47", "268830"}, - {"2804:4310::/32", "267546"}, - {"2a02:ac80:f01::/35", "25145"}, - {"2a03:5180::/43", "3223"}, - {"2a09:9d40::/48", "44364"}, - {"2001:559:c3a9::/48", "7015"}, - {"240e:44d:3f00::/41", "140345"}, - {"2607:f4a0::/37", "11272"}, - {"2a07:6480::/29", "202812"}, - {"2407:8c0::/32", "134858"}, - {"2600:1405:4001::/35", "20940"}, - {"2a0f:1e00:abc::/48", "30633"}, - {"2001:468:501::/48", "104"}, - {"240a:a2da::/32", "143380"}, - {"2a01:a440:2::/48", "51297"}, - {"2001:7f8:e4::/48", "43431"}, - {"240a:af51::/32", "146571"}, - {"2803:9800:7080::/32", "11664"}, - {"2401:c240:5100::/34", "132847"}, - {"2402:a000::/32", "24211"}, - {"2408:8459:7410::/42", "17623"}, - {"240a:a4d7::/32", "143889"}, - {"2607:f498::/32", "10835"}, - {"2800:160:2531::/40", "14259"}, - {"2a0f:9400:8010::/48", "207393"}, - {"2001:528::/32", "46742"}, - {"2001:df0:bd::/48", "147171"}, - {"2001:df6:1800::/48", "131755"}, - {"2001:19f8::/38", "4927"}, - {"2406:ef40:5::/46", "133811"}, - {"2605:9d80:8021::/48", "4134"}, - {"2a01:8640:9::/48", "42708"}, - {"2a0a:6680:bee::/48", "203500"}, - {"2001:559:2cf::/48", "20214"}, - {"2402:800:96c5::/42", "7552"}, - {"2408:84f3:4240::/37", "17816"}, - {"2a01:64e0::/32", "212144"}, - {"2a04:3f83:4a::/29", "9120"}, - {"2001:559:c1a4::/48", "33287"}, - {"2001:df2:f100::/48", "136862"}, - {"2001:1248:a411::/44", "11172"}, - {"2401:9100::/32", "45918"}, - {"2402:e280:220b::/45", "134674"}, - {"2620:104:a000::/44", "26008"}, - {"2804:28a0::/32", "263971"}, - {"2001:ac8:53::/42", "9009"}, - {"2001:da8:226::/44", "23910"}, - {"2804:533c::/32", "268571"}, - {"2a02:ff0:1200::/40", "12735"}, - {"2a0b:2300::/32", "30962"}, - {"2c0f:5400:1::/48", "328799"}, - {"2001:fd8:168::/40", "4775"}, - {"2402:800:58e0::/44", "7552"}, - {"2a06:9a40:1::/48", "8948"}, - {"2a07:9947::/32", "58305"}, - {"2a10:e7c0::/29", "211423"}, - {"2408:872b:400::/46", "139007"}, - {"2600:1014:f100::/44", "6167"}, - {"2606:340::/32", "398913"}, - {"2804:2c10::/32", "265192"}, - {"2a02:26f7:ddc4::/48", "36183"}, - {"2a07:aa00:2::/48", "3356"}, - {"2602:feda:f010::/44", "147048"}, - {"2606:65c0:20::/48", "399804"}, - {"2a02:26f7:d4ca::/47", "20940"}, - {"2001:559:83ae::/48", "7015"}, - {"2404:f880::/32", "135386"}, - {"2800:bf0:3600::/48", "52257"}, - {"2804:3cb0::/32", "266229"}, - {"2804:6200::/32", "269270"}, - {"2a0f:ea40::/32", "41108"}, - {"2605:a401:8b8e::/42", "33363"}, - {"2a02:26f7:c081::/46", "20940"}, - {"2a07:7f40::/29", "39500"}, - {"2a0c:b641:2da::/48", "209449"}, - {"2001:12f0:a40::/39", "1916"}, - {"240e:90d:f000::/37", "137688"}, - {"2a02:2b60:103::/38", "42947"}, - {"2001:df0:2ca::/48", "17944"}, - {"240a:a863::/32", "144797"}, - {"2804:5964::/32", "268187"}, - {"2806:370:54c0::/43", "28403"}, - {"2a02:2ab0:502::/48", "33442"}, - {"240a:a5f6::/32", "144176"}, - {"240a:af44::/32", "146558"}, - {"2607:7c80:55::/48", "7034"}, - {"2001:559:864e::/48", "33651"}, - {"2602:fc0d::/36", "400181"}, - {"2804:1dfc::/32", "262765"}, - {"2a0b:5740::/29", "205671"}, - {"2402:79c0:100::/44", "7342"}, - {"2a01:ac80::/32", "15958"}, - {"2600:d0d:4000::/30", "20161"}, - {"2804:2e1c::/32", "265324"}, - {"2001:678:558::/48", "50472"}, - {"2401:d800:70c2::/42", "7552"}, - {"2401:d800:98c0::/42", "7552"}, - {"2804:5e48::/33", "269023"}, - {"2a02:e30:f030::/48", "199410"}, - {"2a06:8143:9d9d::/48", "199364"}, - {"2001:d30:4::/32", "4717"}, - {"2a02:1200::/27", "3303"}, - {"2600:1fa0:c0c0::/44", "16509"}, - {"2801:1b:e800::/48", "271940"}, - {"2804:14c:3ba5::/46", "28573"}, - {"2a06:e881:102::/48", "202959"}, - {"2001:1250:bc00::/44", "22894"}, - {"240a:a243::/32", "143229"}, - {"2602:800:900e::/48", "40528"}, - {"2800:550:2a::/48", "20940"}, - {"2603:c0e2::/35", "54253"}, - {"2409:8914:8600::/39", "56044"}, - {"2600:6c39:505::/44", "20115"}, - {"2600:9000:11ba::/47", "16509"}, - {"2603:f170::/24", "397165"}, - {"2a0e:fe80::/48", "47447"}, - {"240a:ade9::/32", "146211"}, - {"2600:380:9600::/39", "7018"}, - {"2602:107:2310::/48", "20115"}, - {"2801:14:4800::/48", "19429"}, - {"2001:df2:6880::/48", "139892"}, - {"240a:a569::/32", "144035"}, - {"2607:fc48:c08::/48", "40009"}, - {"2620:138:3010::/48", "23344"}, - {"2804:1a04::/45", "61832"}, - {"2806:230:600b::/48", "11888"}, - {"2a05:8380::/29", "43645"}, - {"2a12:8d00::/29", "57695"}, - {"2001:5f8:7f07::/44", "5056"}, - {"2a02:26f7:dd44::/48", "36183"}, - {"2a0d:e380::/47", "204460"}, - {"2001:67c:1c::/48", "41884"}, - {"2401:d800:9ad0::/42", "7552"}, - {"2407:1500:20::/48", "58752"}, - {"2409:803c:3100::/37", "9808"}, - {"2800:440:3::/44", "27738"}, - {"2a00:bc40::/32", "198731"}, - {"2a09:3a00:3000::/40", "49981"}, - {"2a0c:a500::/41", "209385"}, - {"2001:678:8a0::/48", "6453"}, - {"2409:8000:1900::/37", "9808"}, - {"2600:1406:bc01::/33", "20940"}, - {"2804:12f8::/32", "263507"}, - {"2a00:1248::/33", "3216"}, - {"2001:559:832a::/48", "33657"}, - {"2607:ce80::/32", "23523"}, - {"2800:bf0:810a::/43", "27947"}, - {"2a05:a880:de10::/48", "20765"}, - {"2001:da8:c80f::/37", "23910"}, - {"2400:e440:400::/41", "42382"}, - {"2403:6d00:cd::/46", "56094"}, - {"2a0b:3dc0::/32", "43359"}, - {"2a0e:b107:1980::/48", "138517"}, - {"2001:4888:a609::/45", "6167"}, - {"2602:ff84:10::/46", "36351"}, - {"2605:bb00:b000::/36", "4213"}, - {"2606:ae00:61c0::/38", "7287"}, - {"2804:3ff0::/32", "265923"}, - {"2a02:730:2000::/48", "33947"}, - {"2a09:5a00::/29", "204760"}, - {"2a11:9a00::/29", "204790"}, - {"2001:559:85ce::/48", "7922"}, - {"2409:8c30:1310::/29", "9808"}, - {"2606:7100:3010::/40", "21581"}, - {"2607:3a80:26::/32", "395100"}, - {"2804:2724::/39", "263879"}, - {"2a12:a5c0::/29", "400522"}, - {"2001:dd8:14::/47", "30133"}, - {"2001:1248:5f78::/40", "11172"}, - {"2409:8904:d240::/42", "24547"}, - {"2604:d600:1214::/47", "32098"}, - {"2620:11c:a000::/47", "26021"}, - {"2600:3402:1100::/37", "4181"}, - {"2a00:1560:17::/44", "29684"}, - {"2a06:5040:5::/48", "4785"}, - {"2404:f4c0:f50f::/48", "134666"}, - {"2408:8956:c000::/40", "17622"}, - {"2803:5c80:6595::/48", "64114"}, - {"2a02:26f7:c248::/48", "36183"}, - {"2001:559:5e7::/48", "33650"}, - {"2400:adda:2000::/31", "9541"}, - {"2604:d600:22::/43", "32098"}, - {"2607:f790:fff7::/44", "12129"}, - {"2001:44b8:4036::/44", "4739"}, - {"2001:4868:905::/48", "7046"}, - {"2400:fc00:4060::/40", "45773"}, - {"2408:877e::/32", "133119"}, - {"2803:8500::/32", "27987"}, - {"2804:12bc::/32", "263495"}, - {"2001:268:852::/32", "2516"}, - {"2001:ac8:80::/45", "9009"}, - {"2400:9800:6026::/47", "139994"}, - {"2402:d400:6::/44", "17762"}, - {"2409:8924:8100::/38", "56046"}, - {"240e:109:8025::/48", "134756"}, - {"2804:5504::/32", "268684"}, - {"2401:8500::/32", "55350"}, - {"2600:1408:9001::/38", "20940"}, - {"2602:ff39::/40", "63318"}, - {"2801:80:720::/48", "263559"}, - {"2603:6037::/32", "11955"}, - {"2607:fef8:ffe4::/48", "18598"}, - {"2a02:ca0::/32", "8587"}, - {"2a02:24e8::/29", "21040"}, - {"2a02:26f7:c4::/48", "36183"}, - {"2001:ee0:c940::/38", "45899"}, - {"2402:800:3101::/44", "7552"}, - {"2408:8256:379b::/48", "17816"}, - {"2c0f:6400::/32", "37088"}, - {"2001:428:c0d::/35", "209"}, - {"2404:bf00::/40", "9303"}, - {"2607:8880::/32", "31798"}, - {"2a09:407:d000::/36", "208861"}, - {"2a0c:ed80::/29", "34191"}, - {"2804:2ea8::/32", "262642"}, - {"2001:250:340e::/47", "138438"}, - {"2001:559:277::/48", "7016"}, - {"2600:1409:4::/46", "35994"}, - {"2408:842a::/29", "4837"}, - {"240a:aace::/32", "145416"}, - {"2600:40f0:110::/42", "701"}, - {"2a02:fae0::/29", "58193"}, - {"2408:8256:3d9b::/48", "17816"}, - {"240e:438:840::/38", "4134"}, - {"2605:b340::/32", "16713"}, - {"2a10:1680::/32", "47935"}, - {"2001:250:6008::/48", "23910"}, - {"2001:678:ce8::/48", "60557"}, - {"2405:1c0:6831::/45", "55303"}, - {"2804:14c:a900::/40", "28573"}, - {"2a00:4800:f0::/39", "8717"}, - {"2a07:8dc0::/31", "35661"}, - {"2406:3001:20:7::/60", "4657"}, - {"2408:8206:84c0::/39", "4808"}, - {"2620:137:e000::/44", "53758"}, - {"2804:18:18f8::/37", "26599"}, - {"2a02:26f7:d800::/48", "36183"}, - {"2001:468:100::/40", "11317"}, - {"240a:a352::/32", "143500"}, - {"2806:230:4029::/48", "11888"}, - {"2a02:26f0:10d::/46", "20940"}, - {"240e:105:f000::/37", "4134"}, - {"2a02:26f0:eb::/45", "20940"}, - {"2a02:2e02:8680::/42", "12479"}, - {"2a0e:b107:f50::/44", "212270"}, - {"2a0f:8040::/29", "6735"}, - {"2001:559:7c0::/48", "33650"}, - {"240a:a540::/32", "143994"}, - {"2800:bf0:82c0::/48", "52257"}, - {"2804:7110:4100::/35", "270764"}, - {"2806:21b:2::/32", "19332"}, - {"2600:9000:10cb::/48", "16509"}, - {"2804:e30:b800::/37", "11338"}, - {"2a11:7a80::/29", "204790"}, - {"2001:16a2:38::/47", "39386"}, - {"2400:7400:66::/44", "38044"}, - {"2602:105::/32", "33588"}, - {"2604:3d00:dc00::/34", "6327"}, - {"2804:1e50::/32", "264421"}, - {"2a05:687:1::/32", "201597"}, - {"240a:a1d6::/32", "143120"}, - {"240e:108:1183::/45", "133775"}, - {"2a02:aa00::/27", "6830"}, - {"2001:559:7c8::/48", "33666"}, - {"2605:5880::/48", "26167"}, - {"2401:d800:d8d0::/42", "7552"}, - {"2a02:26f7:cc49::/42", "20940"}, - {"2a0d:5042::/29", "8315"}, - {"2001:400:a000:8::/61", "293"}, - {"2001:559:584::/48", "33652"}, - {"2409:8c51::/30", "56047"}, - {"2804:4518::/32", "267672"}, - {"240a:a730::/32", "144490"}, - {"2a06:1e00:18::/48", "60695"}, - {"2405:1c0:6211::/45", "55303"}, - {"2408:8256:2e86::/48", "17816"}, - {"2a01:5140::/32", "30830"}, - {"2001:559:c403::/45", "7922"}, - {"2001:980::/29", "3265"}, - {"2400:adc7::/39", "9541"}, - {"2a00:7147:22::/48", "51430"}, - {"2a09:99c0::/48", "212886"}, - {"2001:559:858c::/48", "33650"}, - {"2001:6d0:4004::/48", "60915"}, - {"240a:a7e9::/32", "144675"}, - {"2600:5800::/35", "11426"}, - {"2801:80:1200::/48", "264313"}, - {"2a00:1028::/29", "5610"}, - {"2a02:22a0::/32", "28685"}, - {"2001:628::/37", "1853"}, - {"2001:1248:993f::/41", "11172"}, - {"240a:ab90::/32", "145610"}, - {"2602:ff84:1::/48", "36351"}, - {"2a02:d107:f008::/36", "197155"}, - {"2602:ffe4:c29::/46", "55836"}, - {"2605:9780:20::/47", "36180"}, - {"2804:5020::/32", "268371"}, - {"240e:44d:3540::/42", "140353"}, - {"2600:1406:1c::/42", "20940"}, - {"2a0e:8400::/29", "63023"}, - {"2001:559:285::/48", "33287"}, - {"2001:1520:102::/40", "34011"}, - {"240a:a43e::/32", "143736"}, - {"2804:2b84::/32", "265157"}, - {"2a00:cee3:dcd::/29", "60268"}, - {"2a06:7a07::/43", "49072"}, - {"2a03:2480:71::/44", "41983"}, - {"2a10:7900::/32", "399975"}, - {"2001:559:c381::/48", "7922"}, - {"2001:da8:7016::/44", "24363"}, - {"2001:18e8:3::/44", "87"}, - {"240a:a433::/32", "143725"}, - {"2600:c0e:3010::/48", "26558"}, - {"2607:f2b1::/43", "3614"}, - {"2620:107:9036::/48", "13951"}, - {"2001:559:c497::/48", "7015"}, - {"2001:67c:11d4::/48", "47702"}, - {"2404:bf40:f281::/48", "2764"}, - {"2600:1403:bc01::/29", "20940"}, - {"2a01:5040:1021::/34", "43996"}, - {"2405:7000:2d00::/32", "9354"}, - {"2408:8256:3a81::/43", "17623"}, - {"240e:267:9000::/38", "140337"}, - {"2604:9100:1002::/32", "29944"}, - {"2620:3b::/48", "11488"}, - {"2a01:8840:a9::/48", "207266"}, - {"2a0f:ca87:a::/48", "208850"}, - {"2001:df0:b6::/48", "63510"}, - {"2402:c980:141::/48", "134086"}, - {"2405:4803:d1a::/32", "18403"}, - {"2600:6000:faac::/48", "11351"}, - {"2620:ad:8081::/41", "52127"}, - {"2a0b:6f40::/32", "29582"}, - {"2605:4800:3::/48", "20209"}, - {"2606:5f00::/32", "10396"}, - {"2620:13a:8000::/40", "55037"}, - {"2a01:cd00:8020::/48", "28708"}, - {"2a03:2880:f11d::/46", "32934"}, - {"2a07:8f00::/29", "208828"}, - {"2001:559:c475::/48", "33667"}, - {"2001:678:a04::/48", "3320"}, - {"2409:877d::/30", "9808"}, - {"2409:8914:ac00::/38", "56044"}, - {"2a01:4420::/32", "30936"}, - {"2a02:858:200::/29", "3329"}, - {"2a02:26f7:db0d::/46", "20940"}, - {"2a0b:b87:ffb5::/48", "211571"}, - {"2a0b:bb40::/32", "28725"}, - {"2001:579:9314::/42", "22773"}, - {"240a:a9b2::/32", "145132"}, - {"2a02:26f7:cd8d::/42", "20940"}, - {"2a02:26f7:d80c::/48", "36183"}, - {"2a10:fc40::/29", "57777"}, - {"2604:5500:3000::/38", "19165"}, - {"2001:468:d00::/48", "4600"}, - {"2620:12:4000::/48", "22945"}, - {"2400:cb00:280::/45", "13335"}, - {"2402:800:941d::/41", "7552"}, - {"2600:1417:5::/48", "8966"}, - {"2a00:11c0:11c0::/48", "42388"}, - {"2a02:26f7:c540::/48", "36183"}, - {"2001:250:6431::/38", "23910"}, - {"240a:a5a4::/32", "144094"}, - {"2803:f7e0:1000::/43", "271773"}, - {"2620:11::/44", "7743"}, - {"2a02:26f7:bb40::/48", "36183"}, - {"2001:df0:1e:4001::/48", "38794"}, - {"240a:a240::/32", "143226"}, - {"2804:6620::/32", "269536"}, - {"2a06:5bc0::/32", "56911"}, - {"2600:803:22c::/48", "7046"}, - {"2604:4d40:eff::/48", "213073"}, - {"2605:a404:b0::/47", "33363"}, - {"2403:1300::/34", "56286"}, - {"2610:20:5006::/48", "5744"}, - {"2803:e600:c200::/36", "18809"}, - {"2001:559:447::/48", "22909"}, - {"2409:815d::/22", "9808"}, - {"2001:3c0::/35", "7516"}, - {"2001:550:302::/37", "174"}, - {"2403:c980::/32", "38283"}, - {"2a05:f780:4000::/35", "57667"}, - {"2600:370f:75a5::/46", "32261"}, - {"2604:640:e000::/48", "393562"}, - {"2605:e440::/48", "398343"}, - {"2620:bf::/48", "3423"}, - {"2a02:26f7:d600::/48", "36183"}, - {"2001:1a11:13b::/41", "42298"}, - {"2401:c500:fd00::/48", "54994"}, - {"2602:fed2:7102::/48", "53356"}, - {"2001:ee0:3001::/43", "45899"}, - {"2001:1248:a00e::/48", "11172"}, - {"240a:ad35::/32", "146031"}, - {"2804:7cf8:120::/32", "271530"}, - {"2a05:a740::/29", "42926"}, - {"2a0f:e1c0::/30", "60781"}, - {"2001:559:c168::/48", "33489"}, - {"2600:8807:e000::/28", "22773"}, - {"2800:bf0:a102::/48", "52257"}, - {"2a05:3f00::/29", "201454"}, - {"2a0b:4341:704::/48", "57695"}, - {"240e:108:1061::/44", "4134"}, - {"2804:5658::/32", "267992"}, - {"2604:1380::/40", "54825"}, - {"2001:67c:880::/48", "60454"}, - {"2800:160:159e::/42", "14259"}, - {"2a0a:2200::/29", "35132"}, - {"2800:800:a62::/43", "26611"}, - {"2803:7510::/32", "272033"}, - {"2a0e:b107:24::/48", "39753"}, - {"2a0f:1a40::/29", "60262"}, - {"2001:559:c3a3::/48", "33491"}, - {"2001:678:f94::/48", "211088"}, - {"2405:5740:1::/45", "138277"}, - {"2409:8915:1e00::/39", "56044"}, - {"240a:a9ab::/32", "145125"}, - {"2a11:b340::/29", "204790"}, - {"2001:1248:59d2::/42", "11172"}, - {"2001:500:7d::/48", "42"}, - {"2406:b800::/32", "38652"}, - {"2408:8956:c00::/40", "17622"}, - {"2600:370f:30c3::/42", "32261"}, - {"2800:381:aaab::/35", "10834"}, - {"2001:559:a8::/47", "33287"}, - {"240e:44d:6a40::/42", "140351"}, - {"2602:fc23:150::/48", "8095"}, - {"2801:140::/45", "262249"}, - {"2803:7200:8003::/45", "27696"}, - {"2803:9800:b485::/41", "11664"}, - {"2408:8256:2f96::/48", "17816"}, - {"240e:983:103::/45", "17897"}, - {"2600:6000:f97f::/38", "12271"}, - {"2606:7e00:ff00::/40", "3064"}, - {"2620:106:7008::/48", "11795"}, - {"2804:14c:4785::/41", "28573"}, - {"2a04:1d00::/29", "31343"}, - {"2001:788::/31", "6893"}, - {"2001:df4:9500::/48", "135938"}, - {"2804:6c00::/32", "270439"}, - {"2001:559:75b::/48", "7015"}, - {"2001:559:85e0::/48", "33660"}, - {"240c:c702::/32", "24366"}, - {"2602:feda:f027::/48", "147173"}, - {"2620:e0:c000::/48", "17116"}, - {"2804:4f8:a100::/38", "28263"}, - {"2a00:b704::/30", "51659"}, - {"2405:9940::/32", "46044"}, - {"240e:fb:d000::/34", "4134"}, - {"2a00:5180:1::/46", "44491"}, - {"2a0f:5701:fe11::/39", "206499"}, - {"2400:5800:5::/32", "38712"}, - {"2403:b200:a99c::/48", "38506"}, - {"2409:804e:1100::/36", "9808"}, - {"240e:983:140a::/47", "134768"}, - {"2604:f440:100::/40", "174"}, - {"2620:f3::/48", "30286"}, - {"2804:1784:fe19::/39", "263152"}, - {"2a02:888::/42", "47794"}, - {"2a02:c640::/32", "30836"}, - {"2605:400:500::/40", "19780"}, - {"2620:102:2000::/44", "3659"}, - {"2804:f8c:d000::/34", "263591"}, - {"2001:67c:8dc::/48", "205920"}, - {"2001:15a8::/32", "29449"}, - {"2001:550:100:6::/47", "174"}, - {"2402:8100:2120::/43", "38266"}, - {"240a:a231::/32", "143211"}, - {"2a0f:4ac0::/35", "207921"}, - {"2404:4a00:6a00:1::/37", "45629"}, - {"2a00:1210:fffd::/48", "16223"}, - {"2001:559:47d::/48", "33491"}, - {"2001:4100::/32", "12401"}, - {"2402:9400::/32", "55803"}, - {"2600:6c20:a1a::/45", "20115"}, - {"2803:a9e0::/32", "270014"}, - {"2804:330:3000::/36", "53240"}, - {"2804:4c14:cb01::/35", "267348"}, - {"2a0b:c800:1::/45", "8637"}, - {"2402:e280:214d::/46", "134674"}, - {"2408:8256:e66::/39", "17622"}, - {"2620:104:e000:ae::/40", "1351"}, - {"2803:c00::/32", "262230"}, - {"2804:14c:3d83::/41", "28573"}, - {"2a02:4780:bad::/48", "204915"}, - {"2a0e:fd45:6::/48", "213285"}, - {"2400:fc00:8cf2::/39", "45773"}, - {"240e:67a:e600::/31", "4134"}, - {"2605:2b40::/34", "40763"}, - {"2001:678:754::/48", "202171"}, - {"2402:800:7b80::/42", "7552"}, - {"2803:6ce0:1d00::/33", "269909"}, - {"2a02:1140:100::/40", "43193"}, - {"2a07:45c4::/40", "202521"}, - {"2001:418:8404:2::/35", "2914"}, - {"2001:1ac0::/32", "16004"}, - {"2401:5dc0::/32", "1828"}, - {"2620:107:4008:b9dc::/64", "6461"}, - {"2a06:b600::/29", "42184"}, - {"240a:a054::/32", "142734"}, - {"2610:b0:4170::/32", "3573"}, - {"2001:559:c15f::/48", "33491"}, - {"2001:dcd:22::/48", "16509"}, - {"2605:a401:858e::/41", "33363"}, - {"2804:6fc:21::/32", "28158"}, - {"2a0f:9400:6100::/45", "53356"}, - {"2001:559:c431::/45", "7015"}, - {"2401:4900:4fb0::/41", "45609"}, - {"2804:1e38::/35", "264415"}, - {"2a02:26f7:f944::/48", "36183"}, - {"2001:559:5a::/48", "7725"}, - {"2400:a980:c2::/44", "133111"}, - {"2406:840:1860::/48", "139317"}, - {"2620:4a:a000::/48", "30438"}, - {"2800:160:1437::/41", "14259"}, - {"2803:59a0::/32", "52468"}, - {"2a00:1298:8017::/33", "5578"}, - {"2001:559:279::/48", "33651"}, - {"2001:43f8:1100::/48", "328283"}, - {"2001:4d38::/32", "12850"}, - {"2600:380:f1d2::/47", "64011"}, - {"2803:7200:8006::/47", "27696"}, - {"2804:73e4::/34", "270944"}, - {"2a0a:9340::/48", "60016"}, - {"2001:4b20:100:f002::/36", "34288"}, - {"2401:4340::/32", "132268"}, - {"240a:af91::/32", "146635"}, - {"2600:140b:a401::/36", "20940"}, - {"2a01:c50f:3fc0::/33", "12479"}, - {"2001:559:57::/48", "7016"}, - {"2001:579:28::/40", "22773"}, - {"2600:1008:f100::/44", "6167"}, - {"2602:fbf1:10::/44", "9833"}, - {"2604:b180:290::/44", "21882"}, - {"2804:6e4:c000::/34", "262612"}, - {"2804:2ae0::/32", "53057"}, - {"2a02:6f8::/32", "39287"}, - {"2a0b:4d00:1::/44", "44239"}, - {"2001:250:3c19::/42", "138369"}, - {"2001:67c:2aac::/48", "57508"}, - {"2402:c480:3000::/47", "63916"}, - {"2600:6c38:b0e::/43", "20115"}, - {"2602:fbe9::/36", "51999"}, - {"2604:7a40::/35", "394710"}, - {"2a0b:a8c0:3::/29", "13215"}, - {"2001:559:84ee::/48", "33287"}, - {"2804:2728:705::/43", "263880"}, - {"2a00:1cf8:2000::/35", "44944"}, - {"2804:14d:888::/41", "28573"}, - {"2804:5990::/32", "268710"}, - {"2a02:7a00:2::/48", "199604"}, - {"2a0f:8900::/29", "47787"}, - {"2a0f:a8c0::/29", "209372"}, - {"2400:c700:b001::/33", "55644"}, - {"2401:d800:5b50::/42", "7552"}, - {"2402:a300:13e6::/44", "55427"}, - {"2404:c140:220::/47", "138997"}, - {"2600:1017:9410::/38", "6167"}, - {"2602:802:b000::/44", "397795"}, - {"2804:47b4::/32", "267072"}, - {"2804:7304::/32", "270890"}, - {"2806:217:202::/39", "28394"}, - {"2a00:1da8::/32", "49725"}, - {"2405:9800:b006::/44", "45430"}, - {"240a:a7bb::/32", "144629"}, - {"2600:1406:d801::/37", "20940"}, - {"240a:a491::/32", "143819"}, - {"2606:5d00::/28", "11525"}, - {"2800:160:1d34::/44", "14259"}, - {"2a00:85c0:3::/45", "203315"}, - {"2001:250:2c0c::/48", "23910"}, - {"2001:1248:98c0::/45", "11172"}, - {"2803:ab00:93::/32", "52471"}, - {"2406:3000:a:8::/45", "4657"}, - {"2408:840c:8400::/40", "17621"}, - {"240a:a769::/32", "144547"}, - {"2600:141c:2001::/36", "20940"}, - {"2600:370f:1040::/42", "32261"}, - {"2600:370f:7345::/46", "32261"}, - {"2804:1c4c:1714::/32", "61648"}, - {"2a02:128:5::/48", "62165"}, - {"2a06:5100::/29", "15576"}, - {"2a0f:4440:abcd::/48", "50937"}, - {"2a10:6700:ffff::/29", "399975"}, - {"2a11:aec0::/29", "1239"}, - {"2402:800:31fe::/38", "7552"}, - {"2801:152::/40", "14080"}, - {"2a10:4000::/29", "28701"}, - {"2409:8087:6a0c::/43", "9808"}, - {"2804:18:1010::/44", "10429"}, - {"2a00:8740:110::/46", "49037"}, - {"2a0d:f46::/32", "61157"}, - {"2a10:9a40::/40", "35065"}, - {"2408:8957:1800::/39", "17622"}, - {"2001:678:3c::/48", "197997"}, - {"2400:da00:5ff2::/32", "38365"}, - {"2a02:26f7:e50c::/48", "36183"}, - {"2a06:1b40::/29", "203762"}, - {"2a0b:e440::/29", "211774"}, - {"2402:af00::/32", "38719"}, - {"240a:ab00::/32", "145466"}, - {"240e:44d:5780::/41", "4134"}, - {"2602:fdd2::/36", "21659"}, - {"2603:90f5:d::/48", "11426"}, - {"2a04:4e40:2c00::/48", "54113"}, - {"2400:9700::/45", "24550"}, - {"2402:e740::/32", "9405"}, - {"2409:8055:3045::/42", "56040"}, - {"240a:a70f::/32", "144457"}, - {"2602:fdc2:a::/48", "397720"}, - {"2620:91:4000::/48", "393599"}, - {"2804:53c:c000::/34", "53004"}, - {"2804:1f24:101::/48", "30383"}, - {"2a02:26f0:e01::/35", "20940"}, - {"2a0c:efc0:fff::/29", "206356"}, - {"2001:250:5864::/48", "138371"}, - {"2610:e0:b000::/33", "2572"}, - {"2804:39fc::/32", "266063"}, - {"2a01:4ff:ff01::/48", "24940"}, - {"2a0e:1400::/29", "209106"}, - {"2001:559:523::/48", "7016"}, - {"2600:140b:1801::/38", "20940"}, - {"2800:930::/29", "27717"}, - {"2a02:26f7:dfc9::/46", "20940"}, - {"2a02:cb43:2003::/48", "41179"}, - {"2001:438:fffd:11e::/64", "397601"}, - {"240a:adee::/32", "146216"}, - {"240e:3b7:2200::/37", "136198"}, - {"2600:2c03:1000::/36", "7349"}, - {"2803:bc40:811d::/34", "52468"}, - {"2804:a28::/32", "263026"}, - {"2804:3b88::/32", "266155"}, - {"2a01:690::/29", "16326"}, - {"2803:d220::/32", "266880"}, - {"2a02:9010:46::/42", "3352"}, - {"2402:ef25::/28", "7633"}, - {"2406:daa0:a040::/44", "16509"}, - {"2600:1010:bf00::/44", "6167"}, - {"2a01:4d8::/32", "39122"}, - {"2a02:2770::/32", "196752"}, - {"2001:448a:10b0::/41", "7713"}, - {"2620:cc:8000::/48", "3685"}, - {"2a03:7540::/38", "44406"}, - {"2a0f:eb80:b::/45", "47267"}, - {"2001:3c8:100f::/48", "133919"}, - {"2001:559:c4fa::/48", "33491"}, - {"2001:1248:a50a::/43", "11172"}, - {"2001:4410:3100::/32", "132040"}, - {"2800:160:117f::/40", "14259"}, - {"2800:b70:102::/48", "262191"}, - {"2804:55c8::/32", "267956"}, - {"2a0b:2c40::/29", "205741"}, - {"2a0f:2840::/29", "399975"}, - {"2001:67c:2354::/48", "39287"}, - {"2001:df0:c280::/48", "140096"}, - {"2804:2904::/36", "262588"}, - {"2a02:2498:6d7b::/48", "13213"}, - {"2001:67c:2410::/48", "34755"}, - {"2400:dcc0:a004::/39", "38631"}, - {"2401:d800:2b60::/40", "7552"}, - {"2404:ff80:fff0::/44", "64096"}, - {"240e:44d:1980::/41", "4134"}, - {"2620:0:1cff:dead:beee::1408/127", "29632"}, - {"2a03:ad40:140::/48", "199349"}, - {"2a03:db80:5460::/48", "200943"}, - {"2405:a700:1b::/45", "9498"}, - {"2407:4d40:1::/45", "142050"}, - {"2409:8924:3500::/38", "56046"}, - {"240a:a664::/32", "144286"}, - {"2804:1f42::/32", "270694"}, - {"2a04:500::/29", "198249"}, - {"2001:258::/32", "2510"}, - {"2001:1b28:1000::/32", "8728"}, - {"2409:8904:5d70::/40", "24547"}, - {"2804:1bcc::/32", "61751"}, - {"2a0d:e000::/29", "59682"}, - {"2404:bf40:8042::/40", "139084"}, - {"2800:160:5::/37", "14259"}, - {"2804:12ac::/32", "263491"}, - {"2804:4fa8::/32", "268341"}, - {"2a02:26f7:dcc9::/42", "20940"}, - {"2c0f:f8c0::/32", "37529"}, - {"2604:bf00:211::/32", "17185"}, - {"2402:b400::/33", "45960"}, - {"2409:8050:2800::/47", "56047"}, - {"2804:14c:6f00::/40", "28573"}, - {"2804:14d:fc00::/44", "28573"}, - {"2a02:26f7:c601::/46", "20940"}, - {"2a03:2480:68::/47", "200107"}, - {"2a07:22c1:34::/48", "211776"}, - {"2a0f:9400:7709::/48", "213312"}, - {"2409:8054:5d::/46", "56040"}, - {"240a:ab57::/32", "145553"}, - {"2804:14c:6330::/40", "28573"}, - {"2a02:4e0:2200::/41", "16135"}, - {"2a02:f38:3::/48", "8422"}, - {"2001:559:c379::/46", "33657"}, - {"2001:1a10:5000::/31", "8781"}, - {"2401:d800:9fa0::/41", "7552"}, - {"2402:ee40:2::/48", "17754"}, - {"240e:3bc:c000::/37", "140315"}, - {"2600:1417:d801::/37", "20940"}, - {"2604:2d80:8900::/34", "30036"}, - {"2a02:26f7:cd85::/46", "20940"}, - {"2a03:560:148::/47", "201832"}, - {"2a06:e80:1000::/36", "200699"}, - {"2001:2000:9100::/31", "1299"}, - {"2600:6c20:e26::/44", "20115"}, - {"2402:ef2f:51::/48", "7633"}, - {"240a:a7b9::/32", "144627"}, - {"2605:5c0:c010::/44", "26517"}, - {"2801:118::/48", "264823"}, - {"2a00:7b00:c100::/34", "12338"}, - {"2a01:7e20::/31", "199805"}, - {"2a02:26f7:fac0::/48", "36183"}, - {"2a0f:10c0::/29", "43809"}, - {"2a06:2700::/29", "46516"}, - {"2001:559:8617::/48", "33657"}, - {"2402:8100:266b::/45", "55644"}, - {"240a:a3ed::/32", "143655"}, - {"2804:ed8::/32", "28343"}, - {"2a10:1647:fe00::/39", "206330"}, - {"2001:7a8:800::/47", "34019"}, - {"2600:4c01:ffff::/48", "13760"}, - {"2620:0:57f::/48", "62955"}, - {"2804:1ca0:1000::/40", "61666"}, - {"2001:1a11:bc::/48", "8781"}, - {"2409:8a1e::/31", "24400"}, - {"240a:ada9::/32", "146147"}, - {"2607:2000::/32", "5786"}, - {"2a0e:2704::/30", "203136"}, - {"2c0f:fe08:601::/32", "36914"}, - {"2001:559:86c3::/48", "33287"}, - {"2001:559:c0bd::/46", "33651"}, - {"2001:44c8:2000::/48", "45781"}, - {"2402:8100:21d8::/45", "55644"}, - {"2405:4400::/32", "18001"}, - {"240e:651:3000::/36", "134419"}, - {"2600:1488:a0c1::/39", "20940"}, - {"2a02:2e0:41d::/42", "12306"}, - {"2001:4498::/32", "24218"}, - {"2a01:49e0::/32", "201167"}, - {"2a0e:8a84::/32", "13559"}, - {"240e:980:9900::/40", "4816"}, - {"2804:4ecc::/32", "268283"}, - {"2a02:f78::/32", "42927"}, - {"2a07:5740::/31", "44901"}, - {"2803:5a80::/32", "262931"}, - {"2804:37a0::/32", "266425"}, - {"2001:559:c35e::/48", "7922"}, - {"2400:3200:babb::/33", "37963"}, - {"2804:29f8:1::/48", "264048"}, - {"2a00:1ea0::/47", "35007"}, - {"2a02:26f7:b944::/48", "36183"}, - {"2a0d:2582:100::/44", "211367"}, - {"2a0d:8d80::/32", "31424"}, - {"2a11:6c6:1000::/32", "210916"}, - {"2001:448a:4070::/35", "7713"}, - {"240a:ac53::/32", "145805"}, - {"2600:380:f980::/37", "7018"}, - {"2620:0:2a09::/48", "30343"}, - {"2405:a840:a000::/33", "38562"}, - {"2406:840:e014::/44", "213069"}, - {"2804:2800::/32", "263934"}, - {"2a07:a905:ffeb::/48", "204543"}, - {"2001:310::/34", "4694"}, - {"2001:559:c3fc::/48", "7016"}, - {"2001:948::/42", "2603"}, - {"2404:6180::/32", "58890"}, - {"2408:4009:500::/48", "45102"}, - {"2c0e:7f85::/27", "36974"}, - {"2001:500:135::/48", "396574"}, - {"2001:678:15:8000::/46", "42385"}, - {"2600:1407:7801::/32", "20940"}, - {"2803:e8e0::/32", "269875"}, - {"2a03:d9c0:1000::/48", "3214"}, - {"2001:67c:110::/48", "3274"}, - {"2408:8656:2cfa::/45", "17623"}, - {"2603:a000::/24", "395662"}, - {"2804:14d:b087::/44", "28573"}, - {"2405:8a00:21b6::/44", "55824"}, - {"240a:ab27::/32", "145505"}, - {"2607:fc48:818::/48", "40009"}, - {"2801:172::/48", "14080"}, - {"2a02:970:1385::/43", "44002"}, - {"2a0f:5382:1312::/48", "208135"}, - {"2600:6c38:1b::/45", "20115"}, - {"2605:ea00:1::/48", "26388"}, - {"2a02:188:1005::/33", "31027"}, - {"2a11:7380::/29", "18779"}, - {"2408:8256:1666::/39", "17622"}, - {"2409:8053:2002::/40", "56047"}, - {"2a09:407:3000::/36", "210625"}, - {"2a10:2f01:280::/44", "213092"}, - {"2001:250:802::/48", "138182"}, - {"2401:cf80:600d::/48", "198949"}, - {"2607:fdf0:5ea6::/44", "8008"}, - {"2408:8957:b100::/40", "17816"}, - {"240e:108:21::/48", "4811"}, - {"2804:14c:5d39::/40", "28573"}, - {"2804:76ac::/32", "271127"}, - {"2a02:26f7:ef45::/46", "20940"}, - {"2a02:4780:dead::/48", "204915"}, - {"2a03:4e40::/29", "25447"}, - {"2a03:8e20::/32", "211713"}, - {"2402:3a80:48::/46", "38266"}, - {"2405:6c0:1::/46", "63641"}, - {"2604:bc0:8::/48", "47869"}, - {"2620:1d4:501e::/47", "19726"}, - {"2804:7460::/32", "270977"}, - {"2001:559:8291::/48", "33490"}, - {"240e:44d:7d00::/41", "140345"}, - {"2620:fc:4000::/48", "26206"}, - {"2a02:ae80::/29", "200139"}, - {"2001:559:46b::/48", "20214"}, - {"2001:57a:503::/48", "33438"}, - {"2404:bf40:e007::/40", "139084"}, - {"2804:8474::/43", "272261"}, - {"2804:2ae4:f000::/36", "13878"}, - {"2806:230:4025::/48", "11888"}, - {"2001:559:84de::/48", "33657"}, - {"2408:8459:4650::/36", "17816"}, - {"2804:25ac::/32", "264294"}, - {"2a09:dc40::/29", "197522"}, - {"2605:9780:40::/48", "393544"}, - {"240a:a960::/32", "145050"}, - {"2620:119:5020::/43", "13443"}, - {"2804:1f54:f100::/36", "272220"}, - {"2804:2d98::/32", "61579"}, - {"2a00:8c40:235::/48", "205418"}, - {"2404:4600:4::/47", "9764"}, - {"2620:97:e000::/48", "399663"}, - {"2803:f340:2000::/32", "14754"}, - {"2a0c:a9c7:253::/48", "41740"}, - {"2001:1838:1100::/34", "23352"}, - {"2408:8256:3775::/48", "17816"}, - {"2600:6c0c::/31", "20115"}, - {"2a03:e880::/32", "20686"}, - {"2001:470:be::/48", "12266"}, - {"2409:8008:dd::/36", "24547"}, - {"2804:14e0::/32", "263356"}, - {"2806:2f0:4743::/42", "17072"}, - {"2a04:4e40:5010::/41", "54113"}, - {"2a0c:4300:50::/42", "43722"}, - {"2c0f:f408::/32", "37684"}, - {"2001:df5:d200::/48", "46050"}, - {"240a:aec8::/32", "146434"}, - {"240e:95a:4000::/36", "149178"}, - {"2801:1f0:400a::/42", "3573"}, - {"2804:34f4::/32", "265491"}, - {"2804:5614::/32", "267513"}, - {"2806:230:3000::/48", "265594"}, - {"2001:67c:4b4::/48", "206153"}, - {"2406:2000:1b0::/41", "10310"}, - {"240a:a51f::/32", "143961"}, - {"2804:1580::/32", "263391"}, - {"2a05:6c40::/32", "51012"}, - {"2402:800:5201::/44", "7552"}, - {"2402:800:9863::/43", "7552"}, - {"240a:ac33::/32", "145773"}, - {"2a02:26f0:69::/43", "20940"}, - {"2001:16d8:59::/45", "16150"}, - {"2001:4888:802f::/43", "22394"}, - {"240a:a710::/32", "144458"}, - {"240a:ae93::/32", "146381"}, - {"2800:440:8043::/45", "27738"}, - {"2804:4b30::/32", "267289"}, - {"2a02:1740::/32", "197133"}, - {"2a02:26f7:f38c::/48", "36183"}, - {"2a03:8cc0::/32", "61215"}, - {"240c:c782::/26", "23910"}, - {"2803:f6a0::/32", "266904"}, - {"2a02:2454:8000::/33", "16202"}, - {"2a02:26f7:d244::/48", "36183"}, - {"2001:408::/44", "14793"}, - {"2001:559:550::/48", "7922"}, - {"2001:678:8c::/48", "44358"}, - {"2402:3640::/32", "137248"}, - {"240a:a21c::/32", "143190"}, - {"2602:ffc4:6::/47", "393398"}, - {"2a0e:97c3:769::/48", "20473"}, - {"2001:678:634::/48", "204345"}, - {"2409:896a:ba00::/29", "9808"}, - {"2600:1017:a110::/38", "6167"}, - {"2a03:3f40::/47", "50673"}, - {"2406:7400:40::/46", "24309"}, - {"240e:7:5800::/32", "4134"}, - {"2607:f160::/48", "6167"}, - {"2804:46b0::/32", "267005"}, - {"2a00:e30:a00::/40", "61333"}, - {"2a06:10c0::/29", "198930"}, - {"2001:678:85c::/48", "59801"}, - {"2402:3fc0::/32", "134090"}, - {"240e:570::/28", "4134"}, - {"2804:4bc4::/32", "267328"}, - {"2a01:b5c0::/32", "43160"}, - {"2001:200::/37", "2500"}, - {"2001:448a:20b0::/35", "7713"}, - {"240e:61::/35", "134775"}, - {"2a06:7a06::/48", "44541"}, - {"2c0f:fe28:1::/48", "36951"}, - {"2408:8957:c00::/40", "17622"}, - {"2604:8d40::/32", "23260"}, - {"2a00:4800:3e0::/44", "13124"}, - {"2001:550:9c01::/46", "174"}, - {"2001:559:85a8::/48", "7725"}, - {"2001:1620::/34", "13030"}, - {"2402:e280:2154::/46", "134674"}, - {"2a06:e881:2103::/45", "206479"}, - {"2a0e:7580:4590::/48", "9312"}, - {"2001:12f0:f79::/40", "1916"}, - {"2403:b100::/34", "9989"}, - {"2600:14c0:5::/48", "20940"}, - {"2602:feda:e3f::/48", "147028"}, - {"2803:7200:2001::/32", "27696"}, - {"2a00:ecc0::/32", "16001"}, - {"2a02:26f7:d908::/48", "36183"}, - {"2001:df0:3a00::/48", "17439"}, - {"2403:5180:1::/48", "138038"}, - {"2606:36c0:500::/40", "399342"}, - {"2804:4a1c::/36", "267219"}, - {"2a00:1288:89::/39", "10310"}, - {"2001:559:62::/48", "7922"}, - {"2403:9800:c200::/40", "4648"}, - {"2606:2e00:8014::/44", "36351"}, - {"2804:4b4::/32", "262460"}, - {"2806:2f0:20a0::/48", "17072"}, - {"2a04:4e41:4e::/43", "54113"}, - {"2408:8956:6000::/40", "17622"}, - {"2a06:3080::/30", "25595"}, - {"2a0a:54c0::/31", "62240"}, - {"240a:a8dc::/32", "144918"}, - {"2a01:28:eeef::/35", "39392"}, - {"2607:f298:abb::/48", "7385"}, - {"2a02:26f7:ecc5::/46", "20940"}, - {"2001:15d8::/32", "8657"}, - {"2001:57a:f20b::/45", "22773"}, - {"2620:11a:a035::/48", "43515"}, - {"2804:145c:8890::/37", "263327"}, - {"240a:a58b::/32", "144069"}, - {"2607:fae0:246::/36", "8038"}, - {"2800:160:2b48::/42", "14259"}, - {"2a0a:bcc0::/29", "41001"}, - {"2a0e:6500::/29", "40970"}, - {"2402:8100:2240::/39", "45271"}, - {"240e:438:8840::/38", "4134"}, - {"2a02:ac80:7001::/38", "25145"}, - {"2a09:62c0::/29", "8224"}, - {"2a0f:1204::/31", "60781"}, - {"2602:fc81:1::/46", "399334"}, - {"2001:502:8cc::/48", "397197"}, - {"2001:559:81f9::/48", "7922"}, - {"2408:8207:84c0::/39", "4808"}, - {"240e:44d:3780::/41", "4134"}, - {"2a03:8a40::/32", "48173"}, - {"2c0f:f8e0::/32", "37100"}, - {"2403:82c0::/32", "9924"}, - {"2800:5f0:b022::/33", "22724"}, - {"2a06:71c0::/29", "203968"}, - {"240a:a1b5::/32", "143087"}, - {"240a:ad04::/32", "145982"}, - {"2607:f530::/32", "10996"}, - {"2620:10a:c000::/44", "53708"}, - {"2804:1964::/32", "61792"}, - {"2001:438:4b::/42", "6461"}, - {"2001:678:b28::/48", "204867"}, - {"2600:6c38:868::/43", "20115"}, - {"2605:f440:caff::/34", "54874"}, - {"2607:fb90:c13f::/41", "21928"}, - {"2620:113:1005::/46", "15224"}, - {"2804:bd0::/40", "10670"}, - {"2a06:7bc0::/29", "34373"}, - {"2001:559:7f4::/48", "33662"}, - {"2001:16d8:8f0::/44", "16150"}, - {"240a:a92d::/32", "144999"}, - {"2a0f:85c1:30::/47", "206628"}, - {"2804:38a4:8000::/42", "266491"}, - {"2a00:1288:1ac::/32", "10310"}, - {"2404:5e40:6::/44", "137703"}, - {"240a:ac4b::/32", "145797"}, - {"2804:2bc:200::/32", "262832"}, - {"2c0f:f698:f003::/44", "37693"}, - {"2600:6c38:1bd::/41", "20115"}, - {"2001:df7:7c80::/48", "140156"}, - {"2402:800:5ac5::/43", "7552"}, - {"2605:9200::/32", "36394"}, - {"2620:11a:a026::/44", "43515"}, - {"2a02:13a0::/32", "12519"}, - {"2a02:7842::/31", "47816"}, - {"2800:bf0:b0::/48", "27947"}, - {"2801:14:a000::/48", "61455"}, - {"2a0f:bf00:40::/42", "208069"}, - {"2001:67c:23d8::/47", "48151"}, - {"2603:c0e8:1000::/38", "1218"}, - {"2a02:500:6000::/32", "5538"}, - {"2a03:47c0::/35", "21277"}, - {"2a07:71c0::/29", "202918"}, - {"2001:559:2c7::/44", "33287"}, - {"2001:4998:128::/41", "10310"}, - {"2804:7f8c:20::/35", "271695"}, - {"2a02:ca00::/29", "41307"}, - {"2a03:d540::/32", "50904"}, - {"2001:559:8104::/48", "33287"}, - {"2600:140f:e400::/48", "9498"}, - {"2620:119:30::/48", "36692"}, - {"2620:119:35::/48", "36692"}, - {"2804:8100::/32", "262306"}, - {"2001:559:841d::/48", "33657"}, - {"2001:559:85a1::/48", "7922"}, - {"2001:559:c1e0::/48", "33651"}, - {"2001:678:94c::/48", "30962"}, - {"2402:c480:7000::/48", "63916"}, - {"2804:4544:8000::/40", "266915"}, - {"2a01:6a8::/32", "34554"}, - {"2400:dcc0:ae04::/39", "38631"}, - {"2607:a500:d::/32", "12025"}, - {"2a01:c50f:b000::/40", "12479"}, - {"2a02:26f0:4b01::/37", "20940"}, - {"2001:559:8100::/48", "33659"}, - {"2001:df1:b401::/48", "132458"}, - {"2804:161c:fc00::/48", "263268"}, - {"2a07:6bc0::/29", "197451"}, - {"2a0f:5707:af0f::/48", "211358"}, - {"2405:2500:65::/48", "136565"}, - {"2600:1409:12::/48", "20940"}, - {"2620:e:2000::/48", "30546"}, - {"2620:1ec:90a::/47", "8075"}, - {"2804:66c8:c000::/34", "269582"}, - {"2a00:b420::/32", "60478"}, - {"2001:559:83ba::/48", "33651"}, - {"2604:f140::/32", "22413"}, - {"2c0f:fad8::/40", "37019"}, - {"2001:559:8316::/48", "33652"}, - {"2001:67c:1ba0::/48", "8445"}, - {"2402:800:be10::/42", "7552"}, - {"2a02:582:1c00::/33", "6799"}, - {"2a05:d840::/29", "200994"}, - {"2001:559:846a::/48", "33657"}, - {"2001:4220:8000::/44", "24835"}, - {"2400:8200::/32", "45061"}, - {"2402:800:381d::/42", "7552"}, - {"2409:8a06::/28", "9808"}, - {"2800:68:12::/47", "61468"}, - {"2803:a5a0::/32", "267728"}, - {"2a01:358:4016::/44", "9121"}, - {"2001:559:c461::/48", "33659"}, - {"240e:397:2700::/26", "4134"}, - {"2804:14d:aca1::/41", "28573"}, - {"2a06:8401:3::/29", "198463"}, - {"2001:bf7:1330::/41", "44194"}, - {"2001:41b0::/32", "12741"}, - {"2401:d800:98f0::/39", "7552"}, - {"2402:3800:dc04::/34", "7503"}, - {"2603:c010:4000::/36", "31898"}, - {"2603:c0f0:1020::/38", "6142"}, - {"2605:940:710::/44", "396919"}, - {"2a01:5042:2007::/48", "202196"}, - {"2a09:96c0::/48", "20473"}, - {"2001:559:c1df::/48", "33652"}, - {"2001:559:c255::/48", "33650"}, - {"2001:559:c2d1::/48", "7015"}, - {"2401:5200::/32", "23659"}, - {"2401:d800:d0d0::/42", "7552"}, - {"2a10:cb40::/31", "198328"}, - {"2001:67c:15e8::/48", "3301"}, - {"2001:18b8:113::/45", "29789"}, - {"2408:8957:bd00::/40", "17816"}, - {"240a:a45b::/32", "143765"}, - {"240a:aaf5::/32", "145455"}, - {"2607:f6f0:9000::/48", "32323"}, - {"2800:bf0:3c00::/45", "52257"}, - {"2804:4f94::/32", "268336"}, - {"2804:6cc4::/32", "270490"}, - {"2a0e:8f02:2015::/48", "213021"}, - {"2001:df4:4f80::/48", "140941"}, - {"2405:203:89d::/39", "55836"}, - {"2607:f5a0::/45", "17048"}, - {"2001:ce0:2800::/40", "7651"}, - {"2602:802:b0ca::/48", "397795"}, - {"2604:d600:15bb::/45", "32098"}, - {"2804:2d94::/32", "265290"}, - {"2a00:fa80::/29", "203489"}, - {"2400:ff00:6::/32", "132045"}, - {"2a0a:e805:210::/44", "64476"}, - {"2403:7800::/32", "10010"}, - {"240a:a554::/32", "144014"}, - {"240e:3b3:7600::/39", "140313"}, - {"240e:964:3800::/33", "4134"}, - {"2800:160:165e::/42", "14259"}, - {"2a03:d000:9004::/46", "29648"}, - {"2a0f:8c40::/29", "42375"}, - {"2401:d800:dc90::/42", "7552"}, - {"2406:82c0::/32", "141201"}, - {"2804:a00:8a1::/41", "262838"}, - {"2a0a:340:cd00::/40", "48043"}, - {"2001:43f8:e0::/48", "37045"}, - {"2a00:84c0::/32", "197078"}, - {"2a05:547::/32", "206766"}, - {"2a09:740::/32", "62214"}, - {"2a0c:8fc1:6400::/39", "34081"}, - {"2001:678:b40::/48", "208003"}, - {"2403:ac80::/40", "4785"}, - {"2409:8779::/30", "9808"}, - {"2a03:1e01::/32", "9145"}, - {"2401:4900:5090::/42", "45609"}, - {"2403:a640::/39", "63776"}, - {"2404:bf40:8006::/42", "139084"}, - {"2406:3400:68::/43", "10143"}, - {"2408:8957:d00::/40", "17816"}, - {"2606:1a40:2010::/47", "398962"}, - {"2a02:26f7:cd80::/48", "36183"}, - {"2001:400:b21::/44", "293"}, - {"2402:800:911d::/41", "7552"}, - {"2405:9800:60::/44", "45430"}, - {"2603:c013:a000::/36", "31898"}, - {"2803:6a60::/46", "262186"}, - {"2804:60b0::/32", "269184"}, - {"2804:76dc::/32", "271139"}, - {"2a02:7c9::/44", "211099"}, - {"2a02:cc4:2100::/41", "8211"}, - {"2001:7e8::/32", "6661"}, - {"2001:df1:9c00::/48", "133882"}, - {"2605:4300:ee00::/40", "62907"}, - {"2804:30fc:4::/32", "263009"}, - {"2a0b:27c0::/31", "34215"}, - {"240e:44d:6f40::/42", "140354"}, - {"2804:2278::/32", "264103"}, - {"2a00:6620:2000::/48", "197746"}, - {"2a02:26f7:bf48::/48", "36183"}, - {"2a02:26f7:dc88::/48", "36183"}, - {"2003::/19", "3320"}, - {"2401:d800:7590::/42", "7552"}, - {"240a:a6d4::/32", "144398"}, - {"2800:160:1fc2::/45", "14259"}, - {"2a02:26f0:42::/43", "20940"}, - {"2001:559:82f3::/48", "33287"}, - {"2407:ef00:931::/32", "12422"}, - {"2408:8459:c250::/37", "17816"}, - {"2409:802f:2c06::/48", "9808"}, - {"240e:980:9100::/40", "140061"}, - {"2804:920:4200::/35", "263053"}, - {"2a03:eb80::/32", "56704"}, - {"2a0c:93c0:6000::/48", "212465"}, - {"2001:559:5a2::/45", "7922"}, - {"2001:ee0:a040::/37", "45899"}, - {"2409:8074:3100::/32", "9808"}, - {"2603:70b3::/32", "11351"}, - {"2a01:8840:39::/48", "207266"}, - {"2a03:5f00:1000::/48", "207044"}, - {"2600:2108:4000::/29", "11404"}, - {"2804:2f30:4800::/34", "53096"}, - {"2a00:c90::/32", "20853"}, - {"2001:3c8:2a08::/33", "4621"}, - {"2620:134:b0ff::/48", "14593"}, - {"2804:cf8:c::/46", "52580"}, - {"2a01:5042:2eff::/48", "202196"}, - {"2a03:5a00:c::/48", "198324"}, - {"2402:8100:3031::/45", "55644"}, - {"2806:230:2045::/48", "11888"}, - {"2404:bf40:c000::/47", "2764"}, - {"240a:aeb9::/32", "146419"}, - {"2602:fbb7::/36", "399899"}, - {"2606:b400:8808::/48", "7160"}, - {"2a02:4f60::/32", "60198"}, - {"2a0d:3842:1040::/48", "57629"}, - {"2001:579:c08d::/41", "22773"}, - {"2401:2d00:8000::/46", "17625"}, - {"240a:a77d::/32", "144567"}, - {"240a:addd::/32", "146199"}, - {"2800:940::/32", "27953"}, - {"2620:119:53::/48", "36692"}, - {"2620:136:c000::/48", "40337"}, - {"2804:4d5c::/32", "268192"}, - {"2a0b:480::/29", "16181"}, - {"2600:1415:3c01::/33", "20940"}, - {"2620:10e:6000::/40", "11279"}, - {"2001:250:1e00::/44", "138377"}, - {"2001:559:8089::/48", "13367"}, - {"2001:559:85f2::/48", "33652"}, - {"2001:b400:f000::/38", "3462"}, - {"240a:aa69::/32", "145315"}, - {"2620:120:2000::/40", "393983"}, - {"2a02:26f7:be49::/46", "20940"}, - {"2a04:400::/29", "34254"}, - {"2a0b:5dc0::/29", "198288"}, - {"2404:1c40:25::/44", "24432"}, - {"2408:840c:2000::/40", "17621"}, - {"2409:8739::/30", "9808"}, - {"2607:f8f0:400::/40", "271"}, - {"2800:590:2058::/42", "7004"}, - {"2804:2a4::/32", "262828"}, - {"2804:35a4::/32", "266298"}, - {"2804:7e80::/32", "271628"}, - {"2a03:50c0:3300::/40", "202087"}, - {"2a03:ad40:130::/48", "199349"}, - {"2001:559:8544::/48", "33662"}, - {"2001:559:8666::/47", "33657"}, - {"2620:12f:c009::/45", "395831"}, - {"2803:9800:b995::/46", "11664"}, - {"2804:1a88::/32", "61864"}, - {"2a02:26f7:ef4c::/48", "36183"}, - {"2a03:7520::/32", "13030"}, - {"2a06:6000::/29", "20802"}, - {"2001:df0:1b40::/48", "135906"}, - {"2400:a980::/40", "133111"}, - {"2408:8256:2d9b::/48", "17816"}, - {"2620:a5:6000::/48", "14618"}, - {"2804:204:710::/36", "28186"}, - {"2804:3c04:2::/32", "266185"}, - {"1900:5:2:2::5170/126", "3356"}, - {"2001:1900:2353::/45", "10753"}, - {"240a:a9c9::/32", "145155"}, - {"2620:171:55::/48", "715"}, - {"2a04:4e40:7c00::/48", "54113"}, - {"2001:559:8148::/48", "20214"}, - {"2001:1388:a::/43", "6147"}, - {"2001:44c8:43d0::/44", "45430"}, - {"2600:1401:3::/45", "20940"}, - {"2804:37b0::/36", "266429"}, - {"2804:56d0::/32", "268025"}, - {"2a03:65c0::/32", "61331"}, - {"2a0e:8f02:213a::/48", "211722"}, - {"2a0f:9880::/30", "208861"}, - {"2001:c48::/32", "9457"}, - {"2404:a800:7001::/32", "9498"}, - {"2a01:c50f:400::/39", "12479"}, - {"2001:500:6f::/48", "30128"}, - {"2001:678:32c::/48", "3170"}, - {"2404:4340:2::/32", "133275"}, - {"240a:af81::/32", "146619"}, - {"2600:1001:a110::/36", "22394"}, - {"2606:4f00:6::/48", "19324"}, - {"2a02:26f7:b850::/48", "36183"}, - {"2a0d:d9c7:a::/48", "208948"}, - {"240e:3bd:dc00::/34", "4134"}, - {"2606:ae40::/32", "174"}, - {"2607:ff28:b006::/47", "62904"}, - {"2804:8120::/32", "272434"}, - {"2a02:26f7:d6cc::/48", "36183"}, - {"240a:af4a::/32", "146564"}, - {"240e:3b2:7a00::/32", "140313"}, - {"2a02:618:a::/32", "20485"}, - {"2405:4200::/38", "24482"}, - {"2600:1404:f401::/36", "20940"}, - {"2801:16e:4::/48", "19429"}, - {"2a11:e000::/29", "42375"}, - {"2001:dcc:600::/48", "131100"}, - {"2401:7200:2010::/47", "55328"}, - {"2408:84f3:3e40::/33", "17816"}, - {"2600:140f:c001::/38", "20940"}, - {"2a00:cce0::/32", "43870"}, - {"2a03:521::/32", "201822"}, - {"2a06:e881:6200::/48", "60404"}, - {"2406:380::/31", "7979"}, - {"2804:11bc:4000::/38", "263435"}, - {"2001:559:c13e::/47", "33287"}, - {"2001:67c:21f8::/48", "34964"}, - {"2600:100f:9100::/44", "6167"}, - {"2604:9100:1000::/48", "25864"}, - {"2605:dbc0::/32", "397880"}, - {"2a01:5e00::/32", "34688"}, - {"2a02:888:8143::/48", "47794"}, - {"2a02:26f7:80::/48", "36183"}, - {"2001:678:8b0::/48", "43815"}, - {"2001:b08:16::/48", "29581"}, - {"2001:44b8:4063::/48", "4739"}, - {"2401:1a80::/32", "59374"}, - {"2605:3380:4184::/47", "12025"}, - {"2606:9380::/32", "15011"}, - {"2001:4878:c027::/48", "12222"}, - {"2409:8062:1100::/36", "9808"}, - {"2409:8904:5ab0::/39", "24547"}, - {"2605:a404:32f::/41", "33363"}, - {"2620:112:f006::/48", "6336"}, - {"2800:bf0:37c0::/45", "52257"}, - {"2803:24c0:600::/32", "264796"}, - {"2001:948:5a::/42", "39590"}, - {"240e:3b6:c000::/37", "140315"}, - {"2a02:f08::/32", "42184"}, - {"2001:1440:203::/48", "5401"}, - {"2407:cb00::/32", "23860"}, - {"2607:f060:b005::/33", "11404"}, - {"2801:136::/46", "19429"}, - {"2804:4f60:2000::/32", "268323"}, - {"2001:df1:6400::/48", "55925"}, - {"2604:a540::/32", "54594"}, - {"240a:ad5f::/32", "146073"}, - {"2a02:26f7:e7c1::/46", "20940"}, - {"2001:559:3b2::/47", "33660"}, - {"2405:1c0:6351::/46", "55303"}, - {"2600:1408:4c01::/35", "20940"}, - {"2606:5c80::/32", "394255"}, - {"2a10:d2c0::/32", "198288"}, - {"2a01:b740:a01::/48", "714"}, - {"2a02:26f7:c5c6::/47", "20940"}, - {"2a0a:90c2::/35", "198912"}, - {"2a0e:aa07:e300::/48", "149007"}, - {"2001:1578:400::/40", "35003"}, - {"2001:448a:5050::/40", "7713"}, - {"2402:5300:4700::/40", "38733"}, - {"2001:b400:f210::/45", "3462"}, - {"2a09:8387:ffff::/48", "51972"}, - {"2605:b800:788::/32", "23550"}, - {"2801:80:2430::/48", "268334"}, - {"2803:69e0::/32", "270015"}, - {"2a03:f180::/32", "42571"}, - {"2001:559:853b::/48", "33491"}, - {"2406:3003:2080::/48", "55430"}, - {"2604:2f40:243::/32", "29749"}, - {"2605:e000:70b::/48", "10838"}, - {"2800:160:1ffb::/34", "14259"}, - {"2801:8a::/32", "53187"}, - {"2804:4b40::/42", "267293"}, - {"2804:6ab8::/32", "270355"}, - {"2a02:26f0:ae::/43", "20940"}, - {"2001:559:81e9::/48", "7016"}, - {"2001:978:601::/36", "174"}, - {"2400:cb00:a625::/46", "13335"}, - {"2408:8026:710::/36", "17621"}, - {"2804:df0:2::/36", "262775"}, - {"2a03:7480:10::/44", "15699"}, - {"2a0a:59c7:100f::/43", "204724"}, - {"2a10:2f01:380::/42", "39526"}, - {"2804:5c78:5000::/32", "53245"}, - {"2806:239::/32", "18592"}, - {"2a01:5b0:a::/45", "8391"}, - {"2001:3c8:244::/35", "4621"}, - {"2409:8000:100::/37", "9808"}, - {"2409:8975::/28", "9808"}, - {"240a:a112::/32", "142924"}, - {"2001:df0:6440::/48", "149488"}, - {"240e:979:2f00::/35", "4134"}, - {"2a00:1180::/32", "15518"}, - {"2a0e:8f02:20f0::/45", "212008"}, - {"2001:559:77f::/48", "7015"}, - {"2600:1000:ff10::/31", "22394"}, - {"2800:160:2ba1::/37", "14259"}, - {"2804:14c:8183::/41", "28573"}, - {"2001:559:8767::/48", "7725"}, - {"2001:559:c412::/47", "7922"}, - {"2001:67c:1424::/48", "49030"}, - {"2405:ad40::/32", "137159"}, - {"240a:a0c0::/32", "142842"}, - {"2a11:4740::/29", "204790"}, - {"2407:9001:200::/45", "2764"}, - {"240a:a370::/32", "143530"}, - {"240e:3bd:2200::/37", "136198"}, - {"2620:103:e008::/47", "16711"}, - {"2001:559:363::/48", "33652"}, - {"2409:8054:3028::/47", "9808"}, - {"2409:8c1f:75c0::/32", "9808"}, - {"240a:ab1c::/32", "145494"}, - {"2604:d600:1517::/44", "32098"}, - {"2804:2e78:2000::/32", "28213"}, - {"2804:783c::/32", "271229"}, - {"2806:2f0:40a1::/46", "17072"}, - {"2001:559:c248::/48", "33650"}, - {"2402:3a80:c02c::/48", "38266"}, - {"2403:1b80::/48", "59083"}, - {"2404:87c0::/32", "138652"}, - {"2620:b0:8000::/48", "54297"}, - {"2804:6304::/32", "269333"}, - {"2a0d:7700::/29", "41645"}, - {"2001:559:3e8::/48", "33489"}, - {"2408:8957:6a00::/40", "17622"}, - {"240a:a7d7::/32", "144657"}, - {"2804:d7c:200::/35", "52634"}, - {"2a02:2e02:39f0::/38", "12479"}, - {"2001:559:8780::/47", "7015"}, - {"2001:c38:9201::/36", "9931"}, - {"2800:bf0:a00c::/39", "27947"}, - {"2a06:4e80::/29", "49375"}, - {"2600:1008:a100::/43", "6167"}, - {"2605:cd40:2::/32", "14363"}, - {"2a0b:b780::/29", "206291"}, - {"2a0b:d700::/29", "13178"}, - {"2607:1280:1310::/44", "394972"}, - {"2804:8358::/32", "272192"}, - {"2a0b:25c0::/29", "58243"}, - {"2a0c:7600::/29", "205190"}, - {"2001:56b:400c::/35", "852"}, - {"2401:d800:2c40::/42", "7552"}, - {"2607:fdf0:5e1e::/42", "8008"}, - {"2804:70d8::/32", "270743"}, - {"2c0f:ef98::/32", "328359"}, - {"2a02:26f7:c544::/48", "36183"}, - {"2404:6c80::/32", "134658"}, - {"2a02:fe9:337::/32", "39686"}, - {"2a02:26f7:56::/48", "36183"}, - {"2a02:26f7:e2c9::/42", "20940"}, - {"2a05:4a40:fff0::/44", "2571"}, - {"2a06:941::/48", "202958"}, - {"2001:67c:2b0c::/48", "15542"}, - {"2001:18e8::/46", "87"}, - {"240a:a5af::/32", "144105"}, - {"2804:1d3c:8000::/33", "264356"}, - {"2a01:7fe0::/32", "199803"}, - {"2a02:21b2:ac14::/48", "57370"}, - {"2001:1218:604d::/43", "278"}, - {"2001:16a2:c3cc::/46", "39891"}, - {"2001:4408:7001::/38", "4758"}, - {"240a:a49c::/32", "143830"}, - {"2600:6c10:ffb5::/41", "20115"}, - {"2a01:8400::/32", "20676"}, - {"2a02:2658:3000::/32", "20860"}, - {"2a03:1ac0:2e00::/48", "34533"}, - {"2a04:c7c0::/29", "31382"}, - {"2a0c:9a40:1005::/48", "34927"}, - {"2001:559:8224::/48", "7725"}, - {"2001:c10::/32", "7473"}, - {"240a:a2d3::/32", "143373"}, - {"2605:4300:1213::/40", "22616"}, - {"2800:160:1866::/44", "14259"}, - {"2804:2fa4::/32", "52771"}, - {"2400:cb00:131::/48", "395747"}, - {"2804:2c80::/32", "265223"}, - {"2a02:26f7:d080::/48", "36183"}, - {"2a0d:2584:efff::/48", "141776"}, - {"2a0d:5087:1a2c::/48", "34202"}, - {"2001:559:45::/48", "33659"}, - {"2001:1248:998f::/42", "11172"}, - {"2620:118:a000::/47", "42633"}, - {"2804:2ff8::/32", "264923"}, - {"2c0f:fe38:2::/45", "33771"}, - {"2001:1388:49ca::/35", "6147"}, - {"2801:80:3780::/48", "269543"}, - {"2a05:fdc0:1001::/29", "42313"}, - {"2a0a:e5c0:10::/48", "213081"}, - {"2a0d:d81::/32", "213075"}, - {"2001:559:81c0::/48", "7015"}, - {"240e:3b5:7600::/39", "140313"}, - {"2605:a7c0:130::/48", "14618"}, - {"240a:a10e::/32", "142920"}, - {"240a:aae5::/32", "145439"}, - {"2001:16a6:c100::/40", "25019"}, - {"2a04:8f40:1000::/48", "205505"}, - {"240a:a657::/32", "144273"}, - {"2a02:26f7:f744::/48", "36183"}, - {"2001:470:8b::/45", "6939"}, - {"2001:67c:2dd0::/48", "200881"}, - {"2602:fdab::/36", "397968"}, - {"2602:feb4:120::/44", "25961"}, - {"2610:20:5110::/42", "5744"}, - {"2a06:8146:49a1::/48", "199364"}, - {"2001:559:1a5::/48", "33287"}, - {"2001:559:c150::/48", "33668"}, - {"240e:67f:c400::/39", "140330"}, - {"2a01:a180::/32", "47212"}, - {"2001:559:c422::/48", "7725"}, - {"2001:67c:7e8::/48", "47405"}, - {"2600:6c38:b1::/41", "20115"}, - {"2804:2728:713::/36", "263880"}, - {"2a0c:9180::/48", "13127"}, - {"2600:1413:7001::/36", "20940"}, - {"2620:138:30ff::/48", "398849"}, - {"2804:214:8753::/40", "26615"}, - {"2a0c:b641:5f0::/44", "212832"}, - {"2a0f:280::/29", "57353"}, - {"2400:adc0::/45", "9541"}, - {"2409:8c14:3c00::/32", "56044"}, - {"2620:9b:8000::/40", "36152"}, - {"2a01:c50f:a140::/37", "12479"}, - {"2a10:cc42:19d6::/44", "20473"}, - {"2001:559:8708::/48", "33650"}, - {"2001:559:870f::/48", "20214"}, - {"2400:cb00:429::/48", "13335"}, - {"2404:8d06:6000::/40", "133543"}, - {"2600:1415:801::/38", "20940"}, - {"2620:171:ab::/43", "715"}, - {"2803:7210:effe::/48", "21826"}, - {"2a00:8de7::/32", "51840"}, - {"2a0d:1e40::/29", "202714"}, - {"2001:559:491::/48", "33657"}, - {"2404:1400::/48", "46027"}, - {"2408:8459:a410::/42", "17623"}, - {"2806:2a0:1c::/42", "28548"}, - {"2a10:4741:30::/45", "208914"}, - {"2402:3a80:1ab8::/41", "38266"}, - {"240e:983:5::/39", "4134"}, - {"2607:fc58:1:97::/60", "13536"}, - {"2804:76f8::/32", "271146"}, - {"2a0a:4640:21::/29", "206177"}, - {"2a10:cc42:1800::/40", "20473"}, - {"2001:559:8034::/48", "33490"}, - {"2001:559:c350::/48", "7922"}, - {"2600:8809:c000::/30", "22773"}, - {"2602:fd9c::/36", "398045"}, - {"2a11:8180::/29", "56897"}, - {"2001:388:10e1::/34", "7575"}, - {"2001:559:c494::/46", "7922"}, - {"2407:4e00:1:1::/62", "17995"}, - {"2a02:2538::/32", "43012"}, - {"2001:67c:17cc::/48", "3301"}, - {"2605:a900:d::/46", "46887"}, - {"2a02:ff0:2::/48", "12735"}, - {"2a02:26f0:1c::/48", "31108"}, - {"2a03:6400:30::/44", "11054"}, - {"2a0e:b107:2b::/48", "208059"}, - {"2001:559:70c::/48", "33659"}, - {"2a07:8d80::/29", "61110"}, - {"2001:1248:a43d::/41", "11172"}, - {"2804:2954::/32", "264009"}, - {"2602:808:c000::/48", "19661"}, - {"2804:4aec::/32", "267272"}, - {"2a02:26f7:facd::/42", "20940"}, - {"2a06:cd40:cafe::/47", "43927"}, - {"2a09:4c2:35::/41", "58057"}, - {"2c0f:ecb0::/32", "328423"}, - {"2001:12f0:b40::/42", "1916"}, - {"2603:fa70::/24", "397165"}, - {"2409:8054:29::/45", "56040"}, - {"2610:a1:3034::/48", "12008"}, - {"2a02:3d0:601::/42", "22822"}, - {"2a04:4e42:18::/42", "54113"}, - {"2a06:a005:bb::/48", "207941"}, - {"2a0f:5707:abc0::/44", "210887"}, - {"2404:bf40:c3c2::/47", "7545"}, - {"240a:a745::/32", "144511"}, - {"2607:d500:a00::/40", "54527"}, - {"2607:f920::/32", "11758"}, - {"2a03:f200::/32", "30962"}, - {"2a04:4b80::/29", "39397"}, - {"2001:67c:2e4::/48", "47886"}, - {"2001:67c:1790::/48", "51350"}, - {"2001:4d78:2700::/40", "15830"}, - {"2401:d800:b430::/41", "7552"}, - {"2804:84::/32", "14282"}, - {"2a02:26f7:69::/48", "20940"}, - {"2a05:9a00:1000::/46", "59441"}, - {"2406:7600::/32", "38084"}, - {"240a:a194::/32", "143054"}, - {"2600:1406:d800::/48", "35994"}, - {"2604:d600:1133::/44", "32098"}, - {"2620:7c:a000::/48", "32982"}, - {"2800:40:36::/32", "16814"}, - {"2a06:14c0::/32", "213211"}, - {"2a05:8883:ffff::/48", "48749"}, - {"2605:dd40:8201::/46", "398549"}, - {"2a01:c9c0:8000::/48", "2280"}, - {"2a02:ac80:701::/36", "25145"}, - {"2a04:4e40:f800::/48", "54113"}, - {"2001:559:81a9::/48", "33651"}, - {"2001:67c:16cc::/48", "59469"}, - {"2001:14b0:54::/32", "12374"}, - {"2001:4408:5201::/46", "4758"}, - {"2404:a140:a::/45", "138915"}, - {"240a:ab37::/32", "145521"}, - {"2a00:86c0:263::/35", "2906"}, - {"2a0c:44c0:1::/46", "198611"}, - {"2607:f2b1:70::/47", "12257"}, - {"2803:2a20::/32", "265850"}, - {"2001:559:c47d::/40", "7922"}, - {"2001:da8:c4::/48", "138393"}, - {"2401:7500:fff2::/47", "33480"}, - {"240e:0:9000::/36", "23724"}, - {"2610:e0:a020::/43", "2572"}, - {"2803:a210::/32", "271900"}, - {"2804:5d1c::/32", "268951"}, - {"2a00:c940::/32", "12581"}, - {"2001:1248:9987::/44", "11172"}, - {"2402:a740::/32", "134868"}, - {"240e:a65:1a00::/34", "140330"}, - {"2604:9d40:1337::/48", "393290"}, - {"2a06:e180::/29", "57081"}, - {"2a0b:4380::/32", "43594"}, - {"2001:dce:d452::/47", "45285"}, - {"2406:8800:9019::/46", "17465"}, - {"2607:7b80:f000::/36", "32798"}, - {"2a04:d202::/29", "61438"}, - {"2001:7fb:fd04::/48", "15562"}, - {"2401:4900:18f0::/39", "45609"}, - {"240a:a245::/32", "143231"}, - {"240a:a264::/32", "143262"}, - {"2a02:3d0:8::/37", "22822"}, - {"2a0a:2846:1::/36", "42962"}, - {"2607:f428::/32", "20115"}, - {"2801:1a:c800::/48", "262589"}, - {"2405:4803:2d0::/44", "18403"}, - {"2409:e:e1::/48", "142502"}, - {"2607:fc58:1:23::/64", "13536"}, - {"2a04:5b81:2000::/48", "206499"}, - {"2a06:cd00::/29", "57129"}, - {"2001:559:8762::/48", "20214"}, - {"2402:2f80:1::/48", "38001"}, - {"2405:d000:8000::/33", "18024"}, - {"2610:b0:2070::/33", "3573"}, - {"2803:9800:b01a::/42", "11664"}, - {"2606:d00::/32", "3926"}, - {"2a04:4e41:18::/42", "54113"}, - {"2620:0:120::/48", "32058"}, - {"2a01:8840:6e::/43", "12041"}, - {"2409:40c3::/26", "55836"}, - {"2409:804c::/42", "9808"}, - {"2600:b404::/32", "57695"}, - {"2605:a7c0:150::/48", "14618"}, - {"2607:f928:17::/33", "22645"}, - {"2804:653c::/32", "269477"}, - {"2001:4c58::/30", "8286"}, - {"2600:380:d400::/44", "20057"}, - {"2a0c:3800:ff::/39", "205315"}, - {"2001:67c:254::/48", "51224"}, - {"240a:a949::/32", "145027"}, - {"2602:fbd0:12::/48", "14618"}, - {"2a02:26f7:d8c0::/48", "36183"}, - {"2a05:8880:5::/30", "34304"}, - {"2a0d:7100:b::/48", "44167"}, - {"2a0e:46c7:2a0e::/48", "210645"}, - {"240e:109:802a::/48", "63835"}, - {"2806:10ae:5::/44", "8151"}, - {"2a04:4e40:cc30::/41", "54113"}, - {"2a00:ddc0::/32", "47836"}, - {"2a07:8c40::/47", "202810"}, - {"2a09:6301::/30", "48314"}, - {"2409:891a::/29", "132525"}, - {"240a:ac7f::/32", "145849"}, - {"2600:6c21:406::/44", "20115"}, - {"2804:4ca0::/47", "267381"}, - {"2a02:598::/46", "43037"}, - {"2a02:26f7:c241::/46", "20940"}, - {"2a0b:b500:f800::/48", "60764"}, - {"2400:3a60::/36", "149051"}, - {"2403:3800:9::/37", "4007"}, - {"2408:840d:8f00::/42", "17621"}, - {"2620:0:1605::/48", "6984"}, - {"2620:135:604a::/45", "22697"}, - {"2803:f960::/32", "269749"}, - {"2804:7588::/32", "271053"}, - {"2804:7c70::/32", "271496"}, - {"2a02:26f7:db08::/48", "36183"}, - {"2a02:2808:1005::/48", "196943"}, - {"2402:e380:307::/48", "137219"}, - {"2405:7f00:8360::/37", "133414"}, - {"240e:183:8228::/29", "4134"}, - {"2a05:dfc7:beef::/48", "204136"}, - {"240e:438:4820::/43", "140647"}, - {"2600:370f:3105::/41", "32261"}, - {"2804:417c::/32", "267436"}, - {"2804:6978::/32", "270272"}, - {"2804:31a4::/32", "265028"}, - {"2605:ef80:800a::/40", "36492"}, - {"2620:139:a000::/44", "31807"}, - {"2a01:190:1500::/48", "206159"}, - {"2a09:bac0:433::/48", "13335"}, - {"2402:9900::/48", "27435"}, - {"240a:ab1d::/32", "145495"}, - {"2804:140::/32", "53138"}, - {"2408:8256:798::/36", "17622"}, - {"2605:a401:889d::/39", "33363"}, - {"2a03:db80:4405::/44", "680"}, - {"2a07:3500:11a0::/48", "1136"}, - {"2a0d:b400::/29", "60695"}, - {"2001:559:6c::/47", "7922"}, - {"2001:678:358::/48", "206514"}, - {"2403:e600:1000::/32", "58376"}, - {"240a:ad7b::/32", "146101"}, - {"2600:140a:3001::/33", "20940"}, - {"2600:370f:7348::/45", "32261"}, - {"2a07:89c0::/48", "199484"}, - {"2001:638::/38", "680"}, - {"2001:67c:2bf8::/48", "3301"}, - {"2403:b3c0::/48", "135905"}, - {"2407:7c0::/43", "138128"}, - {"2409:8904:a440::/39", "24547"}, - {"2a0c:d240::/29", "43341"}, - {"2604:2d80:7000::/39", "30036"}, - {"2607:fda0::/32", "27008"}, - {"2801:80:3ab0::/41", "270410"}, - {"2804:1b3:4006::/40", "18881"}, - {"2a0b:f4c0:1a4::/48", "205100"}, - {"2001:67c:29b8::/48", "48430"}, - {"2001:c20:486b::/48", "3758"}, - {"2408:80ea:79a0::/38", "17816"}, - {"2409:8904:6970::/40", "24547"}, - {"2001:650:cc02::/48", "3320"}, - {"2400:9c80:1::/48", "58401"}, - {"2409:8057:3062::/44", "56040"}, - {"2409:896a:3a00::/39", "9808"}, - {"240a:a930::/32", "145002"}, - {"2602:ffe0::/36", "27337"}, - {"2a02:cb80:4280::/45", "43766"}, - {"2600:1006:a000::/43", "6167"}, - {"2001:559:3cc::/48", "7015"}, - {"2001:559:4c1::/48", "7922"}, - {"2001:559:8020::/43", "7922"}, - {"2402:7500:5ff::/38", "24158"}, - {"240a:a5bb::/32", "144117"}, - {"2600:1100::/28", "7381"}, - {"2804:1b44::/32", "61717"}, - {"2804:38cc::/32", "266502"}, - {"2a02:26f7:e78d::/42", "20940"}, - {"2409:8c4d:5201::/30", "9808"}, - {"2804:5334::/32", "268569"}, - {"2806:2f0:7263::/40", "17072"}, - {"2001:1248:5bac::/43", "11172"}, - {"2606:b400:8012::/48", "31898"}, - {"2804:14d:b484::/41", "28573"}, - {"2a0e:b107:5a5::/46", "203943"}, - {"240e:16:b209::/37", "38283"}, - {"2804:ea8::/32", "262966"}, - {"2a02:f740::/29", "39834"}, - {"2a09:bac0:69::/48", "13335"}, - {"2a0f:6680::/29", "41820"}, - {"2001:568:900::/37", "852"}, - {"2001:1248:9a0d::/42", "11172"}, - {"240e:870:50::/30", "4134"}, - {"2804:1ce4::/34", "61681"}, - {"2804:8434:37f::/40", "272246"}, - {"2806:2f0:9c83::/42", "17072"}, - {"2a02:2c8::/32", "44381"}, - {"2a05:cf00::/29", "201014"}, - {"2c0f:fba0::/45", "37333"}, - {"2400:a980:7900::/37", "133111"}, - {"240a:aa5b::/32", "145301"}, - {"2602:fc56::/36", "397901"}, - {"2804:5c0::/32", "262537"}, - {"2a00:9000::/29", "20910"}, - {"2a09:20c0::/31", "25115"}, - {"2001:559:c080::/47", "33491"}, - {"2401:d800:9bc0::/42", "7552"}, - {"2804:1c74::/32", "52712"}, - {"2804:4ed0::/32", "268284"}, - {"2c0f:f188:7::/48", "328228"}, - {"2001:978:2305::/48", "9009"}, - {"2407:4d00:fd02::/48", "38841"}, - {"2602:fd82::/36", "394728"}, - {"2803:ad80::/48", "42473"}, - {"2804:21f8::/44", "262272"}, - {"2001:250:238::/46", "23910"}, - {"2001:4998:180::/48", "7280"}, - {"2400:c600:1331::/48", "24389"}, - {"240a:a991::/32", "145099"}, - {"240a:a9d7::/32", "145169"}, - {"2806:2f0:9d03::/42", "17072"}, - {"2a06:1e00:70::/48", "60695"}, - {"2c0f:fbd8::/34", "37542"}, - {"2001:559:83c3::/48", "33287"}, - {"2401:d800:2b0::/41", "7552"}, - {"240e:44d:2e40::/42", "140349"}, - {"2604:1240:9000::/48", "53423"}, - {"2604:2700:200::/32", "32181"}, - {"2620:53:2000::/48", "6521"}, - {"2a02:28b7::/32", "51790"}, - {"2404:3a00::/48", "45557"}, - {"240e:678:8400::/38", "140329"}, - {"2607:f740:100::/47", "36236"}, - {"2804:5bac::/48", "268862"}, - {"2a02:688::/32", "5394"}, - {"2a06:2340:2000::/44", "9558"}, - {"2001:250:3444::/48", "23910"}, - {"2001:579:2052::/37", "22773"}, - {"2401:d800:e10::/42", "7552"}, - {"2620:1d6:ffe::/47", "2571"}, - {"2804:446c:8001::/33", "28369"}, - {"2a02:578:5c00::/38", "9031"}, - {"2a03:e60:8000::/46", "47530"}, - {"2001:559:1c2::/48", "7015"}, - {"2001:4978:f::/48", "26943"}, - {"2402:8100:20df::/42", "55644"}, - {"2404:4f00:3044::/48", "394749"}, - {"240e:979:3f00::/33", "4134"}, - {"2607:6b80:32::/48", "9009"}, - {"2001:49f0:d001::/44", "174"}, - {"2803:f680::/32", "263230"}, - {"2a0f:c600::/29", "208262"}, - {"240a:a9cb::/32", "145157"}, - {"2a02:26f7:109::/45", "20940"}, - {"2001:da8:203f::/48", "138369"}, - {"2001:4888:8056::/48", "22394"}, - {"2405:c5c0::/32", "139976"}, - {"240a:a41f::/32", "143705"}, - {"240a:a42d::/32", "143719"}, - {"2a02:3a8::/32", "15965"}, - {"2001:1248:977f::/48", "11172"}, - {"2404:2440:face::/48", "138521"}, - {"2804:4b0:4e4::/44", "262459"}, - {"2804:7b18::/32", "271410"}, - {"2a02:60a0::/32", "8793"}, - {"2a05:ee80::/29", "202523"}, - {"2401:b780:68::/47", "65435"}, - {"2409:8904:e1b0::/38", "24547"}, - {"2607:da00:802::/32", "15164"}, - {"2804:6438::/32", "269414"}, - {"2804:7788::/32", "271184"}, - {"2a00:4802:3f00::/33", "8717"}, - {"2001:16a2:c0f4::/44", "39386"}, - {"240a:ade6::/32", "146208"}, - {"2606:bd80::/32", "53732"}, - {"2804:1cc4::/33", "61674"}, - {"2a00:11c0:beef::/48", "42473"}, - {"2a03:4da0::/32", "25341"}, - {"2a07:3c80::/40", "209322"}, - {"2405:7100::/32", "38474"}, - {"2407:b7c0::/32", "17754"}, - {"2408:8459:9650::/36", "17816"}, - {"2605:a401:878c::/42", "33363"}, - {"2620:90:a000::/47", "398989"}, - {"2804:2ee0::/32", "265372"}, - {"2a02:6ca3::/32", "50242"}, - {"2001:559:8353::/48", "33659"}, - {"2001:df6:bd00::/48", "138069"}, - {"2600:1409:7000::/48", "35994"}, - {"2001:4298:89::/32", "30990"}, - {"2405:d800:111::/48", "393954"}, - {"2620:14:e000::/48", "54177"}, - {"2804:2728::/46", "263880"}, - {"2804:7ce8::/32", "271526"}, - {"2a11:1180::/29", "204790"}, - {"2001:559:86f3::/48", "7725"}, - {"2607:f750:9000::/39", "23473"}, - {"2620:e9::/48", "11286"}, - {"2a04:4e40:7610::/44", "54113"}, - {"2a0c:cc00::/32", "205206"}, - {"2001:16a2:16::/42", "39386"}, - {"2602:ff84::/48", "13213"}, - {"2804:7c0c::/32", "271472"}, - {"2403:cb00:cb00::/46", "58621"}, - {"2407:e9c0::/45", "17439"}, - {"2409:896a:9400::/39", "9808"}, - {"2804:53fc::/32", "268621"}, - {"2806:2f0:2223::/43", "17072"}, - {"2a06:dd00::/29", "56694"}, - {"2a0a:9440::/29", "57111"}, - {"2a0b:6700::/32", "197277"}, - {"2001:250:3402::/45", "138438"}, - {"240a:a600::/32", "144186"}, - {"240e:3:8000::/47", "134761"}, - {"2804:1af4::/32", "61700"}, - {"240a:a9f6::/32", "145200"}, - {"2804:4a18::/32", "267218"}, - {"2804:685c::/32", "269687"}, - {"2804:82ac::/32", "272533"}, - {"2a04:9140:3003::/48", "201958"}, - {"2001:559:49a::/47", "21508"}, - {"2001:559:c326::/47", "7922"}, - {"2402:4440:9820::/37", "24423"}, - {"2408:8256:3d75::/48", "17816"}, - {"2a01:210::/32", "8510"}, - {"2a02:9009:201::/27", "3352"}, - {"2401:d800:b3f0::/37", "7552"}, - {"240e:938:f920::/25", "4134"}, - {"2800:160:1f72::/45", "14259"}, - {"2804:14d:1031::/40", "28573"}, - {"2001:550:9203::/36", "174"}, - {"2001:67c:16dc::/48", "559"}, - {"2001:4478:2200::/40", "4739"}, - {"2404:f4c0:a003::/43", "210320"}, - {"2804:3dc8::/32", "266553"}, - {"2a11:680::/29", "208861"}, - {"2409:807e:3900::/31", "9808"}, - {"2a02:26f0:13e::/38", "20940"}, - {"2a0a:f040::/29", "61961"}, - {"2a0b:ea00::/32", "41827"}, - {"2c0f:fc89:60::/43", "36992"}, - {"2606:8e80:4800::/35", "32133"}, - {"2001:500:91::/46", "15135"}, - {"2001:44b8:406a::/48", "7545"}, - {"2408:84f3:3420::/43", "17816"}, - {"2801:13:e800::/48", "271925"}, - {"2a00:54a0::/32", "50941"}, - {"2a02:26f7:d609::/46", "20940"}, - {"2a02:26f7:f68d::/42", "20940"}, - {"2001:67c:2084::/48", "44030"}, - {"2403:ba00:2030::/32", "24521"}, - {"2408:8456:9a40::/37", "17816"}, - {"240a:a2e3::/32", "143389"}, - {"240a:a3a0::/32", "143578"}, - {"2804:640:90::/39", "262713"}, - {"2001:559:8357::/48", "20214"}, - {"2402:79c0:f008::/46", "30060"}, - {"2402:9e80:8::/48", "29802"}, - {"2406:4f40:c::/43", "40676"}, - {"2607:f5b7::/32", "30633"}, - {"2a04:fee3::/32", "49774"}, - {"2a0e:b107:9dc::/48", "141237"}, - {"2001:678:98::/48", "51833"}, - {"2001:678:4c4::/48", "48060"}, - {"2804:6bfc::/32", "270438"}, - {"240a:a7b6::/32", "144624"}, - {"2600:180a:4002::/31", "16552"}, - {"2804:3ed8::/32", "266624"}, - {"2804:4c0c:70::/32", "267345"}, - {"2a02:88d:21f::/48", "47794"}, - {"2a07:2902:400::/38", "3303"}, - {"2a07:d883:100::/48", "208476"}, - {"2a0f:9400:8001::/48", "208393"}, - {"2001:f58::/32", "18126"}, - {"240a:ad86::/32", "146112"}, - {"2620:19b::/32", "19648"}, - {"2804:3c8::/32", "262908"}, - {"2804:3938::/32", "266019"}, - {"2a00:e900::/29", "41175"}, - {"2a03:580::/32", "15576"}, - {"2402:6800:763::/45", "55429"}, - {"2a02:26f0:9f::/48", "34164"}, - {"2001:550:c00:105::/45", "174"}, - {"2001:559:872b::/45", "7922"}, - {"2607:fc58:1:e::/64", "13536"}, - {"2404:f4c0:ff01::/48", "139247"}, - {"2406:e480::/32", "135371"}, - {"240e:3b4:f100::/37", "134775"}, - {"2a00:77e0::/32", "60868"}, - {"2a03:8d20:1ce::/48", "200849"}, - {"2001:559:c4ab::/48", "33657"}, - {"2402:800:3be0::/44", "7552"}, - {"2610:a1:1019::/48", "397228"}, - {"2a02:26f7:ca41::/46", "20940"}, - {"2a06:5040:8::/47", "60188"}, - {"2001:559:c238::/48", "7922"}, - {"2401:d800:7092::/41", "7552"}, - {"240a:a103::/32", "142909"}, - {"240e:db:f000::/37", "4134"}, - {"2a01:7d80:c000::/40", "62214"}, - {"2a01:9700::/35", "8376"}, - {"2a04:4e40:8c00::/48", "54113"}, - {"2a06:8144:1121::/48", "199364"}, - {"2001:4c8:1018::/45", "15290"}, - {"2408:840c:5b00::/40", "17621"}, - {"240a:a7d5::/32", "144655"}, - {"240a:ae8b::/32", "146373"}, - {"240e:44d:4a80::/41", "4134"}, - {"2804:14e8::/32", "263015"}, - {"2a05:2a00::/29", "59816"}, - {"2401:4900:2ec0::/39", "45609"}, - {"2409:8958:ca44::/43", "9808"}, - {"2a0f:b300:1000::/46", "208200"}, - {"2001:579:5a64::/40", "22773"}, - {"2001:da8:201f::/48", "23910"}, - {"2402:e280:4112::/40", "134674"}, - {"2606:2800:420e::/47", "14210"}, - {"2606:4700:42c8::/45", "13335"}, - {"2a02:1397:4000::/40", "21351"}, - {"2001:44b8:105d::/48", "4739"}, - {"240a:a073::/32", "142765"}, - {"2803:9800:9997::/34", "11664"}, - {"2a0f:c087:89ca::/48", "212521"}, - {"2402:800:7e30::/41", "7552"}, - {"2604:5500:b400::/38", "19165"}, - {"2804:2050:5a9f::/34", "264485"}, - {"2001:d68:10::/46", "38759"}, - {"2405:58c0:3a::/47", "140840"}, - {"2409:4042:5000::/31", "55836"}, - {"2600:2c00:4000::/36", "7349"}, - {"2605:2180:911::/32", "12422"}, - {"2405:9800:d001::/48", "134240"}, - {"2804:6318::/32", "269338"}, - {"2a04:f580:9000::/46", "4809"}, - {"2a09:d881::/48", "209680"}, - {"2001:67c:85c::/48", "210775"}, - {"2001:c20:48b5::/48", "9255"}, - {"2001:4b22:12:1::/29", "34288"}, - {"240e:44d:3980::/41", "4134"}, - {"2600:1407:2c01::/35", "20940"}, - {"2800:320:8401::/48", "27882"}, - {"2804:4544::/40", "266915"}, - {"2a01:6d8::/32", "30889"}, - {"2001:67c:2970::/48", "211722"}, - {"2408:8456:4c00::/42", "17622"}, - {"2409:8750:900::/38", "56047"}, - {"240a:a00b::/32", "142661"}, - {"240c:ca24::/30", "23910"}, - {"2a02:2ab8:310::/42", "702"}, - {"2001:4878:4003::/48", "35994"}, - {"2408:8459:d1c0::/36", "17816"}, - {"240a:a75f::/32", "144537"}, - {"2800:370:a::/48", "28006"}, - {"2804:3e24::/32", "266576"}, - {"2800:a30:1709::/33", "262187"}, - {"2803:2b00::/35", "52468"}, - {"2804:64b8:4000::/34", "269444"}, - {"2a0b:ed42::/29", "212547"}, - {"2001:df2:9b00::/48", "56141"}, - {"2404:f4c0:5000::/39", "139248"}, - {"2605:640f:bcd7::/48", "211481"}, - {"2804:14d:4ce5::/44", "28573"}, - {"2a00:b940::/32", "33991"}, - {"2001:678:93c::/48", "209467"}, - {"2803:6680:102::/32", "267789"}, - {"2a07:81c0::/29", "29608"}, - {"2001:559:4e6::/48", "7016"}, - {"2001:559:81eb::/45", "7922"}, - {"2001:df3:f980::/48", "132040"}, - {"2409:804f:1100::/36", "9808"}, - {"2a04:4e40:8400::/48", "54113"}, - {"240e:940:ee00::/40", "136197"}, - {"2604:d600:15ee::/43", "32098"}, - {"2804:23bc::/32", "264180"}, - {"2402:2900::/32", "45701"}, - {"2a01:111:4005::/36", "8075"}, - {"2a0a:7880:103::/48", "206677"}, - {"2806:2f0:7283::/42", "17072"}, - {"2402:e380:305::/48", "135103"}, - {"240e:3b4:2c00::/35", "134774"}, - {"2610:e0:3000::/33", "2572"}, - {"2a00:8860:300::/48", "50389"}, - {"2001:1248:566a::/43", "11172"}, - {"2408:8459:1850::/39", "17816"}, - {"240a:a060::/32", "142746"}, - {"2606:2800:4ae4::/46", "15133"}, - {"2001:67c:7b0::/48", "57287"}, - {"2001:44b8:6044::/44", "7545"}, - {"2404:c000:4000::/46", "45147"}, - {"240a:abdb::/32", "145685"}, - {"2605:a404:722::/41", "33363"}, - {"2804:14d:1800::/40", "28573"}, - {"2a01:8840:5a::/45", "12041"}, - {"2a02:26f7:d651::/42", "20940"}, - {"2001:1960::/46", "5650"}, - {"2401:d800:9b30::/41", "7552"}, - {"2605:8300:3::/44", "33059"}, - {"2a02:26f7:ce48::/48", "36183"}, - {"2600:6c38:b25::/46", "20115"}, - {"2804:25bc:21::/32", "264299"}, - {"2405:9800:b01b::/42", "133481"}, - {"2a00:1248:501d::/46", "39058"}, - {"2a07:a905:ffef::/48", "204543"}, - {"2a0c:b641:270::/44", "207149"}, - {"2400:cb00:36::/48", "132892"}, - {"2804:7108::/32", "52881"}, - {"240a:aea1::/32", "146395"}, - {"240e:90e:2000::/36", "137688"}, - {"2800:bf0:152::/44", "27947"}, - {"2001:67c:28f0::/48", "57090"}, - {"2a00:4802:e40::/40", "13124"}, - {"2001:67c:1548::/48", "200693"}, - {"2001:7c8::/29", "2110"}, - {"2408:8956:8100::/40", "17816"}, - {"2604:f400:1::/48", "26878"}, - {"2804:13b4:8400::/33", "262288"}, - {"2804:4df4::/32", "268230"}, - {"2a02:328::/29", "25279"}, - {"2a0e:1d80:8::/47", "9009"}, - {"2402:7500:5b3::/45", "24158"}, - {"2409:8924:4300::/37", "56046"}, - {"2804:4068::/32", "265957"}, - {"2a01:488:bb05::/48", "20773"}, - {"2a04:680::/29", "61395"}, - {"2a0a:90c0:10c1::/48", "205080"}, - {"240a:a7d9::/32", "144659"}, - {"2600:140b:c00::/48", "31109"}, - {"2a02:26f7:d848::/48", "36183"}, - {"2a02:cb80:2510::/48", "43766"}, - {"2001:448a:70b0::/32", "7713"}, - {"2600:1005:b080::/42", "22394"}, - {"2001:c20:485e::/47", "9255"}, - {"240c:ca12::/32", "23910"}, - {"240e:107:c100::/40", "134774"}, - {"2a02:26f7:dac4::/48", "36183"}, - {"2001:4d0:109::/34", "297"}, - {"2001:2041::/32", "1299"}, - {"2408:8956:cb40::/40", "17816"}, - {"240e:108:4a::/48", "4811"}, - {"2600:100d:9100::/44", "6167"}, - {"2606:2e00:8002::/47", "32780"}, - {"2620:0:28b0::/48", "2936"}, - {"2001:678:498::/48", "44574"}, - {"240a:ae7a::/32", "146356"}, - {"2a00:ef80::/32", "35334"}, - {"2408:8256:2f97::/44", "17623"}, - {"2408:8738::/32", "4837"}, - {"240a:a235::/32", "143215"}, - {"2620:0:250::/48", "7046"}, - {"2a00:7280::/32", "56745"}, - {"2a02:26f7:e515::/46", "20940"}, - {"2401:d800:b030::/41", "7552"}, - {"2600:1415:1001::/37", "20940"}, - {"2602:fcd8:10::/46", "399141"}, - {"2605:3380:d000::/36", "395174"}, - {"2800:484:f200::/40", "14080"}, - {"2804:214:8788::/33", "26615"}, - {"2a01:c50f:9f40::/34", "12479"}, - {"2a02:888:8043::/48", "47794"}, - {"2a03:1a60::/32", "197161"}, - {"2a09:be40:ba00::/47", "208915"}, - {"2a0e:8200::/29", "206516"}, - {"2001:578:139::/45", "22773"}, - {"2001:67c:2658::/48", "204179"}, - {"2402:f800:f000::/36", "7602"}, - {"2408:84f4::/28", "4837"}, - {"2804:7c98::/32", "271506"}, - {"2a01:5041:2::/48", "202196"}, - {"2a01:9fc0::/32", "3238"}, - {"2001:559:407::/48", "22258"}, - {"2404:ae40::/32", "138932"}, - {"2603:c024::/35", "31898"}, - {"2607:f6f0:8000::/48", "32550"}, - {"2800:160:28e2::/38", "14259"}, - {"2804:5610::/32", "267974"}, - {"2804:5cbc::/32", "268927"}, - {"2a02:24d0::/32", "43545"}, - {"2404:d500::/47", "132370"}, - {"2405:7140::/47", "132335"}, - {"2600:100f:b080::/41", "22394"}, - {"2800:bf0:81ec::/47", "52257"}, - {"2a02:26f7:cd89::/46", "20940"}, - {"240e:44d:400::/41", "140345"}, - {"2620:115:7002::/40", "55091"}, - {"2a04:5d00:70::/48", "202590"}, - {"2a11:2980::/29", "60135"}, - {"2404:6900:cd00::/34", "17819"}, - {"240e:958:1300::/36", "4134"}, - {"2620:1ec:4::/46", "8068"}, - {"2a03:27a0::/32", "13237"}, - {"2a07:3500:1bc0::/48", "1136"}, - {"2a0c:681::/29", "200000"}, - {"2a0f:d40::/29", "60262"}, - {"2001:559:85e9::/48", "33662"}, - {"2001:5b0::/39", "6621"}, - {"2600:140f:2801::/39", "20940"}, - {"2602:fed2:731d::/48", "142418"}, - {"2605:3380:45fe::/38", "12025"}, - {"2804:2f40:f00a::/45", "264880"}, - {"2001:559:c37e::/47", "7922"}, - {"2404:f4c0:f408::/48", "209218"}, - {"240a:a0aa::/32", "142820"}, - {"2604:4580:204::/32", "26375"}, - {"2804:4084::/32", "265964"}, - {"2804:79e8::/32", "271335"}, - {"2a02:26f0:8701::/36", "20940"}, - {"2001:470:5b::/45", "6939"}, - {"2001:550:bb02::/33", "174"}, - {"2001:559:1fe::/48", "7725"}, - {"2405:6600:c01::/41", "45845"}, - {"240a:a0d3::/32", "142861"}, - {"2804:71ec::/32", "270820"}, - {"2a02:ac80:11::/42", "25145"}, - {"2401:4900:3820::/44", "45609"}, - {"2a02:26f7:f2c4::/48", "36183"}, - {"2a05:b80::/29", "50867"}, - {"2001:559:c226::/48", "33650"}, - {"2404:2280:113::/48", "24429"}, - {"240a:a32e::/32", "143464"}, - {"2600:140f:d801::/38", "20940"}, - {"2a06:8080::/29", "31349"}, - {"2a09:be40:ba02::/48", "137909"}, - {"2001:67c:2778::/48", "57926"}, - {"2001:1468::/33", "30738"}, - {"2409:8e50::/30", "56047"}, - {"240a:ae90::/32", "146378"}, - {"2600:140b:f801::/37", "20940"}, - {"2803:6b80::/32", "28093"}, - {"2803:9800:a88d::/43", "11664"}, - {"2a01:58:20::/47", "12782"}, - {"2a03:c980:beef::/48", "210079"}, - {"2800:3b0:10ff::/48", "6429"}, - {"2c0f:ea88::/32", "327931"}, - {"2c0f:fb60::/32", "12455"}, - {"2001:559:86be::/48", "33491"}, - {"2402:800:55d3::/44", "7552"}, - {"2600:6c7f:9002::/48", "20115"}, - {"2804:bb0:8000::/40", "52808"}, - {"2a02:26f7:cf8c::/48", "36183"}, - {"2a02:2b08::/32", "5552"}, - {"2a06:3b80:30::/48", "200478"}, - {"2a0e:c780::/29", "7018"}, - {"240a:ab21::/32", "145499"}, - {"2620:118:8032::/48", "40885"}, - {"240a:a54a::/32", "144004"}, - {"240a:a59b::/32", "144085"}, - {"2620:d3:8000::/48", "54536"}, - {"2804:58c8::/32", "268149"}, - {"2806:2f0:30a3::/41", "17072"}, - {"2401:7400:cc01::/34", "4773"}, - {"240a:a077::/32", "142769"}, - {"240a:a207::/32", "143169"}, - {"2604:3f40::/36", "394277"}, - {"2604:d800::/35", "20355"}, - {"2800:160:220f::/42", "14259"}, - {"2804:380::/32", "262890"}, - {"2a02:26f7:f8c9::/46", "20940"}, - {"2a03:2200::/32", "50998"}, - {"2400:5200:1c00::/40", "55410"}, - {"2400:cb00:250::/47", "13335"}, - {"2401:440::/32", "10004"}, - {"240a:a9f9::/32", "145203"}, - {"2606:ae00:6ac0::/37", "7287"}, - {"2a07:6100::/29", "202979"}, - {"2404:d00::/32", "58616"}, - {"240a:a91b::/32", "144981"}, - {"2600:1480:e800::/48", "21342"}, - {"2606:8b80::/32", "15129"}, - {"2620:11a:a02b::/45", "43515"}, - {"2a02:26f7:d4c0::/48", "36183"}, - {"2a0f:1e84::/32", "7203"}, - {"2602:fbef::/48", "32150"}, - {"2604:4000:2000::/36", "32133"}, - {"2001:678:39c::/48", "29684"}, - {"2600:140b:5801::/38", "20940"}, - {"2800:160:1245::/46", "14259"}, - {"2804:7014::/32", "270704"}, - {"2806:2f0:4761::/40", "17072"}, - {"2a01:c50f:c500::/38", "12479"}, - {"2001:559:3b7::/48", "13367"}, - {"2001:678:c84::/48", "48655"}, - {"2001:49f0:a060::/44", "174"}, - {"2401:4900:5290::/44", "45609"}, - {"2600:1007:f010::/40", "22394"}, - {"2600:6c3a:e01::/46", "20115"}, - {"2a0b:6b86:3fc::/48", "202562"}, - {"2a0f:3106::/32", "49392"}, - {"2001:67c:78c::/48", "56531"}, - {"2408:8956:5100::/40", "17816"}, - {"2804:5a5c::/35", "268768"}, - {"2a03:6b00::/47", "48832"}, - {"2c0f:f050::/32", "327804"}, - {"2001:67c:2c44::/48", "49588"}, - {"2600:1404:ac00::/48", "35994"}, - {"2001:67c:2f24::/48", "25365"}, - {"2404:8600::/33", "17918"}, - {"2409:8052:2::/40", "56047"}, - {"240a:ae37::/32", "146289"}, - {"2800:160:111a::/42", "14259"}, - {"2800:a30:ed31::/35", "262187"}, - {"2804:14d:7e25::/43", "28573"}, - {"2a00:1b48::/32", "197695"}, - {"2a01:5a00::/32", "9208"}, - {"2001:559:8775::/48", "7725"}, - {"2620:11d:9002:300::/53", "33186"}, - {"2804:33cc::/32", "28656"}, - {"2804:5d5c::/32", "268967"}, - {"2a02:6a0:cffe::/47", "8729"}, - {"2a0b:b87:ffe8::/48", "44754"}, - {"2001:250:84a::/48", "138182"}, - {"240a:ad71::/32", "146091"}, - {"240e:964:800::/37", "133774"}, - {"2605:de40:a000::/33", "397553"}, - {"2001:559:4d9::/48", "7015"}, - {"2400:a980:e6::/44", "133111"}, - {"2401:d800:7d50::/42", "7552"}, - {"2402:800:91b7::/41", "7552"}, - {"2600:6c10:f306::/47", "20115"}, - {"2603:c028::/35", "31898"}, - {"2620:149:ac1::/46", "714"}, - {"2a02:26f7:c5cc::/48", "36183"}, - {"2a0c:b180::/29", "16019"}, - {"2a0f:a00::/32", "396362"}, - {"2001:559:835c::/48", "33657"}, - {"2001:df2:6000::/48", "58392"}, - {"2409:8054:4d::/46", "56040"}, - {"2a02:a00::/44", "15987"}, - {"2a03:4b20:f000::/36", "3209"}, - {"2404:8000:b0::/46", "17451"}, - {"2a02:26f7:f794::/48", "36183"}, - {"2001:559:8161::/48", "33657"}, - {"2001:938:402c::/46", "8437"}, - {"2620:107:6000:1601::/44", "6462"}, - {"2803:da20:100::/40", "265855"}, - {"2804:f4c::/32", "263578"}, - {"2804:11e8::/32", "52752"}, - {"2001:891::/29", "8447"}, - {"2400:7400:30::/46", "23736"}, - {"2804:14c:5fd5::/44", "28573"}, - {"2a00:1d58:bf00::/33", "47524"}, - {"2001:559:19:e000::/64", "20940"}, - {"2001:559:8315::/48", "7015"}, - {"2001:4878:2136::/48", "12222"}, - {"2401:d800:9dc0::/42", "7552"}, - {"2402:23c0::/32", "137210"}, - {"2408:84f3:e210::/42", "134543"}, - {"2804:759c::/35", "271058"}, - {"2a10:4741:24::/48", "213327"}, - {"2001:4978::/44", "19255"}, - {"2409:804f:100::/36", "9808"}, - {"2801:88::/32", "53166"}, - {"2408:8459:7c50::/38", "17816"}, - {"2409:8020:1071::/40", "56046"}, - {"2804:6a5c:8000::/40", "270331"}, - {"2a02:26f7:bb44::/47", "36183"}, - {"2a06:7600::/29", "44205"}, - {"2001:df2:380::/48", "138296"}, - {"2a06:9cc7:ff11::/46", "8666"}, - {"2001:7fb:fe00::/47", "12654"}, - {"2402:7d80:240::/48", "24348"}, - {"2404:0:5006::/36", "17709"}, - {"2405:8a00:a01c::/47", "55824"}, - {"2604:30c0::/32", "395880"}, - {"2620:74:a0::/48", "30060"}, - {"2406:3000:8:4030::/60", "9874"}, - {"240e:397:c00::/38", "140489"}, - {"2804:6008::/32", "269141"}, - {"2804:7d18::/32", "271538"}, - {"2001:559:8580::/48", "7015"}, - {"2402:800:542b::/41", "7552"}, - {"240a:ab7d::/32", "145591"}, - {"2a00:a000::/32", "35332"}, - {"2001:16a2:c390::/44", "39891"}, - {"240a:a410::/32", "143690"}, - {"2600:6c3b:498::/41", "20115"}, - {"2607:f938::/32", "40028"}, - {"2804:21ac::/32", "264566"}, - {"2a00:1ca8:2c::/48", "206264"}, - {"2a0c:6fc0::/40", "198755"}, - {"2001:da8:901b::/45", "23910"}, - {"240a:a9ed::/32", "145191"}, - {"2800:bf0:2c6::/48", "27947"}, - {"2806:267:3400::/41", "13999"}, - {"2a00:f820::/29", "34549"}, - {"2001:559:8232::/48", "7922"}, - {"2001:559:87fd::/48", "7922"}, - {"240a:aaae::/32", "145384"}, - {"2604:900::/32", "14477"}, - {"2804:930::/32", "263057"}, - {"2804:62bc::/32", "269315"}, - {"2a02:26f0:85::/46", "20940"}, - {"2a0e:97c0:620::/44", "210562"}, - {"2409:804d:1900::/34", "9808"}, - {"2600:100f:f000::/44", "6167"}, - {"2604:880:41::/48", "29802"}, - {"2607:fa58::/32", "31877"}, - {"2001:678:890::/48", "33958"}, - {"2409:8000:900::/37", "9808"}, - {"240a:aed8::/32", "146450"}, - {"2804:650::/32", "262558"}, - {"2a03:540::/32", "34718"}, - {"2001:67c:2b94::/48", "62463"}, - {"240e:187::/25", "4134"}, - {"240e:979:7e00::/40", "134770"}, - {"2804:3e8:2100::/32", "28663"}, - {"2804:65fc::/32", "269526"}, - {"2804:8114::/32", "272430"}, - {"2a09:2701::/32", "208187"}, - {"2a0c:4300::/41", "43722"}, - {"2a0f:9400:7830::/47", "147028"}, - {"2001:4998:1c::/48", "14779"}, - {"2401:c80::/32", "24111"}, - {"2404:3d00:400e::/41", "3573"}, - {"240a:a8e6::/32", "144928"}, - {"2800:9b0::/32", "52342"}, - {"2804:85dc::/32", "272605"}, - {"2001:559:8537::/48", "33491"}, - {"2a02:26f7:6e::/48", "36183"}, - {"2408:84f3:3290::/37", "17816"}, - {"2600:809:425::/38", "701"}, - {"2a01:5b0:2::/48", "48519"}, - {"2a05:1940::/29", "203243"}, - {"2001:559:cc::/48", "33657"}, - {"2001:559:376::/48", "33651"}, - {"2402:800:63b1::/41", "7552"}, - {"2402:800:9271::/40", "7552"}, - {"2403:1280::/32", "141397"}, - {"2a02:1c8:700::/40", "41704"}, - {"2a02:26f7:f101::/46", "20940"}, - {"2a0b:d7c0::/29", "47237"}, - {"2407:ad80::/32", "45062"}, - {"2409:8062:100::/36", "9808"}, - {"240a:a820::/32", "144730"}, - {"240e:108:1290::/44", "17638"}, - {"240e:45c:1b00::/40", "137401"}, - {"2600:1014:b1a0::/41", "6167"}, - {"2600:1417:58:200::/45", "20940"}, - {"2604:4d40:70ae::/48", "399196"}, - {"2804:39c0::/32", "266048"}, - {"2804:42e4::/32", "267535"}, - {"2a10:78c0::/29", "212559"}, - {"2001:559:82b3::/45", "7922"}, - {"2001:678:16:8000::/49", "42385"}, - {"2a03:2880:f170::/40", "32934"}, - {"2001:559:18c::/46", "33651"}, - {"2001:1900:2264::/48", "27564"}, - {"2406:e940::/35", "9449"}, - {"2407:a580::/32", "4851"}, - {"240a:a0c5::/32", "142847"}, - {"2800:b70:100::/48", "262191"}, - {"2804:10b4:200::/32", "263645"}, - {"2a02:26f7:b800::/48", "36183"}, - {"2a0c:9a40:1017::/48", "202479"}, - {"2001:1238::/32", "22566"}, - {"2401:d800:7370::/40", "7552"}, - {"2620:10d:1000::/44", "5719"}, - {"2800:370:87::/42", "28006"}, - {"2801:0:220::/44", "262156"}, - {"2804:4f8:2000::/36", "28263"}, - {"2804:4c14:9b01::/34", "267348"}, - {"2a02:fe8::/31", "39686"}, - {"2a04:cc0::/29", "29075"}, - {"2a09:7:1::/48", "23959"}, - {"2620:0:6c4::/48", "16807"}, - {"2806:2f0:21e3::/43", "17072"}, - {"2a02:2698:8000::/44", "41682"}, - {"2a05:7c40::/30", "55222"}, - {"2001:da8:5080::/36", "23910"}, - {"240e:3b9:ec00::/35", "140314"}, - {"2a0d:8d07:115::/44", "207616"}, - {"2001:559:7cc::/48", "33650"}, - {"2610:a1:1018::/48", "397226"}, - {"2a04:e00:4::/48", "54103"}, - {"2a0c:fd80::/29", "202334"}, - {"2001:559:16a::/48", "33657"}, - {"2001:559:c4da::/45", "7922"}, - {"2001:ee0:9040::/39", "45899"}, - {"240a:a661::/32", "144283"}, - {"2602:80c::/47", "14618"}, - {"2001:c00:facf::/37", "4618"}, - {"240a:a149::/32", "142979"}, - {"2001:678:f44::/48", "203329"}, - {"2402:8100:31e8::/36", "55644"}, - {"2404:bf40:8584::/48", "7545"}, - {"240a:a276::/32", "143280"}, - {"2800:bf0:2a07::/48", "52257"}, - {"2001:b98::/29", "5413"}, - {"2001:4408:5203::/42", "4758"}, - {"2402:800:73c0::/42", "7552"}, - {"2a02:1710:2::/48", "42775"}, - {"2a11:c480::/29", "204790"}, - {"2605:6ac0:7000::/36", "12182"}, - {"2620:138:5000::/44", "13925"}, - {"2a07:3501:1010::/48", "1136"}, - {"2402:800:fdf0::/38", "7552"}, - {"2404:7180:aa10::/48", "23848"}, - {"2600:1408:2001::/36", "20940"}, - {"2600:6c10:f316::/44", "20115"}, - {"2800:160:1f63::/43", "14259"}, - {"2804:c04::/32", "52660"}, - {"2804:4250::/32", "267492"}, - {"2408:8956:5200::/40", "17622"}, - {"240a:a14d::/32", "142983"}, - {"2600:6c20:2::/44", "20115"}, - {"2607:f138::/32", "19151"}, - {"2620:4b:c000::/46", "29921"}, - {"2804:1424::/32", "52940"}, - {"2a03:8b60:10::/45", "29256"}, - {"2001:df0:245::/48", "132020"}, - {"240e:1d:5000::/30", "4134"}, - {"240e:438:8420::/43", "140647"}, - {"2804:4850:200::/32", "267113"}, - {"2804:7680::/32", "271116"}, - {"2a00:15a0::/32", "201577"}, - {"2a0d:adc0::/29", "60843"}, - {"2001:1a00::/32", "15412"}, - {"2401:2400:a::/32", "38496"}, - {"2404:a800:ff02::/30", "9498"}, - {"240a:a35e::/32", "143512"}, - {"2600:8807:aaf4::/39", "22773"}, - {"2804:4e30::/32", "268245"}, - {"2a02:26f7:f301::/46", "20940"}, - {"2a0d:2581:12::/48", "209261"}, - {"2a0f:900::/29", "15435"}, - {"2c0f:f1f0::/32", "328242"}, - {"2001:559:c429::/48", "7725"}, - {"2402:ef03:2001::/40", "7633"}, - {"2408:8000:a021::/35", "4837"}, - {"2607:f140:a001::/33", "25"}, - {"2607:f428:93f0::/37", "20115"}, - {"2804:7a54::/33", "271365"}, - {"2001:fb0:109f:13::/64", "7470"}, - {"240a:a222::/32", "143196"}, - {"240e:ff:c009::/48", "134773"}, - {"2001:1a11:69::/46", "8781"}, - {"2001:44b8:30ee::/48", "4739"}, - {"2407:b000:4011::/48", "45682"}, - {"240a:ac71::/32", "145835"}, - {"2604:7e00:31::/48", "399612"}, - {"2001:559:870c::/48", "33287"}, - {"2800:160:156a::/45", "14259"}, - {"2a04:b080::/29", "42343"}, - {"2001:4528:9580::/38", "18101"}, - {"2a0d:3841:1020::/48", "57629"}, - {"2a10:2f01:2aa::/48", "212995"}, - {"2001:4528:1000::/32", "18101"}, - {"2400:8b00:2000::/42", "45727"}, - {"2401:d800:57c0::/42", "7552"}, - {"2402:800:5c1d::/42", "7552"}, - {"2a02:bf0:2a::/35", "25106"}, - {"2a02:2e02:8930::/41", "12479"}, - {"2602:fe54:5001::/32", "16584"}, - {"2620:149:10a0::/39", "714"}, - {"2001:470:13f::/41", "6939"}, - {"2402:800:311d::/42", "7552"}, - {"2408:8957:7f00::/40", "17816"}, - {"2600:1417:66::/47", "24319"}, - {"2804:7ca4::/32", "271509"}, - {"2a00:4bc0::/37", "31004"}, - {"2a02:26f7:ec8d::/42", "20940"}, - {"2404:3dc0:1::/48", "138552"}, - {"240a:a9fd::/32", "145207"}, - {"240a:ae58::/32", "146322"}, - {"2001:559:c1a5::/48", "21508"}, - {"2401:2d00:22::/48", "17625"}, - {"2405:7f00:95a0::/38", "133414"}, - {"240e:a53:5c00::/34", "134419"}, - {"2600:6c10:146::/47", "20115"}, - {"2a02:7c20::/32", "201424"}, - {"2a06:8bc0::/29", "57103"}, - {"2406:f000::/32", "4844"}, - {"2408:8459:5a50::/37", "17816"}, - {"2408:8957:6700::/40", "17816"}, - {"240a:ab45::/32", "145535"}, - {"2600:380::/39", "20057"}, - {"2a00:cdc0::/32", "12586"}, - {"240a:a0e9::/32", "142883"}, - {"2600:c08:2016::/32", "10913"}, - {"2a0b:1306:4::/48", "198018"}, - {"2408:8956:c9c0::/38", "17622"}, - {"240e:698:4700::/40", "131325"}, - {"2a05:1080:30::/48", "61004"}, - {"2408:8459:3a10::/41", "17623"}, - {"240e:966:ec00::/35", "4134"}, - {"2604:ea40::/32", "13687"}, - {"2401:d800:7810::/41", "7552"}, - {"2408:8459:f150::/38", "17816"}, - {"240a:a776::/32", "144560"}, - {"2604:a180:6000::/32", "11139"}, - {"2a0f:607:1005::/48", "7480"}, - {"2001:df1:3700::/50", "136324"}, - {"240e:3:8002::/36", "134761"}, - {"2620:149:21c::/42", "714"}, - {"2804:6eec::/32", "270627"}, - {"2406:ea00::/32", "131322"}, - {"2408:8756:ce0::/39", "136958"}, - {"240a:a1c7::/32", "143105"}, - {"240e:438:6040::/38", "4134"}, - {"2600:1007:f008::/45", "6167"}, - {"2a02:26f7:d949::/42", "20940"}, - {"2a03:e340::/48", "28753"}, - {"2001:5000:f04::/30", "1273"}, - {"2409:802f:2b06::/48", "56041"}, - {"2600:6c7f:90d0::/48", "20115"}, - {"2605:2840::/32", "393763"}, - {"2804:3748::/32", "266401"}, - {"240a:a252::/32", "143244"}, - {"2600:100a:9000::/44", "6167"}, - {"2402:2200:2b00::/33", "24090"}, - {"240a:a8c2::/32", "144892"}, - {"2600:1012:f020::/40", "22394"}, - {"2600:370f:5243::/45", "32261"}, - {"2800:bf0:289::/43", "52257"}, - {"2804:5ac0::/32", "268793"}, - {"2a0e:3f40::/29", "43282"}, - {"2001:559:377::/48", "33657"}, - {"2001:678:540::/48", "16108"}, - {"2405:9800:c915::/46", "45458"}, - {"2600:1f70:2000::/40", "8987"}, - {"2a02:6c20:4::/48", "207167"}, - {"2a10:ce40::/48", "140224"}, - {"2408:8459:c030::/41", "17622"}, - {"240a:a671::/32", "144299"}, - {"2804:14c:d490::/48", "28573"}, - {"2804:297c::/32", "262907"}, - {"2804:82d8::/32", "272160"}, - {"2a00:e9e0::/32", "48670"}, - {"2a03:9420::/32", "9008"}, - {"2a0e:b107:15a8::/46", "142597"}, - {"2001:648:2801::/44", "5408"}, - {"240a:afe9::/32", "146723"}, - {"2605:b400:600::/32", "25956"}, - {"2620:ff:8000::/48", "22773"}, - {"2a02:ee80:40b2::/47", "21433"}, - {"2001:16a0:1::/46", "25019"}, - {"2408:8a07:6000::/37", "9929"}, - {"240e:41:c800::/30", "4134"}, - {"2804:3870::/32", "266477"}, - {"2a02:2e02:8b00::/41", "12479"}, - {"2a0f:7ac0::/29", "60154"}, - {"2406:840:eabf::/48", "142642"}, - {"2409:8000:5c00::/40", "56048"}, - {"240a:a0cf::/32", "142857"}, - {"2600:1901:8160::/34", "15169"}, - {"2800:800:7f7::/48", "26611"}, - {"2800:a10:2002::/32", "11014"}, - {"2a0a:a5c0:c::/46", "22787"}, - {"2a0b:1301::/34", "198018"}, - {"2001:559:c12c::/48", "7015"}, - {"2409:8c85:1a00::/48", "132525"}, - {"2a02:ee80:4178::/45", "3573"}, - {"2402:7500:468::/40", "24158"}, - {"2404:d940::/35", "134877"}, - {"2804:214:8658::/40", "26615"}, - {"2a06:9cc7:ff01::/46", "8666"}, - {"2001:250:800::/48", "138182"}, - {"2804:31f0::/32", "265046"}, - {"2a00:fb80::/48", "48918"}, - {"2a02:26f7:ba48::/48", "36183"}, - {"2a04:1f00::/30", "8416"}, - {"2a0e:c80:3::/48", "40676"}, - {"2402:800:3a71::/44", "7552"}, - {"2a06:c0c0::/47", "41018"}, - {"2a10:4646:10::/48", "212124"}, - {"240a:a6cc::/32", "144390"}, - {"2401:e300::/32", "23786"}, - {"2406:2000:ef64::/48", "45501"}, - {"2600:1406:9001::/38", "20940"}, - {"2001:df5:5100::/48", "34768"}, - {"2404:160:a040::/37", "10030"}, - {"240a:a631::/32", "144235"}, - {"2804:3c08::/32", "266186"}, - {"2a00:1430::/32", "24958"}, - {"2408:8957:2700::/36", "17816"}, - {"240a:ac89::/32", "145859"}, - {"2602:fe6d::/36", "64249"}, - {"2a01:a920::/32", "201866"}, - {"2001:502:f3ff::/48", "397226"}, - {"2600:6000:f97e::/48", "11351"}, - {"2804:3e78::/32", "266598"}, - {"2a01:82a0::/32", "61952"}, - {"2a06:a001:a010::/44", "208046"}, - {"2a12:dc00::/29", "204790"}, - {"2600:6c38:8d0::/47", "20115"}, - {"2a03:6947:1500::/40", "59819"}, - {"2402:800:98b7::/41", "7552"}, - {"2406:fe00::/32", "23616"}, - {"240e:438:1020::/43", "140647"}, - {"240e:980:9800::/40", "137698"}, - {"2602:fbf6::/40", "8095"}, - {"2605:6a80::/32", "27531"}, - {"2804:f8c:8890::/37", "263591"}, - {"2001:67c:1044::/48", "50609"}, - {"240e:95c:4000::/36", "4134"}, - {"2804:1ed8::/32", "264449"}, - {"2a02:26f7:f749::/46", "20940"}, - {"2001:4228::/32", "15706"}, - {"2600:9000:1e16::/47", "16509"}, - {"2804:7d4::/32", "262325"}, - {"2804:3b2c::/32", "266133"}, - {"2806:250:b::/48", "28545"}, - {"2a01:8840:59::/48", "207266"}, - {"2606:640::/48", "3356"}, - {"2800:690::/32", "3132"}, - {"2804:2860::/32", "263959"}, - {"2a12:a040::/29", "400522"}, - {"2600:1419:cc01::/35", "20940"}, - {"2001:559:1a0::/48", "7015"}, - {"2001:559:c0d6::/48", "7016"}, - {"240e:3b8:3e00::/33", "140308"}, - {"2804:329c::/32", "265088"}, - {"2a04:2ec0::/29", "60849"}, - {"2a09:87c0::/48", "59497"}, - {"240a:adfa::/32", "146228"}, - {"2806:20d:5a07::/44", "32098"}, - {"2001:dce:7001::/38", "23869"}, - {"2400:aa00:9300::/33", "9873"}, - {"2402:800:9ca9::/41", "7552"}, - {"2408:8459:7e30::/41", "17622"}, - {"2a00:8e80::/32", "200678"}, - {"2a0e:97c3:766::/48", "20473"}, - {"2001:4200:7001::/36", "2018"}, - {"2001:4878:8246::/48", "12222"}, - {"2804:33f4::/32", "265427"}, - {"2a00:1d58:f023::/45", "47524"}, - {"2602:fc85:ff0::/45", "398875"}, - {"2001:67c:106c::/48", "58102"}, - {"2607:cf03::/32", "32522"}, - {"2607:f750:a000::/40", "23473"}, - {"2a02:26f7:e340::/48", "36183"}, - {"240a:a2c2::/32", "143356"}, - {"240a:a461::/32", "143771"}, - {"2600:1404:6001::/37", "20940"}, - {"2804:6000::/32", "269139"}, - {"2402:2500:7100::/32", "13445"}, - {"2804:63b0::/32", "269377"}, - {"2a02:26f7:a8::/48", "36183"}, - {"2a0c:b381:800::/32", "204731"}, - {"2001:ee0:2f07::/43", "45899"}, - {"2409:8904:6070::/40", "24547"}, - {"2402:e280:2249::/43", "134674"}, - {"2406:7400:7::/44", "24309"}, - {"2408:8256:3160::/44", "17623"}, - {"2600:1406:9c01::/34", "20940"}, - {"2603:c002:9510::/38", "31898"}, - {"2605:380:aa1::/48", "42388"}, - {"2a02:26f0:a01::/37", "20940"}, - {"2a02:2ad0:619::/42", "702"}, - {"2001:559:8607::/48", "22909"}, - {"2001:5a0:4402::/48", "20940"}, - {"2405:3800::/32", "38466"}, - {"2804:1388::/30", "53037"}, - {"2001:678:c28::/48", "13195"}, - {"240a:a1d3::/32", "143117"}, - {"2600:1000:f100::/44", "6167"}, - {"2a03:4d45::/36", "199610"}, - {"2001:da8:402e::/47", "24353"}, - {"2604::/40", "7397"}, - {"2a10:2500::/29", "400522"}, - {"2600:809:629::/41", "701"}, - {"2600:140f:6000::/48", "55836"}, - {"2600:6c10:f02a::/41", "20115"}, - {"2608:c184:1::/48", "5927"}, - {"2800:160:144c::/47", "14259"}, - {"2801:1d:4800::/48", "13489"}, - {"2803:b9c0:9000::/36", "265705"}, - {"2804:3b8:1e4::/47", "52965"}, - {"2806:230:1008::/48", "265594"}, - {"2001:c28::/32", "4685"}, - {"2400:dd00::/31", "7497"}, - {"2409:8750:700::/36", "56047"}, - {"240a:a8d6::/32", "144912"}, - {"240c:c603::/32", "24361"}, - {"2600:1404:5401::/36", "20940"}, - {"2606:c40::/32", "32913"}, - {"2a02:1065:1000::/36", "13045"}, - {"2a03:3180:4000::/36", "44453"}, - {"2800:c90::/32", "263689"}, - {"2a06:1280:ae03::/33", "61138"}, - {"2a09:38c0::/29", "30823"}, - {"2001:1248:59e8::/45", "11172"}, - {"240e:355:5c00::/34", "134419"}, - {"2803:f8c0::/32", "264750"}, - {"2a02:2ad0:133::/45", "702"}, - {"2407:a9c0::/32", "142356"}, - {"2604:d600:627::/44", "32098"}, - {"2806:2f0:46a1::/46", "17072"}, - {"2001:559:c51b::/42", "7922"}, - {"2606:6800:1800::/40", "394899"}, - {"2804:4ac0::/32", "267261"}, - {"2a04:4e00::/29", "24651"}, - {"240a:af6a::/32", "146596"}, - {"2620:149:a1d::/48", "714"}, - {"2001:559:404::/48", "7922"}, - {"2001:559:c4bb::/48", "7922"}, - {"240a:a3aa::/32", "143588"}, - {"240e:438:a220::/43", "140647"}, - {"2600:6c38:b1f::/42", "20115"}, - {"2804:4154::/32", "52806"}, - {"2a02:26f7:fb00::/48", "36183"}, - {"2a04:4e40:9000::/48", "54113"}, - {"2001:1248:997a::/40", "11172"}, - {"2404:7c00:3::/44", "45650"}, - {"2a04:5b80:53::/48", "202265"}, - {"2001:470:9c::/48", "54972"}, - {"2001:67c:1394::/48", "199351"}, - {"240a:a141::/32", "142971"}, - {"240a:a294::/32", "143310"}, - {"240a:ae80::/32", "146362"}, - {"2602:80c:4::/48", "14618"}, - {"2605:4c40:202::/44", "30081"}, - {"2607:8300:4::/48", "13876"}, - {"2804:3ed0::/35", "266622"}, - {"240a:a27b::/32", "143285"}, - {"2607:ca00:8000::/33", "7122"}, - {"2800:bf0:81cd::/42", "27947"}, - {"2804:6a28::/32", "270316"}, - {"2806:230:204b::/48", "11888"}, - {"2001:559:84a8::/48", "33491"}, - {"240e:945::/36", "136195"}, - {"2604:d600:1659::/36", "32098"}, - {"2a0a:6680:bee5::/46", "203500"}, - {"2a0b:de00:30::/47", "207486"}, - {"240a:a230::/32", "143210"}, - {"2800:160:1d76::/44", "14259"}, - {"2806:2f0:4161::/46", "17072"}, - {"2a01:aa40::/32", "59622"}, - {"2001:df3:da00::/48", "132134"}, - {"2804:574::/45", "53013"}, - {"2804:5248::/32", "268508"}, - {"2001:250:3431::/46", "138393"}, - {"2001:44b8:204f::/48", "4739"}, - {"2620:11d:6000::/42", "30548"}, - {"2800:bf0:16e::/48", "27947"}, - {"2804:27e4::/32", "263927"}, - {"2804:67dc::/32", "269655"}, - {"2804:6bc8::/32", "270425"}, - {"2a09:8d00::/29", "2593"}, - {"2400:4d40:309::/35", "134204"}, - {"2603:c002:9a10::/42", "31898"}, - {"2607:f6f0:20d::/48", "32323"}, - {"2a0e:8a00::/29", "208256"}, - {"2001:67c:2394::/48", "25504"}, - {"2402:800:9155::/42", "7552"}, - {"2408:8256:2f6e::/43", "17623"}, - {"2408:8256:359f::/38", "17816"}, - {"2607:fdf0:5e35::/44", "8008"}, - {"2a02:26f7:c748::/48", "36183"}, - {"2400:cb00:100::/48", "13335"}, - {"2401:c5c0:440::/36", "55492"}, - {"2a02:888:4054::/32", "47794"}, - {"2a0b:e680::/29", "49601"}, - {"2a0f:4ac4::/41", "207671"}, - {"2a10:300::/29", "207367"}, - {"2401:cf80:61fa::/32", "55303"}, - {"2806:230:200b::/48", "11888"}, - {"2a02:2230:6400::/40", "25467"}, - {"2a03:7740::/32", "39232"}, - {"2a0a:1980::/29", "206782"}, - {"2001:559:8434::/48", "7015"}, - {"240a:ab0b::/32", "145477"}, - {"2600:140b:7c01::/32", "20940"}, - {"2600:6c38:177::/44", "20115"}, - {"2605:8300:12::/48", "33059"}, - {"2605:a401:8cd7::/42", "33363"}, - {"2804:60::/42", "53066"}, - {"2804:7764::/32", "271175"}, - {"2a02:26f7:ed48::/48", "36183"}, - {"2001:c38:90a3::/45", "9835"}, - {"2401:e800::/32", "24173"}, - {"2620:d:e000::/48", "395661"}, - {"2806:230:1300::/45", "265594"}, - {"2a03:34a0::/32", "59817"}, - {"2a0c:4200::/29", "48112"}, - {"2408:8456:6600::/42", "17622"}, - {"2620:12e:1002::/44", "396075"}, - {"2804:4c14:ba01::/39", "267348"}, - {"2001:19e8::/46", "2576"}, - {"240c:ca13::/29", "24363"}, - {"2001:559:873a::/45", "7015"}, - {"2001:559:82c4::/48", "7922"}, - {"2001:678:760::/48", "50472"}, - {"2804:104c:800::/40", "263629"}, - {"2804:27d0::/32", "53162"}, - {"2804:3bac:1100::/33", "266164"}, - {"2001:12f0:640::/39", "1916"}, - {"2409:8c50:ffff::/48", "9808"}, - {"2804:5f28::/32", "269080"}, - {"2a00:7660::/29", "60876"}, - {"2a01:4a0::/44", "201011"}, - {"2a06:98c0:3600::/44", "132892"}, - {"2605:a1c0::/35", "11738"}, - {"2a09:9441::/32", "49981"}, - {"2001:678:a64::/48", "198423"}, - {"240a:a98d::/32", "145095"}, - {"2604:d600:cab::/35", "32098"}, - {"2a00:7a60::/32", "200000"}, - {"2a0b:3cc0::/29", "48147"}, - {"2001:4ca0::/29", "12816"}, - {"2602:feda:d63::/45", "212034"}, - {"2804:2174::/32", "264555"}, - {"2a0f:5707:ab25::/48", "201106"}, - {"240a:a6e8::/32", "144418"}, - {"2800:ba0:18::/48", "263812"}, - {"2804:4a64::/32", "267237"}, - {"2001:67c:276c::/48", "50622"}, - {"2401:d800:fd00::/42", "7552"}, - {"2605:1600::/32", "17143"}, - {"2806:320:200::/39", "28438"}, - {"2a02:2e0:41c::/48", "206564"}, - {"2a0b:33c0:10::/48", "57395"}, - {"240a:400b::/33", "58834"}, - {"240a:afc2::/32", "146684"}, - {"2804:2c44::/32", "265207"}, - {"2a0b:72c0::/32", "60522"}, - {"2a0e:b107:1950::/47", "207705"}, - {"2a12:32c0::/29", "206430"}, - {"2001:559:c207::/48", "33651"}, - {"240e:5f:6004::/44", "4134"}, - {"2600:100a:f000::/44", "6167"}, - {"2600:9000:119c::/42", "16509"}, - {"2804:e0c:1c0::/48", "28176"}, - {"2804:84c8::/32", "272281"}, - {"2409:8028:1900::/37", "9808"}, - {"2a02:26f7:a9::/48", "20940"}, - {"2a02:e240::/29", "20676"}, - {"2a10:3940::/29", "204790"}, - {"2001:67c:2f84::/48", "44496"}, - {"2404:e801:1020::/34", "55430"}, - {"2408:840d:5200::/42", "17621"}, - {"240a:abd6::/32", "145680"}, - {"2400:9100::/48", "45552"}, - {"2620:1d5:650::/40", "14773"}, - {"2a02:26f7:c806::/47", "20940"}, - {"2a0a:ca00::/32", "207038"}, - {"2a05:8943::/29", "3356"}, - {"2001:559:8648::/47", "33491"}, - {"2001:dcc:6::/48", "131100"}, - {"2001:19f0:a08::/48", "46407"}, - {"240a:abd2::/32", "145676"}, - {"2600:1404:d801::/37", "20940"}, - {"2a04:e00:2::/48", "3257"}, - {"2001:4408:6700::/47", "55824"}, - {"2402:3a80:1300::/41", "38266"}, - {"2a12:4946:46::/48", "211398"}, - {"2804:6aac::/32", "270352"}, - {"2a01:5040:2001::/42", "43996"}, - {"2a02:2668:3a00::/33", "16345"}, - {"2a02:26f0:4601::/39", "20940"}, - {"2a02:26f7:c085::/46", "20940"}, - {"2001:1478:1100::/48", "27385"}, - {"240a:a5fd::/32", "144183"}, - {"2803:ce0::/32", "269897"}, - {"2804:677c::/32", "269631"}, - {"2a0b:b87:ff12::/48", "210718"}, - {"2001:44b8:4042::/47", "4739"}, - {"2404:1980::/32", "131199"}, - {"2804:4ff8::/32", "268361"}, - {"2a02:26f0:b901::/38", "20940"}, - {"2a0b:740::/29", "200599"}, - {"2604:9b00:2801::/48", "14230"}, - {"2606:2600::/32", "27425"}, - {"2803:5010::/32", "271803"}, - {"2001:250:7817::/44", "24372"}, - {"2400:cb00:a580::/47", "13335"}, - {"240a:ad7c::/32", "146102"}, - {"2602:10e:1a::/47", "20115"}, - {"2604:bc40:6110::/48", "14618"}, - {"2a09:4c0:aee1::/30", "58057"}, - {"2606:7800::/32", "11598"}, - {"2804:7a6c::/32", "271370"}, - {"2a0b:b87:ffb0::/48", "16509"}, - {"2806:230:302d::/48", "11888"}, - {"2001:470:139::/48", "46997"}, - {"2001:559:8140::/47", "33657"}, - {"2001:559:848c::/48", "7015"}, - {"2405:77c0::/32", "139449"}, - {"2409:8904:67b0::/36", "24547"}, - {"2a0b:6c81::/32", "16509"}, - {"2001:678:e48::/48", "61232"}, - {"2409:806c:2900::/35", "9808"}, - {"2800:b10::/48", "27884"}, - {"2804:7d28::/32", "271543"}, - {"2a03:d60:1::/48", "42503"}, - {"2a11:5d80::/29", "204790"}, - {"2001:428:b26::/48", "10753"}, - {"2001:1248:a4dc::/47", "11172"}, - {"2402:800:3501::/44", "7552"}, - {"2a00:4760::/32", "39217"}, - {"2c0e:7f80::/38", "36974"}, - {"2001:559:c359::/48", "7922"}, - {"2001:6d0:4005::/48", "57503"}, - {"2607:480::/32", "396443"}, - {"2a00:4802:2200::/40", "13124"}, - {"2a02:26f7:116::/48", "36183"}, - {"2001:559:5f6::/48", "33651"}, - {"2001:559:804e::/48", "33287"}, - {"2401:d800:7b0::/41", "7552"}, - {"2407:4000:5::/32", "38005"}, - {"2409:8c04:1111::/45", "24547"}, - {"2001:559:8517::/48", "33491"}, - {"2001:1248:a428::/43", "11172"}, - {"2803:2110::/32", "271987"}, - {"2a01:bf20::/32", "39608"}, - {"2a02:d78::/32", "44819"}, - {"2a09:e9c0::/29", "209181"}, - {"2a0e:b107:1880::/44", "210633"}, - {"2001:4e0:1009::/43", "2381"}, - {"2001:12f0:740::/40", "1916"}, - {"2001:4b20:100:667::/64", "65505"}, - {"2408:8001:f000::/36", "4837"}, - {"240a:a31f::/32", "143449"}, - {"2610:b0:40ee::/47", "21433"}, - {"2801:80:22a0::/48", "262654"}, - {"2804:40c0::/32", "265979"}, - {"2001:579:9194::/42", "22773"}, - {"2001:678:320::/48", "206613"}, - {"240e:100::/42", "4134"}, - {"2607:5a80::/32", "11847"}, - {"2a06:3000::/36", "28715"}, - {"2400:ea00:3560::/47", "23884"}, - {"2403:da00::/32", "3382"}, - {"2602:fce2::/36", "398874"}, - {"2620:11:a::/47", "10934"}, - {"2a0b:6380::/29", "206318"}, - {"2a10:e2c0::/29", "211441"}, - {"2001:67c:25bc::/48", "198008"}, - {"2401:d800:f6d0::/42", "7552"}, - {"2606:4a00:fff2::/44", "33154"}, - {"2804:73b4:4000::/32", "270932"}, - {"2402:800:5b71::/44", "7552"}, - {"2602:80c:a000::/40", "46969"}, - {"2001:df0:314::/46", "140592"}, - {"2404:c140:2597::/32", "138997"}, - {"240e:44d:380::/41", "4134"}, - {"2605:a401:82aa::/43", "33363"}, - {"2001:678:c44::/48", "209718"}, - {"2406:840:5100::/47", "139317"}, - {"2409:8924:8300::/37", "56046"}, - {"2602:fc26:a::/48", "211562"}, - {"2607:fb10:5015::/46", "2906"}, - {"2c0f:f338::/32", "327983"}, - {"2001:43f8:de0::/48", "328213"}, - {"240a:ab53::/32", "145549"}, - {"240e:982:d900::/37", "4134"}, - {"2600:6c2e:c44::/40", "20115"}, - {"2605:dd40:8570::/44", "16509"}, - {"2804:2344::/32", "264152"}, - {"2804:5bf8::/32", "268880"}, - {"2a00:6900::/47", "20926"}, - {"2a04:ac00:6::/48", "56534"}, - {"2001:559:75f::/48", "7922"}, - {"2001:67c:2e68::/47", "62217"}, - {"2a04:2140::/29", "199283"}, - {"2408:8956:12c0::/39", "17816"}, - {"2607:f7c0:c000::/40", "6188"}, - {"2a02:26f7:e4c4::/48", "36183"}, - {"2001:559:80fa::/48", "33489"}, - {"2001:df4:5300::/48", "137469"}, - {"240e:355:6400::/30", "4134"}, - {"2806:2f0:1381::/34", "17072"}, - {"2a00:dac0::/32", "197765"}, - {"2a01:4020:7::/43", "25369"}, - {"2a02:26f7:e381::/46", "20940"}, - {"2001:250:4007::/48", "23910"}, - {"2001:c20:7c00::/32", "3758"}, - {"2404:ba00::/47", "17665"}, - {"2409:8051:900::/37", "9808"}, - {"2803:9a00::/32", "262239"}, - {"2804:3cf8::/32", "266245"}, - {"2a0b:bc0::/29", "62455"}, - {"2001:559:c05d::/48", "33491"}, - {"2400:be00::/48", "4847"}, - {"2401:d800:6000::/35", "7552"}, - {"2403:7f40:e000::/48", "211622"}, - {"2600:1006:9150::/36", "22394"}, - {"2a03:ca0::/32", "59984"}, - {"2a05:8880::/46", "34304"}, - {"2001:c38:9083::/43", "9931"}, - {"2408:8456:7c40::/39", "17816"}, - {"2600:140f:4a00::/48", "9498"}, - {"2804:808c:b000::/33", "271758"}, - {"2804:8344::/32", "272187"}, - {"2001:3b8::/32", "2527"}, - {"2405:6600:601::/39", "45845"}, - {"2604:d8c0::/32", "46280"}, - {"2605:3b80:1::/48", "9009"}, - {"2001:43f8:120::/48", "37177"}, - {"2409:805f:1100::/36", "9808"}, - {"240a:a2c6::/32", "143360"}, - {"2806:2f0:2143::/43", "22884"}, - {"2a0d:1780::/29", "12570"}, - {"2001:559:c1c2::/48", "33490"}, - {"2602:800:9007::/48", "26710"}, - {"2605:4280::/32", "12189"}, - {"2804:69fc:500::/32", "270304"}, - {"2a0e:f600:2e::/41", "60781"}, - {"2a0f:5840::/44", "39192"}, - {"2401:d800:302::/42", "7552"}, - {"2403:3540::/32", "137370"}, - {"240a:a225::/32", "143199"}, - {"240a:aa0f::/32", "145225"}, - {"2a00:1358::/35", "6866"}, - {"2400:a980:1100::/38", "133111"}, - {"2402:800:9d71::/40", "7552"}, - {"2402:4f00:9000::/33", "58453"}, - {"2804:6a38:7000::/36", "270320"}, - {"2a01:710::/32", "34968"}, - {"2a0c:5540:134::/32", "204020"}, - {"2001:4818:6000::/36", "603"}, - {"2603:f608::/27", "397165"}, - {"2a01:870::/32", "21334"}, - {"2a02:26f7:b5c5::/46", "20940"}, - {"2a0b:b87:ffb6::/48", "207649"}, - {"2001:678:f84::/48", "197942"}, - {"2400:adc0:4110::/47", "9541"}, - {"2402:800:990f::/43", "7552"}, - {"2605:a40c::/44", "33363"}, - {"2607:ff48::/32", "8100"}, - {"2804:e94:300::/42", "262468"}, - {"2804:3610::/32", "266324"}, - {"2804:6f2c::/32", "270643"}, - {"2402:800:94fe::/39", "7552"}, - {"2408:80fa:62c0::/42", "17622"}, - {"240a:a2bd::/32", "143351"}, - {"2804:2308::/33", "264138"}, - {"2001:250:849::/48", "23910"}, - {"2406:6e00::/39", "17457"}, - {"2409:8c4c:c01::/38", "9808"}, - {"2a0d:77c7:33c6::/33", "7489"}, - {"240e:14:a000::/31", "4134"}, - {"2804:1b0:8000::/36", "18881"}, - {"2a06:fb40::/33", "203385"}, - {"2a07:e342::/32", "49981"}, - {"2001:57a:504::/48", "22773"}, - {"2404:a140:1d::/48", "138915"}, - {"240e:e:a800::/37", "17633"}, - {"240e:3bf:3e00::/33", "140308"}, - {"2001:550:9201::/46", "174"}, - {"2602:80d:2000::/47", "400274"}, - {"2605:8200::/32", "19653"}, - {"2804:14c:bfe0::/43", "28573"}, - {"2804:7230::/32", "270838"}, - {"2a0f:9980:936::/48", "40676"}, - {"2001:710::/32", "8419"}, - {"2001:1a11:130::/48", "8781"}, - {"2409:8924:8d00::/38", "56046"}, - {"2603:f790::/26", "397165"}, - {"2620:171:23::/48", "42"}, - {"2001:938::/34", "8437"}, - {"2409:8915:6200::/35", "56044"}, - {"2600:1480:801::/37", "20940"}, - {"2604:f440:7::/44", "397423"}, - {"2607:f6f0:3000::/48", "19930"}, - {"2620:108:d000::/44", "8987"}, - {"2a0f:8641:b00b::/48", "212149"}, - {"2001:49f0:a01a::/47", "174"}, - {"2a00:c040::/32", "8749"}, - {"2001:1248:557c::/40", "11172"}, - {"2804:5594::/34", "267943"}, - {"2804:6f68::/32", "270658"}, - {"2804:7c14:8000::/33", "271474"}, - {"2a00:bec7:ff00::/40", "12946"}, - {"2a02:26f7:d085::/46", "20940"}, - {"2a0f:b100:40::/48", "211672"}, - {"2409:8904:30a0::/38", "24547"}, - {"2408:8026:b0::/41", "17621"}, - {"2806:2f0:8223::/39", "17072"}, - {"2803:aa60::/32", "267882"}, - {"2804:13b0:ec00::/48", "263546"}, - {"2804:21bc::/38", "264570"}, - {"2804:82dc::/32", "272161"}, - {"2001:250:2000::/43", "24355"}, - {"2401:fd80:8ff::/39", "138177"}, - {"2402:4e00:4012::/32", "45090"}, - {"2804:14c:c692::/41", "28573"}, - {"2804:14d:4c95::/42", "28573"}, - {"2804:41fc::/32", "267470"}, - {"2a03:2880:f01a::/45", "32934"}, - {"2001:678:d08::/48", "213376"}, - {"240a:ae97::/32", "146385"}, - {"2606:62c0:180::/46", "399686"}, - {"2620:137:1000::/40", "398535"}, - {"2804:767c::/32", "271115"}, - {"2a0b:6c40::/29", "8540"}, - {"2c0f:f020:100::/38", "327907"}, - {"2001:559:5b6::/48", "33287"}, - {"2406:9300::/32", "38506"}, - {"2605:bd40::/32", "22608"}, - {"2803:9f20::/32", "266780"}, - {"2804:cb0:a500::/36", "52742"}, - {"2a03:98c0::/32", "15814"}, - {"2a0c:93c0:8060::/48", "212465"}, - {"2001:559:c505::/48", "33657"}, - {"240a:abfb::/32", "145717"}, - {"240e:698:2100::/40", "4811"}, - {"2600:8807:9a82::/37", "22773"}, - {"2a04:bd80::/29", "52004"}, - {"2a09:bac0:376::/48", "13335"}, - {"2001:559:854e::/48", "33491"}, - {"2602:fc23:161::/48", "149424"}, - {"2a02:26f7:c1c8::/48", "36183"}, - {"2001:1248:553f::/41", "11172"}, - {"2408:80f1:1b0::/44", "17621"}, - {"2600:e00f:4000::/45", "22995"}, - {"2800:3a0::/47", "23201"}, - {"2804:9a8:8000::/33", "262979"}, - {"2a0a:340:e300::/40", "56807"}, - {"2a0e:b107:30f::/48", "134666"}, - {"2400:1240::/32", "64098"}, - {"2401:fdc0:20::/32", "137074"}, - {"2404:640::/32", "131262"}, - {"2406:3000:2b::/45", "4657"}, - {"240a:a0a2::/32", "142812"}, - {"2001:da8:d846::/37", "23910"}, - {"240e:438:a640::/36", "4134"}, - {"2600:370f:726b::/45", "32261"}, - {"2600:6c38:61b::/45", "20115"}, - {"2800:26c::/32", "19429"}, - {"2804:1b1:b680::/41", "10429"}, - {"2804:1938::/32", "262752"}, - {"2a03:9800::/29", "8916"}, - {"2a0f:b4c6::/32", "15317"}, - {"2001:559:c10f::/48", "7015"}, - {"2a02:26f7:c789::/46", "20940"}, - {"2406:f040:c8::/48", "131775"}, - {"2408:8957:b500::/40", "17816"}, - {"2604:c5c0:100::/38", "29727"}, - {"2604:fa00::/32", "32278"}, - {"2620:171:29::/48", "715"}, - {"2604:5500:4000::/38", "19165"}, - {"2607:fb10:2053::/33", "2906"}, - {"2401:95c0:f001::/48", "206729"}, - {"2602:fce8::/36", "395823"}, - {"2607:3a80::/42", "395100"}, - {"2806:106e:18::/42", "8151"}, - {"2a02:26f7:5c::/48", "36183"}, - {"2a0b:6900:4::/46", "206873"}, - {"2001:df5:3d00::/48", "136312"}, - {"2400:cb00:a7d0::/46", "13335"}, - {"2404:92c0:233::/48", "48024"}, - {"240e:3b9:1800::/34", "4134"}, - {"2602:fe90:810::/48", "35913"}, - {"2a05:1240::/29", "201809"}, - {"2a05:c440::/48", "47645"}, - {"2a01:8840:ca::/45", "12041"}, - {"2a0e:1cc1::/47", "207960"}, - {"2001:559:8285::/48", "7015"}, - {"2001:67c:2f6c::/48", "15626"}, - {"2a0f:e143::/32", "60781"}, - {"2001:4dd0::/29", "8422"}, - {"2a02:ee80:4264::/43", "3573"}, - {"2a0e:aa01::/35", "206499"}, - {"2001:fd8:1a8::/41", "4775"}, - {"240a:a36f::/32", "143529"}, - {"2605:ab80::/32", "46792"}, - {"2607:fdf8:dd::/39", "13649"}, - {"2a03:ec00:ba00::/33", "12847"}, - {"2402:800:f922::/40", "7552"}, - {"2600:1f01:4850::/47", "16509"}, - {"2602:fe55::/36", "267"}, - {"2001:4288:102::/38", "6713"}, - {"2401:ee00:b2c::/35", "23951"}, - {"2405:8a00:8022::/44", "55824"}, - {"2602:80d:4000::/40", "11511"}, - {"2602:fe64:4::/44", "396881"}, - {"2804:204:219::/46", "28186"}, - {"2001:559:c213::/48", "33650"}, - {"2001:da8:26b::/45", "133111"}, - {"2a02:200::/32", "24889"}, - {"2a0a:54c1:5::/44", "62240"}, - {"2a0d:6500::/29", "200000"}, - {"2001:470:23::/44", "6939"}, - {"2001:559:83a9::/48", "33489"}, - {"2001:67c:620::/48", "197639"}, - {"2402:2380::/32", "134102"}, - {"2406:840:860::/48", "139317"}, - {"240a:aa93::/32", "145357"}, - {"2a01:b740:a1c::/48", "6185"}, - {"2a02:26f7:b5c0::/48", "36183"}, - {"2001:468:2641::/44", "11537"}, - {"2401:da80::/32", "63927"}, - {"2600:6c38:c2f::/39", "20115"}, - {"2620:129:4000::/40", "62909"}, - {"2a04:71c0::/32", "200086"}, - {"2402:800:3601::/44", "7552"}, - {"2600:8807:43e0::/37", "22773"}, - {"2a02:88d:230::/44", "48695"}, - {"2a03:bf00:200::/40", "43529"}, - {"2001:dcc:401::/48", "23599"}, - {"2001:44b8:4054::/48", "7545"}, - {"2a02:26f7:dfce::/42", "20940"}, - {"2a04:1040::/29", "59767"}, - {"2404:3d00:40c8::/47", "21433"}, - {"2407:fe80::/39", "134749"}, - {"240e:45c:6a00::/40", "131285"}, - {"2a02:fc00::/29", "61207"}, - {"2a09:d00::/29", "199496"}, - {"2a0d:bc6::/48", "32539"}, - {"2a0e:68c0:1::/48", "204743"}, - {"2a11:b380::/29", "204790"}, - {"2605:6c80:4::/47", "397373"}, - {"2606:2800:7011::/46", "15133"}, - {"2607:fc48:c20::/48", "40009"}, - {"2804:3e90:4244::/43", "266606"}, - {"2a04:9b47::/48", "56740"}, - {"2a0b:1306:9::/48", "133142"}, - {"2a0f:85c1:51::/48", "209552"}, - {"2402:7d80:8889::/35", "63582"}, - {"240a:af03::/32", "146493"}, - {"240e:1f:8000::/47", "58543"}, - {"2605:a401:8ed9::/39", "33363"}, - {"2606:29c0:400::/32", "31775"}, - {"2606:cc00::/32", "5760"}, - {"240a:ab5f::/32", "145561"}, - {"2602:ff42::/36", "7018"}, - {"2800:370:63::/45", "28006"}, - {"2a00:1370::/32", "25513"}, - {"2a02:2698:7400::/38", "49048"}, - {"2408:8956:8500::/40", "17816"}, - {"2600:80c:1300::/40", "701"}, - {"2804:8f8::/32", "2914"}, - {"2804:4828::/32", "267101"}, - {"2402:6800:5::/48", "22822"}, - {"2408:8957:d840::/40", "17622"}, - {"240a:a7b0::/32", "144618"}, - {"240e:108:11e4::/44", "4134"}, - {"2600:1417:6a::/48", "9498"}, - {"2620:a0:4000::/47", "55064"}, - {"2a02:66a0::/32", "60086"}, - {"2001:df3:a880::/48", "4826"}, - {"2402:800:3401::/44", "7552"}, - {"2600:9000:a300::/47", "16509"}, - {"2402:800:fe50::/42", "7552"}, - {"2001:559:34e::/48", "7016"}, - {"2001:559:7aa::/48", "33657"}, - {"240e:183:8204::/46", "140649"}, - {"2804:14d:4e90::/41", "28573"}, - {"2a05:9280::/32", "31019"}, - {"2a0b:83c0::/29", "20634"}, - {"2408:8459:b030::/41", "17622"}, - {"240a:a581::/32", "144059"}, - {"2602:fe25::/36", "33174"}, - {"2602:febe:e01::/39", "30405"}, - {"2605:a900:3006::/43", "46887"}, - {"2a03:a9a0::/32", "22208"}, - {"240a:ab42::/32", "145532"}, - {"2a02:88d:1f::/48", "47794"}, - {"2001:559:8555::/48", "33654"}, - {"240e:679:e200::/39", "140329"}, - {"2804:5fe8::/32", "269131"}, - {"2804:7bb0::/32", "271448"}, - {"2001:559:82e2::/48", "7015"}, - {"2001:67c:234::/48", "47302"}, - {"2001:67c:2dc4::/48", "25411"}, - {"2001:1248:9748::/43", "11172"}, - {"2401:1740::/39", "136600"}, - {"2404:f4c0:ff10::/48", "149506"}, - {"2a01:4ce0:51::/42", "19624"}, - {"2001:16d8:cd00::/35", "16150"}, - {"2402:800:3171::/44", "7552"}, - {"2404:2400:110::/40", "56132"}, - {"2600:1003:b470::/40", "22394"}, - {"2605:3380:ff09::/45", "12025"}, - {"2804:998::/47", "28589"}, - {"2804:1f3c::/36", "52910"}, - {"2a02:26f7:de90::/48", "36183"}, - {"2a03:aba0::/29", "786"}, - {"2a06:3040::/48", "203020"}, - {"2001:559:c0ec::/48", "7016"}, - {"2001:67c:2ad4::/48", "61430"}, - {"2001:4490:d820::/46", "9829"}, - {"240a:a311::/32", "143435"}, - {"2001:67c:5f4::/48", "51815"}, - {"2001:67c:16b4::/48", "51942"}, - {"2001:ec0:889::/42", "23969"}, - {"2001:1b28::/37", "8728"}, - {"2404:bc00::/32", "18037"}, - {"2407:d340:f000::/44", "142586"}, - {"2605:a404:67::/44", "33363"}, - {"2001:44b8:1056::/47", "7545"}, - {"240a:a26b::/32", "143269"}, - {"2602:fe9d::/36", "13760"}, - {"2803:c180::/34", "52341"}, - {"2c0f:f4c0::/35", "37611"}, - {"2001:559:14c::/46", "7016"}, - {"2401:4900:4450::/42", "45609"}, - {"2408:8256:3493::/44", "17623"}, - {"240a:aa59::/32", "145299"}, - {"2800:381:5152::/32", "10834"}, - {"2a0b:6b86:3fa::/48", "202562"}, - {"2001:4490:4e00::/40", "9829"}, - {"2400:fc00:4a40::/32", "45773"}, - {"2409:8003:2a00::/40", "9808"}, - {"2806:2f0:7323::/32", "17072"}, - {"2a02:26f7:d141::/45", "20940"}, - {"2407:5000::/32", "17494"}, - {"2409:8120::/25", "9808"}, - {"240a:ac2d::/32", "145767"}, - {"2001:559:20::/48", "33490"}, - {"2001:1248:9709::/45", "11172"}, - {"2409:4040:1000::/30", "55836"}, - {"240e:640:ef00::/27", "4134"}, - {"2a02:348:64::/43", "35470"}, - {"2a05:f00::/29", "41163"}, - {"2a06:82c1::/48", "201106"}, - {"2400:a600::/32", "55803"}, - {"240e:ff:c001::/48", "134774"}, - {"2600:140b:e01::/39", "20940"}, - {"2806:230:601e::/48", "265594"}, - {"2a00:74a0::/32", "20904"}, - {"2a0f:9400:770b::/48", "210576"}, - {"2001:559:c3e0::/48", "7015"}, - {"2401:4900:844::/44", "45609"}, - {"2600:6c38:e26::/44", "20115"}, - {"2604:f500::/47", "16698"}, - {"2801:114:5::/46", "23059"}, - {"2804:7e2c::/32", "271607"}, - {"2403:6cc0::/32", "138155"}, - {"2405:9800:c980::/48", "45458"}, - {"240a:a15b::/32", "142997"}, - {"240a:a575::/32", "144047"}, - {"2605:52c0:4000::/48", "32519"}, - {"2a0e:97c3:7ea::/48", "20473"}, - {"2001:388:31::/40", "7575"}, - {"2001:500:46::/44", "207266"}, - {"2600:1406:4401::/38", "20940"}, - {"2801:0:390::/48", "14080"}, - {"2001:44c8:4190::/42", "131445"}, - {"2409:8053:1900::/37", "9808"}, - {"240e:981:6000::/40", "134761"}, - {"2607:fb78::/32", "23309"}, - {"2a02:26f0:111::/45", "20940"}, - {"2401:f000:9::/43", "38477"}, - {"2600:6c38:e2a::/43", "20115"}, - {"2620:10a:8003::/48", "15290"}, - {"2800:160:23af::/41", "14259"}, - {"2a02:ed04:4510::/38", "50304"}, - {"2001:250:3::/48", "23910"}, - {"2001:428:6402:221::/36", "209"}, - {"2409:8948:8e00::/40", "24445"}, - {"2a01:7c80:8000::/33", "24877"}, - {"2a0f:8645:b00b::/48", "212149"}, - {"2402:800:9da9::/43", "7552"}, - {"2402:e280:2130::/45", "134674"}, - {"2605:a401:804a::/43", "33363"}, - {"2804:1620::/32", "263269"}, - {"2804:1a20::/32", "61838"}, - {"2600:1413:2::/36", "20940"}, - {"2607:c400:6000::/32", "5555"}, - {"2607:f998::/32", "11767"}, - {"2607:fe70::/32", "11170"}, - {"2001:559:80e4::/48", "7922"}, - {"2605:c240::/28", "7018"}, - {"2606:9300::/32", "16904"}, - {"2a09:bac0:453::/48", "13335"}, - {"2a0e:6540:d32::/48", "208364"}, - {"2408:8256:358d::/48", "17816"}, - {"2605:cc80::/32", "398700"}, - {"2606:7300::/32", "11495"}, - {"2608:141:c::/48", "6025"}, - {"2620:13d:2080::/41", "20326"}, - {"2804:3f10:4101::/38", "262566"}, - {"2001:250:805::/48", "138182"}, - {"2001:1900:2372::/45", "10753"}, - {"2408:840c:9100::/40", "17621"}, - {"240e:90d:d000::/37", "137688"}, - {"2602:fd34::/36", "393292"}, - {"2804:4ae0:200::/32", "267269"}, - {"2804:7bac::/32", "271447"}, - {"2a02:26f7:be0d::/46", "20940"}, - {"2a02:26f7:e945::/46", "20940"}, - {"2a05:a140::/29", "41174"}, - {"2a0d:b000::/29", "12637"}, - {"2a0e:b107:148::/45", "57883"}, - {"240e:e9:8800::/34", "23650"}, - {"240e:45c:c400::/40", "131285"}, - {"2600:6c20:10b::/45", "20115"}, - {"2804:1a2c::/32", "61842"}, - {"2c0f:f690:8000::/36", "37019"}, - {"2001:b000:59d::/27", "3462"}, - {"2402:800:3d1d::/42", "7552"}, - {"240a:a851::/32", "144779"}, - {"2600:1007:b0e0::/43", "22394"}, - {"2604:d600:64b::/45", "32098"}, - {"2620:10a:3000::/40", "10349"}, - {"2803:56a0::/32", "266894"}, - {"2a07:4f00::/29", "31263"}, - {"2a0f:9400:7718::/48", "210715"}, - {"2605:1ac0::/32", "397189"}, - {"2620:12f:c005::/46", "395831"}, - {"2804:608c::/32", "269174"}, - {"2001:559:36f::/48", "33657"}, - {"2001:56b:10::/33", "852"}, - {"240a:ac76::/32", "145840"}, - {"2606:1040:1338::/32", "12243"}, - {"2a00:1d36:1000::/39", "47331"}, - {"240e:967:f600::/28", "4134"}, - {"2a00:c0a0::/32", "200154"}, - {"2001:559:8335::/48", "33651"}, - {"240a:ae46::/32", "146304"}, - {"2607:fea0:8450::/48", "16578"}, - {"2803:6cc0::/32", "264813"}, - {"2804:1edc::/32", "264450"}, - {"2001:67c:2760::/48", "47655"}, - {"2605:8d40:8000::/33", "46292"}, - {"2620:59:a000::/48", "7018"}, - {"2a01:b960:2309::/48", "209485"}, - {"2a0a:3100::/29", "206799"}, - {"2a0e:fb42::/32", "47596"}, - {"2001:559:8595::/48", "33651"}, - {"2001:df0:46::/48", "24287"}, - {"2001:4490:db40::/46", "9829"}, - {"2402:800:598d::/43", "7552"}, - {"2404:2b40::/32", "24373"}, - {"2804:4178::/32", "267435"}, - {"2806:230:4001::/48", "11888"}, - {"2a03:fb80::/32", "206920"}, - {"2001:428:4804::/34", "209"}, - {"2001:67c:2d40::/48", "50581"}, - {"2804:1918:184::/38", "52862"}, - {"2a01:b640:7700::/40", "39045"}, - {"2001:503:f261::/48", "26134"}, - {"2001:1878::/37", "226"}, - {"2405:6e00:22ee::/48", "18291"}, - {"2607:f380:808::/41", "2152"}, - {"2804:51e8::/32", "268484"}, - {"2804:8380::/32", "272202"}, - {"2001:579:7184::/41", "22773"}, - {"2405:9800:c640::/47", "45458"}, - {"2409:8954::/28", "56040"}, - {"240a:ad7a::/32", "146100"}, - {"2804:54a0:1a00::/39", "27688"}, - {"2a00:c2c0:ffff::/48", "46844"}, - {"2a03:5080::/32", "43341"}, - {"2001:559:807f::/48", "7016"}, - {"2620:111:1008::/48", "18469"}, - {"2404:b1:9000::/34", "9891"}, - {"240e:5e:4000::/48", "134773"}, - {"2600:1480:3100::/36", "20940"}, - {"2804:38b0:502::/32", "266494"}, - {"2804:6744::/32", "269617"}, - {"2a07:e02:baf::/48", "210083"}, - {"2001:559:147::/48", "7015"}, - {"2402:800:3d71::/44", "7552"}, - {"2605:a401:87b4::/41", "33363"}, - {"2803:99e0::/44", "270020"}, - {"2001:500:202::/48", "4"}, - {"2605:4900::/32", "13576"}, - {"2607:2e00::/32", "19229"}, - {"2801:186::/44", "27951"}, - {"2404:6380:1000::/48", "138950"}, - {"2408:8956:a00::/40", "17622"}, - {"2804:6fc8::/34", "270684"}, - {"2001:67c:17fc::/48", "212024"}, - {"2402:5300:1210::/34", "45903"}, - {"2407:4ac0::/35", "142045"}, - {"2607:6b80:63::/45", "46562"}, - {"2a0e:fd87:4::/32", "208722"}, - {"2a0f:607:1400::/44", "211132"}, - {"2404:3d00:414e::/42", "3573"}, - {"240e:87c:400::/39", "4134"}, - {"2600:1417:1e::/48", "9498"}, - {"2a02:2ad0::/39", "702"}, - {"2a03:7720::/43", "201094"}, - {"2001:df0:ed00::/48", "139398"}, - {"2401:d800:75f0::/38", "7552"}, - {"2600:1013:b0e0::/33", "6167"}, - {"2001:ee0:2f02::/45", "45899"}, - {"2602:ff98:340::/36", "63447"}, - {"2620:13d:2064::/43", "20326"}, - {"2a00:b880::/32", "44943"}, - {"2a0b:11c0::/48", "198682"}, - {"2a10:d080::/29", "212023"}, - {"2001:1838:2008::/35", "23352"}, - {"2600:1010:d1a0::/41", "6167"}, - {"2600:1408:c800::/48", "35994"}, - {"2a04:4e40:ac00::/47", "54113"}, - {"2001:559:49f::/48", "7922"}, - {"2001:67c:14d::/48", "21083"}, - {"2600:140f:2a00::/48", "9498"}, - {"2803:b9c0:4100::/38", "265705"}, - {"2a01:8840:82::/45", "12041"}, - {"2401:7b40:4005::/48", "38071"}, - {"2407:240::/48", "140775"}, - {"2600:100d:9110::/36", "22394"}, - {"2600:6c38:126::/44", "20115"}, - {"2604:d600:52e::/43", "32098"}, - {"2001:fff:100::/32", "142500"}, - {"2600:6c21:15::/44", "20115"}, - {"2620:12c:9001::/46", "395359"}, - {"2804:598::/32", "262526"}, - {"2401:d800:73a0::/41", "7552"}, - {"240e:67e:c600::/34", "4134"}, - {"2600:1413:8000::/48", "24319"}, - {"2804:13b0:1c00::/44", "263546"}, - {"2a10:92c0::/29", "211786"}, - {"2001:559:875a::/47", "33490"}, - {"2001:67c:964::/48", "207947"}, - {"2401:af80:8000::/35", "59103"}, - {"2403:9d40::/32", "137263"}, - {"2800:440:8006::/48", "27738"}, - {"2804:1158::/32", "263672"}, - {"2806:230:5015::/48", "11888"}, - {"2a12:c080::/29", "1299"}, - {"2001:559:81a2::/48", "33287"}, - {"240e:96b:601e::/42", "140374"}, - {"2600:370f:3521::/46", "32261"}, - {"2603:f640::/27", "397165"}, - {"2a00:6b40::/32", "197603"}, - {"2405:201:d800::/34", "55836"}, - {"2406:840:f400::/48", "142111"}, - {"2620:aa:c000::/48", "15304"}, - {"2804:25e4::/38", "61573"}, - {"2a03:a300:800::/35", "35104"}, - {"2a05:d980::/29", "200978"}, - {"2401:4900:4f61::/48", "45609"}, - {"2408:8656:3cfe::/47", "17623"}, - {"240e:44d:5100::/41", "140345"}, - {"2600:1419:a01::/37", "20940"}, - {"2a02:26f7:d489::/46", "20940"}, - {"2a0f:8643:b00c::/29", "25682"}, - {"2001:559:8643::/48", "33651"}, - {"2001:559:c27e::/47", "7016"}, - {"2407:5200:204::/47", "55915"}, - {"2603:f6b0::/23", "397165"}, - {"2001:df5:e280::/48", "141640"}, - {"2001:4c5c::/30", "13119"}, - {"2409:8055:18::/48", "9808"}, - {"240a:a50c::/32", "143942"}, - {"2602:fc26::/46", "211562"}, - {"2804:4840::/32", "267107"}, - {"2a00:1af8::/32", "6856"}, - {"2a09:2980::/29", "42375"}, - {"2001:df5:6f80::/48", "141424"}, - {"240a:aa2c::/32", "145254"}, - {"2600:6c39:455::/44", "20115"}, - {"2806:2f0:4383::/42", "17072"}, - {"2001:67c:1998::/48", "203055"}, - {"2600:6c38:573::/38", "20115"}, - {"2804:73b4::/34", "270932"}, - {"2a09:b180::/29", "56485"}, - {"240a:a55d::/32", "144023"}, - {"240a:a666::/32", "144288"}, - {"2620:0:a1a::/48", "71"}, - {"2a00:86c0:2061::/43", "2906"}, - {"2a05:7640:2090::/44", "174"}, - {"2001:250:5875::/48", "138371"}, - {"240a:adbb::/32", "146165"}, - {"2600:380:e410::/36", "7018"}, - {"2602:fe19:ffad::/41", "26073"}, - {"2800:160:2c03::/43", "14259"}, - {"2806:108e:24::/48", "8151"}, - {"2a02:27aa::/32", "59729"}, - {"2a0d:b201:1000::/44", "206026"}, - {"2402:c480:5000::/48", "63916"}, - {"240a:a187::/32", "143041"}, - {"240e:44d:1700::/42", "140345"}, - {"2804:14d:a495::/41", "28573"}, - {"2a00:8841::/32", "12365"}, - {"2001:df2:3880::/48", "139836"}, - {"2405:f580::/32", "132019"}, - {"2408:8957:fe00::/28", "17816"}, - {"2605:9d80:8081::/48", "4134"}, - {"2a00:1908:ffff::/48", "205365"}, - {"2a09:bac0:191::/45", "13335"}, - {"2a0a:1f42::/32", "64236"}, - {"2a0d:86c0::/29", "210181"}, - {"2a0f:32c0::/29", "328221"}, - {"2602:ffc5::/48", "7489"}, - {"2001:df2:5100::/48", "133929"}, - {"2406:c500:ffd3::/48", "4739"}, - {"2600:80d:100::/27", "701"}, - {"2620:141:4fe::/48", "6075"}, - {"2a01:cf00:74::/46", "3215"}, - {"2a02:26f0:9c::/47", "34164"}, - {"2001:559:81a4::/48", "7922"}, - {"2404:a8:19::/48", "24514"}, - {"2406:b400:16::/47", "55577"}, - {"2605:3380:48fe::/47", "12025"}, - {"2800:160:1a6c::/43", "14259"}, - {"2804:7ba0::/32", "271443"}, - {"2a02:13d0::/29", "13136"}, - {"2a0e:15c7:ff82::/41", "60781"}, - {"2001:559:86b1::/48", "33490"}, - {"2001:67c:1ec::/48", "29607"}, - {"2001:4350:3000::/48", "2609"}, - {"2403:c880::/31", "7363"}, - {"2408:8256:3175::/48", "17623"}, - {"240e:979:3e00::/40", "134770"}, - {"2605:a40a:9000::/34", "33363"}, - {"2803:bc40:810d::/43", "52468"}, - {"2a03:7300::/32", "8426"}, - {"2a07:8147:ffff::/48", "211846"}, - {"240a:a64d::/32", "144263"}, - {"240e:db:f801::/29", "4134"}, - {"2600:40f0:100::/44", "3369"}, - {"2803:9800:9037::/44", "11664"}, - {"2a02:26f7:e38c::/48", "36183"}, - {"2a04:2e80:17::/48", "50294"}, - {"2001:1218:60be::/32", "278"}, - {"2401:d800:7fe2::/43", "7552"}, - {"2402:800:3dee::/43", "7552"}, - {"2a0f:aa40::/29", "207646"}, - {"2a10:b840::/29", "211624"}, - {"2001:559:c1fc::/48", "7922"}, - {"2001:678:938::/48", "29608"}, - {"2001:4248:7b::/32", "30999"}, - {"2401:680::/32", "715"}, - {"2409:8020:31::/41", "56046"}, - {"2605:ef00::/47", "7806"}, - {"2620:118:b003::/48", "32110"}, - {"2804:73d0::/32", "270939"}, - {"2806:230:202e::/48", "265594"}, - {"2001:559:9::/48", "33287"}, - {"2001:559:8581::/46", "33657"}, - {"2600:1406:e001::/37", "20940"}, - {"2602:feda:2ab::/45", "204185"}, - {"2800:200:b410::/42", "12252"}, - {"2401:e380:1001::/46", "131091"}, - {"2600:6c38:82d::/43", "20115"}, - {"2803:6604:a600::/33", "28075"}, - {"2a12:89c0::/29", "49581"}, - {"2600:1f01:48c0::/47", "16509"}, - {"2804:4420::/32", "267604"}, - {"2408:8456:ed40::/40", "17816"}, - {"2408:8957:4900::/40", "17816"}, - {"240e:3b6:5600::/34", "4134"}, - {"2a02:26f7:e240::/48", "36183"}, - {"2001:600::/32", "702"}, - {"2409:8028:2800::/39", "56041"}, - {"2409:8904:2b40::/37", "24547"}, - {"240a:a93e::/32", "145016"}, - {"2a0e:b102:160::/44", "212546"}, - {"2402:800:7d70::/40", "7552"}, - {"2a00:f10:142::/42", "48635"}, - {"2a02:2808:5501::/48", "47531"}, - {"2001:550:3d06::/33", "174"}, - {"2001:559:c0ca::/48", "7015"}, - {"2001:4948::/32", "7782"}, - {"2408:8256:2d6b::/48", "17623"}, - {"2600:1406:a01::/35", "20940"}, - {"2406:daa0:b0c0::/44", "16509"}, - {"2408:8256:3796::/44", "17623"}, - {"2a02:8080::/29", "6830"}, - {"2a0c:4d80::/29", "208327"}, - {"2001:559:2fa::/48", "7015"}, - {"2001:18b8:4a::/39", "29789"}, - {"2400:9380:a01f::/48", "23764"}, - {"2406:840:e114::/48", "141712"}, - {"240a:a0b5::/32", "142831"}, - {"2600:1017:b8b0::/41", "6167"}, - {"2804:7ac::/32", "262542"}, - {"2a02:888:8152::/47", "48695"}, - {"2a09:be41::/29", "209968"}, - {"2409:8904:63b0::/37", "24547"}, - {"2604:7040::/32", "10821"}, - {"2800:300:90e0::/33", "27986"}, - {"2800:860:a::/48", "262206"}, - {"2804:6430::/32", "269412"}, - {"2806:230:1010::/48", "265594"}, - {"2a02:26f7:af::/48", "20940"}, - {"2a0b:4340:c6::/48", "44421"}, - {"2607:f250:d008::/48", "7046"}, - {"2804:4814::/32", "267096"}, - {"2804:6dc0::/32", "270553"}, - {"2a10:d500::/32", "174"}, - {"2400:fc00:30::/41", "45773"}, - {"2409:8057:805::/35", "56040"}, - {"240a:a33c::/32", "143478"}, - {"240e:44d:7040::/42", "140354"}, - {"2604:4f40::/32", "396472"}, - {"2604:6600:159::/40", "40676"}, - {"2620:115:6001::/48", "32336"}, - {"2a02:2e0:421::/32", "12306"}, - {"2409:8959:cd44::/43", "9808"}, - {"2804:179c::/34", "263159"}, - {"2a01:6320::/32", "197580"}, - {"2a02:2e02:9b90::/37", "12479"}, - {"2a05:4280::/29", "62248"}, - {"2600:80c:200::/36", "11486"}, - {"2804:4774:9000::/33", "267055"}, - {"2a09:7c41::/30", "52000"}, - {"2001:559:8699::/46", "33650"}, - {"240a:a182::/32", "143036"}, - {"2804:37f0:6900::/35", "266445"}, - {"2a01:65e0::/32", "62244"}, - {"2a01:9500::/40", "197696"}, - {"2a02:26f7:c189::/42", "20940"}, - {"2a0b:3c40:9::/48", "208258"}, - {"2408:8000:c008::/42", "4837"}, - {"240a:afb9::/32", "146675"}, - {"2604:f980:4220::/44", "19957"}, - {"2001:559:c36c::/48", "33651"}, - {"2001:44b8:105c::/48", "7545"}, - {"2604:a580::/40", "1610"}, - {"2804:14d:4c00::/40", "28573"}, - {"2804:61f0:4::/32", "269266"}, - {"2804:7584::/32", "271052"}, - {"2a01:6ec0::/32", "198904"}, - {"2a02:26f7:f788::/48", "36183"}, - {"2001:559:c375::/48", "33657"}, - {"240e:a7:7fd2::/45", "140514"}, - {"2600:380:4780::/35", "20057"}, - {"2600:6c21:807::/38", "20115"}, - {"2806:370:5500::/40", "28403"}, - {"2402:8100:26a3::/44", "55644"}, - {"2406:2600::/48", "55569"}, - {"240a:acf7::/32", "145969"}, - {"2a01:5e40::/32", "34555"}, - {"2001:559:c3c2::/48", "7016"}, - {"2803:2300::/32", "17069"}, - {"2a03:7580::/34", "28785"}, - {"2606:2800:4ad8::/46", "15133"}, - {"2610:a1:304c::/48", "12008"}, - {"2804:3d4:40::/32", "262401"}, - {"2a06:d380::/29", "57860"}, - {"2a0d:2405::/30", "62068"}, - {"2401:f000:2::/56", "23838"}, - {"2801:2::/39", "17147"}, - {"2804:af4::/32", "52930"}, - {"2c0f:ea60::/32", "37215"}, - {"240e:db:b800::/48", "38283"}, - {"2600:1419:801::/38", "20940"}, - {"2603:c023:4000::/35", "31898"}, - {"2607:fff0::/32", "17293"}, - {"2001:67c:798::/48", "15404"}, - {"2001:1900:220f::/43", "3356"}, - {"2402:800:368d::/43", "7552"}, - {"2409:8914:800::/39", "56044"}, - {"2801:10a::/44", "19429"}, - {"2001:559:c::/48", "7015"}, - {"2001:1248:564d::/43", "11172"}, - {"2400:1480::/48", "132425"}, - {"2401:ebc0:1000::/32", "137041"}, - {"2405:58c0:38::/47", "133101"}, - {"2409:8080:2a60::/44", "9808"}, - {"2600:6c21:222::/47", "20115"}, - {"2605:5e40:110::/48", "397810"}, - {"2803:10c0::/32", "264770"}, - {"2a00:1950::/32", "39647"}, - {"2402:800:919b::/42", "7552"}, - {"240a:a0ec::/32", "142886"}, - {"2620:7a:8000::/48", "30622"}, - {"2804:84e8::/32", "272546"}, - {"2a00:a900::/33", "60819"}, - {"2a0e:a6c1::/30", "41047"}, - {"2001:16c0::/43", "31732"}, - {"2401:d800:b2d0::/42", "7552"}, - {"2408:860c::/30", "17621"}, - {"240a:a07b::/32", "142773"}, - {"2a02:608::/32", "41698"}, - {"2a04:3740::/48", "35625"}, - {"2a10:8280::/32", "2611"}, - {"2408:8956:c800::/39", "17622"}, - {"240a:af0d::/32", "146503"}, - {"2a0a:56c4:8500::/47", "42649"}, - {"2a10:11c0::/32", "206858"}, - {"2001:da8:251::/48", "23910"}, - {"2600:809:641::/30", "701"}, - {"2800:bf0:3020::/46", "52257"}, - {"2804:3b8:1e6::/44", "52965"}, - {"2804:38e0::/32", "266507"}, - {"2001:df0:7080::/48", "23954"}, - {"2804:950:8200::/33", "263072"}, - {"2804:14f0::/32", "263360"}, - {"2a06:1301:4050::/48", "24940"}, - {"2a0d:1740::/32", "201547"}, - {"2a0f:e6c0:991::/48", "60781"}, - {"2405:c440::/47", "139972"}, - {"2620:5e:6000::/48", "701"}, - {"2408:8957:1bc0::/37", "17622"}, - {"2607:f220:203::/48", "7046"}, - {"2806:230:2005::/48", "11888"}, - {"240a:a755::/32", "144527"}, - {"2a04:84c1::/32", "29017"}, - {"2001:df6:aa80::/48", "136421"}, - {"2406:d200::/32", "23629"}, - {"240e:95d:c00::/38", "4134"}, - {"2620:11a:e000::/46", "22300"}, - {"2a0e:e704:43::/48", "212972"}, - {"2001:6a8::/32", "2611"}, - {"2403:3800::/44", "4007"}, - {"2408:8456:7e00::/42", "17622"}, - {"2409:8c28:6c08::/39", "56041"}, - {"2620:1:a000::/48", "19770"}, - {"2804:24cc::/32", "264242"}, - {"2001:67c:648::/48", "51942"}, - {"2a02:26f7:cfcc::/48", "36183"}, - {"2409:8070:ac0::/42", "9808"}, - {"2a02:26f7:d8c9::/42", "20940"}, - {"240e:980:8500::/40", "133774"}, - {"2607:f190:4000::/32", "11320"}, - {"2800:160:10c7::/44", "14259"}, - {"2804:3e40:fb02::/37", "266583"}, - {"2001:67c:15c8::/48", "1257"}, - {"2408:8256:3a61::/43", "17623"}, - {"240e:965:3000::/33", "4134"}, - {"2620:101:2011::/46", "30238"}, - {"2804:10c8::/35", "263649"}, - {"2c0f:f7f8::/48", "3356"}, - {"2a02:168::/31", "13030"}, - {"2c0f:f758::/32", "37204"}, - {"2001:559:8032::/48", "7015"}, - {"2804:6654::/32", "269551"}, - {"2a04:ff00:300::/48", "206731"}, - {"2a10:1fc0:2::/47", "62005"}, - {"240a:a549::/32", "144003"}, - {"2a02:2330:b3::/29", "12578"}, - {"2001:4130:20::/48", "29067"}, - {"2001:4998:198::/46", "36647"}, - {"2607:f108:302::/36", "29838"}, - {"2607:fd48:480:2::/36", "13536"}, - {"2a01:3e0:ff71::/48", "8297"}, - {"2a0a:c842::/29", "205394"}, - {"2401:d800:7e0::/36", "7552"}, - {"2408:8456:1a00::/42", "17622"}, - {"2606:82c0:800::/40", "32167"}, - {"2804:b18:d0::/32", "52941"}, - {"2804:1340::/32", "263524"}, - {"2001:559:86ba::/48", "33657"}, - {"2001:67c:2744::/48", "47676"}, - {"240a:a4ab::/32", "143845"}, - {"2620:61::/48", "46720"}, - {"2806:2f0:20a1::/48", "22884"}, - {"2a00:b700:2::/45", "49392"}, - {"2a05:3a40::/32", "210236"}, - {"2a0c:6580::/48", "43576"}, - {"2001:67c:4f0::/48", "3303"}, - {"2400:cb00:a4e0::/45", "13335"}, - {"2a04:3880::/30", "60721"}, - {"2001:df5:2880::/48", "141370"}, - {"2804:18:860::/44", "10429"}, - {"2a04:1cc1::/30", "48635"}, - {"2a0a:7400::/29", "34863"}, - {"2a12:4946:1900::/48", "211398"}, - {"2604:36c0::/32", "393670"}, - {"2606:2800:147::/44", "15133"}, - {"2606:7d80:9000::/33", "2707"}, - {"2606:ab40:20::/41", "400339"}, - {"2a00:ab00:7000::/32", "49505"}, - {"2409:8d5a:5c0::/45", "9808"}, - {"240e:966:8800::/38", "133775"}, - {"2804:3be4::/32", "266178"}, - {"2804:60e4::/32", "269198"}, - {"2a03:4d80::/32", "43323"}, - {"2001:df0:2fd::/48", "17436"}, - {"2001:4408:8500::/45", "4758"}, - {"2406:8800:9045::/44", "17465"}, - {"2800:800:6f0::/44", "26611"}, - {"2804:1e18::/32", "264407"}, - {"2806:230:3007::/48", "11888"}, - {"2a09:bac0:128::/48", "13335"}, - {"2a10:e300:35::/48", "44854"}, - {"2806:230:601f::/48", "11888"}, - {"2a02:26f7:e789::/46", "20940"}, - {"240a:af59::/32", "146579"}, - {"2600:1480:4100::/37", "20940"}, - {"2600:6c7f:9140::/44", "19115"}, - {"2605:a401:8f41::/45", "33363"}, - {"2620:66:6000::/48", "54345"}, - {"2001:67c:2580::/48", "8751"}, - {"2001:12d0::/32", "28571"}, - {"240a:a420::/32", "143706"}, - {"240a:a7f0::/32", "144682"}, - {"2600:1011:b170::/33", "6167"}, - {"2804:5e48:ff10::/48", "269023"}, - {"2a00:d8c0:100::/48", "50716"}, - {"2603:80bd::/32", "11427"}, - {"2801:80:1b40::/48", "266426"}, - {"2806:230:2019::/48", "11888"}, - {"2a10:2a80::/48", "207727"}, - {"2401:b0c0:d000::/48", "136941"}, - {"2800:680::/43", "3816"}, - {"2a0c:1a80::/29", "204861"}, - {"2001:4200:598::/34", "2018"}, - {"2404:e00:165::/48", "15695"}, - {"2804:38a8::/32", "266492"}, - {"2001:678:138::/48", "38990"}, - {"2402:4480:305::/32", "174"}, - {"2407:38c0:82::/48", "59204"}, - {"240c:c715::/32", "24364"}, - {"2a01:8840:4a::/45", "12041"}, - {"2a02:26f7:d404::/48", "36183"}, - {"2402:3a80:c030::/48", "38266"}, - {"240a:a609::/32", "144195"}, - {"2803:5320::/32", "266728"}, - {"2a01:37:6000::/32", "8875"}, - {"2a10:2f00:129::/48", "213346"}, - {"2001:250:6c3d::/48", "138370"}, - {"2001:1878:b10::/32", "226"}, - {"2401:d800:7cf0::/39", "7552"}, - {"2406:8800:901b::/42", "17465"}, - {"2409:8e39::/25", "9808"}, - {"2a00:e66::/31", "200519"}, - {"2001:559:c488::/48", "33287"}, - {"2401:b780::/41", "45410"}, - {"2409:8924:1d00::/38", "56046"}, - {"2a03:8920::/32", "41103"}, - {"2001:559:16d::/43", "7922"}, - {"2001:2003::/32", "1759"}, - {"2607:6480::/35", "395336"}, - {"2804:4788::/32", "267060"}, - {"2001:15f0::/32", "213211"}, - {"2407:d840:1::/48", "149502"}, - {"240e:44d:4100::/41", "140345"}, - {"2803:dac0::/44", "265634"}, - {"2a00:1400::/32", "44764"}, - {"2a05:a940::/29", "20546"}, - {"2001:250:6807::/48", "23910"}, - {"240a:a870::/32", "144810"}, - {"2620:12d:5000::/47", "55128"}, - {"2800:bf0:8148::/47", "27947"}, - {"2a02:128:2::/48", "197726"}, - {"2408:840d:8400::/42", "17621"}, - {"240e:5e:2100::/48", "134774"}, - {"2803:e880:8116::/35", "52468"}, - {"2a0a:cdc0::/32", "43771"}, - {"2a0d:60c4::/30", "208861"}, - {"2001:559:732::/48", "7016"}, - {"2001:44b8:2053::/48", "4739"}, - {"2605:a900:301a::/33", "46887"}, - {"2620:11f:b003::/45", "394514"}, - {"2620:149:a28::/47", "6185"}, - {"2a02:26f7:f2cd::/42", "20940"}, - {"2001:559:8524::/44", "7015"}, - {"2403:400::/38", "23820"}, - {"2603:c012::/36", "31898"}, - {"2804:37e0::/32", "266441"}, - {"2804:62a0::/32", "269308"}, - {"2a03:e600:100::/48", "208323"}, - {"2001:579:91e1::/38", "22773"}, - {"2408:8256:3b8c::/43", "17623"}, - {"2602:fd86::/48", "33412"}, - {"2804:3554::/32", "262273"}, - {"2001:16a2:402a::/43", "25019"}, - {"2402:800:9e40::/43", "7552"}, - {"2603:c0f8:2910::/38", "20054"}, - {"2804:2b38::/36", "265141"}, - {"2804:41bc::/36", "267453"}, - {"2a04:92c3::/29", "62240"}, - {"2a06:c0::/29", "47467"}, - {"2806:2f0:4261::/46", "17072"}, - {"2a02:b10:1::/48", "20860"}, - {"2001:559:8251::/46", "7922"}, - {"240e:97c::/36", "58466"}, - {"2606:a200::/32", "14155"}, - {"2a05:b0c0::/48", "198412"}, - {"2a0e:1c00::/29", "61317"}, - {"240a:adaf::/32", "146153"}, - {"2804:4488:6010::/44", "262480"}, - {"2a02:26f7:45::/48", "20940"}, - {"2a0e:4100::/32", "57279"}, - {"2405:7900::/32", "24398"}, - {"2600:140b:6401::/38", "20940"}, - {"2a04:2b00:14cc::/48", "212222"}, - {"2001:559:c229::/48", "7015"}, - {"2400:0:500::/38", "4766"}, - {"2408:8120:1::/46", "9929"}, - {"2a0e:8f02:20ec::/46", "213033"}, - {"2001:420:c0fc::/34", "109"}, - {"2402:800:98ee::/39", "7552"}, - {"2600:1010:9000::/44", "6167"}, - {"2800:ba0:12::/48", "263812"}, - {"2a09:4e07:a000::/33", "210625"}, - {"2a09:9940::/48", "50007"}, - {"2401:d800:4a0::/41", "7552"}, - {"2408:8459:f900::/38", "17623"}, - {"2600:6c2e:e84::/39", "20115"}, - {"2804:5f0c::/32", "269073"}, - {"2a00:1ca8:d3::/45", "58061"}, - {"2a00:7640::/32", "48954"}, - {"2001:579:b0dc::/39", "22773"}, - {"2400:cb00:a9f0::/47", "13335"}, - {"2605:b4c0:550::/48", "25780"}, - {"2a00:79e1:f08::/46", "36384"}, - {"2400:e1c0::/48", "58659"}, - {"240a:a122::/32", "142940"}, - {"2a07:2781:a4a3::/48", "206160"}, - {"2a0f:24c0::/29", "207954"}, - {"2400:ac40:d90::/41", "136255"}, - {"240d:c010:81::/45", "139341"}, - {"2804:9a8::/34", "262979"}, - {"2401:803e:2025::/33", "9919"}, - {"2401:fd80:400::/45", "137502"}, - {"2405:4800::/39", "18403"}, - {"2801:1d:800::/48", "267928"}, - {"2804:de8::/32", "52525"}, - {"2a02:26f7:fb84::/48", "36183"}, - {"2402:e380:30a::/48", "138166"}, - {"2001:559:8739::/48", "33662"}, - {"2401:4900:1c46::/44", "24560"}, - {"2600:8807:6ca2::/39", "22773"}, - {"2604:d600:163e::/41", "32098"}, - {"2804:14c:7b8b::/41", "28573"}, - {"2804:749c::/32", "270992"}, - {"2a02:26f7:b6c4::/48", "36183"}, - {"2001:559:81f5::/48", "33652"}, - {"2409:8915:5c00::/39", "56044"}, - {"240a:ac24::/32", "145758"}, - {"2620:190::/32", "3379"}, - {"2a02:2010:20a0::/45", "20978"}, - {"2a04:9f00::/29", "199837"}, - {"2408:8247:1200::/28", "4837"}, - {"240a:a4ee::/32", "143912"}, - {"2600:370f:2041::/42", "32261"}, - {"2607:f368:3225::/32", "32982"}, - {"2620:114:3002::/48", "54391"}, - {"2a0c:8000::/29", "62275"}, - {"2407:8bc0:100::/32", "137990"}, - {"2804:1a4c::/32", "61851"}, - {"2407:1100::/32", "132825"}, - {"240a:ac66::/32", "145824"}, - {"240a:aedd::/32", "146455"}, - {"2602:fea2:1::/46", "40680"}, - {"2804:1338::/32", "263522"}, - {"2804:7c8c::/32", "271503"}, - {"2a01:4de0::/32", "199933"}, - {"2a02:2e02:8b60::/43", "12479"}, - {"2407:f540::/48", "140803"}, - {"2604:e180:5001::/38", "55002"}, - {"2605:a600::/31", "16591"}, - {"2801:19:a800::/48", "271802"}, - {"2a00:5c40::/29", "6821"}, - {"2a0e:f201::/32", "55286"}, - {"2600:4400::/31", "6130"}, - {"2607:f5b6::/32", "393886"}, - {"2a0f:c700::/32", "39384"}, - {"2406:3003:3028::/45", "4657"}, - {"2001:dc5:a::/48", "23600"}, - {"2409:8c50::/37", "56047"}, - {"2602:fd00:c::/46", "147297"}, - {"2401:4900:5f90::/44", "45609"}, - {"2620:e6::/48", "394275"}, - {"2804:312c::/32", "264998"}, - {"2804:7684::/32", "271117"}, - {"2400:8906::/31", "63949"}, - {"2407:4e00:1:3::/32", "17995"}, - {"2620:19f::/36", "397962"}, - {"2800:bf0:8040::/45", "52257"}, - {"2a01:9f80::/32", "16006"}, - {"2a02:6d0::/32", "47227"}, - {"2001:19f0:caba::/48", "20473"}, - {"2607:3200:11::/46", "11240"}, - {"2804:14d:5681::/41", "28573"}, - {"2a02:26f7:d684::/48", "36183"}, - {"2a0e:46c6:300::/40", "207955"}, - {"2806:322:2500::/32", "28546"}, - {"2a00:1728:1e::/47", "34224"}, - {"2a02:2338::/32", "48854"}, - {"2401:4900:53d0::/42", "45609"}, - {"2605:c2c0::/32", "398490"}, - {"2607:fd48:10a:100::/38", "13536"}, - {"2804:22bc::/32", "264119"}, - {"2602:80b:e000::/44", "396921"}, - {"2602:ffb0:7::/48", "20473"}, - {"2a01:d0:304::/47", "29632"}, - {"2001:1a11:11e::/42", "42298"}, - {"2001:480:30::/48", "13"}, - {"2001:4408:7b00::/37", "4758"}, - {"2600:1005:b0f8::/45", "22394"}, - {"2610:28:f020::/48", "19718"}, - {"2a06:6bc0::/29", "12905"}, - {"2001:559:877d::/48", "33651"}, - {"2400:a4c0::/48", "7575"}, - {"2402:800:bbc0::/42", "7552"}, - {"2407:e5c0::/32", "45724"}, - {"2408:8957:1d40::/40", "17816"}, - {"2606:b400:8030::/48", "20037"}, - {"2804:13a0::/32", "263542"}, - {"2804:7c88::/32", "271502"}, - {"2a02:578:6400::/38", "9031"}, - {"2a02:26f7:f2c9::/46", "20940"}, - {"2001:559:87c7::/48", "7016"}, - {"2001:c20:c811::/48", "9255"}, - {"2001:1a40:104::/44", "5416"}, - {"2001:978:1802::/38", "174"}, - {"2402:800:f7b0::/41", "7552"}, - {"240c:ca2a::/29", "23910"}, - {"2602:fdbc::/36", "397774"}, - {"2620:a7:4000::/48", "19473"}, - {"2803:9110::/34", "271992"}, - {"2001:4488:fe62::/30", "7713"}, - {"2001:44c8:4640::/43", "131445"}, - {"240a:a0f1::/32", "142891"}, - {"2001:4b60:100::/48", "1764"}, - {"240e:1a::/44", "23650"}, - {"2a03:8000::/32", "60830"}, - {"2a06:5f80::/32", "57780"}, - {"2402:800:5b7f::/40", "7552"}, - {"2402:800:f260::/40", "7552"}, - {"2a07:4c0::/29", "42306"}, - {"2001:559:c03e::/47", "7922"}, - {"2800:160:1077::/40", "14259"}, - {"2a05:1500:fe00::/40", "12859"}, - {"2001:559:4b7::/48", "33662"}, - {"2406:e000:32d::/43", "23655"}, - {"2409:8c15:2900::/37", "56044"}, - {"2804:5fec::/32", "269134"}, - {"2001:67c:28b8::/48", "28892"}, - {"2001:fd8:f1b0::/44", "4775"}, - {"2402:8100:211f::/48", "55644"}, - {"2a0b:a8c0:2::/48", "202181"}, - {"2a0c:2500::/32", "48314"}, - {"2001:678:794::/48", "201281"}, - {"2001:678:f00::/48", "208930"}, - {"2804:3c80:11a0::/32", "266216"}, - {"240a:ad64::/32", "146078"}, - {"240e:966:d400::/39", "58772"}, - {"2a07:9200::/29", "62206"}, - {"240e:45c:6b00::/40", "140531"}, - {"2a02:20b0::/31", "8315"}, - {"2c0f:f9d8::/32", "37352"}, - {"2401:d800:bac0::/42", "7552"}, - {"2604:8380:2400::/35", "29802"}, - {"2610:a1:3054::/48", "12008"}, - {"2a01:110:8069::/35", "6584"}, - {"2001:559:3bd::/46", "33651"}, - {"2403:9800:7f1d::/46", "4771"}, - {"240a:a1dd::/32", "143127"}, - {"240e:423::/32", "140061"}, - {"2800:bf0:8063::/48", "27947"}, - {"2804:204:32a::/47", "28186"}, - {"2806:230:101c::/48", "265594"}, - {"2a02:26f7:c3e1::/43", "20940"}, - {"2a04:4e40:9a00::/48", "54113"}, - {"2a0a:d040::/29", "59682"}, - {"2c0f:f020:8100::/40", "327907"}, - {"2406:7ec0::/44", "38074"}, - {"2600:1403:ac01::/35", "20940"}, - {"2a02:680::/36", "24995"}, - {"2a03:f87:ffff::/48", "57169"}, - {"2a07:3500:1b48::/48", "1136"}, - {"2404:bf40:8180::/45", "7545"}, - {"2402:e400::/32", "4851"}, - {"240e:108:4b::/48", "133774"}, - {"2a0c:c500::/32", "49798"}, - {"2604:3e40::/32", "19117"}, - {"2804:2c0::/33", "262834"}, - {"2400:ca00:101::/30", "23688"}, - {"2401:4900:1c16::/44", "24560"}, - {"2600:6c10:f07b::/40", "20115"}, - {"2a02:26f7:c9c1::/46", "20940"}, - {"2001:559:c385::/48", "33657"}, - {"2001:559:c438::/47", "7922"}, - {"2409:8020:b1::/41", "56046"}, - {"2801:1ac::/48", "18747"}, - {"2a09:bac0:148::/48", "13335"}, - {"2402:800:9255::/42", "7552"}, - {"2409:8004:1100::/36", "24547"}, - {"2a02:5740:4::/48", "58065"}, - {"2a0e:2380::/32", "208929"}, - {"2a10:9d40::/29", "211727"}, - {"2402:8100:2100::/44", "45271"}, - {"2409:8c54:2020::/37", "56040"}, - {"2a07:9280::/29", "202759"}, - {"2001:678:61c::/48", "204423"}, - {"2402:800:9ab7::/41", "7552"}, - {"2a02:26f7:d048::/48", "36183"}, - {"2a05:d050:4040::/44", "16509"}, - {"2001:e48:23::/41", "9583"}, - {"2001:4cf0::/29", "680"}, - {"2407:d700::/32", "132884"}, - {"2a02:2698:a004::/46", "49874"}, - {"2804:330::/35", "53240"}, - {"2804:5284::/46", "268523"}, - {"2804:7428::/32", "270962"}, - {"2404:bf40:a001::/48", "7545"}, - {"2409:8054:3074::/31", "56040"}, - {"240a:ab3f::/32", "145529"}, - {"2001:559:2a::/48", "7015"}, - {"2001:559:c509::/48", "33287"}, - {"2001:678:4a4::/48", "44574"}, - {"2804:37b8::/32", "266431"}, - {"2a06:5cc0::/29", "42505"}, - {"2a0d:b201:c030::/41", "206026"}, - {"2001:559:c2de::/48", "7922"}, - {"2001:df0:b100::/48", "136475"}, - {"2001:4878:c254::/48", "34164"}, - {"2400:d400:9280::/48", "9280"}, - {"240e:928::/37", "58542"}, - {"2610:b0:416e::/47", "21433"}, - {"2a01:8ca0::/32", "24589"}, - {"2a02:17b0::/32", "29252"}, - {"2a0f:85c1:28::/48", "213384"}, - {"2401:2d00:83e6::/44", "17625"}, - {"2402:7500:568::/40", "24158"}, - {"2404:f4c0:f4c0::/48", "142549"}, - {"2405:6580::/29", "4685"}, - {"2408:8456:a00::/42", "17622"}, - {"2605:6400:10::/48", "53667"}, - {"2804:2c24::/32", "265198"}, - {"2a02:2e02:cc0::/42", "12479"}, - {"2a03:9780::/32", "47767"}, - {"2a0d:bc00::/29", "51426"}, - {"2402:800:bb60::/40", "7552"}, - {"240a:a803::/32", "144701"}, - {"2a01:190:39::/48", "199015"}, - {"2a01:a280:103::/30", "35000"}, - {"2001:559:540::/48", "33491"}, - {"2403:2f00::/32", "24466"}, - {"2600:9000:1136::/44", "16509"}, - {"2606:e980::/32", "393945"}, - {"2804:14d:5891::/42", "28573"}, - {"2a02:74a0:1::/48", "204038"}, - {"2001:14c8::/32", "16128"}, - {"240a:a2db::/32", "143381"}, - {"240a:a5fb::/32", "144181"}, - {"240e:c9:4000::/35", "134765"}, - {"2600:6000:fcd2::/39", "12271"}, - {"2409:8924:4f00::/35", "56046"}, - {"2600:6c10:f409::/46", "20115"}, - {"2620:1e:a000::/48", "196962"}, - {"2a01:6b80::/32", "8887"}, - {"2400:9800:d::/43", "24203"}, - {"240e:6b6:1000::/34", "4134"}, - {"2804:164c::/40", "263280"}, - {"2806:2f0:20e3::/43", "22884"}, - {"2a0d:60c1::/30", "208861"}, - {"2001:4cb8:40c::/29", "28878"}, - {"2409:800b:2904::/47", "9808"}, - {"240a:a196::/32", "143056"}, - {"2a0c:3000::/32", "34953"}, - {"2c0f:f850:157::/32", "327979"}, - {"2605:f400:1::/48", "22611"}, - {"2a00:11b8::/32", "44009"}, - {"2a00:4280::/32", "15401"}, - {"2c0f:f000:700::/36", "36891"}, - {"2400:1d20::/32", "45727"}, - {"2408:8459:450::/38", "17816"}, - {"2a00:cc20::/33", "20495"}, - {"2402:800:550f::/43", "7552"}, - {"2402:bcc0::/32", "9639"}, - {"2409:8904:4460::/39", "24547"}, - {"2606:6680:2::/48", "40676"}, - {"2607:e480::/46", "395748"}, - {"2001:3c8:900a::/34", "4621"}, - {"2001:559:776::/48", "33659"}, - {"2402:e280:2167::/44", "134674"}, - {"2600:9000:a102::/48", "16509"}, - {"2a00:4fc0::/32", "39931"}, - {"2a02:26f7:dc85::/46", "20940"}, - {"2406:da11::/36", "16509"}, - {"240a:a512::/32", "143948"}, - {"240e:67a:8400::/38", "140329"}, - {"2600:9000:248c::/43", "16509"}, - {"2602:fc23:156::/47", "8095"}, - {"2607:3900::/32", "27382"}, - {"2800:4d0:2490::/44", "52489"}, - {"2804:14d:7e00::/42", "28573"}, - {"2a02:26f7:d605::/46", "20940"}, - {"2a03:62a0:3501::/48", "1759"}, - {"2001:678:3d4::/48", "201723"}, - {"2400:b340::/32", "139901"}, - {"2406:2000:efbd::/35", "10310"}, - {"240e:44d:4b00::/42", "140345"}, - {"2a01:7480::/32", "12750"}, - {"2a02:a60::/33", "45031"}, - {"2a0c:b641:260::/44", "59598"}, - {"2001:67c:684::/48", "12502"}, - {"2409:8074:100::/35", "9808"}, - {"240e:44d:7240::/42", "140356"}, - {"2602:ff84:c::/48", "36351"}, - {"2606:e480:400::/33", "55083"}, - {"2a02:26f7:bbc0::/48", "36183"}, - {"2a0e:8f02:f03a::/48", "210707"}, - {"2001:559:c1c9::/48", "33650"}, - {"2401:fa00:45::/43", "24424"}, - {"2804:2d4c::/32", "265272"}, - {"2001:559:c071::/48", "21508"}, - {"240a:a14e::/32", "142984"}, - {"2606:2800:4203::/48", "14210"}, - {"2804:4c0::/32", "3549"}, - {"2a04:f380::/32", "59985"}, - {"2c0f:f140:a000::/33", "327700"}, - {"2401:8d00::/47", "38345"}, - {"2405:f080:1e0e::/43", "136907"}, - {"2620:13b:3010::/47", "13607"}, - {"2804:40ec::/32", "265991"}, - {"2a02:26f7:e914::/48", "36183"}, - {"240a:a29a::/32", "143316"}, - {"2804:204:315::/42", "28186"}, - {"2a0e:c80:323::/48", "40676"}, - {"2804:471c::/32", "267032"}, - {"2806:20d:9300::/33", "32098"}, - {"2a01:a280::/46", "35000"}, - {"2a02:26f7:ebc9::/46", "20940"}, - {"2a0e:8f02:f005::/48", "212983"}, - {"2408:8456:5e40::/39", "17816"}, - {"2409:8020:c1::/43", "56046"}, - {"2610:a1:303c::/48", "12008"}, - {"2806:105e:f::/43", "8151"}, - {"2402:78c0:1000::/34", "137455"}, - {"2a02:26f7:c044::/48", "36183"}, - {"2001:67c:2fdc::/48", "42063"}, - {"2403:cd40:8001::/33", "10075"}, - {"2804:7f5c::/32", "271683"}, - {"2a00:9c80::/32", "35613"}, - {"2a06:8dc0::/42", "57878"}, - {"2001:4430:5128::/38", "17853"}, - {"2403:5a40:40::/48", "134562"}, - {"2a03:9180::/47", "199422"}, - {"2401:d800:ff92::/41", "7552"}, - {"2600:140f:6401::/38", "20940"}, - {"2604:ba00::/32", "11798"}, - {"2408:8456:8c40::/39", "17816"}, - {"240a:a2eb::/32", "143397"}, - {"240e:966:ac00::/33", "4134"}, - {"2804:18:5030::/36", "26599"}, - {"2a0f:d700::/29", "208861"}, - {"240e:940:f00::/32", "4134"}, - {"2604:1380:40d0::/39", "54825"}, - {"2606:2800:600a::/48", "15133"}, - {"2804:82b4::/32", "272535"}, - {"2a02:26f7:c905::/46", "20940"}, - {"2409:8052:2002::/40", "56047"}, - {"2804:6c0:100::/38", "262418"}, - {"2804:950:8010::/39", "263072"}, - {"2804:3054::/32", "264944"}, - {"2804:4b8c::/32", "267313"}, - {"2a0a:340:100::/40", "56807"}, - {"2001:250:81c::/42", "138182"}, - {"2602:fdd0::/36", "397488"}, - {"2620:106:7002::/45", "11795"}, - {"2a0c:b641:458::/48", "208749"}, - {"2001:67c:22d4::/48", "3320"}, - {"2409:896a:a200::/39", "9808"}, - {"240a:a056::/32", "142736"}, - {"2600:1417:79::/46", "20940"}, - {"2801:1b:a800::/48", "19429"}, - {"2001:559:85c7::/44", "33651"}, - {"2001:67c:15ec::/48", "21485"}, - {"2001:df2:c480::/48", "140001"}, - {"2001:16b8:1f00::/33", "8881"}, - {"2001:4490:3dfc::/38", "9829"}, - {"2403:1000:5300::/40", "38819"}, - {"2602:ffc8::/39", "20278"}, - {"2605:3600::/46", "30452"}, - {"2804:14c:3d00::/40", "28573"}, - {"2804:536c::/32", "268583"}, - {"2402:8100:2600::/41", "45271"}, - {"2409:8a6c:6300::/27", "9808"}, - {"240a:aa64::/32", "145310"}, - {"240e:67f:c600::/34", "4134"}, - {"2604:d600:1061::/45", "32098"}, - {"2a02:26f7:b8c0::/48", "36183"}, - {"2a05:d050:c0c0::/44", "16509"}, - {"2404:9400:1000::/33", "133159"}, - {"2404:bf40:a0c1::/39", "139084"}, - {"240a:ae1d::/32", "146263"}, - {"2602:ff96:14::/48", "8100"}, - {"2605:8600::/32", "26827"}, - {"2804:73bc::/46", "270934"}, - {"2408:8256:3260::/44", "17623"}, - {"2408:8957:4800::/40", "17622"}, - {"2409:8907:7d20::/38", "24547"}, - {"2804:4f0:c000::/34", "22129"}, - {"2804:7000::/32", "270700"}, - {"2a02:26f7:bd44::/48", "36183"}, - {"2a02:26f7:fa48::/48", "36183"}, - {"2a10:d100::/32", "28919"}, - {"2001:559:81bb::/48", "33651"}, - {"2604:21c0::/32", "396097"}, - {"2804:6138::/32", "269221"}, - {"2a06:e881:1802::/45", "206885"}, - {"2400:cd00:1038::/41", "38794"}, - {"240e:958:1100::/40", "4134"}, - {"2620:1fc::/36", "55028"}, - {"2408:84f3:b810::/42", "134543"}, - {"2804:1310::/32", "263513"}, - {"2a06:6f40::/29", "204109"}, - {"2400:b4c0::/32", "134141"}, - {"2400:bc00:1811::/46", "140637"}, - {"2804:954:41::/42", "263073"}, - {"2804:1634::/32", "263275"}, - {"2a00:79e1:f1c::/46", "36384"}, - {"2001:559:87b0::/47", "7015"}, - {"2001:1820:1a::/48", "6147"}, - {"2401:380::/32", "17907"}, - {"2c0f:f6d0:86::/42", "327687"}, - {"2001:550:9b00:100::/46", "174"}, - {"2602:ffb0:16::/48", "20473"}, - {"2a0f:bf00:80::/42", "207801"}, - {"2001:579:dc::/39", "22773"}, - {"2001:dc3::/32", "7500"}, - {"2001:dcc:5::/48", "23596"}, - {"2401:4900:4ac0::/44", "45609"}, - {"2404:c0:6400::/32", "23693"}, - {"2602:fc4a::/36", "399890"}, - {"2a00:1560:d::/48", "59771"}, - {"2400:b600::/32", "24362"}, - {"2606:7500::/32", "54154"}, - {"2620:171:5::/46", "715"}, - {"2a02:26f7:ca48::/48", "36183"}, - {"2a0a:69c0::/29", "25375"}, - {"2a0e:6902:4000::/40", "57695"}, - {"2406:840:f660::/44", "209218"}, - {"2408:80da::/32", "17816"}, - {"240a:a71a::/32", "144468"}, - {"2a02:26f7:eec9::/42", "20940"}, - {"2a0f:cc87:3000::/33", "210625"}, - {"2001:559:104::/48", "33651"}, - {"2600:6000:fcd1::/48", "11351"}, - {"2602:fda3:4::/36", "397942"}, - {"2806:370:5310::/44", "28403"}, - {"2a09:11c0:32c::/43", "211352"}, - {"2405:205:6000::/32", "55836"}, - {"2409:8a3e::/25", "9808"}, - {"240a:abc4::/32", "145662"}, - {"2602:fd50:f20::/44", "207609"}, - {"2804:8c8::/32", "262393"}, - {"2804:3d28:10::/48", "262664"}, - {"2001:559:e9::/48", "13367"}, - {"2001:660:3007::/32", "2200"}, - {"2001:67c:1550::/48", "31451"}, - {"2605:db00::/32", "25222"}, - {"2804:5cc8:dd00::/34", "268930"}, - {"2a01:298:fd::/48", "50827"}, - {"2a02:2068::/32", "15830"}, - {"2001:1b28:800::/37", "205950"}, - {"2400:1c00:220::/43", "45143"}, - {"2400:6280:111::/48", "132280"}, - {"2405:b900:2000::/48", "55701"}, - {"2408:8406:b400::/39", "4808"}, - {"240a:ac93::/32", "145869"}, - {"240e:db:a800::/37", "38283"}, - {"2605:5fc1::/29", "1239"}, - {"2610:e0:a000::/48", "26934"}, - {"2a01:8840:dd::/48", "207266"}, - {"2a0c:5500::/45", "205081"}, - {"2001:550:2600:200::/47", "174"}, - {"2001:67c:1bc8::/48", "210729"}, - {"2402:2200:2000::/36", "24090"}, - {"2803:7d40::/32", "264680"}, - {"2001:1a70::/32", "12046"}, - {"2001:4450:41::/29", "9299"}, - {"2604:af80::/37", "18859"}, - {"2001:550:6700::/48", "14877"}, - {"240e:964:5800::/32", "4134"}, - {"2a0a:49c0::/29", "206178"}, - {"2a0d:a780::/29", "208994"}, - {"2001:43f8:b30::/48", "327917"}, - {"2400:cb00:a340::/46", "13335"}, - {"240e:e2:2000::/31", "4134"}, - {"2800:310:12::/38", "18678"}, - {"2801:1f0::/34", "3573"}, - {"2a02:26f7:bd09::/46", "20940"}, - {"2a04:4e42:84::/38", "54113"}, - {"2001:559:c40a::/48", "7016"}, - {"2001:16b8:6d00::/35", "8881"}, - {"2600:370f:5040::/47", "32261"}, - {"2602:fb9d:10::/48", "400554"}, - {"2804:2c88::/32", "265225"}, - {"2a02:a40::/32", "25248"}, - {"2a02:26f7:bf80::/48", "36183"}, - {"2a02:cb43:4000::/45", "20546"}, - {"2001:7f8:26::/64", "6461"}, - {"2404:3d00:41a9::/32", "3573"}, - {"2604:d600:103f::/41", "32098"}, - {"2a03:b200::/31", "20860"}, - {"2610:30:2001::/33", "30313"}, - {"2804:1318::/32", "263515"}, - {"2a0d:82c7:8000::/36", "47787"}, - {"2402:800:6211::/45", "7552"}, - {"2600:370f:9061::/46", "32261"}, - {"2a05:f740::/29", "206119"}, - {"2001:67c:2044::/48", "51290"}, - {"2001:860::/29", "5410"}, - {"2001:fb0:109f:18::/63", "36040"}, - {"2408:840c:7900::/40", "17621"}, - {"240a:a06f::/32", "142761"}, - {"2600:5c01:3044::/48", "11351"}, - {"2600:6c20:e07::/44", "20115"}, - {"2a03:780::/32", "59702"}, - {"2001:678:c20::/48", "200303"}, - {"2001:67c:1bac::/48", "59876"}, - {"2405:9800:70::/40", "131445"}, - {"2409:8714:4a00::/34", "56044"}, - {"2a00:f08::/32", "21367"}, - {"2a02:ff0:200::/40", "12735"}, - {"2a10:7b40::/29", "9186"}, - {"2a10:9100:6::/48", "47890"}, - {"2001:559:8255::/48", "7922"}, - {"2001:559:841c::/48", "21508"}, - {"2600:141b:3001::/37", "20940"}, - {"2602:fd92:c20::/44", "46997"}, - {"2607:f750:c000::/40", "23473"}, - {"2800:150:2::/45", "22047"}, - {"2001:559:c0bf::/48", "33287"}, - {"2001:1248:9a85::/44", "11172"}, - {"2a02:26f7:e8c0::/48", "36183"}, - {"2001:250:7024::/48", "24370"}, - {"2001:559:c1e9::/46", "7922"}, - {"2001:678:f4c::/48", "56793"}, - {"2401:d800:fb90::/42", "7552"}, - {"2402:f8c0::/48", "137798"}, - {"2600:1017:b0e0::/39", "6167"}, - {"2600:1409:4801::/35", "20940"}, - {"2801:80:1700::/40", "61580"}, - {"2a11:c9c0::/29", "1239"}, - {"2602:fea0::/36", "18531"}, - {"2801:190::/42", "10753"}, - {"2a06:7343:1f2c::/48", "199364"}, - {"2a0e:b107:12d1::/46", "211358"}, - {"2a0f:2e40::/29", "60262"}, - {"2001:468:1a00::/45", "4557"}, - {"2001:559:494::/48", "7016"}, - {"240a:a61c::/32", "144214"}, - {"240e:980:4600::/40", "134756"}, - {"2607:f820:4000::/32", "11051"}, - {"2800:440:86::/48", "27738"}, - {"2a00:1cb8:2:9::/61", "12713"}, - {"2001:559:291::/45", "7015"}, - {"2001:559:875c::/48", "7015"}, - {"2600:380:b580::/36", "20057"}, - {"2001:678:74::/48", "55195"}, - {"2001:918:ff74::/48", "8300"}, - {"2001:1978:2300::/37", "13768"}, - {"2401:d800:130::/41", "7552"}, - {"2408:8957:a700::/40", "17816"}, - {"240e:5e:f000::/36", "58543"}, - {"2600:6c38:769::/45", "20115"}, - {"2605:1980:2::/39", "13951"}, - {"2606:6080:1001::/46", "32489"}, - {"2001:559:5d2::/48", "7015"}, - {"2001:df5:f180::/48", "141710"}, - {"2804:30e0::/32", "264978"}, - {"2806:250:300::/46", "28512"}, - {"2806:2f0:12::/42", "17072"}, - {"2a0b:d240::/32", "47886"}, - {"2001:468:2610::/48", "396955"}, - {"240e:41:800::/34", "4134"}, - {"2a00:c600::/29", "41960"}, - {"2a09:6d40::/32", "60349"}, - {"2a0e:aa01:aa10::/44", "210311"}, - {"2001:559:c49c::/48", "33659"}, - {"2001:4878:8220::/48", "12222"}, - {"2409:8087:1b00::/37", "9808"}, - {"2803:d060::/32", "267813"}, - {"2001:1388:b46::/35", "6147"}, - {"2402:8100:39f0::/38", "45271"}, - {"2600:1003:b1d0::/44", "6167"}, - {"2600:e000::/38", "22995"}, - {"2803:6ce0::/35", "269909"}, - {"2a02:26f0:b001::/40", "20940"}, - {"2a07:14c0:4000::/36", "208861"}, - {"2a0b:82c0::/29", "41645"}, - {"2402:800:371d::/42", "7552"}, - {"2600:141b:7800::/48", "35994"}, - {"2804:6e4:a000::/35", "262612"}, - {"2804:136c:e001::/35", "262372"}, - {"2804:3e50::/39", "266587"}, - {"2804:7698::/32", "271122"}, - {"2a00:4200::/32", "41349"}, - {"2a01:ad40::/32", "198781"}, - {"2a12:5c00::/32", "42000"}, - {"2803:d600::/32", "20255"}, - {"2001:559:843b::/48", "7922"}, - {"2400:3740::/32", "136000"}, - {"2403:5a00::/32", "23783"}, - {"2a02:26f7:fa88::/48", "36183"}, - {"2c0f:3200::/47", "37558"}, - {"2c0f:ee78:8003::/45", "61317"}, - {"2406:e1c0:601::/36", "141459"}, - {"2600:6000:f004::/40", "12271"}, - {"2605:c700::/32", "819"}, - {"2620:4f:2000::/48", "40773"}, - {"2804:3994:8000::/33", "266037"}, - {"2a09:72c0::/29", "400522"}, - {"2001:550:d03::/45", "174"}, - {"2405:a540:100f::/32", "38156"}, - {"2409:8704:5900::/34", "24547"}, - {"240a:a694::/32", "144334"}, - {"2600:6c38:892::/44", "20115"}, - {"2a0a:fc80::/32", "12409"}, - {"2a10:d200::/29", "212323"}, - {"2001:15b8::/32", "24730"}, - {"2400:7e80::/32", "59258"}, - {"240a:a0be::/32", "142840"}, - {"2606:1c00::/32", "11714"}, - {"2610:88:2:1::/48", "14037"}, - {"2804:645c::/32", "269423"}, - {"2804:7a2c::/32", "271352"}, - {"2a00:a640:4::/32", "13445"}, - {"2a02:16a::/31", "13030"}, - {"2a03:90c0:9994::/44", "199524"}, - {"2a05:7640:2040::/42", "174"}, - {"2001:559:c202::/48", "33661"}, - {"2001:df1:6f80::/48", "139655"}, - {"2804:80e0::/32", "272418"}, - {"2a02:26f7:c746::/47", "20940"}, - {"2a02:26f7:f885::/46", "20940"}, - {"2a0f:fc0::/29", "60262"}, - {"2001:559:8428::/48", "33652"}, - {"2401:9780::/32", "132893"}, - {"2604:5500:a000::/38", "19165"}, - {"2801:12:7000::/48", "266737"}, - {"2804:54b4::/32", "262821"}, - {"2a02:26f7:ca89::/42", "20940"}, - {"2001:388:1030::/48", "137188"}, - {"2001:559:36c::/48", "7016"}, - {"2401:d800:bdc2::/42", "7552"}, - {"2404:bf40:c081::/48", "7545"}, - {"240a:aeaf::/32", "146409"}, - {"240e:3ba::/35", "134773"}, - {"2803:700::/32", "27976"}, - {"2806:2f0:7101::/46", "17072"}, - {"2001:559:5be::/48", "7922"}, - {"2402:9d80:a04::/46", "131429"}, - {"2402:e800::/32", "37912"}, - {"2403:1000:4100::/40", "38819"}, - {"2605:bfc0::/32", "36048"}, - {"2620:5:e000::/48", "13951"}, - {"2a02:26f0:301::/37", "20940"}, - {"2a0d:4f40::/32", "202724"}, - {"2403:300:a0c::/48", "6185"}, - {"2602:ff06:725::/48", "6939"}, - {"2607:fdf0:5c99::/38", "8008"}, - {"2a02:26f7:d649::/46", "20940"}, - {"2a02:2b50:ffff::/48", "21286"}, - {"2a02:2ab0:430::/39", "702"}, - {"2404:138:48::/39", "38022"}, - {"2405:9400::/32", "45172"}, - {"240e:978:1a00::/37", "4134"}, - {"2a02:ad8:14::/42", "12389"}, - {"2a02:c502::/29", "199246"}, - {"2409:8904:5e40::/42", "24547"}, - {"240e:3b5:2800::/38", "4134"}, - {"2a07:6c80::/29", "27176"}, - {"2001:4878:21e0::/44", "35994"}, - {"2804:ebc::/32", "61588"}, - {"2a03:e841::/32", "47492"}, - {"2a0b:aa00::/29", "20811"}, - {"2001:559:8289::/48", "20214"}, - {"2605:4a00:131::/44", "14361"}, - {"2605:cf80::/32", "63297"}, - {"2801:80:2560::/48", "268620"}, - {"2804:14c:75a6::/47", "28573"}, - {"2001:67c:1b08::/48", "2598"}, - {"2604:d600:566::/38", "32098"}, - {"2804:2cd4:30::/41", "265246"}, - {"2001:559:c20f::/48", "33662"}, - {"2001:57a:102::/47", "26008"}, - {"240a:a7e6::/32", "144672"}, - {"240a:ae25::/32", "146271"}, - {"2600:140b:1c01::/38", "20940"}, - {"2603:c0fc:2800::/40", "54253"}, - {"2804:eb4:480::/38", "61890"}, - {"2001:559:c247::/48", "33659"}, - {"240a:a97d::/32", "145079"}, - {"2600:370f:376e::/40", "32261"}, - {"2804:145c:8500::/36", "263327"}, - {"2a02:26f7:d60c::/48", "36183"}, - {"2408:8406:9c00::/39", "4808"}, - {"2409:8c28:203::/36", "56041"}, - {"2607:fc58:1:57::/64", "13536"}, - {"2a06:1140::/29", "49262"}, - {"2a0f:5707:ffa0::/45", "131668"}, - {"2405:ba00:8010::/48", "38538"}, - {"2620:10a:80d1::/48", "27299"}, - {"2804:6e2c::/32", "270580"}, - {"2a0f:bd00::/29", "202591"}, - {"2001:250:181a::/48", "23910"}, - {"2402:79c0:1149::/48", "26415"}, - {"2a01:581:d::/29", "9136"}, - {"2a02:26f7:d300::/48", "36183"}, - {"2405:3340::/48", "137856"}, - {"2800:160:2c57::/40", "14259"}, - {"2804:80ac::/32", "271766"}, - {"2a02:e747::/48", "210168"}, - {"2001:1248:a444::/43", "11172"}, - {"2404:e400:20::/32", "45345"}, - {"2804:46d4::/47", "267014"}, - {"240a:aaee::/32", "145448"}, - {"2a07:e00:ac::/48", "210083"}, - {"2001:559:7ef::/48", "22258"}, - {"2001:d10::/32", "4787"}, - {"2001:df4:bd00::/48", "137338"}, - {"2001:df7::/48", "59162"}, - {"2405:8d40:b00::/37", "139831"}, - {"2408:8456:1640::/39", "17816"}, - {"2408:8957:500::/40", "17816"}, - {"240d:c010:41::/46", "139341"}, - {"2620:111:800a::/45", "32771"}, - {"2804:3868:1000::/37", "266475"}, - {"2804:38e4::/32", "266508"}, - {"2a03:be80:42::/32", "15510"}, - {"2407:9240:2900::/40", "212358"}, - {"2607:f3a0:a001::/48", "399819"}, - {"2800:160:2b78::/40", "14259"}, - {"2804:61dc::/33", "269261"}, - {"2a02:26f0:aa01::/39", "20940"}, - {"2001:67c:2af8::/48", "29518"}, - {"2408:8459:be50::/33", "17816"}, - {"2a02:26f7:d241::/46", "20940"}, - {"2405:1c0:6871::/46", "55303"}, - {"240a:ab8d::/32", "145607"}, - {"2602:feda:d83::/48", "209645"}, - {"2605:b1c0::/32", "14404"}, - {"2403:1940:50::/48", "137935"}, - {"2408:8456:dc10::/42", "134543"}, - {"2408:8610::/29", "4837"}, - {"2001:67c:2378::/48", "41504"}, - {"2001:67c:2c18::/48", "59750"}, - {"240a:a33a::/32", "143476"}, - {"2607:f250:d020::/48", "7046"}, - {"2001:678:e00::/48", "44471"}, - {"2400:cb00:a842::/48", "13335"}, - {"2804:14c:d000::/40", "28573"}, - {"2a00:7160::/32", "8449"}, - {"2a0c:dd80:1000::/48", "208626"}, - {"240a:a7d3::/32", "144653"}, - {"2605:6440:6003::/45", "396356"}, - {"2804:426c::/32", "267499"}, - {"2806:2f0:4523::/41", "17072"}, - {"2a02:26f7:f280::/48", "36183"}, - {"2a03:300::/31", "207934"}, - {"2a0f:cc40::/29", "8901"}, - {"2403:1cc0:1301::/48", "45352"}, - {"2408:822a:9200::/34", "139007"}, - {"2409:8752:900::/38", "56047"}, - {"240e:14:7800::/37", "133776"}, - {"2606:2800:501b::/48", "14153"}, - {"2800:bf0:80a0::/47", "52257"}, - {"2804:240:3000::/32", "262798"}, - {"2001:da8:e81e::/48", "24368"}, - {"240a:a22f::/32", "143209"}, - {"2801:0:200::/48", "8053"}, - {"2001:559:c349::/48", "33657"}, - {"240a:a65c::/32", "144278"}, - {"240a:aa50::/32", "145290"}, - {"2804:1c8:8010::/39", "53184"}, - {"2a03:2267::/32", "49009"}, - {"2a0d:2146:8586::/44", "39526"}, - {"2600:141c:1801::/34", "20940"}, - {"2607:fa98::/35", "22439"}, - {"2804:1420::/32", "52901"}, - {"2a00:ae80::/32", "49750"}, - {"2a0d:4900::/48", "205996"}, - {"2001:559:2::/48", "7016"}, - {"2001:559:4dd::/48", "7015"}, - {"2001:559:c24f::/48", "33659"}, - {"2408:8456:a840::/38", "17816"}, - {"2606:c140::/32", "211444"}, - {"2804:4ff0::/32", "268359"}, - {"2a02:c50:db8::/48", "196610"}, - {"2a02:26f7:ba84::/47", "36183"}, - {"2a04:200::/29", "48101"}, - {"2001:559:c130::/48", "33659"}, - {"2001:42a8::/39", "36937"}, - {"2404:181::/32", "6619"}, - {"2600:1400:f001::/31", "20940"}, - {"2806:20d:7500::/32", "32098"}, - {"2001:da8:a400::/48", "24348"}, - {"240a:a9bf::/32", "145145"}, - {"240a:aa66::/32", "145312"}, - {"2606:2800:6a4d::/46", "15133"}, - {"2a04:4e40:4e00::/48", "54113"}, - {"2001:1248:5a32::/41", "11172"}, - {"2401:d800:ae0::/39", "7552"}, - {"2404:fd00:c::/32", "58552"}, - {"240e:108:1110::/47", "137695"}, - {"2a00:8860:900::/40", "209485"}, - {"2a02:c900::/29", "62319"}, - {"2001:978:90a::/38", "174"}, - {"240a:a5d3::/32", "144141"}, - {"2605:7240::/32", "10352"}, - {"2a05:c5c0::/48", "3164"}, - {"240e:67f:1800::/32", "4134"}, - {"2600:1417:e801::/37", "20940"}, - {"2a00:79e1:f14::/48", "395973"}, - {"2001:559:866e::/48", "7922"}, - {"2001:da8:6408::/48", "24367"}, - {"240e:dd:e000::/30", "4134"}, - {"2600:370f:3741::/46", "32261"}, - {"2803:7d80:5041::/32", "11664"}, - {"2a02:5c00::/29", "12580"}, - {"2a0c:1380::/29", "209984"}, - {"2001:428:3807::/48", "18703"}, - {"2001:1250:e300::/44", "22894"}, - {"240a:abdf::/32", "145689"}, - {"2800:40::/43", "16814"}, - {"2a02:918::/32", "31178"}, - {"2a02:6000:ffff::/48", "63017"}, - {"2600:3402:900::/35", "4181"}, - {"2800:bf0:8080::/45", "52257"}, - {"2804:38ec::/32", "266510"}, - {"2804:6990::/32", "270278"}, - {"2403:2940:1::/48", "63612"}, - {"2001:559:c065::/48", "33652"}, - {"2001:67c:19c0::/48", "48778"}, - {"2001:da8:6011::/46", "23910"}, - {"2804:14c:7f49::/43", "28573"}, - {"2a06:be00::/31", "200519"}, - {"2001:559:c23a::/48", "33651"}, - {"2001:67c:118::/48", "50419"}, - {"2400:4ec0:8300::/36", "64300"}, - {"2403:8300:8282::/48", "24442"}, - {"240a:a9a8::/32", "145122"}, - {"240c:ca1a::/32", "23910"}, - {"2804:f6c:2051::/32", "263585"}, - {"2804:5d44::/32", "268961"}, - {"2a02:1010:4000::/38", "9197"}, - {"2a0c:da04:10::/46", "202365"}, - {"2a0f:88c0::/32", "397651"}, - {"2001:dcd:7::/48", "397232"}, - {"2405:4040::/32", "135206"}, - {"2a02:758::/32", "29056"}, - {"2a02:2010:2200::/45", "20978"}, - {"2a02:26f7:d680::/48", "36183"}, - {"2a0a:5180::/29", "203231"}, - {"2401:8700:7f::/48", "36408"}, - {"2405:3e00::/32", "3908"}, - {"2804:2ab8:a::/41", "53180"}, - {"2804:79f4::/32", "271338"}, - {"2a00:b700:f::/48", "51659"}, - {"2a03:8940::/32", "49784"}, - {"2a0e:fd45:b01::/42", "44103"}, - {"2408:8957:e000::/40", "17622"}, - {"2600:1406:e000::/48", "35994"}, - {"2606:5440::/32", "1239"}, - {"2001:559:8482::/48", "7015"}, - {"2001:44c8:45e0::/43", "45430"}, - {"2403:2b40::/32", "137715"}, - {"2408:8207:a840::/28", "4808"}, - {"2408:8957:8a00::/40", "17622"}, - {"240e:45c:5500::/40", "140529"}, - {"2803:60a0::/32", "266809"}, - {"2a02:2aa0:120::/32", "702"}, - {"2001:fd8:31c0::/42", "132199"}, - {"2408:896c::/32", "4837"}, - {"2604:c800:ffff::/48", "6939"}, - {"2610:20:8808::/37", "3477"}, - {"2a00:1d32::/32", "9121"}, - {"2a00:ae20::/32", "60501"}, - {"2a01:788:1000::/48", "34305"}, - {"2a03:7380:3800::/42", "13188"}, - {"2001:57a:c222::/34", "22773"}, - {"2600:1010:f110::/36", "22394"}, - {"2607:f038:6006::/32", "21527"}, - {"2804:2c04::/32", "265188"}, - {"2001:559:842f::/48", "33651"}, - {"2001:67c:1064::/48", "51088"}, - {"240e:698:2a00::/40", "63835"}, - {"2804:1d30::/32", "264353"}, - {"2a00:1850:6ea::/48", "29357"}, - {"2408:8957:8000::/40", "17622"}, - {"2607:f7a8:1400::/38", "46887"}, - {"2a01:49a0::/32", "62199"}, - {"2a04:f580:9240::/48", "4809"}, - {"2a10:7bc0::/63", "60905"}, - {"2a06:6800::/29", "20565"}, - {"2804:65b8::/32", "269510"}, - {"2a07:e344::/32", "49981"}, - {"2001:559:c0a2::/48", "33659"}, - {"2001:579:e328::/41", "22773"}, - {"2401:e780::/32", "63930"}, - {"2607:f208:209::/48", "26496"}, - {"2610:b0:c100::/42", "701"}, - {"2804:2484:8150::/40", "28258"}, - {"2a09:4e04::/32", "208861"}, - {"240a:adfd::/32", "146231"}, - {"2804:3e34::/32", "266580"}, - {"2a02:2ad0:502::/48", "1270"}, - {"2001:559:8327::/44", "7015"}, - {"2402:800:9c71::/40", "7552"}, - {"2404:e100:3::/48", "55685"}, - {"240e:f7:6000::/36", "134771"}, - {"2600:1003:9850::/37", "22394"}, - {"2600:1417:16::/48", "7473"}, - {"2800:4b0:8810::/33", "12252"}, - {"240e:5a:6c00::/38", "137702"}, - {"2606:1e00::/32", "12067"}, - {"2620:22:4000::/48", "29773"}, - {"240a:acf8::/32", "145970"}, - {"240e:106:8000::/34", "4134"}, - {"2406:840:e1ef::/48", "141237"}, - {"2602:fd23:2::/48", "398292"}, - {"2607:6b80:66::/48", "63213"}, - {"2806:2f0:7303::/42", "17072"}, - {"2a0c:9a40:8170::/48", "210633"}, - {"2001:559:1ad::/48", "7725"}, - {"2001:678:78::/48", "42"}, - {"2406:840:f200::/44", "141694"}, - {"2409:8c2f:3801::/43", "56041"}, - {"2620:116:8082::/48", "27281"}, - {"2804:14d:8000::/40", "28573"}, - {"2804:2854::/32", "263956"}, - {"2001:468:26e1::/48", "237"}, - {"240e:3b8:d000::/36", "134772"}, - {"2a00:e800::/32", "49895"}, - {"2a06:1287:4::/42", "61138"}, - {"2a09:d340::/29", "39175"}, - {"2a0e:b107:14dd::/48", "50058"}, - {"2a0f:b507:ff03::/40", "206313"}, - {"2001:388:e3::/35", "7575"}, - {"2001:67c:24a0::/48", "198143"}, - {"2801:1b6::/44", "27951"}, - {"2a0b:6e40::/29", "61399"}, - {"2001:559:134::/48", "33491"}, - {"2001:4878:b228::/48", "12222"}, - {"2402:800:b7a0::/41", "7552"}, - {"2607:f740:20::/45", "36236"}, - {"2804:7504::/33", "271018"}, - {"2a10:ae80::/29", "212131"}, - {"2001:67c:7c2::/48", "57031"}, - {"2804:3c8c::/32", "266219"}, - {"2806:230:401b::/48", "11888"}, - {"2409:8050:3800::/47", "56047"}, - {"2a00:1c50:5::/46", "30811"}, - {"2a00:c8e0::/32", "199876"}, - {"2409:8904:8c90::/39", "24547"}, - {"2605:f340::/32", "399007"}, - {"2a0e:b107:17a1::/45", "56758"}, - {"2001:559:721::/48", "33657"}, - {"2401:d800:58b0::/41", "7552"}, - {"2804:2d8::/32", "52532"}, - {"2a02:26f7:d341::/46", "20940"}, - {"2a03:4c00::/29", "16347"}, - {"2001:480:161::/48", "5978"}, - {"2404:5d80:6600::/40", "33438"}, - {"2600:1001:9010::/40", "22394"}, - {"2607:6100:d0::/48", "54380"}, - {"2a04:e2c0::/29", "207050"}, - {"2a0f:1b00::/29", "7155"}, - {"2402:d0c0::/45", "35913"}, - {"240e:983:1e08::/48", "134773"}, - {"2604:bc0:5::/46", "46562"}, - {"2804:5e74::/32", "269034"}, - {"2a03:1900::/29", "47623"}, - {"2400:9380:89c0::/44", "136167"}, - {"2600:9000:115e::/48", "16509"}, - {"2607:f750:700::/36", "23473"}, - {"2a02:26f7:ec41::/46", "20940"}, - {"2a0d:d742::/45", "210036"}, - {"2a12:4946:4940::/44", "209958"}, - {"2409:8060:1900::/34", "9808"}, - {"2600:1409:a000::/48", "35994"}, - {"2803:17a0::/32", "267777"}, - {"2a02:970:115a::/42", "44002"}, - {"2a02:26f7:df48::/48", "36183"}, - {"2404:1f00:ffb5::/41", "55947"}, - {"2a02:26f7:dcc1::/46", "20940"}, - {"2a00:1aa8::/29", "42189"}, - {"2600:1406:1401::/39", "20940"}, - {"2607:fdc0:180::/38", "20326"}, - {"2804:14d:5c61::/43", "28573"}, - {"2a02:2e02:ea0::/43", "12479"}, - {"2a07:e940::/29", "213150"}, - {"2a0a:d6c0:2::/45", "61423"}, - {"2a0e:1107::/48", "208975"}, - {"2409:4071:1000::/30", "55836"}, - {"240a:a1ea::/32", "143140"}, - {"2603:f400::/26", "397165"}, - {"2806:268:1300::/37", "13999"}, - {"2a0e:e704:45::/48", "212970"}, - {"2001:468:c00::/45", "10886"}, - {"2001:559:443::/48", "7015"}, - {"2001:4410::/35", "132040"}, - {"2a00:1850:6a1::/48", "29357"}, - {"2a00:1908:e48::/32", "43586"}, - {"2001:67c:10cc::/48", "45011"}, - {"2405:1c0:6611::/45", "55303"}, - {"2804:770c::/32", "271151"}, - {"2a03:e00::/32", "50163"}, - {"2001:559:c345::/48", "7922"}, - {"2400:7400:3a::/48", "38044"}, - {"2401:d800:9b60::/40", "7552"}, - {"2405:1300::/32", "58698"}, - {"2406:daa0:a0c0::/44", "16509"}, - {"2600:5c01:2d3a::/35", "10796"}, - {"2804:7f60::/32", "271684"}, - {"2a0b:4581::/48", "16509"}, - {"2607:ac80:100::/40", "397511"}, - {"2607:b480::/32", "394814"}, - {"2620:f1:c000::/48", "22773"}, - {"2804:3244::/46", "265066"}, - {"2804:3c7c::/32", "266215"}, - {"2a05:3280:43a::/29", "50999"}, - {"2a0c:4140::/32", "206656"}, - {"2a0e:b107:510::/48", "209101"}, - {"2001:559:8260::/48", "33667"}, - {"2001:df2:ee00::/47", "45192"}, - {"2001:19f0::/38", "20473"}, - {"2402:800:9b39::/41", "7552"}, - {"2602:fde7::/36", "5650"}, - {"2610:b0:4117::/48", "3573"}, - {"2800:bf0:a6::/48", "27947"}, - {"2a00:ff0:1234::/48", "41494"}, - {"2a00:7b80::/32", "62370"}, - {"2001:998::/40", "719"}, - {"2607:fc48:410::/48", "40009"}, - {"2a0a:59c7:1009::/46", "204724"}, - {"2a03:9e42::/32", "31399"}, - {"2a0e:97c0:738::/45", "208699"}, - {"2001:43f8:d20::/44", "328209"}, - {"2a05:3740::/29", "8774"}, - {"2a0f:ff00:1912::/48", "213281"}, - {"2001:559:8347::/48", "7015"}, - {"2001:67c:504::/48", "61337"}, - {"2402:a300:c006::/36", "55427"}, - {"2a0f:c081:b11e::/48", "48108"}, - {"2001:559:c104::/48", "7725"}, - {"2001:559:c2ea::/47", "33659"}, - {"2401:7400:ec01::/35", "4773"}, - {"2404:b800::/32", "4739"}, - {"240a:a643::/32", "144253"}, - {"2801:1e:c800::/48", "27951"}, - {"2803:5200::/48", "52439"}, - {"2a02:840::/32", "41828"}, - {"2a05:b800::/29", "203550"}, - {"2a0a:1880::/29", "39647"}, - {"2404:bf40:a040::/48", "7545"}, - {"2405:e0c0::/48", "63730"}, - {"2804:5100::/34", "268424"}, - {"2a0b:4d07:a01::/48", "44239"}, - {"2001:1980:500::/36", "29838"}, - {"240a:a239::/32", "143219"}, - {"240a:a5a1::/32", "144091"}, - {"2604:cbc0::/32", "398143"}, - {"2a03:c000::/29", "2116"}, - {"2a0b:b87:ffd4::/48", "204826"}, - {"2c0f:e958::/32", "15399"}, - {"2402:800:34ee::/43", "7552"}, - {"240e:3be:ac00::/35", "4134"}, - {"2a01:b800::/32", "41937"}, - {"2a02:26f7:f089::/46", "20940"}, - {"2001:ee0:9640::/39", "45899"}, - {"2402:800:357f::/40", "7552"}, - {"2409:8c30:1210::/39", "9808"}, - {"2a02:ee80:41d8::/42", "3573"}, - {"2a06:4540::/29", "200428"}, - {"2a06:c5c0:700::/48", "44709"}, - {"2a07:59c6:eed7::/44", "48646"}, - {"2001:559:8322::/48", "33651"}, - {"2a00:f9c0::/32", "31727"}, - {"2a02:888:4052::/47", "48695"}, - {"2001:c38:90aa::/45", "135566"}, - {"2404:3d00:40c4::/47", "21433"}, - {"2604:2e00::/32", "11650"}, - {"2a02:26f7:c8d8::/48", "36183"}, - {"2001:579:d0e4::/39", "22773"}, - {"2409:896a:b000::/36", "9808"}, - {"2600:1402:801::/38", "20940"}, - {"2604:2e80:806::/37", "30036"}, - {"2a02:26f7:cc45::/46", "20940"}, - {"2a04:5c85::/36", "200584"}, - {"2001:c50::/32", "9924"}, - {"2620:12e:e000::/40", "14630"}, - {"2a03:19c0::/32", "204141"}, - {"2001:550:8901:2::/37", "174"}, - {"2804:555c::/32", "264105"}, - {"2001:418:1467::/40", "2914"}, - {"2404:8000:10bb::/32", "17451"}, - {"240c:c0a9:1300::/40", "133513"}, - {"240e:4a:4300::/40", "58571"}, - {"2a0f:ca87:9::/48", "208771"}, - {"2001:559:8596::/48", "7922"}, - {"2001:559:c0cc::/48", "33659"}, - {"2407:4000::/45", "38005"}, - {"240e:86:3000::/37", "137688"}, - {"2620:57:4000::/48", "62831"}, - {"2602:fcff:14::/47", "57164"}, - {"2607:3180::/47", "14877"}, - {"2620:101:200f::/43", "16417"}, - {"2804:6398::/32", "269371"}, - {"2a02:26f7:f300::/48", "36183"}, - {"2a04:8480::/30", "196714"}, - {"2a0d:1a45:6665::/32", "57782"}, - {"2a0e:b540::/29", "30823"}, - {"2a00:1d50::/32", "47605"}, - {"2a00:ab01::/32", "50149"}, - {"2a04:2100::/31", "40999"}, - {"2001:67c:2460::/48", "1257"}, - {"240a:a784::/32", "144574"}, - {"240a:a7bd::/32", "144631"}, - {"2600:3002:1212::/32", "13649"}, - {"2a02:26f0:d101::/38", "20940"}, - {"2a02:26f7:1b::/48", "20940"}, - {"2001:559:10::/48", "7922"}, - {"2001:67c:1264::/48", "51883"}, - {"240e:267:4400::/36", "4134"}, - {"2804:208c::/32", "264497"}, - {"2a07:5c0::/29", "213035"}, - {"2a0e:fd45:40f4::/48", "49367"}, - {"2a0f:5707:b000::/48", "212895"}, - {"2001:559:137::/44", "33650"}, - {"2407:bb00:5000::/44", "45625"}, - {"2602:fd65::/36", "55140"}, - {"2803:ce00::/32", "52422"}, - {"2804:20:7a::/32", "26615"}, - {"2a00:c020::/36", "197588"}, - {"2a03:5a00:3e::/48", "48614"}, - {"2a07:57c0::/32", "50113"}, - {"2001:559:43a::/48", "33657"}, - {"2001:579:60ac::/38", "22773"}, - {"240a:a3dd::/32", "143639"}, - {"2001:559:852f::/48", "33662"}, - {"2001:67c:40::/48", "35733"}, - {"2400:13c0::/32", "135893"}, - {"2402:3a80:c043::/44", "38266"}, - {"2804:b4:f000::/36", "28294"}, - {"2804:d04::/32", "52584"}, - {"2804:1a30:c300::/40", "61844"}, - {"2a02:2e02:2670::/39", "12479"}, - {"2a10:6b00::/29", "399975"}, - {"2001:1260:4::/48", "28535"}, - {"2409:8a52:1100::/31", "56047"}, - {"2a00:ece1::/48", "5606"}, - {"2a01:9500:81::/32", "197696"}, - {"2a04:f580:9200::/46", "4809"}, - {"2001:559:827d::/48", "7015"}, - {"2001:40c0::/48", "21217"}, - {"2409:8752:b00::/37", "56047"}, - {"2001:559:c27a::/48", "33652"}, - {"2001:df7:af00::/48", "138142"}, - {"2001:44c8:4660::/43", "45430"}, - {"2407:5380::/32", "63629"}, - {"2604:af80:448::/36", "18859"}, - {"2a04:4240::/29", "48871"}, - {"2401:3bc0:401::/38", "137409"}, - {"240a:a84d::/32", "144775"}, - {"2605:7200::/32", "21804"}, - {"2803:2a00:3c00::/33", "27895"}, - {"2c0f:f020:8b00::/40", "327907"}, - {"240a:ac03::/32", "145725"}, - {"2600:1007:d0c0::/44", "6167"}, - {"2603:c026:c000::/35", "31898"}, - {"2800:160:1da2::/44", "14259"}, - {"2a00:1d34:4400::/40", "47331"}, - {"2409:8924:6f00::/35", "56046"}, - {"2a00:1588::/33", "25372"}, - {"2a02:2af8:130::/38", "702"}, - {"2a0a:4e83:120::/48", "206074"}, - {"2a0c:82c0::/29", "203015"}, - {"2001:16d8:65::/36", "16150"}, - {"2402:ef03:1::/46", "7633"}, - {"2409:802f:2900::/46", "9808"}, - {"240a:abad::/32", "145639"}, - {"240e:3b5:4c00::/35", "136200"}, - {"2804:2688::/32", "262482"}, - {"2804:2b44:37::/40", "265144"}, - {"2a03:2c40::/32", "199653"}, - {"2a10:44c0::/29", "210054"}, - {"2001:559:5a6::/44", "7922"}, - {"2401:b400:8::/47", "58536"}, - {"2402:9a00::/32", "38199"}, - {"2600:370f:3141::/40", "32261"}, - {"2620:11c:c000::/48", "54830"}, - {"2405:100:101::/32", "9905"}, - {"2600:1017:f110::/38", "6167"}, - {"2620:12b:4000::/40", "395568"}, - {"2801:80:16b0::/48", "265325"}, - {"2001:559:85b0::/48", "33491"}, - {"240a:a8fc::/32", "144950"}, - {"240e:60c:f800::/38", "137688"}, - {"2a0f:3784:100::/46", "213204"}, - {"2001:559:870e::/48", "7016"}, - {"2001:df1:3700:4000::/122", "136324"}, - {"2a0d:c5c0::/32", "210051"}, - {"2408:8956:1f40::/40", "17816"}, - {"2605:7c0:f100::/46", "19382"}, - {"2a10:2f00:14a::/48", "212767"}, - {"2403:e100:1001::/32", "58601"}, - {"2a0e:97c0:240::/44", "211688"}, - {"2001:67c:58::/48", "24629"}, - {"2400:1020::/44", "45276"}, - {"240a:a667::/32", "144289"}, - {"2602:ff62:183::/38", "61317"}, - {"2800:482:4001::/48", "14080"}, - {"2a02:26f7:d6cd::/42", "20940"}, - {"2a0c:c9c2:2::/40", "202414"}, - {"2001:3c8:1202::/48", "4762"}, - {"2001:67c:23b4::/48", "21297"}, - {"2603:b010:8000::/33", "11796"}, - {"2a02:2d8:1:780a::/64", "35277"}, - {"2001:559:73e::/48", "7922"}, - {"2001:16f8::/43", "25525"}, - {"2406:daa0:4080::/44", "16509"}, - {"2804:868::/32", "28649"}, - {"2804:2a50::/32", "262819"}, - {"2a06:6580::/29", "34549"}, - {"2a0f:6580::/44", "48292"}, - {"2001:1248:4320::/41", "11172"}, - {"240e:948::/31", "137695"}, - {"2804:14d:be82::/47", "28573"}, - {"2806:2f0:31a3::/41", "17072"}, - {"2001:67c:1933::/48", "12337"}, - {"2001:810::/32", "8839"}, - {"2409:8914:c600::/39", "56044"}, - {"2001:559:c3db::/48", "33287"}, - {"240a:a23c::/32", "143222"}, - {"2600:1013::/32", "6167"}, - {"2606:ec0:1000::/36", "4906"}, - {"2800:ab0::/32", "262196"}, - {"2a0a:1141:4000::/34", "206702"}, - {"2402:1c00:c07::/33", "23838"}, - {"2402:ef1e:100::/47", "7633"}, - {"2402:f000::/32", "45576"}, - {"2620:134:d000::/44", "32263"}, - {"2804:179c:2016::/35", "263159"}, - {"2a07:fec0::/29", "213138"}, - {"2c0f:f530::/44", "61138"}, - {"2001:418:4001:4::/64", "20940"}, - {"2806:230:5013::/48", "11888"}, - {"240a:a47e::/32", "143800"}, - {"2600:6c36:990::/48", "33588"}, - {"2602:fd36::/36", "398547"}, - {"2606:2800:11c::/48", "15133"}, - {"2804:4900::/34", "267158"}, - {"2a01:250:f000::/36", "34511"}, - {"2a02:4680::/48", "12722"}, - {"2604:4280::/32", "14866"}, - {"2606:5580:2000::/38", "63242"}, - {"2800:bf0:8291::/45", "52257"}, - {"2804:69b0:140::/44", "270285"}, - {"2a02:26f7:c048::/48", "36183"}, - {"2800:68:36::/48", "61468"}, - {"2800:98::/35", "14754"}, - {"2804:640:3e81::/43", "262713"}, - {"2a0a:2540::/29", "42244"}, - {"2001:470:13e::/48", "14979"}, - {"2806:263:c300::/37", "13999"}, - {"2a02:26f7:bd81::/46", "20940"}, - {"2a02:26f7:e80d::/42", "20940"}, - {"2001:559:1c4::/48", "33287"}, - {"2001:559:2b2::/47", "33652"}, - {"2001:559:8601::/46", "33287"}, - {"2001:4220:8015::/48", "24835"}, - {"2602:fc8b:22::/47", "211544"}, - {"2604:4500::/43", "29802"}, - {"2800:160:1db0::/41", "14259"}, - {"2804:38b8::/32", "266497"}, - {"2a02:26f7:d688::/48", "36183"}, - {"2a10:a040::/29", "40970"}, - {"2c0f:f6d8:4004::/47", "3573"}, - {"240a:a65d::/32", "144279"}, - {"240e:108:9b::/48", "134761"}, - {"2804:64d0::/32", "269450"}, - {"2a00:ed40::/32", "51043"}, - {"2a03:63e0::/29", "197099"}, - {"2408:8459:9a10::/42", "17623"}, - {"2600:380:b480::/39", "20057"}, - {"2620:106:e006::/47", "40428"}, - {"2804:2284::/32", "264106"}, - {"2405:203:c09::/29", "55836"}, - {"2407:6ac0::/32", "141968"}, - {"2806:363::/35", "265607"}, - {"2a07:3500:1a48::/48", "29396"}, - {"2a0c:b641:680::/44", "207466"}, - {"2001:4490:7f8::/36", "9829"}, - {"2409:8904:d0b0::/39", "24547"}, - {"2620:138:8000::/47", "62766"}, - {"2806:2f0:374::/40", "17072"}, - {"2a01:6d0::/32", "12552"}, - {"2001:559:80cf::/48", "33491"}, - {"2804:53d4:8000::/33", "268609"}, - {"2001:7f8:5d::/116", "29632"}, - {"2a02:26f0:a601::/39", "20940"}, - {"2a0a:4781::/30", "208861"}, - {"2400:4d40:f001::/36", "134204"}, - {"2400:a740::/32", "133034"}, - {"240a:a3e3::/32", "143645"}, - {"2804:3b6c:c00c::/46", "265442"}, - {"2a01:4fc0::/34", "5517"}, - {"2a10:6980::/29", "204790"}, - {"2001:250:2::/48", "24348"}, - {"2600:1480:9801::/37", "20940"}, - {"2001:978:7602::/36", "174"}, - {"2804:41f8::/32", "267469"}, - {"2a02:26f7:c581::/46", "20940"}, - {"2a06:7340:1782::/48", "199364"}, - {"2001:250:7021::/46", "23910"}, - {"2001:678:ed0::/48", "212567"}, - {"2001:b10:6000::/35", "16283"}, - {"2001:4150::/32", "5539"}, - {"2400:ddc0:1001::/34", "4785"}, - {"240a:afe2::/32", "146716"}, - {"2602:feda:d82::/48", "142566"}, - {"2a02:128:18::/48", "210845"}, - {"2a06:8100::/29", "34549"}, - {"2001:388:1035::/40", "7575"}, - {"2400:7400:65::/48", "23736"}, - {"2409:8e1b::/29", "9808"}, - {"240a:a899::/32", "144851"}, - {"2600:1404:ec01::/35", "20940"}, - {"2620:138:800e::/47", "62766"}, - {"2804:97c::/32", "263092"}, - {"2804:3458::/32", "28128"}, - {"2a06:5240:1ff0::/44", "50629"}, - {"2a0f:85c1:100::/40", "209401"}, - {"2804:4::/32", "28667"}, - {"2a03:6180::/32", "41741"}, - {"2a09:b00::/29", "209895"}, - {"2001:67c:16f8::/48", "198611"}, - {"240a:adc7::/32", "146177"}, - {"240e:45c:c900::/40", "140538"}, - {"2605:ff80::/32", "21632"}, - {"2606:5480:1000::/36", "21722"}, - {"2804:833c:2400::/33", "272185"}, - {"2a00:19d8::/32", "42004"}, - {"2a02:26f7:fc09::/38", "20940"}, - {"2001:559:8237::/48", "7015"}, - {"2405:3580:1919::/48", "62240"}, - {"2408:894c::/32", "4837"}, - {"240a:a66f::/32", "144297"}, - {"240e:bf:b8fc::/46", "138436"}, - {"2600:1006:b130::/44", "22394"}, - {"2604:81c0:3d5::/48", "396422"}, - {"2804:7420::/32", "270960"}, - {"2a02:17e8:801::/37", "13002"}, - {"2c0f:f798::/32", "327817"}, - {"240a:a183::/32", "143037"}, - {"2602:fbc3::/36", "13737"}, - {"2606:2800:5081::/48", "15133"}, - {"2803:7e00:600f::/32", "28026"}, - {"2409:807f:2c00::/24", "9808"}, - {"240a:ad79::/32", "146099"}, - {"2804:14d:ba87::/42", "28573"}, - {"2a01:9760:2::/47", "62087"}, - {"2001:559:8470::/48", "7015"}, - {"2001:67c:18e0::/48", "199971"}, - {"2401:d800:db0::/41", "7552"}, - {"240e:3ba:4c00::/35", "136200"}, - {"240e:438:1a20::/43", "140647"}, - {"2600:1409:1801::/34", "20940"}, - {"2605:fd00::/32", "15296"}, - {"2a02:53e0::/32", "44092"}, - {"2001:1b88:2::/32", "39477"}, - {"2606:2500::/32", "7194"}, - {"2a02:26f7:f6ea::/47", "20940"}, - {"2409:8775::/28", "9808"}, - {"2804:390:2000::/35", "52956"}, - {"2402:9e80:10::/48", "20473"}, - {"240a:a7a5::/32", "144607"}, - {"240e:94::/31", "17638"}, - {"2600:1001:b1d0::/44", "6167"}, - {"2606:f100:b000::/33", "3300"}, - {"2405:fc80::/32", "23805"}, - {"2604:340::/32", "32281"}, - {"2a02:26f7:b741::/46", "20940"}, - {"2a03:3180:10::/36", "44453"}, - {"2001:340::/32", "4678"}, - {"2602:ff12::/36", "62529"}, - {"2804:6e40:3000::/32", "270584"}, - {"2a05:5dc0::/29", "201193"}, - {"2a0c:180::/29", "39419"}, - {"2001:44b8:30b2::/48", "7545"}, - {"2404:8e00::/32", "55391"}, - {"2405:6c0:4::/48", "63641"}, - {"2a02:21b2:ac10::/48", "57370"}, - {"2a0c:2f07:ac1::/48", "206924"}, - {"2001:559:11::/48", "7015"}, - {"2001:559:80d7::/48", "7015"}, - {"2401:b0c0:e000::/48", "136941"}, - {"2604:ff00:1b01::/48", "36271"}, - {"2a03:2760::/32", "49115"}, - {"2a06:e043::/32", "198507"}, - {"2001:559:836e::/48", "7922"}, - {"2402:800:ba70::/40", "7552"}, - {"2402:a7c0::/32", "59253"}, - {"2402:b801::/38", "18371"}, - {"2600:140e:3::/31", "20940"}, - {"2602:fed2:7181::/46", "53356"}, - {"2800:160:1e98::/46", "14259"}, - {"2001:578:118::/42", "22773"}, - {"240e:37b:2600::/32", "4134"}, - {"2600:6c39:22c::/43", "20115"}, - {"2607:f0c8::/32", "21949"}, - {"2a07:3500:1da8::/48", "1136"}, - {"2001:559:852e::/48", "7922"}, - {"2001:67c:271c::/48", "60213"}, - {"2001:1250::/44", "22894"}, - {"240a:a799::/32", "144595"}, - {"2a00:fc00:e004::/35", "3255"}, - {"2a05:7400::/34", "31257"}, - {"2a07:3500:1100::/48", "34108"}, - {"2001:559:81f3::/48", "33657"}, - {"2001:da8:7010::/48", "24363"}, - {"2401:4900:3a2a::/45", "45609"}, - {"2804:14c:a989::/41", "28573"}, - {"2a00:18e0::/48", "196763"}, - {"2a01:ce9c:9000::/31", "51964"}, - {"2a09:1140::/48", "50007"}, - {"2c0f:f188::/46", "328228"}, - {"2406:840:800::/41", "139317"}, - {"2409:8904:cda0::/38", "24547"}, - {"2603:c0f8:1020::/38", "20054"}, - {"2001:559:85b6::/44", "33491"}, - {"2001:8d8::/40", "8560"}, - {"2402:ef1a:1::/32", "7633"}, - {"2605:2040::/32", "396040"}, - {"2607:e400:2904::/32", "7459"}, - {"2a00:4780::/32", "35600"}, - {"2a0b:4340:a0::/48", "205532"}, - {"2408:840c:1e00::/40", "17621"}, - {"2408:8456:9410::/42", "134543"}, - {"240a:a63d::/32", "144247"}, - {"2620:104:8000::/40", "3807"}, - {"2a03:7540:5556::/34", "44406"}, - {"2408:8459:9e50::/34", "17816"}, - {"2001:559:c145::/48", "33652"}, - {"2001:44b8:27::/48", "4739"}, - {"240a:a868::/32", "144802"}, - {"2605:3380:42f2::/45", "12025"}, - {"2607:5600::/32", "31863"}, - {"2804:e0c:80::/48", "28176"}, - {"2001:253:121::/48", "142087"}, - {"2804:1e7c::/32", "264432"}, - {"2a0a:e040::/29", "42349"}, - {"240e:965:e600::/36", "4134"}, - {"2607:e880:8224::/48", "12220"}, - {"2800:484:2300::/40", "10620"}, - {"2804:242c::/32", "264206"}, - {"2001:df3:3980::/48", "44592"}, - {"240a:a36e::/32", "143528"}, - {"240e:44d:2d40::/42", "140349"}, - {"2600:1415:d800::/48", "9443"}, - {"2a0e:fd45:40ff::/48", "53356"}, - {"2402:800:72a0::/41", "7552"}, - {"2a00:5500::/32", "3238"}, - {"240e:e9:5000::/37", "138950"}, - {"2602:fe2e:fff::/48", "212123"}, - {"2804:3770::/32", "266414"}, - {"2a00:7000::/32", "34762"}, - {"2a03:f80:45::/48", "9009"}, - {"2a0a:54c1:57::/30", "62240"}, - {"2a0d:1100::/29", "200000"}, - {"2001:559:ee::/47", "7922"}, - {"2001:7f9:c::/48", "15606"}, - {"2400:a980:4500::/36", "133111"}, - {"240e:5a:4600::/40", "140298"}, - {"2600:c0b::/35", "14745"}, - {"2001:559:8399::/48", "33662"}, - {"2001:c20:4866::/44", "3758"}, - {"2001:4de0:ac18::/47", "20446"}, - {"2407:dc00:104::/38", "9714"}, - {"2602:fba9::/40", "400517"}, - {"2602:fe12:22::/48", "62707"}, - {"2001:559:c16d::/46", "33660"}, - {"2001:678:a8::/48", "48132"}, - {"2408:80ea:6880::/41", "17622"}, - {"2600:141b:7801::/32", "20940"}, - {"2620:104:2040::/48", "14618"}, - {"2a02:2000:facf::/29", "35297"}, - {"2001:16d8:ed00::/38", "16150"}, - {"2403:c00:d00::/46", "17488"}, - {"2806:2f0:8061::/46", "17072"}, - {"2a03:2887:ff46::/47", "33660"}, - {"2a0b:7540::/29", "21140"}, - {"2a0e:b107:f68::/48", "207466"}, - {"2401:a400:8000::/33", "7477"}, - {"2606:1980:10::/48", "54994"}, - {"2a03:ba0::/29", "201188"}, - {"2a09:4c0:3e1::/37", "58057"}, - {"2402:8100:2380::/37", "45271"}, - {"2602:fff3::/36", "11512"}, - {"2607:f050::/32", "7784"}, - {"2804:90:5300::/34", "28580"}, - {"2001:550:405::/44", "174"}, - {"2001:44b8:30a0::/46", "7545"}, - {"2801:1cc::/44", "27951"}, - {"2001:418:1401:19::/62", "2914"}, - {"2001:468:1f0f::/48", "11537"}, - {"2a0b:7086:fff0::/44", "50867"}, - {"2001:1838:c100::/34", "23352"}, - {"2402:800:3155::/42", "7552"}, - {"2409:805c:900::/35", "9808"}, - {"240a:aa39::/32", "145267"}, - {"2600:6c38:238::/41", "20115"}, - {"2604:d600:1333::/37", "32098"}, - {"2001:13d1:3c04::/30", "7303"}, - {"2803:3e40::/32", "269892"}, - {"2804:14c:bb00::/40", "28573"}, - {"2804:73c4::/32", "270936"}, - {"2804:7858::/32", "271236"}, - {"2a05:3e00::/29", "29484"}, - {"2a02:26f7:ee08::/48", "36183"}, - {"2001:559:8513::/48", "7016"}, - {"2404:7a80::/29", "2518"}, - {"2607:c180::/36", "13851"}, - {"2a02:26f7:e948::/48", "36183"}, - {"2a0b:40::/29", "205930"}, - {"2405:6e00:2400::/43", "18291"}, - {"2406:de00:400::/40", "18225"}, - {"2607:f5d8:11::/44", "11096"}, - {"2804:3da8::/32", "266545"}, - {"2806:230:102b::/48", "11888"}, - {"2a06:1ec0::/32", "49832"}, - {"2a07:a040::/29", "49542"}, - {"240d::/27", "2527"}, - {"240e:3b6:ec00::/35", "140314"}, - {"2a01:b180::/47", "57037"}, - {"2a02:26f7:e980::/48", "36183"}, - {"2a02:ee00::/29", "61297"}, - {"2a0b:8800::/46", "43376"}, - {"2a0f:7d07:fc16::/38", "60781"}, - {"2600:e00f:4009::/36", "22995"}, - {"2804:74b4::/32", "270998"}, - {"2001:678:274::/48", "8220"}, - {"2408:877d::/32", "133118"}, - {"240e:108:11c3::/43", "4134"}, - {"2a06:82c5::/48", "209537"}, - {"2001:43f8:1700::/46", "328365"}, - {"2400:c700:9001::/34", "55644"}, - {"2401:4900:5c20::/41", "45609"}, - {"240a:aa75::/32", "145327"}, - {"2602:ffdf:f00::/40", "25851"}, - {"2804:e94:640::/42", "262468"}, - {"2804:6f84::/32", "270665"}, - {"2404:77c0::/32", "138637"}, - {"2607:f3a0:a00a::/48", "399809"}, - {"2a02:26f7:f750::/48", "36183"}, - {"2a03:1e20::/32", "59925"}, - {"2001:3c8:cb01::/48", "136624"}, - {"2001:559:c0aa::/48", "33651"}, - {"2804:1080:c300::/34", "28287"}, - {"2804:64b8:c000::/34", "269444"}, - {"2804:7efc::/36", "271659"}, - {"2806:288:4081::/48", "28469"}, - {"2a04:ffc0:1::/48", "59949"}, - {"2a0b:6880::/32", "206466"}, - {"2001:559:13e::/48", "22258"}, - {"2402:8100:3038::/41", "45271"}, - {"2404:c0:32a0::/39", "23693"}, - {"240a:a7b3::/32", "144621"}, - {"2608:121:c::/48", "27142"}, - {"2803:c010:d::/48", "271799"}, - {"2a0f:5701:fe01::/48", "56382"}, - {"2001:c20:487f::/40", "3758"}, - {"2600:6c34:18e::/48", "33588"}, - {"2801:a6::/32", "52853"}, - {"2a07:b1c0::/29", "207853"}, - {"2001:578:113::/45", "22773"}, - {"240a:aa54::/32", "145294"}, - {"2602:fbd4::/36", "14079"}, - {"2607:f4e8:18::/40", "22822"}, - {"2001:67c:1378::/48", "56823"}, - {"240e:44d:7a80::/41", "4134"}, - {"2604:bf00:210::/48", "397384"}, - {"2804:1d04:b000::/33", "61689"}, - {"2001:250:742d::/48", "23910"}, - {"2402:800:3271::/44", "7552"}, - {"2402:800:3b01::/44", "7552"}, - {"2602:fc23:112::/48", "212360"}, - {"2a0e:fd45:2a00::/44", "213253"}, - {"2001:559:8293::/48", "33650"}, - {"2409:805c:5d00::/34", "9808"}, - {"2409:8915:7800::/39", "56044"}, - {"2804:7068::/32", "270725"}, - {"2a07:ab40::/48", "51172"}, - {"2801:80:c30::/48", "61721"}, - {"2a0d:5642:112::/48", "35487"}, - {"2001:67c:17c4::/48", "3301"}, - {"240a:a2a4::/32", "143326"}, - {"2604:d0c0:ecc1::/46", "396871"}, - {"2804:90:4300::/35", "28580"}, - {"2a02:26f7:e7cc::/48", "36183"}, - {"2a06:7500::/29", "24786"}, - {"2001:559:832d::/48", "33491"}, - {"2001:19d0::/38", "2044"}, - {"2600:1408:c01::/38", "20940"}, - {"2a02:29e8::/32", "49604"}, - {"2001:500:60::/48", "30132"}, - {"2001:67c:2ee4::/48", "28773"}, - {"2408:8456:de40::/34", "17816"}, - {"240e:44d:6d80::/41", "4134"}, - {"2620:171:40::/46", "42"}, - {"2804:694:4900::/37", "262596"}, - {"2a0f:13c0::/29", "20473"}, - {"2001:dc4::/32", "23774"}, - {"2001:df2:a00::/48", "38760"}, - {"2402:a00:4a::/45", "45916"}, - {"2404:8ec0:afb0::/33", "135780"}, - {"2803:9800:a907::/35", "11664"}, - {"2a0e:1c80:14::/47", "1299"}, - {"2001:fd8:b380::/42", "132199"}, - {"2804:80b0::/32", "271767"}, - {"2a00:1a78::/32", "41729"}, - {"2804:57d0::/32", "268088"}, - {"2001:559:322::/48", "7922"}, - {"2602:fd2e::/36", "174"}, - {"2001:1248:55c6::/44", "11172"}, - {"2001:44b8:2039::/45", "4739"}, - {"2402:800:33ee::/37", "7552"}, - {"2a01:8300::/32", "20681"}, - {"2a02:26f7:fa44::/48", "36183"}, - {"2a05:cec0::/29", "47487"}, - {"2402:800:31c5::/43", "7552"}, - {"2a12:4946:1655::/48", "211398"}, - {"2001:44b8:308d::/46", "4739"}, - {"2408:8756::/36", "17622"}, - {"240a:a585::/32", "144063"}, - {"2a00:f826:11::/48", "62874"}, - {"240a:a5fa::/32", "144180"}, - {"240a:a90c::/32", "144966"}, - {"240a:afe6::/32", "146720"}, - {"2800:430:c100::/35", "23487"}, - {"2a06:4b40::/29", "197328"}, - {"2001:48e8:1000::/40", "1249"}, - {"2402:800:9747::/43", "7552"}, - {"2800:160:1a33::/44", "14259"}, - {"2001:df7:7e80::/48", "135959"}, - {"2607:5980::/32", "393573"}, - {"2806:2f0:9480::/42", "17072"}, - {"2a02:26f7:d504::/48", "36183"}, - {"2405:600::/46", "55805"}, - {"2408:8260::/32", "4837"}, - {"2605:a404:5a7::/41", "33363"}, - {"2a02:26f7:f711::/42", "20940"}, - {"2a02:26f7:f741::/46", "20940"}, - {"2001:559:c463::/48", "33650"}, - {"2401:4900:1ce0::/47", "24560"}, - {"2404:d9c0::/32", "134022"}, - {"2001:df7:cd80::/47", "147304"}, - {"2001:4878:225::/48", "12222"}, - {"2603:fd08::/26", "397165"}, - {"2001:559:8363::/48", "33657"}, - {"2001:df0:eb80::/48", "138529"}, - {"2405:b000:a00::/37", "6262"}, - {"2602:fe6a::/40", "54632"}, - {"2800:bf0:92::/47", "27947"}, - {"2804:14d:a08a::/41", "28573"}, - {"2409:8b20::/29", "9808"}, - {"240e:980:8700::/40", "4134"}, - {"2a01:3e0:402::/48", "34164"}, - {"2a06:e540::/47", "203600"}, - {"2600:5c01:1a2::/48", "11955"}, - {"2a05:3340::/42", "134433"}, - {"2001:579:1924::/44", "22773"}, - {"2001:67c:10b4::/48", "34891"}, - {"2408:8256:3b75::/48", "17816"}, - {"2607:f428:91f0::/38", "20115"}, - {"2607:f470::/32", "55"}, - {"2620:101:9000::/48", "40934"}, - {"2001:559:c42d::/48", "7922"}, - {"2001:67c:2f4c::/48", "59729"}, - {"2001:da8:7014::/48", "24363"}, - {"2407:8c00:90::/42", "55441"}, - {"2603:8033::/32", "20001"}, - {"2804:214:8420::/43", "26615"}, - {"2a02:1390:4000::/40", "21351"}, - {"2a02:26f7:db81::/46", "20940"}, - {"2001:fd8:e0::/48", "132199"}, - {"2402:800:9147::/43", "7552"}, - {"240e:3b7:7600::/39", "140313"}, - {"240a:a3d0::/32", "143626"}, - {"240a:a917::/32", "144977"}, - {"2606:2800:4aec::/46", "15133"}, - {"2a0d:7080::/29", "200322"}, - {"2407:8a80::/32", "134437"}, - {"240a:a5d9::/32", "144147"}, - {"2001:df6:2200::/48", "135908"}, - {"2408:8456:3c50::/38", "17816"}, - {"2408:8957:4500::/40", "17816"}, - {"2409:8b03::/32", "9808"}, - {"240a:a272::/32", "143276"}, - {"2606:2800:4a48::/46", "15133"}, - {"2804:63d0::/32", "269385"}, - {"2402:8100:14::/47", "38266"}, - {"2405:800:4::/44", "7545"}, - {"2408:8459:b410::/42", "17623"}, - {"240a:a66d::/32", "144295"}, - {"2605:dd40:8215::/42", "398549"}, - {"2a02:26f7:e285::/42", "20940"}, - {"2001:6a0:4000::/34", "8890"}, - {"240e:108:1171::/46", "139201"}, - {"2a02:26f7:d748::/48", "36183"}, - {"2a02:6ea0:ec00::/39", "60068"}, - {"2408:8956:4a00::/40", "17622"}, - {"2800:160:148e::/43", "14259"}, - {"2804:7034::/34", "270712"}, - {"2806:2f0:4503::/42", "17072"}, - {"2a01:280:358::/48", "207448"}, - {"2602:fe6b:1013::/36", "398646"}, - {"2620:123:4000::/40", "22990"}, - {"2804:df4:9001::/33", "52531"}, - {"2804:5c50::/32", "268901"}, - {"2a02:2aa8:310::/32", "702"}, - {"240e:3b7:7a00::/32", "140313"}, - {"2001:bf7:1321::/48", "213106"}, - {"2001:c20:800::/34", "3758"}, - {"2001:dce:5301::/34", "23869"}, - {"2403:100:2000::/48", "56300"}, - {"2409:8904:4960::/38", "24547"}, - {"240a:adc4::/32", "146174"}, - {"2806:230:4005::/48", "11888"}, - {"2a05:2e00::/32", "49460"}, - {"2001:559:c493::/48", "33660"}, - {"2404:4a00:8500::/64", "55423"}, - {"2a0e:8f00:f100::/47", "49933"}, - {"2a0f:6c40::/29", "34615"}, - {"2600:6c38:212::/45", "20115"}, - {"2604:7300::/32", "393227"}, - {"2a02:26f7:c70c::/48", "36183"}, - {"2401:0:6f00::/40", "58470"}, - {"2402:800:528d::/43", "7552"}, - {"2401:d800:2d30::/41", "7552"}, - {"2408:8256:2f76::/48", "17816"}, - {"240e:49:9400::/30", "4134"}, - {"2600:1002:d020::/34", "22394"}, - {"2602:feda:f020::/48", "147173"}, - {"2604:f980:6800::/40", "19957"}, - {"2a02:6680:2166::/48", "16116"}, - {"2001:df0:8c0::/48", "149005"}, - {"2403:df40::/43", "14630"}, - {"240c:c0a9:1100::/40", "23910"}, - {"2600:6c34:4e::/48", "33588"}, - {"2803:97c0::/32", "265770"}, - {"2804:6764::/32", "269625"}, - {"2a02:26f7:e049::/46", "20940"}, - {"2c0f:f4a8::/34", "37254"}, - {"2001:559:85e2::/48", "33659"}, - {"2400:8500:7000::/36", "58791"}, - {"2409:8959:ca44::/43", "9808"}, - {"2800:160:1994::/44", "14259"}, - {"240a:a0f8::/32", "142898"}, - {"2606:db00::/32", "393398"}, - {"2400:3aa0::/32", "7676"}, - {"2001:4830:c0d0::/42", "27552"}, - {"2402:5100:6::/32", "9902"}, - {"2404:bf40:82c1::/39", "139084"}, - {"2409:8915:5a00::/39", "56044"}, - {"2600:1417:a001::/36", "20940"}, - {"2600:6c10:f286::/47", "20115"}, - {"2804:20a0::/32", "264502"}, - {"2806:103e:5::/46", "8151"}, - {"2a02:26f7:f705::/46", "20940"}, - {"2a0d:9d40::/29", "48704"}, - {"2400:a980:d4::/47", "133111"}, - {"240a:a7ba::/32", "144628"}, - {"2600:1480:d001::/37", "20940"}, - {"2602:10d:9000::/30", "20115"}, - {"2607:6f00::/32", "394111"}, - {"2a02:b48:8115::/36", "39572"}, - {"2a06:5500::/29", "204232"}, - {"2405:7d00::/32", "23777"}, - {"2610:e0:a050::/36", "2572"}, - {"2a00:ce80::/46", "50535"}, - {"240a:aa08::/32", "145218"}, - {"2001:559:a0::/48", "7016"}, - {"2401:d800:ddb0::/41", "7552"}, - {"2406:e000:393::/36", "23655"}, - {"2409:8914:4000::/39", "56044"}, - {"240e:45c:6900::/40", "140531"}, - {"2403:9800:b041::/48", "202818"}, - {"2804:2f8::/32", "28188"}, - {"2804:b18::/40", "52941"}, - {"2804:1028::/32", "263622"}, - {"2a0e:46c3:100::/40", "204982"}, - {"2001:559:8558::/48", "33490"}, - {"2600:140f:1c01::/38", "20940"}, - {"2a02:26f7:f6e4::/48", "36183"}, - {"2001:df4:b880::/48", "17823"}, - {"2001:43f8:900::/48", "327935"}, - {"2402:5300:2310::/33", "45903"}, - {"2409:8055:3014::/46", "56040"}, - {"240e:397:2400::/38", "140497"}, - {"2600:1016:b130::/40", "6167"}, - {"2607:f2d8:43::/33", "18450"}, - {"2a00:93c0::/32", "198853"}, - {"2a04:4ac0::/29", "200844"}, - {"2a09:4e07:e000::/35", "210625"}, - {"2001:67c:13e4::/48", "51410"}, - {"2001:1250:e600::/44", "22894"}, - {"240a:af1a::/32", "146516"}, - {"2a01:45c0::/32", "58208"}, - {"2402:800:5a9b::/42", "7552"}, - {"2408:8957:dc00::/40", "17622"}, - {"2409:8014:80a::/35", "56044"}, - {"240e:58::/32", "4812"}, - {"2a05:1500:300::/40", "202861"}, - {"2a09:6340::/44", "42721"}, - {"2a0c:1d01::/30", "39614"}, - {"2a0c:9a40:8210::/48", "210445"}, - {"2001:559:3d1::/48", "7922"}, - {"2001:559:c530::/48", "33491"}, - {"2403:71c0:3000::/48", "43959"}, - {"2620:12b:d000::/46", "35873"}, - {"2800:160:1e2d::/43", "14259"}, - {"2804:6c5c::/32", "270463"}, - {"2806::/29", "6503"}, - {"2404:5540:401::/32", "134715"}, - {"2605:73c0::/35", "10583"}, - {"2605:dd40:8101::/43", "398549"}, - {"2804:36d0::/32", "266374"}, - {"2804:75b0::/34", "271063"}, - {"2a05:d050:1080::/44", "16509"}, - {"2001:1670::/32", "28885"}, - {"2408:8957:5400::/40", "17622"}, - {"2604:c980::/32", "54203"}, - {"2a03:93e0:2000::/32", "203228"}, - {"2a04:2880::/48", "12684"}, - {"2a0d:140::/35", "209014"}, - {"2001:250:140d::/42", "24354"}, - {"2405:da00:400::/32", "38235"}, - {"240e:982:7400::/36", "4134"}, - {"2804:4160::/32", "267429"}, - {"2001:4490:37fc::/36", "9829"}, - {"2401:8a40:24::/46", "45326"}, - {"2408:8406:6c00::/39", "4808"}, - {"240a:a9a3::/32", "145117"}, - {"2600:1417:d000::/48", "35819"}, - {"2806:230:4028::/48", "265594"}, - {"2a03:4b80::/32", "21246"}, - {"240e:1c:5000::/36", "134771"}, - {"2804:1bf0:f::/32", "61758"}, - {"2604:8740::/32", "19575"}, - {"2001:4b20:1000:2514::/64", "65505"}, - {"2605:3800::/32", "21554"}, - {"2804:6868::/32", "269690"}, - {"2804:68b4:8000::/34", "269710"}, - {"2806:2f0:6281::/46", "17072"}, - {"2001:44b8:30ec::/48", "4739"}, - {"240a:a439::/32", "143731"}, - {"2804:25a4::/32", "52821"}, - {"2401:3480:3000::/36", "58466"}, - {"2402:800:5955::/42", "7552"}, - {"2403:8700::/32", "132232"}, - {"2a04:c700::/48", "34499"}, - {"2401:3140::/48", "55482"}, - {"2404:1c40:4::/48", "24432"}, - {"2409:8753:300::/37", "56047"}, - {"240a:ab61::/32", "145563"}, - {"2804:12b0::/32", "263492"}, - {"2a00:1580:3::/30", "39010"}, - {"2a02:2ad0:243::/45", "702"}, - {"2a04:2dc0:e::/47", "39216"}, - {"2a05:e100::/48", "6830"}, - {"2a09:1680::/48", "209811"}, - {"2607:f868::/34", "20141"}, - {"2620:1b4:ffff::/48", "16401"}, - {"2620:1e0:300::/48", "10801"}, - {"2804:5174::/32", "268453"}, - {"2806:2f0:7043::/42", "17072"}, - {"2a00:4802:390::/44", "8717"}, - {"2a0b:3c40:1::/48", "208258"}, - {"2401:4900:63e0::/37", "45609"}, - {"2600:1404:1001::/37", "20940"}, - {"2607:4280::/32", "36730"}, - {"2801:80:3e70::/47", "271541"}, - {"2a0a:e805:100::/40", "64476"}, - {"2400:ea00:c010::/48", "23884"}, - {"2402:7040::/32", "63704"}, - {"2405:6100::/32", "3462"}, - {"240a:afe3::/32", "146717"}, - {"2801:18:c000::/48", "263186"}, - {"2001:559:7a2::/48", "33659"}, - {"2001:1250:e400::/44", "22894"}, - {"2001:16a2:c300::/44", "39891"}, - {"2001:4478:1500::/40", "4739"}, - {"2401:4900:5760::/43", "45609"}, - {"2403:8400::/48", "17917"}, - {"2409:8030:2900::/38", "9808"}, - {"2605:5e40::/48", "397810"}, - {"2c0f:f850::/39", "327979"}, - {"2001:500:31::/48", "393220"}, - {"2001:559:8461::/48", "33650"}, - {"2405:84c0:ff3e::/48", "139782"}, - {"2408:8459:6010::/42", "17623"}, - {"2a04:4e40:3e00::/48", "54113"}, - {"2a10:8080::/29", "62270"}, - {"2001:4b98:dc7::/32", "29169"}, - {"2401:d800:9f02::/42", "7552"}, - {"2605:a404:8de::/39", "33363"}, - {"2a01:c50f:2380::/36", "12479"}, - {"2a0a:9300:1::/48", "207569"}, - {"2409:8948:9000::/40", "24445"}, - {"240a:ae2a::/32", "146276"}, - {"2806:2f0:9c63::/40", "17072"}, - {"2a03:6085::/30", "16285"}, - {"2600:370f:6063::/45", "32261"}, - {"2804:1354::/33", "52892"}, - {"2600:1002:a110::/36", "22394"}, - {"2600:1419:4001::/38", "20940"}, - {"2606:2800:4280::/48", "15133"}, - {"2620:68:6000::/48", "397321"}, - {"2a00:1468::/48", "35810"}, - {"2a03:8180:1f00::/34", "36351"}, - {"2a07:5340::/29", "62177"}, - {"2602:fff6:d::/48", "30475"}, - {"2803:480::/45", "52458"}, - {"2a02:f9c0::/29", "61231"}, - {"240a:aaec::/32", "145446"}, - {"2600:804:440::/48", "396941"}, - {"2606:1a00::/32", "18973"}, - {"2a02:26f7:d4cd::/46", "20940"}, - {"2403:2c80::/31", "9312"}, - {"2604:ca00:176::/40", "36492"}, - {"2620:101:80fb::/48", "395606"}, - {"2804:cb0:d306::/47", "52742"}, - {"2001:1388:8a45::/48", "6147"}, - {"2001:13c7:6015::/48", "61441"}, - {"2001:49f0:d10e::/47", "30058"}, - {"2408:8956:1940::/40", "17816"}, - {"240a:ac51::/32", "145803"}, - {"240e:983:800::/40", "4134"}, - {"2600:1404:b001::/37", "20940"}, - {"2a02:26f7:c300::/48", "36183"}, - {"2001:470::/42", "6939"}, - {"240a:a1f4::/32", "143150"}, - {"2001:550:7707::/48", "174"}, - {"240e:44d:480::/41", "4134"}, - {"2a05:2a40::/48", "201411"}, - {"2602:ff83::/36", "29948"}, - {"2801:1b:4800::/48", "269844"}, - {"2404:0:10a5::/46", "17709"}, - {"2409:8b7f::/21", "9808"}, - {"2001:1998:9::/39", "7843"}, - {"2404:bd00::/44", "58678"}, - {"2803:4ce0::/32", "269905"}, - {"2804:350c::/32", "265497"}, - {"2a00:1678:dea1::/48", "49453"}, - {"2a02:2c40::/32", "2611"}, - {"2a0b:6b86:401::/48", "207080"}, - {"2001:559:8115::/48", "33287"}, - {"2804:67e4::/32", "269657"}, - {"2804:7c50::/32", "271488"}, - {"2a0f:ee00::/47", "60781"}, - {"240a:a2cd::/32", "143367"}, - {"2806:109f:4::/47", "8151"}, - {"2001:df3:ba00::/48", "134808"}, - {"2001:4878:4164::/48", "12222"}, - {"2402:4600::/40", "45186"}, - {"2607:ae00::/32", "11468"}, - {"2a01:c50f:2a00::/37", "12479"}, - {"2a01:ce9d:1000::/30", "51964"}, - {"2800:160:13a1::/46", "14259"}, - {"2804:7060::/32", "270723"}, - {"2a04:4e42:fd4::/46", "54113"}, - {"2001:470:90::/48", "36225"}, - {"2409:8028:3900::/29", "9808"}, - {"2409:891e::/31", "24400"}, - {"2600:1413:8001::/35", "20940"}, - {"2a0c:2600::/29", "205010"}, - {"2403:2600::/32", "24538"}, - {"2607:eb00::/32", "53486"}, - {"2001:1248:a4c5::/46", "11172"}, - {"2401:d800:9080::/42", "7552"}, - {"2400:a980:30f6::/44", "133513"}, - {"2607:ffd0:704::/36", "26994"}, - {"2620:13:4000::/48", "16652"}, - {"2a01:358:101a::/34", "9121"}, - {"2a0e:be80::/29", "25793"}, - {"2603:b0ae::/32", "53849"}, - {"2620:f5:8000::/48", "22388"}, - {"2803:5fe0::/32", "271785"}, - {"2804:406c::/32", "265958"}, - {"2a02:ee80:41ca::/47", "21433"}, - {"2a03:d9c0:c0de::/48", "3214"}, - {"2a04:9a03:1010::/44", "48037"}, - {"2403:1300:3000::/32", "56286"}, - {"2600:6c38:34b::/42", "20115"}, - {"2804:4fdc::/32", "268354"}, - {"240a:a620::/32", "144218"}, - {"2604:d180::/32", "46573"}, - {"2804:14c:7984::/47", "28573"}, - {"2a01:7d20:700::/40", "203645"}, - {"2a02:26f7:da41::/46", "20940"}, - {"2a03:2b80::/29", "33883"}, - {"2001:1900:236a::/48", "202818"}, - {"2001:44b8:4062::/48", "7545"}, - {"2409:8050:1000::/47", "56047"}, - {"2600:9000:2208::/47", "16509"}, - {"2a0e:b107:1596::/48", "142598"}, - {"2001:559:c32a::/48", "33657"}, - {"2400:7400:e012::/48", "38044"}, - {"2404:c8::/47", "10217"}, - {"2404:8d02::/35", "9587"}, - {"2405:1200::/29", "9824"}, - {"2409:8020:1021::/43", "56046"}, - {"2600:6c44::/32", "20115"}, - {"2607:f7c8:401::/38", "36221"}, - {"2803:8220::/32", "27843"}, - {"2804:5c88::/35", "268914"}, - {"2804:76d8::/32", "271138"}, - {"2a10:fa80:10::/48", "57050"}, - {"2c0f:e970::/32", "327750"}, - {"2401:4900:5130::/44", "45609"}, - {"2a02:2339:4000::/34", "48854"}, - {"2001:559:85ab::/48", "33657"}, - {"2001:16a2:bc00::/38", "39386"}, - {"2403:2d40::/32", "64018"}, - {"2600:6c38:33f::/41", "20115"}, - {"2804:4694::/32", "266998"}, - {"2a0a:9741::/32", "61964"}, - {"2001:559:c324::/48", "33652"}, - {"2001:fd8:2a1::/46", "4775"}, - {"2604:6600:1c7::/38", "40676"}, - {"2a0b:6f80:100::/46", "211196"}, - {"2a0c:2fc0::/29", "50598"}, - {"2001:559:84fb::/48", "33668"}, - {"2001:df1:9680::/48", "135989"}, - {"2600:6c21:a1a::/29", "20115"}, - {"2804:57fc::/32", "268099"}, - {"2804:6984::/32", "270275"}, - {"2a00:79e1:f15::/44", "36384"}, - {"2a03:52e0::/29", "206182"}, - {"2a06:a001:a070::/44", "212085"}, - {"2a0d:2581:14::/48", "209261"}, - {"2409:8050:100::/37", "9808"}, - {"240e:3b9:c000::/37", "140315"}, - {"2a0b:a340::/32", "205934"}, - {"240a:a22b::/32", "143205"}, - {"240a:a903::/32", "144957"}, - {"2620:135:4001::/44", "393891"}, - {"2803:2b80::/32", "263730"}, - {"2001:559:49d::/48", "7922"}, - {"2800:160:19eb::/43", "14259"}, - {"2806:263:9300::/37", "13999"}, - {"2a0c:69c0::/32", "202312"}, - {"2a0d:b201:f040::/42", "206026"}, - {"2409:8055:3019::/48", "56040"}, - {"240e:44d:3e00::/41", "140345"}, - {"2803:9000::/32", "262194"}, - {"2001:559:c271::/48", "13367"}, - {"2804:2b30::/32", "262741"}, - {"2804:85c4::/32", "272599"}, - {"2a02:26f7:7::/48", "20940"}, - {"2001:da8:900e::/43", "24369"}, - {"2401:d800:b1b0::/41", "7552"}, - {"2402:8100:31d0::/47", "45271"}, - {"2408:8456:ae10::/42", "134543"}, - {"2606:4d00::/32", "53893"}, - {"2804:5bbc::/32", "268866"}, - {"2806:2f0:314::/44", "17072"}, - {"2a09:98c0::/48", "50007"}, - {"2001:4998:efeb::/48", "36646"}, - {"2404:7c00:10::/42", "141177"}, - {"240a:aaaa::/32", "145380"}, - {"2a02:680:8000::/36", "20539"}, - {"2a0d:d080::/29", "49054"}, - {"2001:559:84af::/48", "33657"}, - {"2400:9800:1c:5000::/33", "24203"}, - {"2400:dc00:4006::/48", "131111"}, - {"2402:800:349b::/41", "7552"}, - {"2403:4240::/32", "138029"}, - {"2406:24c0::/44", "136634"}, - {"2600:1405:c001::/35", "20940"}, - {"2409:8e1a::/32", "132525"}, - {"2a04:5a00::/29", "60316"}, - {"2400:9880::/32", "133333"}, - {"240a:a5a7::/32", "144097"}, - {"2603:b079::/24", "11796"}, - {"2604:880:52::/48", "396881"}, - {"2801:80:1950::/48", "264995"}, - {"2804:837c::/32", "272201"}, - {"2001:c00:4619::/32", "4618"}, - {"2402:e380:33c::/48", "7489"}, - {"240e:983:203::/48", "17799"}, - {"2600:1417:6001::/36", "20940"}, - {"2603:c001:2010::/37", "31898"}, - {"2a00:1d38:fb::/32", "50655"}, - {"2a06:2e00::/29", "28920"}, - {"2001:44b8:25::/48", "4739"}, - {"2409:805f:2100::/35", "9808"}, - {"2607:9b80:a00::/43", "46558"}, - {"2a0e:97c0:330::/48", "211481"}, - {"2001:559:826a::/48", "13367"}, - {"2001:da8:222::/48", "24348"}, - {"2001:448a:2012::/42", "7713"}, - {"2001:4d10::/32", "16030"}, - {"2401:d800:5da0::/41", "7552"}, - {"2402:800:5463::/43", "7552"}, - {"2a12:5b80::/32", "210460"}, - {"2001:4320::/32", "28683"}, - {"2405:7bc0::/48", "45538"}, - {"2409:8087:5801::/48", "9808"}, - {"2620:149:1170::/38", "714"}, - {"2001:559:c184::/47", "7922"}, - {"2001:1248:55aa::/43", "11172"}, - {"2606:4280::/36", "16696"}, - {"2804:55a8::/32", "267948"}, - {"2804:7ecc::/32", "271648"}, - {"2001:559:c0e9::/48", "7016"}, - {"2001:559:c4e0::/48", "7015"}, - {"240a:a70b::/32", "144453"}, - {"2605:ef80:8000::/44", "36492"}, - {"2803:c800:c000::/34", "23243"}, - {"2804:2304::/32", "264137"}, - {"2a03:6947:1d00::/40", "61266"}, - {"2a04:9a00:104a::/45", "212157"}, - {"2401:b8c0:10::/32", "64074"}, - {"2408:84f3:4a10::/42", "134543"}, - {"2a02:b50:4000::/43", "30282"}, - {"2001:df2:6a80::/48", "55664"}, - {"2404:e100:4000::/47", "55685"}, - {"2804:6ce0::/47", "270498"}, - {"2001:678:6c::/48", "199670"}, - {"2401:d800:5910::/42", "7552"}, - {"2803:7300::/32", "262150"}, - {"2a02:26f7:c390::/48", "36183"}, - {"2a0c:9a40:8084::/48", "13830"}, - {"2408:8459:9810::/42", "17623"}, - {"2804:145c:8f90::/41", "263327"}, - {"2001:470:ee::/48", "62538"}, - {"2800:160:172f::/43", "14259"}, - {"2001:67c:2bfc::/48", "210317"}, - {"240a:a025::/32", "142687"}, - {"2605:dd40:8211::/46", "398549"}, - {"2606:cd00::/47", "40845"}, - {"2803:c200:100::/44", "22411"}, - {"2804:19f0::/32", "22092"}, - {"2804:60b4::/32", "269185"}, - {"2a07:1340::/29", "34907"}, - {"2001:559:c2bc::/48", "33662"}, - {"2001:dc0:e000::/35", "4608"}, - {"2401:d800::/43", "7552"}, - {"2404:a800:1452::/38", "9498"}, - {"2404:f4c0:ff0f::/48", "139247"}, - {"2408:8459:6630::/41", "17622"}, - {"2605:9d80:8031::/48", "4134"}, - {"2606:ed00:4::/48", "40244"}, - {"2a0b:c600::/29", "51344"}, - {"2c0f:f7a8:8211::/48", "4134"}, - {"2001:67c:2e14::/48", "200986"}, - {"240a:a5c7::/32", "144129"}, - {"2a01:b740:a27::/41", "714"}, - {"2001:67c:2ab8::/48", "3301"}, - {"240a:aa1e::/32", "145240"}, - {"2800:130::/32", "27820"}, - {"2a03:d400:25::/39", "198913"}, - {"2001:fd0:3301::/37", "10029"}, - {"240a:a948::/32", "145026"}, - {"2603:c010:2000::/36", "31898"}, - {"2804:6ba4::/32", "270414"}, - {"2a02:2970::/32", "43847"}, - {"2401:c100::/32", "45634"}, - {"2409:896a:6b00::/35", "9808"}, - {"2620:123:2081::/46", "30103"}, - {"2402:800:53d3::/44", "7552"}, - {"2408:8000:1000::/39", "4808"}, - {"2800:bf0:b1::/48", "52257"}, - {"2803:b780:11::/42", "27742"}, - {"2804:14d:ea00::/40", "28573"}, - {"2804:8630::/32", "272627"}, - {"2a02:26f7:ed40::/48", "36183"}, - {"240a:a25a::/32", "143252"}, - {"240a:af15::/32", "146511"}, - {"2a0c:acc0::/29", "13739"}, - {"2401:d800:9cd0::/42", "7552"}, - {"2409:8000:1800::/40", "56048"}, - {"2806:2f0:8083::/43", "17072"}, - {"2a02:26f7:d1c4::/48", "36183"}, - {"2a02:26f7:de89::/46", "20940"}, - {"2001:559:c09d::/48", "33651"}, - {"2401:2000::/33", "4608"}, - {"2607:f3f8:3000::/33", "17378"}, - {"2001:780::/33", "12337"}, - {"240e:67d:c600::/34", "4134"}, - {"2602:806:a000::/48", "398565"}, - {"2a00:e740::/32", "21472"}, - {"2001:559:c2f2::/48", "33651"}, - {"240a:a4a5::/32", "143839"}, - {"2604:a280::/32", "35911"}, - {"2a0f:ca87:b::/48", "210335"}, - {"2604:eb80::/32", "22418"}, - {"2804:14c:f425::/46", "28573"}, - {"2a01:7d8::/47", "34744"}, - {"2001:4de0:1000::/48", "33438"}, - {"2400:6280:109::/48", "132280"}, - {"2405:58c0:4400::/40", "133101"}, - {"2406:bec0::/32", "138734"}, - {"240e:3ba:f100::/37", "134775"}, - {"2620:100:6060::/40", "19679"}, - {"240a:a6d9::/32", "144403"}, - {"2607:1700::/32", "36454"}, - {"2804:6afc::/32", "270370"}, - {"2001:44b8:4048::/48", "7545"}, - {"2a01:7b40::/32", "47347"}, - {"240a:aa70::/32", "145322"}, - {"2600:1402:a801::/35", "20940"}, - {"2804:77c4:8000::/36", "271198"}, - {"2a0b:cc0::/32", "51131"}, - {"2001:250:600b::/48", "24364"}, - {"2001:559:848f::/43", "7922"}, - {"2001:d98::/32", "18106"}, - {"2001:e68:2001:1::/64", "65530"}, - {"2404:4a00:4:1::/36", "45629"}, - {"2607:2a80::/32", "31849"}, - {"2a02:6c20:7::/48", "211085"}, - {"2a07:1800::/29", "51560"}, - {"2c0f:f2a0:7::/32", "327849"}, - {"2400:dcc0:a104::/38", "38631"}, - {"2605:3dc0:1002::/48", "397952"}, - {"2803:7200:7::/43", "27696"}, - {"240e:45c:a900::/40", "140535"}, - {"2602:feda:d30::/44", "212292"}, - {"2a02:1c8:100::/40", "24955"}, - {"2a0b:9401::/32", "209505"}, - {"2a0e:b107:5c8::/48", "1239"}, - {"2001:1900:3007::/44", "3356"}, - {"2402:800:f0b0::/41", "7552"}, - {"240a:af56::/32", "146576"}, - {"2602:803:7000::/44", "399214"}, - {"2804:297c:cf81::/34", "262907"}, - {"2001:16a2:34::/46", "25019"}, - {"2400:cb00:373::/45", "13335"}, - {"2408:8256:399f::/38", "17816"}, - {"2600:9000:21ea::/43", "16509"}, - {"2603:c002:b30::/37", "31898"}, - {"2804:5dfc::/32", "52972"}, - {"2a00:6c40::/32", "9103"}, - {"2001:559:50::/47", "7922"}, - {"2001:559:8078::/47", "7015"}, - {"2001:df7:3700::/48", "138456"}, - {"2001:44b8:4050::/48", "7545"}, - {"2409:8753:900::/38", "56047"}, - {"2409:8924:3700::/36", "56046"}, - {"2a0c:6d00:61::/48", "3218"}, - {"2001:559:c067::/44", "33491"}, - {"240a:a038::/32", "142706"}, - {"2602:fcc5::/48", "207722"}, - {"2605:4400:5::/48", "8001"}, - {"2804:6be0::/32", "270431"}, - {"2a06:200::/29", "200770"}, - {"2001:678:488::/48", "206335"}, - {"2401:d800:b820::/41", "7552"}, - {"2600:80c:1600::/32", "701"}, - {"2602:ffc5:200::/48", "20473"}, - {"2604:4a00::/32", "393885"}, - {"2607:fc48:1410::/48", "40009"}, - {"2a04:9140:3001::/48", "196670"}, - {"2a0a:d540::/32", "207322"}, - {"2001:da8:103b::/48", "23910"}, - {"2001:da8:a01e::/42", "24352"}, - {"2404:6080::/32", "135415"}, - {"2806:2f0:9ea1::/41", "17072"}, - {"2001:468:1b00::/37", "11537"}, - {"2404:bf40:83c4::/37", "139084"}, - {"2a00:f10::/39", "48635"}, - {"2a02:2ad0:250::/37", "702"}, - {"2620:4d:e000::/48", "13367"}, - {"2a0b:8400:1::/48", "43350"}, - {"2c0f:5a00::/48", "327996"}, - {"2620:13c:b000::/44", "18531"}, - {"2804:3e0::/32", "262403"}, - {"240a:adc5::/32", "146175"}, - {"2600:14a0:100::/48", "16625"}, - {"2600:6c34:3a1::/48", "33588"}, - {"2605:9c0::/48", "6233"}, - {"2606:b080::/32", "55140"}, - {"2804:269c:fe10::/46", "47065"}, - {"2a01:a500::/47", "42831"}, - {"2a10:7d00:ffff::/29", "399975"}, - {"2001:df4:1500::/48", "138995"}, - {"2001:df6:ea80::/48", "135876"}, - {"2001:13f0::/32", "28118"}, - {"2001:4da8::/32", "28824"}, - {"2402:800:3b7f::/40", "7552"}, - {"2804:3f00::/32", "52643"}, - {"2a00:16b0::/32", "33837"}, - {"2c0f:f748:103::/32", "37662"}, - {"2001:559:c06e::/47", "7015"}, - {"2804:7b84::/32", "271436"}, - {"2001:520:1039::/48", "8103"}, - {"2408:8456:8640::/39", "17816"}, - {"2607:2680::/32", "394969"}, - {"2a00:14f0::/32", "29017"}, - {"2402:f880::/32", "64056"}, - {"2804:3ecc::/32", "266621"}, - {"2806:370:80d0::/44", "28403"}, - {"2a02:2e0::/38", "12306"}, - {"2a02:26f7:b990::/48", "36183"}, - {"2a02:2ab0::/38", "702"}, - {"2a03:4760::/32", "201457"}, - {"2a03:17e0::/32", "15623"}, - {"2001:559:c446::/44", "33657"}, - {"2001:678:e68::/48", "212567"}, - {"2401:4900:5170::/44", "45609"}, - {"240e:67a:c400::/39", "140330"}, - {"2a01:b740:1341::/36", "714"}, - {"2a02:8100::/27", "3209"}, - {"2a03:9880::/32", "24817"}, - {"2a0a:8c46::/32", "15626"}, - {"2a10:2ec6::/32", "210625"}, - {"2001:598:1301::/32", "21548"}, - {"2a02:26f7:f380::/48", "36183"}, - {"2a04:4e41:12::/45", "54113"}, - {"2001:4408:4510::/36", "4758"}, - {"2407:b000::/33", "17819"}, - {"2804:126c::/32", "263476"}, - {"2001:559:81fa::/48", "33652"}, - {"2001:df7:c680::/48", "137165"}, - {"240a:a615::/32", "144207"}, - {"2804:485c::/33", "267116"}, - {"2806:2f0:4263::/40", "17072"}, - {"2a0e:46c6::/40", "207968"}, - {"2a0e:9780::/29", "39305"}, - {"240a:a511::/32", "143947"}, - {"240a:ab98::/32", "145618"}, - {"2804:7750::/32", "271170"}, - {"2a02:1328:2::/48", "31059"}, - {"2a02:50c0:e0::/32", "29355"}, - {"2605:a404:af8::/39", "33363"}, - {"2803:d560::/32", "269761"}, - {"2a02:4c8:b0::/32", "9070"}, - {"2a02:2330:b2::/48", "34073"}, - {"2401:b200:7::/44", "24186"}, - {"2600:140f:d000::/48", "9498"}, - {"2620:138:30fe::/48", "23344"}, - {"2804:14c:bd87::/41", "28573"}, - {"2001:559:824b::/48", "21508"}, - {"2400:6280:11e::/48", "132280"}, - {"2800:160:119a::/42", "14259"}, - {"2804:75ec::/32", "271078"}, - {"2a02:26f0:3600::/48", "34164"}, - {"2a0a:86c0::/44", "206163"}, - {"2408:84f3:bc10::/42", "134543"}, - {"2620:124:b002::/48", "394731"}, - {"2800:800:a32::/41", "26611"}, - {"2001:1900:2214::/48", "10753"}, - {"2001:19f8:211::/48", "26402"}, - {"2404:b300:1::/46", "131207"}, - {"2610:130::/40", "6122"}, - {"2a01:618:8300::/33", "8683"}, - {"2001:df0:26b::/48", "58505"}, - {"2401:80c0::/32", "135191"}, - {"2407:9240:2400::/40", "141173"}, - {"2409:8f54::/24", "9808"}, - {"2a0a:54c3::/29", "62240"}, - {"2001:1318:1015::/32", "3597"}, - {"2405:201:a200::/37", "55836"}, - {"2600:9000:222b::/43", "16509"}, - {"2804:5068::/32", "268387"}, - {"2a01:7700::/32", "15372"}, - {"2a10:c940::/31", "35277"}, - {"2403:fbc0::/48", "23959"}, - {"2a03:6f81:8000::/30", "35676"}, - {"2a0e:37c0::/32", "29014"}, - {"2001:559:5cd::/48", "33657"}, - {"2001:559:c245::/46", "20214"}, - {"2402:9740::/32", "135023"}, - {"2408:8956:5600::/40", "17622"}, - {"2409:805c:5900::/38", "9808"}, - {"2600:1014:9010::/40", "22394"}, - {"2800:160:1022::/43", "14259"}, - {"2a09:5000::/29", "206189"}, - {"2001:48f8::/32", "11232"}, - {"2804:2144::/46", "52795"}, - {"2806:2f0:7141::/46", "17072"}, - {"2a02:478::/32", "30975"}, - {"240a:a355::/32", "143503"}, - {"2600:6c38:712::/45", "20115"}, - {"2804:2414::/32", "264200"}, - {"2a02:26f7:e009::/42", "20940"}, - {"2001:648:2c10::/48", "8762"}, - {"2001:44b8:6::/48", "4739"}, - {"2402:f500::/32", "63961"}, - {"2604:6d00:3000::/48", "36223"}, - {"2604:ab80:8::/48", "55079"}, - {"2801:0:2f0::/48", "28107"}, - {"2a02:2e02:8d90::/38", "12479"}, - {"2a03:4b40:5701::/34", "50710"}, - {"2a06:d700::/33", "43892"}, - {"2001:4878:c204::/48", "12222"}, - {"2804:1128:c100::/34", "263661"}, - {"2a03:7b80::/32", "198024"}, - {"2001:67c:2af0::/48", "201271"}, - {"2402:e80:24::/48", "23901"}, - {"2800:160:1c93::/44", "14259"}, - {"2803:9800:b8c7::/44", "11664"}, - {"2a00:4802:2f0::/44", "8717"}, - {"2a03:c980:b916::/48", "210079"}, - {"2620:137::/45", "396253"}, - {"2803:6310::/48", "272063"}, - {"2a03:f080:1801::/32", "42685"}, - {"2001:44b8:404e::/48", "7545"}, - {"2403:4e00::/38", "45528"}, - {"2408:8246:1200::/32", "4837"}, - {"2600:1400:2801::/32", "20940"}, - {"2a01:b740:a00::/48", "6185"}, - {"2001:559:8411::/48", "7016"}, - {"2001:559:c2b3::/48", "7015"}, - {"2403:a140:10::/48", "23724"}, - {"2602:fe10::/36", "394119"}, - {"2607:f6f0:1000::/48", "12085"}, - {"2620:49:8::/47", "16686"}, - {"2a0f:6580:104::/48", "200334"}, - {"2a0f:c340::/29", "34487"}, - {"2001:d10:840a::/35", "4787"}, - {"2607:f928::/47", "22645"}, - {"2620:18::/48", "21525"}, - {"2801:80:3ee0::/48", "272215"}, - {"2001:579:a1d4::/42", "22773"}, - {"2001:44b8:2065::/48", "4739"}, - {"2405:f5c0::/48", "135932"}, - {"2409:8078:100::/35", "9808"}, - {"240e:980::/35", "58519"}, - {"2600:1407:6801::/35", "20940"}, - {"2600:9000:f150::/48", "16509"}, - {"2804:1dac::/38", "264385"}, - {"2804:6ac8:105::/34", "270358"}, - {"240a:a296::/32", "143312"}, - {"2607:de00::/42", "23498"}, - {"2610:130:3402::/32", "6122"}, - {"2804:c6c:8105::/33", "52704"}, - {"2804:6a04:44::/32", "270306"}, - {"2a01:66a0::/32", "202208"}, - {"2001:418:1401:22::/63", "2914"}, - {"2001:418:4001:5::/45", "2914"}, - {"2401:dec0::/32", "137023"}, - {"2402:800:321d::/42", "7552"}, - {"240a:a60e::/32", "144200"}, - {"2600:1901:8100::/41", "396982"}, - {"2607:9b80:4000::/36", "46558"}, - {"2a02:88d:101::/40", "47794"}, - {"2a04:eec0::/29", "57795"}, - {"2a0d:abc0::/29", "208861"}, - {"2001:559:8436::/48", "33667"}, - {"2001:67c:2fe0::/48", "39381"}, - {"2001:fd8:a0::/48", "132199"}, - {"2404:fc00:76::/44", "45910"}, - {"240a:a8ff::/32", "144953"}, - {"2600:6c39:452::/45", "20115"}, - {"2602:fe12:20::/48", "62707"}, - {"2602:fe21::/36", "394304"}, - {"2605:a7c0::/43", "53766"}, - {"240a:adc0::/32", "146170"}, - {"2800:160:1553::/42", "14259"}, - {"2804:43c4::/32", "53095"}, - {"2a00:4802:a30::/41", "13124"}, - {"2a02:26f7:de09::/46", "20940"}, - {"2c0f:fd50::/32", "37187"}, - {"2001:df5:3600::/48", "56236"}, - {"2405:9800:c90f::/48", "45430"}, - {"2804:6450::/32", "269420"}, - {"2001:648:24a1::/39", "5408"}, - {"2400:adc7:2800::/39", "9541"}, - {"2400:cb00:279::/48", "13335"}, - {"2409:8c14:8a00::/35", "56044"}, - {"240a:a40b::/32", "143685"}, - {"240a:ac3e::/32", "145784"}, - {"2600:1419:1c01::/38", "20940"}, - {"2607:f7a8:600::/46", "46887"}, - {"2a01:498:8200::/37", "42018"}, - {"2a01:8d00::/31", "43070"}, - {"2a0d:3840::/48", "57629"}, - {"2001:559:86f6::/48", "33491"}, - {"2001:1248:8401::/44", "11172"}, - {"2804:56c::/39", "28210"}, - {"2804:59d8::/32", "268729"}, - {"2a02:26f7:cd84::/48", "36183"}, - {"2001:dc6::/32", "4622"}, - {"2001:43f8:20::/48", "36944"}, - {"2403:9800:6c00::/40", "4648"}, - {"2a0f:b502::/29", "206313"}, - {"2001:559:4a0::/48", "33657"}, - {"2001:559:723::/48", "7015"}, - {"2001:559:879a::/45", "7015"}, - {"2001:da8:d000::/44", "24359"}, - {"2407:adc0::/32", "142470"}, - {"2801:142::/40", "27951"}, - {"2a0e:6540:a48::/48", "208364"}, - {"2a0f:3107::/32", "57487"}, - {"2403:a2c0:128::/47", "131662"}, - {"2407:3e00:c000::/48", "24075"}, - {"2804:954:32::/41", "263073"}, - {"2804:fb4:2ffb::/32", "263599"}, - {"2a02:26f7:f6c8::/48", "36183"}, - {"2a03:d000:67fe::/47", "31205"}, - {"2a10:2a80:53a::/47", "207727"}, - {"2001:9e8:3a40::/32", "8881"}, - {"2404:1c00::/32", "55454"}, - {"2404:7180:a010::/48", "23848"}, - {"2a02:40e0::/32", "48364"}, - {"2a04:4e42:50::/42", "54113"}, - {"2001:500:126::/47", "396574"}, - {"2001:df7:4700::/48", "135957"}, - {"2607:f7e0::/32", "25660"}, - {"2804:5e08:280::/39", "269007"}, - {"2a00:ef60::/32", "12826"}, - {"2a07:bec0::/29", "201466"}, - {"2600:6c21:239::/46", "20115"}, - {"2804:1408:5100::/34", "28635"}, - {"2804:37f0:5900::/34", "266445"}, - {"2804:53b0:4011::/32", "268600"}, - {"2a01:5040:a100::/48", "43996"}, - {"2a0c:b641:4d0::/48", "210732"}, - {"2600:6c3a:61::/44", "20115"}, - {"2605:5fc0::/32", "397881"}, - {"2606:5e00::/35", "14576"}, - {"2606:6440::/32", "16504"}, - {"2804:188:aaab::/35", "262750"}, - {"2804:4758::/32", "267047"}, - {"2804:58b4::/32", "268145"}, - {"2001:559:5ac::/48", "33491"}, - {"2001:559:818a::/48", "7015"}, - {"2001:67c:2ed0::/48", "8767"}, - {"2600:6c10:148::/46", "20115"}, - {"2602:fc41:100::/40", "53667"}, - {"2607:fc50::/34", "36236"}, - {"2804:964:2701::/32", "263080"}, - {"2a0c:4a01:c10::/42", "134981"}, - {"2001:67c:1c0::/48", "25577"}, - {"2400:b200:4100::/46", "45102"}, - {"2409:8055:29::/45", "56040"}, - {"2803:4680::/32", "263222"}, - {"2a03:db05::/32", "28832"}, - {"2a0e:840::/29", "208663"}, - {"2405:8180:f00::/35", "135478"}, - {"240e:3b6:f700::/36", "4134"}, - {"2602:803:2000::/40", "11894"}, - {"2610:20:516a::/48", "5744"}, - {"2620:74:ee::/48", "7342"}, - {"2801:1ee::/48", "19429"}, - {"2803:9c0:4000::/32", "265695"}, - {"2806:266:480::/41", "13999"}, - {"240e:983:904::/40", "17638"}, - {"2804:2dc4::/32", "265302"}, - {"2a01:9840::/32", "31115"}, - {"2a0f:5382:acab::/48", "208135"}, - {"2404:c400:402::/47", "9328"}, - {"2406:dd40::/32", "141268"}, - {"2803:ea80::/36", "28048"}, - {"240e:97d:8000::/33", "4134"}, - {"2600:6c39:2a2::/37", "20115"}, - {"2606:f403::/32", "11776"}, - {"2a0d:5600:30::/47", "63473"}, - {"240a:abf1::/32", "145707"}, - {"2a00:4cc1::/32", "51691"}, - {"240a:ab4f::/32", "145545"}, - {"240a:ae24::/32", "146270"}, - {"240e:964:c400::/39", "133775"}, - {"2607:f6f0:2400::/39", "15830"}, - {"2610:b0:4108::/43", "3573"}, - {"2806:230:403e::/48", "265594"}, - {"2a0c:b641:26b::/45", "59598"}, - {"2a0f:a01:5::/32", "30633"}, - {"240a:ae9c::/32", "146390"}, - {"2602:ff1c:1::/48", "36351"}, - {"2804:1ed0::/35", "262286"}, - {"2806:2f0:93e1::/46", "17072"}, - {"2001:c20:48c9::/46", "3758"}, - {"2001:4878:4259::/48", "12222"}, - {"240c:ca16::/31", "23910"}, - {"240e:698::/35", "58519"}, - {"2804:2b3c::/32", "265142"}, - {"2806:370:1210::/44", "28403"}, - {"2001:1900:229c::/42", "3356"}, - {"2402:6800:7::/37", "22822"}, - {"2620:171:bc::/41", "715"}, - {"2001:559:8552::/48", "33651"}, - {"2001:15e8::/32", "24806"}, - {"2401:7e00::/32", "38355"}, - {"2a00:fe80::/32", "8585"}, - {"2a0c:dd40::/29", "42675"}, - {"240a:ad82::/32", "146108"}, - {"2001:67c:50::/48", "38970"}, - {"2404:de80::/39", "137443"}, - {"240e:44d:4c00::/42", "140345"}, - {"2801:17a:6::/44", "270105"}, - {"2a04:1dc0::/29", "41937"}, - {"2600:2a02::/31", "396319"}, - {"2600:e00f:4005::/44", "22995"}, - {"2604:d600:1404::/46", "32098"}, - {"2803:b310::/32", "271854"}, - {"2a02:26f0:c7::/44", "20940"}, - {"2001:559:c29d::/48", "33651"}, - {"2400:3dc0:701::/32", "134371"}, - {"2409:8904:8f90::/35", "24547"}, - {"2a0c:b641:660::/44", "210189"}, - {"2001:500:2c::/48", "12041"}, - {"240a:ad33::/32", "146029"}, - {"240e:983:1900::/48", "63838"}, - {"2605:a404:71::/45", "33363"}, - {"2607:ff68:9::/43", "46475"}, - {"2001:87f::/32", "198455"}, - {"2600:6c38:514::/46", "20115"}, - {"2001:1248:9719::/46", "11172"}, - {"2407:c280:3000::/45", "24322"}, - {"2a02:ee80:419a::/47", "21433"}, - {"2a10:f200::/29", "212399"}, - {"2001:579:2430::/44", "22773"}, - {"2001:4190:8025::/33", "12912"}, - {"2001:4b00::/29", "12620"}, - {"2402:4900::/32", "9216"}, - {"2605:a80:1::/48", "13213"}, - {"2620:1ec:35::/41", "8075"}, - {"2a07:3502:1070::/48", "38915"}, - {"2a07:dfc0::/32", "212944"}, - {"2a0f:104::/30", "7018"}, - {"2001:559:8659::/48", "33659"}, - {"2001:67c:1bc0::/48", "60216"}, - {"2a00:cf8::/32", "12605"}, - {"2a0a:c340::/32", "12996"}, - {"2409:8904:6670::/40", "24547"}, - {"2a0b:dd00::/29", "31252"}, - {"2001:df6:4f00::/48", "136167"}, - {"2401:1040::/47", "134806"}, - {"2406:9b40::/32", "24262"}, - {"240a:aa42::/32", "145276"}, - {"2600:6c38:e03::/45", "20115"}, - {"2605:a404:a03::/42", "33363"}, - {"2606:2800:4226::/44", "15133"}, - {"2804:6368::/32", "269359"}, - {"2001:4de0:2203::/39", "33438"}, - {"2405:9000:208::/32", "7474"}, - {"2408:8456:e210::/42", "134543"}, - {"2408:8459:a50::/37", "17816"}, - {"240e:983:1804::/47", "4134"}, - {"2600:6c10:818::/46", "20115"}, - {"2620:126:b000::/40", "22208"}, - {"2620:149:1010::/42", "714"}, - {"2a04:4b40::/29", "60476"}, - {"2401:1740:1000::/48", "136600"}, - {"240a:afff::/32", "146745"}, - {"2800:880::/30", "27773"}, - {"2604:cac0::/44", "11019"}, - {"2605:9780:2::/48", "36180"}, - {"2607:6b80:5d::/48", "12167"}, - {"2a00:4802:2610::/39", "8717"}, - {"2604:d600:d::/43", "32098"}, - {"240a:a83b::/32", "144757"}, - {"2600:140f:cc00::/48", "9498"}, - {"2607:8700:110::/46", "25820"}, - {"2405:68c0:21::/48", "139179"}, - {"240a:a5b7::/32", "144113"}, - {"2001:250:701b::/45", "24370"}, - {"2001:b012::/26", "3462"}, - {"2408:8459:5650::/36", "17816"}, - {"240a:a18d::/32", "143047"}, - {"2804:3b0:8309::/45", "53062"}, - {"2804:1644:340::/32", "262903"}, - {"2001:559:8628::/48", "33287"}, - {"2404:bf40:c200::/48", "7545"}, - {"240e:438:7820::/43", "140647"}, - {"240e:983:900::/46", "17638"}, - {"2804:14d:ac94::/42", "28573"}, - {"2a0d:f802:9000::/33", "20278"}, - {"2001:250:812::/48", "23910"}, - {"2001:1248:8473::/45", "11172"}, - {"2404:f4c0:8861::/46", "210384"}, - {"2405:6400:5000::/32", "23678"}, - {"2605:a8c0:10f::/48", "11827"}, - {"2a01:380::/32", "13127"}, - {"2a03:3300::/32", "50399"}, - {"2a02:26f7:c881::/46", "20940"}, - {"2a02:26f7:d981::/46", "20940"}, - {"2a04:8d40::/29", "50304"}, - {"2001:ee0:d040::/39", "45899"}, - {"2400:3860::/32", "149037"}, - {"240e:438:1840::/38", "4134"}, - {"2800:68:3c::/48", "27947"}, - {"2800:160:10d2::/47", "14259"}, - {"2800:484:d800::/40", "10620"}, - {"2a06:62c0::/41", "204138"}, - {"2001:1890::/35", "7018"}, - {"240e:44d:140::/42", "140346"}, - {"2804:80cc::/47", "272413"}, - {"2a02:26f7:38::/48", "36183"}, - {"2a0a:c400::/29", "47716"}, - {"2c0f:f438::/32", "37517"}, - {"2001:67c:1304::/48", "211000"}, - {"240a:a321::/32", "143451"}, - {"2602:807:a000::/44", "398668"}, - {"2605:4e40::/32", "40033"}, - {"2606:2b80::/32", "53338"}, - {"2804:14c:7500::/41", "28573"}, - {"2806:370:9100::/44", "28403"}, - {"2a12:800::/29", "210555"}, - {"2001:4d0:2418::/48", "7847"}, - {"2001:da8:20d::/48", "133111"}, - {"2600:1806:10::/44", "16552"}, - {"2602:fe77::/36", "53732"}, - {"2605:3940::/32", "397566"}, - {"2001:559:2c1::/48", "33287"}, - {"2001:559:c086::/48", "33657"}, - {"2401:9440::/32", "56264"}, - {"2404:2f80:ff00::/48", "140399"}, - {"2604:d600:928::/47", "32098"}, - {"2a02:26f7:d388::/47", "36183"}, - {"2a06:f907::/36", "56630"}, - {"2c0f:1000::/32", "328767"}, - {"2001:de8:16::/48", "55943"}, - {"240e:308:1200::/32", "4134"}, - {"2607:fcd0:10d::/35", "8100"}, - {"2a00:62c0::/32", "12389"}, - {"2a03:25c0::/32", "41770"}, - {"2a06:8dc3::/48", "57878"}, - {"2001:559:c146::/48", "33651"}, - {"2001:df0:ce::/48", "24101"}, - {"2001:44b8:7::/44", "7545"}, - {"2607:fb50:2100::/32", "22781"}, - {"2801:1de::/46", "271901"}, - {"2803:9800:909b::/42", "11664"}, - {"2001:1248:595a::/42", "11172"}, - {"2803:e600:cacf::/34", "18809"}, - {"2804:3810:100::/38", "266453"}, - {"2a0c:a9c7:147::/48", "41740"}, - {"2001:4998:f00f::/36", "10310"}, - {"2404:b640::/32", "137653"}, - {"240a:ae60::/32", "146330"}, - {"2804:1f44::/32", "270710"}, - {"2a00:f940:1::/44", "197695"}, - {"240a:ae9b::/32", "146389"}, - {"2605:5440:a::/32", "23328"}, - {"2806:106e:22::/45", "8151"}, - {"2a02:45c0::/47", "59675"}, - {"2a0d:3341:9000::/34", "36492"}, - {"2a0e:1580::/29", "208942"}, - {"2001:67c:1688::/48", "42632"}, - {"2409:8074:1900::/34", "9808"}, - {"240e:44d:4500::/42", "140345"}, - {"2a02:160::/32", "62183"}, - {"2a02:2230:200::/37", "25467"}, - {"240e:5f:6002::/48", "134772"}, - {"2600:1406:2600::/48", "35994"}, - {"2620:51:8000::/48", "394520"}, - {"2801:11e:1::/48", "3816"}, - {"2001:470:122::/43", "6939"}, - {"2405:c440:2::/32", "139972"}, - {"2406:e001:a000::/33", "23655"}, - {"2409:8d80:b000::/25", "9808"}, - {"2806:230:2052::/48", "265594"}, - {"2a02:888:8151::/48", "47794"}, - {"2409:8915:2a00::/40", "56044"}, - {"240e:3be::/35", "134773"}, - {"2600:6c10:f808::/47", "20115"}, - {"2a02:26f7:d189::/46", "20940"}, - {"2401:d800:b150::/42", "7552"}, - {"2404:5800:101::/32", "9911"}, - {"2605:9880:344::/47", "23470"}, - {"2a06:a005:b5::/48", "207941"}, - {"2a0f:6fc4::/32", "57487"}, - {"2001:250:5811::/46", "23910"}, - {"2001:4802::/32", "27357"}, - {"2400:a040:b::/32", "136237"}, - {"2402:800:bc60::/39", "7552"}, - {"240a:a7a6::/32", "144608"}, - {"2600:1005:d130::/41", "6167"}, - {"2804:5ce8:4100::/32", "268938"}, - {"2a0d:82c7:b000::/36", "47787"}, - {"2001:559:840e::/48", "33659"}, - {"2402:e380:31f::/48", "142148"}, - {"2600:100a:d020::/34", "22394"}, - {"2600:6c10:ff86::/44", "20115"}, - {"2605:4400:6::/47", "40715"}, - {"2804:7924::/32", "271287"}, - {"2a01:9480::/32", "49268"}, - {"2a10:cc42:1600::/40", "20473"}, - {"2001:559:83bb::/48", "33660"}, - {"2001:67c:28d4::/48", "59467"}, - {"2409:8904:5640::/42", "24547"}, - {"240e:5a:4780::/36", "140300"}, - {"2804:358::/39", "53246"}, - {"2a0e:b107:f2a::/48", "212268"}, - {"2a10:4741:20::/48", "208806"}, - {"2001:250:680b::/45", "138373"}, - {"2400:adc0:4010::/47", "9541"}, - {"2408:8459:ec50::/39", "17816"}, - {"2600:5c00:201::/36", "10838"}, - {"2a02:2498::/47", "13213"}, - {"2a04:3200::/47", "30742"}, - {"2a0b:6b81:3::/45", "42615"}, - {"240e:5e:1040::/42", "134774"}, - {"240e:108:1180::/48", "133774"}, - {"2a02:2e02:1350::/40", "12479"}, - {"2a02:50c0::/40", "29355"}, - {"2001:13c7:6016::/48", "61494"}, - {"2001:44b8:4059::/48", "4739"}, - {"2409:8c85:2801::/48", "56041"}, - {"2804:18d0::/32", "19990"}, - {"2804:7598::/32", "271057"}, - {"2a02:26f7:e4c9::/42", "20940"}, - {"2a02:ee80:4272::/45", "3573"}, - {"2a09:4b00::/32", "35280"}, - {"2c0f:f200::/32", "328015"}, - {"2001:559:c3b3::/48", "7016"}, - {"2001:4490:3f00::/42", "9829"}, - {"240a:ae76::/32", "146352"}, - {"2607:fac8::/36", "11404"}, - {"2a04:2dc0:18::/48", "211970"}, - {"2001:67c:23f4::/48", "197982"}, - {"2001:4490:4c00::/40", "9829"}, - {"2403:2c00::/45", "4058"}, - {"2602:ff0c:a3::/48", "5081"}, - {"2804:4f58:4100::/32", "268321"}, - {"2806:2f0:41e3::/38", "17072"}, - {"2a02:5f83:d1cd::/34", "39811"}, - {"2a03:6083:d000::/29", "16285"}, - {"240e:5e:10f0::/34", "4134"}, - {"2800:bf0:8012::/44", "27947"}, - {"2a03:cc00:fc0::/48", "212403"}, - {"2001:da8:e81f::/48", "138373"}, - {"2600:1010:a020::/40", "22394"}, - {"2a02:26f7:7b::/48", "20940"}, - {"2001:559:296::/48", "7922"}, - {"2405:203:888::/43", "55836"}, - {"2408:8459:210::/41", "17622"}, - {"240a:a5c6::/32", "144128"}, - {"240a:aa9e::/32", "145368"}, - {"2607:f0d0:1400::/36", "36351"}, - {"2a04:4e40:f040::/44", "54113"}, - {"2a06:6540:1241::/48", "8220"}, - {"2a06:cd40:400::/48", "43927"}, - {"240a:ad6c::/32", "146086"}, - {"2600:8808:1a00::/34", "22773"}, - {"2800:800:7f0::/45", "26611"}, - {"2a01:cf00:50::/46", "3215"}, - {"2001:1248:a016::/48", "11172"}, - {"2800:160:1431::/45", "14259"}, - {"2a03:7360:1::/48", "197943"}, - {"2a0c:3800:400::/48", "202410"}, - {"2a10:d504::/47", "22773"}, - {"2400:7fc0:220::/44", "55960"}, - {"2406:8b40::/39", "141218"}, - {"2804:3710:a000::/33", "266387"}, - {"2804:5214::/32", "268493"}, - {"2a03:5d60::/29", "14340"}, - {"2a0d:8780::/29", "49475"}, - {"2001:559:86d0::/48", "22909"}, - {"2001:b08:4::/48", "9162"}, - {"2406:8800::/42", "17465"}, - {"2a00:99a0:f000::/48", "64484"}, - {"2a02:7aa0::/35", "43513"}, - {"2404:1fc0::/35", "133217"}, - {"2600:370f:52c1::/42", "32261"}, - {"2604:c340::/32", "17055"}, - {"2a02:26f7:d245::/46", "20940"}, - {"2a06:e881:1709::/48", "206813"}, - {"2001:559:109::/48", "33287"}, - {"2001:678:fdc::/48", "206362"}, - {"2a00:1af0::/29", "35699"}, - {"2a03:2887:ff15::/48", "35819"}, - {"2c0f:fe08:111::/41", "36914"}, - {"2001:1248:571f::/41", "11172"}, - {"2607:f1d8:d2::/32", "7795"}, - {"2607:ffb0:7001::/32", "6327"}, - {"2806:2f0:3343::/42", "17072"}, - {"2a06:f907:4000::/36", "56630"}, - {"2001:559:777::/48", "33657"}, - {"2001:1a11:a7::/48", "8781"}, - {"2001:1ae8::/31", "13036"}, - {"2a02:ac80:601::/39", "25145"}, - {"2001:559:25a::/47", "33657"}, - {"2001:67c:2710::/48", "57823"}, - {"2402:800:5ad3::/44", "7552"}, - {"2405:9800:c908::/48", "45430"}, - {"2605:4640::/32", "20213"}, - {"2800:5f0:6024::/32", "22724"}, - {"2804:e0c:100::/48", "28176"}, - {"2a05:3950::/32", "201503"}, - {"2001:1248:5672::/40", "11172"}, - {"2800:160:1669::/43", "14259"}, - {"2806:370:7110::/44", "28403"}, - {"2a02:26f7:cac9::/42", "20940"}, - {"2401:4900:4a90::/42", "45609"}, - {"2a02:ac80:201::/39", "25145"}, - {"2607:b580:12::/48", "19754"}, - {"2600:2c00:3000::/36", "17378"}, - {"2a00:9340::/32", "57795"}, - {"2a01:5c40:6::/48", "212397"}, - {"2a10:cf00::/29", "12651"}, - {"2001:559:c531::/45", "7922"}, - {"2402:800:9501::/44", "7552"}, - {"2804:4750::/32", "267045"}, - {"2804:7ccc::/32", "271519"}, - {"2a00:d8a0::/29", "44332"}, - {"2a02:26f0:4701::/36", "20940"}, - {"2a02:26f7:eb01::/46", "20940"}, - {"2a04:3f83:49::/48", "211633"}, - {"2a09:9400::/29", "24822"}, - {"2a10:5800::/29", "399975"}, - {"2001:4801::/32", "19994"}, - {"2a0d:740::/29", "57878"}, - {"2600:9000:236a::/47", "16509"}, - {"2620:171:14::/46", "715"}, - {"2a02:2078::/32", "47720"}, - {"2607:fb40::/32", "19008"}, - {"2a02:e0:312f::/38", "34984"}, - {"2a02:26f7:19::/48", "20940"}, - {"2a0d:3840:100::/48", "57629"}, - {"2a0f:4e80::/29", "50629"}, - {"2c0f:fc89:8038::/40", "36992"}, - {"2407:4e00::/47", "17995"}, - {"240e:183:820c::/46", "140651"}, - {"2600:1404:a401::/38", "20940"}, - {"2602:fc09:bc::/41", "13780"}, - {"2602:fed2:7100::/48", "20473"}, - {"2606:2800:500c::/48", "14153"}, - {"2801:1:8004::/48", "18916"}, - {"2804:2044::/32", "52774"}, - {"2a02:7f40::/32", "20860"}, - {"2a06:e881:5901::/48", "209569"}, - {"2001:470:121::/48", "29962"}, - {"2001:559:2c6::/48", "33662"}, - {"2001:df4:1e80::/48", "136632"}, - {"2001:c38:9054::/46", "9931"}, - {"2001:da8:259::/48", "24349"}, - {"240e:9b:f01e::/42", "140255"}, - {"2408:8456:8e00::/42", "17622"}, - {"2408:8957:700::/40", "17816"}, - {"2605:b400::/37", "25956"}, - {"2804:5dd8::/32", "268996"}, - {"2a05:4b80::/29", "59395"}, - {"2a10:400::/32", "201787"}, - {"2400:ac40::/36", "136255"}, - {"2409:8050:1900::/37", "9808"}, - {"2606:2800:4252::/48", "15133"}, - {"2a06:d581:2000::/36", "207308"}, - {"2a03:1981::/32", "48260"}, - {"2001:4c21::/32", "60610"}, - {"2400:cb00:a870::/45", "13335"}, - {"2402:28c0:101::/32", "136620"}, - {"2408:8956:3900::/40", "17816"}, - {"240a:a898::/32", "144850"}, - {"2605:a404:17a::/45", "33363"}, - {"2800:800:a22::/43", "26611"}, - {"2a02:2e02:2570::/40", "12479"}, - {"2a0b:bdc0::/29", "42000"}, - {"2402:e380:318::/48", "141021"}, - {"2404:3d00:41a4::/44", "3573"}, - {"240e:9b:f033::/29", "4134"}, - {"2600:381:3a00::/29", "7018"}, - {"2001:da8:8001::/48", "24365"}, - {"2400:cb00:482::/44", "13335"}, - {"2409:8721::/29", "9808"}, - {"240e:12:1000::/32", "4134"}, - {"240e:67e:e600::/31", "4134"}, - {"2602:fec0::/44", "396320"}, - {"2606:f500:4000::/32", "11352"}, - {"2804:7e0c::/32", "271599"}, - {"2806:230:6017::/48", "11888"}, - {"2a01:170:1051::/36", "8820"}, - {"2a02:26f0:8f01::/35", "20940"}, - {"2a06:e0c0::/31", "28769"}, - {"2001:559:561::/46", "7922"}, - {"2401:d800:b8e0::/39", "7552"}, - {"2402:a00:4d::/42", "45916"}, - {"2801:80:7c0::/46", "263621"}, - {"2001:4888:8041::/46", "22394"}, - {"240e:974:ea00::/40", "4134"}, - {"2620:4e:a000::/48", "393529"}, - {"2a02:26f7:ea84::/48", "36183"}, - {"2a02:2b58::/29", "51074"}, - {"2a06:7243:f::/43", "62425"}, - {"2801:80:2410::/48", "268306"}, - {"2a05:7782::/32", "39892"}, - {"2a0d:40c0:8100::/33", "203448"}, - {"2a0d:ff00::/29", "204877"}, - {"2001:67c:206c::/48", "49788"}, - {"2001:67c:2ad8::/48", "198611"}, - {"2001:df0:247::/48", "58631"}, - {"2001:4b98:dc4::/46", "203476"}, - {"2404:2440:a0a0::/48", "138521"}, - {"2600:1417:d800::/48", "35819"}, - {"2604:5400:8800::/35", "11776"}, - {"2a0e:b107:12f5::/48", "211722"}, - {"2a11:4700::/31", "28680"}, - {"2001:4e0:1051::/32", "2381"}, - {"2001:559:c3b2::/48", "33287"}, - {"2001:da8:23f::/48", "23910"}, - {"240a:a3ca::/32", "143620"}, - {"2800:bf0:2440::/46", "52257"}, - {"2a02:26f7:e48d::/42", "20940"}, - {"2a0f:9400:7860::/47", "9833"}, - {"2001:4b27:ffff::34/121", "34288"}, - {"240e:186:c000::/34", "4812"}, - {"2602:803:4077::/48", "398223"}, - {"2804:6038::/32", "269153"}, - {"2a01:4b40:5000::/34", "21299"}, - {"2001:df6:b000::/48", "45533"}, - {"2400:1660::/48", "140766"}, - {"2804:4560::/32", "266922"}, - {"2a0d:3841:1030::/48", "57629"}, - {"2001:1260:3::/48", "28536"}, - {"2604:6600:78::/40", "40676"}, - {"2803:2210::/36", "271896"}, - {"2001:67c:29cc::/48", "3330"}, - {"2408:8456:4840::/38", "17816"}, - {"240e:45c:3b00::/40", "140528"}, - {"2600:180f::/32", "16552"}, - {"2620:1b::/44", "17103"}, - {"2a01:6c60:4000::/30", "62217"}, - {"2a02:9a8::/32", "47902"}, - {"2a0d:c0c0:3e1::/48", "59439"}, - {"2001:559:323::/48", "33652"}, - {"2402:f300::/32", "132125"}, - {"2a12:a200::/29", "210521"}, - {"2001:559:8004::/48", "33650"}, - {"2001:da8:214::/46", "24350"}, - {"2404:4a00:5542:3a2::/50", "55423"}, - {"2620:79:c000::/48", "62903"}, - {"2800:bf0:1c6::/44", "52257"}, - {"2804:6b14::/33", "270376"}, - {"2001:253:140::/48", "142106"}, - {"240a:a6a5::/32", "144351"}, - {"2602:fca0::/36", "399504"}, - {"2001:df6:2580::/48", "135738"}, - {"2600:805:b00::/48", "397601"}, - {"2605:a401:8419::/42", "33363"}, - {"2a00:4120::/32", "20804"}, - {"2603:c001:3610::/36", "31898"}, - {"2804:f8::/32", "53147"}, - {"2806:2f0:3283::/42", "17072"}, - {"2001:1388:5544::/46", "6147"}, - {"2607:ab00::/32", "600"}, - {"2804:7a4c::/32", "271363"}, - {"2a00:11c0:1799::/48", "42473"}, - {"2402:800:91fe::/38", "7552"}, - {"2408:8956:7300::/40", "17816"}, - {"2804:46f0:21::/41", "267021"}, - {"2001:559:33c::/48", "7016"}, - {"2401:4900:1fe0::/34", "45609"}, - {"2600:6c38:6c::/43", "20115"}, - {"2801:80:2c00::/40", "268460"}, - {"2a02:6900:8820::/48", "7160"}, - {"2a03:1ac0:5f50::/32", "9049"}, - {"2402:800:370f::/43", "7552"}, - {"2408:84f3:f620::/43", "17816"}, - {"240e:12:9000::/37", "134766"}, - {"2600:6c39:63d::/30", "20115"}, - {"2a01:c50e:ff40::/31", "12479"}, - {"2a05:4140:3::/45", "212271"}, - {"2605:b100:fcff::/48", "36522"}, - {"2607:f8f8:600::/39", "27323"}, - {"2804:27ac::/32", "52833"}, - {"2a01:56c1:300::/40", "198864"}, - {"2804:3688::/32", "266354"}, - {"2804:4364::/32", "267567"}, - {"2a00:d400::/32", "197506"}, - {"2001:df0:246::/48", "9555"}, - {"2400:cb00:356::/44", "13335"}, - {"2402:800:5efe::/34", "7552"}, - {"2406:f680:2::/33", "132298"}, - {"2605:4300:1200::/43", "22616"}, - {"2607:ffc8:1::3/63", "17356"}, - {"2804:2620::/32", "264323"}, - {"2a09:e080::/29", "29686"}, - {"2a10:e100::/29", "174"}, - {"2001:300::/32", "2497"}, - {"2001:579:62a0::/35", "22773"}, - {"240a:ad13::/32", "145997"}, - {"2804:716c::/32", "270788"}, - {"2001:44b8:30d8::/46", "7545"}, - {"2402:c800:fff1::/48", "37900"}, - {"2403:cc00:3000::/36", "20860"}, - {"2408:8a23:4000::/34", "4837"}, - {"240a:a4ff::/32", "143929"}, - {"2a02:26f7:e7d0::/48", "36183"}, - {"2a06:fb41::/32", "203385"}, - {"2a0b:3540::/45", "204413"}, - {"2001:41b8::/32", "8365"}, - {"2001:4888:801e::/48", "6167"}, - {"2409:8924:4700::/36", "56046"}, - {"2409:8958:c854::/39", "56040"}, - {"2607:f098:3100::/38", "33363"}, - {"2806:20d:5800::/45", "32098"}, - {"2a02:20a8::/32", "15830"}, - {"2a04:980::/29", "15659"}, - {"2a02:2e02:89e0::/38", "12479"}, - {"2001:978:2801::/38", "174"}, - {"2402:800:9455::/42", "7552"}, - {"2405:ec00:111::/35", "23955"}, - {"2610:a1:1021::/46", "397228"}, - {"2804:a98::/32", "52896"}, - {"2001:1900:2261::/48", "3356"}, - {"2a04:4280:100::/48", "43260"}, - {"2a0e:40c0:3::/48", "204957"}, - {"2001:559:186::/47", "33651"}, - {"2001:67c:48::/48", "51210"}, - {"2600:370f:3588::/42", "32261"}, - {"2606:6080:1004::/48", "32489"}, - {"2001:44b8:606f::/32", "4739"}, - {"2401:4900:40d1::/44", "45609"}, - {"2404:4a00:7500::/64", "55423"}, - {"2405:f080:e00::/46", "136907"}, - {"2600:2:da0::/29", "1239"}, - {"2620:13d:a000::/48", "19712"}, - {"2a02:2e0:407::/43", "12306"}, - {"2a02:ed04:110::/34", "50304"}, - {"2402:ef2f:1c::/48", "7633"}, - {"240e:5e:1080::/44", "4134"}, - {"2602:802:4003::/48", "14038"}, - {"2602:fc23:151::/48", "54625"}, - {"2806:2f0:92e6::/39", "17072"}, - {"2001:dc7::/48", "24409"}, - {"2001:16a2:c310::/41", "39386"}, - {"2404:2940::/34", "132257"}, - {"2a02:ee80:4058::/47", "21433"}, - {"2406:dec0::/32", "45284"}, - {"2a01:b5e0::/32", "43359"}, - {"2a02:26f7:df00::/48", "36183"}, - {"2a0a:ec00::/32", "20836"}, - {"2001:468:1203::/37", "11537"}, - {"2001:559:2a4::/48", "7015"}, - {"2001:559:7a6::/48", "7922"}, - {"2402:800:5de0::/44", "7552"}, - {"2409:8904:5970::/40", "24547"}, - {"2409:8f04:9700::/33", "24547"}, - {"2620:1e:2000::/48", "396288"}, - {"2804:2700::/32", "263869"}, - {"2001:67c:2004::/48", "25173"}, - {"2405:1c0:7951::/46", "55303"}, - {"2605:6f80::/40", "53340"}, - {"2001:250:5866::/48", "138371"}, - {"2001:67c:29c8::/48", "52016"}, - {"2a02:26f7:e100::/48", "36183"}, - {"240a:a095::/32", "142799"}, - {"240a:a4e7::/32", "143905"}, - {"2600:6c20:e4a::/43", "20115"}, - {"240a:ad0e::/32", "145992"}, - {"2600:140b:14::/48", "24319"}, - {"2603:7000::/28", "12271"}, - {"2001:da8:23c::/48", "23910"}, - {"2001:df0:4780::/48", "45278"}, - {"2804:14c:f289::/41", "28573"}, - {"2a01:53c0:ff01::/44", "54994"}, - {"2402:e7c0:840::/38", "59078"}, - {"2605:a900:100a::/34", "46887"}, - {"2804:32e0::/32", "265102"}, - {"2806:230:402e::/48", "265594"}, - {"2a0a:ec02:c01::/48", "42692"}, - {"2a0d:a140::/29", "24639"}, - {"2a0e:800:ff03::/45", "209083"}, - {"2400:4840::/48", "395363"}, - {"2804:7494::/32", "270990"}, - {"2a02:26f7:5e::/48", "36183"}, - {"2c0f:eb68::/32", "36924"}, - {"2401:7400:6001::/43", "4773"}, - {"2606:6a80::/32", "394384"}, - {"2607:fb10:5017::/42", "2906"}, - {"2804:14c:da99::/41", "28573"}, - {"2804:48b4::/32", "267139"}, - {"2804:4968::/32", "262625"}, - {"2a00:1fa2:bb00::/33", "28884"}, - {"2a00:ab00::/33", "49505"}, - {"2a02:26f7:e7d5::/42", "20940"}, - {"2c0f:fbf0:1::/48", "32653"}, - {"2001:559:c233::/48", "33650"}, - {"2001:44b8:4079::/40", "4739"}, - {"240a:ade2::/32", "146204"}, - {"2600:6c7f:9022::/48", "20115"}, - {"2605:940:610::/44", "396919"}, - {"2800:200:f1d0::/36", "12252"}, - {"2001:559:8401::/48", "33491"}, - {"2001:678:e98::/48", "212495"}, - {"2001:1488::/32", "25192"}, - {"2409:8948:8b00::/40", "24445"}, - {"2800:d302:38::/29", "11830"}, - {"2804:a30:c000::/34", "263030"}, - {"2a02:a11::/29", "31251"}, - {"2a02:26f7:c6c2::/47", "20940"}, - {"2a09:a4c7:3000::/36", "208861"}, - {"240a:a75a::/32", "144532"}, - {"2800:68:bacb::/33", "61468"}, - {"2804:30b8:caff::/34", "28154"}, - {"2804:3128::/32", "264997"}, - {"2a02:5e0::/32", "3330"}, - {"2a02:ee80:42d6::/32", "3573"}, - {"2a0b:9cc0::/29", "12859"}, - {"240a:aaf0::/32", "145450"}, - {"2803:8240::/47", "52511"}, - {"2a03:db80:4424::/48", "5501"}, - {"2a0e:aa06:498::/45", "24239"}, - {"2001:559:217::/48", "33659"}, - {"2001:67c:109c::/48", "211479"}, - {"2400:ddc0:d000::/34", "4785"}, - {"2a03:94c0::/40", "39326"}, - {"2001:559:3f4::/47", "7016"}, - {"2402:7d80:241::/48", "63583"}, - {"2404:ce40::/35", "138884"}, - {"2406:daa0:2080::/44", "16509"}, - {"2408:805c:4000::/44", "17622"}, - {"2800:5d0:801::/48", "17048"}, - {"2804:2848::/32", "263952"}, - {"2804:7854::/32", "271235"}, - {"2a02:26f0:9401::/39", "20940"}, - {"2406:5880::/32", "135391"}, - {"240a:adb5::/32", "146159"}, - {"240e:45c:c200::/40", "131285"}, - {"240e:964:ea00::/40", "133776"}, - {"2600:180b:2002::/33", "16552"}, - {"2620:11d:9002::/56", "14805"}, - {"2a02:26f7:d284::/48", "36183"}, - {"2c0f:f148::/32", "37542"}, - {"2602:fe6f:2::/47", "11374"}, - {"2a02:26f7:e989::/46", "20940"}, - {"2a02:5300::/32", "34119"}, - {"2600:2:120::/36", "1239"}, - {"2803:c800::/33", "23243"}, - {"2a01:5041:1000::/48", "202196"}, - {"2a0f:b100::/44", "202945"}, - {"2001:559:c164::/48", "20214"}, - {"2001:43f8:bf0::/48", "2635"}, - {"240e:96b:602d::/32", "4134"}, - {"2605:bc0:2002::/48", "54201"}, - {"2402:800:382b::/41", "7552"}, - {"2407:a080:8000::/33", "133480"}, - {"2600:140f:1c00::/48", "55836"}, - {"2604:4d40:6c::/47", "213073"}, - {"2804:24ac:8000::/33", "264237"}, - {"2a02:2e02:8fd0::/42", "12479"}, - {"2a07:3502:1050::/48", "1136"}, - {"2602:ffe1::/36", "11475"}, - {"2800:bf0:b425::/44", "52257"}, - {"2801:b0:b4::/32", "52888"}, - {"2a0a:fb00::/32", "206969"}, - {"2001:559:8286::/47", "7922"}, - {"240e:44d:d80::/41", "4134"}, - {"2604:f680::/40", "39962"}, - {"2806:269:501::/48", "13999"}, - {"2a01:8dc0:112::/48", "29479"}, - {"2a01:c50f:a080::/39", "12479"}, - {"2a03:3a40:2::/35", "199629"}, - {"2a0d:b0c0::/29", "210111"}, - {"2602:ff92::/36", "54868"}, - {"2620:7a:6000::/48", "398208"}, - {"2804:4e28::/32", "268243"}, - {"2a01:af80::/32", "34785"}, - {"2600:9000:11c1::/44", "16509"}, - {"2804:1f4e::/32", "33353"}, - {"2a02:d100::/29", "197155"}, - {"2a0f:1740::/29", "60262"}, - {"2001:559:4f5::/48", "7922"}, - {"2001:67c:940::/48", "209719"}, - {"2001:da8:702b::/48", "23910"}, - {"2600:8807:6d3e::/32", "22773"}, - {"2605:4a80:f000::/36", "11232"}, - {"2620:0:2900::/48", "22843"}, - {"2800:bf0:255::/44", "27947"}, - {"2804:5b50::/32", "268834"}, - {"2a0e:8240::/29", "207902"}, - {"2001:df0:2fc::/48", "58404"}, - {"2001:44b8:406c::/48", "7545"}, - {"2409:8c85:aa0d::/43", "9808"}, - {"2a01:8aa0::/32", "31122"}, - {"2401:4900:3b00::/42", "45609"}, - {"2804:1354:7900::/32", "52892"}, - {"2804:1ca0:ff05::/48", "61666"}, - {"2001:ee0:ca40::/39", "45899"}, - {"2400:adcc::/39", "9541"}, - {"2405:b8c0:1000::/32", "131674"}, - {"2408:80ea:7880::/42", "17623"}, - {"240e:3bb:c000::/37", "140315"}, - {"2620:12f:e000::/40", "40216"}, - {"2804:2940::/32", "264006"}, - {"2806:20d:5045::/44", "32098"}, - {"2a02:26f7:f288::/48", "36183"}, - {"2a02:2e02:9c10::/41", "12479"}, - {"2a0a:9a04::/48", "61317"}, - {"2a0f:9400:100::/46", "59893"}, - {"2a11:d140::/29", "1239"}, - {"2001:559:8512::/48", "7922"}, - {"2001:67c:784::/48", "201511"}, - {"2409:8904:3da0::/38", "24547"}, - {"240a:a605::/32", "144191"}, - {"240a:aac5::/32", "145407"}, - {"2a01:298:f002::/31", "30880"}, - {"2a01:53c0:ffcb::/45", "54994"}, - {"2a02:2230:6200::/40", "25467"}, - {"2001:559:84c0::/48", "33668"}, - {"2408:8256:880::/39", "17622"}, - {"2409:8061:2100::/36", "9808"}, - {"240e:397:1200::/37", "140491"}, - {"2605:4a00:111::/44", "14361"}, - {"2a02:26f7:decd::/46", "20940"}, - {"2001:638:30d::/48", "8519"}, - {"2405:8100:8005::/48", "13335"}, - {"2406:e1c0:6::/38", "141459"}, - {"2409:803c:3090::/48", "9808"}, - {"2600:5800:1602::/34", "11426"}, - {"2602:ff95::/36", "19194"}, - {"2606:6680:6::/48", "30475"}, - {"2a00:eb80::/32", "48518"}, - {"2a02:26f7:d50c::/48", "36183"}, - {"2a0f:56c0::/48", "48749"}, - {"2c0f:f618::/32", "327814"}, - {"2401:3c0:20c::/46", "45528"}, - {"2408:8256:1066::/39", "17622"}, - {"240a:a070::/32", "142762"}, - {"2604:3d80:400::/40", "11030"}, - {"2001:678:684::/48", "203085"}, - {"2803:a440::/32", "263776"}, - {"2804:4c58::/32", "267365"}, - {"2806:230:5017::/36", "11888"}, - {"2001:250:3417::/44", "138393"}, - {"2001:559:29b::/48", "33490"}, - {"2407:d380::/32", "135673"}, - {"240a:ab1b::/32", "145493"}, - {"2606:2800:4080::/48", "15133"}, - {"2804:74e4::/32", "271010"}, - {"2a03:5ce0::/48", "29667"}, - {"2a07:9440::/30", "202682"}, - {"2409:8020:3074::/40", "56046"}, - {"2a01:c9c0:c5::/48", "8891"}, - {"2a02:26f7:c005::/46", "20940"}, - {"2400:8b00:2180::/42", "45727"}, - {"2402:8a00::/33", "24477"}, - {"2804:543c::/32", "268636"}, - {"2804:7238::/32", "270840"}, - {"2606:d600::/32", "18590"}, - {"2803:5c80:5598::/48", "64114"}, - {"2803:ca80::/47", "263249"}, - {"2a02:5860::/32", "3561"}, - {"2600:1004:f110::/31", "22394"}, - {"2803:c560:fffb::/48", "207688"}, - {"2001:16a2:b20c::/43", "25019"}, - {"2400:dc00:4003::/48", "131702"}, - {"2400:dcc0:a204::/39", "38631"}, - {"2401:c7c0:2::/48", "23864"}, - {"2409:8057:3022::/45", "56040"}, - {"2607:fb10:503d::/46", "2906"}, - {"2a00:7380:feed::/48", "205868"}, - {"2607:fcd0:1338::/32", "8100"}, - {"2620:134:6006::/47", "33538"}, - {"2804:204:23f::/41", "28186"}, - {"2a02:26f7:bd::/48", "20940"}, - {"2a0b:b0c0::/29", "210625"}, - {"2a07:e00:a::/45", "210083"}, - {"2001:579:d264::/40", "22773"}, - {"2001:4200:49::/38", "2018"}, - {"2402:3a80:c037::/44", "38266"}, - {"2806:20d:5226::/40", "32098"}, - {"2a0a:ab80::/32", "206637"}, - {"2a0e:97c0:76f::/48", "207662"}, - {"2001:13c7:601f::/48", "64104"}, - {"2408:8456:5a00::/42", "17622"}, - {"240a:ae35::/32", "146287"}, - {"2600:380:a180::/38", "20057"}, - {"2600:9000:1e01::/46", "16509"}, - {"2a02:2698:782a::/47", "56981"}, - {"2a02:26f7:d9c9::/42", "20940"}, - {"2408:84f3:b210::/42", "134543"}, - {"2408:8957:b000::/40", "17622"}, - {"240a:a4c1::/32", "143867"}, - {"2600:370f:36c5::/46", "32261"}, - {"2606:2800:7030::/46", "15133"}, - {"2620:21:c000::/48", "30256"}, - {"2a02:26f7:d6c5::/46", "20940"}, - {"2a03:d180:fffe::/48", "13172"}, - {"2401:d800:9e50::/42", "7552"}, - {"2402:9e80:55::/48", "141376"}, - {"2408:8459:c050::/38", "17816"}, - {"2604:6600::/47", "40676"}, - {"2a02:2498:295::/48", "13213"}, - {"2a04:5500::/29", "60357"}, - {"2602:fd93::/36", "398230"}, - {"2a00:df80::/47", "12301"}, - {"2a01:53c0:ffba::/45", "54994"}, - {"2001:678:7e8::/48", "200300"}, - {"2607:f380:865::/38", "2152"}, - {"2607:f560::/32", "7029"}, - {"2800:bf0:80c2::/48", "27947"}, - {"2800:bf0:80e0::/45", "52257"}, - {"2a02:2630::/29", "15419"}, - {"2a05:c200::/29", "201050"}, - {"2001:250:21f::/42", "23910"}, - {"2001:579:5384::/36", "22773"}, - {"2402:8100:3a4f::/32", "55644"}, - {"2804:7994::/32", "271314"}, - {"2402:800:5901::/44", "7552"}, - {"2800:4b0:4310::/37", "12252"}, - {"2804:30cc::/32", "263055"}, - {"2a09:9180:ecfb::/48", "42081"}, - {"2001:559:580::/48", "33650"}, - {"2001:c00:101::/33", "4618"}, - {"2001:1340::/32", "10569"}, - {"2001:43f8:13e0::/48", "328403"}, - {"240a:a15a::/32", "142996"}, - {"240e:3b8:9c00::/34", "140310"}, - {"240e:438:e40::/35", "4134"}, - {"2604:6100::/32", "39970"}, - {"2620:13f:701a::/47", "55706"}, - {"2804:108c:d100::/37", "28146"}, - {"2804:3414::/32", "28666"}, - {"2607:fb10:7052::/42", "2906"}, - {"2a02:21e0::/32", "44700"}, - {"2a02:2e02:8c50::/42", "12479"}, - {"2001:559:501::/48", "7725"}, - {"2001:1248:986d::/43", "11172"}, - {"2408:8956:dac0::/39", "17816"}, - {"2409:8c20:5027::/39", "56046"}, - {"240a:a31a::/32", "143444"}, - {"2620:171:a0::/44", "715"}, - {"2a02:26f7:bdd1::/42", "20940"}, - {"2a02:26f7:e8cc::/48", "36183"}, - {"2a02:6f00:ec1::/32", "197692"}, - {"2a0a:2842:3450::/47", "136796"}, - {"2001:da8:ffc::/48", "24351"}, - {"2600:140f:4e01::/39", "20940"}, - {"2620:149:1110::/41", "714"}, - {"2803:b780:2::/44", "27742"}, - {"2803:e600:ffab::/41", "18809"}, - {"2a04:f340:1000::/40", "211174"}, - {"2a09:8180::/30", "3320"}, - {"2001:ee0:3740::/36", "45899"}, - {"2409:807e:100::/36", "9808"}, - {"240a:addc::/32", "146198"}, - {"2600:1006:a120::/36", "22394"}, - {"2606:2800:4ac8::/46", "15133"}, - {"2620:9:c000::/48", "23099"}, - {"2803:7320::/32", "266758"}, - {"2a0c:600::/29", "8399"}, - {"2c0f:f238:8000::/33", "328032"}, - {"2604:2b80::/36", "54351"}, - {"2a02:2861::/32", "25255"}, - {"2a02:4fc0:4200::/32", "199081"}, - {"2402:9040:9001::/33", "137498"}, - {"2806:2f0:2200::/42", "17072"}, - {"2402:b400:4428::/38", "45960"}, - {"240a:a32a::/32", "143460"}, - {"2605:1980:102::/45", "13951"}, - {"2620:135:6052::/40", "22697"}, - {"2800:160:1b22::/45", "14259"}, - {"2804:60a8::/32", "269182"}, - {"2a00:f740:400::/48", "57118"}, - {"2409:8062:3100::/36", "9808"}, - {"240a:a236::/32", "143216"}, - {"2605:b880::/32", "62782"}, - {"2606:e480:200::/39", "55083"}, - {"2800:200::/44", "12252"}, - {"2a03:4900:a0::/47", "197695"}, - {"2a03:fa00::/32", "28760"}, - {"2001:14f8::/32", "12502"}, - {"2402:ee80:b::/45", "132647"}, - {"240e:183:8200::/46", "140648"}, - {"2600:380:8100::/38", "7018"}, - {"2620:130:3022::/47", "62861"}, - {"2804:431c::/38", "267549"}, - {"2a0e:b107:240::/44", "204982"}, - {"2a0f:9400:7846::/44", "147028"}, - {"2001:559:c34d::/46", "7016"}, - {"2804:16a0::/32", "61908"}, - {"2a0e:8180::/48", "48749"}, - {"2001:559:789::/48", "7015"}, - {"2001:559:869f::/42", "7015"}, - {"2404:d500:2::/47", "132370"}, - {"2620:4d:402f::/43", "395403"}, - {"2804:45c4::/32", "266948"}, - {"2a00:1398::/30", "34878"}, - {"2c0f:e8e0:8000::/33", "327926"}, - {"2001:4cf8::/33", "13167"}, - {"2400:b000:300::/48", "45600"}, - {"240a:a2ec::/32", "143398"}, - {"2803:a0::/32", "266784"}, - {"2a02:26f7:dc89::/46", "20940"}, - {"2a03:2880:f140::/46", "32934"}, - {"2001:4b18:4000::/32", "20746"}, - {"2409:8c54:a00::/37", "56040"}, - {"2a00:b220::/32", "43957"}, - {"2a02:c98::/32", "48918"}, - {"240e:678:8800::/33", "4134"}, - {"2804:5818:1500::/32", "268106"}, - {"2a00:aea0:100::/38", "12678"}, - {"2001:250:2426::/48", "23910"}, - {"2604:d600:c3f::/41", "32098"}, - {"2400:bb00:101::/46", "56274"}, - {"240a:a57d::/32", "144055"}, - {"2602:ffc5:da0::/44", "7489"}, - {"2604:2680:2::/48", "2386"}, - {"2a02:503::/47", "51955"}, - {"2a02:ee80:41cc::/43", "3573"}, - {"2a0f:3b03::/32", "58313"}, - {"2001:579:d2a4::/34", "22773"}, - {"2602:ff28::/36", "14877"}, - {"2607:f758:5400::/32", "13649"}, - {"2804:14c:5971::/40", "28573"}, - {"2001:ec0:4000::/44", "131293"}, - {"2406:4440:50::/42", "396303"}, - {"2409:805c:30c1::/42", "9808"}, - {"2607:f060:1004::/32", "11404"}, - {"2804:5a30:4000::/32", "268754"}, - {"2a02:cbf7:2::/39", "61157"}, - {"2403:6e40:190::/44", "9830"}, - {"2a02:26f7:be01::/46", "20940"}, - {"2a02:26f7:e045::/46", "20940"}, - {"2001:559:87a8::/45", "7015"}, - {"240e:ff:a000::/36", "134764"}, - {"240e:6bd:1000::/30", "4134"}, - {"240e:a67:2600::/23", "4134"}, - {"2604:d600:60b::/45", "32098"}, - {"2620:11a:a032::/48", "43515"}, - {"2806:2f0:4721::/46", "17072"}, - {"2a00:86c0:2040::/47", "40027"}, - {"2a02:23c8:ff00::/40", "24592"}, - {"240a:a709::/32", "144451"}, - {"2602:feda:c0::/47", "43126"}, - {"2804:1408:8001::/35", "28635"}, - {"2804:2144:900::/37", "52795"}, - {"2001:559:875e::/48", "7922"}, - {"2001:fb0:1076::/47", "7470"}, - {"2400:cb00:172::/44", "13335"}, - {"240e:3b9:9c00::/34", "140310"}, - {"2600:1007:b1f2::/33", "22394"}, - {"2800:380::/32", "22927"}, - {"2804:7864::/32", "271239"}, - {"2a07:9a40:dcb::/29", "30081"}, - {"2a07:c500::/29", "48501"}, - {"2001:559:7af::/43", "7922"}, - {"2001:44b8:606a::/45", "7545"}, - {"2400:cd00:1037::/48", "38293"}, - {"240e:979:5e00::/40", "134770"}, - {"2603:c001:4010::/39", "31898"}, - {"2605:59c2:8000::/36", "36492"}, - {"2001:df3:7880::/48", "140583"}, - {"2406:840:4880::/47", "139317"}, - {"240a:a754::/32", "144526"}, - {"2600:1901:ffd0::/44", "15169"}, - {"2606:ae00:9c00::/40", "7287"}, - {"2804:69c4::/32", "270290"}, - {"2404:8d02:5000::/32", "9587"}, - {"2408:8957:100::/40", "17816"}, - {"2a02:26f7:d100::/48", "36183"}, - {"2a02:2e02:a30::/41", "12479"}, - {"2a02:5400:828::/48", "33353"}, - {"2001:4860:1026::/33", "15169"}, - {"2001:4d98::/34", "3303"}, - {"2408:8456:5200::/42", "17622"}, - {"240a:a6a3::/32", "144349"}, - {"2a01:8782::/29", "50343"}, - {"240a:a1b1::/32", "143083"}, - {"2a00:1d34::/33", "9121"}, - {"2a06:7a03::/48", "3170"}, - {"2a09:8740::/29", "35426"}, - {"240a:a97e::/32", "145080"}, - {"2001:67c:52c::/48", "49639"}, - {"2001:da8:4031::/46", "24353"}, - {"2408:8409:2400::/40", "4808"}, - {"240e:983:1201::/40", "4134"}, - {"2600:6c38:505::/44", "20115"}, - {"2804:437c:c000::/35", "267573"}, - {"2a03:1e80:ff9::/45", "8590"}, - {"2a0c:3b85::/32", "58057"}, - {"2001:559:1eb::/45", "33489"}, - {"2001:1ab0::/32", "29134"}, - {"2402:a00:6e::/40", "45916"}, - {"2605:4c40:244::/36", "30081"}, - {"2605:f440:5354::/37", "54874"}, - {"2803:6210::/32", "271904"}, - {"2804:1b2:4000::/41", "18881"}, - {"2804:680:600::/36", "262589"}, - {"2804:3e18::/32", "266573"}, - {"2a00:a920:a00::/32", "60486"}, - {"2a09:f880::/32", "52052"}, - {"2a0b:1306:400::/48", "198018"}, - {"2001:bf7:1360::/32", "44194"}, - {"2409:8b63::/27", "9808"}, - {"240e:f9:c000::/30", "134774"}, - {"2606:68c0::/32", "11722"}, - {"2620:3c:8080::/48", "54763"}, - {"2803:9800:a012::/42", "11664"}, - {"2a02:26f7:e404::/48", "36183"}, - {"2a06:1281:5::/48", "203943"}, - {"2001:559:8448::/48", "22909"}, - {"2001:4028::/29", "8798"}, - {"2408:8456:f040::/40", "17816"}, - {"2409:8914::/39", "56044"}, - {"240a:a35d::/32", "143511"}, - {"2602:feb4:40::/44", "25961"}, - {"2a06:8780::/32", "50629"}, - {"240a:a644::/32", "144254"}, - {"2605:9300:1::/48", "13768"}, - {"2806:203:f001::/48", "262916"}, - {"2a02:29ea:14::/48", "49604"}, - {"2a06:a001:a104::/48", "210384"}, - {"240a:ad51::/32", "146059"}, - {"2a02:2370:1::/45", "32787"}, - {"2600:6c10:f06b::/43", "20115"}, - {"2804:63cc::/32", "269384"}, - {"2a00:1cb0::/32", "44219"}, - {"2a01:5042:eff::/48", "202196"}, - {"2a06:a005:3::/45", "147028"}, - {"2a0b:ca80::/32", "57723"}, - {"2400:8480:1000::/48", "133385"}, - {"2407:1400:7::/40", "23752"}, - {"2409:40c1::/30", "55836"}, - {"2620:149:575::/40", "714"}, - {"2001:559:379::/48", "33652"}, - {"2600:140f:5c01::/38", "20940"}, - {"2602:807:d000::/44", "397736"}, - {"2804:14c:9d84::/41", "28573"}, - {"2a09:48c0::/29", "6735"}, - {"2402:1200:11::/39", "24523"}, - {"2408:8456:b840::/38", "17816"}, - {"2804:5f4::/32", "262983"}, - {"2804:6a74::/32", "270337"}, - {"2806:2f0:1183::/43", "22884"}, - {"2a02:1022::/32", "13128"}, - {"2a02:26f7:6c::/48", "36183"}, - {"2a04:15c0::/29", "34134"}, - {"2402:800:930f::/43", "7552"}, - {"2404:e80:b000::/33", "134697"}, - {"2405:9800:b41e::/40", "45430"}, - {"2a02:240::/44", "28812"}, - {"240e:44d:7f80::/41", "4134"}, - {"2620:186::/46", "396013"}, - {"2a01:8840:3e::/41", "12041"}, - {"2a0e:de80::/29", "200462"}, - {"2402:d400::/45", "17762"}, - {"2403:9800:c061::/43", "4648"}, - {"2406:d140:8000::/34", "49544"}, - {"2600:140b:ec01::/35", "20940"}, - {"2804:6048::/32", "269157"}, - {"2a03:85c1:925c::/48", "12085"}, - {"2404:bf40:85c1::/42", "139084"}, - {"2405:f080:2000::/36", "136907"}, - {"2409:4001:2000::/35", "55836"}, - {"2a0d:77c7:748a::/36", "7489"}, - {"2001:da8:202f::/48", "23910"}, - {"2a00:1e1c:4000::/30", "8896"}, - {"2a0a:c40:ffff::/48", "206304"}, - {"2001:559:839a::/48", "33287"}, - {"2001:67c:160::/48", "44238"}, - {"2001:7b0::/32", "8881"}, - {"2402:9900:111::/48", "27435"}, - {"2408:8459:5280::/42", "136959"}, - {"2620:74:10::/48", "11840"}, - {"2800:d300:5000::/30", "11830"}, - {"2a05:6744::/48", "3549"}, - {"240a:a7f8::/32", "144690"}, - {"2a01:190:15f::/48", "51454"}, - {"2a0f:6580:103::/48", "48292"}, - {"2a0f:85c1:240::/44", "206792"}, - {"2804:3118::/32", "264992"}, - {"2804:3448::/32", "265447"}, - {"2804:3a68::/32", "266087"}, - {"2a07:2781:a4a4::/29", "15490"}, - {"2a0f:9400:780a::/47", "147028"}, - {"2001:559:c361::/46", "33287"}, - {"2607:ff60:5002::/48", "397110"}, - {"2a02:26f0:dc01::/39", "20940"}, - {"2001:559:8277::/48", "7016"}, - {"240a:a2c4::/32", "143358"}, - {"240a:adb8::/32", "146162"}, - {"2804:51a4:4100::/34", "268467"}, - {"2804:80f0::/32", "272422"}, - {"2a01:5560::/32", "44128"}, - {"2a02:2368::/32", "50270"}, - {"2a04:3480::/29", "60783"}, - {"2a0d:900::/32", "59951"}, - {"2001:678:ea0::/48", "48992"}, - {"2400:dd09:1006::/30", "7497"}, - {"2606:6c00:100::/48", "32787"}, - {"2a01:250:f900::/37", "34511"}, - {"2401:d800:28c0::/42", "7552"}, - {"2403:4b40::/32", "137785"}, - {"2801:80:1f0::/48", "52996"}, - {"2803:9800:a8c7::/44", "11664"}, - {"2804:7c10::/32", "271473"}, - {"2a03:6505::/32", "6731"}, - {"2a03:8fa0:1000::/36", "17819"}, - {"2001:559:83b9::/48", "33657"}, - {"2001:559:8728::/48", "33657"}, - {"2401:d800:9780::/42", "7552"}, - {"240a:a1b0::/32", "143082"}, - {"2600:2a05::/28", "396319"}, - {"2605:e740::/40", "398710"}, - {"2606:2800:433::/45", "15133"}, - {"2804:720::/32", "262621"}, - {"2001:579:709c::/42", "22773"}, - {"2602:ff50:300::/37", "63452"}, - {"2804:4d3c:2e02::/35", "267420"}, - {"2a01:4da0::/48", "34895"}, - {"2001:1b88::/47", "39477"}, - {"2600:1003:b1b0::/41", "22394"}, - {"2606:2800:21f::/42", "15133"}, - {"2804:8064::/32", "271747"}, - {"2a03:b000:a00::/40", "25369"}, - {"2001:67c:25ec::/48", "207394"}, - {"240e:67e:e400::/39", "140330"}, - {"2600:1001:b130::/40", "22394"}, - {"2606:2800:4209::/48", "14210"}, - {"2607:f358:15::/48", "54500"}, - {"2a00:1748::/32", "44225"}, - {"2001:da8:1001::/42", "24361"}, - {"2400:fc00:4022::/44", "45773"}, - {"2800:3c0:8180::/33", "19863"}, - {"2a02:26f7:be40::/48", "36183"}, - {"2001:200:700::/36", "2500"}, - {"2804:3e90:8a01::/39", "266606"}, - {"2804:684c::/32", "269683"}, - {"2a03:7540:7541::/32", "44406"}, - {"2800:bf0:a805::/48", "52257"}, - {"2806:230:2007::/48", "11888"}, - {"2a01:280:380::/48", "212079"}, - {"2a01:7c0::/32", "12294"}, - {"2a02:4820::/32", "201964"}, - {"2409:805c:6100::/30", "9808"}, - {"2409:8752:100::/38", "56047"}, - {"2600:3300::/24", "398197"}, - {"2607:6004:e301::/48", "397378"}, - {"2620:171:d0::/48", "715"}, - {"2801:80:17c1::/43", "61580"}, - {"2400:9380:95c0::/44", "136167"}, - {"2605:6900::/32", "174"}, - {"2606:7c80:100::/48", "40300"}, - {"2606:a700::/35", "17378"}, - {"2803:1a00:1513::/33", "262186"}, - {"2a01:5042:7::/48", "202196"}, - {"2a02:26f7:f18d::/42", "20940"}, - {"2a04:1b00:8::/47", "61005"}, - {"2001:559:c45c::/48", "7922"}, - {"2001:67c:430::/48", "51523"}, - {"2001:df1:fe00::/48", "141107"}, - {"2001:559:547::/48", "7725"}, - {"240e:108:1170::/48", "134238"}, - {"2804:3e8:1100::/34", "28663"}, - {"2a01:8840:12::/45", "12041"}, - {"2804:c0c::/32", "52665"}, - {"2a02:970:471::/35", "44002"}, - {"2001:67c:18e4::/48", "199957"}, - {"2402:a300:800b::/36", "55427"}, - {"2407:9e40::/32", "210807"}, - {"2602:fe87::/36", "399693"}, - {"2605:a401:806c::/40", "33363"}, - {"2803:33a0::/32", "52471"}, - {"2a0c:4b80::/34", "197991"}, - {"2600:100d:b040::/42", "6167"}, - {"2001:559:71f::/48", "7922"}, - {"2001:df5:f00::/48", "24205"}, - {"2400:a980:3000::/40", "133513"}, - {"240e:37b:1a00::/34", "140330"}, - {"2602:ffe4:c50::/46", "21859"}, - {"2804:57c::/36", "262517"}, - {"2a09:be40:4501::/48", "209109"}, - {"2402:800:3455::/42", "7552"}, - {"240e:3b0:6400::/35", "140312"}, - {"2605:abc0::/32", "16436"}, - {"2804:7b10::/32", "271408"}, - {"2a00:8740:100::/48", "49037"}, - {"2a01:b160::/32", "50064"}, - {"2a06:6280::/29", "209390"}, - {"2a0e:dc0:3::/44", "63473"}, - {"2001:67c:768::/48", "210103"}, - {"2402:800:36d3::/44", "7552"}, - {"240a:a330::/32", "143466"}, - {"2404:bf40:ec02::/38", "139084"}, - {"2404:f4c0:fd00::/47", "131171"}, - {"2408:84f3:e410::/42", "134543"}, - {"240a:ae9e::/32", "146392"}, - {"2600:140b:3c01::/33", "20940"}, - {"2a0e:a900::/29", "208981"}, - {"240e:983:1901::/40", "4134"}, - {"2606:ae00:62a0::/37", "7287"}, - {"2804:18:18d0::/42", "10429"}, - {"2804:7aa0::/32", "271382"}, - {"2402:1200:9::/43", "24523"}, - {"2402:7481::/32", "134809"}, - {"240a:a44b::/32", "143749"}, - {"2a00:c8c0::/47", "44964"}, - {"2a07:4300:1610::/48", "209622"}, - {"2a07:dc40::/32", "34629"}, - {"2409:8002:1900::/37", "9808"}, - {"2409:896a:6300::/37", "9808"}, - {"2604:7fc0::/32", "17017"}, - {"2606:9280::/32", "30035"}, - {"2806:322:1500::/34", "28546"}, - {"2a00:8a01:8010::/44", "18666"}, - {"2401:4900:5070::/40", "45609"}, - {"240e:37f:2600::/32", "4134"}, - {"2804:574:4000::/32", "53013"}, - {"2804:3e50:8000::/36", "266587"}, - {"2001:43f8:df0::/47", "3970"}, - {"2401:47c0:1900::/38", "41095"}, - {"2409:8000:2800::/40", "56048"}, - {"2a02:2698:6400::/38", "56420"}, - {"2a0f:c084::/32", "199669"}, - {"2001:559:c042::/48", "33491"}, - {"2400:4620::/32", "149187"}, - {"2409:8004:3041::/43", "24547"}, - {"2600:370e:7000::/43", "32261"}, - {"2800:160:1d84::/44", "14259"}, - {"2804:22b4::/40", "264117"}, - {"2a01:6140::/32", "51164"}, - {"2a0d:7680::/29", "206576"}, - {"2a0d:e400::/32", "60363"}, - {"2001:44b8:2040::/47", "7545"}, - {"2401:7000:b000::/33", "45177"}, - {"2404:bf40:8002::/45", "7545"}, - {"2408:8256:3b69::/48", "17816"}, - {"2a07:3502:1120::/48", "21286"}, - {"2a0e:77c0:2099::/48", "213281"}, - {"2001:559:c296::/47", "7015"}, - {"2409:8057:380a::/45", "56040"}, - {"240a:adbe::/32", "146168"}, - {"2a02:26f0:1600::/48", "34164"}, - {"2a02:26f7:ce::/48", "36183"}, - {"2a02:d107:e002::/35", "197155"}, - {"2c0f:f5c0:3::/39", "29465"}, - {"2001:559:8687::/48", "33657"}, - {"2620:f0:4005::/44", "394699"}, - {"2804:cfc::/32", "262887"}, - {"2804:2144:8800::/34", "52795"}, - {"2a10:5fc0::/29", "213373"}, - {"2001:df6:1580::/48", "141745"}, - {"240a:a31c::/32", "143446"}, - {"240a:a391::/32", "143563"}, - {"2604:a400:b000::/33", "11320"}, - {"2804:5bdc:4::/32", "268873"}, - {"2a01:55e0::/30", "199938"}, - {"2a02:970:1012::/44", "44002"}, - {"2a02:5320:500::/40", "12189"}, - {"2a03:90c0:4a0::/41", "199524"}, - {"2a04:be20::/30", "47258"}, - {"2401:d800:50f0::/39", "7552"}, - {"2409:8907:6c20::/39", "24547"}, - {"2600:6c10:f099::/45", "20115"}, - {"2804:425c::/32", "267495"}, - {"2a0e:a380::/29", "207902"}, - {"2604:4e80::/32", "39964"}, - {"2804:765c::/32", "271106"}, - {"2001:550:90e::/38", "174"}, - {"2001:67c:294::/48", "47167"}, - {"2001:df1:4480::/48", "135986"}, - {"2001:c38:904b::/43", "9931"}, - {"2606:b840::/32", "397906"}, - {"2a0e:6902:2000::/36", "57695"}, - {"2401:4900:1c00::/46", "24560"}, - {"2408:8459:3210::/41", "17623"}, - {"2620:171:bb::/48", "42"}, - {"2804:2128::/32", "264539"}, - {"2a00:10c0::/32", "8758"}, - {"2001:dea:4001::/48", "7615"}, - {"2402:9500::/36", "55720"}, - {"2404:bf40:8501::/42", "139084"}, - {"2602:ffe4:c44::/47", "21859"}, - {"2800:d302:24::/46", "11830"}, - {"2803:d100:edc0::/38", "52362"}, - {"2409:8055:34::/48", "9808"}, - {"2a03:ac0::/32", "2128"}, - {"2001:678:510::/48", "42060"}, - {"2001:df4:6080::/48", "140967"}, - {"2401:3c00::/43", "38322"}, - {"2408:8459:1c30::/41", "17622"}, - {"240a:a9c4::/32", "145150"}, - {"2800:bf0:a0::/45", "52257"}, - {"2001:6d0:ffd8::/48", "8985"}, - {"2001:c20:48a2::/48", "9255"}, - {"2620:13e:7000::/47", "62621"}, - {"2a02:e981:1::/42", "19551"}, - {"2a09:ec00::/29", "39392"}, - {"240a:a78c::/32", "144582"}, - {"2603:803d::/32", "20001"}, - {"2604:4000:4000::/48", "32491"}, - {"2606:ab80::/32", "36001"}, - {"2804:2e8:a::/42", "262847"}, - {"2a0a:f640::/32", "213155"}, - {"2001:250:212::/48", "24349"}, - {"2001:559:86f9::/48", "33287"}, - {"2001:67c:2018::/48", "204296"}, - {"2408:8459:7610::/42", "17623"}, - {"2408:8656:2d00::/38", "17816"}, - {"2604:f80:3::/45", "22458"}, - {"2605:3dc0::/48", "397952"}, - {"2610:a0:4::/43", "7786"}, - {"2800:bf0:2a08::/42", "27947"}, - {"2804:36c4::/32", "266370"}, - {"2804:4ad8::/32", "267267"}, - {"2804:7bc8::/32", "271454"}, - {"2a01:5a8:9::/32", "8866"}, - {"2a05:96c0::/29", "47886"}, - {"2001:470:a5::/43", "6939"}, - {"2403:7f40:e001::/48", "57401"}, - {"240e:37f::/35", "140329"}, - {"2a09:2884::/48", "202316"}, - {"2001:250:7033::/48", "23910"}, - {"2001:559:85de::/48", "7015"}, - {"2804:745c::/32", "270976"}, - {"2a01:7d20:500::/40", "203645"}, - {"2409:8914:9a00::/40", "56044"}, - {"2600:6c20:e02::/45", "20115"}, - {"2604:d600:15ce::/43", "32098"}, - {"2804:2b2c::/32", "265139"}, - {"2804:713c::/32", "270776"}, - {"2a0b:2280::/32", "32931"}, - {"2001:44b8:308a::/45", "7545"}, - {"2a10:d580::/29", "51809"}, - {"2001:da8:b802::/48", "23910"}, - {"2610:a1:3058::/48", "12008"}, - {"2620:149:ae6::/48", "6185"}, - {"2a0e:97c6:d7::/44", "20473"}, - {"2604:d600:100d::/43", "32098"}, - {"2804:2388::/32", "264168"}, - {"2a0c:9a40:808e::/48", "60404"}, - {"2406:3000:11::/51", "4657"}, - {"240e:651:4000::/26", "4134"}, - {"2804:55fc::/32", "267969"}, - {"2a00:1e88:9::/32", "12389"}, - {"2a02:470::/32", "42303"}, - {"2c0f:f4a8:4000::/32", "37254"}, - {"2001:559:86d2::/47", "397601"}, - {"2001:4200:3401::/33", "2018"}, - {"240a:abeb::/32", "145701"}, - {"240a:afe0::/32", "146714"}, - {"2602:fc97:20::/44", "399544"}, - {"2a02:26f7:e10d::/42", "20940"}, - {"2a02:26f7:f408::/48", "36183"}, - {"2a05:4e40::/32", "49808"}, - {"2a06:1280:1000::/36", "44570"}, - {"2620:13a:5000::/44", "19755"}, - {"2806:2f0:10a3::/43", "17072"}, - {"2a0b:6b86:a00::/40", "200365"}, - {"2001:678:8fc::/48", "209520"}, - {"2408:80ea:75e0::/43", "17623"}, - {"240e:470::/32", "4134"}, - {"2001:520:1052::/48", "8103"}, - {"2001:df7:4b80::/48", "138754"}, - {"2404:b000:1000::/32", "4826"}, - {"2404:f4c0:a012::/37", "210320"}, - {"2408:8957:3b00::/40", "17816"}, - {"240a:a96f::/32", "145065"}, - {"2a00:5720::/32", "61015"}, - {"2a00:79e1:abc::/46", "36384"}, - {"2a00:a960::/32", "200161"}, - {"2a04:a500:1337::/48", "20769"}, - {"2a11:1d00::/29", "210983"}, - {"2001:df3:f900::/48", "137422"}, - {"2409:8914:a000::/39", "56044"}, - {"2803:22a0::/32", "266853"}, - {"2a00:f80::/38", "25542"}, - {"2a02:4880::/32", "12630"}, - {"2001:2092::/32", "3308"}, - {"2804:2d64::/32", "265279"}, - {"2a02:26f7:f7c0::/48", "36183"}, - {"2001:1248:9a7f::/40", "11172"}, - {"240a:a703::/32", "144445"}, - {"2a03:660::/32", "60117"}, - {"2a05:4100::/29", "204272"}, - {"2401:4900:6130::/41", "45609"}, - {"2600:1416:e000::/48", "25019"}, - {"2600:9000:113e::/41", "16509"}, - {"2607:a000::/32", "22799"}, - {"2620:1ec:1e::/42", "8075"}, - {"2804:52ac::/32", "268533"}, - {"2a00:1ca8:89::/48", "204963"}, - {"2a01:e35::/28", "12322"}, - {"2001:44b8:4056::/48", "7545"}, - {"2402:6940:1202::/37", "7645"}, - {"2806:36c::/32", "265615"}, - {"2a06:2d40::/47", "20473"}, - {"2001:559:8202::/48", "33667"}, - {"2001:559:c07c::/47", "33651"}, - {"2401:7140::/32", "136781"}, - {"2404:138:4004::/48", "9431"}, - {"2803:6900:1503::/48", "52423"}, - {"2804:33e4:200::/40", "265423"}, - {"2a01:8840:d6::/44", "12041"}, - {"2001:250:1408::/46", "24354"}, - {"2001:c20:48cc::/43", "9255"}, - {"240a:abd7::/32", "145681"}, - {"2604:2c80::/32", "6591"}, - {"2a10:ec0::/29", "207048"}, - {"2001:559:332::/47", "33650"}, - {"2001:dce:2::/48", "133745"}, - {"240e:6:d800::/44", "139721"}, - {"2602:107:2110::/48", "20115"}, - {"2804:50:2000::/32", "15830"}, - {"2401:4900:5d10::/41", "45609"}, - {"2402:800:93b7::/41", "7552"}, - {"2600:5c01:e0b::/35", "10796"}, - {"2607:ff38::/46", "22937"}, - {"2800:d302:15::/46", "11830"}, - {"2408:8756:2cf1::/46", "135061"}, - {"2620:aa:4000::/48", "26716"}, - {"2804:2d4:400::/38", "28244"}, - {"2600:8807:1fa2::/34", "22773"}, - {"2800:160:1769::/45", "14259"}, - {"2803:1a00:5413::/32", "262186"}, - {"2804:800::/32", "16509"}, - {"2a00:4802:2e0::/44", "13124"}, - {"2a02:26f0:d401::/40", "20940"}, - {"2a05:18c0::/29", "3257"}, - {"2001:ee0:e100::/40", "45899"}, - {"2603:c002:2010::/40", "31898"}, - {"2a02:26f7:ed09::/42", "20940"}, - {"2a0e:2c0::/29", "47755"}, - {"2402:bb00::/32", "23627"}, - {"2409:8948:8f00::/40", "24445"}, - {"240e:934::/28", "4134"}, - {"2a01:550::/32", "42579"}, - {"2001:559:136::/48", "33657"}, - {"2001:559:846d::/48", "7922"}, - {"2400:7400:e019::/48", "23736"}, - {"2400:8500:cbbd::/48", "7506"}, - {"2408:8459:410::/41", "17622"}, - {"2603:ff38::/29", "63023"}, - {"2803:5c80:5051::/46", "64114"}, - {"2409:8914:9b00::/40", "56044"}, - {"2a0a:9e00:a::/29", "61317"}, - {"2a0e:fd45:40f9::/48", "44103"}, - {"2602:feb4:1d0::/44", "25961"}, - {"2a03:9400::/48", "41938"}, - {"2404:cc00:2223::/32", "24441"}, - {"2600:370f:40a4::/46", "32261"}, - {"2a00:6060::/33", "60983"}, - {"2a04:f580:9010::/48", "4809"}, - {"2a05:7f80::/29", "201213"}, - {"2402:9e80:50::/48", "139058"}, - {"240a:a425::/32", "143711"}, - {"2602:ffdf:300::/40", "25851"}, - {"2602:fff6:6::/48", "8100"}, - {"2605:9d80:9052::/48", "4809"}, - {"2605:b100:1000::/39", "577"}, - {"2800:9a0:3100::/30", "14522"}, - {"2a03:3a40::/47", "199629"}, - {"2a11:11c0::/29", "56485"}, - {"2001:579:b114::/44", "22773"}, - {"2404:a640:13a::/32", "133827"}, - {"2620:34:e000::/48", "11195"}, - {"2804:9e0::/32", "262999"}, - {"2001:13b0:8016::/35", "3549"}, - {"2a0f:5701:3521::/48", "206499"}, - {"2001:678:8ec::/48", "41549"}, - {"2001:1248:9e22::/47", "11172"}, - {"2400:5300:3::/45", "45815"}, - {"2401:d800:5940::/42", "7552"}, - {"2620:13d:f000::/46", "22711"}, - {"2804:2ef4::/32", "264863"}, - {"2001:e60:87b8::/35", "4766"}, - {"2001:1248:5798::/42", "11172"}, - {"2401:f000:6::/48", "23838"}, - {"2a0e:5f00::/29", "47787"}, - {"2404:c0::/34", "23693"}, - {"240e:3b4:c800::/37", "4134"}, - {"2602:ff82::/48", "3064"}, - {"2804:7774::/32", "271179"}, - {"2600:8807:1f62::/40", "22773"}, - {"2800:160:1e51::/45", "14259"}, - {"2804:ef4:8004::/33", "28642"}, - {"2804:30d4::/32", "264975"}, - {"2804:6850::/32", "269684"}, - {"2806:267:1300::/37", "13999"}, - {"2a04:a580::/29", "12874"}, - {"2a0c:6a41:f231::/29", "30823"}, - {"2001:559:8358::/48", "21508"}, - {"2001:df5:1e80::/48", "137650"}, - {"240e:ff:c00a::/48", "134774"}, - {"2804:66c8::/33", "269582"}, - {"2a00:b840::/47", "31472"}, - {"2a0a:7e40:3::/29", "206056"}, - {"2406:9f40::/32", "133480"}, - {"2600:1488:6083::/41", "20940"}, - {"2804:2cac:eeef::/35", "265234"}, - {"2804:4fec::/32", "268358"}, - {"2001:fb1::/39", "17552"}, - {"2405:8500::/32", "55898"}, - {"2803:9400::/32", "27839"}, - {"2a0c:2480::/29", "201372"}, - {"2001:320::/32", "1237"}, - {"2001:67c:27f0::/48", "198650"}, - {"2408:80ea:6380::/41", "17622"}, - {"2409:806c:100::/35", "9808"}, - {"2607:b100::/32", "40555"}, - {"2804:2374::/32", "264163"}, - {"2806:10b7:2::/47", "8151"}, - {"2a00:1850:2a1::/48", "29357"}, - {"2a02:26f7:f248::/48", "36183"}, - {"2a0f:dfc0::/32", "60781"}, - {"2606:a000:3000::/36", "11955"}, - {"2a00:fb8:4d00::/34", "8881"}, - {"2a0a:5980::/29", "49544"}, - {"2001:559:7d8::/47", "7922"}, - {"240e:30d:5600::/30", "4134"}, - {"2801:12a::/48", "19429"}, - {"2a00:bec7:10::/47", "12946"}, - {"2001:1810:3000::/33", "30447"}, - {"2403:1cc0:1128::/48", "45352"}, - {"2803:c540::/32", "28049"}, - {"2a02:5ac0::/33", "48424"}, - {"2001:fd8::/41", "4775"}, - {"2403:27c0:1000::/48", "7586"}, - {"2a02:cb80:4240::/44", "43766"}, - {"2a03:7540:223::/33", "44406"}, - {"2a0a:3507:1::/48", "203038"}, - {"240a:a41a::/32", "143700"}, - {"2806:2f0:72e1::/46", "17072"}, - {"2a06:3000:2000::/29", "28715"}, - {"2a07:a905:ffe5::/44", "46261"}, - {"2001:df7:ec00::/48", "7575"}, - {"2001:19f0:4000::/37", "20473"}, - {"2400:cb00:a540::/46", "13335"}, - {"2407:a180::/47", "131758"}, - {"2600:6000:f0cc::/37", "12271"}, - {"2604:8200:1400::/38", "23089"}, - {"2804:1bbc::/32", "61746"}, - {"2a0a:a7c0::/29", "50966"}, - {"2a0b:7b00::/29", "206593"}, - {"2a0f:7540::/48", "49239"}, - {"2001:678:a50::/48", "24971"}, - {"240a:ab68::/32", "145570"}, - {"2a03:ae40:ff00::/40", "56511"}, - {"2c0f:fda8::/32", "37349"}, - {"2605:a400::/31", "33363"}, - {"2a0b:adc0::/29", "205243"}, - {"2401:10c0::/32", "131717"}, - {"2402:b400:4628::/32", "45960"}, - {"2605:e300::/32", "5009"}, - {"2607:f778:b100::/33", "32035"}, - {"2001:938:4044::/43", "8437"}, - {"2001:df1:cd00::/48", "135425"}, - {"2402:800:387f::/40", "7552"}, - {"2605:e200::/32", "18451"}, - {"2620:1ec:28::/47", "8068"}, - {"2803:1100::/32", "60022"}, - {"2804:4844::/32", "267108"}, - {"2804:6670::/32", "269558"}, - {"2001:43a8::/32", "22351"}, - {"2401:d800:5680::/42", "7552"}, - {"2a02:26f7:db10::/48", "36183"}, - {"2a02:c0c0::/29", "25520"}, - {"2806:261:418::/40", "13999"}, - {"2a02:26f7:b688::/48", "36183"}, - {"2a04:2e80:8::/48", "25106"}, - {"2a04:4e40:9800::/48", "54113"}, - {"2001:559:26c::/48", "33660"}, - {"2401:f040::/32", "45828"}, - {"2605:af00::/32", "21782"}, - {"2620:32:c000::/44", "53869"}, - {"2800:160:1fda::/42", "14259"}, - {"2001:67c:8ac::/48", "43183"}, - {"2408:8456:6840::/39", "17816"}, - {"2408:84f3:f820::/43", "17816"}, - {"240a:ac38::/32", "145778"}, - {"2806:2f0:50c3::/42", "17072"}, - {"2a05:1083:fec0::/44", "209870"}, - {"2001:67c:728::/48", "198837"}, - {"2001:df0:2400::/48", "7713"}, - {"2409:805c::/46", "9808"}, - {"2600:370f:74e5::/43", "32261"}, - {"2804:e28::/40", "52547"}, - {"2a02:ee80:420d::/46", "3573"}, - {"2001:57a:501::/46", "22773"}, - {"2400:cb00:a570::/47", "13335"}, - {"2408:8256:2d97::/44", "17623"}, - {"2620:115:40ff::/48", "3145"}, - {"2804:14c:f285::/44", "28573"}, - {"2a0c:e643:babe::/48", "213316"}, - {"2409:8069:2b08::/40", "9808"}, - {"2600:6c20:220::/41", "20115"}, - {"2620:10d:d004::/47", "15101"}, - {"2800:490:c000::/36", "27951"}, - {"2a02:26f0:cf00::/48", "34164"}, - {"2a02:26f7:ce88::/48", "36183"}, - {"2804:3d90:8103::/33", "266539"}, - {"2a00:f0e0:41::/42", "198499"}, - {"2001:df1:800::/48", "59253"}, - {"240a:ab40::/32", "145530"}, - {"2804:1648::/32", "263278"}, - {"240a:a9ac::/32", "145126"}, - {"2602:fcd3:100::/48", "212934"}, - {"2602:feb4:b0::/44", "25961"}, - {"2a02:6620:2::/48", "47478"}, - {"2a0c:b641:650::/48", "212963"}, - {"2001:648:2300::/46", "8248"}, - {"2605:3f40::/32", "15054"}, - {"2804:738::/32", "53153"}, - {"2a09:c5c0::/32", "205718"}, - {"2a0a:6040:407e::/48", "209870"}, - {"2001:df6:8100::/47", "137670"}, - {"240e:438:2e40::/35", "4134"}, - {"2600:80a:422::/48", "55228"}, - {"2602:feda:adf::/48", "140362"}, - {"2606:ae80:1c40::/44", "25751"}, - {"2620:8f:4001::/48", "293"}, - {"2800:bf0:3bc0::/48", "52257"}, - {"2a02:2370:f000::/48", "32787"}, - {"2401:880::/32", "45630"}, - {"2403:e840:8000::/33", "141768"}, - {"2405:8a00:203a::/41", "55824"}, - {"2409:8d35::/28", "9808"}, - {"2600:1007:9010::/40", "22394"}, - {"2607:2c00::/32", "14265"}, - {"2001:559:844c::/48", "7016"}, - {"2400:cb00:a742::/45", "13335"}, - {"2604:8200:5::/48", "23089"}, - {"2804:490:8600::/40", "265705"}, - {"2a01:6480:20::/48", "29049"}, - {"2001:678:770::/48", "201836"}, - {"2407:8100:3::/48", "58436"}, - {"240a:a2cb::/32", "143365"}, - {"240e:267:8000::/38", "140336"}, - {"2607:f740:e635::/44", "63911"}, - {"2804:3180::/38", "265019"}, - {"2a02:26f7:da04::/48", "36183"}, - {"2001:250:6808::/48", "138373"}, - {"2607:ff00:900::/40", "46385"}, - {"2620:a0:4001:1::/46", "55064"}, - {"2a00:f600::/32", "34946"}, - {"2001:678:ecc::/48", "25304"}, - {"2001:559:3b4::/48", "7015"}, - {"2401:8a40:54::/44", "45326"}, - {"2a02:26f7:bf91::/42", "20940"}, - {"2a04:7d00::/29", "3209"}, - {"2a09:4c2:4b::/29", "58057"}, - {"2a0e:97c3:5a7::/48", "20473"}, - {"2a11:5900::/29", "211199"}, - {"2407:5600::/32", "45186"}, - {"2620:134:6004::/47", "397726"}, - {"2804:5524::/32", "268692"}, - {"2806:2f0:6183::/42", "17072"}, - {"2a01:9aa0::/32", "200999"}, - {"2c0f:ef18::/34", "328266"}, - {"2001:df1:1d00::/48", "136547"}, - {"2001:df2:c100::/48", "55306"}, - {"2803:2a01:8400::/48", "27895"}, - {"2804:640:102::/43", "262713"}, - {"2804:3268:9003::/33", "265076"}, - {"2a02:26f7:c0c5::/46", "20940"}, - {"2a04:4e40:1220::/44", "54113"}, - {"2a0e:97c0:2ea::/48", "211544"}, - {"2001:510:303::/45", "376"}, - {"2001:67c:89c::/48", "210731"}, - {"2600:1901:bdd0::/44", "396982"}, - {"2804:8604::/35", "272614"}, - {"2a03:720:19::/32", "57073"}, - {"2402:2000:6001::/35", "24350"}, - {"240a:3:bcc::/48", "9605"}, - {"2600:1407:17::/48", "35994"}, - {"2803:9800:b8ce::/47", "11664"}, - {"2804:85ac::/32", "272594"}, - {"2a06:40c0::/29", "201933"}, - {"2409:8028:8f0::/48", "9808"}, - {"240a:a31b::/32", "143445"}, - {"2804:1214::/32", "263455"}, - {"2a00:1558::/32", "29311"}, - {"2001:44c8::/39", "45430"}, - {"2400:c700:181::/45", "55644"}, - {"2402:800:570f::/43", "7552"}, - {"2409:8904:4c60::/39", "24547"}, - {"240e:267:3000::/38", "140331"}, - {"2600:c04:1024::/32", "10912"}, - {"2800:440:9000::/42", "27738"}, - {"2804:43f4::/42", "267601"}, - {"2a07:a347::/32", "47447"}, - {"2a09:7100::/29", "20676"}, - {"2001:df5::/48", "58869"}, - {"2804:4670::/32", "266989"}, - {"2a02:4540::/41", "197207"}, - {"2a07:e380::/29", "203561"}, - {"2a0e:b107:5d0::/42", "20473"}, - {"2001:1260:400::/40", "28532"}, - {"2001:4c90::/29", "35612"}, - {"240e:966:e400::/39", "133775"}, - {"2620:12f:2000::/40", "32726"}, - {"2620:171:df::/48", "715"}, - {"2804:393c::/32", "266020"}, - {"2c0f:fe08:105::/43", "36914"}, - {"2600:6c10:9e::/42", "20115"}, - {"2804:1ea0::/32", "264440"}, - {"2001:5a0:3604::/36", "6453"}, - {"2001:67c:2308::/48", "39538"}, - {"240a:a334::/32", "143470"}, - {"240a:ad0f::/32", "145993"}, - {"2604:e200::/32", "40237"}, - {"2a02:26f7:f005::/46", "20940"}, - {"2001:4d0:241c::/33", "297"}, - {"2001:559:29::/48", "33660"}, - {"2001:559:858f::/48", "33651"}, - {"2001:1900:2268::/48", "10753"}, - {"2600:3001:1111::/30", "13649"}, - {"2600:6c10:11f::/41", "20115"}, - {"2a09:50c0::/48", "34775"}, - {"2a00:1e70::/30", "50858"}, - {"2a01:7080:17::/42", "42848"}, - {"2a02:26f0:4a01::/40", "20940"}, - {"2001:559:c502::/48", "7015"}, - {"2001:948:40::/43", "39590"}, - {"2401:5f40::/32", "38004"}, - {"2402:7800::/38", "4826"}, - {"2804:523c::/32", "268504"}, - {"2001:da8:a805::/44", "24370"}, - {"2405:5e00::/32", "3257"}, - {"2408:8001:3010::/44", "17622"}, - {"2602:ff96:12::/48", "40676"}, - {"2803:1860:1000::/39", "267823"}, - {"2a0e:da40:140::/44", "147173"}, - {"2001:559:83e5::/48", "33668"}, - {"2001:df0:5e00::/48", "135046"}, - {"2001:4130:50f1::/48", "29067"}, - {"2a0e:6a80::/29", "44486"}, - {"2001:df0:4940::/48", "58965"}, - {"2405:9800:b41d::/48", "133481"}, - {"2620:51:a000::/48", "395730"}, - {"2804:814c::/32", "272445"}, - {"2a05:8e40::/29", "198710"}, - {"2a0b:4580::/32", "20860"}, - {"240a:a5cd::/32", "144135"}, - {"2620:0:2b30::/44", "50"}, - {"2800:160:199b::/45", "14259"}, - {"2804:700c::/32", "270703"}, - {"2806:20d:5025::/44", "32098"}, - {"2001:678:630::/48", "197574"}, - {"2001:df6:c880::/48", "136906"}, - {"240a:a00e::/32", "142664"}, - {"2604:d600:c14::/44", "32098"}, - {"2a00:e460::/32", "62251"}, - {"2a02:26f0:e401::/39", "20940"}, - {"240a:a795::/32", "144591"}, - {"2a00:65c0:2::/32", "25156"}, - {"2001:559:5e1::/46", "22909"}, - {"2001:559:c4f0::/48", "20214"}, - {"2001:128c::/37", "25933"}, - {"2408:8459:9850::/38", "17816"}, - {"2a03:e140:32::/48", "48327"}, - {"2001:559:86db::/48", "33660"}, - {"2001:559:c347::/48", "33651"}, - {"2001:e60:a888::/33", "4766"}, - {"2402:800:78b0::/39", "7552"}, - {"2404:2280:10d::/48", "24429"}, - {"240a:aa78::/32", "145330"}, - {"240e:85:8000::/37", "137691"}, - {"2600:6000:fd84::/38", "12271"}, - {"2604:d600:685::/44", "32098"}, - {"2620:123:5000::/40", "16519"}, - {"2801:120::/32", "27790"}, - {"2001:44b8:4055::/48", "4739"}, - {"2406:3003:3050::/32", "4657"}, - {"2406:e1c0::/45", "141459"}, - {"240e:838:10::/42", "4134"}, - {"2a01:8840:e1::/48", "207266"}, - {"2001:559:8243::/48", "33659"}, - {"2603:90b5::/32", "11955"}, - {"2804:3d5c::/32", "266526"}, - {"2804:59a4::/32", "268715"}, - {"2a04:880:afff::/29", "43623"}, - {"2001:250:5873::/48", "24363"}, - {"2001:559:312::/48", "33287"}, - {"2404:bf40:a542::/42", "139084"}, - {"2600:1406:33::/48", "35994"}, - {"2804:6908:2000::/38", "270244"}, - {"2a05:4540::/29", "35041"}, - {"2a05:e740:162::/48", "29108"}, - {"2a07:6d80::/29", "59891"}, - {"2a0e:b107:13c0::/44", "211242"}, - {"240a:a62f::/32", "144233"}, - {"2602:fc23:14::/48", "38308"}, - {"2607:f5b5::/46", "7203"}, - {"2804:1024::/32", "263620"}, - {"2804:4cf8::/35", "267404"}, - {"2a02:26f7:e511::/46", "20940"}, - {"2a10:b9c0::/32", "211623"}, - {"2001:1b18::/32", "21385"}, - {"2409:8054:68::/48", "9808"}, - {"240e:44d:7680::/41", "4134"}, - {"2600:9000:11a5::/43", "16509"}, - {"2a06:9500::/45", "204028"}, - {"2401:c500:fd06::/44", "54994"}, - {"2404:3d00:400::/40", "21433"}, - {"240e:3b8:2200::/37", "136198"}, - {"2600:1008:b130::/44", "22394"}, - {"2a04:9a00:1110::/46", "208153"}, - {"2001:559:8077::/48", "20214"}, - {"2001:df6:3380::/48", "141884"}, - {"2408:8957:7c00::/40", "17622"}, - {"2606:5580:2::/38", "63242"}, - {"2607:f6f0:a000::/46", "16553"}, - {"2a0a:a3c0:b0::/44", "3320"}, - {"2001:1a68:19::/46", "57367"}, - {"2407:7a00::/32", "24187"}, - {"2602:ffce::/42", "63019"}, - {"2a02:26f7:bcc4::/48", "36183"}, - {"2a03:5a00:3d::/48", "200503"}, - {"2406:840:e1ec::/48", "141237"}, - {"2604:cd00::/32", "7352"}, - {"2803:6900:533::/45", "52423"}, - {"2001:559:52c::/48", "7016"}, - {"2001:678:c14::/48", "5588"}, - {"2001:448a:5150::/34", "7713"}, - {"240e:438:4420::/43", "140647"}, - {"2a00:1be0::/32", "21034"}, - {"2a03:a4e0::/40", "50304"}, - {"2001:559:1de::/47", "33651"}, - {"2001:18c8:700::/41", "18982"}, - {"2401:b780:5004::/44", "45410"}, - {"240e:438:7240::/37", "4134"}, - {"2a04:100:3000::/29", "49223"}, - {"2a04:c100::/29", "210625"}, - {"2402:8100:2550::/44", "55644"}, - {"2800:484:c100::/40", "10620"}, - {"2a00:11c0:df::/48", "42473"}, - {"2a01:a000::/32", "47474"}, - {"2001:e48:44:5::/46", "9583"}, - {"2405:b40:707::/32", "55674"}, - {"2405:9800:b500::/38", "133481"}, - {"2408:8956:2840::/40", "17622"}, - {"2620:11:e000::/48", "33496"}, - {"2804:3d28:9::/48", "262664"}, - {"2a02:26f7:cb80::/48", "36183"}, - {"2001:1221::/48", "28496"}, - {"2400:d400:1008::/48", "45671"}, - {"2001:df0:a900::/48", "45701"}, - {"2403:a3c0:4::/32", "131600"}, - {"2408:80f1:160::/43", "138421"}, - {"2600:1f18::/33", "14618"}, - {"2a00:6901:1005::/48", "20926"}, - {"2a02:2ae8:8110::/33", "702"}, - {"2001:678:5c0::/48", "206883"}, - {"2404:0:5ffa::/45", "24154"}, - {"2405:6e00:240::/40", "133612"}, - {"2a04:b80:1::/48", "42160"}, - {"2001:250:3427::/48", "138438"}, - {"2605:6440:5004::/34", "396356"}, - {"2001:559:c2df::/48", "33491"}, - {"2001:67c:13d4::/48", "51496"}, - {"2a02:26f7:f3c4::/48", "36183"}, - {"2606:2800:401c::/48", "14153"}, - {"2400:7400:63::/48", "23736"}, - {"2404:ae00:17::/44", "45474"}, - {"240a:a56f::/32", "144041"}, - {"2602:fc52:356::/48", "399888"}, - {"2607:fc28:9000::/33", "22911"}, - {"2804:6540::/32", "269478"}, - {"2a02:26f0:9c01::/39", "20940"}, - {"2a0d:4280::/29", "204630"}, - {"2001:559:80a3::/48", "33668"}, - {"2001:da8:21b::/48", "23910"}, - {"2001:da8:5000::/45", "24360"}, - {"2001:4cc8::/31", "31246"}, - {"2400:a980:f00::/40", "133111"}, - {"2607:9b80:420::/39", "46558"}, - {"2a04:b880::/48", "43578"}, - {"2a05:3580:fc00::/29", "35807"}, - {"2001:559:82a0::/48", "7922"}, - {"2604:d600:914::/44", "32098"}, - {"2606:8fc0::/32", "17234"}, - {"2001:559:3da::/48", "7016"}, - {"2605:dd40:8580::/36", "398549"}, - {"2620:13b::/48", "7034"}, - {"2804:250c:c400::/34", "264255"}, - {"2806:230:3019::/48", "11888"}, - {"2401:7400::/38", "4773"}, - {"2600:1480:8000::/40", "33905"}, - {"2804:204:222::/47", "28186"}, - {"2806:230:4036::/48", "265594"}, - {"2a00:f826:8::/48", "200462"}, - {"2001:938:4027::/44", "8437"}, - {"2404:6380:8001::/48", "18257"}, - {"2408:8256:327c::/48", "17816"}, - {"2804:2af4::/32", "265127"}, - {"2804:2d04::/32", "265257"}, - {"2806:2a0:8f1::/44", "28548"}, - {"2001:559:c20c::/48", "13367"}, - {"2408:840d:6a00::/42", "17621"}, - {"240c:ca21::/32", "24363"}, - {"2a0e:8840::/29", "48627"}, - {"2620:192:3::/36", "6461"}, - {"2804:79f0::/32", "271337"}, - {"2a02:f2c0::/29", "208704"}, - {"2001:1ba8::/29", "50821"}, - {"2401:c5c0:dfb::/45", "55492"}, - {"240a:a4da::/32", "143892"}, - {"2607:fd48:3000:100::/32", "13536"}, - {"2401:d800:b7d0::/36", "7552"}, - {"2806:3d4::/32", "265586"}, - {"2a02:6ea0:1300::/40", "212238"}, - {"2001:388:406d::/35", "7575"}, - {"2001:559:c3d4::/48", "7015"}, - {"2001:67c:2178::/48", "29298"}, - {"2405:9800:f010::/36", "45430"}, - {"240a:aa2b::/32", "145253"}, - {"2405:1c0:6141::/46", "55303"}, - {"2803:5180::/32", "263762"}, - {"2a02:b50:4013::/48", "393954"}, - {"2a02:26f7:f681::/46", "20940"}, - {"2a0c:6d00:85::/48", "3218"}, - {"240a:a39d::/32", "143575"}, - {"240a:af39::/32", "146547"}, - {"2a00:1a28:1157::/48", "63473"}, - {"2a07:59c6:ee00::/40", "56382"}, - {"2a10:5d00::/29", "208256"}, - {"2a10:c941:10:b::/61", "35277"}, - {"240a:a5fc::/32", "144182"}, - {"240a:ad3d::/32", "146039"}, - {"2801::/48", "52224"}, - {"2801:16:a800::/48", "27817"}, - {"2606:a600:5000::/34", "23005"}, - {"2a00:9400::/32", "52063"}, - {"2a03:7080::/32", "25387"}, - {"2001:678:688::/48", "8283"}, - {"2001:df0:b500::/47", "61327"}, - {"240a:a9e2::/32", "145180"}, - {"240a:adf3::/32", "146221"}, - {"2804:6c0:800::/43", "262418"}, - {"2001:559:80da::/47", "33287"}, - {"2800:2b0::/32", "14232"}, - {"2804:3924::/32", "266014"}, - {"2804:4ae4:1244::/32", "267270"}, - {"2a06:a000:1e2::/48", "206804"}, - {"2a0f:3680::/32", "211476"}, - {"2001:4178::/29", "15456"}, - {"2600:1402:1401::/36", "20940"}, - {"2804:20dc:b000::/33", "264517"}, - {"2803:e600:7::/43", "18809"}, - {"2a02:26f7:eac9::/46", "20940"}, - {"2a02:e980:18d::/43", "19551"}, - {"2001:df7:c500::/48", "139943"}, - {"2408:8459:a030::/41", "17622"}, - {"2600:1011:f010::/39", "6167"}, - {"2602:107:1310::/48", "33363"}, - {"2804:1cf0::/32", "61684"}, - {"2804:3304::/32", "265111"}, - {"2a04:7d84::/32", "41110"}, - {"2a0c:b641:470::/44", "208029"}, - {"2a0d:4bc0::/29", "8888"}, - {"2001:559:c36e::/48", "7015"}, - {"2401:d800:59a0::/41", "7552"}, - {"2800:9f0::/32", "27845"}, - {"2600:7c00::/28", "15344"}, - {"2620:10a:b000::/47", "15297"}, - {"2a02:26f7:f389::/46", "20940"}, - {"2a09:8880::/36", "56690"}, - {"2a09:9340::/29", "209824"}, - {"2a0d:82c0::/31", "47787"}, - {"2001:520:1014::/47", "8103"}, - {"2001:559:720::/48", "21508"}, - {"2606:9a00::/32", "31845"}, - {"2804:14d:a281::/41", "28573"}, - {"2001:559:8478::/47", "7922"}, - {"2600:9000:2029::/45", "16509"}, - {"2604:af80:2848::/32", "18859"}, - {"2620:63:e000::/48", "13731"}, - {"2804:49fc::/32", "267212"}, - {"2a04:ac00:b::/48", "3180"}, - {"2a01:b140::/29", "24940"}, - {"2001:480:253::/48", "228"}, - {"2001:559:805f::/48", "7016"}, - {"2001:67c:12e0::/48", "206351"}, - {"2405:4cc0::/32", "139671"}, - {"2605:9780:1000::/40", "36180"}, - {"2605:dd40:8207::/44", "398549"}, - {"2620:149:14c::/46", "714"}, - {"2804:1efc:7000::/36", "264458"}, - {"2409:805c:2c00::/35", "9808"}, - {"240a:a708::/32", "144450"}, - {"240a:aa56::/32", "145296"}, - {"2606:c700::/33", "53850"}, - {"2607:fdf0:5e09::/43", "8008"}, - {"2a04:3640::/29", "49784"}, - {"2001:1388:8461::/44", "6147"}, - {"2403:5200::/32", "18049"}, - {"2600:5c01:2c0d::/39", "10796"}, - {"2610:130:200::/35", "6122"}, - {"2409:8051::/47", "56047"}, - {"240a:acb3::/32", "145901"}, - {"240e:108:11a1::/46", "4812"}, - {"2600:100d:be00::/44", "6167"}, - {"2804:70e0::/33", "270753"}, - {"2408:840c:8200::/40", "17621"}, - {"240e:18::/44", "4812"}, - {"2801:16e:2::/48", "19429"}, - {"2001:250:2824::/47", "23910"}, - {"2607:9b80:8000::/35", "46558"}, - {"2804:2c00::/32", "265187"}, - {"2804:63e8::/32", "269391"}, - {"2001:559:c1a3::/48", "33668"}, - {"2404:7e00::/32", "38493"}, - {"240a:ad44::/32", "146046"}, - {"2a01:358:4b11::/35", "9121"}, - {"2a0e:b107:bf0::/47", "140938"}, - {"2408:8459:aa10::/42", "17623"}, - {"2409:8087:1800::/39", "134810"}, - {"240a:71:8000::/35", "2497"}, - {"2605:f440:5652::/47", "50555"}, - {"2a01:270:e003::/36", "29657"}, - {"2a05:4143::/32", "212271"}, - {"2001:559:c1a2::/48", "33287"}, - {"2401:d800:5b0::/41", "7552"}, - {"2800:484:e500::/40", "10620"}, - {"2001:559:8463::/48", "33287"}, - {"2001:5b0:4ede::/35", "6621"}, - {"240a:a819::/32", "144723"}, - {"240a:a862::/32", "144796"}, - {"240c:6:4::/28", "45275"}, - {"240e:9b:f02d::/46", "140260"}, - {"2620:6c:40c0::/48", "32"}, - {"2804:2d80:d00d::/34", "262378"}, - {"2a0a:a2c0:2::/29", "205992"}, - {"2a0c:1940::/43", "60354"}, - {"2a0c:ffc0::/48", "57342"}, - {"2001:77c::/32", "5479"}, - {"2604:d600:15df::/42", "32098"}, - {"2804:29f0::/32", "264046"}, - {"2a0e:46c3:800::/40", "213392"}, - {"2001:559:c356::/47", "33287"}, - {"2001:18b8:a::/42", "29789"}, - {"2402:800:9963::/43", "7552"}, - {"2402:d000:8f01::/33", "9329"}, - {"2408:822a:a800::/31", "4837"}, - {"240a:afc5::/32", "146687"}, - {"2a05:1140::/29", "59890"}, - {"2001:da8:246::/48", "24349"}, - {"2a0f:380::/29", "206766"}, - {"2001:1520:a::/40", "8972"}, - {"2001:1a11:113::/45", "42298"}, - {"240e:e1:9700::/36", "4812"}, - {"2804:6674::/32", "269559"}, - {"2408:8459:e430::/41", "17622"}, - {"2a00:1358:df01::/34", "6866"}, - {"2a02:26f7:d1::/48", "20940"}, - {"2a02:2e02:30b0::/41", "12479"}, - {"2a03:db80:4814::/48", "60824"}, - {"2607:f180:5200::/34", "35908"}, - {"2620:103:e028::/47", "13893"}, - {"2803:d100:ec40::/42", "52362"}, - {"2a02:26f7:c010::/48", "36183"}, - {"2a02:26f7:c151::/42", "20940"}, - {"2001:13d8::/32", "3790"}, - {"2001:4de0:2102::/45", "33438"}, - {"2600:140b:1001::/38", "20940"}, - {"2600:1806:420::/48", "16552"}, - {"2804:828:91::/32", "262354"}, - {"2a02:26f7:dfc5::/46", "20940"}, - {"2a02:2e02:900::/40", "12479"}, - {"240a:a171::/32", "143019"}, - {"240e:85c::/44", "131285"}, - {"2620:13d:d01c::/48", "3356"}, - {"2a01:1b8::/45", "1257"}, - {"2a02:44a0::/43", "61955"}, - {"2404:7c00::/47", "45650"}, - {"2409:8924:4100::/38", "56046"}, - {"240e:3bd:d000::/36", "134772"}, - {"2a00:8a84:27f0:f::/32", "29119"}, - {"2a02:ad8::/43", "12389"}, - {"2605:1980::/48", "13951"}, - {"2a02:26f7:b3c1::/46", "20940"}, - {"2401:4900:3d30::/44", "45609"}, - {"2402:800:5d55::/42", "7552"}, - {"240a:a986::/32", "145088"}, - {"240a:ad62::/32", "146076"}, - {"2804:62e4:facf::/37", "269326"}, - {"2a01:8f40::/32", "59472"}, - {"2a02:26f7:c084::/48", "36183"}, - {"2001:559:120::/48", "7015"}, - {"2001:2004::/28", "1299"}, - {"2409:8924:1300::/37", "56046"}, - {"240a:add8::/32", "146194"}, - {"2603:90f5:2::/44", "11426"}, - {"2804:801c::/32", "271730"}, - {"2a06:6880:800::/29", "209620"}, - {"2a0b:e0c0::/29", "41206"}, - {"2a0c:f700::/29", "206119"}, - {"2001:df2:7e01::/48", "135526"}, - {"2402:7780:2::/32", "132933"}, - {"2604:6040:80::/48", "53698"}, - {"2402:8100:12::/47", "45271"}, - {"2600:380:ec00::/44", "20057"}, - {"2605:7c0:1003::/48", "19382"}, - {"2800:10:11::/48", "27750"}, - {"2804:8584::/32", "272584"}, - {"2402:800:7270::/40", "7552"}, - {"240a:ad4b::/32", "146053"}, - {"240e:698:4b00::/40", "133774"}, - {"2600:100f:d000::/42", "6167"}, - {"2600:8807:1f82::/42", "22773"}, - {"2801:80:3460::/44", "268766"}, - {"2a02:26f7:d2::/48", "36183"}, - {"2408:80ea:7780::/43", "17623"}, - {"2804:4360::/32", "267566"}, - {"2804:4b20::/32", "267285"}, - {"2a02:26f7:d18c::/48", "36183"}, - {"2001:df3:900::/48", "135905"}, - {"240a:a839::/32", "144755"}, - {"2804:14d:4200::/40", "28573"}, - {"2806:230:201a::/48", "265594"}, - {"2001:da8:5853::/48", "24363"}, - {"2001:44b8:3080::/48", "7545"}, - {"2600:1406:9000::/48", "35994"}, - {"2804:6b68::/32", "270398"}, - {"2a02:ff0:3d00::/40", "12735"}, - {"2a02:26f0:5400::/48", "34164"}, - {"2001:388:c::/48", "23859"}, - {"2001:559:810d::/48", "21508"}, - {"2001:1248:5659::/42", "11172"}, - {"2409:8924:c700::/30", "56046"}, - {"240a:a92f::/32", "145001"}, - {"2800:bf0:3420::/44", "52257"}, - {"2804:631c::/32", "269339"}, - {"2804:83a8::/32", "272210"}, - {"2001:559:815d::/48", "33491"}, - {"2001:67c:200c::/48", "51408"}, - {"240a:a34b::/32", "143493"}, - {"240e:44d:7400::/42", "140345"}, - {"240e:947::/36", "139887"}, - {"2607:f220:50a::/48", "5766"}, - {"2804:2314::/47", "262811"}, - {"2a02:26f0:108::/46", "20940"}, - {"240a:a298::/32", "143314"}, - {"2602:fc1f::/36", "46887"}, - {"2a04:4e40:2810::/41", "54113"}, - {"2001:1388:1c::/39", "6147"}, - {"2402:800:95b7::/41", "7552"}, - {"2604:a880:800::/48", "14061"}, - {"2803:2f80:feab::/39", "61503"}, - {"2a02:26f7:c895::/46", "20940"}, - {"2a04:88c0::/48", "60781"}, - {"2a04:a000::/29", "59630"}, - {"2a12:5800::/29", "52177"}, - {"2001:559:245::/48", "22909"}, - {"2408:8957:6d00::/40", "17816"}, - {"2a01:5620::/29", "29396"}, - {"2a02:ed00::/31", "50304"}, - {"2a06:9087:ffff::/48", "203271"}, - {"2a06:a001:a0d0::/44", "213234"}, - {"2001:a98:31::/40", "8517"}, - {"2401:4900:5360::/40", "45609"}, - {"2604:d600:1603::/43", "32098"}, - {"2804:14d:9800::/40", "28573"}, - {"2a02:26f7:e9c1::/46", "20940"}, - {"2a03:a000::/32", "13009"}, - {"2403:300:1c2a::/40", "714"}, - {"2403:44c0:3::/48", "135814"}, - {"2800:bf0:80c3::/45", "52257"}, - {"2a02:5400:820::/48", "33353"}, - {"2001:559:87f4::/48", "7015"}, - {"2402:800:38c5::/43", "7552"}, - {"240e:45c:1f00::/40", "137401"}, - {"2602:fe31::/36", "32281"}, - {"2606:2800:4a50::/47", "15133"}, - {"2804:3244:26::/47", "265066"}, - {"2001:67c:1138::/48", "57288"}, - {"2620:0:e10::/48", "40387"}, - {"2804:29e8::/32", "264043"}, - {"2a00:800::/38", "1257"}, - {"2001:67c:558::/48", "202060"}, - {"2001:7fb:fe18::/48", "12654"}, - {"2001:df4:d600::/48", "45900"}, - {"240e:37a:aa00::/39", "140330"}, - {"2600:9000:202f::/48", "16509"}, - {"2804:170::/33", "28131"}, - {"2402:2000::/33", "24350"}, - {"2607:fdb8:2000::/33", "30496"}, - {"2800:bf0:800b::/45", "52257"}, - {"2a04:9a01:1000::/36", "34663"}, - {"2a06:a000:170::/48", "20473"}, - {"2402:800:5601::/44", "7552"}, - {"240a:a6a6::/32", "144352"}, - {"2804:4f8:8400::/34", "28263"}, - {"2804:64e8::/32", "269457"}, - {"2a0a:e5c0:12::/48", "213081"}, - {"2001:dd9::/48", "24302"}, - {"2401:d800:7a20::/41", "7552"}, - {"240e:3bf:f700::/36", "4134"}, - {"2a00:1200::/32", "33828"}, - {"2001:559:1f1::/48", "7015"}, - {"2409:8061:1900::/34", "9808"}, - {"2600:1417:57::/44", "20940"}, - {"2804:7310::/32", "270893"}, - {"2a0a:f500::/32", "6883"}, - {"2800:5f0:878::/35", "22724"}, - {"2804:45e4:7d10::/32", "262567"}, - {"2a07:68c0::/30", "32338"}, - {"2409:8b28::/32", "56041"}, - {"240a:aed6::/32", "146448"}, - {"2800:160:1e5d::/42", "14259"}, - {"2803:3a40::/32", "263826"}, - {"2a0a:51c0::/30", "48314"}, - {"2a0a:d480::/29", "206549"}, - {"2a0c:f140::/29", "204790"}, - {"2001:df4:2900::/48", "56155"}, - {"2001:fd8:220b::/43", "4775"}, - {"2804:38f0::/32", "266513"}, - {"2402:800:518d::/43", "7552"}, - {"240a:a464::/32", "143774"}, - {"2804:5724::/32", "268047"}, - {"2a01:cd01:2f2a::/47", "28708"}, - {"2001:559:83f0::/48", "7922"}, - {"2400:cd00:1045::/32", "38794"}, - {"240e:438:6020::/43", "140647"}, - {"2806:2f0:72c3::/42", "17072"}, - {"2a05:2c0::/29", "62178"}, - {"2a09:8b40::/29", "197690"}, - {"2a0a:f280:203::/48", "211157"}, - {"2404:e100::/47", "55685"}, - {"2804:14d:8088::/43", "28573"}, - {"2804:2870:1::/46", "52863"}, - {"2001:559:67::/48", "7015"}, - {"240a:a04b::/32", "142725"}, - {"2804:d08::/32", "262311"}, - {"2a01:53c0:ffff:1::/48", "54994"}, - {"2a0a:4640:a::/43", "206177"}, - {"2a0c:b641:6e2::/47", "213201"}, - {"2001:67c:1888::/48", "203426"}, - {"2a01:148::/29", "34245"}, - {"2606:2e00:800e::/43", "36351"}, - {"2804:7354::/32", "270908"}, - {"2a09:9b40::/48", "209562"}, - {"2a0f:5fc0:dead::/48", "39673"}, - {"2001:559:42f::/48", "7015"}, - {"2001:448a:6090::/41", "7713"}, - {"2402:ee40:3::/42", "134033"}, - {"2408:8956:6700::/40", "17816"}, - {"2409:8062:3003::/40", "9808"}, - {"2409:8907:8520::/38", "24547"}, - {"2804:1040:a240::/35", "263626"}, - {"2804:6300::/32", "262898"}, - {"2804:6aa4::/32", "270350"}, - {"2a00:14d8::/29", "8542"}, - {"2a00:e100::/32", "196819"}, - {"2a02:26f7:4f::/48", "20940"}, - {"2a02:ee80:422d::/48", "3573"}, - {"2a06:6e40::/29", "204120"}, - {"2a0f:9400:7b00::/43", "210872"}, - {"2400:cb00:4::/48", "13335"}, - {"2406:e1c0:401::/39", "141459"}, - {"2408:8459:c430::/41", "17622"}, - {"2409:8a55:7a00::/32", "9808"}, - {"2a03:69c0::/48", "60601"}, - {"2a0e:b107:bf6::/48", "140938"}, - {"2a09:bac0:120::/47", "13335"}, - {"2001:df5:2380::/48", "138754"}, - {"2409:8754:f700::/28", "56040"}, - {"2600:1419:5c00::/48", "4230"}, - {"2606:6680:8::/48", "19844"}, - {"2606:f000::/32", "13917"}, - {"2804:214:4016::/47", "26615"}, - {"2001:fb0:109f:8010::/64", "36040"}, - {"2406:2e00::/32", "17648"}, - {"2408:8256:2f6d::/48", "17816"}, - {"2408:8656:32fe::/47", "17623"}, - {"2803:6900:574::/48", "52423"}, - {"2a01:8840:31::/48", "207266"}, - {"2a02:26f7:27::/48", "20940"}, - {"2a02:26f7:d650::/48", "36183"}, - {"2001:1928::/32", "30528"}, - {"2408:8456:1c00::/42", "17622"}, - {"2a12:3540::/29", "60135"}, - {"2001:559:30c::/48", "7922"}, - {"2406:8680::/32", "45753"}, - {"2804:149c::/32", "262643"}, - {"2001:df3:5880::/48", "136704"}, - {"2409:8914:8200::/39", "56044"}, - {"2a02:26f7:e6cd::/42", "20940"}, - {"2600:6c7f:9052::/48", "20115"}, - {"2607:f4e8:10::/46", "22822"}, - {"2a01:280:398::/48", "48942"}, - {"2a03:3f00::/47", "21245"}, - {"2a0b:7ec0:7702::/32", "206728"}, - {"2804:1f2e::/32", "10715"}, - {"2001:559:83dc::/48", "33652"}, - {"2001:4d00::/32", "8226"}, - {"2405:800:a000::/35", "4817"}, - {"2409:8d54::/28", "9808"}, - {"2804:20ec::/32", "264521"}, - {"2806:370:4100::/44", "28403"}, - {"2408:8756:3af3::/33", "17816"}, - {"240e:982:7100::/38", "139201"}, - {"2600:6c20:a0e::/47", "20115"}, - {"2620:11b:e080::/44", "3549"}, - {"2801:1fc:22::/48", "27951"}, - {"2400:1420:1000::/36", "147305"}, - {"2402:800:380f::/43", "7552"}, - {"2a00:1140::/46", "44806"}, - {"240a:add1::/32", "146187"}, - {"2602:fdb1::/36", "54638"}, - {"2604:11c0:600::/40", "395822"}, - {"2806:20d:3100::/38", "32098"}, - {"240a:a788::/32", "144578"}, - {"240a:abc0::/32", "145658"}, - {"2600:140b:8c00::/48", "31109"}, - {"2a00:1560::/45", "29684"}, - {"2a02:2698:a100::/38", "9049"}, - {"2001:559:741::/48", "7016"}, - {"2a01:ce8c:d000::/31", "51964"}, - {"2a02:26f7:c34d::/46", "20940"}, - {"2a02:26f7:fac1::/46", "20940"}, - {"2a05:7ac0::/29", "21263"}, - {"240a:a818::/32", "144722"}, - {"2602:fc97:30::/44", "399544"}, - {"2804:38ac::/32", "266493"}, - {"2804:43fc::/32", "267614"}, - {"2806:2f0:9541::/46", "17072"}, - {"2a00:1678:da7a::/48", "49453"}, - {"2401:cf80:6044::/48", "198949"}, - {"2800:4b0:8011::/40", "12252"}, - {"2803:c080::/32", "27927"}, - {"2a03:5540::/32", "61343"}, - {"2001:1248:97f2::/44", "11172"}, - {"2404:3d00:4064::/40", "3573"}, - {"240a:a177::/32", "143025"}, - {"2605:a900:1005::/44", "46887"}, - {"2607:4000:300::/40", "14221"}, - {"240e:d:a800::/37", "136192"}, - {"2620:118:5000::/44", "4901"}, - {"2804:62f0:f102::/36", "269329"}, - {"2804:6d00::/32", "270506"}, - {"2408:8220::/31", "4837"}, - {"2408:8459:cf50::/35", "17816"}, - {"2600:140b:c801::/38", "20940"}, - {"2602:feda:3ab::/48", "141706"}, - {"2801:1f:c800::/48", "19429"}, - {"2804:920::/33", "263053"}, - {"2404:f801::/32", "3598"}, - {"2800:160:1e05::/46", "14259"}, - {"2a06:aa87:ffff::/48", "49238"}, - {"2001:559:876e::/48", "33652"}, - {"240a:ae12::/32", "146252"}, - {"2602:fc09:de::/42", "13780"}, - {"2408:8957:f4c0::/38", "17816"}, - {"2001:454e:aab1::/33", "9924"}, - {"2600:1007:b000::/41", "6167"}, - {"2804:1b2:d104::/38", "18881"}, - {"2a02:ee80:4136::/44", "3573"}, - {"2a0f:f100::/29", "60776"}, - {"2001:1900:2352::/48", "3356"}, - {"2804:14d:5493::/45", "28573"}, - {"2a02:26f7:d7c4::/48", "36183"}, - {"2001:250:80b::/48", "24348"}, - {"2402:7d80:242::/33", "63582"}, - {"2405:e280:2180::/48", "55769"}, - {"240a:a70e::/32", "144456"}, - {"240a:af27::/32", "146529"}, - {"2a00:18e0:2::/48", "196763"}, - {"2a0c:9a40:8130::/46", "209833"}, - {"2a0e:46c4:2920::/48", "138435"}, - {"2a0e:fd45:d40::/42", "44103"}, - {"2a11:4701:1101::/29", "28680"}, - {"2001:559:c501::/48", "20214"}, - {"2404:8d03::/29", "10089"}, - {"2001:1ae0::/32", "8262"}, - {"2803:d700::/34", "61461"}, - {"2001:df6:ac00::/48", "58404"}, - {"2a03:83a0:1::/48", "201528"}, - {"2a04:4e40:2e10::/44", "54113"}, - {"2a0b:14c0:3::/48", "396535"}, - {"2a0f:30c0::/29", "37637"}, - {"2001:559:a2::/48", "33657"}, - {"2001:1248:a41b::/45", "11172"}, - {"240e:438:2240::/37", "4134"}, - {"2607:f340::/32", "46231"}, - {"2803:e8c0::/32", "266776"}, - {"2804:747c::/32", "270984"}, - {"2804:7a34::/32", "271355"}, - {"2a00:9900::/29", "31252"}, - {"2800:4b0:4420::/39", "12252"}, - {"2a02:26f7:eec5::/46", "20940"}, - {"2a0f:8a80::/29", "62009"}, - {"2001:559:8066::/48", "7016"}, - {"2001:579:2439::/46", "22773"}, - {"2001:fb0:10b6::/32", "7470"}, - {"2804:5c4::/32", "262540"}, - {"2a03:d400:124::/32", "198913"}, - {"2a04:4e40:2e00::/48", "54113"}, - {"240a:a0b4::/32", "142830"}, - {"240a:a339::/32", "143475"}, - {"240a:aeb1::/32", "146411"}, - {"2600:1408:c401::/38", "20940"}, - {"2600:1416:e001::/31", "20940"}, - {"2804:27b0::/32", "263917"}, - {"2a03:b8c0:17::/44", "137922"}, - {"2a11:4d40::/48", "42652"}, - {"2001:559:195::/48", "33666"}, - {"2800:160:11a2::/47", "14259"}, - {"2804:7f2c::/32", "271671"}, - {"2a02:247a::/32", "51862"}, - {"240a:a1ad::/32", "143079"}, - {"2001:559:c47b::/48", "7922"}, - {"2400:4ec0:8a01::/37", "64300"}, - {"2403:f000:11::/46", "38220"}, - {"2a00:9640:6a::/32", "57710"}, - {"2001:4530::/46", "9433"}, - {"2400:ac40:cd0::/39", "136255"}, - {"2401:4900:3dc0::/42", "45609"}, - {"2600:1407:1e::/47", "35994"}, - {"2604:ca00:8000::/35", "36492"}, - {"2620:104:2041::/48", "16509"}, - {"2804:5f18::/32", "269076"}, - {"2a01:c50f:3a00::/37", "12479"}, - {"2a02:26f7:bb84::/47", "36183"}, - {"2a04:4e40:ccf0::/48", "54113"}, - {"240a:adbc::/32", "146166"}, - {"2804:391c:f::/43", "262287"}, - {"240a:ac04::/32", "145726"}, - {"2804:3838:3::/45", "53170"}, - {"2a02:26f7:f844::/48", "36183"}, - {"2001:16a2:4700::/36", "39386"}, - {"2600:1004:b1d0::/42", "6167"}, - {"2801:1c4::/48", "27951"}, - {"2a00:97a0::/32", "60651"}, - {"2001:559:316::/48", "7922"}, - {"2001:559:c221::/48", "33657"}, - {"2607:8400::/32", "3582"}, - {"2804:40f8::/32", "265995"}, - {"2a02:26f0:bb::/45", "34164"}, - {"2a02:4840:200::/47", "60567"}, - {"2001:559:792::/48", "7922"}, - {"2001:41d0::/32", "16276"}, - {"2400:ca02:f08a::/41", "23688"}, - {"240a:a945::/32", "145023"}, - {"240a:ae4e::/32", "146312"}, - {"2620:1d5:620::/41", "14773"}, - {"2400:4fc0:1::/45", "134146"}, - {"2409:802f::/34", "56041"}, - {"2a02:26f7:cc91::/42", "20940"}, - {"2a04:4e40:6630::/41", "54113"}, - {"2a0c:c080::/29", "57866"}, - {"2a0d:3842:1100::/48", "57629"}, - {"2001:4490:d0c0::/46", "9829"}, - {"2401:c680:f::/35", "133854"}, - {"2a00:dd0::/32", "47869"}, - {"2a03:8180:1800::/39", "36351"}, - {"2001:559:876b::/45", "7016"}, - {"2001:49d0:140::/42", "20177"}, - {"2402:e280:2117::/44", "134674"}, - {"240a:a8d5::/32", "144911"}, - {"2804:1494::/32", "263338"}, - {"2a00:1a28:1158::/32", "42708"}, - {"2a07:3502:1160::/48", "20559"}, - {"2a0c:500::/30", "205103"}, - {"2405:2200::/32", "55853"}, - {"2804:7f74:4::/32", "271689"}, - {"240a:aa0c::/32", "145222"}, - {"2600:1008:b000::/42", "6167"}, - {"2607:fcd0:aac0::/35", "8100"}, - {"2620:131:f000::/40", "10255"}, - {"2804:82fc::/32", "272169"}, - {"2c0f:fec8::/44", "37197"}, - {"2001:4479:a900::/38", "7545"}, - {"2409:8e14:4000::/34", "56044"}, - {"2800:160:1321::/44", "14259"}, - {"2001:559:33f::/48", "33652"}, - {"2405:1c0:6131::/45", "55303"}, - {"2408:8957:efc0::/35", "17622"}, - {"2803:a3e0::/32", "270068"}, - {"2804:5c14::/32", "268886"}, - {"2a0b:b86:8::/45", "3280"}, - {"2408:8459:4630::/41", "17622"}, - {"240a:ae88::/32", "146370"}, - {"2606:23c0::/32", "399228"}, - {"2607:f2d8:401c::/35", "18450"}, - {"2a01:8340:200::/32", "59410"}, - {"2a02:2ae0::/32", "702"}, - {"2401:4900:2080::/45", "45609"}, - {"2620:19:e000::/44", "19432"}, - {"2a06:5a80::/29", "12488"}, - {"2a0e:a400::/29", "209042"}, - {"2409:8750:d00::/38", "56047"}, - {"2409:8c54:1810::/42", "56040"}, - {"2804:5414::/32", "268627"}, - {"2804:7874::/32", "271243"}, - {"2a05:6200:75::/32", "201630"}, - {"240a:a06b::/32", "142757"}, - {"240e:983:1e03::/45", "58543"}, - {"2604:ae80:a100::/40", "11904"}, - {"2803:9600::/32", "52391"}, - {"2a0c:5e00::/32", "205053"}, - {"2604:d600:1291::/44", "32098"}, - {"2620:103:c00d::/48", "14203"}, - {"2a01:c50f:cc00::/35", "12479"}, - {"2a02:26f7:2a::/48", "36183"}, - {"2a06:2280::/29", "200582"}, - {"2001:308::/32", "7668"}, - {"2001:559:c18d::/48", "33651"}, - {"2605:8000:8901::/33", "4261"}, - {"2804:802c:203::/45", "271734"}, - {"2a02:26f7:d209::/46", "20940"}, - {"2a03:a980::/32", "16281"}, - {"2001:559:54f::/48", "33491"}, - {"2001:df0:7ac0::/48", "149388"}, - {"2800:390::/32", "25620"}, - {"2a06:9780::/29", "13199"}, - {"2a0d:e4c0::/32", "208861"}, - {"2402:800:92c5::/42", "7552"}, - {"2607:fb10::/43", "2906"}, - {"2804:5468::/32", "268648"}, - {"2804:6628::/32", "269538"}, - {"2a00:5647::/32", "34182"}, - {"2a00:98c0::/32", "29287"}, - {"2a0e:46c6:160::/44", "206161"}, - {"2001:df2:d800::/48", "131895"}, - {"2804:2e1c:e781::/35", "265324"}, - {"2a02:e640::/29", "199571"}, - {"2a07:291b::/32", "211452"}, - {"2001:559:25::/48", "7922"}, - {"2602:feda:c50::/48", "212425"}, - {"2804:3a94::/32", "266097"}, - {"2a03:a660::/32", "203441"}, - {"2a07:2580::/29", "203223"}, - {"2804:8:4002::/31", "14840"}, - {"2a00:ce8::/32", "20914"}, - {"2a01:9ec0::/32", "201785"}, - {"2a02:c804::/32", "24843"}, - {"2600:1901:ff90::/44", "15169"}, - {"2606:b400:880c::/48", "7160"}, - {"2806:2f0:4623::/41", "17072"}, - {"2a02:5cc0::/32", "59689"}, - {"2a04:4e40:8800::/48", "54113"}, - {"2402:800:5be0::/44", "7552"}, - {"2600:1f01:48a0::/47", "16509"}, - {"2804:7b50::/32", "271424"}, - {"2a01:111::/34", "8075"}, - {"2a03:7380:5840::/42", "13188"}, - {"2c0f:f6e8::/32", "37315"}, - {"2406:ae00:101::/32", "55564"}, - {"2606:f900:9901::/37", "812"}, - {"2001:559:8623::/45", "7922"}, - {"2604:e180:6::/40", "55002"}, - {"2801:80:1340::/48", "264029"}, - {"2804:577c::/32", "268068"}, - {"2001:252:ff00::/40", "4538"}, - {"2001:678:d18::/48", "213343"}, - {"2001:67c:2074::/48", "57763"}, - {"2001:40f8::/32", "15798"}, - {"240e:108:47::/48", "131325"}, - {"2800:160:1e79::/40", "14259"}, - {"2804:1638:facf::/37", "263276"}, - {"2a00:8240::/29", "61029"}, - {"2001:16d8:bc00::/33", "16150"}, - {"240e:a52:5c00::/34", "134419"}, - {"2600:1406:200::/48", "35994"}, - {"2604:f1c0::/32", "27580"}, - {"2c0f:fe08::/39", "36914"}, - {"2401:d800:df90::/42", "7552"}, - {"2406:840:c00::/48", "139317"}, - {"2407:eec0::/32", "141556"}, - {"2409:8a3c::/35", "24444"}, - {"2804:2e8:24::/32", "262847"}, - {"2a02:26f7:f0c4::/48", "36183"}, - {"2400:adce:5000::/40", "9541"}, - {"2402:800:5e80::/42", "7552"}, - {"2402:e380:302::/48", "133846"}, - {"2409:8c85:2022::/36", "9808"}, - {"2602:fbd9::/48", "20473"}, - {"2620:13a:1000::/40", "40457"}, - {"2401:7400:4801::/34", "4773"}, - {"2409:40f0:1000::/32", "55836"}, - {"2a0a:59c7:1011::/36", "204724"}, - {"2001:67c:5c::/48", "35627"}, - {"2001:44b8:30db::/45", "4739"}, - {"240a:ad1c::/32", "146006"}, - {"2620:11a:a012::/44", "43515"}, - {"2804:14d:ae00::/40", "28573"}, - {"2a02:26f7:b998::/48", "36183"}, - {"2c0f:f208::/32", "328471"}, - {"2001:559:97::/44", "7922"}, - {"240a:ab97::/32", "145617"}, - {"240a:af86::/32", "146624"}, - {"2806:310:1::/44", "16960"}, - {"2a00:5880:1400::/44", "209090"}, - {"2001:1248:56d8::/47", "11172"}, - {"2001:4408:5251::/37", "4758"}, - {"240a:a71d::/32", "144471"}, - {"2a01:830::/31", "3329"}, - {"2a01:c50f:4300::/40", "12479"}, - {"2408:8956:c940::/40", "17816"}, - {"240a:ab29::/32", "145507"}, - {"2602:103:9000::/34", "20115"}, - {"2804:d0c::/32", "53112"}, - {"2a0a:3a40::/32", "8308"}, - {"2a12:3800::/32", "210512"}, - {"2001:559:367::/48", "33657"}, - {"2001:df7:5380::/47", "3970"}, - {"2602:feda:af2::/48", "138038"}, - {"2a02:568::/32", "8763"}, - {"2a01:8840:f6::/48", "12041"}, - {"2607:fad8:d::/40", "22652"}, - {"2806:250:500::/40", "28509"}, - {"2001:503:83eb::/48", "396574"}, - {"2001:57a:1204::/47", "22773"}, - {"2a00:b402::/31", "12857"}, - {"2a01:8840:15::/48", "207266"}, - {"2a0f:ad00::/31", "208202"}, - {"2001:559:3a3::/48", "7015"}, - {"2401:d800:91d0::/42", "7552"}, - {"2602:fbda:400::/48", "146961"}, - {"2804:7a30::/36", "271353"}, - {"2001:559:24::/48", "7016"}, - {"2402:800:939b::/42", "7552"}, - {"2800:160:1224::/43", "14259"}, - {"2804:3014::/32", "264929"}, - {"2a04:4e40:7e00::/48", "54113"}, - {"240a:a7b1::/32", "144619"}, - {"240a:aff0::/32", "146730"}, - {"2600:6c10:f09e::/38", "20115"}, - {"2620:129::/44", "6169"}, - {"2804:e54::/32", "262807"}, - {"2806:230:301b::/48", "11888"}, - {"2806:2f0:41c1::/46", "17072"}, - {"2a00:7700::/32", "31200"}, - {"2a02:5480::/32", "197013"}, - {"240e:44d:980::/41", "4134"}, - {"2a02:26f7:b74c::/48", "36183"}, - {"2a02:2e02:8410::/41", "12479"}, - {"2a0b:e140::/29", "205241"}, - {"2804:444c::/32", "267623"}, - {"2a02:2010:2510::/42", "20978"}, - {"2a02:26f7:e5c4::/48", "36183"}, - {"2a07:91c0::/29", "47304"}, - {"2001:559:c172::/48", "33651"}, - {"2804:7cc4::/32", "271517"}, - {"2a01:c50f:3e80::/39", "12479"}, - {"2402:8100:2690::/46", "45271"}, - {"2a00:9320:fffd::/46", "48559"}, - {"2a02:400::/32", "47264"}, - {"2a05:dfc7:26::/44", "61138"}, - {"2001:550:907::/48", "32489"}, - {"2001:559:878c::/48", "33661"}, - {"2001:668:1fc::/46", "16260"}, - {"2402:e280:2172::/44", "134674"}, - {"2408:8459:ef30::/41", "17622"}, - {"240a:ae47::/32", "146305"}, - {"240e:108:2c::/48", "4816"}, - {"2801:114:4::/48", "22822"}, - {"2a03:a9c0::/29", "41709"}, - {"2001:1248:8707::/44", "11172"}, - {"2001:12e0:8000::/36", "10429"}, - {"2400:3d80::/32", "56304"}, - {"2402:e280:2242::/47", "134674"}, - {"2803:2610::/32", "271942"}, - {"2a01:2e0::/31", "8374"}, - {"2409:8a50:b00::/37", "56047"}, - {"2804:1bd8:5000::/32", "28224"}, - {"2a00:10b8::/32", "47116"}, - {"2a09:17c0::/29", "60781"}, - {"2a0d:8d07::/39", "207616"}, - {"2402:e280:1000::/47", "134674"}, - {"240a:abed::/32", "145703"}, - {"240e:44d:b00::/41", "140345"}, - {"2605:9180::/33", "53597"}, - {"2800:300:65e0::/36", "27986"}, - {"2a00:5000::/29", "51896"}, - {"2a0a:2f00:1::/46", "49683"}, - {"2001:bf7:7a0::/36", "44194"}, - {"240e:37d:1a00::/34", "140330"}, - {"2804:6310:2000::/33", "269336"}, - {"2603:c010::/36", "31898"}, - {"2a00:d440::/29", "58046"}, - {"2a09:bac0:251::/48", "13335"}, - {"2a0a:df80:25::/48", "42346"}, - {"2001:b50::/32", "16245"}, - {"2001:1a11:85::/46", "8781"}, - {"240e:37c:2600::/32", "4134"}, - {"2806:21a:a000::/46", "262913"}, - {"2a00:1238::/46", "35236"}, - {"2a02:26f7:c201::/46", "20940"}, - {"2404:0:5005::/48", "24154"}, - {"2804:61c::/32", "28166"}, - {"2a01:c50f:bcc0::/38", "12479"}, - {"2001:559:10c::/48", "7015"}, - {"2001:da8:d833::/48", "23910"}, - {"2804:1d04:5000::/36", "61689"}, - {"2402:8c0:1::/44", "137083"}, - {"2408:8456:2e00::/41", "17623"}, - {"240e:3b3:dc00::/34", "4134"}, - {"2800:6e0::/32", "52320"}, - {"2001:250:140c::/48", "23910"}, - {"2001:559:5fc::/48", "7922"}, - {"2409:8914:c000::/39", "56044"}, - {"2804:6fc:b100::/36", "28158"}, - {"2804:15a4:aab0::/33", "263400"}, - {"2804:46dc::/32", "267016"}, - {"2a05:79c0:1::/46", "27381"}, - {"2001:559:82b0::/48", "33287"}, - {"2001:df7:fa80::/48", "138277"}, - {"2803:7420::/32", "265826"}, - {"2804:ad8::/33", "262494"}, - {"2a00:1169::/39", "21499"}, - {"2a02:c00::/32", "12316"}, - {"2a0c:5247:d000::/36", "208861"}, - {"2001:678:95c::/48", "34093"}, - {"2602:fc23:152::/45", "8095"}, - {"2801:1c8:500::/48", "18747"}, - {"2804:384c::/32", "266468"}, - {"2804:6734::/32", "269612"}, - {"2a02:828::/48", "44285"}, - {"2a02:26f7:f6cc::/48", "36183"}, - {"2001:559:8494::/48", "33650"}, - {"2408:8957:cb40::/40", "17816"}, - {"240a:a3cd::/32", "143623"}, - {"2800:484:5c00::/39", "10620"}, - {"2804:4918:8100::/38", "267164"}, - {"2a07:8f40::/29", "57831"}, - {"2001:fd8:260::/48", "132199"}, - {"2600:804:201::/37", "701"}, - {"2800:670::/32", "262589"}, - {"2001:559:c43e::/48", "33657"}, - {"2001:678:c6c::/48", "212123"}, - {"2600:e004::/32", "22995"}, - {"2a03:d9c0:3000::/48", "3214"}, - {"2605:dd40:8205::/46", "398549"}, - {"2a03:5840:101::/44", "35661"}, - {"2a05:d01e::/36", "16509"}, - {"2001:67c:1a0::/48", "5603"}, - {"2403:8600:ea88::/46", "131317"}, - {"2604:5e80::/43", "8"}, - {"2806:2f0:3203::/42", "17072"}, - {"2001:559:c322::/48", "7015"}, - {"2404:a140:11::/48", "138915"}, - {"2405:a540::/35", "38156"}, - {"2604:17c0::/40", "9009"}, - {"2606:4700:99e0::/44", "13335"}, - {"2a00:12d8:700e::/29", "12586"}, - {"240e:1c7::/22", "4134"}, - {"2a02:26f7:b747::/48", "20940"}, - {"2001:559:81fd::/48", "33491"}, - {"2001:620::/29", "559"}, - {"2402:79c0:f0f9::/48", "11840"}, - {"2403:9c00::/32", "18068"}, - {"2602:fe69:a00::/40", "36369"}, - {"2800:484:3000::/40", "14080"}, - {"2001:df6:6900::/48", "18229"}, - {"240e:44:8000::/33", "4134"}, - {"2620:11d:500c::/47", "393732"}, - {"2001:579:1164::/36", "22773"}, - {"2605:a401:8c46::/42", "33363"}, - {"2a02:9b0:1e::/42", "64105"}, - {"2c0f:e9a8::/32", "328732"}, - {"2001:1998:890::/44", "8052"}, - {"2401:2400::/44", "38496"}, - {"2402:fd40::/48", "137889"}, - {"2408:8459:ae30::/41", "17622"}, - {"240a:a197::/32", "143057"}, - {"2600:5801::/32", "7843"}, - {"2607:f810::/38", "6192"}, - {"2001:559:c0ed::/46", "33652"}, - {"2403:ad80:4c00::/38", "134835"}, - {"2406:1400:c100::/48", "24342"}, - {"2001:4878:a007::/44", "12222"}, - {"2804:204:258::/46", "28186"}, - {"2804:1b64::/32", "61725"}, - {"2a02:2228::/32", "51378"}, - {"2001:df3:a280::/48", "16509"}, - {"2001:1b40:3333::/48", "3356"}, - {"240a:a0bf::/32", "142841"}, - {"2604:d600:1327::/44", "32098"}, - {"2806:21a::/48", "32098"}, - {"2001:44b8:206d::/35", "4739"}, - {"2804:14d:ba60::/40", "28573"}, - {"2a02:ed04:3410::/33", "50304"}, - {"2406:840:e770::/46", "136591"}, - {"2801:c4:12::/48", "28477"}, - {"2804:3e70:f008::/36", "266596"}, - {"2600:6c38:224::/44", "20115"}, - {"2604:3d00:d500::/36", "6327"}, - {"2800:68:19::/42", "61468"}, - {"2a02:56c0::/32", "5500"}, - {"2a0a:5dc0::/29", "51395"}, - {"240a:a200::/32", "143162"}, - {"240a:a326::/32", "143456"}, - {"2600:370f:5320::/47", "32261"}, - {"2606:2800:5a80::/46", "15133"}, - {"2a02::/32", "12684"}, - {"2405:9800:b820::/41", "133481"}, - {"2408:8456:8a40::/39", "17816"}, - {"2409:802e:2904::/47", "9808"}, - {"2801:80:3e50::/48", "271444"}, - {"2a00:15c0::/32", "31543"}, - {"2a02:26f7:f70d::/46", "20940"}, - {"2a02:4140:5::/32", "43957"}, - {"2a05:7640:2100::/41", "174"}, - {"2a0f:5c40::/44", "48981"}, - {"2001:559:15c::/48", "33668"}, - {"2404:e640::/32", "136697"}, - {"2a03:7420::/48", "8751"}, - {"2001:67c:268c::/48", "199902"}, - {"2001:1a11:73::/48", "8781"}, - {"2600:1407:2401::/36", "20940"}, - {"2604:880:5e::/48", "29802"}, - {"2804:3f10:5000:900::/34", "262566"}, - {"2404:bf40:a5c0::/47", "7545"}, - {"2803:3c0::/32", "265728"}, - {"2a02:26f7:c7c8::/47", "36183"}, - {"2001:44b8:4034::/47", "7545"}, - {"2607:7300::/32", "40438"}, - {"2804:658c:10::/46", "269499"}, - {"2a0e:4ac0::/29", "207902"}, - {"2001:559:13f::/48", "33655"}, - {"2001:da8:702c::/46", "24363"}, - {"240a:af08::/32", "146498"}, - {"2600:1419:14::/47", "20940"}, - {"2803:fe60::/32", "262186"}, - {"2804:3868:400::/38", "266475"}, - {"2804:7984::/32", "271310"}, - {"2a04:5d00:80::/48", "206754"}, - {"2001:4408:7700::/36", "4758"}, - {"2401:d800:2860::/40", "7552"}, - {"2404:2280:19d::/48", "24429"}, - {"2620:0:1607::/48", "6984"}, - {"2a09:1b80::/29", "203959"}, - {"2001:559:836a::/48", "33652"}, - {"2403:580:2100::/32", "134715"}, - {"240a:a611::/32", "144203"}, - {"2001:559:c4ae::/48", "33287"}, - {"2001:dc7:dd05::/34", "24151"}, - {"2604:5400:c000::/35", "11776"}, - {"2804:5868::/32", "268127"}, - {"2408:840d:a900::/42", "17621"}, - {"2604:10::/32", "19112"}, - {"2804:48d0::/32", "267146"}, - {"2a02:13c0::/32", "20792"}, - {"2a0b:4780::/29", "60129"}, - {"2409:8051:100::/37", "9808"}, - {"2607:f8f0:1200::/40", "271"}, - {"2620:52::/48", "22753"}, - {"2a00:f900::/32", "43925"}, - {"2001:559:c00e::/47", "33651"}, - {"2001:44b8:605b::/48", "4739"}, - {"2607:fe90:8000::/47", "22169"}, - {"2a02:26f7:bed0::/48", "36183"}, - {"2c0f:fe60::/32", "37619"}, - {"2001:559:85ba::/48", "33659"}, - {"2001:559:c0a0::/48", "33651"}, - {"2804:3b70::/32", "266149"}, - {"2001:4830:200::/40", "25623"}, - {"2620:11a:a000::/44", "43515"}, - {"2804:7ffc::/32", "271722"}, - {"2a01:7b0::/32", "34752"}, - {"2a02:26f7:f9c0::/48", "36183"}, - {"2a0f:da40::/29", "60781"}, - {"2408:897e::/32", "4837"}, - {"2a02:1628::/32", "12360"}, - {"2001:559:8045::/48", "33657"}, - {"2001:678:f98::/48", "211069"}, - {"2401:b400:16::/44", "58811"}, - {"2405:4803:2e4::/44", "18403"}, - {"2a02:5960::/32", "201986"}, - {"2408:8459:d040::/42", "134543"}, - {"2804:46a0::/32", "52562"}, - {"2a09:a400::/29", "212660"}, - {"2804:52f0::/32", "268551"}, - {"2408:8456:ef40::/40", "17816"}, - {"2602:fed2:7308::/48", "23470"}, - {"2a01:8840:6a::/45", "12041"}, - {"2a02:26f7:cc88::/48", "36183"}, - {"2a03:51a0::/32", "39046"}, - {"2a07:5c80::/29", "207758"}, - {"2a09:71c0::/29", "44486"}, - {"2a10:4040::/29", "213300"}, - {"2407:f2c0::/32", "139688"}, - {"240a:a4d1::/32", "143883"}, - {"2a07:ec80:230::/47", "44949"}, - {"2a0a:7000::/29", "58073"}, - {"2405:203:c07::/44", "55836"}, - {"2408:8957:9e00::/40", "17622"}, - {"2600:6c34:3d1::/48", "33588"}, - {"2804:14d:a200::/40", "28573"}, - {"2a0a:c0:ffff::/48", "43824"}, - {"2001:67c:64c::/48", "47846"}, - {"2001:42d0:bee0::/44", "33764"}, - {"2001:43f8:e00::/40", "715"}, - {"240a:aad3::/32", "145421"}, - {"2a02:1610::/32", "50986"}, - {"2a0c:4dc0:2::/29", "203959"}, - {"2a0f:2c40::/29", "60262"}, - {"2001:c38:9041::/44", "9931"}, - {"2600:1f01:4844::/47", "16509"}, - {"2606:f500::/34", "11352"}, - {"2620:133:2000::/40", "14074"}, - {"2804:a2c::/32", "263028"}, - {"2a02:10::/42", "24785"}, - {"2a09:c500::/29", "209842"}, - {"2401:4900:6190::/41", "45609"}, - {"240e:7:4000::/37", "134420"}, - {"2603:b0e0:bef0::/33", "11796"}, - {"2801:c4:30::/48", "2708"}, - {"2804:3290::/32", "265085"}, - {"2a07:e01::/32", "210083"}, - {"2403:d300::/34", "15932"}, - {"240a:aec9::/32", "146435"}, - {"2405:3000::/32", "3661"}, - {"2600:100f:9000::/44", "6167"}, - {"2401:d800:d6e0::/39", "7552"}, - {"240a:a368::/32", "143522"}, - {"240a:a172::/32", "143020"}, - {"240e:d6::/36", "140329"}, - {"2620:145:800::/38", "12257"}, - {"2804:5e48:ff30::/46", "269023"}, - {"2a02:26f7:d3c5::/46", "20940"}, - {"2a06:1280:2000::/32", "61138"}, - {"2001:559:c4c4::/47", "7015"}, - {"2409:8055:31::/46", "56040"}, - {"240e:44d:3d80::/41", "4134"}, - {"2602:ff6e::/43", "63202"}, - {"2a02:878:a::/48", "42632"}, - {"2804:204:210::/47", "28186"}, - {"2a12:2140::/29", "210045"}, - {"2001:fb1:190::/36", "17552"}, - {"240e:966:1800::/37", "133774"}, - {"2804:2484:8a00::/33", "28258"}, - {"2a01:7e8::/32", "42525"}, - {"2a0d:5087:1a2d::/32", "62240"}, - {"2605:15c0::/33", "19528"}, - {"2610:a1:1007::/48", "397220"}, - {"2a02:23b0::/32", "44141"}, - {"2a02:2e02:86b0::/41", "12479"}, - {"2001:da8:274::/47", "24349"}, - {"2806:20d:5b05::/40", "32098"}, - {"2a02:26f7:28::/48", "36183"}, - {"2a04:640::/29", "61160"}, - {"2a0c:c647:fd05::/38", "50489"}, - {"2401:7400:801:b::/61", "4773"}, - {"2402:9d80:100::/47", "131429"}, - {"2607:9080:705::/48", "62424"}, - {"2804:694:4c01::/40", "262596"}, - {"2a06:62c0:81::/44", "204138"}, - {"2a0b:5c80::/29", "204779"}, - {"2400:cb00:a720::/45", "13335"}, - {"2401:d800:8a0::/41", "7552"}, - {"2404:bf40:8440::/48", "7545"}, - {"2600:9000:220b::/43", "16509"}, - {"2804:2be0:7200::/32", "262503"}, - {"2a02:2e02:8560::/40", "12479"}, - {"2a04:1200::/29", "33951"}, - {"2a06:6a00::/29", "20493"}, - {"2a06:7b40::/29", "198024"}, - {"2001:da8:202::/48", "24350"}, - {"2001:da8:802a::/48", "23910"}, - {"240e:698:2800::/40", "133775"}, - {"2600:140b:d::/48", "17511"}, - {"2a02:28f8:2::/48", "31323"}, - {"2a03:9ea0::/32", "51815"}, - {"2a04:e8c0::/29", "44486"}, - {"2001:503:5419::/48", "7342"}, - {"2800:160:1e63::/44", "14259"}, - {"2804:2d28::/32", "265264"}, - {"2600:1004:b140::/42", "6167"}, - {"2801:9e::/32", "15256"}, - {"2804:5e48:ff20::/46", "269023"}, - {"2a00:1018::/37", "25394"}, - {"2a00:1858:1100::/32", "25454"}, - {"2a07:9c0::/29", "203328"}, - {"2001:df0:6980::/48", "135973"}, - {"2408:8456:4640::/36", "17816"}, - {"2804:43c:4000::/32", "262422"}, - {"2a01:5041:2004::/48", "202196"}, - {"2a02:26f0:a201::/39", "20940"}, - {"2402:2a80::/33", "46489"}, - {"2606:3c80:8e00::/34", "33582"}, - {"2804:2724:150::/32", "263879"}, - {"2804:4b48::/32", "267295"}, - {"2a02:26f7:b848::/48", "36183"}, - {"2a11:9d40::/29", "210646"}, - {"2409:8052:802::/40", "56047"}, - {"240e:438:b340::/43", "140647"}, - {"2607:f180:7100::/40", "45652"}, - {"2804:768:3880::/33", "52977"}, - {"2a04:8580:fff0::/47", "21030"}, - {"2001:559:c2fa::/47", "33287"}, - {"2409:8055:8::/48", "9808"}, - {"240c:cf81::/32", "138378"}, - {"2602:fdb8:1f0::/44", "394151"}, - {"2800:a4:2a00::/28", "6057"}, - {"2804:833c::/34", "272185"}, - {"2a02:2698:6000::/38", "57378"}, - {"2a07:9780::/29", "202705"}, - {"2a0b:da00::/29", "50113"}, - {"240e:978:3000::/40", "137702"}, - {"2602:fd50::/48", "62513"}, - {"2804:6600::/32", "269527"}, - {"2a02:26f7:b405::/46", "20940"}, - {"2a02:26f7:efc1::/46", "20940"}, - {"240a:a1e0::/32", "143130"}, - {"240a:a4d4::/32", "143886"}, - {"2a02:957::/48", "60217"}, - {"2a02:f28::/32", "20647"}, - {"2a02:26f7:c94c::/47", "36183"}, - {"2a02:26f7:f8c4::/48", "36183"}, - {"2a03:ab00::/32", "197046"}, - {"2804:3a4::/32", "262900"}, - {"2a02:88d:400f::/48", "47794"}, - {"2a02:26f7:f041::/46", "20940"}, - {"2a03:a60::/32", "59862"}, - {"2a0b:1901::/32", "57878"}, - {"2a0e:aa01:aa20::/35", "206499"}, - {"2001:598::/35", "21548"}, - {"2405:8a00:a049::/45", "55824"}, - {"240c:c283::/32", "24353"}, - {"240e:67c:c200::/39", "140329"}, - {"2a02:26f7:b8c1::/46", "20940"}, - {"2a0e:97c3:6d8::/48", "20473"}, - {"2a0a:acc1::/48", "3258"}, - {"2001:559:83a4::/48", "7922"}, - {"240e:7:5000::/37", "134420"}, - {"2605:bc0:1005::/48", "54201"}, - {"2a02:4e0:2400::/40", "16135"}, - {"2a02:2908::/29", "50010"}, - {"2001:559:762::/47", "7015"}, - {"2600:6c38:457::/44", "20115"}, - {"2800:870:1003::/32", "6762"}, - {"2a00:6960::/32", "60950"}, - {"240a:a79e::/32", "144600"}, - {"2a01:c50f:dec0::/34", "12479"}, - {"2a02:26f7:a5::/48", "20940"}, - {"2001:559:86b0::/48", "7922"}, - {"2001:67c:1830::/48", "3301"}, - {"2404:ef80::/48", "135944"}, - {"2408:8674::/28", "4837"}, - {"2804:537c::/32", "268587"}, - {"2a02:258::/32", "43097"}, - {"2a02:26f7:b602::/47", "20940"}, - {"240e:3b8:7800::/39", "4134"}, - {"2604:5500:9000::/38", "19165"}, - {"2605:3100:fffb::/45", "22906"}, - {"2804:14c:7d93::/41", "28573"}, - {"2a0a:1240::/35", "12440"}, - {"2804:79ac::/32", "271320"}, - {"2a02:26f7:e3c1::/46", "20940"}, - {"2a03:e40:47::/32", "202042"}, - {"2a04:f580:8010::/47", "4134"}, - {"2a0c:440::/32", "204419"}, - {"2a0d:5642:119::/48", "35487"}, - {"2a0e:6380::/29", "207902"}, - {"2401:d800:5c20::/41", "7552"}, - {"2402:800:3b71::/44", "7552"}, - {"2403:df40:113::/45", "14630"}, - {"240e:438:5a40::/37", "4134"}, - {"2a01:d0:29::/41", "29632"}, - {"2a02:26f7:dc4c::/48", "36183"}, - {"2a04:4e40:2a00::/47", "54113"}, - {"2a0e:b107:c30::/44", "140731"}, - {"2001:559:8038::/48", "33650"}, - {"2402:3a80:1e18::/45", "38266"}, - {"2405:e6c0::/32", "137532"}, - {"2407:c280:b100::/46", "211876"}, - {"240e:678:1000::/36", "4134"}, - {"2801:140:11::/48", "262249"}, - {"2a02:26f0:7401::/38", "20940"}, - {"2a0b::/29", "41453"}, - {"2408:8456:1f00::/42", "17622"}, - {"2804:56e0:8400::/33", "268029"}, - {"2a0d:65c0::/29", "208091"}, - {"2001:67c:2758::/48", "41618"}, - {"2001:df2:fe80::/48", "132906"}, - {"2405:1500:31::/41", "58717"}, - {"2408:8956:5300::/40", "17816"}, - {"240a:ab87::/32", "145601"}, - {"2804:1a30:8000::/39", "61844"}, - {"2a0f:70c0:100::/48", "207869"}, - {"2001:559:80de::/47", "7922"}, - {"2001:4868::/40", "701"}, - {"2400:9800:6016::/42", "24203"}, - {"2803:a110::/32", "271988"}, - {"2804:130::/32", "28264"}, - {"2804:1194:f000::/44", "263424"}, - {"2409:806b:1900::/34", "9808"}, - {"2606:2c0:2::/48", "14618"}, - {"2806:230:300e::/48", "265594"}, - {"2001:67c:23c4::/48", "21155"}, - {"2400:adc0:10::/45", "9541"}, - {"240e:45c:b500::/40", "140537"}, - {"2600:804:200::/48", "12234"}, - {"2804:14d:5200::/40", "28573"}, - {"2804:73e0:8040::/33", "270943"}, - {"2a11:af03::/32", "210625"}, - {"2401:d800:9e20::/41", "7552"}, - {"2405:4cc1:b00::/40", "55891"}, - {"2a00:e140::/32", "198161"}, - {"2a02:26f0:f400::/48", "34164"}, - {"2400:6280:133::/48", "132280"}, - {"2620:37:4000::/44", "36213"}, - {"2804:d40::/28", "7738"}, - {"2804:edc::/32", "263553"}, - {"2001:559:582::/48", "33287"}, - {"2001:559:82e3::/48", "7922"}, - {"2001:559:c311::/48", "33660"}, - {"2001:67c:1890::/48", "12552"}, - {"2001:c20:c812::/45", "3758"}, - {"2406:5900::/32", "3786"}, - {"2a00:c9c0::/32", "58002"}, - {"2a07:2dc0::/29", "57878"}, - {"2400:d400:1::/46", "45671"}, - {"2600:cc04:e000::/40", "62833"}, - {"2604:d600:c80::/47", "32098"}, - {"2605:a880::/48", "46261"}, - {"2a0b:4d07:201::/46", "44239"}, - {"2406:7400:70::/45", "24309"}, - {"2604:5200:1001::/48", "701"}, - {"2606:a300:f001::/36", "35847"}, - {"2620:171:2d::/46", "715"}, - {"2800:3c0:30a0::/39", "19863"}, - {"2001:559:c4a1::/48", "33650"}, - {"2001:67c:1640::/44", "43516"}, - {"2400:9380:9020::/47", "4809"}, - {"2408:8956:d8c0::/38", "17816"}, - {"2409:4073:1000::/34", "55836"}, - {"240e:109:8026::/48", "4134"}, - {"2606:5700::/32", "6580"}, - {"2001:67c:148::/48", "12991"}, - {"2001:c20:487e::/48", "9255"}, - {"2401:d800:bbe0::/37", "7552"}, - {"2402:7340:1::/46", "136557"}, - {"2408:8459:b830::/41", "17622"}, - {"2600:6c2e:110::/42", "20115"}, - {"2607:fdf0:5ee3::/45", "8008"}, - {"2804:4f78::/32", "268329"}, - {"2001:67c:20ac::/48", "20612"}, - {"2001:559:c374::/48", "7922"}, - {"2001:559:c3a7::/44", "7725"}, - {"2804:b:c002::/45", "14840"}, - {"2804:14d:1000::/42", "28573"}, - {"2806:2f0:8443::/43", "17072"}, - {"2408:8256:3976::/48", "17816"}, - {"240a:a156::/32", "142992"}, - {"240c:c0a9:1200::/40", "133512"}, - {"2602:fbda::/38", "38136"}, - {"2607:f8f0:610::/48", "393249"}, - {"2001:559:c23d::/48", "13367"}, - {"2406:54c0::/32", "140479"}, - {"2409:8924:f00::/35", "56046"}, - {"2800:640::/32", "262149"}, - {"2a02:c40::/46", "13000"}, - {"2a03:ec40::/29", "60800"}, - {"2a04:940::/47", "51407"}, - {"240a:aa36::/32", "145264"}, - {"240e:874:200::/40", "140638"}, - {"2804:485c:6a00::/32", "267116"}, - {"2a0e:97c0:6a0::/48", "206981"}, - {"240a:aa01::/32", "145211"}, - {"2606:2800:511a::/48", "14153"}, - {"2804:1bd0::/32", "61752"}, - {"240a:a3cc::/32", "143622"}, - {"2607:f5b1::/32", "27411"}, - {"2620:100:d000::/47", "33419"}, - {"2806:20d:1300::/37", "32098"}, - {"2001:559:255::/48", "7725"}, - {"2403:9800:b042::/44", "4648"}, - {"240a:a4f6::/32", "143920"}, - {"240e:264:a000::/36", "58772"}, - {"2607:f928:4002::/32", "22645"}, - {"2607:fdf0:5ee7::/44", "8008"}, - {"2620:119:50e1::/48", "14413"}, - {"2801:80:3e60::/48", "271467"}, - {"2804:52c0::/32", "268539"}, - {"2806:2a0:e00::/40", "28548"}, - {"2a01:8840:c::/48", "33280"}, - {"2a0c:1700:2::/47", "205112"}, - {"2a0c:b200::/29", "39782"}, - {"2a0e:b107:1960::/44", "210633"}, - {"2a0e:f780::/29", "208725"}, - {"2c0f:f5c0:483::/36", "29465"}, - {"2001:470:5f::/48", "198362"}, - {"240a:61:1e00::/48", "9605"}, - {"240a:ac45::/32", "145791"}, - {"2800:160:1248::/42", "14259"}, - {"2804:14c:8100::/40", "28573"}, - {"2804:7aac::/32", "271385"}, - {"2804:7ff4::/34", "271720"}, - {"2a09:1d80::/29", "62563"}, - {"2a0b:4d07:801::/48", "44239"}, - {"2401:4900:5810::/45", "45609"}, - {"2610:188::/32", "14511"}, - {"2620:0:cc3::/44", "36692"}, - {"2804:1ca4:8001::/41", "263010"}, - {"2a00:4400::/32", "8692"}, - {"2a03:5760::/46", "201900"}, - {"2001:4430:f::/48", "3786"}, - {"2804:6e6c::/32", "270596"}, - {"2806:230:6015::/48", "11888"}, - {"2a06:9800::/29", "6908"}, - {"2001:318::/32", "7522"}, - {"2001:67c:15a0::/48", "29208"}, - {"2404:bc0:4f00::/43", "137735"}, - {"2600:6c00:2::/47", "33588"}, - {"2600:6c38:855::/42", "20115"}, - {"2800:200:e2e1::/36", "12252"}, - {"2a01:8a60::/39", "60191"}, - {"2a02:26f7:eb00::/48", "36183"}, - {"2804:7ac4::/32", "271391"}, - {"2a02:88d:8110::/44", "48695"}, - {"2a02:26f7:e248::/48", "36183"}, - {"240a:a528::/32", "143970"}, - {"2001:418:1430:200::/44", "2914"}, - {"2604:d200::/32", "33470"}, - {"2a02:26f7:52::/48", "36183"}, - {"2a02:6680:f::/48", "16116"}, - {"2001:df1:e307::/48", "138603"}, - {"2804:2400::/32", "264195"}, - {"2804:37f0:8900::/35", "266445"}, - {"2001:44b8:604d::/48", "4739"}, - {"2404:ee80::/48", "63741"}, - {"2001:559:295::/48", "33651"}, - {"2401:c680:1400::/32", "133854"}, - {"2620:18:6000::/48", "396142"}, - {"2804:62bc:c0cb::/34", "269315"}, - {"2806:2f0:9841::/46", "17072"}, - {"2a01:6980::/32", "43291"}, - {"240a:a0da::/32", "142868"}, - {"2605:32c0:a003::/48", "16509"}, - {"2a05:f507:46::/42", "13443"}, - {"2a0b:f940:2af3::/35", "205373"}, - {"2001:978:4a00::/48", "51863"}, - {"2400:1a00:5::/32", "17501"}, - {"2401:d800:ff62::/40", "7552"}, - {"240a:a4e9::/32", "143907"}, - {"2602:80e:d000::/40", "45"}, - {"2803:5440:4053::/45", "264738"}, - {"2804:14c:de93::/41", "28573"}, - {"2804:1f00::/32", "11802"}, - {"2a0f:1c40::/29", "208229"}, - {"240a:ae61::/32", "146331"}, - {"2a0f:9d00::/29", "51711"}, - {"2804:b48::/32", "262732"}, - {"2a0c:8fc3::/40", "23470"}, - {"2001:510:203::/45", "376"}, - {"2620:11b:4002::/48", "19210"}, - {"2804:41f8:f304::/37", "267469"}, - {"2a00:f060::/32", "19399"}, - {"2a06:a006::/35", "61138"}, - {"2a07:2540::/29", "60991"}, - {"2a10:6e40::/32", "212635"}, - {"2c0f:f818::/32", "37090"}, - {"2404:4a00:6500::/64", "55423"}, - {"2606:2800:422b::/48", "14153"}, - {"2804:18:8f0::/44", "10429"}, - {"2804:fc0::/32", "263601"}, - {"2a02:2010:2120::/45", "20978"}, - {"2a0c:9a40:8089::/48", "202297"}, - {"2001:480:23::/48", "5058"}, - {"2409:8000:2c00::/35", "9808"}, - {"2a00:cd40::/32", "49113"}, - {"2001:420:4100::/37", "109"}, - {"2001:559:8460::/48", "33660"}, - {"2606:8e80:6020::/44", "32133"}, - {"2804:57c8::/32", "268086"}, - {"2a02:6c20::/46", "207167"}, - {"2a03:3320:387::/48", "209098"}, - {"2a07:59c3:45::/46", "203027"}, - {"2a11:cf40::/29", "60530"}, - {"2603:8075::/32", "20001"}, - {"2804:36d4::/32", "266375"}, - {"2804:3fa4::/32", "265904"}, - {"2a0a:ee80:8::/47", "43988"}, - {"2404:4e40:2::/32", "136429"}, - {"2801:80:1d20::/48", "265910"}, - {"2804:d28::/32", "52604"}, - {"2806:230:6020::/48", "265594"}, - {"2001:559:c2ce::/48", "33651"}, - {"2404:8000:aa::/45", "17451"}, - {"2408:8256:a68::/39", "17622"}, - {"2001:559:159::/48", "7015"}, - {"2600:1415:d001::/37", "20940"}, - {"2600:370f:3748::/47", "32261"}, - {"2607:6500::/32", "7794"}, - {"2a00:c80::/32", "48564"}, - {"2a03:f80:81::/48", "9009"}, - {"2620:12c:c000::/46", "395837"}, - {"2a06:c006::/31", "206766"}, - {"2a0e:eac0:2000::/44", "204582"}, - {"2409:8c20:7c92::/32", "56046"}, - {"240a:ab9e::/32", "145624"}, - {"2001:559:5fd::/48", "33659"}, - {"2001:128c:560::/34", "25933"}, - {"2409:8904:cf70::/40", "24547"}, - {"240a:aab6::/32", "145392"}, - {"2604:6f00::/32", "35985"}, - {"2620:12e:3000::/44", "25670"}, - {"2a00:fa40:3000::/33", "45012"}, - {"2a06:8c80::/29", "49223"}, - {"2a11:5703:b00b::/48", "212149"}, - {"2409:8053:1000::/47", "56047"}, - {"240c:c018::/32", "24350"}, - {"2804:f8c:3000::/33", "263591"}, - {"2804:11e0::/32", "263445"}, - {"2c0f:f510::/32", "327941"}, - {"2001:418::/48", "2914"}, - {"2402:800:9bb7::/41", "7552"}, - {"2800:9a5::/30", "14522"}, - {"2a0f:3540::/29", "60262"}, - {"2001:44b8:30c5::/46", "4739"}, - {"2804:e34:e000::/36", "61889"}, - {"2001:67c:2628::/48", "205016"}, - {"2400:89c0:1050::/46", "23724"}, - {"2600:1400:801::/35", "20940"}, - {"2a02:26f7:d441::/46", "20940"}, - {"2c0f:f568:3::/32", "37451"}, - {"240a:a2be::/32", "143352"}, - {"2606:40::/32", "36492"}, - {"2620:110:d000::/44", "26"}, - {"2001:678:6a8::/48", "39577"}, - {"2001:4408:6702::/36", "4758"}, - {"2401:d800:fb30::/41", "7552"}, - {"2604:9cc0:2::/45", "201106"}, - {"2604:d600:120a::/43", "32098"}, - {"2800:bf0:3bc1::/42", "27947"}, - {"2a07:7840::/29", "207390"}, - {"2a09:8280:1::/48", "40509"}, - {"2a0f:9400:7390::/46", "210815"}, - {"2600:1419:8401::/36", "20940"}, - {"2620:171:48::/47", "42"}, - {"2a07:6cc0:40::/47", "61098"}, - {"2401:af80::/33", "10010"}, - {"2402:800:9a71::/44", "7552"}, - {"2402:9e80:17::/48", "149500"}, - {"2406:da1e::/36", "16509"}, - {"2a00:c3c0::/32", "43928"}, - {"2405:201:9800::/34", "55836"}, - {"2a0e:ac00::/32", "48447"}, - {"2406:f040:bcd::/48", "131775"}, - {"240a:a8d4::/32", "144910"}, - {"2600:1404:9401::/36", "20940"}, - {"2620:52:8::/45", "22753"}, - {"2804:d30::/32", "52610"}, - {"2804:37f0:2900::/35", "266445"}, - {"2804:77f8::/32", "271211"}, - {"2a00:e20:144::/44", "25048"}, - {"240a:a274::/32", "143278"}, - {"2404:a640:63::/39", "133827"}, - {"2600:1010:b170::/40", "22394"}, - {"2602:800:c800::/38", "398642"}, - {"2607:f490::/32", "7029"}, - {"2804:26d8::/32", "53160"}, - {"2a01:b740:535::/36", "714"}, - {"2a02:2180::/32", "16245"}, - {"2a03:db40::/32", "61178"}, - {"2a07:6fc0:20::/29", "34549"}, - {"2001:49f0:d0f4::/44", "174"}, - {"2a02:4a00::/32", "48638"}, - {"2a10:e80::/29", "47289"}, - {"2001:559:785::/48", "33659"}, - {"2001:57a:a202::/36", "22773"}, - {"2402:800:367f::/40", "7552"}, - {"2402:b9c0::/32", "24259"}, - {"2605:a404:4f6::/39", "33363"}, - {"2a04:5c85:f002::/48", "47936"}, - {"2606:ae80:1430::/44", "19834"}, - {"2804:15e4:4::/47", "53001"}, - {"2a00:f740::/39", "28875"}, - {"2a10:8701::/30", "212109"}, - {"2400:d400:1337::/48", "45671"}, - {"2405:200:b00::/31", "55836"}, - {"2803:1300::/32", "52263"}, - {"2803:99e0:10::/44", "270020"}, - {"2402:c340:cacc::/34", "38047"}, - {"2804:7eac::/32", "271639"}, - {"2001:1aa0::/29", "12301"}, - {"2404:f000::/32", "18001"}, - {"2600:3c0f:6::/47", "63949"}, - {"2804:aac::/33", "52905"}, - {"2a0b:4f00::/32", "200807"}, - {"2a10:df40::/29", "211458"}, - {"2001:b08:14::/48", "28800"}, - {"2402:800:548d::/43", "7552"}, - {"2402:8100:20e3::/48", "45271"}, - {"2409:8a55:c000::/37", "56040"}, - {"240e:981:9000::/40", "58542"}, - {"2604:fbc0::/36", "13830"}, - {"2605:2c40::/40", "63210"}, - {"2607:ff68:11::/32", "46475"}, - {"2a02:26e8::/32", "51155"}, - {"2a06:c400::/44", "51559"}, - {"2a07:a440::/30", "42927"}, - {"2001:18c8:767::/40", "18982"}, - {"2804:5d88::/32", "268978"}, - {"2400:4480:4000::/34", "17426"}, - {"2606:9080::/32", "397122"}, - {"2a0c:9a47::/44", "209533"}, - {"2001:de8:b::/48", "9825"}, - {"2804:456c::/32", "266925"}, - {"2a02:26f7:cfcd::/42", "20940"}, - {"2804:48c::/32", "262699"}, - {"2001:49f0:d01b::/42", "174"}, - {"2610:b0:415a::/48", "21433"}, - {"2a06:4b00::/31", "51191"}, - {"2a12:bc0::/48", "50414"}, - {"2001:4878:a027::/48", "12222"}, - {"2408:886e::/31", "4837"}, - {"2409:8c1f:68f0::/35", "9808"}, - {"240a:a8ec::/32", "144934"}, - {"2607:fe78::/32", "3851"}, - {"2800:160:13e7::/43", "14259"}, - {"2a06:4600::/29", "200423"}, - {"240e:d9:e800::/48", "38283"}, - {"2607:7e80::/35", "395354"}, - {"2607:fae0:f001::/48", "8038"}, - {"2620:10e:d080::/41", "21538"}, - {"2001:ee0:8140::/38", "45899"}, - {"2001:4dd8::/32", "2116"}, - {"2620:62:c000::/48", "11820"}, - {"2a00:18c0::/32", "8402"}, - {"2001:559:8186::/48", "33490"}, - {"2001:1b70:82b6::/48", "158"}, - {"240a:ac5b::/32", "145813"}, - {"2600:1009:d020::/34", "22394"}, - {"2803:77a0::/32", "269876"}, - {"2a00:b404:f000::/36", "205867"}, - {"2001:fd8:33b0::/44", "4775"}, - {"2600:1404:6401::/36", "20940"}, - {"2605:a404:814::/42", "33363"}, - {"2804:2590::/32", "264288"}, - {"2a01:b880::/32", "1257"}, - {"2a04:9a00:1021::/46", "203396"}, - {"2404:8a00::/48", "17470"}, - {"2602:fed2:770f::/48", "53356"}, - {"2606:a600:fff0::/44", "23005"}, - {"2a00:e040:c08::/48", "60436"}, - {"2001:fd8:b280::/42", "132199"}, - {"2001:44b8:30cc::/48", "7545"}, - {"240a:2:ccc::/48", "9605"}, - {"240e:a7:7fea::/45", "140522"}, - {"2602:fed2:731e::/48", "53356"}, - {"2a0d:9240::/29", "210167"}, - {"240a:a6ef::/32", "144425"}, - {"2804:1b3:4180::/36", "18881"}, - {"2804:603c::/32", "269154"}, - {"2a00:1ca8::/42", "50673"}, - {"2001:428:4803::/48", "19603"}, - {"2001:1900:2018::/48", "10753"}, - {"2803:c310::/32", "23031"}, - {"2a00:cb20:3b00::/32", "60266"}, - {"2401:d800:2de2::/38", "7552"}, - {"2604:d600:15ea::/45", "32098"}, - {"2606:b180::/32", "63069"}, - {"2620:7:6000::/47", "62744"}, - {"2800:160:2e11::/33", "14259"}, - {"2804:33a8::/32", "265410"}, - {"2a01:89a0::/34", "31556"}, - {"2001:3c8:1306::/48", "137198"}, - {"2001:1248:5abe::/41", "11172"}, - {"2001:1248:a47f::/48", "11172"}, - {"2607:f408:1010::/45", "19871"}, - {"2620:11c:3000::/40", "31764"}, - {"2804:1248::/33", "263467"}, - {"2804:7e10::/32", "271600"}, - {"2606:2800:60c::/47", "15133"}, - {"2804:7358::/32", "270909"}, - {"2001:579:f040::/40", "22773"}, - {"2405:ff00::/32", "132519"}, - {"2600:1417:4e::/47", "20940"}, - {"2a12:7800::/32", "42675"}, - {"2001:418:1401:24::/64", "2639"}, - {"240a:a61a::/32", "144212"}, - {"240a:a80a::/32", "144708"}, - {"2620:0:e20::/46", "1999"}, - {"2804:1370::/32", "61901"}, - {"2804:7538::/32", "271032"}, - {"2001:559:20c::/48", "33659"}, - {"2001:c20:7000::/44", "3758"}, - {"2a04:9ac2::/32", "20766"}, - {"2409:8028:30c1::/42", "56041"}, - {"2800:160:1f58::/42", "14259"}, - {"2a00:ccc2::/32", "59592"}, - {"2a10:4646:b::/48", "211693"}, - {"2600:141b:14::/48", "35994"}, - {"2607:f110:e1a0::/38", "21889"}, - {"2803:19c0::/32", "264605"}, - {"2001:6f8:1502::/36", "3257"}, - {"2001:da8:24a::/47", "23910"}, - {"2801:14::/48", "19429"}, - {"2a02:1318::/32", "25054"}, - {"2a0c:b240::/32", "202441"}, - {"2001:67c:758::/48", "204254"}, - {"2800:ba0:10::/48", "263812"}, - {"2a02:2010:2090::/45", "20978"}, - {"2a0d:4600::/29", "204319"}, - {"2a0e:6600::/29", "205516"}, - {"2001:250::/47", "23910"}, - {"2001:c38:b000::/36", "131090"}, - {"2001:1218:6042::/45", "278"}, - {"2402:ef03:b::/45", "7633"}, - {"2804:1888::/32", "61938"}, - {"2a02:26f7:cc90::/48", "36183"}, - {"2a0d:4a40::/29", "197706"}, - {"2001:590::/35", "3257"}, - {"2600:1417:c00::/48", "7713"}, - {"2a02:23d0::/32", "5435"}, - {"2a02:26f7:e209::/42", "20940"}, - {"2a0b:a0c0::/29", "59682"}, - {"2a11:7240::/29", "43114"}, - {"2a00:d10::/32", "20559"}, - {"2a01:190:160::/35", "1764"}, - {"2804:4978::/32", "267186"}, - {"2001:250:c32::/39", "23910"}, - {"2406:7900:9000::/47", "45328"}, - {"2a06:1287:330a::/45", "206499"}, - {"2001:678:2a4::/48", "206777"}, - {"2402:800:91a9::/43", "7552"}, - {"2402:3a80:1e08::/45", "38266"}, - {"240e:3ba:1800::/34", "4134"}, - {"2a00:1b50:11::/32", "8343"}, - {"2a0f:e0c0::/29", "7203"}, - {"2404:7180:c001::/46", "23848"}, - {"240e:3b1:7800::/39", "4134"}, - {"2604:2700::/39", "32181"}, - {"2804:1e38:4001::/45", "264415"}, - {"2001:559:42a::/48", "33657"}, - {"2402:ef2f:33::/48", "7633"}, - {"2a05:2c00::/30", "201559"}, - {"2a05:5800::/29", "200924"}, - {"2a0b:440:880::/32", "39921"}, - {"2001:550:d01::/46", "174"}, - {"2a0e:6300::/29", "210661"}, - {"2a0e:aa07:e02c::/48", "210370"}, - {"2001:400:6441:52::/58", "293"}, - {"2001:c20:5400::/34", "3758"}, - {"2806:2f0:2480::/48", "17072"}, - {"2001:4180::/32", "5409"}, - {"2402:800:59e0::/44", "7552"}, - {"2409:8a04:e300::/31", "24547"}, - {"240a:aad4::/32", "145422"}, - {"2600:6c18::/30", "20115"}, - {"2607:fcf8::/32", "26788"}, - {"2a0b:9b80::/29", "43332"}, - {"2001:559:c2ac::/48", "33287"}, - {"2001:df3:bc80::/48", "135067"}, - {"2600:1002:b0d0::/44", "6167"}, - {"2801:80:1be0::/48", "266521"}, - {"2804:74bc::/32", "271000"}, - {"2a02:214a::/29", "1241"}, - {"2a0b:7940::/29", "207541"}, - {"2a0f:9ac0::/29", "212144"}, - {"2600:370f:374a::/42", "32261"}, - {"2606:5540::/32", "40165"}, - {"2804:564::/32", "20044"}, - {"2404:d540::/47", "2501"}, - {"2407:d300::/32", "17819"}, - {"2a01:c50f:ca40::/39", "12479"}, - {"2400:cb00:20::/46", "13335"}, - {"2408:8957:c000::/40", "17622"}, - {"2602:fc4c::/36", "46082"}, - {"2803:7f60::/32", "52468"}, - {"2806:263:3300::/37", "13999"}, - {"2a02:26f7:ea91::/42", "20940"}, - {"2406:3400:700::/36", "10143"}, - {"240a:adab::/32", "146149"}, - {"240e:267:6400::/36", "4134"}, - {"2804:7704::/32", "271149"}, - {"2001:250:815::/48", "138182"}, - {"2001:1248:5970::/40", "11172"}, - {"2402:2980::/32", "134224"}, - {"2604:ca00:110a::/41", "36492"}, - {"2607:6980:e710::/44", "9009"}, - {"2620:100:9004::/47", "22843"}, - {"2a01:6f8::/32", "15580"}, - {"2405:1f00::/32", "38077"}, - {"240a:a0bb::/32", "142837"}, - {"240a:a592::/32", "144076"}, - {"2a0d:2581:1000::/36", "209261"}, - {"240a:a407::/32", "143681"}, - {"2600:9000:f140::/48", "16509"}, - {"2604:1580:fe03::/39", "54455"}, - {"2801:11a::/48", "14080"}, - {"2a0c:9a40:8280::/48", "207414"}, - {"2800:484:8b00::/35", "10620"}, - {"2804:13dc:cd00::/34", "262428"}, - {"2806:2f0:7041::/46", "17072"}, - {"2a01:9e00::/33", "41495"}, - {"2a0b:7e80:0:200::/29", "43372"}, - {"2600:1408:6001::/37", "20940"}, - {"2a04:5b81:1fff::/48", "202265"}, - {"2001:559:5b4::/48", "33662"}, - {"2001:648:2012::/40", "5408"}, - {"2400:380:9::/48", "4766"}, - {"2804:e1c:fc00::/38", "52545"}, - {"2a03:4b40:5401::/38", "50710"}, - {"2a04:79c0::/29", "59507"}, - {"2a0e:97c3:580::/48", "20473"}, - {"2803:2d60::/35", "14754"}, - {"2804:61b0::/32", "269250"}, - {"2400:bb40:4444::/48", "136787"}, - {"2402:800:7750::/42", "7552"}, - {"240a:a68e::/32", "144328"}, - {"2804:4bac::/32", "267323"}, - {"2a01:3e0:403::/36", "6453"}, - {"2001:1250:e200::/44", "22894"}, - {"2600:100c:f010::/31", "22394"}, - {"2804:b18:90::/41", "52941"}, - {"2a00:4802:3400::/44", "13124"}, - {"2408:84e1:140::/32", "4808"}, - {"2001:7a8:810::/44", "34019"}, - {"2408:8459:d180::/42", "134543"}, - {"2600:1003:b050::/45", "22394"}, - {"2801:12:1800::/48", "27951"}, - {"2804:2db4:4000::/32", "265298"}, - {"2804:2f1c:8300::/34", "264872"}, - {"2001:df2:5380::/48", "48024"}, - {"2400:ac00::/32", "45846"}, - {"2600:1407:9000::/48", "35994"}, - {"2600:1fa0:e080::/44", "16509"}, - {"2806:230:2022::/48", "265594"}, - {"2a09:4c0:402::/39", "58057"}, - {"2001:12a0:aaab::/33", "28292"}, - {"2001:b400:f218::/45", "17421"}, - {"2408:8456:1440::/39", "17816"}, - {"2600:1408:7001::/37", "20940"}, - {"2a02:26f7:e344::/48", "36183"}, - {"240e:67e:1000::/37", "140330"}, - {"2610:80::/34", "6079"}, - {"2801:80:1de0::/48", "267485"}, - {"2a0e:9640::/29", "44592"}, - {"2001:628:2000::/48", "1120"}, - {"2620:103:e0c9::/48", "13893"}, - {"2a00:4bc0:211a::/48", "31004"}, - {"2a00:f826:12::/42", "34549"}, - {"2a02:26f7:cf91::/42", "20940"}, - {"2001:16a2:4020::/45", "25019"}, - {"2409:8a54:c000::/37", "9808"}, - {"240e:698:4600::/40", "134756"}, - {"2600:1003:b150::/40", "22394"}, - {"2600:140f:6001::/37", "20940"}, - {"2605:8c80::/32", "6391"}, - {"2a02:2ab0:8620::/33", "702"}, - {"2a12:1d00::/35", "210103"}, - {"2606:2800:500b::/48", "15133"}, - {"2610:f0::/38", "22925"}, - {"2804:213c:2a::/32", "264544"}, - {"2a0c:2f44::/30", "59829"}, - {"240a:a08a::/32", "142788"}, - {"240a:ab0c::/32", "145478"}, - {"2604:4d40:acc::/48", "213073"}, - {"2804:6f54::/32", "270653"}, - {"2a0c:7340::/32", "204886"}, - {"240a:a78d::/32", "144583"}, - {"2606:4f00:4::/48", "19324"}, - {"2a05:eb40::/29", "200915"}, - {"2001:df6:2a80::/48", "135738"}, - {"2800:160:121b::/42", "14259"}, - {"2a01:6d00:12::/48", "48445"}, - {"2a02:ee80:41b5::/48", "3573"}, - {"2a07:3640::/29", "203179"}, - {"2406:e1c0:501::/38", "141459"}, - {"2600:100d:b130::/44", "22394"}, - {"2604:3fc0:3003::/36", "396300"}, - {"2607:8300:3000::/36", "13876"}, - {"2a00:8740:500::/40", "207490"}, - {"2a00:b405::/30", "12857"}, - {"2a02:26f7:dd49::/42", "20940"}, - {"2a02:26f7:ebc1::/46", "20940"}, - {"2a06:d700:4445::/29", "43892"}, - {"2001:559:82ed::/48", "7922"}, - {"2402:800:5a8d::/43", "7552"}, - {"2405:9800:c702::/36", "45430"}, - {"2602:feda:ae7::/48", "140913"}, - {"2804:2618::/32", "262362"}, - {"2804:7bb4::/32", "271449"}, - {"2a0e:fd45::/48", "47750"}, - {"2001:418:1401:18::/64", "20940"}, - {"2401:ab40:1::/48", "136961"}, - {"2804:3a50::/32", "14204"}, - {"2a00:5320::/32", "24953"}, - {"2604:bc0:3::/48", "18779"}, - {"2a01:8840:d::/48", "63403"}, - {"2a02:26f7:b784::/47", "36183"}, - {"2001:559:8516::/48", "33657"}, - {"2402:800:9a55::/42", "7552"}, - {"2403:9800:7000::/40", "4648"}, - {"2600:6c20:24d::/42", "20115"}, - {"2402:b740:8000::/47", "140867"}, - {"2600:370f:72e0::/48", "32261"}, - {"2605:1140:1::/48", "394142"}, - {"2a00:1830::/32", "24845"}, - {"2a02:26f7:dc4d::/42", "20940"}, - {"2600:1001:d0c0::/44", "6167"}, - {"2806:370:5390::/44", "28403"}, - {"2a02:ce0::/35", "35819"}, - {"2402:e380:30f::/48", "138631"}, - {"240e:438:8220::/43", "140647"}, - {"2a00:f440:b::/48", "48347"}, - {"2a02:26f7:e9c0::/48", "36183"}, - {"2600:141b:1800::/48", "35994"}, - {"2607:f4e8:14::/48", "23059"}, - {"2804:23c0:2100::/32", "26218"}, - {"2a02:26f7:ea4c::/48", "36183"}, - {"2a12:a840::/31", "47556"}, - {"2001:dce:7800::/48", "38064"}, - {"2001:df0:456::/48", "55904"}, - {"240a:a637::/32", "144241"}, - {"2a05:7280::/32", "202173"}, - {"2a0f:f380::/29", "60262"}, - {"2400:7400:71::/45", "38044"}, - {"240a:ac0e::/32", "145736"}, - {"2405:4803:40a::/36", "18403"}, - {"240e:3b6::/35", "134773"}, - {"2600:1413:c000::/48", "24319"}, - {"2a02:9b0:a::/43", "35819"}, - {"2001:559:81e0::/46", "7015"}, - {"240e:14:1000::/36", "140330"}, - {"2800:160:12e6::/44", "14259"}, - {"2a00:9120:1::/46", "60680"}, - {"2001:67c:2e9c::/48", "8742"}, - {"2001:1248:88ee::/43", "11172"}, - {"2001:1a11:27::/41", "8781"}, - {"2402:e380:300::/48", "132316"}, - {"2600:250f::/32", "26801"}, - {"2600:370f:40a8::/41", "32261"}, - {"2803:6604:e401::/39", "28075"}, - {"2a02:26f7:e7cd::/46", "20940"}, - {"2001:579:400c::/42", "22773"}, - {"2001:550:2200:100::/54", "174"}, - {"2001:67c:2a40::/48", "20712"}, - {"240a:a2ac::/32", "143334"}, - {"2604:4b00::/32", "26123"}, - {"2a0b:60c0::/29", "205655"}, - {"2001:559:800e::/43", "7922"}, - {"2400:6280:16::/47", "132280"}, - {"240e:db:8800::/48", "38283"}, - {"2600:6c38:ac0::/39", "20115"}, - {"2804:49c:4203::/48", "7162"}, - {"2a00:1618::/29", "12577"}, - {"2a04:eac0::/29", "201878"}, - {"2001:fd8:f2f0::/44", "4775"}, - {"2a02:578:7400::/38", "9031"}, - {"2408:8459:7a10::/42", "17623"}, - {"2804:6e4::/34", "262612"}, - {"2a0e:97c3:55a::/48", "20473"}, - {"2403:7bc0::/32", "133593"}, - {"2404:bf40:a1c0::/48", "7545"}, - {"2407:9240:2700::/40", "41378"}, - {"240e:438:6a20::/43", "140647"}, - {"2804:2cd4:50::/40", "265246"}, - {"2804:4c90::/32", "267378"}, - {"2a02:2560::/46", "21127"}, - {"2001:250:3430::/48", "138438"}, - {"2001:da8:7020::/48", "23910"}, - {"2401:d800:bbb0::/41", "7552"}, - {"2602:fd50:f::/48", "39975"}, - {"2620:15e:7101::/48", "30383"}, - {"2803:2240::/32", "263777"}, - {"2c0e:2007:200::/23", "5713"}, - {"2409:8915:7200::/39", "56044"}, - {"2604:1700::/48", "23237"}, - {"2620:a2:6000::/48", "40948"}, - {"2800:a40:a000::/35", "22080"}, - {"2001:678:ab4::/48", "208584"}, - {"2001:4878:a321::/45", "12222"}, - {"240e:267:8400::/36", "4134"}, - {"2603:90f5:1::/48", "20001"}, - {"2806:10a6:4::/43", "8151"}, - {"2a02:26f7:d601::/46", "20940"}, - {"2a06:13c0::/29", "206141"}, - {"2a0f:7c40::/29", "14037"}, - {"2409:8704:3f00::/33", "24547"}, - {"2620:13e::/44", "397327"}, - {"2801:80:9e0::/48", "263417"}, - {"2a02:e580::/29", "199339"}, - {"2001:16a2:4c00::/34", "25019"}, - {"240a:a07a::/32", "142772"}, - {"2a03:7c0::/32", "57704"}, - {"2001:67c:1164::/48", "24940"}, - {"2408:8256:376c::/43", "17623"}, - {"2606:2e00:8004::/46", "36351"}, - {"2804:5e48:f000::/40", "269023"}, - {"2804:6894::/32", "269702"}, - {"2a06:9c40::/29", "8769"}, - {"2001:67c:5ac::/48", "44204"}, - {"2001:df7:a401::/48", "134839"}, - {"2401:d800:2630::/41", "7552"}, - {"2408:80f1:10::/44", "17621"}, - {"2804:ac8:102::/40", "262672"}, - {"2804:1ee4::/32", "264452"}, - {"2a06:6f07:ffff::/48", "197164"}, - {"2001:df5:b880::/48", "63528"}, - {"240a:a418::/32", "143698"}, - {"2606:5e80::/32", "22379"}, - {"240e:108:1155::/44", "4134"}, - {"2600:1007:d000::/42", "6167"}, - {"2605:a401:8148::/43", "33363"}, - {"2a01:7d20:a00::/40", "203645"}, - {"2a02:c60::/32", "49985"}, - {"2409:8907:8620::/33", "24547"}, - {"2a00:1d38::/40", "50655"}, - {"2a09:bac0:56::/47", "13335"}, - {"2a10:1440::/29", "213035"}, - {"2001:eb0::/40", "9584"}, - {"2800:440:76::/48", "27738"}, - {"2a02:2e02:30e0::/39", "12479"}, - {"2001:500:70::/48", "30133"}, - {"240e:264:b000::/30", "4134"}, - {"2607:f6f0:a003::/48", "394749"}, - {"2800:8a0:4000::/32", "5722"}, - {"2a00:d000::/29", "34790"}, - {"2001:559:c34a::/47", "7015"}, - {"2403:8100:1000::/40", "24023"}, - {"240a:a0e1::/32", "142875"}, - {"240e:67e:c200::/39", "140329"}, - {"2600:6c39:627::/43", "20115"}, - {"2605:fec0::/32", "398852"}, - {"2607:f110:e110::/42", "21889"}, - {"2804:6d44::/32", "270521"}, - {"2a00:12f0::/32", "27970"}, - {"2a06:ee01::/32", "27552"}, - {"2001:df0:75::/48", "23767"}, - {"2401:d800:c60::/40", "7552"}, - {"2600:1806:30::/46", "16552"}, - {"2a00:4802:a00::/42", "13124"}, - {"2001:559:58d::/48", "7016"}, - {"2001:559:840a::/48", "33287"}, - {"2001:4878:2000::/48", "12222"}, - {"2001:4878:2225::/48", "12222"}, - {"2402:800:597f::/40", "7552"}, - {"240a:a4f5::/32", "143919"}, - {"2800:220:10::/48", "13585"}, - {"2a00:1190::/32", "16302"}, - {"2a00:1e48::/32", "20485"}, - {"2001:57a:801a::/42", "22773"}, - {"2804:5674::/32", "267999"}, - {"2a02:ee80:41be::/41", "3573"}, - {"240e:970::/29", "4134"}, - {"2804:14d::/47", "28573"}, - {"2804:1cbc::/32", "61672"}, - {"2a03:7960::/46", "47661"}, - {"2001:500:4431::/48", "396549"}, - {"2404:ffc0:2::/43", "62707"}, - {"2408:8456:2640::/36", "17816"}, - {"2408:8459:e410::/42", "17623"}, - {"240e:3b4:2800::/38", "4134"}, - {"2a03:5c00::/32", "29177"}, - {"2a0e:b107:980::/48", "213263"}, - {"2602:10f::/32", "33588"}, - {"2a00:f0e0:11::/41", "198499"}, - {"2001:559:7e7::/48", "7922"}, - {"2400:5280:3000::/38", "63199"}, - {"2406:4c40::/48", "135953"}, - {"2408:8456:2140::/40", "17816"}, - {"2a03:46c0::/32", "42525"}, - {"2001:559:8229::/48", "13367"}, - {"2408:84f3:9c10::/42", "134543"}, - {"2409:8054:61::/45", "56040"}, - {"2409:8907:7a20::/39", "24547"}, - {"2620:130:30c0::/48", "62861"}, - {"2804:2818::/44", "263940"}, - {"2804:3e60:150::/37", "266592"}, - {"2001:559:85be::/47", "20214"}, - {"2804:802c:150::/38", "271734"}, - {"2a04:4e40:3400::/48", "54113"}, - {"2404:3d00:40fa::/47", "21433"}, - {"2605:d600::/32", "13823"}, - {"2a01:a360::/32", "200030"}, - {"2a02:26f7:f8::/46", "36183"}, - {"2001:df4:f080::/48", "141214"}, - {"2401:d800:2520::/41", "7552"}, - {"2602:231::/32", "5056"}, - {"2800:3c0:3130::/32", "19863"}, - {"2a03:7400::/29", "39642"}, - {"2001:67c:270::/48", "202592"}, - {"2404:2480::/33", "135391"}, - {"240a:a2e0::/32", "143386"}, - {"2804:528c::/32", "268525"}, - {"2a02:e30:f00c::/48", "51636"}, - {"2408:8957:a200::/40", "17622"}, - {"240a:a79a::/32", "144596"}, - {"2803:e820::/32", "264750"}, - {"2001:250:5829::/48", "24363"}, - {"2408:840c:c300::/40", "17621"}, - {"2605:4c40:209::/42", "30081"}, - {"2606:2800:60e0::/48", "15133"}, - {"2804:7c60::/32", "271492"}, - {"2a01:70:ffff::/48", "25098"}, - {"2a03:adc0::/48", "42807"}, - {"2a12:4b00::/29", "204790"}, - {"2401:c440::/48", "135905"}, - {"2408:840c:a200::/40", "17621"}, - {"240a:abba::/32", "145652"}, - {"2600:1480:4801::/37", "20940"}, - {"2607:f0d0:6:1::/35", "36351"}, - {"2a02:4000::/32", "35361"}, - {"2a04:c00::/29", "41400"}, - {"2402:800:57e0::/44", "7552"}, - {"2404:4a00:1::/64", "55423"}, - {"240e:5f:600b::/48", "140313"}, - {"2804:6a7c::/32", "270339"}, - {"2a06:9000::/32", "25386"}, - {"2a0b:5ac0::/29", "202803"}, - {"2001:1620:2016::/32", "13030"}, - {"2409:8c3c:1400::/32", "24444"}, - {"2401:d800:fe20::/41", "7552"}, - {"2605:c1c0::/32", "63264"}, - {"2804:5104::/32", "268425"}, - {"2a02:26f7:c5c8::/48", "36183"}, - {"2a06:b00::/29", "3342"}, - {"2a0e:97c0:2e0::/47", "211544"}, - {"2001:1248:57cd::/46", "11172"}, - {"2001:4878:2259::/48", "12222"}, - {"2620:16e:f0f5::/48", "3147"}, - {"2a00:cd80:8000::/33", "30778"}, - {"2001:44b8:605f::/48", "4739"}, - {"240a:ab49::/32", "145539"}, - {"2001:418:1450::/48", "3938"}, - {"2404:c0:9900::/33", "23693"}, - {"2606:9740::/32", "400295"}, - {"2804:39ac::/32", "266043"}, - {"2a12:2540::/32", "56488"}, - {"2a03:5da0::/32", "201293"}, - {"2a0b:6b83:2000::/48", "208249"}, - {"2001:678:4bc::/48", "42214"}, - {"2604:2d80:ec00::/35", "30036"}, - {"2804:14d:9e87::/42", "28573"}, - {"2a0e:cf40::/29", "8823"}, - {"240a:a0e0::/32", "142874"}, - {"240a:a3a8::/32", "143586"}, - {"240a:aa1c::/32", "145238"}, - {"240e:ff::/32", "4134"}, - {"2600:1001:f010::/40", "22394"}, - {"2806:230:1005::/48", "11888"}, - {"2a06:f900:4000::/36", "56630"}, - {"2a0f:5385::/32", "208135"}, - {"2001:67c:3cc::/48", "56700"}, - {"2001:9b8::/46", "6774"}, - {"2402:e280:5900::/37", "134674"}, - {"240a:a5bf::/32", "144121"}, - {"2600:140f:9c00::/48", "9498"}, - {"2602:fc7a::/36", "399612"}, - {"2a0a:3680::/29", "34907"}, - {"240a:a04e::/32", "142728"}, - {"2600:1005:a120::/36", "22394"}, - {"2604:d600:682::/45", "32098"}, - {"2a01:498::/37", "42018"}, - {"2a02:26f0:9a01::/39", "20940"}, - {"2a0c:a9c7:160::/48", "43832"}, - {"2001:250:5845::/44", "138371"}, - {"240a:a202::/32", "143164"}, - {"2a03:1c80::/32", "25222"}, - {"2a0c:8a40::/46", "9009"}, - {"2001:df7:c600::/48", "135905"}, - {"2409:8e79::/24", "9808"}, - {"2804:134c::/32", "263527"}, - {"240a:a57f::/32", "144057"}, - {"2a02:26f7:df80::/48", "36183"}, - {"2a0a:36c0::/29", "208457"}, - {"2a0a:3f40::/32", "50673"}, - {"2a12:5844:1212::/48", "209768"}, - {"2c0f:ec40::/33", "327936"}, - {"2001:da8:e801::/46", "138373"}, - {"2403:1400::/32", "24446"}, - {"2602:fdff::/36", "397376"}, - {"2804:7d0c::/32", "271535"}, - {"2a02:ee80:40c0::/47", "21433"}, - {"2403:18c0:1::/45", "54574"}, - {"2801:13e::/45", "19429"}, - {"2804:14d:8c00::/40", "28573"}, - {"2a02:1c8:10::/44", "24955"}, - {"2a04:4e40:1200::/48", "54113"}, - {"2a0a:eac2:1::/29", "31143"}, - {"2a0b:b1c0::/32", "28717"}, - {"2001:500:72::/45", "30133"}, - {"2801:16:6800::/48", "3549"}, - {"2a02:ff0:2000::/40", "12735"}, - {"2a09:7340::/32", "198985"}, - {"2a09:9000::/29", "34907"}, - {"2001:44c8:12a::/45", "45430"}, - {"2001:48e0::/32", "40498"}, - {"2402:ef2f:17::/48", "7633"}, - {"2406:7400:30::/47", "131269"}, - {"240a:afe7::/32", "146721"}, - {"240d:c010:1a::/47", "132203"}, - {"2804:302:4000::/35", "53237"}, - {"2a02:d480::/38", "680"}, - {"2a02:e400::/29", "199318"}, - {"2001:559:83c8::/48", "33659"}, - {"2001:1828::/32", "10297"}, - {"2604:d600:1543::/44", "32098"}, - {"2804:4a84::/32", "267245"}, - {"2a05:4140:6::/48", "211188"}, - {"2605:a404:b02::/43", "33363"}, - {"2a02:26f7:cb84::/48", "36183"}, - {"2001:559:c12d::/48", "13367"}, - {"240a:a2f1::/32", "143403"}, - {"240a:a9e3::/32", "145181"}, - {"2600:1415:1c01::/34", "20940"}, - {"2803:70a0::/32", "27855"}, - {"2804:1bc4::/32", "61748"}, - {"2804:3278::/32", "265080"}, - {"2a0d:8d06:1001::/48", "60557"}, - {"2402:a00:19::/41", "45916"}, - {"2409:896a:3e00::/39", "9808"}, - {"2a0d:4b40::/29", "61317"}, - {"2001:13e0::/32", "262178"}, - {"2600:1405:6001::/35", "20940"}, - {"2803:46e0::/47", "269953"}, - {"2a0f:52c1:1::/48", "212345"}, - {"2001:c20:48d1::/35", "3758"}, - {"2400:6c00::/32", "45838"}, - {"2620:109::/43", "10753"}, - {"2620:171:f00::/45", "42"}, - {"2a00:4cc4:4001::/48", "60109"}, - {"2001:67c:15a1::/48", "21430"}, - {"2402:7780::/47", "132933"}, - {"2406:daa0:9080::/44", "16509"}, - {"2408:8656:2ef1::/48", "17816"}, - {"2806:261:300::/37", "13999"}, - {"2a04:4480::/32", "211037"}, - {"2a07:2d00::/48", "202730"}, - {"2a0e:b107:1390::/44", "211231"}, - {"2402:800:3a7f::/40", "7552"}, - {"2402:5ec0::/35", "23724"}, - {"2804:64f8::/32", "269460"}, - {"2a02:26f7:b60d::/42", "20940"}, - {"2a02:26f7:dd00::/48", "36183"}, - {"2a03:4f20::/29", "200719"}, - {"240a:ad1b::/32", "146005"}, - {"240a:ae55::/32", "146319"}, - {"2600:803:271::/37", "701"}, - {"2605:5c0:c144::/48", "28885"}, - {"2607:f710:85::/48", "19624"}, - {"2401:fcc0::/32", "55699"}, - {"2408:8409:3c00::/40", "4808"}, - {"240a:a8cf::/32", "144905"}, - {"240a:acf0::/32", "145962"}, - {"2600:6c38:e0e::/47", "20115"}, - {"2a00:1418:f::/48", "41391"}, - {"2a02:ff0:ffff::/48", "12735"}, - {"2a07:3503:1033::/48", "208492"}, - {"2600:6c10:c0::/43", "20115"}, - {"2a01:5f0::/32", "35592"}, - {"2a0f:b4c1::/32", "57487"}, - {"2001:559:82a5::/48", "33657"}, - {"2001:678:30::/48", "48283"}, - {"2001:1248:9889::/48", "11172"}, - {"240a:af57::/32", "146577"}, - {"2001:559:749::/46", "33650"}, - {"2402:7500:4b3::/45", "24158"}, - {"2600:1017:b8a0::/44", "22394"}, - {"2600:9000:a400::/43", "16509"}, - {"2602:fdc2:55::/48", "397720"}, - {"2607:fae0:a000::/35", "8038"}, - {"2804:31ec::/32", "265045"}, - {"2804:32cc::/32", "265098"}, - {"2804:44d4::/32", "267656"}, - {"2a01:1101:5::/48", "29535"}, - {"2001:559:282::/48", "33657"}, - {"240a:ada0::/32", "146138"}, - {"2804:14c:b388::/41", "28573"}, - {"2804:1654::/33", "263282"}, - {"2a05:d050:80d0::/42", "16509"}, - {"2405:84c0:fcf5::/48", "211686"}, - {"240a:af5d::/32", "146583"}, - {"240e:37a:1a00::/34", "140330"}, - {"2a00:d40:1::/48", "2597"}, - {"2a02:26f7:f781::/46", "20940"}, - {"2a12:4180::/29", "51088"}, - {"2001:678:b1c::/48", "20676"}, - {"2402:800:9eb1::/44", "7552"}, - {"2409:8050:1100::/37", "9808"}, - {"2409:8635::/24", "9808"}, - {"240a:a259::/32", "143251"}, - {"2803:f860::/32", "262186"}, - {"2804:1ca8::/32", "61667"}, - {"2a03:4b20::/32", "56912"}, - {"2a03:7c80::/32", "25176"}, - {"2a0b:33c0:6::/48", "57395"}, - {"2804:f9c::/32", "263595"}, - {"2a12:a307:1::/48", "138330"}, - {"2001:559:320::/48", "7922"}, - {"2001:44b8:1060::/45", "7545"}, - {"240e:980:8d00::/40", "137693"}, - {"2600:140f:800::/48", "9498"}, - {"2800:bf0:80e8::/45", "52257"}, - {"2804:5e2c:f000::/36", "269016"}, - {"2a01:5b0:2e::/48", "50611"}, - {"2a0e:1a80::/31", "30633"}, - {"2001:df1:bd80::/48", "139742"}, - {"2001:4410:2004::/43", "132040"}, - {"2401:3480::/36", "23724"}, - {"2804:78e0::/32", "271271"}, - {"2800:490::/36", "27951"}, - {"2a00:1d28::/32", "8523"}, - {"2a01:5041:4efd::/48", "202196"}, - {"2a02:88d:10::/44", "48695"}, - {"2a00:86c0:2042::/43", "2906"}, - {"2a09:2900::/48", "212710"}, - {"2a0d:2146:be12::/40", "50801"}, - {"2001:67c:285c::/48", "213199"}, - {"2401:7400:6020::/36", "4773"}, - {"2408:84f3:dc40::/38", "17816"}, - {"240e:44d:3600::/42", "140345"}, - {"2607:8600::/32", "13692"}, - {"2a07:6fc7::/32", "34549"}, - {"2001:4bf0::/48", "34623"}, - {"2400:7400:10::/47", "23736"}, - {"2401:2a00::/35", "7468"}, - {"2408:84f3:f690::/36", "17816"}, - {"2804:1034::/32", "263624"}, - {"2806:230:1019::/48", "11888"}, - {"2a03:f580::/47", "15763"}, - {"2c0f:f918::/32", "37002"}, - {"2001:559:c2e1::/46", "33657"}, - {"2001:579:a1fd::/35", "22773"}, - {"2001:2030:c006::/28", "1299"}, - {"2409:803c:1900::/37", "9808"}, - {"2800:ba0:14::/48", "27796"}, - {"2804:978::/32", "263087"}, - {"2804:20f8:1100::/32", "264524"}, - {"2a05:d03a:8000::/40", "16509"}, - {"2001:559:86ae::/48", "7922"}, - {"2408:8256:2c84::/43", "17623"}, - {"240a:aded::/32", "146215"}, - {"2600:1017:b0b0::/41", "6167"}, - {"2600:1417:53::/48", "9498"}, - {"2a03:7380:600::/40", "13188"}, - {"2001:67c:1038::/48", "59480"}, - {"2405:4bc0::/32", "137677"}, - {"2604:6600:26::/41", "40676"}, - {"2620:83:8000::/48", "16"}, - {"2620:98:c000::/48", "11810"}, - {"2401:9140::/46", "136897"}, - {"2001:57b:1243::/36", "22773"}, - {"2804:190:240::/40", "53165"}, - {"2804:2aec::/32", "265125"}, - {"2001:559:c19b::/48", "7015"}, - {"2409:8904:62b0::/39", "24547"}, - {"2605:9d80:9042::/48", "4809"}, - {"2001:559:830e::/48", "33659"}, - {"2001:4060::/33", "6772"}, - {"2401:38c0::/32", "58915"}, - {"240a:aa99::/32", "145363"}, - {"240a:ac39::/32", "145779"}, - {"2602:fed2:710d::/48", "53356"}, - {"2606:2800:447::/44", "15133"}, - {"2a00:a220::/32", "13287"}, - {"2a02:b48:8b00::/30", "39572"}, - {"2401:f940::/32", "132839"}, - {"2a05:1084:7400::/40", "138990"}, - {"2a09:bac0:470::/48", "13335"}, - {"2a0a:cec0::/29", "47926"}, - {"2001:678:2c0::/48", "206740"}, - {"2406:d500:2::/45", "136557"}, - {"2806:20d:5043::/45", "32098"}, - {"2a0f:2a00::/48", "60236"}, - {"2001:550:2204::/46", "174"}, - {"2001:559:87d5::/48", "7922"}, - {"2001:67c:2894::/48", "3292"}, - {"2001:df0:1040::/48", "138277"}, - {"240e:45c:2a00::/40", "131285"}, - {"2804:553c::/32", "268698"}, - {"2600:1406:a400::/48", "35994"}, - {"2600:6c38:242::/45", "20115"}, - {"2804:2bdc:601::/36", "265181"}, - {"2804:5fe4::/32", "269130"}, - {"2a02:26f7:e0c8::/48", "36183"}, - {"2a07:3501:1060::/48", "39686"}, - {"2001:559:c37d::/48", "33651"}, - {"2408:8459:1b10::/42", "17623"}, - {"2804:2f4::/32", "53118"}, - {"2806:20d:5807::/44", "32098"}, - {"2a02:26f7:da84::/48", "36183"}, - {"2a09:5c0::/29", "202204"}, - {"2a0b:4340:3000::/38", "48024"}, - {"2001:df2:a600::/48", "45320"}, - {"2402:e280:2320::/37", "134674"}, - {"2600:200::/28", "7029"}, - {"2600:1005:a100::/43", "6167"}, - {"2607:fea0::/46", "16578"}, - {"2804:4368::/37", "267568"}, - {"2c0f:f948::/48", "37582"}, - {"2001:559:29a::/48", "7015"}, - {"2001:559:c019::/46", "33490"}, - {"2001:df3:3580::/48", "45325"}, - {"2600:1405:2::/44", "20940"}, - {"2603:7::/32", "398789"}, - {"2607:f740:27::/48", "36236"}, - {"2620:11a:a00a::/48", "36040"}, - {"2804:1b04:d::/48", "53048"}, - {"2a06:e540:2::/39", "203600"}, - {"2a0b:6d80::/29", "31477"}, - {"2001:a10::/39", "8308"}, - {"240a:a4be::/32", "143864"}, - {"2804:7f08:19::/34", "271662"}, - {"2a02:26f7:f100::/48", "36183"}, - {"2a0e:b107:1770::/44", "210631"}, - {"2001:1830::/32", "16559"}, - {"2409:8731:1000::/29", "9808"}, - {"240a:aa26::/32", "145248"}, - {"2600:1488:6001::/40", "20940"}, - {"2606:e800::/39", "25843"}, - {"2804:2f1c::/32", "264872"}, - {"2001:559:8675::/48", "33650"}, - {"2803:9a40:4001::/32", "263824"}, - {"2804:20c4::/32", "264513"}, - {"2a03:4e0::/32", "59897"}, - {"2001:146a::/32", "51032"}, - {"2001:48c8:18::/32", "29791"}, - {"2409:8018:28f0::/47", "9808"}, - {"2620:139:2000::/40", "396912"}, - {"2804:e28:100::/32", "52547"}, - {"2a00:9060::/32", "8778"}, - {"2a02:2540::/32", "8258"}, - {"2a04:f780:1000::/36", "134512"}, - {"2a05:4880::/29", "199811"}, - {"2a0d:1b80::/32", "204664"}, - {"2001:559:595::/48", "7922"}, - {"2803:1720::/32", "266815"}, - {"2804:4e48::/32", "268251"}, - {"2a00:d5c0::/29", "196890"}, - {"2a11:d240::/29", "204790"}, - {"2600:6c38:b13::/44", "20115"}, - {"2800:d300::/33", "11830"}, - {"2804:3c0:4::/32", "28605"}, - {"2a06:4c00::/32", "20473"}, - {"2401:4900:46c0::/43", "45609"}, - {"2a07:4580::/36", "46261"}, - {"2401:5180::/32", "31216"}, - {"240e:3bc:ac00::/35", "4134"}, - {"2804:4704::/32", "267026"}, - {"2a09:8040::/29", "42611"}, - {"2620:118:3000::/40", "46476"}, - {"2001:418:1401:4::/64", "20940"}, - {"2001:67c:2d00::/48", "205597"}, - {"240e:3b5:ac00::/35", "4134"}, - {"2a03:69e0::/32", "51784"}, - {"2001:67c:358::/48", "50262"}, - {"2001:4408:6300::/37", "4758"}, - {"2400:1700:300::/46", "45166"}, - {"2402:5c40:5c40::/48", "64089"}, - {"2800:160:12b1::/44", "14259"}, - {"2a02:4d8::/32", "41589"}, - {"2a02:26f7:b988::/48", "36183"}, - {"2001:44b8:1a::/47", "4739"}, - {"2605:1e80:4000::/32", "14380"}, - {"2620:3d:a000::/48", "14410"}, - {"2a00:55a0:f900::/40", "9009"}, - {"2a0d:3c43::/32", "51659"}, - {"2001:559:c125::/46", "33659"}, - {"2001:4c08:2002::/44", "3356"}, - {"2001:253:141::/32", "38272"}, - {"2408:84f3:be40::/33", "17816"}, - {"240a:ab15::/32", "145487"}, - {"2804:641c:f000::/36", "269407"}, - {"2a04:1640::/29", "60610"}, - {"2a09:a4c7:9000::/34", "208861"}, - {"2a0f:b880::/29", "208060"}, - {"2001:44c8:4880::/41", "45430"}, - {"2a02:2f0c:d000:32::/57", "8708"}, - {"2804:4b34::/32", "267290"}, - {"2804:74fc::/32", "271016"}, - {"2a01:7a00:b01::/32", "51701"}, - {"2400:6280:107::/48", "132280"}, - {"2400:f640::/32", "18231"}, - {"2620:171:800::/44", "42"}, - {"2600:5400::/32", "19108"}, - {"2a00:dec0::/32", "29695"}, - {"2a02:ebc0::/29", "52126"}, - {"2600:802:1101::/46", "701"}, - {"2600:6c10:81c::/37", "20115"}, - {"2a02:970::/37", "44002"}, - {"2001:678:5c::/48", "198147"}, - {"2605:6ac0:4000::/36", "32751"}, - {"2620:cb::/48", "3549"}, - {"2804:1d20:640::/34", "264349"}, - {"2804:74f4::/46", "271014"}, - {"2806:2f0:4681::/46", "17072"}, - {"2806:1070:401::/48", "3905"}, - {"2a00:bfe0::/32", "41088"}, - {"2a04:9dc0::/42", "9009"}, - {"2a0a:b387::/32", "35048"}, - {"2600:1017:b430::/40", "6167"}, - {"2607:3100::/32", "13994"}, - {"2804:5ddc::/32", "268997"}, - {"2804:5ff4::/32", "269136"}, - {"2804:7f24:a::/32", "271669"}, - {"2400:0:810::/41", "4766"}, - {"2404:d0:b::/32", "6648"}, - {"2600:1402:1a::/45", "35994"}, - {"2a02:348:ad::/41", "35470"}, - {"2a02:e08::/32", "41601"}, - {"2a04:cc00::/29", "30781"}, - {"2001:df3:8800::/48", "36351"}, - {"2409:8055:3028::/47", "9808"}, - {"240a:a566::/32", "144032"}, - {"240a:a7c8::/32", "144642"}, - {"2600:1415:9001::/34", "20940"}, - {"2804:3540::/32", "266277"}, - {"2800:440:9a00::/42", "27738"}, - {"2806:286::/33", "265524"}, - {"2a03:c980:e5::/48", "210079"}, - {"2804:744:b0b2::/33", "262632"}, - {"2a03:2880:f078::/40", "32934"}, - {"2a06:1480::/29", "39371"}, - {"2001:559:17e::/48", "33651"}, - {"2001:1a11:151::/45", "8781"}, - {"2408:8256:3a80::/48", "17816"}, - {"2409:8028:8f5::/44", "56041"}, - {"240a:a71f::/32", "144473"}, - {"2800:970::/32", "27787"}, - {"2a00:e180::/32", "57353"}, - {"2a0e:aa06:405::/44", "209306"}, - {"2400:6880:2c00::/32", "9652"}, - {"2604:bc0:4::/48", "30176"}, - {"2806:21b::/47", "19332"}, - {"2a02:2e02:1d50::/42", "12479"}, - {"2a0c:3240::/29", "51134"}, - {"2804:a44::/32", "262675"}, - {"2a09:3504::/32", "208861"}, - {"2405:2000:ff00::/40", "6453"}, - {"2408:8459:b250::/37", "17816"}, - {"2602:807:9000::/44", "11043"}, - {"2605:4c40:43::/39", "30081"}, - {"2a03:2b40::/32", "16143"}, - {"2a06:6541:4101::/48", "8220"}, - {"2001:13e8::/32", "11815"}, - {"2402:800:9371::/40", "7552"}, - {"2600:1406:e401::/36", "20940"}, - {"2a02:26f7:bc84::/48", "36183"}, - {"2a0d:2583:ab00::/40", "148971"}, - {"2001:559:8412::/48", "7015"}, - {"2804:45a4::/32", "266940"}, - {"2a02:26f7:e8c4::/48", "36183"}, - {"2a02:e980:107::/44", "19551"}, - {"2404:f4c0:f9c3::/48", "142281"}, - {"240a:a05f::/32", "142745"}, - {"240e:966:e600::/36", "4134"}, - {"2800:160:2003::/45", "14259"}, - {"2800:860:b0c::/32", "262197"}, - {"2806:2f0:40a3::/41", "17072"}, - {"2001:559:826d::/48", "33287"}, - {"2404:bf40:82c0::/48", "7545"}, - {"2602:fea1::/36", "20018"}, - {"2804:60d4:7002::/32", "269194"}, - {"2a01:1c0::/32", "29513"}, - {"2402:800:582b::/41", "7552"}, - {"2402:3a80:1ef3::/39", "38266"}, - {"2a00:4080::/48", "41609"}, - {"2a12:df00:3800::/32", "210462"}, - {"2409:8c85:430::/35", "9808"}, - {"2605:9480:1000::/39", "31775"}, - {"2804:2b68::/32", "265152"}, - {"2804:6e58::/32", "270590"}, - {"2402:e280:220f::/43", "134674"}, - {"2408:84f3:dc10::/42", "134543"}, - {"240a:a390::/32", "143562"}, - {"2600:6c10:f827::/44", "20115"}, - {"2610:20:90a0::/44", "3477"}, - {"2804:669c::/33", "269571"}, - {"2a03:b8c0:12::/45", "202276"}, - {"2a0e:97c0:3f0::/46", "212539"}, - {"2001:559:87cb::/48", "33650"}, - {"2001:1a11:102::/44", "42298"}, - {"2001:4878:4001::/48", "35994"}, - {"2402:800:37fe::/36", "7552"}, - {"2620:b8:8000::/48", "15199"}, - {"2804:739c::/32", "270926"}, - {"2801:80:38b0::/48", "270348"}, - {"2804:14ec::/32", "263359"}, - {"2804:4904::/32", "267159"}, - {"2a02:26f0:8901::/40", "20940"}, - {"2a0e:b107:ae0::/44", "210980"}, - {"2001:678:134::/48", "206725"}, - {"240a:a670::/32", "144298"}, - {"240a:a881::/32", "144827"}, - {"2600:c00::/32", "14744"}, - {"2602:feda:190::/45", "142025"}, - {"2a00:18f0:1e00::/48", "25432"}, - {"240e:1f:e000::/26", "4134"}, - {"2a01:190::/42", "1764"}, - {"2001:1248:88b0::/47", "11172"}, - {"2401:d800:51a2::/38", "7552"}, - {"2409:8915:5e00::/39", "56044"}, - {"240a:a0a9::/32", "142819"}, - {"2804:65ac::/32", "269507"}, - {"2a03:6600::/32", "44124"}, - {"2600:1417:63::/48", "24319"}, - {"2620:74:2f::/41", "7342"}, - {"2806:2f0:70c3::/42", "17072"}, - {"2a09:7240::/29", "210662"}, - {"2001:1248:5582::/45", "11172"}, - {"2409:8087::/39", "56048"}, - {"2602:ff96:81::/46", "40676"}, - {"2804:14d:4cbb::/41", "28573"}, - {"2408:8426::/31", "4837"}, - {"240a:aa65::/32", "145311"}, - {"2804:6394::/32", "269370"}, - {"2a02:26f7:cd51::/46", "20940"}, - {"2a02:26f7:df40::/48", "36183"}, - {"2a03:c380::/32", "21309"}, - {"2605:8840::/32", "397867"}, - {"2a02:26f7:b840::/48", "36183"}, - {"2a02:26f7:c985::/46", "20940"}, - {"2a02:26f7:dd01::/46", "20940"}, - {"2409:8914:aa00::/39", "56044"}, - {"240a:a915::/32", "144975"}, - {"2600:3502:d000::/31", "396998"}, - {"2803:e100::/32", "27971"}, - {"2804:6004:c000::/34", "269140"}, - {"2001:67c:2b88::/48", "51200"}, - {"2804:2018::/32", "264464"}, - {"2a03:47c0:2281::/37", "21277"}, - {"2a05:7180::/29", "35684"}, - {"2402:800:7a00::/42", "7552"}, - {"240a:af8c::/32", "146630"}, - {"2804:14c:4189::/42", "28573"}, - {"2a02:2278:205::/43", "28907"}, - {"2a02:26f7:ebc0::/48", "36183"}, - {"2a02:cb43:8002::/48", "20546"}, - {"2408:8956:c500::/40", "17816"}, - {"240a:a128::/32", "142946"}, - {"240e:a66:1a00::/34", "140330"}, - {"2405:9ac0::/32", "131920"}, - {"2408:8957:be00::/40", "17622"}, - {"240a:a6af::/32", "144361"}, - {"2600:140f:4801::/39", "20940"}, - {"2600:6c2e:e0f::/40", "20115"}, - {"2001:43f8:ac0::/48", "37356"}, - {"2402:800:7a30::/39", "7552"}, - {"2409:8924:bf00::/33", "56046"}, - {"2800:160:1c2b::/43", "14259"}, - {"2001:678:49c::/48", "44574"}, - {"2401:d800:72b0::/41", "7552"}, - {"2406:3000:11:2006::/44", "4657"}, - {"2804:53f0:f000::/36", "268617"}, - {"2a0a:adc0::/47", "50705"}, - {"2c0f:fef8::/43", "15399"}, - {"2001:67c:7a8::/48", "57720"}, - {"2402:800:91c5::/42", "7552"}, - {"2409:804d:3900::/30", "9808"}, - {"2a0c:fd00::/29", "43541"}, - {"2c0f:eaf8::/32", "328581"}, - {"2404:be00::/32", "55799"}, - {"240a:a4cc::/32", "143878"}, - {"2602:fef4::/48", "54721"}, - {"2a02:6680:1166::/48", "16116"}, - {"2a0a:7880:101::/48", "206677"}, - {"2402:800:3663::/43", "7552"}, - {"2606:fa80::/32", "18616"}, - {"2804:370c::/32", "266386"}, - {"2a02:26f7:ce08::/48", "36183"}, - {"2a02:2988::/32", "24916"}, - {"2a0b:70c0::/32", "206420"}, - {"2a10:b9c0:ffff::/48", "213346"}, - {"2001:254::/33", "24489"}, - {"240a:a24c::/32", "143238"}, - {"2600:1411:6000::/64", "4788"}, - {"2804:2da4::/32", "265294"}, - {"2a00:16d8:53::/32", "42695"}, - {"2404:bf40:e003::/45", "7545"}, - {"2406:8800:9021::/46", "17465"}, - {"240a:ab34::/32", "145518"}, - {"2800:bf0:a10c::/38", "27947"}, - {"2a0c:4480:6::/47", "204720"}, - {"2a0f:5707:ac01::/48", "139589"}, - {"2401:d800:fdc0::/42", "7552"}, - {"2404:138:4011::/48", "134227"}, - {"2409:807c:1100::/36", "9808"}, - {"240a:ab4d::/32", "145543"}, - {"2a02:28a8::/32", "51800"}, - {"2a02:fac0::/32", "58220"}, - {"2001:df2:1000::/47", "132335"}, - {"2600:1488:a361::/40", "20940"}, - {"2804:2958::/32", "264010"}, - {"2a06:ac00::/29", "41405"}, - {"2a0f:5880::/29", "204860"}, - {"2400:9380:9cc0::/44", "136167"}, - {"2607:fb28:10::/48", "29384"}, - {"2803:5ce0:600::/40", "54235"}, - {"2a03:5840::/48", "199586"}, - {"2001:df3:fc00::/48", "134548"}, - {"2408:8957:7b00::/40", "17816"}, - {"240a:a468::/32", "143778"}, - {"240e:6b8:3000::/32", "4134"}, - {"2803:f6e0::/32", "269976"}, - {"2001:df0:1580::/48", "138906"}, - {"2402:ef1e:200::/48", "7633"}, - {"2409:8050::/47", "56047"}, - {"2600:6c38:d1f::/42", "20115"}, - {"2a02:26f7:bd8d::/46", "20940"}, - {"2a02:cb80:4250::/47", "43766"}, - {"2a0c:8fc3:8000::/40", "23470"}, - {"2001:559:c348::/48", "22909"}, - {"2001:df7:6800::/51", "59194"}, - {"2605:b7c0::/32", "30177"}, - {"2a02:26f7:f60c::/48", "36183"}, - {"2a0e:5340::/29", "42306"}, - {"2001:559:83c7::/48", "33491"}, - {"2401:fd80:ff00::/45", "139853"}, - {"2402:8100:27a2::/44", "55644"}, - {"2600:9000:1e1f::/42", "16509"}, - {"2604:9f00::/32", "27364"}, - {"2607:f8e0::/32", "21947"}, - {"2a01:7b60::/32", "48223"}, - {"2a04:440::/32", "12324"}, - {"2a0f:ad40::/32", "41090"}, - {"2001:559:c1ca::/48", "21508"}, - {"2001:df0:30f::/48", "9255"}, - {"2409:807e:1100::/36", "9808"}, - {"240a:afda::/32", "146708"}, - {"2602:fcd3:1::/48", "212934"}, - {"2607:2480:b::/48", "46887"}, - {"2a02:28f8::/48", "31323"}, - {"2a0e:46c4:2500::/40", "142039"}, - {"2620:100:6011::/42", "19679"}, - {"2806:2f0:93e3::/37", "17072"}, - {"2a02:26f7:ba::/48", "36183"}, - {"2001:4998:ef71::/40", "10310"}, - {"2404:4e40::/47", "136429"}, - {"2404:bf40:e903::/40", "139084"}, - {"2804:517c::/32", "268455"}, - {"2a02:26f7:49::/48", "20940"}, - {"2406:e400:deae::/41", "7642"}, - {"2600:1417:3c::/48", "24319"}, - {"2600:6c21:803::/45", "20115"}, - {"2606:2800:647::/48", "15133"}, - {"2620:0:d50::/48", "17244"}, - {"2a09:6800::/29", "50308"}, - {"2001:559:55a::/48", "33651"}, - {"2001:df0:d080::/48", "134337"}, - {"2402:68c0:a000::/36", "137432"}, - {"2607:fe28:5040::/32", "53347"}, - {"2a01:5a60::/32", "200487"}, - {"2a05:b680:1::/48", "34450"}, - {"2001:fd8:301e::/47", "132199"}, - {"2600:1f70:1000::/40", "16509"}, - {"2409:8924:6500::/38", "56046"}, - {"240e:3ba:ac00::/35", "4134"}, - {"2610:e8:1901::/33", "6224"}, - {"2804:3138:d001::/43", "265000"}, - {"2a01:8840:85::/48", "207266"}, - {"2a0e:97c7:160::/48", "42394"}, - {"2001:559:8068::/48", "33657"}, - {"2001:559:c225::/48", "33491"}, - {"2606:2400:1003::/32", "36295"}, - {"2803:bc00::/39", "52438"}, - {"2804:4ccc:8000::/33", "267393"}, - {"2a05:52a0::/30", "201401"}, - {"2401:d800:5430::/41", "7552"}, - {"240a:a4a1::/32", "143835"}, - {"240a:ab2f::/32", "145513"}, - {"2600:380:ac80::/38", "7018"}, - {"2603:f840::/26", "397165"}, - {"2001:400:201:7::/57", "293"}, - {"2001:559:836b::/45", "7015"}, - {"2001:da8:e817::/48", "24368"}, - {"2400:9380:90c0::/44", "136167"}, - {"2401:c5c0:4::/41", "55492"}, - {"2804:1320::/32", "263517"}, - {"2a02:17f9::/32", "35548"}, - {"2a02:2430::/46", "39869"}, - {"2405:1c0:6111::/45", "55303"}, - {"2403:e100::/35", "58601"}, - {"2606:9780::/32", "394141"}, - {"2800:bf0:3044::/38", "27947"}, - {"2804:18:6068::/37", "10429"}, - {"2804:1c2c::/35", "262869"}, - {"2804:5720::/32", "268046"}, - {"2402:800:5d7f::/40", "7552"}, - {"240e:3b0:2800::/38", "4134"}, - {"2804:2778:5000::/36", "263903"}, - {"2a02:ac80:c1::/43", "25145"}, - {"2a04:f480:8000::/34", "25373"}, - {"240a:a76e::/32", "144552"}, - {"2602:fd45::/36", "398419"}, - {"2604:b500::/32", "11045"}, - {"2a0e:b107:ea2::/48", "134478"}, - {"2001:a48:8000::/36", "15851"}, - {"2400:9d80::/47", "58714"}, - {"240a:abe6::/32", "145696"}, - {"240a:acea::/32", "145956"}, - {"240a:ade3::/32", "146205"}, - {"2a03:90a0::/32", "49251"}, - {"2c0f:ede8::/34", "328510"}, - {"2001:4258::/32", "37084"}, - {"2401:d800:d422::/41", "7552"}, - {"2404:fa80::/32", "132111"}, - {"2605:4a40:e00::/32", "13786"}, - {"2605:9c40::/32", "23420"}, - {"2620:111:8000::/46", "32771"}, - {"2a00:1140:3::/38", "44806"}, - {"2001:510:20b::/45", "376"}, - {"2001:67c:210c::/48", "29683"}, - {"240a:ae4a::/32", "146308"}, - {"2600:40f1:102::/28", "701"}, - {"2607:9000:4000::/32", "11878"}, - {"2a01:53c0:ffe8::/47", "54994"}, - {"2a02:f58::/35", "49409"}, - {"2a09:bac0:497::/48", "13335"}, - {"2404:4e00:200::/47", "32787"}, - {"240e:1f:8002::/34", "58543"}, - {"2607:fe28:10::/48", "398119"}, - {"2803:a180::/32", "28118"}, - {"2804:9d4:7000::/32", "262996"}, - {"2a0f:3d80::/48", "30633"}, - {"2001:250:3000::/43", "24357"}, - {"2001:4388:6::/48", "202818"}, - {"2408:8956:e500::/40", "17816"}, - {"2600:1003:a810::/37", "22394"}, - {"2606:a9c0::/32", "399826"}, - {"2a02:c58::/32", "29217"}, - {"2a03:e140:41::/48", "44056"}, - {"2409:8c34:4500::/32", "9808"}, - {"2401:d800:5e90::/42", "7552"}, - {"2401:da40::/32", "134548"}, - {"2607:fa70::/34", "19855"}, - {"240a:a0ea::/32", "142884"}, - {"2a02:26f7:bdcc::/48", "36183"}, - {"2a02:5f81::/32", "8359"}, - {"2001:3c8:4007::/48", "137241"}, - {"2001:559:306::/48", "22909"}, - {"2a09:be45::/30", "211444"}, - {"2001:559:8064::/48", "7725"}, - {"2408:8957:ba00::/40", "17622"}, - {"2409:8a04:5400::/34", "24547"}, - {"2600:3500:1200::/31", "396998"}, - {"2605:e740:ff04::/46", "398710"}, - {"2a12:a1c0::/29", "400522"}, - {"2409:804f:3900::/32", "9808"}, - {"2a03:7380:6400::/42", "13188"}, - {"2a06:8040::/29", "41332"}, - {"2a09:3e40::/29", "41327"}, - {"2a0f:8647:b00b::/48", "212149"}, - {"2600:140f:3601::/36", "20940"}, - {"2605:9d80:9033::/48", "4809"}, - {"2a01:8840:61::/48", "207266"}, - {"2a10:9980:254::/48", "39110"}, - {"2408:8256:3b9b::/48", "17816"}, - {"2804:14d:5cde::/42", "28573"}, - {"2806:2f0:40e0::/39", "17072"}, - {"2a09:be40:3000::/46", "208483"}, - {"2a0a:fe00::/30", "207072"}, - {"2a0e:b107:12c0::/44", "141445"}, - {"2001:678:920::/48", "209487"}, - {"2001:b28:f23f::/48", "62014"}, - {"2001:df0:401::/48", "9357"}, - {"240a:aa13::/32", "145229"}, - {"2600:1806:419::/48", "16552"}, - {"2600:6c20:e59::/31", "20115"}, - {"2001:559:c50f::/48", "7922"}, - {"2401:d800:99e0::/38", "7552"}, - {"2a00:4d60::/32", "12969"}, - {"2a0c:7bc0::/29", "51092"}, - {"2a0d:1000::/29", "206264"}, - {"2402:ef2e:b::/31", "7633"}, - {"2804:5320::/32", "268565"}, - {"2a02:26f7:b640::/47", "36183"}, - {"2402:800:fa80::/42", "7552"}, - {"240a:a4b1::/32", "143851"}, - {"2605:a401:8b6b::/40", "33363"}, - {"2a02:26f7:ec::/48", "36183"}, - {"2404:b280:c000::/34", "141461"}, - {"240a:a656::/32", "144272"}, - {"2600:100e:a010::/39", "6167"}, - {"2605:a404:3c6::/42", "33363"}, - {"2001:579:bf07::/33", "22773"}, - {"2001:fd8:3380::/42", "132199"}, - {"2402:6800:3::/45", "55429"}, - {"240a:a782::/32", "144572"}, - {"2600:1a0f:2001::/32", "46650"}, - {"2400:4800::/32", "9790"}, - {"2403:eb00::/32", "132267"}, - {"2409:8010:3100::/30", "9808"}, - {"2409:8055:44::/48", "9808"}, - {"2604:d600:1c15::/46", "32098"}, - {"2607:f6f0:c000::/40", "29884"}, - {"2a02:26f7:bd41::/46", "20940"}, - {"2a02:26f7:d045::/46", "20940"}, - {"2a05:6440::/29", "49544"}, - {"2409:8910::/30", "9808"}, - {"240a:a5e2::/32", "144156"}, - {"240e:3bd:7a00::/32", "140313"}, - {"2605:a404:c0::/46", "33363"}, - {"2606:f900:a801::/37", "812"}, - {"2607:da00::/39", "15164"}, - {"2001:1248:a4e7::/43", "11172"}, - {"2001:4420::/32", "4782"}, - {"2401:f80::/32", "9268"}, - {"2602:fdb0::/36", "21853"}, - {"2a01:d0:31e::/35", "29632"}, - {"2a02:26f7:f641::/46", "20940"}, - {"2404:2440:dada::/48", "138521"}, - {"2408:8956:5c00::/40", "17622"}, - {"2806:230:4046::/36", "11888"}, - {"2001:67c:15d0::/48", "52201"}, - {"2001:c38:90b0::/39", "9931"}, - {"2602:ffa3::/36", "22921"}, - {"2800:160:1d4d::/43", "14259"}, - {"2a10:9400::/32", "212499"}, - {"2406:dd80::/35", "398704"}, - {"2407:3000:6e::/32", "17707"}, - {"240e:438:2a40::/37", "4134"}, - {"2804:3ca0::/32", "61599"}, - {"2a01:8840:9d::/48", "207266"}, - {"2a02:26f7:ecc4::/48", "36183"}, - {"2a02:f600::/29", "199139"}, - {"2001:5b0:5b00::/40", "6621"}, - {"2405:4000:800:2::/61", "38082"}, - {"2602:fe68:ff0::/44", "26370"}, - {"2607:fb50:1a00::/34", "22781"}, - {"2607:fdf0:5e22::/45", "8008"}, - {"2001:559:179::/46", "33650"}, - {"2408:8456:5e00::/42", "17622"}, - {"2804:14d:2483::/41", "28573"}, - {"2804:3e60:500::/38", "266592"}, - {"2a0a:4380::/29", "60924"}, - {"2404:8d06:2000::/40", "133543"}, - {"2600:1012:a120::/36", "22394"}, - {"2804:145c:501::/33", "263327"}, - {"2806:2f0:4341::/46", "17072"}, - {"2400:4d40:257::/39", "134204"}, - {"240e:44d:7600::/42", "140345"}, - {"2803:7dc0::/32", "265725"}, - {"2806:2f0:38c::/36", "17072"}, - {"2a00:4840::/29", "198967"}, - {"2604:f400:9::/48", "29930"}, - {"2c0f:e8e8::/32", "327750"}, - {"240a:a9eb::/32", "145189"}, - {"2804:4770:8000::/47", "267054"}, - {"2804:545c::/32", "268645"}, - {"2a00:1eb8:e000::/45", "8764"}, - {"2a01:bb24:100::/48", "14618"}, - {"2001:579:418c::/38", "22773"}, - {"2804:571c::/32", "268044"}, - {"2804:7e60::/32", "271620"}, - {"2409:8a3c:5100::/32", "24444"}, - {"2a06:3e87::/32", "198507"}, - {"2c0f:f7a8:8050::/48", "4134"}, - {"2001:a98::/42", "8517"}, - {"240e:c2:2000::/31", "4134"}, - {"2804:8fc::/32", "263043"}, - {"2804:15bc::/32", "28184"}, - {"2a02:26f7:d5c4::/48", "36183"}, - {"2a02:26f7:e90d::/46", "20940"}, - {"2001:67c:20d8::/48", "5603"}, - {"2403:3b40::/32", "55933"}, - {"2600:805:809::/38", "701"}, - {"2605:ed00:6887::/48", "3834"}, - {"2a02:2ad0:245::/46", "702"}, - {"2a10:8640::/31", "198525"}, - {"2804:e30:411::/45", "11338"}, - {"2a02:26f7:c2c9::/42", "20940"}, - {"2a02:26f7:ebc8::/48", "36183"}, - {"2001:1248:55bd::/46", "11172"}, - {"2600:100d:ff00::/44", "6167"}, - {"2801:176::/44", "19429"}, - {"2a01:2b0::/29", "12552"}, - {"2a06:96c0::/29", "60517"}, - {"2a0b:9f00::/29", "47973"}, - {"2001:678:3cc::/48", "206155"}, - {"240e:3be:3e00::/33", "140308"}, - {"2a02:e980:185::/44", "19551"}, - {"2a0f:cc81::/30", "208861"}, - {"2001:bf0::/41", "12732"}, - {"2001:13d0:100c::/38", "7303"}, - {"2405:200:300::/36", "55836"}, - {"240a:a47b::/32", "143797"}, - {"2602:fd00::/44", "147297"}, - {"2620:13a:d000::/36", "395605"}, - {"2a03:3700::/33", "15774"}, - {"2001:4950::/32", "20205"}, - {"2408:84f3:b640::/36", "17816"}, - {"240a:a712::/32", "144460"}, - {"2001:559:3ba::/48", "33657"}, - {"240a:a165::/32", "143007"}, - {"240a:a72a::/32", "144484"}, - {"240e:438:9c20::/43", "140647"}, - {"2600:1401:1::/46", "21342"}, - {"2600:6c10:20::/43", "20115"}, - {"2600:6c38:22a::/43", "20115"}, - {"2a02:26f7:b981::/46", "20940"}, - {"240a:ad26::/32", "146016"}, - {"2600:1806:319::/48", "16552"}, - {"2602:fd9a::/44", "54613"}, - {"2604:9a00::/32", "30633"}, - {"2607:f8f0::/40", "271"}, - {"2800:370:3::/48", "28006"}, - {"2806:370:8140::/42", "28403"}, - {"2a07:a880:4601::/46", "42675"}, - {"2a0d:5c80::/29", "200899"}, - {"2001:67c:1280::/48", "34883"}, - {"2001:44b8:604f::/48", "4739"}, - {"240a:aa89::/32", "145347"}, - {"2600:6c34:18a::/48", "33588"}, - {"2801:1f:b000::/48", "266715"}, - {"2a05:5f80::/29", "210855"}, - {"2402:3680::/32", "135543"}, - {"2606:2800:4ab8::/46", "15133"}, - {"2804:5ac4:2060::/43", "263432"}, - {"2a0b:4340:6::/48", "205603"}, - {"2a11:9c0::/32", "211075"}, - {"2001:579:1130::/41", "22773"}, - {"2800:160:222c::/41", "14259"}, - {"2a00:1eb8:c000::/48", "198651"}, - {"2a01:290::/32", "30781"}, - {"2001:1248:96b9::/41", "11172"}, - {"2001:1900:2385::/42", "3356"}, - {"2400:9380:8301::/48", "4134"}, - {"2403:b100:2013::/48", "394749"}, - {"2405:6e00:f840::/48", "133612"}, - {"2604:5500:e800::/38", "19165"}, - {"2a06:cd40:300::/48", "60781"}, - {"2402:3a80:1c70::/45", "38266"}, - {"240a:a843::/32", "144765"}, - {"2001:559:c0ef::/48", "33660"}, - {"2001:678:aa4::/48", "202297"}, - {"2001:1610::/32", "9008"}, - {"2803:4460::/32", "3549"}, - {"2001:df1:d900::/48", "136797"}, - {"2001:4bd8:52::/48", "199284"}, - {"2400:8500:5701::/48", "58791"}, - {"2404:dac0::/48", "140807"}, - {"2605:e900::/32", "122"}, - {"2804:40a0::/32", "265971"}, - {"2804:6164::/34", "262424"}, - {"2a03:1080::/32", "44395"}, - {"2a03:2480::/41", "41983"}, - {"2607:9e00:2002::/35", "30536"}, - {"2a04:4e40:5210::/41", "54113"}, - {"2001:559:83ec::/48", "7922"}, - {"2001:1980:2500::/33", "29838"}, - {"2804:13b0:2c00::/43", "263546"}, - {"2001:67c:150c::/48", "199302"}, - {"240a:af78::/32", "146610"}, - {"2604:82c0:1::/48", "62917"}, - {"2605:a404:c5f::/42", "33363"}, - {"2620:131:6000::/40", "16639"}, - {"2803:ec10:2::/32", "271880"}, - {"2a06:e881:7302::/40", "213151"}, - {"2406:8800:904b::/33", "17465"}, - {"2408:8459:fb00::/37", "17622"}, - {"240a:a64c::/32", "144262"}, - {"240e:c3:3000::/28", "4134"}, - {"2804:3f4::/32", "262407"}, - {"2a04:2e80:15::/48", "44272"}, - {"2a0b:90c0::/29", "205565"}, - {"2a0e:8f02:1040::/44", "204446"}, - {"2404:2440:abcd::/48", "138521"}, - {"2607:fb00::/32", "13760"}, - {"2620:103:2::/48", "27357"}, - {"2001:1878:401::/45", "4"}, - {"2407:f800:301::/37", "38182"}, - {"240a:a1dc::/32", "143126"}, - {"240a:a4e8::/32", "143906"}, - {"2804:214:8558::/38", "26615"}, - {"2a01:5880::/32", "20924"}, - {"2a06:bcc0:6::/44", "205272"}, - {"2001:d10:9400::/38", "135478"}, - {"2001:df6:6e80::/48", "142049"}, - {"2404:2600::/32", "4776"}, - {"2404:f900::/44", "58482"}, - {"2408:8456:a440::/38", "17816"}, - {"2600:1007:f100::/44", "6167"}, - {"2604:6600:2011::/37", "40676"}, - {"2001:49b8::/32", "21737"}, - {"2606:c000::/32", "2721"}, - {"2a02:970:3281::/32", "44002"}, - {"2a02:2778::/32", "35665"}, - {"2a02:6c20:810::/48", "208143"}, - {"2605:dec0::/32", "17303"}, - {"2804:5ba4::/32", "268860"}, - {"2001:250:5832::/48", "24363"}, - {"2402:d7c0:5::/46", "133234"}, - {"240a:a3cb::/32", "143621"}, - {"2a10:6700::/32", "399975"}, - {"2001:559:81c6::/48", "7016"}, - {"2001:559:c109::/48", "13367"}, - {"2804:79cc::/32", "271328"}, - {"2a10:1340::/29", "206775"}, - {"2001:df1:a800::/48", "133210"}, - {"2409:8c15:2100::/37", "56044"}, - {"240a:ab94::/32", "145614"}, - {"240e:45c:9300::/40", "140534"}, - {"2803:9800:b849::/40", "11664"}, - {"2804:502c::/32", "268373"}, - {"2804:6880::/32", "269696"}, - {"2001:559:7c4::/48", "7015"}, - {"2600:1f70:4000::/40", "16509"}, - {"2605:3380:4c00::/40", "12025"}, - {"2804:6844::/32", "269681"}, - {"2a04:3584::/30", "3308"}, - {"2001:250:7006::/47", "23910"}, - {"2001:559:b3::/45", "33490"}, - {"2409:8070:30ef::/43", "9808"}, - {"2803:c200:c200::/48", "22411"}, - {"2804:16a4::/32", "262977"}, - {"2a00:4020::/32", "24800"}, - {"2a00:de60::/32", "47999"}, - {"2001:559:8138::/47", "7725"}, - {"240a:a4cb::/32", "143877"}, - {"240e:e9:7800::/37", "4134"}, - {"2804:34e0::/32", "265486"}, - {"2a00:1728:d::/48", "198228"}, - {"2a04:6c40::/29", "5432"}, - {"2402:b400:4408::/42", "45960"}, - {"2404:e801:201b::/45", "55430"}, - {"2600:200a:3000::/48", "33517"}, - {"2a01:5a8:4:100::/46", "8866"}, - {"2a03:d000:8701::/46", "31133"}, - {"2c0f:f1a8::/32", "328237"}, - {"240e:3ba:7800::/39", "4134"}, - {"240e:438:4c20::/43", "140647"}, - {"2620:69:c000::/48", "62993"}, - {"2a02:26f0:c1::/46", "20940"}, - {"2a10:a100::/32", "16509"}, - {"2001:559:1af::/48", "33490"}, - {"2607:f6f0:9002::/39", "32323"}, - {"2a02:128:9::/48", "50685"}, - {"2405:3840::/32", "131957"}, - {"240e:904::/30", "23724"}, - {"2600:100c:d230::/34", "22394"}, - {"2600:6c38:820::/47", "20115"}, - {"2001:559:8164::/48", "33490"}, - {"2001:7fe::/32", "29216"}, - {"2001:df0:c180::/48", "139260"}, - {"2001:1248:b0a1::/48", "11172"}, - {"2001:4888:8023::/48", "6167"}, - {"2408:8956:d00::/40", "17816"}, - {"240a:a333::/32", "143469"}, - {"240e:983:1700::/48", "139201"}, - {"2602:fc71::/47", "400232"}, - {"2a09:9ec0::/48", "5606"}, - {"2001:67c:1380::/48", "61078"}, - {"240a:a41e::/32", "143704"}, - {"2600:6c10:f209::/46", "20115"}, - {"2a02:ee80:4290::/45", "3573"}, - {"2a0b:4d07:e01::/48", "44239"}, - {"2001:4998:65::/46", "10310"}, - {"2001:678:508::/48", "766"}, - {"240a:aefc::/32", "146486"}, - {"2610:30::/34", "30313"}, - {"2801:80:3550::/48", "268889"}, - {"2804:1b60::/32", "61724"}, - {"2804:4218:2100::/35", "267477"}, - {"2804:6f24::/32", "270641"}, - {"2a00:cf40::/32", "28902"}, - {"2a10:cc44:110::/48", "59922"}, - {"2001:250:84c::/48", "138182"}, - {"2402:6c80::/32", "23780"}, - {"2406:e000:321::/44", "23655"}, - {"2600:100a:9010::/40", "22394"}, - {"2602:fdf2::/36", "32639"}, - {"2620:27::/48", "10846"}, - {"2620:171:9::/48", "715"}, - {"2a0f:3cc7::/32", "59813"}, - {"2001:4430:4000::/39", "17853"}, - {"2401:803e:1000::/34", "9919"}, - {"2605:9700::/32", "46785"}, - {"2605:280::/32", "22709"}, - {"2804:5124::/32", "268433"}, - {"2a0c:93c0:8022::/48", "212465"}, - {"2001:559:554::/48", "20214"}, - {"2602:220::/32", "16532"}, - {"2a0c:7980::/29", "209372"}, - {"2a0f:5707:aaa0::/44", "205298"}, - {"240a:ab0d::/32", "145479"}, - {"2607:f480:411::/48", "27435"}, - {"2806:2f0:9ee1::/39", "17072"}, - {"2a0e:f7c0::/29", "57048"}, - {"2001:4bb8::/29", "8447"}, - {"240a:acd4::/32", "145934"}, - {"2620:103:200f::/48", "30539"}, - {"2800:bf0:8287::/44", "52257"}, - {"2a02:648::/32", "8804"}, - {"2a09:d2c1:a::/48", "209669"}, - {"2001:559:cd::/48", "33287"}, - {"2400:c540:c345::/37", "59238"}, - {"2603:c002:1610::/39", "31898"}, - {"2a00:8dc0::/32", "57811"}, - {"2a02:26f7:c884::/48", "36183"}, - {"2a02:26f7:d74d::/42", "20940"}, - {"2a02:cbe0::/31", "197029"}, - {"2a04:b647::/32", "28979"}, - {"2a0f:5701:3516::/48", "206499"}, - {"2406:ca00:1::/46", "4858"}, - {"2806:2f0:70a1::/46", "17072"}, - {"2a0e:fd40::/39", "44103"}, - {"2001:da8:e815::/46", "138373"}, - {"2408:8456:c040::/39", "17816"}, - {"2600:1009:b0f0::/44", "22394"}, - {"2a0a:1c00::/29", "207187"}, - {"2401:d800:5880::/42", "7552"}, - {"2404:f4c0:1101::/48", "24144"}, - {"2605:a404:2d9::/45", "33363"}, - {"2a00:4802:2800::/44", "13124"}, - {"2001:da8:e048::/37", "23910"}, - {"240a:a5e1::/32", "144155"}, - {"2804:4b0:110::/38", "262459"}, - {"2a03:5980::/32", "34391"}, - {"2a0b:4ec0::/29", "205692"}, - {"2001:4c30::/32", "9085"}, - {"2605:c900::/32", "26223"}, - {"2607:4300::/47", "55286"}, - {"2a00:afa0::/32", "62210"}, - {"2a03:d000::/39", "31213"}, - {"2407:9300:1::/45", "58765"}, - {"2a0a:90c0:104d::/43", "205080"}, - {"2401:4900:1bb0::/48", "45609"}, - {"240a:a645::/32", "144255"}, - {"2605:1bc0::/32", "16400"}, - {"2605:ae00::/33", "7819"}, - {"2804:11d4:800::/32", "263442"}, - {"2a0b:e7c0::/29", "205400"}, - {"2001:250:5060::/48", "24349"}, - {"2001:250:ff29::/31", "23910"}, - {"2001:559:330::/48", "7922"}, - {"240e:3bc:2800::/38", "4134"}, - {"2606:2800:4060::/46", "15133"}, - {"2806:230:6008::/48", "265594"}, - {"2806:2f0:30e1::/46", "17072"}, - {"2a01:a500:2567::/32", "42831"}, - {"2a06:1d00::/29", "30875"}, - {"2a0f:5940::/30", "209372"}, - {"2001:4878:b048::/48", "12222"}, - {"2a02:2698:5409::/38", "41843"}, - {"2a03:c20::/29", "50825"}, - {"2001:678:5a0::/48", "207946"}, - {"2408:8256:2d9c::/46", "17623"}, - {"240a:afb7::/32", "146673"}, - {"240e:438:8c40::/38", "4134"}, - {"2408:8456:7640::/36", "17816"}, - {"2a02:2b60:242::/32", "42947"}, - {"2001:fb0:109f:1a::/48", "7470"}, - {"2001:1938:3005::/39", "33438"}, - {"2408:840d:6c00::/42", "17621"}, - {"240a:a9b7::/32", "145137"}, - {"2800:be0::/38", "267848"}, - {"2804:135c::/32", "263530"}, - {"2a09:9443::/32", "206766"}, - {"2a10:5500:2002::/32", "33874"}, - {"2a11:6800:1::/48", "204957"}, - {"240e:438:5240::/37", "4134"}, - {"2804:e30:5e00::/39", "11338"}, - {"2a01:e14::/26", "12322"}, - {"2001:ee0:e600::/40", "45899"}, - {"2001:4d78:1900::/40", "15830"}, - {"2401:f980::/32", "63862"}, - {"240e:378:1a00::/34", "140330"}, - {"2600:6c38:72e::/47", "20115"}, - {"2804:853c::/32", "272566"}, - {"2a0b:6040::/32", "41821"}, - {"2401:d800:7d20::/41", "7552"}, - {"2a01:5580::/32", "29037"}, - {"2a11:7300::/29", "204790"}, - {"2409:8924:5700::/36", "56046"}, - {"240e:354:5c00::/34", "134419"}, - {"2620:171:6b::/45", "42"}, - {"2a00:c820::/32", "60330"}, - {"2a01:8840:c6::/44", "12041"}, - {"2a02:5440::/32", "198477"}, - {"240a:acf3::/32", "145965"}, - {"240e:44d:7440::/42", "140356"}, - {"2600:1488:c081::/38", "20940"}, - {"2602:fff9:f00::/40", "54839"}, - {"2605:a401:82b4::/41", "33363"}, - {"2803:4320::/32", "266734"}, - {"2806:265:5300::/37", "28481"}, - {"2a12:a140::/29", "400522"}, - {"2001:1a11:63::/45", "8781"}, - {"2001:2000:1000::/40", "3308"}, - {"240e:980:4200::/40", "58466"}, - {"2607:f898::/32", "13415"}, - {"2a02:6120::/32", "51333"}, - {"2a09:8280:50::/42", "40509"}, - {"2a10:ccc2:33::/36", "35619"}, - {"2001:559:8062::/48", "7922"}, - {"240e:3b9:9200::/36", "140317"}, - {"240e:3ba:8200::/35", "140316"}, - {"2604:d600:15da::/45", "32098"}, - {"2a02:2590::/32", "51615"}, - {"2400:1da0::/48", "140834"}, - {"2602:ff18:216::/48", "21973"}, - {"2804:1d68::/32", "264367"}, - {"2a00:99a0::/33", "28855"}, - {"2a04:78c0::/30", "24764"}, - {"2a0d:c740:1a::/48", "49367"}, - {"2600:6c7f:10::/48", "20115"}, - {"2a02:26f7:ba49::/42", "20940"}, - {"2001:559:1e7::/48", "33657"}, - {"2001:678:c::/48", "2484"}, - {"2001:4878:2228::/48", "12222"}, - {"2620:12c:7004::/48", "13652"}, - {"2a02:2498:9000::/47", "13213"}, - {"2401:4900:46a0::/44", "45609"}, - {"2605:b100::/40", "577"}, - {"2a02:26f7:dec8::/48", "36183"}, - {"2a03:a5a0:1::/48", "57152"}, - {"2a04:ebc0::/29", "30746"}, - {"2001:67c:2b4c::/48", "60218"}, - {"2409:8004:3116::/36", "24547"}, - {"2604:ca00:4b4::/41", "36492"}, - {"2607:fcd8::/42", "33182"}, - {"2801:140:10::/48", "42"}, - {"2804:248:4005::/46", "28598"}, - {"2a02:26f7:c003::/48", "20940"}, - {"2400:a980:6500::/36", "133111"}, - {"2405:11c0::/32", "134000"}, - {"240a:a6bd::/32", "144375"}, - {"2a05:bd40:d17::/48", "29264"}, - {"2a0f:cf00::/29", "30813"}, - {"2001:678:ba8::/48", "207722"}, - {"2a0e:1c40:1::/48", "208635"}, - {"2001:400:211:61::/36", "293"}, - {"2600:1008:d040::/36", "22394"}, - {"2804:5ce8::/33", "268938"}, - {"2606:5e00:f000::/36", "14576"}, - {"2620:20:8000::/48", "14618"}, - {"2a01:4280:2::/32", "31391"}, - {"2001:559:257::/48", "33287"}, - {"2804:14c:5700::/40", "28573"}, - {"2804:574:8::/34", "53013"}, - {"2804:2d48::/32", "265271"}, - {"2a09:5bc0::/29", "63023"}, - {"2001:559:4b9::/48", "33650"}, - {"240a:a80e::/32", "144712"}, - {"2a02:ee80:417e::/40", "3573"}, - {"2a05:d050:40a0::/44", "16509"}, - {"2804:1a90:9400::/33", "61868"}, - {"2a00:1da0:4004::/47", "51969"}, - {"2a02:240:100::/40", "28812"}, - {"2001:559:8744::/48", "7015"}, - {"2001:67c:2b14::/48", "29107"}, - {"2001:c20:c828::/43", "3758"}, - {"2001:1a11:74::/46", "42298"}, - {"2402:800:9ac5::/43", "7552"}, - {"240a:a2d0::/32", "143370"}, - {"240a:acf9::/32", "145971"}, - {"2607:f380::/36", "2152"}, - {"2a02:f200::/29", "33940"}, - {"2600:100e:ff20::/40", "6167"}, - {"2600:40f1:101::/48", "46639"}, - {"2603:7080::/28", "11351"}, - {"2606:8dc0::/32", "400202"}, - {"2804:5dc:48::/36", "53019"}, - {"2804:2fc0:6300::/32", "264910"}, - {"2001:250:1423::/38", "23910"}, - {"240a:a313::/32", "143437"}, - {"240e:a6:2000::/31", "4134"}, - {"2804:214:8408::/43", "26615"}, - {"2a01:5042:2003::/48", "202196"}, - {"2a10:c640:dead::/48", "211541"}, - {"2001:559:c1d9::/46", "33650"}, - {"2408:8957:8300::/40", "17816"}, - {"240a:ac83::/32", "145853"}, - {"2606:ff80:a::/48", "53259"}, - {"2804:f6c::/34", "263585"}, - {"2804:5b34::/32", "268827"}, - {"2804:692c::/32", "270253"}, - {"2a06:4100::/32", "206376"}, - {"2001:559:80cb::/48", "33657"}, - {"2804:1f3e::/32", "269324"}, - {"2a03:16e0::/32", "21235"}, - {"2a03:5640:f100::/42", "14618"}, - {"2001:da8:e80f::/48", "138373"}, - {"240a:a35c::/32", "143510"}, - {"2a03:54a0::/32", "49100"}, - {"240e:96c::/30", "4812"}, - {"2607:a680:f000::/36", "395092"}, - {"2620:132:f523::/38", "394977"}, - {"2804:161c:c00::/45", "263268"}, - {"2804:5410::/32", "268626"}, - {"2804:8564:2160::/43", "262313"}, - {"2806:2f0:9de1::/46", "17072"}, - {"2a01:4a0:51::/45", "201011"}, - {"2a02:26f7:efc9::/42", "20940"}, - {"240a:a9a4::/32", "145118"}, - {"2804:7f30:7c00::/32", "271672"}, - {"2a04:3080::/29", "29170"}, - {"2404:5d80:6000::/40", "54203"}, - {"2606:fe00::/32", "7828"}, - {"2a03:e600::/40", "1764"}, - {"2603:fc90::/26", "397165"}, - {"2800:160:21de::/42", "14259"}, - {"2a02:2370:8000::/48", "32787"}, - {"2a06:a005:20::/41", "210260"}, - {"2409:8054:3012::/47", "9808"}, - {"2001:4888:8064::/44", "22394"}, - {"2600:370f:3705::/42", "32261"}, - {"2806:2f0:7143::/42", "17072"}, - {"240e:6bb:1000::/36", "4134"}, - {"2a00:1caa::/32", "50673"}, - {"2804:38d0::/32", "266503"}, - {"2001:559:80aa::/48", "7922"}, - {"2401:d800:410::/42", "7552"}, - {"2409:8c79::/30", "9808"}, - {"2001:468:ce0::/44", "1312"}, - {"2001:4878:c037::/44", "12222"}, - {"2a01:398::/32", "24867"}, - {"2a06:c380::/29", "60721"}, - {"2401:b240::/46", "133001"}, - {"240e:97f:5000::/32", "4134"}, - {"2a00:efa0::/32", "6776"}, - {"2406:daa0:70c0::/44", "16509"}, - {"240a:a11e::/32", "142936"}, - {"2804:429c::/32", "267512"}, - {"2a02:26f7:fa00::/48", "36183"}, - {"2a0e:aa07:e200::/44", "210903"}, - {"2a10:ef40::/29", "212559"}, - {"240a:a1a0::/32", "143066"}, - {"2600:1408:f801::/31", "20940"}, - {"2602:802:b00c::/43", "397795"}, - {"2a04:2e80:21::/48", "44397"}, - {"2c0f:ed00::/48", "328442"}, - {"2a02:26f7:e184::/48", "36183"}, - {"2a09:bac0:131::/48", "395747"}, - {"2a0d:8240::/29", "210190"}, - {"2404:bf40:f001::/48", "2764"}, - {"240c:cb21::/32", "24360"}, - {"2801:80:2360::/47", "267310"}, - {"2a0e:97c0:381::/46", "211305"}, - {"2001:559:8450::/48", "33660"}, - {"2001:da8:ffd::/48", "24350"}, - {"2402:cf80:1000::/48", "62597"}, - {"2603:c0f0:2020::/39", "6142"}, - {"2607:f038:ffff::/48", "21527"}, - {"2a02:26f0:9e01::/39", "20940"}, - {"2402:e280:3da1::/45", "134674"}, - {"2406:e000:381::/44", "23655"}, - {"2607:f428:9140::/44", "19115"}, - {"2607:fd50::/32", "40015"}, - {"2001:559:15d::/48", "33491"}, - {"2001:df6:f400::/48", "132203"}, - {"240a:a6fd::/32", "144439"}, - {"240a:ad12::/32", "145996"}, - {"2602:fc97::/44", "399544"}, - {"2804:6c7c::/32", "270471"}, - {"2a02:26f7:bcd1::/42", "20940"}, - {"2a04:dcc0::/29", "201983"}, - {"2a10:b040:1::/45", "211582"}, - {"2a10:e780::/40", "212027"}, - {"2001:67c:27c::/48", "2494"}, - {"2001:13c7:7010::/48", "52224"}, - {"2408:8000:2::/47", "4837"}, - {"2607:f100::/32", "13776"}, - {"2804:6edc::/32", "270623"}, - {"2806:230:401a::/48", "265594"}, - {"2001:470:30::/48", "2033"}, - {"2401:8700:ff01::/45", "54994"}, - {"2402:1680:1::/46", "7590"}, - {"2804:1810:4000::/32", "263262"}, - {"2a02:2f00::/28", "8708"}, - {"2401:d800:a0::/41", "7552"}, - {"2401:d800:9d90::/42", "7552"}, - {"2603:40ff:4000::/36", "10578"}, - {"2801:140:fffe::/48", "262249"}, - {"2a02:26f7:1c::/48", "36183"}, - {"2001:559:8366::/47", "7015"}, - {"240a:a06a::/32", "142756"}, - {"240a:ac4f::/32", "145801"}, - {"2600:6c38:8c3::/44", "20115"}, - {"2a10:b740::/29", "202709"}, - {"2001:f28::/32", "9644"}, - {"2001:1248:98cb::/45", "11172"}, - {"2408:8026:480::/42", "17621"}, - {"2804:2990::/33", "264022"}, - {"2804:420c::/32", "267474"}, - {"2a00:8dc0:ff00::/45", "201029"}, - {"2403:ee00::/32", "9244"}, - {"2607:f930::/32", "675"}, - {"2804:4c14:ea01::/39", "267348"}, - {"2001:678:b64::/48", "30781"}, - {"240e:3:9000::/33", "4134"}, - {"2a03:9920::/32", "51546"}, - {"2a0d:8e40::/29", "40970"}, - {"2001:559:1c7::/48", "33287"}, - {"240a:a273::/32", "143277"}, - {"2a01:5420::/32", "199947"}, - {"2a01:74e0::/32", "205668"}, - {"2a0b:14c0:4::/48", "61273"}, - {"2a0f:6fc5:3e84::/48", "43694"}, - {"2620:149:a00::/48", "6185"}, - {"2a02:26f7:fa49::/42", "20940"}, - {"2a0b:4d07:1::/46", "44239"}, - {"2409:8d50::/30", "56047"}, - {"240e:964:e600::/36", "4134"}, - {"2600:370f:7164::/40", "32261"}, - {"2001:559:870a::/48", "33659"}, - {"2001:67c:2e88::/48", "198722"}, - {"2605:1c00:ff0::/44", "16787"}, - {"2804:254::/32", "262806"}, - {"2001:67c:2184::/48", "8365"}, - {"2405:9800:c903::/45", "45430"}, - {"2600:6c10:f22d::/46", "20115"}, - {"2604:2e8b:7c00::/32", "30036"}, - {"2803:9800:a905::/46", "11664"}, - {"2804:5c7c::/32", "268911"}, - {"2a11:7400:d1::/48", "3320"}, - {"2001:559:81ff::/48", "33657"}, - {"2401:3d00::/28", "17547"}, - {"240a:af1b::/32", "146517"}, - {"2a07:21c0::/29", "43260"}, - {"2a0c:b641:220::/46", "210890"}, - {"2a10:ccc0:300::/48", "56755"}, - {"2001:1a11:f0::/45", "42298"}, - {"2401:d800:b630::/41", "7552"}, - {"2402:800:5b9b::/42", "7552"}, - {"2803:d700:bb00::/33", "61461"}, - {"2804:72c4::/32", "270874"}, - {"2a02:27b8:2000::/48", "49278"}, - {"2a03:9d40:fe00::/39", "41095"}, - {"2a06:87c0::/29", "12655"}, - {"2001:67c:69c::/48", "47267"}, - {"2402:800:f780::/42", "7552"}, - {"2a02:26f7:bbc4::/47", "36183"}, - {"2a07:3500:1200::/48", "38915"}, - {"2803:d540::/32", "8053"}, - {"2a02:26f7:bd85::/46", "20940"}, - {"2001:559:823c::/48", "13367"}, - {"2001:559:c4fd::/46", "7922"}, - {"2001:67c:1370::/48", "29203"}, - {"240a:a64b::/32", "144261"}, - {"2a02:26f7:c204::/48", "36183"}, - {"2a10:8001:d000::/30", "8551"}, - {"2001:559:85e5::/46", "33491"}, - {"2405:ba00:887f::/48", "63295"}, - {"2407:7040::/32", "142299"}, - {"2600:140f:e00::/48", "9498"}, - {"2409:8008:d0::/47", "9808"}, - {"2803:6700:140::/48", "263210"}, - {"2a01:a280:8::/40", "35000"}, - {"2a02:2660::/32", "42459"}, - {"2a0b:b583::/48", "208175"}, - {"2001:559:107::/48", "7015"}, - {"2409:8904:d040::/42", "24547"}, - {"2804:1c3c::/32", "61642"}, - {"2a0d:97c0::/29", "208861"}, - {"2400:1d00::/32", "9656"}, - {"2804:43a8::/32", "267582"}, - {"2a01:c50f:43c0::/37", "12479"}, - {"2a09:3c00::/48", "6939"}, - {"240a:aa0a::/32", "145220"}, - {"2604:880:39f::/42", "29802"}, - {"2605:37c0:200::/34", "396469"}, - {"2605:a404:177::/44", "33363"}, - {"2408:8459:5e10::/42", "17623"}, - {"2804:10a4::/34", "263642"}, - {"2001:df1:8700::/48", "136735"}, - {"2404:b1:2000::/33", "9891"}, - {"2406:57c0:130::/47", "134672"}, - {"2804:114::/32", "262721"}, - {"2a0b:b87:ffe1::/48", "204994"}, - {"2a0e:eb00:1::/48", "43431"}, - {"2a0f:9400:7801::/46", "147028"}, - {"2001:16d8:deae::/34", "16150"}, - {"2401:4900:3360::/44", "45609"}, - {"2405:b900:3000::/48", "55701"}, - {"2607:f518:12e::/43", "46887"}, - {"2804:5b0::/32", "266181"}, - {"2a02:26f7:f88d::/46", "20940"}, - {"2a02:45c0:2::/45", "59675"}, - {"2408:8956:3c00::/40", "17622"}, - {"240e:3b6:c800::/37", "4134"}, - {"2804:3ea0:8100::/33", "266610"}, - {"240a:a67a::/32", "144308"}, - {"2806:2f0:80c3::/42", "17072"}, - {"2a04:4e40:5400::/48", "54113"}, - {"2a0e:6540:a16::/48", "208364"}, - {"2600:1406:8c00::/48", "35994"}, - {"2600:370f:5245::/44", "32261"}, - {"2602:fded::/36", "397472"}, - {"2608:c183:1::/48", "27066"}, - {"2800:9a0::/34", "14522"}, - {"2a02:dcc::/30", "31621"}, - {"2c0f:f368::/32", "327750"}, - {"2600:1008:9110::/36", "22394"}, - {"2607:fb10:5040::/48", "55095"}, - {"2620:84:2000::/48", "20344"}, - {"2804:31c0::/32", "262438"}, - {"2804:8454::/32", "272254"}, - {"2001:67c:56c::/48", "8925"}, - {"2406:8d40::/32", "138225"}, - {"2620:2b:e000::/48", "22697"}, - {"2001:250:2031::/48", "23910"}, - {"2001:559:8576::/48", "13367"}, - {"2001:559:8791::/46", "33652"}, - {"2001:559:c51a::/48", "7015"}, - {"2001:678:cc8::/48", "41427"}, - {"2001:e38::/32", "17934"}, - {"2402:800:7eb2::/41", "7552"}, - {"2404:5e40::/45", "137703"}, - {"2620:d0:8000::/48", "16411"}, - {"2620:11c:f::/48", "27647"}, - {"2c0f:5000::/32", "328745"}, - {"2606:7100:3100::/48", "395831"}, - {"2610:b0:4118::/47", "21433"}, - {"2620:6e:a007::/44", "397444"}, - {"2620:89:2000::/48", "394616"}, - {"2a02:73a0:70::/48", "201895"}, - {"2001:550:908::/47", "174"}, - {"2001:559:845b::/48", "33287"}, - {"2600:1417:21::/44", "20940"}, - {"2607:f6f0:8002::/40", "32550"}, - {"2a02:26f7:ba00::/48", "36183"}, - {"2401:4900:40f0::/44", "45609"}, - {"240e:a52:6400::/31", "4134"}, - {"2607:f2d8::/41", "18450"}, - {"2804:4ac8::/32", "267263"}, - {"2806:2f0:3441::/46", "17072"}, - {"2a02:2690::/32", "39783"}, - {"2a03:a5e0::/32", "51551"}, - {"2405:4d00::/32", "17416"}, - {"2409:8020:71::/40", "56046"}, - {"2602:fe9a:9::/48", "25687"}, - {"2804:4fbc::/32", "268346"}, - {"2a00:4802:1800::/44", "13124"}, - {"2a02:26f7:c409::/46", "20940"}, - {"2a02:27a9::/32", "21100"}, - {"2a09:8780::/29", "209737"}, - {"2a10:6ac0::/29", "49735"}, - {"2408:84f3:4610::/42", "134543"}, - {"240a:afc7::/32", "146689"}, - {"2602:fe41::/36", "393434"}, - {"2605:a404:2df::/39", "33363"}, - {"2607:fc48:420::/48", "40009"}, - {"2803:c400::/32", "52308"}, - {"2804:1db0::/32", "264386"}, - {"2804:5cc8::/39", "268930"}, - {"2a02:c200::/47", "51167"}, - {"2a05:14c0::/29", "28686"}, - {"2a07:e140::/29", "50582"}, - {"2a0f:9400:802d::/48", "53356"}, - {"2a0f:eb80::/47", "47267"}, - {"2001:559:7e1::/48", "7725"}, - {"240e:fb::/32", "4134"}, - {"2607:fb10:2033::/45", "55095"}, - {"2800:370:5::/48", "28006"}, - {"2804:2698::/32", "263841"}, - {"2804:68f8::/32", "270240"}, - {"2001:470:2b::/48", "12266"}, - {"2001:559:4fe::/48", "7922"}, - {"2a0c:8fc4::/30", "202401"}, - {"2a0f:9340:1a::/48", "1299"}, - {"2001:559:c1c0::/47", "7922"}, - {"2604:dbc0::/32", "21777"}, - {"2620:116:801a::/45", "27281"}, - {"2a05:2740::/29", "47176"}, - {"2404:5bc0::/32", "138596"}, - {"2404:8d02:1041::/45", "9587"}, - {"2607:2080::/32", "11678"}, - {"2800:24::/32", "14187"}, - {"2804:4170::/39", "267433"}, - {"2a01:8840:c1::/48", "207266"}, - {"2a02:1d8::/32", "20953"}, - {"2a0d:c600::/29", "35826"}, - {"2804:7ed8::/32", "28232"}, - {"2001:559:816c::/48", "7016"}, - {"2001:16a2:4000::/44", "39386"}, - {"2001:4268:120::/43", "15964"}, - {"2800:bf0:b2::/41", "27947"}, - {"2803:e560::/32", "262186"}, - {"2001:df2:7580::/48", "139903"}, - {"2001:1980:6100::/38", "29838"}, - {"2001:4b20:ca1f:1::/31", "34288"}, - {"2800:160:10da::/42", "14259"}, - {"2801:1fc:18::/48", "27951"}, - {"2a01:4a40::/32", "44814"}, - {"2001:559:841b::/48", "33657"}, - {"2402:e380:115::/44", "139073"}, - {"2a05:3580:ca00::/37", "35807"}, - {"2a0a:98c0::/29", "208571"}, - {"2a0b:d9c0:164::/46", "49544"}, - {"1900:2100::2a2c/126", "3356"}, - {"2001:559:204::/48", "33491"}, - {"240a:abff::/32", "145721"}, - {"2600:141b:1801::/34", "20940"}, - {"2801:18e::/48", "271845"}, - {"2804:ad4:d100::/34", "52925"}, - {"2001:db0:4003:ffff::3/37", "17766"}, - {"2001:dc7:cd1b::/35", "24151"}, - {"2603:f4e0::/27", "397165"}, - {"2606:2800:4233::/48", "15133"}, - {"2804:204:229::/45", "28186"}, - {"2001:559:c369::/48", "33651"}, - {"2001:1ad8::/32", "12552"}, - {"2405:2a00::/32", "55388"}, - {"2602:ff41::/36", "395176"}, - {"2804:5690::/32", "268009"}, - {"2a02:26f7:e6c4::/48", "36183"}, - {"2a02:26f7:edc0::/48", "36183"}, - {"2a0a:48c1::/32", "29422"}, - {"2408:8459:2640::/40", "17623"}, - {"2602:fdbf::/48", "397550"}, - {"2a03:2a80::/30", "47232"}, - {"2001:470:de::/48", "8046"}, - {"2001:559:213::/48", "7922"}, - {"2a02:2698:4400::/38", "42116"}, - {"2001:559:8383::/48", "33287"}, - {"2409:8a53:b00::/37", "56047"}, - {"2806:2f0:6083::/42", "17072"}, - {"2a00:11c0:82::/45", "42473"}, - {"2803:d100:e380::/41", "52362"}, - {"2a02:26f0:33::/48", "34164"}, - {"2a02:26f7:f9c1::/46", "20940"}, - {"2001:559:817a::/47", "33668"}, - {"2001:4d78:fe01::/44", "15830"}, - {"2620:75:6000::/48", "397800"}, - {"2804:145c:c210::/39", "263327"}, - {"2a02:26f7:c60a::/47", "20940"}, - {"2402:800:51c5::/43", "7552"}, - {"2407:5200:201::/46", "55915"}, - {"2409:8031:2a00::/29", "9808"}, - {"2606:82c0:500::/40", "32167"}, - {"2606:e800:400::/32", "25843"}, - {"2620:130:3025::/46", "62861"}, - {"2806:2f0:3123::/41", "17072"}, - {"2a02:22c0::/32", "43045"}, - {"2a03:6947:c00::/40", "12400"}, - {"2a0a:27c0::/32", "47217"}, - {"2402:7800:204::/34", "4826"}, - {"2a0e:1c80:a::/48", "1299"}, - {"2001:559:80ae::/48", "7016"}, - {"240a:a163::/32", "143005"}, - {"2a00:1bb0::/32", "28768"}, - {"2a0f:9400:7389::/48", "210337"}, - {"240a:a78b::/32", "144581"}, - {"2804:1040:f700::/36", "263626"}, - {"2a02:2560:a2::/32", "21127"}, - {"2001:559:86d9::/48", "33652"}, - {"2403:fc00:300::/40", "4826"}, - {"240a:af1d::/32", "146519"}, - {"2620:7e::/46", "22414"}, - {"2804:2188::/32", "61789"}, - {"2a01:c50f:fc40::/40", "12479"}, - {"2a02:2e02:2460::/40", "12479"}, - {"2001:559:8693::/48", "7015"}, - {"2600:805:461::/36", "701"}, - {"2607:1280:11a0::/43", "394972"}, - {"2800:300:6500::/40", "27651"}, - {"2a0d:f803:8f00::/40", "20278"}, - {"2a0e:b107:1787::/48", "142553"}, - {"2804:403c::/32", "265946"}, - {"2804:6650::/32", "269548"}, - {"2a0e:46c4:22a5::/44", "136918"}, - {"2600:140f:ac00::/48", "55836"}, - {"2600:370f:342b::/41", "32261"}, - {"2a0c:5000::/34", "60502"}, - {"2405:7f00:a900::/38", "133414"}, - {"2407:7200:2::/33", "10098"}, - {"2800:270::/32", "26610"}, - {"2806:2f0:2421::/48", "22884"}, - {"2a02:88d:810f::/48", "47794"}, - {"2a0e:7e40::/29", "208349"}, - {"2404:d400::/32", "38193"}, - {"2a02:26f0:1::/48", "34164"}, - {"2620:0:280::/48", "19783"}, - {"2a03:3f40:89::/48", "208685"}, - {"2a03:f440::/32", "12552"}, - {"2a0d:5642:117::/48", "35487"}, - {"2403:300::/37", "714"}, - {"2409:8904:6740::/42", "24547"}, - {"240a:a260::/32", "143258"}, - {"240a:a81a::/32", "144724"}, - {"2402:8100:2580::/43", "45271"}, - {"2405:8a00:20c4::/42", "55824"}, - {"2600:1f01:4840::/47", "16509"}, - {"2600:6c38:831::/44", "20115"}, - {"2804:3814::/32", "266454"}, - {"2804:5344::/32", "268573"}, - {"2a02:26f0:fe::/47", "20940"}, - {"2a02:26f0:e501::/38", "20940"}, - {"2a06:3280::/31", "201722"}, - {"2a0c:b641:571::/48", "24239"}, - {"2001:579:523c::/41", "22773"}, - {"2001:df0:3140::/48", "142348"}, - {"2400:b000:1000::/48", "135162"}, - {"240e:721::/29", "4134"}, - {"2620:109:1000::/40", "16958"}, - {"2804:3428::/32", "265439"}, - {"2804:3f94::/32", "262452"}, - {"2a06:b280::/29", "199213"}, - {"2001:da8:d026::/37", "23910"}, - {"2806:2f0:9603::/39", "17072"}, - {"2a03:ff40:4ed2::/32", "61102"}, - {"2a06:1680::/29", "207560"}, - {"2a0f:5100:a01::/48", "20473"}, - {"2c0f:fc88:2f::/43", "36992"}, - {"2001:e60:d8b0::/45", "4766"}, - {"2401:d800:56e0::/39", "7552"}, - {"2600:1002:b150::/40", "22394"}, - {"2801:10:800::/48", "18747"}, - {"2804:6ec0::/32", "28293"}, - {"2001:559:c287::/48", "33652"}, - {"2001:67c:4dc::/48", "201471"}, - {"2001:df1:2280::/48", "139588"}, - {"2001:4210:9816::/33", "25818"}, - {"2402:800:fb70::/40", "7552"}, - {"2600:1480:6801::/37", "20940"}, - {"2607:f740:e627::/44", "63911"}, - {"2620:79::/46", "30013"}, - {"2a00:8740:700::/40", "206680"}, - {"2a0f:e580::/48", "197424"}, - {"2c0f:f930::/32", "39287"}, - {"2404:1a3:1003::/32", "24334"}, - {"2602:107:2710::/48", "20115"}, - {"2607:a800:213::/45", "15695"}, - {"2001:559:835b::/48", "33659"}, - {"2001:df6:9000::/48", "59256"}, - {"2610:b0:4115::/46", "3573"}, - {"2804:7c::/46", "28585"}, - {"2804:2f04::/32", "264866"}, - {"2804:7968::/32", "271303"}, - {"2a04:2b40::/29", "56515"}, - {"2a04:c442:6400::/40", "2047"}, - {"2a04:f580:8290::/48", "4134"}, - {"2a0e:b107:23f::/48", "209419"}, - {"2403:1cc0::/48", "45352"}, - {"240a:ae0d::/32", "146247"}, - {"2a00:6ec0:300::/37", "56837"}, - {"2a05:3c80::/29", "47447"}, - {"2a0e:6340::/29", "58154"}, - {"2400:ca02:f138::/31", "23688"}, - {"2407:9440:52::/42", "141626"}, - {"2604:d600:1641::/46", "32098"}, - {"2a01:71a0::/32", "208988"}, - {"2a02:2498:e000::/45", "13213"}, - {"2001:559:c45a::/48", "7922"}, - {"240a:acc9::/32", "145923"}, - {"2803:d010:f::/32", "271806"}, - {"2804:14c:486::/44", "28573"}, - {"2804:2c0:7f01::/32", "262834"}, - {"2804:4f8:a00c::/40", "28263"}, - {"2804:53c8::/32", "268606"}, - {"2a01:c50f:b280::/39", "12479"}, - {"2001:559:c10c::/48", "7922"}, - {"2001:16a2:6200::/40", "25019"}, - {"2a0e:c4c0::/29", "51711"}, - {"2a10:4646:120::/44", "52073"}, - {"2a10:8011::/28", "8551"}, - {"2001:559:834e::/48", "21508"}, - {"2a02:26f0:b701::/36", "20940"}, - {"2001:470:e8::/45", "6939"}, - {"2409:8062:2100::/36", "9808"}, - {"240a:a538::/32", "143986"}, - {"2607:fc58:1:75::/64", "13536"}, - {"2a05:a1c7::/32", "201155"}, - {"2001:67c:2e64::/48", "15542"}, - {"240a:a87f::/32", "144825"}, - {"2804:4580::/37", "266931"}, - {"2a02:26f7:ec04::/48", "36183"}, - {"2a02:cb80:2710::/48", "43766"}, - {"2405:6e00:4f0::/44", "133612"}, - {"2406:840:e0cf::/48", "141429"}, - {"2a02:b50:8002::/48", "393954"}, - {"2001:559:1cf::/48", "33660"}, - {"2607:fd78::/39", "26677"}, - {"2804:1724::/32", "263126"}, - {"2804:5dc8::/32", "268992"}, - {"2a03:3080:53::/48", "16244"}, - {"2a04:4e40:4200::/48", "54113"}, - {"2a06:b800:1000::/36", "48096"}, - {"2001:fb0:109f:8005::/64", "15133"}, - {"240a:ad76::/32", "146096"}, - {"240e:49:9000::/38", "134419"}, - {"2600:1003:f450::/36", "22394"}, - {"2804:2fc4:ff1e::/40", "264911"}, - {"240a:a68d::/32", "144327"}, - {"2804:23ac::/32", "264177"}, - {"2a02:26f0:c5::/46", "20940"}, - {"2a0b:d00:1::/46", "206886"}, - {"2402:800:33e0::/44", "7552"}, - {"2405:edc0::/48", "140746"}, - {"240a:a13a::/32", "142964"}, - {"240a:a4b6::/32", "143856"}, - {"240e:982:a300::/36", "4134"}, - {"2a00:7420:8000::/33", "208693"}, - {"2400:cb00:a460::/45", "13335"}, - {"2a01:8fb::/29", "3209"}, - {"2a0c:4480:c::/48", "204720"}, - {"2402:800:3e80::/42", "7552"}, - {"2600:6c38:b4e::/43", "20115"}, - {"2803:5ce0:500::/40", "271809"}, - {"2408:8459:bc10::/42", "17623"}, - {"240a:ab89::/32", "145603"}, - {"2607:f358:21::/48", "41095"}, - {"2620:135:5000::/45", "26457"}, - {"2a03:3780::/48", "203474"}, - {"2001:559:c372::/48", "7725"}, - {"2409:8752:300::/37", "56047"}, - {"2600:140b:9001::/38", "20940"}, - {"2800:1e0:1041::/42", "7195"}, - {"2a01:7d00::/32", "15450"}, - {"2404:f380:4::/36", "38614"}, - {"2803:18a0::/32", "266805"}, - {"2a02:26f7:fe::/48", "36183"}, - {"2a08:600:ee::/47", "206747"}, - {"2a0e:aa40::/46", "208408"}, - {"240e:45c:7500::/40", "140532"}, - {"2a02:8b8::/32", "15657"}, - {"2a02:26f7:cd09::/42", "20940"}, - {"2408:8456:4410::/42", "134543"}, - {"240a:a5be::/32", "144120"}, - {"2804:b58::/32", "52767"}, - {"2001:559:8609::/48", "7016"}, - {"2001:43f8:770::/46", "37501"}, - {"2402:3a80:18::/46", "38266"}, - {"2403:4800::/35", "9443"}, - {"2409:8087:5700::/36", "56040"}, - {"2620:107:90e1::/48", "22787"}, - {"2a00:4de0::/29", "202831"}, - {"2a0d:5600:38::/41", "9009"}, - {"2a0f:9300::/29", "198668"}, - {"2001:df3:a300::/48", "137267"}, - {"2804:1d20::/37", "264349"}, - {"2804:2bbc::/33", "265172"}, - {"2804:7e18::/32", "271602"}, - {"2a10:ae02::/48", "8767"}, - {"2001:559:3ac::/48", "21508"}, - {"2001:559:c333::/48", "7015"}, - {"2600:1480::/46", "21342"}, - {"2804:6d40::/32", "270520"}, - {"2a02:a8::/32", "9188"}, - {"2a02:26f7:bb89::/42", "20940"}, - {"2a09:402::/32", "208861"}, - {"2408:8459:a810::/42", "17623"}, - {"2409:f:f4::/48", "142502"}, - {"240c:ce05::/24", "23910"}, - {"2804:2910:10::/42", "263995"}, - {"2a02:d40:6::/48", "44592"}, - {"2a02:2698:9400::/38", "51819"}, - {"2a0e:a600::/29", "209050"}, - {"2402:8100:2140::/40", "45271"}, - {"2a02:26f7:c708::/48", "36183"}, - {"2a0b:b86:12::/48", "34692"}, - {"2001:428:4004::/48", "32571"}, - {"2804:3718::/32", "266389"}, - {"2a00:6480:8748::/48", "29018"}, - {"2a02:26f7:c8c9::/46", "20940"}, - {"2a03:8d20:8000::/48", "200849"}, - {"2a0a:7bc0::/32", "44066"}, - {"2001:559:8568::/48", "20214"}, - {"2001:4018::/32", "9150"}, - {"2407:8b00:9000::/36", "64073"}, - {"2a02:48::/32", "12969"}, - {"2c0f:fab0:1000::/48", "37492"}, - {"2001:559:33d::/48", "33668"}, - {"2001:559:8621::/48", "7922"}, - {"2001:559:86bf::/41", "7725"}, - {"2001:df4:8b00::/48", "137325"}, - {"2402:ef12::/32", "24397"}, - {"2a03:9900:100::/48", "20568"}, - {"2a09:4a40::/29", "62240"}, - {"2001:460::/44", "3561"}, - {"2001:559:4a5::/46", "33657"}, - {"240a:ab0a::/32", "145476"}, - {"240a:abab::/32", "145637"}, - {"2600:1004:a000::/42", "6167"}, - {"2602:ffc5:141::/48", "203027"}, - {"2804:6224::/32", "269278"}, - {"2a02:26f7:ea08::/48", "36183"}, - {"240a:afcd::/32", "146695"}, - {"240e:e:d000::/37", "139887"}, - {"2620:31:2009::/48", "53722"}, - {"2a05:b400::/32", "786"}, - {"2a0d:6940::/29", "47447"}, - {"2001:67c:290c::/48", "212113"}, - {"240e:438:aa20::/43", "140647"}, - {"2600:9000:118e::/43", "16509"}, - {"2804:42a8::/32", "267517"}, - {"2a02:cb43:9000::/47", "20546"}, - {"2a03:2880:f16a::/45", "32934"}, - {"2405:8a00:8030::/46", "55824"}, - {"2604:ca00:400::/42", "36492"}, - {"2800:c30::/32", "52361"}, - {"2a02:25a8:deae::/29", "12824"}, - {"2a0f:1e83:2::/32", "30633"}, - {"2001:559:74c::/48", "7922"}, - {"2604:b080::/32", "54665"}, - {"2804:6ca4::/32", "270482"}, - {"2a02:2658::/34", "20860"}, - {"2a0e:e2c2::/29", "42282"}, - {"2600:141b:b801::/33", "20940"}, - {"2804:dd0::/35", "28639"}, - {"2a02:26f7:cf::/48", "20940"}, - {"2a05:9480::/29", "202247"}, - {"2a0c:9a40:101d::/48", "202479"}, - {"2c0f:f3a0::/32", "327934"}, - {"2001:559:81f4::/48", "7922"}, - {"2001:678:9c0::/48", "50030"}, - {"2600:1419:16::/47", "20940"}, - {"2804:154c:5003::/44", "263382"}, - {"2001:1548::/38", "8280"}, - {"2401:d800:99b0::/41", "7552"}, - {"2409:807e:1900::/34", "9808"}, - {"240e:108:91::/48", "140061"}, - {"2607:f5d8:4::/43", "11096"}, - {"2620:f:1::/48", "3756"}, - {"2804:609c::/32", "269180"}, - {"2408:8956:9000::/40", "17622"}, - {"240e:105:e600::/39", "138982"}, - {"2a02:26f0:e601::/36", "20940"}, - {"2a05:3d80::/31", "59414"}, - {"2600:1004:9010::/40", "22394"}, - {"2604:9e00::/32", "27257"}, - {"2804:7078::/32", "270728"}, - {"2a10:ddc0::/29", "34907"}, - {"2001:1838:9001::/48", "13331"}, - {"2409:8054:69::/34", "56040"}, - {"240d:c000:1000::/34", "132203"}, - {"2607:fcd0:100:b200::/52", "8100"}, - {"2804:be4:c::/32", "52840"}, - {"2804:3858::/32", "266471"}, - {"2804:7158:c000::/34", "270783"}, - {"2a02:6b8:5::/46", "208722"}, - {"2a02:26f7:c2c8::/48", "36183"}, - {"2001:579:8a0::/41", "22773"}, - {"240a:aed4::/32", "146446"}, - {"2001:df0:41a::/48", "9509"}, - {"2408:8956:7b00::/40", "17816"}, - {"2602:fed5:3::/45", "27398"}, - {"2a10:7f00::/29", "399975"}, - {"2400:3b00:f::/48", "18229"}, - {"2405:f280::/47", "131464"}, - {"240a:a033::/32", "142701"}, - {"240e:86:3800::/33", "4134"}, - {"2600:d01:4000::/29", "20161"}, - {"2600:7400::/31", "29933"}, - {"2602:ff22::/36", "63297"}, - {"2604:9cc0:800::/38", "50131"}, - {"2a02:26f0:6601::/36", "20940"}, - {"2001:b08:b::/45", "3267"}, - {"2401:8000::/38", "9919"}, - {"2600:1488:60c3::/39", "20940"}, - {"2606:2800:533::/45", "15133"}, - {"2a01:8320::/32", "39636"}, - {"240e:105:ee00::/39", "58563"}, - {"2605:a401:89cc::/42", "33363"}, - {"2a02:26f7:c419::/42", "20940"}, - {"2402:4440:9c30::/40", "24423"}, - {"2804:4ea8::/32", "268275"}, - {"2403:27c0:5000::/48", "7586"}, - {"2404:5c80::/47", "59261"}, - {"2600:1403:4401::/35", "20940"}, - {"2606:a000:407::/48", "11955"}, - {"2803:3f40::/48", "264754"}, - {"2804:70fc::/32", "270760"}, - {"2001:470:9d::/42", "6939"}, - {"2405:aac0:52::/48", "139949"}, - {"240a:a2f3::/32", "143405"}, - {"240a:aa1f::/32", "145241"}, - {"2a00:11c0:3e::/48", "42473"}, - {"2a01:5f40::/32", "15682"}, - {"2a0d:940::/32", "39191"}, - {"2a0e:3c80::/29", "208909"}, - {"2a0e:46c6:4ff::/48", "209771"}, - {"2001:67c:2604::/48", "8447"}, - {"2408:840c:6a00::/40", "17621"}, - {"2603:c002:1010::/38", "31898"}, - {"2606:ae00:b1d8::/38", "7287"}, - {"2607:f748::/32", "32613"}, - {"2a02:2e02:2c20::/40", "12479"}, - {"2001:4170::/32", "13092"}, - {"2001:b000:595::/44", "3462"}, - {"2403:7e00::/32", "7546"}, - {"240a:acf2::/32", "145964"}, - {"240b::/26", "2516"}, - {"2607:f518::/39", "46887"}, - {"2804:54f8::/32", "268681"}, - {"2a02:6c40::/32", "29283"}, - {"2a04:4a43:4000::/34", "206067"}, - {"2a04:e802:12::/44", "57976"}, - {"2a10:dbc0::/29", "34907"}, - {"2408:8409::/40", "4808"}, - {"2408:8956:d240::/40", "17622"}, - {"240a:a76d::/32", "144551"}, - {"2a00:c1a0::/32", "16202"}, - {"2603:c0e8:2110::/40", "1218"}, - {"2604:3840::/48", "20061"}, - {"2804:14c:479::/40", "28573"}, - {"2804:13d0:1008::/32", "263297"}, - {"2001:559:c122::/48", "7015"}, - {"2403:d340::/32", "136462"}, - {"2409:896a:5800::/39", "9808"}, - {"2a02:26f7:d444::/48", "36183"}, - {"2a0d:ed80:101::/48", "3303"}, - {"2001:559:8498::/48", "33490"}, - {"2408:8360::/29", "4837"}, - {"2a04:4e40:8000::/48", "54113"}, - {"2600:140b:5401::/36", "20940"}, - {"2a0a:e5c0:1b::/48", "207996"}, - {"2001:1a11:9b::/42", "42298"}, - {"2401:ee00:121::/44", "23951"}, - {"2600:1413:1001::/36", "20940"}, - {"2a10:1fc0::/48", "133398"}, - {"2c0f:e8e0:4040::/42", "327926"}, - {"2001:fd8:33c0::/42", "132199"}, - {"240e:870::/44", "140485"}, - {"2800:bf0:3800::/46", "52257"}, - {"2804:4330::/32", "267554"}, - {"2a07:8d85::/30", "61110"}, - {"2a0a:fa40::/29", "210107"}, - {"2001:1248:5781::/46", "11172"}, - {"2001:1978:1e00::/40", "13768"}, - {"2600:370f:71a1::/46", "32261"}, - {"2a00:10f8::/32", "3347"}, - {"2a02:2698:3824::/38", "59713"}, - {"2407:8100:1::/48", "58436"}, - {"2409:8959:44::/32", "56040"}, - {"2602:fc62:a::/47", "399760"}, - {"2620:10f:b070::/48", "4185"}, - {"2a02:26f7:5::/48", "20940"}, - {"2a02:26f7:9e::/48", "36183"}, - {"2401:d9c0::/36", "64271"}, - {"240a:a4a3::/32", "143837"}, - {"240e:3bd:f700::/36", "4134"}, - {"2a05:1082:f000::/48", "211013"}, - {"2a0e:1040:1::/45", "208655"}, - {"2001:559:82dd::/46", "33287"}, - {"2a06:2780::/29", "204195"}, - {"2a0d:ca47::/47", "41195"}, - {"2001:1a11:81::/46", "42298"}, - {"2605:ba00::/32", "14638"}, - {"2a00:e10:2c00::/32", "61157"}, - {"2001:67c:1984::/48", "3303"}, - {"2001:5000:805::/38", "1273"}, - {"2408:836c::/30", "4837"}, - {"240e:3ba:7a00::/32", "140313"}, - {"2602:fff9::/40", "54839"}, - {"2607:fc50:5000::/36", "36236"}, - {"2620:13f:700c::/46", "59116"}, - {"2620:149:234::/41", "714"}, - {"2402:ee40::/47", "134033"}, - {"2600:8807:a0c2::/39", "22773"}, - {"2604:c0c0::/35", "14525"}, - {"2607:f9f0::/32", "14492"}, - {"2803:d900::/32", "262252"}, - {"2804:55dc:2000::/35", "267961"}, - {"2a0c:b641:280::/44", "60240"}, - {"2400:b300:2::/32", "38470"}, - {"2a01:bb20::/35", "61969"}, - {"2a02:26f7:d540::/48", "36183"}, - {"2a0c:8240::/47", "20853"}, - {"2a0d:f407:1001::/48", "209334"}, - {"2001:67c:2dfc::/48", "48004"}, - {"2a00:ba80::/32", "15557"}, - {"2001:559:8471::/48", "33659"}, - {"2800:bf0:82d4::/42", "27947"}, - {"2804:6f3c::/32", "270647"}, - {"2a02:26f0:89::/46", "20940"}, - {"2a02:26f7:d805::/46", "20940"}, - {"2001:559:c315::/48", "33651"}, - {"2404:f4c0:f900::/47", "139833"}, - {"2409:804c:3023::/45", "9808"}, - {"2606:18c0:4::/44", "14445"}, - {"2800:6f0::/37", "20207"}, - {"2804:124::/32", "28247"}, - {"2804:69bc:8000::/33", "270288"}, - {"2804:75a4::/32", "271060"}, - {"2001:678:cec::/48", "60557"}, - {"2404:cc00:8889::/35", "24441"}, - {"2600:1417:70::/48", "9498"}, - {"2606:3240:f800::/37", "399252"}, - {"2800:160:154b::/43", "14259"}, - {"2a06:9680::/41", "31293"}, - {"240a:ad98::/32", "146130"}, - {"2600:1406:44::/47", "20940"}, - {"2620:113:8045::/40", "3680"}, - {"2806:20d:5a09::/45", "32098"}, - {"2a02:cb80:4148::/47", "43766"}, - {"2402:800:9c1d::/42", "7552"}, - {"2a01:c50f:3dc0::/38", "12479"}, - {"2a02:ba0:1::/48", "12491"}, - {"2001:559:825f::/48", "33657"}, - {"2001:44b8:406f::/48", "4739"}, - {"2406:2800::/32", "18282"}, - {"2406:e300:4::/48", "40564"}, - {"2600:3005::/30", "13649"}, - {"2a0a:aac0::/29", "50599"}, - {"2408:84f3:3210::/44", "17623"}, - {"240e:308::/35", "137691"}, - {"2804:1488::/32", "28125"}, - {"2806:20d:1101::/44", "32098"}, - {"2a02:3f0::/32", "9189"}, - {"2a03:e780::/43", "39735"}, - {"2001:4f8:a::/48", "1280"}, - {"2001:4130::/48", "24725"}, - {"2403:1940:60::/48", "137935"}, - {"2409:8915:2800::/40", "56044"}, - {"2001:67c:2f54::/48", "197474"}, - {"2406:9840:1112::/32", "134053"}, - {"2408:840c:d200::/40", "17621"}, - {"240e:44d:5480::/41", "4134"}, - {"240e:978:e00::/40", "4134"}, - {"2806:230:200f::/48", "11888"}, - {"2a01:40c0::/29", "29608"}, - {"2a0c:3c00::/29", "204596"}, - {"2a10:2f00:15a::/48", "212237"}, - {"2620:11d:60c0::/46", "30548"}, - {"2a02:26f7:48::/48", "36183"}, - {"2a06:6500::/29", "204165"}, - {"2001:579:93c3::/36", "22773"}, - {"2610:b0:40d4::/47", "21433"}, - {"2804:2a60::/42", "263089"}, - {"2605:c00:900::/37", "46920"}, - {"2605:a401:81f8::/38", "33363"}, - {"2402:6800:731::/44", "22822"}, - {"2406:f3c0::/48", "135905"}, - {"2408:8000:c038::/45", "140726"}, - {"2600:380:ed00::/35", "7018"}, - {"2604:11c0:400::/40", "395822"}, - {"2a01:8640:1::/48", "61046"}, - {"2a06:dc80::/29", "202898"}, - {"2a0c:a9c7:4::/48", "64409"}, - {"2403:8940::/45", "135817"}, - {"240a:a2fa::/32", "143412"}, - {"240a:a351::/32", "143499"}, - {"2602:80b:7000::/44", "20473"}, - {"2801:80:3200::/48", "61572"}, - {"2804:241c::/32", "264202"}, - {"2804:3678::/32", "266350"}, - {"2804:7f34::/32", "271673"}, - {"2c0f:ef08::/32", "20459"}, - {"2404:3d00:413c::/46", "21433"}, - {"2409:806b:2100::/36", "9808"}, - {"2800:160:1eea::/45", "14259"}, - {"240a:aa48::/32", "145282"}, - {"240a:ad4a::/32", "146052"}, - {"2604:4d40:6a::/48", "213073"}, - {"2801:80:4d0::/48", "52834"}, - {"2409:8924:2300::/37", "56046"}, - {"240a:a90d::/32", "144967"}, - {"2a02:26f7:b705::/46", "20940"}, - {"2001:978:2:c1::b:0/112", "35277"}, - {"2a0f:b4c4::/32", "47596"}, - {"2001:559:839c::/48", "33661"}, - {"2001:1248:5b7f::/40", "11172"}, - {"2401:d800:7032::/41", "7552"}, - {"2a00:fd00::/32", "29695"}, - {"2a01:300::/43", "9009"}, - {"2a04:4e40:ac30::/41", "54113"}, - {"2001:4c38::/29", "15435"}, - {"2400:fa00::/32", "18065"}, - {"2404:bf40:8441::/42", "139084"}, - {"2405:7c00:1000::/32", "24028"}, - {"2600:1010:b0e0::/43", "22394"}, - {"2606:7e00:6::/48", "7215"}, - {"2620:84:8000::/48", "26830"}, - {"2800:160:199e::/41", "14259"}, - {"2a00:1e1f:ff00::/40", "212642"}, - {"2a05:4480::/29", "20853"}, - {"2a0e:46c0::/31", "57183"}, - {"2001:559:234::/47", "7016"}, - {"2a00:1708::/32", "49544"}, - {"2a02:26f7:f80c::/48", "36183"}, - {"2001:559:8654::/48", "33491"}, - {"2400:7400:e023::/45", "23736"}, - {"2408:84f3:e240::/37", "17816"}, - {"2804:4f8:cac9::/37", "28263"}, - {"2804:e34::/36", "61889"}, - {"2400:8700:105::/32", "55394"}, - {"2403:a040:f852::/48", "134823"}, - {"2408:8456:8840::/39", "17816"}, - {"2a09:2fc0::/29", "212144"}, - {"2001:559:82f6::/48", "33667"}, - {"2405:1ac0::/48", "18403"}, - {"2604:d600:651::/46", "32098"}, - {"2606:f780::/32", "394829"}, - {"2804:1d34::/32", "264354"}, - {"2a07:9b40::/48", "202698"}, - {"240e:18:12::/41", "4812"}, - {"2604:f440::/45", "397423"}, - {"2620:149:ae1::/48", "6185"}, - {"2806:2f0:324::/41", "17072"}, - {"2001:559:820a::/48", "33287"}, - {"2400:cb00:165::/44", "13335"}, - {"2409:8904:aa40::/39", "24547"}, - {"2a04:8e40::/29", "199927"}, - {"2001:559:26::/48", "33491"}, - {"2001:4580::/26", "4780"}, - {"2401:4900:3990::/44", "45609"}, - {"2402:800:f0e0::/39", "7552"}, - {"2406:3001:20:d::/46", "4657"}, - {"2408:8756:2cff::/48", "135061"}, - {"2607:ad00::/32", "30325"}, - {"2a00:b700:5::/48", "51659"}, - {"2a06:be80::/29", "24940"}, - {"2a07:f980::/47", "202310"}, - {"2001:da8:a8::/48", "24369"}, - {"2403:5800:4::/47", "4764"}, - {"2a02:26f0:4e00::/48", "34164"}, - {"2001:559:829c::/46", "7015"}, - {"240e:13:8800::/33", "4134"}, - {"2803:bc80::/42", "263202"}, - {"2a0c:93c0:8062::/48", "212465"}, - {"2400:adc5::/39", "9541"}, - {"240a:a783::/32", "144573"}, - {"2600:1415:e800::/48", "24319"}, - {"2001:470:f0::/48", "21589"}, - {"2001:559:7a8::/48", "33650"}, - {"2001:67c:2bb0::/48", "28674"}, - {"2001:dc7:2e00::/33", "24151"}, - {"2404:e00:161::/48", "15695"}, - {"2409:8053:3800::/47", "56047"}, - {"240e:45c:2900::/40", "137402"}, - {"2600:1001:d0d0::/34", "22394"}, - {"2804:67a4::/46", "269641"}, - {"2a00:1a28:100::/48", "48618"}, - {"2a09:b680::/32", "210625"}, - {"2a0e:dc00::/32", "208653"}, - {"2001:918:1000::/32", "3303"}, - {"2001:da8:253::/48", "24349"}, - {"2001:1248:97f9::/46", "11172"}, - {"2001:1548:207::/29", "8280"}, - {"2604:7ac0:900::/40", "398014"}, - {"2606:6680:7::/48", "40676"}, - {"2620:0:c80::/48", "1224"}, - {"2803:b0e0::/32", "269862"}, - {"2804:542c::/35", "268633"}, - {"2804:5ff0::/32", "269135"}, - {"2806:2f0:3141::/46", "17072"}, - {"2001:559:19b::/48", "33662"}, - {"2403:c00:700::/46", "17488"}, - {"2804:230c::/32", "264139"}, - {"2a00:17c8::/31", "12511"}, - {"2a04:4e40:e000::/48", "54113"}, - {"2a10:b940::/29", "5524"}, - {"2404:2000::/32", "23905"}, - {"240a:a9e5::/32", "145183"}, - {"240a:aec0::/32", "146426"}, - {"2602:feda:100::/47", "38008"}, - {"2620:4b::/48", "393523"}, - {"2800:c00::/32", "18747"}, - {"2804:29b4::/32", "264030"}, - {"2a00:13c0:202::/32", "29076"}, - {"2a0d:5dc0::/29", "12453"}, - {"2804:3dc:a2::/41", "52967"}, - {"2a0e:b107:550::/48", "207317"}, - {"240a:a50d::/32", "143943"}, - {"2804:6cd0::/32", "270494"}, - {"2001:559:83e4::/48", "7922"}, - {"2001:559:848b::/48", "33287"}, - {"240e:67b:1000::/37", "140330"}, - {"240e:964:9800::/34", "4134"}, - {"2a00:1588:dc00::/38", "43380"}, - {"2a02:ee80:418f::/43", "3573"}, - {"2408:840d:b800::/42", "17621"}, - {"2600:1008:b100::/42", "6167"}, - {"2620:ec:c000::/48", "394683"}, - {"2804:10b4::/47", "263645"}, - {"2620:1:c000::/48", "22773"}, - {"2a02:26f7:f5c9::/46", "20940"}, - {"2806:2f0:80e3::/39", "17072"}, - {"2a01:5d00::/32", "51918"}, - {"2a11:cfc0::/32", "5408"}, - {"2001:1900:2310::/41", "3356"}, - {"2405:6e00:2e00::/35", "133612"}, - {"240a:aa8f::/32", "145353"}, - {"240a:aac1::/32", "145403"}, - {"2a06:62c0:90::/32", "204138"}, - {"2402:8600::/32", "38896"}, - {"2600:140a:c001::/34", "20940"}, - {"2603:c0f8:2210::/40", "20054"}, - {"2606:9500:300::/36", "19893"}, - {"2a03:aa00::/36", "48176"}, - {"2a0c:98c0::/29", "49223"}, - {"2604:4500:100::/40", "29802"}, - {"2620:1f8:f0ef::/48", "40443"}, - {"2a02:26f7:e300::/48", "36183"}, - {"2a04:5d40::/29", "59767"}, - {"2804:297c:e001::/35", "262907"}, - {"2401:5f80:f000::/36", "38731"}, - {"2409:8051:2c00::/38", "9808"}, - {"2620:3b:4000::/48", "62681"}, - {"2804:33a4::/32", "265409"}, - {"2a02:cb80:2920::/48", "43766"}, - {"2001:4998:ef66::/44", "10310"}, - {"2400:6280:145::/46", "135381"}, - {"240a:ac2b::/32", "145765"}, - {"2607:a800:206::/48", "15695"}, - {"2804:5a1c::/32", "268749"}, - {"2a00:b740:5::/48", "13253"}, - {"2001:559:c134::/48", "33668"}, - {"2600:6c50::/30", "20115"}, - {"2407:7100::/32", "131149"}, - {"240e:438:8620::/43", "140647"}, - {"2602:ff66::/36", "394146"}, - {"2804:4ef4::/34", "268294"}, - {"2a01:b300::/29", "51678"}, - {"2a0b:4340:c8::/47", "44421"}, - {"2c0f:7800::/32", "60171"}, - {"2001:559:7a0::/48", "13367"}, - {"2400:bc00:1800::/48", "10115"}, - {"2401:7400:4020::/36", "4773"}, - {"2804:76e8::/32", "271142"}, - {"2001:628:2001::/29", "1853"}, - {"2001:df0:22c0::/48", "7603"}, - {"2604:2d40::/32", "53764"}, - {"2804:2d80::/32", "262378"}, - {"2001:559:81bd::/46", "7922"}, - {"2001:1a68:7::/48", "42503"}, - {"240a:a2c3::/32", "143357"}, - {"2804:741c::/32", "270959"}, - {"2a02:26f7:d648::/48", "36183"}, - {"2804:64c4::/32", "269447"}, - {"2001:559:2b6::/48", "33657"}, - {"2001:4528::/36", "18101"}, - {"2401:3c00:c0::/46", "38322"}, - {"2401:4900:5c90::/44", "45609"}, - {"2602:fc23:118::/47", "8095"}, - {"2607:7b00:3000::/33", "54643"}, - {"2803:5440:334::/48", "264738"}, - {"2804:4bb8::/32", "267326"}, - {"2a07:c600::/29", "199163"}, - {"2a10:7440::/29", "12552"}, - {"2402:ef23::/32", "7633"}, - {"2404:1fc0:1105::/32", "133217"}, - {"2605:6840:300::/32", "398041"}, - {"2620:10a:8055::/48", "394354"}, - {"2a01:111:202c::/46", "8068"}, - {"2a07:6fc6::/32", "204254"}, - {"2a0e:b107:1580::/48", "211013"}, - {"2605:6400:40::/48", "53667"}, - {"2806:1060::/32", "8151"}, - {"240e:97d::/36", "134763"}, - {"2600:6c10:f05d::/42", "20115"}, - {"2a00:16d8:52::/48", "52011"}, - {"2001:df7:5300::/48", "138115"}, - {"2404:55c0::/32", "17831"}, - {"2a0c:5b00::/29", "204970"}, - {"2a0f:23c7::/32", "35425"}, - {"2a10:e380::/32", "29066"}, - {"2600:370f:3082::/47", "32261"}, - {"2804:1468:9000::/33", "263328"}, - {"2408:8456:7040::/39", "17816"}, - {"240a:a33d::/32", "143479"}, - {"240a:ae86::/32", "146368"}, - {"2602:fd76::/36", "393986"}, - {"2605:500::/32", "823"}, - {"2607:f4e8:ac::/48", "38622"}, - {"2803:5ce0:b00::/37", "54235"}, - {"2a04:71c3::/29", "206583"}, - {"2a0c:5a80::/29", "57269"}, - {"2a0e:b107:900::/44", "20473"}, - {"2001:4457:ff1::/32", "9299"}, - {"240a:ae41::/32", "146299"}, - {"240e:3b0:f700::/36", "4134"}, - {"2a02:2e02:a1b0::/33", "12479"}, - {"2a0b:f600::/48", "56647"}, - {"2a0f:5701:3502::/45", "205593"}, - {"2001:5e0:1e::/47", "16713"}, - {"2409:8a50:500::/38", "56047"}, - {"240a:ae42::/32", "146300"}, - {"2620:f:6000::/48", "11509"}, - {"2a04:d180::/29", "42831"}, - {"240e:44d:6b40::/42", "140351"}, - {"2600:6c38:64::/44", "20115"}, - {"2620:106:8000::/44", "33309"}, - {"2a00:1288:84::/48", "203219"}, - {"2a00:1a08::/32", "25534"}, - {"2a02:26f7:cf45::/46", "20940"}, - {"2001:559:c411::/48", "33650"}, - {"2404:e6:230::/36", "703"}, - {"2001:67c:2f4::/48", "47137"}, - {"2401:ad00::/32", "18125"}, - {"2409:894a:a900::/37", "24445"}, - {"2803:9200::/32", "16592"}, - {"2804:42d4::/32", "267530"}, - {"2a04:3f80::/30", "9120"}, - {"2a0e:97c3:5b5::/48", "20473"}, - {"2001:559:840d::/48", "33657"}, - {"2a02:17c8::/32", "39648"}, - {"2a02:dc00:1::/46", "15493"}, - {"2a04:e800:5015::/46", "57976"}, - {"2620:125:9015::/48", "10780"}, - {"2804:14c:5fe9::/43", "28573"}, - {"2001:13c7:600a::/48", "52376"}, - {"2408:863c::/31", "4837"}, - {"2a01:c50e:5600::/36", "12479"}, - {"2604:a440:ffff::/48", "22549"}, - {"2803:6d00:8c00::/33", "52444"}, - {"2a0a:5900::/29", "30852"}, - {"2405:9800:c880::/48", "45458"}, - {"2406:9840:10::/35", "134053"}, - {"2409:8057:3018::/48", "9808"}, - {"2a02:cdc0::/29", "59715"}, - {"2a04:d040::/29", "48641"}, - {"2605:a900:b::/45", "46887"}, - {"2620:0:6b0::/48", "23028"}, - {"2806:2f0:4563::/40", "17072"}, - {"2001:13c7:6009::/48", "52332"}, - {"2402:7500:4ff::/48", "24158"}, - {"2408:8256:3491::/46", "17816"}, - {"240a:a523::/32", "143965"}, - {"2804:1288:f99a::/37", "263482"}, - {"2804:81dc::/32", "272481"}, - {"2806:2f0:47c1::/42", "17072"}, - {"2001:559:8413::/48", "7016"}, - {"2001:918:fffb::/45", "3303"}, - {"2401:d800:9ea2::/41", "7552"}, - {"2408:8456:ae40::/35", "17816"}, - {"2804:46c0::/32", "267009"}, - {"2a00:e10::/34", "61157"}, - {"2a0d:b201:3000::/42", "206026"}, - {"2801:80:1b60::/48", "266443"}, - {"2804:1ee8::/32", "264453"}, - {"2a00:9de0::/32", "60228"}, - {"2a0c:4187:8002::/33", "29854"}, - {"2001:559:81ab::/48", "33659"}, - {"2001:e60:8768::/43", "4766"}, - {"2400:a840::/32", "134090"}, - {"2a05:36c0:2::/48", "48809"}, - {"2402:6440:1::/46", "135905"}, - {"2409:8924:9700::/36", "56046"}, - {"2804:7f6c::/42", "271687"}, - {"2a0a:2584::/31", "206568"}, - {"2404:8d00:1020::/37", "24378"}, - {"240a:ae3e::/32", "146296"}, - {"2600:6c7f:9010::/48", "20115"}, - {"2606:5300::/32", "3367"}, - {"2a03:cc00::/36", "9183"}, - {"2a09:be40:3662::/48", "41108"}, - {"2001:559:8127::/48", "33660"}, - {"2001:559:8438::/48", "33650"}, - {"2001:559:c338::/48", "33659"}, - {"2001:4540::/31", "9924"}, - {"2600:1800:6::/44", "16552"}, - {"2600:6c38:455::/46", "20115"}, - {"2402:800:fc70::/40", "7552"}, - {"240a:a02e::/32", "142696"}, - {"240a:a09d::/32", "142807"}, - {"2602:fed2:730a::/45", "53356"}, - {"2804:2238:f00::/32", "264598"}, - {"2804:5160::/32", "268448"}, - {"2602:feb4:a0::/44", "25961"}, - {"2606:a500::/32", "10653"}, - {"2a06:480::/29", "200758"}, - {"2401:d800:9f40::/42", "7552"}, - {"2404:cc00::/45", "24441"}, - {"2605:4c40:119::/38", "30081"}, - {"2801:18a::/44", "19429"}, - {"2c0f:f2a0:3::/45", "327849"}, - {"2001:4490:7800::/46", "9829"}, - {"2800:1e0:1020::/46", "7195"}, - {"2806:2f0:10e0::/43", "17072"}, - {"2806:3c6::/32", "270148"}, - {"2a02:26f7:e0c0::/48", "36183"}, - {"2a02:2e02:8f30::/41", "12479"}, - {"2a03:4b27:f000::/36", "204320"}, - {"2001:678:298::/48", "2613"}, - {"2804:37f0:1100::/36", "266445"}, - {"2a02:7540::/32", "47359"}, - {"2a03:8820::/32", "200932"}, - {"2a0b:b480::/29", "43288"}, - {"2404:3d00:4118::/42", "3573"}, - {"2408:8957:5a00::/40", "17622"}, - {"2400:a980:cc::/48", "134169"}, - {"2404:8d06:9000::/40", "133543"}, - {"2600:6:ff40::/46", "10507"}, - {"2620:1bc:1025::/46", "7726"}, - {"2803:6700:10::/48", "263210"}, - {"2804:b:c00d::/48", "14840"}, - {"2407:7c0:100::/43", "9422"}, - {"2409:896a:8200::/39", "9808"}, - {"240e:ff:d000::/36", "58543"}, - {"2607:f318::/32", "7774"}, - {"2620:111:e008::/45", "27367"}, - {"2800:5a0::/32", "27792"}, - {"2001:da8:802b::/43", "24364"}, - {"2401:25c0::/32", "131918"}, - {"2804:2dac::/35", "265296"}, - {"2804:7de0::/32", "271588"}, - {"2c0f:e8e0:4070::/40", "327926"}, - {"2001:bf2::/29", "12732"}, - {"2803:f800:50::/45", "13335"}, - {"2001:4878:a141::/48", "12222"}, - {"2400:9fc0::/32", "136525"}, - {"2408:8459:1f50::/34", "17816"}, - {"2604:680::/32", "40281"}, - {"2a00:bd20::/32", "8455"}, - {"2a02:26f7:bd4d::/46", "20940"}, - {"2408:8459:9610::/42", "17623"}, - {"2604:d600:1818::/38", "32098"}, - {"2800:160:10f5::/39", "14259"}, - {"2804:4124::/32", "266006"}, - {"2a01:750::/47", "6702"}, - {"2a02:26f7:e741::/46", "20940"}, - {"2001:67c:8a0::/48", "24954"}, - {"2402:800:b8c0::/42", "7552"}, - {"2403:140::/32", "134113"}, - {"2804:7008::/32", "270702"}, - {"2a02:26f0:bf01::/33", "20940"}, - {"2620:107:904c::/48", "22787"}, - {"2804:1324::/32", "263518"}, - {"2804:2584::/32", "264285"}, - {"2a00:1ae8::/32", "42517"}, - {"2a12:d100::/29", "204790"}, - {"2400:7800::/32", "4713"}, - {"2401:d800:5ca2::/41", "7552"}, - {"240e:37d:2600::/32", "4134"}, - {"2804:2118::/32", "264533"}, - {"2804:40b0::/32", "265975"}, - {"2001:678:2e0::/48", "29686"}, - {"2001:43f8:c40::/48", "37578"}, - {"240a:ad06::/32", "145984"}, - {"2602:feda:cdc::/48", "141221"}, - {"2a00:8a00:2000::/35", "18666"}, - {"2a0a:d140::/29", "205919"}, - {"2001:253:132::/48", "142098"}, - {"2806:2f0:4421::/46", "17072"}, - {"2a02:26f7:be00::/48", "36183"}, - {"2001:559:c158::/48", "22258"}, - {"2404:a8:3ff::/48", "24514"}, - {"2408:8456:f000::/42", "17622"}, - {"2408:8957:d640::/40", "17622"}, - {"2800:160:10d4::/44", "14259"}, - {"2800:160:1b3f::/41", "14259"}, - {"2a05:4741:25::/48", "212520"}, - {"2606:d280::/32", "394625"}, - {"2800:160:1525::/44", "14259"}, - {"2804:4f58:8100::/33", "268321"}, - {"2a02:26f7:c30d::/42", "20940"}, - {"2a02:cb43:3000::/46", "20546"}, - {"2a06:6d00::/29", "22663"}, - {"2a0c:1480::/29", "16353"}, - {"2400:c0::/27", "4766"}, - {"2409:8904:6570::/40", "24547"}, - {"2620:101:402d::/48", "16880"}, - {"2800:484:7a00::/32", "10620"}, - {"2a00:5646::/32", "13030"}, - {"2401:7500:fff0::/47", "133296"}, - {"2603:c0f8:2a10::/40", "20054"}, - {"2a07:8780::/29", "211466"}, - {"2a12:a307:2::/48", "134666"}, - {"2408:8940::/32", "4837"}, - {"2409:8904:5b70::/40", "24547"}, - {"2600:140f:e401::/38", "20940"}, - {"2604:f3c0::/32", "27602"}, - {"2804:28f0::/32", "263988"}, - {"2804:5548::/32", "268700"}, - {"2a00:f7a0::/40", "21277"}, - {"2a10:22c0::/29", "206807"}, - {"2001:559:8442::/48", "7016"}, - {"2800:300:69a0::/32", "27986"}, - {"2804:6268::/32", "269295"}, - {"2607:6100:100b::/48", "398951"}, - {"2a00:5881:c000::/40", "51083"}, - {"2a01:5c40::/46", "12687"}, - {"2a0b:c200::/29", "24953"}, - {"2804:bd0:df::/32", "10670"}, - {"2804:3218::/32", "265055"}, - {"2a00:1c39::/32", "29014"}, - {"2a0d:8480:1::/48", "207651"}, - {"2602:feb4:80::/44", "25961"}, - {"2a02:26f7:be84::/48", "36183"}, - {"2a02:26f7:d851::/42", "20940"}, - {"2408:8957:8400::/40", "17622"}, - {"2a0e:8f02:f024::/48", "211521"}, - {"2600:6c2e:230::/39", "20115"}, - {"2804:4324::/32", "267551"}, - {"2406:b400:50::/44", "18209"}, - {"2804:1218:4000::/36", "263456"}, - {"2001:559:81b6::/48", "33287"}, - {"2a11:9180::/29", "204790"}, - {"2c0f:f828::/32", "37468"}, - {"2402:800:b160::/40", "7552"}, - {"2406:8000::/32", "17955"}, - {"240e:92a::/31", "58542"}, - {"2600:1003:a800::/44", "6167"}, - {"2a02:26f7:b6cc::/48", "36183"}, - {"2a02:21f8::/32", "8851"}, - {"2a02:26f0:df01::/34", "20940"}, - {"2a11:c80::/29", "208861"}, - {"2001:15e0::/32", "8897"}, - {"2405:af80::/32", "135559"}, - {"2407:ac00::/32", "45470"}, - {"2409:8054:28::/48", "9808"}, - {"2600:1404:1401::/36", "20940"}, - {"2a0c:e082::/43", "51095"}, - {"2a11:af02::/32", "208861"}, - {"2400:a980:c0::/48", "133111"}, - {"2401:d800:fd30::/41", "7552"}, - {"2600:1014::/32", "22394"}, - {"2602:ff3d::/36", "395214"}, - {"2804:204:20a::/45", "28186"}, - {"2804:248::/46", "28598"}, - {"2804:1564::/34", "52570"}, - {"2a02:638::/32", "34803"}, - {"2001:da8:e823::/48", "138373"}, - {"2001:44c8:4600::/43", "131445"}, - {"2803:5780::/32", "263720"}, - {"2a02:26f0:5d01::/38", "20940"}, - {"2404:5800::/39", "9911"}, - {"2409:8020:3032::/45", "56046"}, - {"2600:1008:b040::/42", "6167"}, - {"2620:3::/48", "14200"}, - {"2800:5f0:83e::/41", "22724"}, - {"2a00:14b0::/32", "13135"}, - {"2a0d:70c0::/29", "47995"}, - {"2804:360::/32", "53088"}, - {"2806:20f::/32", "28408"}, - {"240a:acb4::/32", "145902"}, - {"2804:49c8::/32", "267203"}, - {"2a0c:a9c7:8::/46", "41740"}, - {"2001:43f8:c1::/48", "37578"}, - {"2402:800:f290::/42", "7552"}, - {"2606:3380:212::/47", "53334"}, - {"2620:1ec:c11::/48", "8068"}, - {"2804:6b54::/32", "270393"}, - {"2a03:bcc0:1::/48", "197882"}, - {"2001:559:8634::/48", "33659"}, - {"2001:579:90a0::/44", "22773"}, - {"2409:8907:6b20::/37", "24547"}, - {"2804:15a4:1210::/32", "263400"}, - {"2a09:a700::/29", "209854"}, - {"2001:67c:21c::/48", "51090"}, - {"2001:67c:2104::/48", "9182"}, - {"2400:cb00:a800::/45", "13335"}, - {"2800:200:e221::/41", "12252"}, - {"2804:14c:7b00::/40", "28573"}, - {"2a0b:2900:3100::/38", "48582"}, - {"2a0e:6540:b0::/48", "208364"}, - {"2001:448a:10d0::/42", "7713"}, - {"240a:a1a7::/32", "143073"}, - {"2804:2384:d000::/34", "264167"}, - {"2806:103e:10::/48", "8151"}, - {"2a0d:5f00::/30", "31438"}, - {"2c0f:f9e0::/48", "37148"}, - {"2402:9e00::/37", "24183"}, - {"240c:c0a1::/29", "23910"}, - {"2600:1401:6001::/48", "20940"}, - {"2620:111:103d::/48", "18469"}, - {"2a00:1de8::/32", "48220"}, - {"2a0b:2d80::/32", "212521"}, - {"2a0e:97c0:5d0::/44", "210476"}, - {"2001:559:c4d2::/48", "7922"}, - {"2403:7940:fcc0::/48", "33353"}, - {"240a:a57e::/32", "144056"}, - {"2804:185c::/32", "52541"}, - {"2804:6ea0:8030::/34", "270609"}, - {"2a0e:5540:100::/48", "208258"}, - {"240a:a6ea::/32", "144420"}, - {"2803:a760::/32", "269855"}, - {"2a07:1980:13::/48", "25773"}, - {"2a09:6d00::/29", "209871"}, - {"2a10:c0c0::/29", "208861"}, - {"2a11:c500::/29", "42375"}, - {"2405:c0:1000::/47", "138881"}, - {"2607:f4e8::/45", "22822"}, - {"2804:2f88::/32", "264897"}, - {"2001:1388:8441::/42", "6147"}, - {"240a:a6b4::/32", "144366"}, - {"2801:1b:1800::/48", "10753"}, - {"2806:2f0:5241::/46", "17072"}, - {"2a0f:93c1:28::/29", "62240"}, - {"2001:388:cf86::/34", "7575"}, - {"2a02:2a68::/32", "702"}, - {"2a06:2600::/32", "20473"}, - {"2a10:3e40::/29", "204790"}, - {"2406:da00:2000::/40", "16509"}, - {"2620:10a:b080::/47", "15297"}, - {"2a02:26f7:d808::/47", "36183"}, - {"240a:a9ad::/32", "145127"}, - {"2804:4468::/32", "267631"}, - {"2001:559:3e7::/48", "7015"}, - {"2406:a1c0:100::/37", "131921"}, - {"2a01:6a0::/32", "13284"}, - {"2001:559:811e::/48", "33657"}, - {"2001:559:c1aa::/47", "7015"}, - {"2001:67c:1788::/48", "209295"}, - {"2409:8c20:816::/44", "56046"}, - {"2803:e580::/32", "61467"}, - {"2606:b600:104::/48", "12167"}, - {"2001:253:111::/48", "142077"}, - {"2605:b40::/32", "397142"}, - {"2804:14c:7981::/46", "28573"}, - {"2a02:970:1407::/41", "44002"}, - {"2a02:26f7:efc8::/48", "36183"}, - {"2a0e:b107:139::/48", "212227"}, - {"2c0f:eb58::/32", "36924"}, - {"2604:b000:f000::/36", "14638"}, - {"2620:a3:e030::/48", "39952"}, - {"2804:a54:2::/43", "262664"}, - {"2804:b18:8050::/40", "52941"}, - {"2804:b64::/32", "52770"}, - {"2804:13dc::/32", "262428"}, - {"2804:435c::/38", "267565"}, - {"2a02:26f7:32::/48", "36183"}, - {"2001:559:c152::/48", "33652"}, - {"2001:4490:ffc::/46", "9829"}, - {"2408:821a::/31", "4837"}, - {"240c:c002::/27", "23910"}, - {"2607:f4a8:200e::/32", "803"}, - {"2001:4c8:101e::/47", "15290"}, - {"2001:559:862b::/48", "7922"}, - {"2001:67c:176c::/48", "31725"}, - {"2001:ee0:8d40::/35", "45899"}, - {"240e:983:140c::/39", "4134"}, - {"2600:1415:f001::/37", "20940"}, - {"2a02:5940::/32", "42160"}, - {"2a09:400::/35", "208861"}, - {"2001:678:398::/48", "57560"}, - {"2409:8055:302a::/43", "56040"}, - {"2a02:26f0:fa01::/39", "20940"}, - {"2a06:1e00::/48", "60695"}, - {"2001:559:837f::/40", "33657"}, - {"2001:5a0:a000::/33", "6453"}, - {"2001:dc7:ffd3::/45", "24151"}, - {"2400:cb00:a173::/45", "13335"}, - {"2409:806a:5d00::/31", "9808"}, - {"240a:a778::/32", "144562"}, - {"2804:680:11::/44", "262589"}, - {"2a02:fe00::/29", "199332"}, - {"2001:559:81aa::/48", "7015"}, - {"2001:579:114::/42", "22773"}, - {"2409:8924:5300::/37", "56046"}, - {"2607:1280:14b0::/44", "394972"}, - {"2803:e880:bff1::/33", "52468"}, - {"2a02:26f0:bd00::/48", "34164"}, - {"2a09:9d00::/29", "201178"}, - {"2409:8057:303c::/48", "9808"}, - {"240a:a05a::/32", "142740"}, - {"2600:9000:2340::/46", "16509"}, - {"2804:14c:3b81::/44", "28573"}, - {"2804:1d1c::/40", "53196"}, - {"2806:20d:5035::/46", "32098"}, - {"2c0f:ed50::/32", "328468"}, - {"2408:8656:2ef2::/44", "17623"}, - {"2600:1017:a800::/44", "22394"}, - {"2606:9000::/32", "18618"}, - {"2a06:cdc0:2006::/44", "49941"}, - {"2a0e:b107:4d0::/47", "209083"}, - {"2408:8779::/34", "10206"}, - {"240a:aecf::/32", "146441"}, - {"2a02:26f7:eb81::/46", "20940"}, - {"2a09:bac0:282::/45", "13335"}, - {"2a0b:b87:ffd1::/48", "29802"}, - {"2001:4528:9100::/37", "18101"}, - {"2401:d800:5c80::/42", "7552"}, - {"240e:3b7:1200::/39", "4134"}, - {"2600:6c38:c0d::/46", "20115"}, - {"2607:3180:a001::/35", "14877"}, - {"2607:fad0::/42", "32244"}, - {"2800:160:1e26::/44", "14259"}, - {"2a02:26f7:ef09::/45", "20940"}, - {"2001:67c:262c::/48", "1103"}, - {"2605:4080::/32", "26077"}, - {"2606:11c0::/32", "398263"}, - {"2803:d100:e770::/44", "52362"}, - {"2806:2f0:5481::/46", "17072"}, - {"2a0f:8380::/29", "13045"}, - {"2402:4000:bbf9::/33", "18001"}, - {"2403:71c0:2000::/48", "23959"}, - {"2408:8957:4b00::/40", "17816"}, - {"2600:1002:b1e0::/33", "22394"}, - {"2600:140f:2600::/48", "9829"}, - {"2001:67c:978::/48", "2"}, - {"2804:204:32e::/37", "28186"}, - {"2a11:c600::/29", "48352"}, - {"240a:a4f1::/32", "143915"}, - {"2600:6c3a:842::/45", "20115"}, - {"2a05:4180::/29", "201436"}, - {"2001:3c8:5506::/32", "4621"}, - {"2409:8051:3000::/47", "56047"}, - {"240a:a493::/32", "143821"}, - {"2606:c480::/32", "22361"}, - {"2804:2d2c:fa00::/39", "52971"}, - {"2001:559:c096::/48", "33287"}, - {"240a:a32f::/32", "143465"}, - {"2a02:b50:4014::/34", "30282"}, - {"2a02:26f7:e605::/46", "20940"}, - {"2001:ee0:4a80::/34", "45899"}, - {"2400:1c00:310::/44", "45143"}, - {"2602:feb3::/47", "54116"}, - {"2803:7180:2000::/36", "21575"}, - {"2804:14d:b081::/45", "28573"}, - {"2804:3068::/32", "264949"}, - {"2804:6d30::/32", "262831"}, - {"2a07:e080::/29", "202347"}, - {"2409:896a:8400::/39", "9808"}, - {"2620:104:400c::/46", "15248"}, - {"2001:fd8:e8::/39", "4775"}, - {"2001:18c0::/32", "11290"}, - {"2a02:438::/32", "13132"}, - {"2a0d:2681:100::/37", "210842"}, - {"2001:418:149e::/36", "2914"}, - {"2001:559:2f::/48", "33491"}, - {"2409:8055:68::/48", "9808"}, - {"240a:aaa5::/32", "145375"}, - {"2804:428::/32", "28218"}, - {"2a03:a800::/32", "34762"}, - {"2001:67c:240::/48", "42473"}, - {"240a:a73d::/32", "144503"}, - {"2602:ff99:5::/48", "14333"}, - {"2800:bf0:a829::/48", "52257"}, - {"2a02:26f7:db41::/45", "20940"}, - {"240a:a19f::/32", "143065"}, - {"240a:a3ee::/32", "143656"}, - {"2607:f3a0:a009::/48", "399810"}, - {"2620:0:e58::/48", "3677"}, - {"2a04:17c0::/29", "43404"}, - {"2a0c:4182::/29", "29854"}, - {"2c0f:f078:100::/37", "327939"}, - {"2001:1a11:6b::/45", "42298"}, - {"2400:cb00:a7b0::/45", "13335"}, - {"2804:431:8000::/35", "27699"}, - {"2804:4428::/32", "267606"}, - {"2a11:57c0::/29", "1239"}, - {"2001:56b:800c::/34", "852"}, - {"2606:3600:105::/48", "16839"}, - {"2806:2f0:4683::/42", "17072"}, - {"2001:688::/32", "5511"}, - {"2405:fd80:f00::/35", "135391"}, - {"2406:2000:ef69::/48", "56173"}, - {"2409:8c20:b282::/33", "56046"}, - {"2409:8e30::/29", "9808"}, - {"2606:8940::/32", "398464"}, - {"2806:230:1004::/48", "265594"}, - {"2400:cb00:50::/45", "13335"}, - {"2408:8456:e040::/38", "17816"}, - {"2804:da4::/32", "27720"}, - {"2806:288:4090::/48", "28469"}, - {"2a00:1960::/32", "47608"}, - {"2001:550:9005::/48", "2637"}, - {"2407:b001:1011::/40", "24121"}, - {"2806:2f0:44c3::/42", "17072"}, - {"2001:559:8083::/45", "7922"}, - {"2402:8400:400::/40", "17820"}, - {"2408:840d:f00::/42", "17621"}, - {"2a02:ee80:4165::/44", "3573"}, - {"2a06:e881:112::/48", "205897"}, - {"2001:559:1d3::/48", "33287"}, - {"2001:678:bf8::/48", "29301"}, - {"2001:da8:bd::/46", "23910"}, - {"2602:ffb0:ffe::/48", "40676"}, - {"2804:694:4700::/36", "262596"}, - {"2a0f:9400:7340::/47", "209101"}, - {"2001:559:8591::/46", "7016"}, - {"2001:1a10::/47", "8781"}, - {"2402:800:5a71::/44", "7552"}, - {"240e:3b1:5600::/34", "136199"}, - {"2803:7610::/45", "271956"}, - {"2804:580::/33", "262518"}, - {"2001:448a:7030::/41", "7713"}, - {"2402:800:b070::/40", "7552"}, - {"2408:84f3:e440::/38", "17816"}, - {"2620:f0:c006::/47", "14148"}, - {"2804:8324::/32", "272179"}, - {"2a00:f480::/32", "2848"}, - {"2a0e:5480::/29", "16019"}, - {"2001:1b70:b1::/48", "8147"}, - {"2406:3003:1029::/45", "4657"}, - {"2607:9080:105::/48", "7018"}, - {"2804:6170::/38", "269234"}, - {"2001:ec0:400d::/40", "131293"}, - {"2001:44c8:45c0::/43", "131445"}, - {"2409:8a53:300::/37", "56047"}, - {"2605:2400:500::/32", "3361"}, - {"2804:7638::/32", "271097"}, - {"2a00:d90::/31", "12552"}, - {"2a05:4140:190::/48", "211358"}, - {"2a0e:3940:3200::/44", "207834"}, - {"2001:18b8:112::/48", "30361"}, - {"2602:fcb6::/36", "399392"}, - {"2804:56d4::/32", "268026"}, - {"2001:559:856b::/48", "7015"}, - {"2001:18b8:5::/48", "30361"}, - {"240a:ab9b::/32", "145621"}, - {"240e:1c:3000::/36", "136188"}, - {"2804:2d90:2200::/32", "52682"}, - {"2408:8456:5800::/42", "17622"}, - {"2804:bd8:cd00::/34", "52838"}, - {"2804:36a0::/32", "266360"}, - {"2a00:8760::/32", "60750"}, - {"2a07:dbc0::/32", "42422"}, - {"2001:559:48::/48", "33657"}, - {"2001:559:849f::/48", "33657"}, - {"2001:da8:263::/48", "23910"}, - {"2600:1488:41c2::/34", "20940"}, - {"2804:2330::/32", "264147"}, - {"2a02:26f7:da08::/48", "36183"}, - {"2a02:2810::/32", "15954"}, - {"2a07:7580::/29", "44558"}, - {"2a0c:f40::/32", "41451"}, - {"2001:df0:92::/48", "55479"}, - {"2409:8002:1100::/37", "9808"}, - {"2607:ffc8:0:5::/62", "17356"}, - {"2a00:1cd0:6::/48", "43408"}, - {"2001:559:809c::/48", "7922"}, - {"2001:67c:19f8::/48", "56879"}, - {"2001:1248:8477::/40", "11172"}, - {"240a:a1a3::/32", "143069"}, - {"240e:678:c400::/34", "4134"}, - {"2607:f678::/32", "13868"}, - {"2a00:cb8:33::/45", "15695"}, - {"2a05:81c0::/29", "2875"}, - {"2a0c:e640:5::/44", "211876"}, - {"2a0e:1106::/40", "62142"}, - {"2001:da8:5ff6::/44", "23910"}, - {"2402:9800:4007::/32", "38158"}, - {"2402:e280:2244::/47", "134674"}, - {"2602:fed2:7105::/48", "207393"}, - {"2401:2a00:2004::/32", "7468"}, - {"2804:68a0::/32", "269705"}, - {"2a02:26f7:e4c0::/48", "36183"}, - {"240e:45c:6500::/40", "140530"}, - {"2620:171:26::/47", "715"}, - {"2806:2f0:7163::/40", "17072"}, - {"2a04:a182::/32", "201301"}, - {"2a0f:9b80::/32", "210231"}, - {"2001:44c8:2001::/35", "45430"}, - {"240a:a07d::/32", "142775"}, - {"2804:5634::/32", "267983"}, - {"2001:559:11d::/46", "7725"}, - {"240a:ae5a::/32", "146324"}, - {"2602:fc23:130::/44", "142419"}, - {"2001:559:c27c::/47", "33652"}, - {"2405:4700::/32", "132426"}, - {"2408:820c::/34", "17621"}, - {"2a00:ce20::/29", "15600"}, - {"2001:559:8468::/48", "22909"}, - {"2600:1406:30::/48", "35994"}, - {"2602:fe5f::/36", "32899"}, - {"2801:1d:9000::/48", "264718"}, - {"2001:df4:6300::/48", "137487"}, - {"2001:49d0:8800::/33", "2495"}, - {"2600:6c7f:91e0::/44", "19115"}, - {"2606:6000:5000::/34", "20001"}, - {"2606:6c00:104::/44", "32787"}, - {"2a00:11c0:43::/45", "42473"}, - {"2a03:4bc0:3133::/48", "13214"}, - {"2001:559:780::/48", "33652"}, - {"240a:a40c::/32", "143686"}, - {"2607:fc58:1:33::/64", "13536"}, - {"2620:11b:e030::/41", "3356"}, - {"2804:2804::/36", "263935"}, - {"2804:80a4::/32", "271764"}, - {"2a12:2400::/29", "1239"}, - {"2001:67c:25d0::/48", "48061"}, - {"2409:896a:9600::/39", "9808"}, - {"2607:f110:6::/44", "21889"}, - {"2800:bf0:2205::/40", "27947"}, - {"2a01:5240::/31", "58243"}, - {"2a02:26f7:f341::/46", "20940"}, - {"2001:559:c212::/48", "33652"}, - {"2001:fd8:3180::/42", "132199"}, - {"2407:4800:c000::/34", "139759"}, - {"2600:140a:6000::/48", "812"}, - {"2801:80:22b0::/48", "267001"}, - {"2a02:6f40::/32", "199235"}, - {"2a0c:9b40::/29", "202499"}, - {"2001:559:8103::/48", "7922"}, - {"2400:4d40:2::/38", "134204"}, - {"2407:9240:2500::/40", "51044"}, - {"240a:61:e00::/48", "9605"}, - {"2607:4480:1::/46", "40470"}, - {"2607:f5b4::/32", "395954"}, - {"2620:171:52::/45", "42"}, - {"2a07:e740:dc11::/29", "43299"}, - {"2001:559:72::/48", "7725"}, - {"2001:559:28b::/48", "33489"}, - {"2001:559:8056::/48", "33491"}, - {"2804:4fd0::/32", "268351"}, - {"2001:250:3400::/48", "138438"}, - {"2001:559:830d::/48", "33661"}, - {"2404:e00:60::/46", "15695"}, - {"2404:3800:8::/46", "45459"}, - {"240e:44a::/29", "4134"}, - {"2a0c:3cc0::/32", "203936"}, - {"2001:49d0:100::/42", "18460"}, - {"2408:8345::/35", "140726"}, - {"240e:925:3000::/36", "132153"}, - {"2604:1380:4070::/40", "54825"}, - {"2607:f208:d000::/43", "398101"}, - {"2804:3b00::/32", "52973"}, - {"2a02:ee80:4078::/45", "3573"}, - {"2408:84f3:3020::/43", "17816"}, - {"2603:4:1010::/46", "44273"}, - {"2400:adc0:c130::/48", "9541"}, - {"2400:dcc0:ac04::/39", "38631"}, - {"2409:8904:cca0::/39", "24547"}, - {"240e:438:5c40::/38", "4134"}, - {"2804:14c:8789::/45", "28573"}, - {"2804:db0::/40", "52862"}, - {"2806:230:201b::/48", "11888"}, - {"2a01:1101:6::/28", "5617"}, - {"2a10:2ec0::/32", "210625"}, - {"2001:678:bc8::/48", "57078"}, - {"2001:67c:11b0::/48", "24711"}, - {"2804:752c::/32", "271028"}, - {"2a03:db80:4410::/48", "5501"}, - {"2a05:8a00::/29", "201178"}, - {"2401:d800:baf0::/39", "7552"}, - {"2606:a600::/46", "23005"}, - {"2804:176c::/32", "263098"}, - {"2a01:a2e0::/32", "3303"}, - {"2a10:eec0:c::/48", "7342"}, - {"2401:5400::/34", "4434"}, - {"2409:8915:5200::/39", "56044"}, - {"240e:3ba:ec00::/35", "140314"}, - {"2602:ffd9:200::/40", "62874"}, - {"2804:26ec::/32", "263864"}, - {"2a01:4080::/32", "42291"}, - {"2405:a840::/32", "38562"}, - {"2620:125:7006::/48", "53780"}, - {"2a02:26f7:e701::/46", "20940"}, - {"2a02:ac80:501::/38", "25145"}, - {"2001:559:b2::/48", "22258"}, - {"2001:1278::/44", "18734"}, - {"2402:800:3e60::/43", "7552"}, - {"240a:a9c1::/32", "145147"}, - {"2804:4bd4::/32", "267331"}, - {"2a0e:46c4:2c30::/47", "142597"}, - {"2001:67c:43c::/48", "12552"}, - {"2001:da8:8f00::/48", "138370"}, - {"2001:4878:62::/47", "12222"}, - {"2620:85:e000::/48", "46616"}, - {"2a02:26f7:f505::/46", "20940"}, - {"2a06:34c0::/29", "211873"}, - {"2c0f:fc98::/32", "37282"}, - {"2001:4408:c003::/34", "4758"}, - {"2a05:b380::/29", "207307"}, - {"2600:6c10:151::/42", "20115"}, - {"2a0e:46c4:106::/48", "142289"}, - {"2a0e:b107:14a0::/44", "142438"}, - {"2001:559:54a::/48", "7922"}, - {"2001:559:84e0::/48", "33287"}, - {"240a:a9e6::/32", "145184"}, - {"2602:fec5:1::/48", "62952"}, - {"2a01:5a8:3:80::/45", "8866"}, - {"2001:559:c2a4::/48", "33652"}, - {"2001:678:b30::/48", "41634"}, - {"2001:67c:2b5c::/48", "43451"}, - {"240e:d9:d000::/37", "4134"}, - {"2620:12b:5001::/45", "27381"}, - {"2409:8c20:9c72::/47", "56046"}, - {"2620:1d7:2::/48", "7545"}, - {"2804:80d0::/32", "272414"}, - {"2a06:b700::/29", "201616"}, - {"2401:d800:b3c0::/42", "7552"}, - {"2408:8459:e850::/38", "17816"}, - {"240e:183:8208::/46", "140650"}, - {"2a03:5760:3::/32", "201900"}, - {"2a05:4bc0::/29", "59395"}, - {"2a09:bac0:109::/48", "13335"}, - {"2a01:a380::/32", "12693"}, - {"2a07:b400::/29", "14576"}, - {"2001:3c8:2705::/48", "132482"}, - {"2401:a400:400::/33", "7477"}, - {"2a03:5cc0::/32", "48685"}, - {"2a0c:5640::/29", "203498"}, - {"2001:67c:2f8::/48", "47639"}, - {"2620:7e:30e0::/48", "3356"}, - {"2620:129:9001:51::/48", "13767"}, - {"2803:9660::/32", "267900"}, - {"2803:7200:800c::/47", "27696"}, - {"2804:89c::/32", "262381"}, - {"2001:678:d40::/48", "198430"}, - {"2400:cb00:462::/45", "13335"}, - {"2409:8904:7d40::/38", "24547"}, - {"2804:1674:21::/32", "53231"}, - {"2a03:2880:f002::/44", "32934"}, - {"2400:4880:4::/32", "131178"}, - {"2400:8b00:d00::/42", "45727"}, - {"2409:8061:100::/36", "9808"}, - {"2604:b180:50::/44", "23279"}, - {"2a01:8840:79::/48", "207266"}, - {"2a02:408:8093::/48", "35295"}, - {"2a06:7243::/46", "62425"}, - {"2001:1a11:21::/48", "42298"}, - {"2607:ff28:b02b::/33", "62904"}, - {"2800:600:401::/32", "52323"}, - {"2a05:b680:8::/48", "62445"}, - {"2409:8914:b200::/39", "56044"}, - {"240e:3b6:2c00::/35", "134774"}, - {"2804:5ff8::/32", "269137"}, - {"2a02:e980:b9::/45", "19551"}, - {"2a0d:f300::/32", "50673"}, - {"2001:559:8727::/48", "7015"}, - {"2400:cb00:362::/47", "13335"}, - {"2607:4700:f002::/36", "25720"}, - {"2804:14d:4ca7::/43", "28573"}, - {"2a10:9d00::/29", "49188"}, - {"2620:6d:c000::/48", "31921"}, - {"2a0c:9a40:8180::/48", "212983"}, - {"240a:ac23::/32", "145757"}, - {"2a07:3c80:600::/40", "209322"}, - {"2001:550:501::/48", "14877"}, - {"2001:67c:2cfc::/48", "2119"}, - {"2001:8f8::/32", "8966"}, - {"2600:1409:13::/48", "35994"}, - {"2a05:b2c4::/31", "199927"}, - {"2403:b9c0::/48", "131636"}, - {"240e:63:f000::/36", "140313"}, - {"2607:ff60:7000::/32", "3900"}, - {"2804:14d:b200::/40", "28573"}, - {"2804:18e8::/32", "61762"}, - {"2804:2324::/32", "262883"}, - {"2401:1040:3::/38", "134806"}, - {"240a:a51a::/32", "143956"}, - {"2600:140b:6801::/35", "20940"}, - {"2804:29c4::/32", "264033"}, - {"2a01:9fa0::/32", "29316"}, - {"2a03:9340::/32", "25589"}, - {"2402:800:fab0::/41", "7552"}, - {"2409:8051:2002::/40", "56047"}, - {"2804:2720::/32", "263878"}, - {"2408:8459:c210::/42", "17623"}, - {"240a:ad8e::/32", "146120"}, - {"2600:1409:2::/48", "35994"}, - {"2620:0:2810::/48", "14607"}, - {"2800:160:2007::/44", "14259"}, - {"2806:20d:162c::/43", "32098"}, - {"2806:2f0:40c1::/46", "17072"}, - {"2c0f:e8e0:4::/33", "327926"}, - {"2600:9000:10cd::/43", "16509"}, - {"2001:250:3c0f::/43", "23910"}, - {"2409:8020:30c4::/32", "56046"}, - {"240a:a1da::/32", "143124"}, - {"2600:802:f05::/35", "701"}, - {"2600:1010:f010::/40", "22394"}, - {"2408:8459:8e10::/42", "17623"}, - {"2409:8087:280d::/40", "56041"}, - {"2804:4194::/32", "267442"}, - {"2a02:26f7:cfc0::/48", "36183"}, - {"2a02:26f7:eb89::/46", "20940"}, - {"2a11:af00::/32", "208861"}, - {"2404:c2c0::/40", "135629"}, - {"2409:8053:3900::/32", "9808"}, - {"240a:a3a9::/32", "143587"}, - {"240a:ad0c::/32", "145990"}, - {"2a0d:8b00::/29", "208861"}, - {"2001:44b8:4070::/44", "7545"}, - {"2a01:788:aaab::/45", "34343"}, - {"2a09:2280::/48", "209792"}, - {"2408:8456:ce00::/42", "17622"}, - {"2409:8c70:3a51::/40", "9808"}, - {"2602:fcce:801::/39", "399200"}, - {"2804:2984:680::/41", "53184"}, - {"2a00:1e68:102::/43", "42861"}, - {"2a09:bac0:70::/45", "13335"}, - {"2a09:d5c0::/32", "39150"}, - {"2c0f:f118:2::/32", "328201"}, - {"240a:abc5::/32", "145663"}, - {"2602:fd6a::/36", "396412"}, - {"2607:f810:340::/36", "6192"}, - {"2804:b18:8d::/46", "52941"}, - {"2804:5534:e801::/48", "268696"}, - {"2a01:4ba0:4::/29", "199987"}, - {"2a03:8f87:1::/48", "51793"}, - {"2402:6640:31::/36", "134995"}, - {"240e:6b5::/35", "134775"}, - {"2a01:58a0:200::/32", "51018"}, - {"2a02:26f7:b98a::/48", "36183"}, - {"2a04:e380::/29", "31275"}, - {"2a09:6600::/29", "208861"}, - {"2a0f:a200::/29", "1239"}, - {"2409:8d5a::/37", "56040"}, - {"2600:6c7f:9380::/44", "10796"}, - {"2800:160:1738::/41", "14259"}, - {"2409:8c1f:a930::/33", "9808"}, - {"2806:2f0:2121::/48", "22884"}, - {"2a0f:8680::/29", "60781"}, - {"2001:df3:e000::/48", "13214"}, - {"2405:84c0:fdfc::/46", "210872"}, - {"2800:160:1780::/43", "14259"}, - {"2804:52f4:a90::/41", "268552"}, - {"2806:2f0:9e01::/46", "17072"}, - {"2a02:26f7:75::/48", "20940"}, - {"2a05:3440::/29", "211289"}, - {"2001:250:7027::/44", "24369"}, - {"2403:5180::/48", "23961"}, - {"2600:1f10:4000::/36", "14618"}, - {"2a01:9e00:ac53::/48", "206202"}, - {"2403:300:1500::/42", "6185"}, - {"2a00:1a48::/32", "15395"}, - {"2a06:8a07::/32", "12307"}, - {"2001:559:83f6::/48", "7725"}, - {"2001:44b8:40::/46", "7545"}, - {"2400:1a00:b021::/43", "17501"}, - {"2001:559:82ca::/48", "33490"}, - {"2402:6c40::/32", "38084"}, - {"240e:964:cc00::/35", "4134"}, - {"2a00:8880::/32", "15557"}, - {"2a0f:1e81:cdaf::/30", "30633"}, - {"2001:559:85a2::/47", "33651"}, - {"240a:a5f7::/32", "144177"}, - {"2803:9800:9031::/45", "11664"}, - {"2a00:2000::/22", "5400"}, - {"2a04:ac00:1::/48", "201848"}, - {"2a09:8380::/48", "209672"}, - {"2604:cac0:45::/48", "11019"}, - {"2607:ffb0:300e::/33", "6327"}, - {"2a01:80a0:1::/48", "62156"}, - {"2a0f:a080::/29", "15391"}, - {"2804:14c:cc93::/42", "28573"}, - {"2804:7084::/32", "270731"}, - {"2a0a:7d80:2::/48", "56740"}, - {"2a0a:e5c0:c::/47", "209898"}, - {"2001:559:1b0::/47", "7922"}, - {"2001:559:874c::/46", "33657"}, - {"2804:e30:7800::/37", "11338"}, - {"2a02:d8:8009::/46", "44654"}, - {"2a02:26f0:ec00::/48", "34164"}, - {"2001:559:c4d7::/48", "33652"}, - {"2001:df0:7980::/48", "38510"}, - {"2404:26c0::/48", "135987"}, - {"2a02:26f7:f6f1::/46", "20940"}, - {"2a06:a005:60::/43", "148996"}, - {"2a07:3402::/32", "62874"}, - {"2a0d:8d07:b00c::/33", "207616"}, - {"2a0e:7280::/29", "31477"}, - {"2001:250:582a::/48", "138371"}, - {"2403:8dc0::/32", "133648"}, - {"240a:af4e::/32", "146568"}, - {"2001:559:1a9::/48", "33659"}, - {"2001:559:829f::/48", "33657"}, - {"2600:6c38:44e::/43", "20115"}, - {"2a02:26f7:f249::/42", "20940"}, - {"2a02:cb45:101::/48", "20546"}, - {"2600:6c66::/31", "33588"}, - {"2804:4a08::/32", "267214"}, - {"2001:559:2db::/48", "7922"}, - {"2600:1409:2801::/35", "20940"}, - {"2804:4e74::/32", "268262"}, - {"240a:a7eb::/32", "144677"}, - {"240e:3b1:7600::/39", "140313"}, - {"2606:2800:602c::/48", "15133"}, - {"2803:53e0:1000::/48", "52468"}, - {"2a00:ea80::/32", "34749"}, - {"2001:3c8:c305::/48", "37932"}, - {"2001:df0:427::/48", "24514"}, - {"240a:a3e1::/32", "143643"}, - {"240a:a3f8::/32", "143666"}, - {"2605:ed00:4c63::/48", "11351"}, - {"2001:520:100b::/45", "8103"}, - {"2600:4800:80::/28", "6128"}, - {"2804:4f7c::/32", "52320"}, - {"2408:8956:6500::/40", "17816"}, - {"2600:6c10:f051::/45", "20115"}, - {"2804:865c::/32", "272638"}, - {"2001:678:45c::/48", "213237"}, - {"2403:5180:6::/48", "138181"}, - {"2407:5040:400::/36", "134715"}, - {"240e:982:b200::/39", "58461"}, - {"2600:140b:5c00::/48", "31109"}, - {"2600:40ff:fc15::/40", "701"}, - {"2804:13dc:fff0::/44", "262428"}, - {"2804:4df8::/32", "268231"}, - {"2a02:2698::/42", "12768"}, - {"2a0c:d540:1112::/32", "60159"}, - {"2001:559:572::/48", "7015"}, - {"2409:8904:5d40::/42", "24547"}, - {"2600:1406:2c00::/48", "35994"}, - {"2804:5d70::/32", "268972"}, - {"2a01:71c0::/31", "198066"}, - {"2a09:fcc0::/32", "205718"}, - {"2001:559:c171::/48", "33660"}, - {"2001:579:d0c4::/42", "22773"}, - {"2001:4248::/43", "30999"}, - {"2401:4900:1cd8::/45", "24560"}, - {"2408:8274::/28", "4837"}, - {"240e:55::/34", "140330"}, - {"240e:438:1220::/43", "140647"}, - {"2801:172:2::/48", "27951"}, - {"2a02:26f7:f748::/48", "36183"}, - {"2a04:207:ffff::/48", "48101"}, - {"2a0c:e040:127::/43", "200629"}, - {"2001:df0:500::/40", "132361"}, - {"2400:f0c0::/36", "136477"}, - {"2408:8456:1d00::/42", "17622"}, - {"2804:1d04:8000::/35", "61689"}, - {"2001:550:e03::/45", "174"}, - {"2409:8057:306c::/48", "141425"}, - {"2001:49f0:a01f::/41", "174"}, - {"2402:800:348d::/43", "7552"}, - {"2803:9800:b0e1::/37", "11664"}, - {"2a00:7f80::/29", "48585"}, - {"2a00:9620::/32", "43071"}, - {"2001:559:85ea::/47", "7922"}, - {"2804:394:3000::/32", "262895"}, - {"2804:6bdc::/32", "270430"}, - {"2a02:750::/44", "42708"}, - {"2a02:26f7:d349::/42", "20940"}, - {"2402:800:588d::/43", "7552"}, - {"2404:ab80::/43", "55944"}, - {"2600:100d:bf00::/44", "6167"}, - {"2606:7a80::/28", "10958"}, - {"2804:145c:ce10::/39", "263327"}, - {"2804:7a3c:180::/36", "271357"}, - {"2a02:ea0::/29", "16218"}, - {"240a:a17e::/32", "143032"}, - {"2804:8374:8000::/33", "264502"}, - {"2001:559:c256::/48", "7922"}, - {"2402:800:5271::/44", "7552"}, - {"2602:ff1f::/36", "393635"}, - {"2a09:4c2:30::/46", "58057"}, - {"2a0e:d3c0::/48", "205869"}, - {"2a0e:d487:f00e::/48", "211066"}, - {"2001:da8:240::/48", "24349"}, - {"2001:4268:140::/38", "15964"}, - {"2600:100d:f010::/40", "22394"}, - {"2801:80:190::/48", "262413"}, - {"2a01:e0a::/37", "12322"}, - {"240e:6b9::/36", "140312"}, - {"2804:1f20::/32", "19200"}, - {"2a00:db60::/48", "15224"}, - {"2a00:f826:b::/43", "34549"}, - {"240a:a3f1::/32", "143659"}, - {"2a00:47a0::/32", "61010"}, - {"2001:559:c3e6::/48", "7015"}, - {"2607:f758:b400::/33", "13649"}, - {"2405:6c0::/48", "4515"}, - {"2803:6700:240::/48", "263210"}, - {"2a00:6920:1000::/40", "42020"}, - {"2a02:26f7:b3c9::/42", "20940"}, - {"2001:67c:1974::/48", "207760"}, - {"2408:8459:c650::/36", "17816"}, - {"2607:fb10:7062::/40", "2906"}, - {"2804:18:7a00::/37", "10429"}, - {"2804:4f64::/32", "268324"}, - {"2a03:ad40:120::/48", "199349"}, - {"2a10:56c0::/29", "212731"}, - {"2a02:2ad0:137::/44", "702"}, - {"2001:250:702b::/45", "24369"}, - {"2001:550:3500::/48", "54030"}, - {"2408:8256:358f::/48", "17816"}, - {"2001:559:8706::/48", "33659"}, - {"2001:67c:12a0::/48", "41108"}, - {"2001:fe8:8121::/48", "24435"}, - {"2401:a100::/46", "45194"}, - {"2600:1480:6800::/48", "21342"}, - {"2804:7c5c::/32", "271491"}, - {"2a01:a840::/32", "16186"}, - {"2a03:32c0:b::/43", "48503"}, - {"2001:559:c52a::/48", "7015"}, - {"2001:df0:6a80::/48", "134986"}, - {"2408:8456:3a00::/41", "17623"}, - {"2804:14d:ae85::/41", "28573"}, - {"2a02:26f0:11f::/42", "20940"}, - {"2400:f2:7001::/29", "4766"}, - {"2401:b780:5000::/48", "65435"}, - {"2603:fc10::/25", "397165"}, - {"2620:57:2000::/48", "22652"}, - {"2001:438:30::/44", "6461"}, - {"2001:aa0::/32", "5669"}, - {"2001:12f8:6::/47", "53035"}, - {"2001:16d8:57::/44", "16150"}, - {"2409:8028:2100::/37", "9808"}, - {"2604:db40::/32", "30382"}, - {"2620:10:8000::/44", "18563"}, - {"2806:230:6004::/48", "265594"}, - {"2001:559:823a::/48", "13367"}, - {"2001:df2:2c00::/48", "133929"}, - {"2620:136:d000::/48", "54710"}, - {"2001:67c:139c::/48", "44286"}, - {"2400:4c80:1010::/32", "7632"}, - {"2a00:1f68::/32", "50919"}, - {"2a01:cb00::/26", "3215"}, - {"2001:4480::/32", "17554"}, - {"2a0c:ab07:5000::/36", "208861"}, - {"2a10:1fc0:1::/48", "59711"}, - {"2001:bf7:541::/38", "44194"}, - {"2605:1280::/32", "14288"}, - {"2001:559:8403::/48", "7922"}, - {"2600:6c5c::/30", "20115"}, - {"2606:6000:7fc1::/32", "20001"}, - {"2408:840c:3a00::/40", "17621"}, - {"2600:1011:9110::/34", "6167"}, - {"2a02:dc00:9::/48", "8998"}, - {"2a05:5504:1::/44", "8218"}, - {"2a0f:6fc0::/32", "49470"}, - {"2a10:d480:ac01::/48", "206232"}, - {"2001:67c:2a18::/48", "58320"}, - {"240a:aae2::/32", "145436"}, - {"2602:fce1:221::/46", "395886"}, - {"2607:f3a0:a005::/48", "399815"}, - {"2804:50d0::/32", "268412"}, - {"2a05:3181::/32", "31514"}, - {"2001:559:800::/33", "7922"}, - {"2404:3d00:40ef::/43", "21433"}, - {"2804:0:667::/35", "2716"}, - {"2804:5480::/32", "268654"}, - {"2a01:358:4020::/36", "9121"}, - {"2a03:3e00::/32", "50469"}, - {"2a0f:5381:1338::/32", "208135"}, - {"2001:df7:cf80::/48", "138032"}, - {"2001:4490:dda8::/43", "9829"}, - {"240e:37f:1a00::/34", "140330"}, - {"2a0d:7ec0::/31", "25398"}, - {"2001:559:84bc::/48", "33657"}, - {"2402:b180:1::/48", "36351"}, - {"2602:107:30d::/48", "11426"}, - {"2800:bf0:1a6::/43", "27947"}, - {"2804:1e6c::/32", "264428"}, - {"2804:6968::/32", "270268"}, - {"2408:8956:4900::/40", "17816"}, - {"2607:9080:605::/48", "62424"}, - {"2800:590:2051::/45", "16629"}, - {"2a02:2e02:f10::/42", "12479"}, - {"2400:dd01:200e::/35", "7497"}, - {"2602:feb4:1f0::/38", "25961"}, - {"2804:2424::/32", "264204"}, - {"2a02:26f7:d3::/48", "20940"}, - {"2a04:f580:8200::/48", "4134"}, - {"2a0f:bf00:c0::/29", "208196"}, - {"2001:678:588::/48", "57260"}, - {"2602:ff8f::/40", "53274"}, - {"2a00:16f8::/48", "17025"}, - {"2a11:4c00::/29", "43624"}, - {"2001:578::/44", "22773"}, - {"2402:800:977f::/40", "7552"}, - {"2804:1c78::/32", "263041"}, - {"2001:978:2302::/47", "174"}, - {"2001:1218:60b5::/44", "278"}, - {"2804:55a0::/32", "267946"}, - {"240a:a937::/32", "145009"}, - {"2600:1407:1b::/48", "35994"}, - {"2804:220::/32", "262791"}, - {"2804:68c8::/33", "269715"}, - {"2a03:ebc0:5000::/36", "31400"}, - {"2001:4b20:100:f000::/63", "65505"}, - {"2804:1c1c:4001::/36", "61638"}, - {"2001:67c:1880::/48", "49949"}, - {"240a:aa57::/32", "145297"}, - {"2604:ca00:106::/43", "36492"}, - {"2803:d100:e3f0::/37", "52362"}, - {"2a05:d050:2040::/44", "16509"}, - {"240a:a18b::/32", "143045"}, - {"2600:9000:11cb::/45", "16509"}, - {"2620:e8::/48", "14183"}, - {"2804:6b74::/32", "270401"}, - {"2001:4c8:1016::/47", "15290"}, - {"2001:559:a3::/48", "13367"}, - {"2001:da8:20e::/48", "23910"}, - {"2001:13b0:d003::/31", "3549"}, - {"2620:35:8000::/48", "394522"}, - {"2804:7264::/32", "270849"}, - {"2a03:3b80::/32", "3308"}, - {"2001:559:59f::/48", "33287"}, - {"2001:df4:2600::/48", "132398"}, - {"2403:4d00::/32", "55785"}, - {"2408:8340::/32", "4837"}, - {"240e:44d:4c40::/42", "140357"}, - {"2604:26c0::/38", "36815"}, - {"2607:f7f0::/32", "30259"}, - {"2800:430::/34", "23487"}, - {"2804:854::/44", "28368"}, - {"2804:5534:6000::/37", "268696"}, - {"2001:250:3c0b::/45", "23910"}, - {"2001:e48:40:6::/45", "9583"}, - {"2402:a340::/32", "10200"}, - {"2409:8e80:7000::/32", "9808"}, - {"240a:a7b8::/32", "144626"}, - {"2804:75d4::/34", "271072"}, - {"2404:7e40::/47", "138649"}, - {"240e:420::/31", "140061"}, - {"2804:14c:4100::/40", "28573"}, - {"2804:4718::/32", "267031"}, - {"2001:559:836f::/48", "33657"}, - {"2001:579:9dc2::/34", "22773"}, - {"240e:3b2:d000::/36", "134772"}, - {"240e:978:f00::/40", "134769"}, - {"2600:1417:41::/48", "24319"}, - {"2409:8924:1700::/36", "56046"}, - {"2804:1f54:e000::/35", "272220"}, - {"2001:559:8238::/48", "33657"}, - {"2407:500:167::/48", "58940"}, - {"2800:bf0:280::/46", "52257"}, - {"2800:bf0:3c05::/33", "27947"}, - {"2806:2f0:4361::/46", "17072"}, - {"2a00:f440:a::/48", "29588"}, - {"2a10:4646:16::/48", "212022"}, - {"2001:253:112::/48", "142078"}, - {"2401:d800:df00::/42", "7552"}, - {"240a:a419::/32", "143699"}, - {"2804:1ac4:5::/44", "61884"}, - {"2a02:26f0:4801::/40", "20940"}, - {"2a0f:d7c0::/32", "57825"}, - {"2001:67c:2f50::/48", "2119"}, - {"2602:fed5::/46", "27398"}, - {"2804:4a90:2040::/32", "267249"}, - {"2a02:26f7:f940::/48", "36183"}, - {"2a10:5340::/29", "21454"}, - {"240e:438:1820::/43", "140647"}, - {"2804:69a8::/32", "270283"}, - {"2001:559:83cc::/48", "7016"}, - {"2001:559:84b0::/48", "7015"}, - {"2001:559:c0c7::/48", "33287"}, - {"2400:cf00::/32", "45396"}, - {"2804:42d8::/32", "267531"}, - {"2001:e60:d010::/39", "4766"}, - {"2402:800:35c5::/43", "7552"}, - {"2408:8459:cf10::/42", "17623"}, - {"2604:99c0::/32", "397790"}, - {"2804:4cd8::/32", "267396"}, - {"2a02:26f7:f401::/46", "20940"}, - {"2a02:8389:6000::/30", "8412"}, - {"2001:253:122::/48", "142088"}, - {"240a:afac::/32", "146662"}, - {"2620:101:2001::/46", "16417"}, - {"2a10:a180::/30", "10753"}, - {"240c:caa2::/23", "23910"}, - {"2606:ae00:b1b0::/41", "7287"}, - {"2804:5d58::/48", "268966"}, - {"2806:2f0:33c1::/46", "17072"}, - {"2a02:26f7:ea40::/48", "36183"}, - {"2a06:1b00::/40", "8302"}, - {"2001:559:8283::/48", "7015"}, - {"2001:559:8594::/48", "33287"}, - {"2001:1900:23cd::/48", "202818"}, - {"2401:e880::/32", "45873"}, - {"2620:1d5:6a0::/41", "14773"}, - {"2800:160:1055::/44", "14259"}, - {"2804:308c:ab00::/33", "264960"}, - {"2001:559:329::/48", "20214"}, - {"2409:8057:1008::/34", "56040"}, - {"2001:550:4100:2::/47", "174"}, - {"2403:6e40:110::/44", "9830"}, - {"2406:2000:1d0::/48", "10880"}, - {"2606:ea00::/32", "32666"}, - {"2a02:26f7:bbc8::/48", "36183"}, - {"2401:7200:a000::/46", "55328"}, - {"2403:6200:792d::/32", "45629"}, - {"2405:25c0:a300::/40", "18068"}, - {"2405:6b40::/32", "139421"}, - {"2406:3c80::/46", "17747"}, - {"2408:887e::/32", "4837"}, - {"2600:3c0f:9::/48", "63949"}, - {"2620:132:f102::/40", "394977"}, - {"2a02:2a00::/32", "12310"}, - {"2001:250:7000::/48", "24370"}, - {"2404:bf40:e605::/39", "139084"}, - {"2406:e000:371::/45", "23655"}, - {"2606:2800:30c::/46", "15133"}, - {"2a0d:82c7:9::/48", "47787"}, - {"2001:559:8341::/48", "7015"}, - {"2001:67c:2264::/48", "197118"}, - {"2405:9800:d007::/48", "133848"}, - {"2804:7dd4::/32", "271585"}, - {"2a03:4d41:410::/38", "199610"}, - {"2a04:780::/29", "39806"}, - {"2a0e:8f02:f028::/48", "212623"}, - {"240a:ada8::/32", "146146"}, - {"2a00:1a90::/33", "45014"}, - {"2a02:248::/32", "8648"}, - {"2a05:680::/29", "201597"}, - {"2401:4300:1::/45", "45184"}, - {"2408:8957:e400::/40", "17622"}, - {"2804:e30:9c00::/38", "11338"}, - {"2a01:5b40:6::/44", "12996"}, - {"2a02:26f7:e284::/48", "36183"}, - {"2406:840:f895::/46", "212034"}, - {"240e:3b9:6400::/35", "140312"}, - {"2600:1419:9401::/36", "20940"}, - {"2804:a00:f10::/32", "262838"}, - {"2001:678:228::/48", "2863"}, - {"240a:aece::/32", "146440"}, - {"2600:1402:17::/44", "35994"}, - {"2603:f0a0::/25", "397165"}, - {"2607:f428:9420::/33", "20115"}, - {"2800:1e0:2000::/40", "7195"}, - {"2001:df2:2e00::/48", "135421"}, - {"2401:d800:e000::/35", "7552"}, - {"240a:a029::/32", "142691"}, - {"2600:6c38:a3::/44", "20115"}, - {"2804:530c::/32", "268560"}, - {"2a00:1358:c100::/48", "205972"}, - {"2a02:26f7:dac0::/48", "36183"}, - {"2600:370f:71c1::/46", "32261"}, - {"2604:3400:abca::/48", "209453"}, - {"2804:8364::/32", "272195"}, - {"2a0a:e00::/48", "64432"}, - {"2a11:f2c0:ffe0::/47", "208051"}, - {"2001:44c8:3200::/36", "45430"}, - {"2402:9040::/32", "137498"}, - {"2408:8957:3100::/40", "17816"}, - {"2804:192c::/32", "61776"}, - {"2a02:ac80:6001::/35", "25145"}, - {"2a03:5a80::/32", "21367"}, - {"2001:500:a::/48", "13901"}, - {"2401:d800:95b0::/41", "7552"}, - {"2408:8456:9a10::/42", "134543"}, - {"240a:afb8::/32", "146674"}, - {"2803:6680::/39", "267789"}, - {"2804:c4c::/32", "52689"}, - {"2a01:d0:311::/45", "29632"}, - {"2a02:2668:7700::/36", "16345"}, - {"2001:fd8:b370::/44", "4775"}, - {"2801:84::/32", "263300"}, - {"2a0b:6900:185d::/48", "206873"}, - {"2001:1248:844e::/43", "11172"}, - {"240e:e:b000::/37", "58541"}, - {"2604:1380:ffe0::/44", "54825"}, - {"2804:1078::/32", "263637"}, - {"2a00:4802:2a0::/44", "13124"}, - {"2a0a:2f81::/32", "47891"}, - {"2404:de80:800::/39", "137443"}, - {"2406:2140::/32", "24202"}, - {"2605:d680::/32", "63313"}, - {"2a01:5f60::/32", "199321"}, - {"2a0b:46c0::/29", "208578"}, - {"2001:559:8704::/47", "33667"}, - {"2404:5c0:2801::/32", "138466"}, - {"2408:8756:2cfd::/46", "135061"}, - {"2600:6c10:67::/44", "20115"}, - {"2804:404c:1193::/32", "265950"}, - {"2a02:26f7:de0c::/48", "36183"}, - {"2409:8c0c:200::/39", "132510"}, - {"2605:a380:2001::/48", "399201"}, - {"2801:1d6::/40", "271833"}, - {"2804:40:8000::/36", "28657"}, - {"2804:2484:8110::/41", "28258"}, - {"2804:28f8::/32", "263990"}, - {"2a0b:8bc0::/29", "41608"}, - {"2001:4b27:ffff::14/122", "34288"}, - {"240a:a114::/32", "142926"}, - {"2602:107:1210::/48", "33363"}, - {"2605:7280:7::/32", "54600"}, - {"2001:67c:1384::/48", "204896"}, - {"240a:61:1000::/36", "9605"}, - {"2604:8e80::/34", "32505"}, - {"2a03:d5c0:100::/37", "199391"}, - {"2804:13b0:5c00::/44", "263546"}, - {"2804:1760::/32", "263142"}, - {"2a02:c50::/36", "51531"}, - {"2a02:26f7:f908::/48", "36183"}, - {"2a0f:f800::/29", "48603"}, - {"2001:559:c4af::/43", "33657"}, - {"2600:370f:20a1::/41", "32261"}, - {"2620:121:5070::/48", "14618"}, - {"2800:160:10cc::/46", "14259"}, - {"2001:4000::/32", "8565"}, - {"2404:6c00:a001::/33", "24324"}, - {"240e:974:e00::/48", "38283"}, - {"2a02:7040:ff02::/40", "199236"}, - {"2a0d:77c7:a4e::/34", "7489"}, - {"2403:8040::/32", "138184"}, - {"2600:140b:3c00::/48", "31109"}, - {"2800:1e0::/47", "7195"}, - {"2806:230:2034::/48", "265594"}, - {"2001:250:4400::/43", "24359"}, - {"2400:cb00:a760::/47", "13335"}, - {"2408:8956:f440::/40", "17622"}, - {"2607:fae0:8000::/36", "8038"}, - {"2a01:c50f:2d80::/35", "12479"}, - {"2a09:bac0:232::/48", "13335"}, - {"2402:ef05:1::/28", "7633"}, - {"2404:bf40:e302::/48", "7545"}, - {"2409:8010::/35", "9808"}, - {"2600:100a:a100::/44", "6167"}, - {"2a10:2f01:2a0::/46", "212995"}, - {"2408:840d:c500::/42", "17621"}, - {"2801:18c:1::/44", "19429"}, - {"2804:5204::/32", "268490"}, - {"2a0e:2b80:101::/38", "28875"}, - {"2600:1419:f001::/37", "20940"}, - {"2a0b:3700:2::/29", "61317"}, - {"2408:8256:3280::/48", "17816"}, - {"2409:8c70:3ad8::/48", "140105"}, - {"2804:3f0c::/38", "266636"}, - {"2a06:e540:101::/38", "203600"}, - {"2402:8100:20c3::/45", "45271"}, - {"2404:bf40:8841::/48", "7545"}, - {"240a:a517::/32", "143953"}, - {"240e:3b9:2800::/38", "4134"}, - {"2804:14c:3b9c::/42", "28573"}, - {"2804:145c:8f50::/40", "263327"}, - {"2a05:540::/30", "45027"}, - {"2001:678:68c::/48", "13259"}, - {"2001:c20:48a0::/48", "9255"}, - {"2400:8500:4800::/48", "58649"}, - {"2402:800:57d3::/44", "7552"}, - {"2406:b400:60::/48", "18209"}, - {"2804:5cc8:200::/34", "268930"}, - {"2804:7cb0:3e80::/44", "271512"}, - {"2001:df2:8100::/48", "137050"}, - {"2600:1010:b070::/40", "22394"}, - {"2606:4700:8dd0::/42", "13335"}, - {"2a10:6540::/29", "212650"}, - {"2402:c200::/32", "9374"}, - {"2001:559:87d0::/48", "33662"}, - {"2600:1900::/34", "15169"}, - {"2001:67c:2148::/48", "59570"}, - {"2001:67c:25f4::/48", "45045"}, - {"2600:370f:7540::/44", "32261"}, - {"2804:3370::/32", "265396"}, - {"2804:418c::/32", "267440"}, - {"2a01:c50f:f140::/38", "12479"}, - {"2001:559:c186::/48", "33491"}, - {"2404:bf40:8800::/48", "7545"}, - {"2803:b220::/32", "265844"}, - {"2804:2254::/32", "264603"}, - {"2001:67c:22dc::/48", "31019"}, - {"240a:a55a::/32", "144020"}, - {"2804:14d:fe00::/47", "28573"}, - {"2a00:86c0:207a::/40", "2906"}, - {"2a02:fa80::/32", "50520"}, - {"2a0e:fd45:b70::/44", "212744"}, - {"2606:ae00:1003::/48", "7287"}, - {"2800:bf0:81eb::/48", "27947"}, - {"2806:2f0:3541::/46", "17072"}, - {"2001:480:120::/48", "3381"}, - {"2001:559:2f3::/48", "33657"}, - {"2401:d800:7ea0::/41", "7552"}, - {"2803:b5a0::/33", "269804"}, - {"2a07:a905:ffe0::/46", "202297"}, - {"2001:559:8600::/48", "399141"}, - {"2001:67c:2128::/48", "48004"}, - {"2408:8957:de00::/40", "17622"}, - {"2605:100::/32", "11442"}, - {"2803:1120::/32", "52328"}, - {"2804:7b24::/32", "271413"}, - {"2a02:5c40::/32", "42451"}, - {"2a04:b040::/46", "43350"}, - {"240e:1f:b000::/33", "4134"}, - {"2600:1408:4001::/38", "20940"}, - {"2606:4700:ff01::/48", "394536"}, - {"2800:160:12ac::/43", "14259"}, - {"2a02:26f7:c941::/46", "20940"}, - {"2a03:9aa0::/32", "203646"}, - {"2a11:6240::/32", "210685"}, - {"2409:8c85:aa75::/25", "9808"}, - {"2605:a401:8002::/42", "33363"}, - {"2804:81e8::/32", "272485"}, - {"2a00:1ad0::/32", "41589"}, - {"2a05:5cc0::/29", "57877"}, - {"2001:678:20::/48", "1921"}, - {"2001:678:9d0::/48", "34944"}, - {"2001:6f8:1501::/48", "8190"}, - {"240a:c4c1::/20", "137726"}, - {"2803:fbe0:8800::/38", "270092"}, - {"2a02:e0:3204::/36", "34984"}, - {"2a0b:8d00::/29", "60721"}, - {"2001:57b:1001::/38", "22773"}, - {"2402:e280:210d::/46", "134674"}, - {"240e:44d:5580::/41", "4134"}, - {"2606:b300:8000::/40", "13926"}, - {"2a04:e800:5040::/48", "57976"}, - {"2a0b:bbc0:3100::/40", "205388"}, - {"2403:6200:792c::/48", "55451"}, - {"2408:8957:cdc0::/38", "17622"}, - {"2606:2800:4150::/48", "15133"}, - {"2a04:4e40:5000::/47", "54113"}, - {"2a0c:4fc0::/29", "203835"}, - {"2001:fd8:740::/35", "4775"}, - {"2409:8914:8800::/35", "56044"}, - {"240a:a6fc::/32", "144438"}, - {"2804:950::/32", "263072"}, - {"2a07:a640::/29", "202524"}, - {"2a0d:6d80::/29", "204591"}, - {"2001:559:c1d5::/46", "7016"}, - {"2001:918:fff3::/44", "3303"}, - {"2001:43f8:1620::/48", "328706"}, - {"2804:c28::/32", "262983"}, - {"2600:141b:d001::/36", "20940"}, - {"2804:180c::/32", "61924"}, - {"2a02:2788::/36", "12392"}, - {"2402:8100:257c::/46", "55644"}, - {"2409:800c:3001::/46", "132510"}, - {"2409:8053:100::/37", "9808"}, - {"240e:fe:a000::/35", "136198"}, - {"240e:44d:6340::/42", "140348"}, - {"2804:37cc::/32", "266436"}, - {"2804:68fc::/32", "270241"}, - {"2a02:26f7:f441::/46", "20940"}, - {"2001:559:839b::/48", "7016"}, - {"2409:8004:809::/40", "24547"}, - {"2607:bf80::/32", "32100"}, - {"2804:72b8::/32", "270871"}, - {"2a05:1180::/29", "59791"}, - {"2409:8008:2900::/35", "24547"}, - {"2600:1013:a010::/35", "6167"}, - {"2607:f790:f000::/36", "12129"}, - {"240a:a4c0::/32", "143866"}, - {"2804:5ba8::/34", "268861"}, - {"2408:8957:6900::/40", "17816"}, - {"2605:4f40:8::/45", "33661"}, - {"2804:2e1c:e381::/37", "265324"}, - {"2806:362::/32", "265606"}, - {"2a03:ba80::/32", "50446"}, - {"2402:4cc0::/32", "136724"}, - {"2408:8856:8200::/28", "17816"}, - {"240a:a0fe::/32", "142904"}, - {"2a0d:1a40:5500::/48", "57782"}, - {"2a0e:46c4:2810::/44", "212514"}, - {"2a0f:ca83:1::/48", "207616"}, - {"2401:1d40:3102::/36", "59019"}, - {"2602:fed2:7121::/46", "53356"}, - {"2804:567c::/32", "268003"}, - {"2001:12f0:240::/39", "1916"}, - {"2402:9d80:200::/41", "131429"}, - {"2605:7900:1000::/48", "42831"}, - {"2620:11b:4016::/47", "47870"}, - {"2804:14c:87c8::/46", "28573"}, - {"2804:14d:5cba::/45", "28573"}, - {"2804:17d8::/32", "61919"}, - {"2804:196c:b0c0::/33", "61794"}, - {"2a00:1d58:c480::/36", "47524"}, - {"2a00:8dc0:fffe::/47", "201029"}, - {"2409:8914:8000::/39", "56044"}, - {"2804:1f8::/32", "262787"}, - {"2a03:1d80::/29", "31117"}, - {"2406:3003:1050::/44", "4657"}, - {"2408:8956:dc00::/40", "17622"}, - {"240e:6:d810::/31", "4134"}, - {"2a05:4b40::/32", "210664"}, - {"2604:ca00:219::/42", "36492"}, - {"2802:0:49::/30", "18747"}, - {"2804:170c::/32", "263119"}, - {"2804:4c70::/32", "267370"}, - {"2001:579:8e8::/43", "22773"}, - {"2001:4218::/32", "16637"}, - {"2401:d800:9550::/42", "7552"}, - {"2a01:b6c0::/29", "60213"}, - {"2001:a48::/33", "8970"}, - {"2404:bf40:c442::/40", "139084"}, - {"2406:1500:1::/48", "132579"}, - {"2407:a4c0::/48", "140814"}, - {"2a02:ee80:419c::/46", "3573"}, - {"2001:678:338::/48", "8375"}, - {"2602:fbce::/36", "400387"}, - {"2620:78:6000::/48", "25639"}, - {"2402:1400::/32", "9993"}, - {"2407:2200::/32", "38719"}, - {"240a:a8fb::/32", "144949"}, - {"240a:a926::/32", "144992"}, - {"2600:6c21:a11::/44", "20115"}, - {"2606:2800:4a54::/46", "15133"}, - {"2804:49d0::/32", "52698"}, - {"2806:2f0:1003::/42", "22884"}, - {"2a00:6b80::/29", "33924"}, - {"2a02:26f7:e985::/46", "20940"}, - {"2a04:92c7:36::/41", "62240"}, - {"2a06:4880::/32", "211298"}, - {"2001:dc7:ffd2::/48", "24406"}, - {"2001:448a:1050::/42", "7713"}, - {"240a:a473::/32", "143789"}, - {"240c:ca04::/32", "132553"}, - {"2a03:4240::/32", "12731"}, - {"2a06:700::/29", "200665"}, - {"2a06:9687::/32", "199221"}, - {"2001:468:1800::/40", "10466"}, - {"2001:1248:9c1e::/42", "11172"}, - {"240c:408d:3000::/22", "38365"}, - {"240e:3b5:c800::/37", "4134"}, - {"2804:27f4::/32", "263931"}, - {"2804:4d3c:948::/38", "267420"}, - {"2806:230:6034::/48", "265594"}, - {"2806:262:3300::/37", "13999"}, - {"2a07:be80::/29", "212773"}, - {"2804:18c0:1400::/36", "61951"}, - {"2a02:20d0::/29", "34660"}, - {"2001:470:59::/48", "6939"}, - {"2401:d800:9aa0::/41", "7552"}, - {"2404:e00:65::/46", "15695"}, - {"2804:3358::/34", "265390"}, - {"2403:b400::/32", "10212"}, - {"2404:fe40::/32", "131982"}, - {"240e:4a:4400::/29", "4134"}, - {"240e:6b1::/35", "134774"}, - {"2602:fcea::/36", "22659"}, - {"2a02:13b8::/29", "15614"}, - {"2a0b:1c00:1919::/48", "62240"}, - {"2a12:df00:2000::/35", "210462"}, - {"2001:559:817d::/46", "7922"}, - {"2001:1998::/44", "7843"}, - {"2408:84f3:ea10::/42", "134543"}, - {"240a:a372::/32", "143532"}, - {"2804:81c8::/32", "272476"}, - {"2a02:26f7:ea05::/46", "20940"}, - {"2001:49b0::/32", "26860"}, - {"2600:c809::/29", "7018"}, - {"2a03:ff80::/29", "197075"}, - {"2001:678:c9c::/48", "200924"}, - {"2404:f600::/32", "24207"}, - {"2001:dd8:10::/47", "56266"}, - {"2001:1a11:6d::/46", "8781"}, - {"2407:7200:5001::/32", "10098"}, - {"240a:a0ff::/32", "142905"}, - {"240a:afae::/32", "146664"}, - {"2607:fca8:a539::/35", "17139"}, - {"2806:34d:48::/48", "15695"}, - {"2a0f:2740::/29", "36351"}, - {"2001:df0:eb::/48", "38635"}, - {"2404:c400:404::/32", "9328"}, - {"2606:5680:1000::/36", "394344"}, - {"2a01:5980::/32", "15689"}, - {"2001:250:3446::/38", "23910"}, - {"2600:6c10:20c::/46", "20115"}, - {"2804:11b8::/32", "263434"}, - {"2804:507c::/32", "268392"}, - {"2a0a:90c0:1011::/41", "205080"}, - {"2001:4818::/36", "12188"}, - {"2407:46c0::/32", "142024"}, - {"2606:2800:5100::/45", "15133"}, - {"2804:7adc:8000::/33", "262674"}, - {"2a02:c88::/32", "8487"}, - {"2a11:5080::/29", "60935"}, - {"2604:2d80:e280::/36", "30036"}, - {"240a:aef4::/32", "146478"}, - {"2a07:aec0::/29", "32519"}, - {"240a:a9c6::/32", "145152"}, - {"2602:fed2:718f::/48", "20473"}, - {"2607:f180:4200::/35", "35908"}, - {"2804:5790::/32", "268072"}, - {"2a04:2700::/29", "12637"}, - {"2409:8c20:aa52::/35", "56046"}, - {"2a02:26f7:fb44::/48", "36183"}, - {"2a0f:b4c7::/32", "47596"}, - {"2607:f8f8::/37", "23033"}, - {"2804:6708::/32", "269599"}, - {"2804:8378::/32", "272200"}, - {"2a03:2ca0::/38", "59865"}, - {"2403:c000:1402::/32", "4741"}, - {"240a:a12c::/32", "142950"}, - {"240a:ae03::/32", "146237"}, - {"2404:bf40:89c1::/46", "7545"}, - {"240e:d2:8000::/29", "4134"}, - {"2604:d600:161c::/42", "32098"}, - {"2001:559:c216::/47", "33650"}, - {"2606:2800:347::/44", "15133"}, - {"2806:2f0:4001::/46", "17072"}, - {"2a0b:f841::/32", "34549"}, - {"2001:da8:201e::/48", "24357"}, - {"2602:fc8a:ff::/48", "399588"}, - {"2804:75a0::/32", "271059"}, - {"2a04:4e40:e400::/48", "54113"}, - {"2a0c:9a40:2400::/36", "34927"}, - {"2001:559:81e7::/48", "33491"}, - {"2405:8400::/32", "9245"}, - {"240e:2e::/33", "4812"}, - {"240e:3bf:2200::/37", "136198"}, - {"2804:24b0:8000::/33", "264238"}, - {"2a02:4a40:100::/48", "42673"}, - {"2a0d:1a45:bef0::/33", "57782"}, - {"2604:d600:1211::/46", "32098"}, - {"2a0d:e4c4:1000::/34", "208861"}, - {"2001:559:746::/48", "33657"}, - {"2001:590:3803::/48", "206264"}, - {"2001:da8:cf::/48", "138375"}, - {"2600:140b:2001::/38", "20940"}, - {"2600:3000:1314::/37", "13649"}, - {"2604:2c00::/32", "11071"}, - {"2605:80c0::/32", "10700"}, - {"2a00:10a0::/45", "35745"}, - {"2a02:e000::/29", "12670"}, - {"2a0b:1d40::/32", "205676"}, - {"2a11:4780::/29", "56897"}, - {"2001:559:337::/48", "7015"}, - {"2001:559:8662::/48", "33659"}, - {"2804:291c::/35", "263998"}, - {"2a02:26f7:c0c9::/42", "20940"}, - {"2001:4878:3::/48", "12222"}, - {"2404:e4c0:8::/48", "54201"}, - {"240e:5a:4900::/40", "140302"}, - {"2604:6600:2606::/47", "40676"}, - {"2804:16b0:4000::/36", "61910"}, - {"2a09:a4c7:4000::/36", "210625"}, - {"2804:8084::/32", "271756"}, - {"2a01:6520::/32", "199860"}, - {"2a02:26f7:f084::/48", "36183"}, - {"240a:a947::/32", "145025"}, - {"2605:3380:4152::/47", "12025"}, - {"2a02:2290:2::/48", "206610"}, - {"2a02:26f7:c781::/46", "20940"}, - {"2a04:c580::/29", "12315"}, - {"2403:97c0:10::/44", "7489"}, - {"2409:8004:3111::/45", "24547"}, - {"2804:5b88::/32", "268853"}, - {"2a00:70c0::/48", "31477"}, - {"2408:8456:a640::/36", "17816"}, - {"2620:119:e000::/43", "30337"}, - {"2806:2f0:9741::/46", "17072"}, - {"2a09:be40:6b00::/40", "208810"}, - {"2a0f:5707:ab2f::/48", "61138"}, - {"2001:559:66::/48", "33491"}, - {"2001:67c:53c::/48", "43046"}, - {"2620:104:e000::/56", "1351"}, - {"2a02:26f7:c704::/48", "36183"}, - {"2001:1248:5aed::/39", "11172"}, - {"2001:41d8::/32", "5610"}, - {"2801:140:fff1::/46", "262249"}, - {"2806:2f0:9781::/46", "17072"}, - {"2a0c:fa40::/29", "61317"}, - {"2001:559:c280::/47", "7015"}, - {"2406:1200::/32", "24192"}, - {"240e:44d:1940::/42", "140360"}, - {"2801:14a::/40", "3816"}, - {"2804:14d:9400::/40", "28573"}, - {"2a0f:da80::/29", "34856"}, - {"2406:840:e110::/48", "141712"}, - {"2a02:26f7:dd81::/46", "20940"}, - {"2001:dc7:5de2::/43", "24151"}, - {"240e:56c::/30", "4812"}, - {"2804:2eb8::/32", "265361"}, - {"2a02:26f7:c58c::/48", "36183"}, - {"2402:bd80::/30", "134450"}, - {"2a02:26f7:26::/48", "36183"}, - {"2a11:280::/29", "52164"}, - {"2001:559:c0a5::/46", "33659"}, - {"2401:d800:b970::/40", "7552"}, - {"240a:a0f5::/32", "142895"}, - {"240a:ac3c::/32", "145782"}, - {"2607:f220:f1::/48", "19050"}, - {"2800:6f0:1000::/40", "20207"}, - {"2804:351c:1112::/32", "266269"}, - {"2804:5b40::/32", "268829"}, - {"2001:1398:275::/48", "52306"}, - {"240a:a52d::/32", "143975"}, - {"240e:964:1000::/37", "133775"}, - {"2804:5be8::/34", "268876"}, - {"2a01:5b0:10::/47", "50611"}, - {"2a02:2e02:8330::/40", "12479"}, - {"2401:ee00:12a::/43", "23951"}, - {"240a:a579::/32", "144051"}, - {"2600:6c38:a44::/43", "20115"}, - {"2602:ffd1:5::/48", "393336"}, - {"2620:11f:7000::/44", "13737"}, - {"2620:13f:9000::/44", "14782"}, - {"2806:2f0:2021::/48", "22884"}, - {"2a02:26f7:d009::/42", "20940"}, - {"2a02:ee80:4279::/48", "3573"}, - {"2404:4f02:100::/32", "15830"}, - {"240e:438:3020::/43", "140647"}, - {"240e:966:9400::/38", "133776"}, - {"2800:200:b430::/41", "12252"}, - {"2806:230:1003::/48", "11888"}, - {"2806:2f0:9e21::/46", "17072"}, - {"2a03:6e80::/32", "15425"}, - {"2620:1e5::/40", "13382"}, - {"2a03:8d40::/32", "61287"}, - {"2c0f:f5f0::/32", "37564"}, - {"2001:1838:3100::/33", "23352"}, - {"2a00:1aa0::/32", "209480"}, - {"2a02:ee80:41d7::/48", "3573"}, - {"2a05:dfc7:6::/48", "62240"}, - {"2a06:da80::/29", "212144"}, - {"2001:559:c310::/48", "22909"}, - {"2001:16d8:900::/32", "16150"}, - {"2400:ac40:a60::/40", "136255"}, - {"2400:cb00:a2d0::/47", "13335"}, - {"2606:a000:c08::/35", "11426"}, - {"2804:8288::/32", "272525"}, - {"2a06:a001:a0c4::/48", "141694"}, - {"2001:559:128::/48", "7015"}, - {"2001:da8:e813::/48", "138373"}, - {"2401:95c0:2d04::/38", "9678"}, - {"2401:d800:5540::/42", "7552"}, - {"2408:8459:9a50::/37", "17816"}, - {"2804:4a90::/35", "267249"}, - {"2a02:26f7:e680::/48", "36183"}, - {"2a04:a040::/29", "21277"}, - {"2a0c:d500::/29", "41765"}, - {"2402:8100:38c0::/39", "45271"}, - {"2408:8459:8a10::/42", "17623"}, - {"240a:a44f::/32", "143753"}, - {"2804:214:8460::/40", "26615"}, - {"2a03:f80:971::/48", "9009"}, - {"2a03:4d40::/31", "199610"}, - {"2a06:1600:2::/48", "39221"}, - {"2001:df3:2e85::/46", "9833"}, - {"2406:7300:4::/40", "17559"}, - {"2408:8957:dd00::/40", "17816"}, - {"240a:ad02::/32", "145980"}, - {"2800:bf0:a10a::/48", "27947"}, - {"2a02:348:1f::/41", "35470"}, - {"2402:1440:200::/32", "132168"}, - {"2408:8456:9c40::/38", "17816"}, - {"2409:8c54:6100::/32", "56040"}, - {"2a04:84c0::/32", "200083"}, - {"2a09:bac0:26::/44", "13335"}, - {"2a0c:5247:c000::/36", "59504"}, - {"2403:e800:807::/44", "4637"}, - {"2a04:c000::/29", "202194"}, - {"2001:559:c18c::/48", "13367"}, - {"2001:df7:1380::/48", "138754"}, - {"2001:df7:4808::/48", "131893"}, - {"2408:840c:d600::/40", "17621"}, - {"2804:7c8:7000::/32", "262323"}, - {"2804:3384::/32", "265401"}, - {"2001:a18::/29", "2602"}, - {"2402:8100:3940::/40", "45271"}, - {"2a0e:46c3:200::/47", "208717"}, - {"2a11:6780::/29", "204790"}, - {"2401:4900:1260::/44", "45609"}, - {"2804:5268::/39", "268516"}, - {"240a:a964::/32", "145054"}, - {"2600:6000:fa6a::/40", "12271"}, - {"2001:b400:f410::/45", "3462"}, - {"2405:1fc0:720::/48", "139188"}, - {"2600:140b:d801::/37", "20940"}, - {"2804:3830::/32", "266463"}, - {"2a00:c5a0::/32", "39279"}, - {"2001:67c:2d28::/48", "29236"}, - {"2402:9900:200::/48", "27435"}, - {"2406:2400:7777::/48", "45287"}, - {"2806:283:4000::/36", "265515"}, - {"2a01:8:8012::/27", "2860"}, - {"2a02:26f7:f709::/46", "20940"}, - {"2a04:9440::/30", "21182"}, - {"2a0c:93c0:c002::/48", "212465"}, - {"2804:36a8::/32", "266362"}, - {"2804:6140::/32", "61597"}, - {"2a05:dfc7:24::/47", "203909"}, - {"2001:579:9340::/40", "22773"}, - {"240e:3b1:1400::/38", "134773"}, - {"2a12:1c00::/29", "1239"}, - {"2406:94c0::/48", "137767"}, - {"2a05:6cc0::/29", "25151"}, - {"2a10:9f40::/29", "211721"}, - {"2804:ec8::/32", "262532"}, - {"2804:2e44:f700::/36", "265335"}, - {"2806:2f4:1200::/40", "265540"}, - {"2a02:4e0:2600::/41", "16135"}, - {"2a06:af00::/29", "15694"}, - {"2c0f:ebf8::/32", "328436"}, - {"2401:d800:74a2::/41", "7552"}, - {"2402:8d03:ffee::/48", "135008"}, - {"2409:8c63::/27", "9808"}, - {"2401:f9c0:2600::/40", "133398"}, - {"2408:840c:600::/40", "17621"}, - {"240a:a57b::/32", "144053"}, - {"2600:1017:9800::/44", "22394"}, - {"2800:bf0:116::/47", "27947"}, - {"2804:8004::/32", "271724"}, - {"2001:678:b98::/48", "207822"}, - {"2405:1e00:fe::/47", "17771"}, - {"2804:19b4:1::/48", "61813"}, - {"2407:f100:5::/32", "133075"}, - {"2605:a401:8585::/44", "33363"}, - {"2a0f:9d80::/32", "207449"}, - {"2001:418:c06::/48", "262"}, - {"240a:a5ec::/32", "144166"}, - {"2804:4bb4::/39", "267325"}, - {"2804:63a4::/32", "269374"}, - {"2a0f:9400:802a::/48", "20473"}, - {"2001:559:c069::/48", "7922"}, - {"240a:abac::/32", "145638"}, - {"2402:800:540f::/43", "7552"}, - {"2a02:26f7:e584::/48", "36183"}, - {"2a0d:1ac7::/32", "56601"}, - {"2001:559:80d3::/48", "7922"}, - {"2001:559:83ee::/48", "7922"}, - {"2001:da8:c5::/48", "138438"}, - {"2401:bb40::/32", "136838"}, - {"2401:d800:b70::/40", "7552"}, - {"2401:d800:7b40::/42", "7552"}, - {"2610:20:5004::/48", "5744"}, - {"2620:11b:e0f0::/47", "560"}, - {"2804:1ac4:4000::/34", "61884"}, - {"2401:8a00:f700::/36", "10099"}, - {"2405:84c0:9710::/44", "40676"}, - {"2804:8134::/32", "272439"}, - {"2a00:5ee0:4000::/32", "44925"}, - {"2a04:4e40:9640::/44", "54113"}, - {"2a0d:b201:30d0::/42", "206026"}, - {"2001:1248:98f6::/44", "11172"}, - {"2400:8b00:f00::/42", "45727"}, - {"2409:8c7b::/29", "9808"}, - {"2804:188::/33", "262750"}, - {"2804:283c::/32", "263949"}, - {"2001:559:8171::/48", "33657"}, - {"240e:45c:9200::/40", "131285"}, - {"2620:76:a000::/48", "33491"}, - {"2a04:cdc0::/29", "201661"}, - {"2001:4888:8044::/48", "6167"}, - {"2400:ca04:f024::/43", "23688"}, - {"2406:daa0:7080::/44", "16509"}, - {"240a:a057::/32", "142737"}, - {"2607:f428:91e0::/44", "19115"}, - {"2804:6ec::/32", "262613"}, - {"2403:6a40:2::/48", "135967"}, - {"240e:966:5800::/32", "4134"}, - {"2600:9000:1098::/42", "16509"}, - {"2a02:26f7:f810::/48", "36183"}, - {"2a06:e881:580a::/48", "204003"}, - {"2001:df5:5780::/48", "132513"}, - {"2408:8779:c000::/45", "140707"}, - {"240e:3bd:1800::/34", "4134"}, - {"2a04:b40::/29", "36057"}, - {"2a06:e881:73ff::/48", "16509"}, - {"2402:800:53c5::/43", "7552"}, - {"2408:8956:9e00::/40", "17622"}, - {"2602:ffe4:c0d::/48", "21859"}, - {"2804:93c:10c1::/32", "52878"}, - {"2a00::/22", "3209"}, - {"2401:af80:9015::/48", "45679"}, - {"2402:800:72f2::/39", "7552"}, - {"240e:108:2d::/48", "136197"}, - {"2804:1124::/32", "53142"}, - {"2a0b:1d00::/32", "49709"}, - {"2600:380:200::/36", "20057"}, - {"2604:8540:fcd0::/47", "33353"}, - {"2610:190:df00::/40", "62"}, - {"2401:fd80:800::/48", "138177"}, - {"2402:800:53e0::/44", "7552"}, - {"2001:559:28c::/48", "33287"}, - {"240e:3b0::/35", "134773"}, - {"240a:a48d::/32", "143815"}, - {"2620:116:5000::/40", "6059"}, - {"2a00:ec00::/32", "16066"}, - {"2a0b:4342:1a20::/44", "57578"}, - {"2806:20d:580d::/46", "32098"}, - {"2a02:26f7:dd41::/46", "20940"}, - {"2001:67c:1518::/48", "34776"}, - {"2001:a78::/29", "12399"}, - {"2806:230:1035::/40", "11888"}, - {"2401:d00::/32", "133466"}, - {"2404:5dc0::/32", "136652"}, - {"2409:8d15:800::/39", "56044"}, - {"2600:1408:3c01::/38", "20940"}, - {"2a00:1650::/32", "24768"}, - {"240a:a52e::/32", "143976"}, - {"2a04:540::/29", "44391"}, - {"2604:4700::/33", "53591"}, - {"2604:cc00:601::/48", "53292"}, - {"2804:1298::/32", "263486"}, - {"2804:6e74::/32", "270598"}, - {"2600:40ff:ff90::/47", "1321"}, - {"2a03:d6c0::/32", "199370"}, - {"2a05:c100::/29", "57809"}, - {"2409:8004:5::/36", "24547"}, - {"240a:ab56::/32", "145552"}, - {"2001:559:415::/46", "33652"}, - {"2a00:1300::/32", "49272"}, - {"2001:648:25e1::/38", "5408"}, - {"2607:f048::/32", "26803"}, - {"2804:2fc4::/32", "264911"}, - {"2804:5ce0::/32", "268936"}, - {"2001:b28::/46", "42065"}, - {"2403:300:13d5::/37", "714"}, - {"2804:6d3c::/32", "270519"}, - {"2a01:50a0::/32", "201764"}, - {"2a02:d40:7::/48", "197071"}, - {"2a02:26f7:bb49::/42", "20940"}, - {"2001:559:c3c5::/48", "33668"}, - {"2409:8744::/28", "24445"}, - {"2600:140b:e::/43", "20940"}, - {"2a07:e03:4::/42", "210083"}, - {"240a:a9d6::/32", "145168"}, - {"240d:c010:fb::/48", "139341"}, - {"2605:aa40::/32", "395394"}, - {"2606:2800:4a4c::/46", "15133"}, - {"2804:42bc::/38", "267522"}, - {"2a11:29c3:b00b::/48", "212149"}, - {"2409:896a:2800::/39", "9808"}, - {"240a:a7b4::/32", "144622"}, - {"2604:d600:1512::/47", "32098"}, - {"2001:4488:fd62::/38", "7713"}, - {"2405:7700:a000::/35", "45352"}, - {"2620:124:6060::/40", "40816"}, - {"2a02:ee80:4015::/42", "3573"}, - {"2a09:bac0:443::/48", "13335"}, - {"2001:559:c2bf::/48", "7922"}, - {"2401:c040::/32", "136965"}, - {"2402:800:56d3::/44", "7552"}, - {"2602:805:a000::/40", "398319"}, - {"2607:f220:402::/48", "30387"}, - {"2610:e8::/35", "6224"}, - {"2a12:8f00::/29", "60144"}, - {"2001:ee0:e900::/40", "45899"}, - {"2600:1406:2601::/36", "20940"}, - {"2a02:26f7:be08::/48", "36183"}, - {"2a02:ee80:4244::/47", "3573"}, - {"2a03:a360::/32", "12350"}, - {"2001:67c:20c::/48", "51289"}, - {"2001:1248:5779::/40", "11172"}, - {"2401:3c00:a4::/44", "38322"}, - {"2406:aa40::/32", "141383"}, - {"240e:3bb:dc00::/34", "4134"}, - {"2607:fbe0::/32", "40824"}, - {"2a02:7de0::/32", "8621"}, - {"2400:a980:14fe::/47", "133515"}, - {"2402:800:b530::/41", "7552"}, - {"2a01:8840:1a::/45", "12041"}, - {"2a02:26f7:bfc4::/48", "36183"}, - {"2a02:2f08:efff::4/29", "8708"}, - {"2a09:eb40::/32", "205718"}, - {"2001:67c:2b0::/48", "29432"}, - {"2001:67c:400::/48", "44233"}, - {"2001:67c:2d30::/48", "207575"}, - {"2409:8915:7400::/39", "56044"}, - {"2a02:110::/32", "44776"}, - {"2407:5200:33::/41", "55915"}, - {"2804:18:6a00::/37", "10429"}, - {"2a05:e700::/29", "198710"}, - {"2001:559:859f::/48", "33287"}, - {"2001:559:c01d::/48", "7015"}, - {"2404:bf40:84c0::/48", "7545"}, - {"2404:bf40:a303::/42", "139084"}, - {"2800:bf0:1d3::/38", "27947"}, - {"2001:4200:3201::/44", "2018"}, - {"2806:2f0:23e1::/48", "22884"}, - {"2001:559:2f1::/46", "33287"}, - {"2001:678:578::/48", "198956"}, - {"2001:df0:9e00::/48", "132164"}, - {"2401:5a00:ffff::/48", "10032"}, - {"2605:bc40::/32", "7040"}, - {"2804:108c:f400::/36", "28146"}, - {"2804:1a04:7::/44", "61832"}, - {"2a02:1010:c200::/40", "9197"}, - {"2a02:26f7:c888::/48", "36183"}, - {"2a02:26f7:f8d9::/42", "20940"}, - {"2a03:ec00:b500::/36", "12847"}, - {"2409:8905:7d20::/30", "24547"}, - {"2800:88:10::/46", "26210"}, - {"2803:4440::/32", "28009"}, - {"2804:6ef8::/35", "270630"}, - {"2a02:26f7:be89::/46", "20940"}, - {"2a04:b580::/29", "30742"}, - {"2a10:cac0::/29", "43872"}, - {"2607:a500:df01::/43", "12025"}, - {"2a00:e08::/32", "16175"}, - {"2a02:26f7:f909::/46", "20940"}, - {"2a09:4c2:2c::/48", "205977"}, - {"2c0f:f300::/48", "37153"}, - {"2001:978:a700::/48", "33811"}, - {"240a:ab31::/32", "145515"}, - {"2607:5f80::/32", "23336"}, - {"2806:230:4016::/48", "265594"}, - {"2a02:1680::/32", "50673"}, - {"2a06:79c0:2::/29", "15622"}, - {"2a0a:8880::/46", "50937"}, - {"2605:e780::/32", "11142"}, - {"2607:f298:5::/46", "26347"}, - {"2a0e:800:ff00::/48", "209083"}, - {"2001:da8:247::/48", "24350"}, - {"2403:4c0:7800::/37", "56207"}, - {"2409:10::/28", "55391"}, - {"240a:aeef::/32", "146473"}, - {"2620:1f0::/32", "1798"}, - {"2801:15:c800::/48", "18747"}, - {"2804:4e08:2001::/32", "268235"}, - {"2a0f:1e00:987::/48", "30633"}, - {"2001:67c:2f94::/48", "34288"}, - {"2406:e000:333::/41", "23655"}, - {"240a:a255::/32", "143247"}, - {"2a00:1370:f200::/48", "57681"}, - {"2a04:e4c0:10::/48", "36692"}, - {"240a:a936::/32", "145008"}, - {"2602:103:6000::/35", "20115"}, - {"2804:5304::/32", "268557"}, - {"2a00:1728:19::/48", "47748"}, - {"2a04:4e40:6040::/44", "54113"}, - {"2001:67c:2c2c::/48", "57763"}, - {"2402:800:9b63::/43", "7552"}, - {"240a:a314::/32", "143438"}, - {"2800:c30:ae00::/33", "52361"}, - {"2a02:d80::/32", "12778"}, - {"2001:559:173::/45", "7016"}, - {"240a:a04c::/32", "142726"}, - {"240e:44d:7e80::/41", "4134"}, - {"2804:5250:4000::/34", "268510"}, - {"2001:559:82f5::/48", "22909"}, - {"2001:579:417f::/40", "22773"}, - {"2407:c1c0::/48", "135905"}, - {"2408:832e::/27", "4837"}, - {"2409:8924:700::/36", "56046"}, - {"240e:44d:4200::/42", "140345"}, - {"2600:1a0f:1001::/36", "46650"}, - {"2620:0:2901::/48", "13916"}, - {"2405:1c0:6251::/46", "55303"}, - {"240a:acae::/32", "145896"}, - {"2001:559:27a::/48", "7015"}, - {"2401:4900:4b50::/44", "45609"}, - {"2409:8904:4060::/39", "24547"}, - {"2605:3380:416a::/43", "12025"}, - {"2a09:4e07:4000::/34", "208861"}, - {"240a:a8f4::/32", "144942"}, - {"2604:6d00:2200::/48", "36223"}, - {"2804:269c:fe07::/48", "47065"}, - {"2804:726c::/32", "270851"}, - {"2a0b:f880::/29", "200548"}, - {"2607:fd48:301:100::/46", "13536"}, - {"2804:2b38:b00::/32", "265141"}, - {"2a07:1980:8::/48", "48851"}, - {"2610:20:9200::/39", "3477"}, - {"2803:4580:c000::/35", "52468"}, - {"2401:d800:f730::/41", "7552"}, - {"2604:1380:4630::/41", "54825"}, - {"2a01:7f60::/42", "9115"}, - {"2a02:26f7:ddc9::/42", "20940"}, - {"2a02:2e02:8830::/41", "12479"}, - {"2a03:1ea0::/32", "201714"}, - {"2a05:e0c0::/29", "201011"}, - {"2a07:e7c0:1000::/48", "201076"}, - {"2606:ae00:7090::/39", "7287"}, - {"2804:3088::/32", "264959"}, - {"2a02:2e8::/32", "44512"}, - {"2a02:fa8:1c10::/44", "41041"}, - {"2600:1417:6::/47", "20940"}, - {"2605:1c00:fff0::/44", "16787"}, - {"2800:bf0:284::/48", "27947"}, - {"2803:33c0::/32", "265721"}, - {"2804:50f0::/32", "268420"}, - {"2804:6210::/36", "269273"}, - {"2c0f:f3c0::/32", "3491"}, - {"2a02:26f7:fbc0::/48", "36183"}, - {"2001:67c:247c::/48", "49754"}, - {"2402:800:7fe0::/32", "7552"}, - {"2800:bf0:8060::/46", "52257"}, - {"2a00:5da0::/32", "48716"}, - {"2a0b:4340:3231::/39", "48024"}, - {"2a00:6640::/32", "15699"}, - {"2a00:bd80::/32", "51395"}, - {"2a0e:cd01:1b00::/34", "23031"}, - {"2401:d800:7d80::/42", "7552"}, - {"2600:14a0:101::/27", "20940"}, - {"2804:2e8:3::/45", "262847"}, - {"2804:1898:3200::/32", "61942"}, - {"2804:59b8::/32", "268721"}, - {"2401:8800::/46", "17439"}, - {"2804:6d14::/32", "270511"}, - {"2a0b:e900::/29", "13285"}, - {"2a0f:a3c0::/29", "39087"}, - {"2401:1d40:2000::/48", "4811"}, - {"240a:ab24::/32", "145502"}, - {"2607:fdf0:5edd::/42", "8008"}, - {"2a0e:5b00::/29", "212616"}, - {"2001:4c28:4000::/36", "39832"}, - {"2405:a300:1000::/48", "45432"}, - {"2602:fd50:f31::/48", "212149"}, - {"2620:0:2b70::/44", "22847"}, - {"2804:3190::/32", "53097"}, - {"2a02:188::/35", "31027"}, - {"2001:df0:9d80::/48", "139221"}, - {"2402:cb40::/32", "135132"}, - {"2407:d200::/32", "38532"}, - {"2600:6c10:606::/47", "20115"}, - {"2001:1248:1::/45", "11172"}, - {"240e:356:5c00::/34", "134419"}, - {"2600:1408:f800::/48", "35994"}, - {"2600:9000:2038::/41", "16509"}, - {"2804:5e34::/32", "269018"}, - {"2001:c80::/40", "4673"}, - {"2404:5600::/32", "23700"}, - {"2408:8642::/32", "4837"}, - {"240e:3b6:1800::/34", "4134"}, - {"240e:44d:3680::/41", "4134"}, - {"2602:ff67::/36", "15231"}, - {"2604:ff00:ae00::/44", "36271"}, - {"2610:f0:20d::/43", "22925"}, - {"2804:18:4808::/42", "26599"}, - {"2a03:b000:b00::/37", "42695"}, - {"2001:559:c21f::/48", "33651"}, - {"2401:3bc0:100c::/43", "137409"}, - {"2605:8000:de2b::/34", "4261"}, - {"2a02:26f7:81::/48", "20940"}, - {"2a02:26f7:c011::/42", "20940"}, - {"2a09:cfc0::/29", "207709"}, - {"2a10:4741:22::/48", "208768"}, - {"2404:8d02:2642::/36", "9587"}, - {"2606:e880::/32", "46811"}, - {"2806:3c7::/32", "265530"}, - {"2001:559:8788::/46", "7015"}, - {"2600:8808:3e00::/39", "64019"}, - {"2a02:26f7:e784::/48", "36183"}, - {"2600:140b:1800::/48", "24319"}, - {"2600:1417:1800:300::/48", "20940"}, - {"2607:f6f0:4002::/45", "29884"}, - {"2a02:2ab8::/39", "702"}, - {"2404:8000:81::/44", "17451"}, - {"2600:1002:a100::/44", "6167"}, - {"2a05:cc00::/29", "47447"}, - {"2401:1900:30::/44", "45245"}, - {"2600:5c00:2541::/48", "3456"}, - {"2a01:b740:a26::/48", "6185"}, - {"2a03:f80:47::/44", "9009"}, - {"2a0d:3842:1080::/48", "57629"}, - {"2001:67c:267c::/48", "60713"}, - {"2404:6740:2000::/48", "138608"}, - {"240a:a567::/32", "144033"}, - {"2804:4860::/32", "267117"}, - {"2409:8958:cb44::/43", "9808"}, - {"2607:fff8::/32", "47027"}, - {"2620:129:6000::/48", "395363"}, - {"2001:6d0:6d01::/45", "42385"}, - {"240e:438:9240::/37", "4134"}, - {"2a03:7a40::/32", "48173"}, - {"2a10:4646:11::/48", "212106"}, - {"2405:a000::/43", "7693"}, - {"2408:8459:5480::/42", "136959"}, - {"2a01:88::/32", "15806"}, - {"2a01:f8::/32", "39912"}, - {"2a02:7900:101::/32", "16154"}, - {"2a0f:c444::/48", "212073"}, - {"2001:67c:2170::/48", "43376"}, - {"2401:d800:bfe0::/43", "7552"}, - {"2803:7000:e000::/36", "52362"}, - {"2a0a:ad40::/32", "211428"}, - {"2605:a401:89ed::/43", "33363"}, - {"2a10:1bc0::/29", "28972"}, - {"2604:3d40::/32", "40943"}, - {"2607:f250:d018::/48", "7046"}, - {"2a03:1160::/40", "201727"}, - {"2a07:3200::/29", "201873"}, - {"2a0a:e2c3::/32", "201525"}, - {"2001:559:81f2::/48", "33652"}, - {"2a00:5a20:3a11::/32", "199289"}, - {"2a0e:97c0:7f0::/44", "207043"}, - {"2001:559:81d5::/46", "7015"}, - {"2403:b4c0:9000::/36", "138398"}, - {"2408:8956:c400::/40", "17622"}, - {"2409:8054:20::/48", "9808"}, - {"2409:8055:3c::/48", "9808"}, - {"240e:438:5620::/43", "140647"}, - {"2605:ef80::/45", "36492"}, - {"2800:300:8240::/37", "27651"}, - {"2801:10c::/44", "18747"}, - {"2a02:29d0::/32", "35575"}, - {"2a09:11c0:1000::/36", "56381"}, - {"2404:1fc0:1104::/48", "58534"}, - {"2404:7700::/48", "58664"}, - {"2804:5188::/32", "268458"}, - {"2a02:26f7:c784::/47", "36183"}, - {"2604:cf80::/32", "3257"}, - {"2804:80a8:200::/32", "271765"}, - {"2a0c:7580::/29", "8823"}, - {"2001:ee0:9440::/38", "45899"}, - {"2407:4600::/32", "45295"}, - {"2607:f550::/32", "30059"}, - {"2804:1c8c::/32", "28322"}, - {"2a02:ac80:c01::/39", "25145"}, - {"2a0b:7087:fff0::/44", "50867"}, - {"2600:1001:b000::/42", "6167"}, - {"2804:5400::/32", "268622"}, - {"2a02:26f7:c6::/48", "36183"}, - {"2a09:3d04::/32", "208861"}, - {"2a0a:e840::/29", "25540"}, - {"2001:da8:9012::/44", "24369"}, - {"2401:a480:2::/48", "133750"}, - {"2406:da70:6000::/40", "16509"}, - {"2600:9000:a700::/43", "16509"}, - {"2800:160:1e11::/46", "14259"}, - {"2a02:26f7:b6c1::/46", "20940"}, - {"2001:67c:1320::/48", "61183"}, - {"2402:e580::/44", "40138"}, - {"2620:120:f000::/40", "394169"}, - {"2a07:4000::/29", "205639"}, - {"2409:8b10::/34", "9808"}, - {"240a:a328::/32", "143458"}, - {"2605:d480::/32", "3257"}, - {"2610:a1:3084::/47", "399155"}, - {"2804:1cd4::/35", "61678"}, - {"2603:c0e1::/36", "54253"}, - {"2a12:42c0::/29", "62119"}, - {"2401:4900:4f53::/45", "9730"}, - {"240e:978:b00::/37", "4134"}, - {"2804:117c::/32", "53061"}, - {"2806:1030:ceff::/34", "8151"}, - {"2a02:26f7:c500::/48", "36183"}, - {"2a0b:4341:1500::/48", "57695"}, - {"2403:3440:c00::/32", "4787"}, - {"2404:bf40:c300::/48", "7545"}, - {"2408:840c:5f00::/40", "17621"}, - {"2804:22a0:c10::/32", "264112"}, - {"2a02:2010:2800::/43", "20978"}, - {"2a09:4::/48", "3258"}, - {"2001:470:114::/44", "6939"}, - {"2001:559:2e7::/48", "33668"}, - {"2001:1388:3cc4::/33", "6147"}, - {"2400:cb00:43::/44", "13335"}, - {"2408:8956:6100::/40", "17816"}, - {"2804:7438::/46", "270967"}, - {"2001:559:c120::/48", "33657"}, - {"2401:95c0::/34", "9678"}, - {"2605:a401:80d7::/44", "33363"}, - {"2801:80:1320::/48", "263953"}, - {"2a06:f880::/29", "200719"}, - {"2001:1a68:22::/44", "15694"}, - {"240a:a412::/32", "143692"}, - {"2800:98:1100::/43", "14754"}, - {"2804:14c:4a6::/41", "28573"}, - {"2a00:f60::/32", "48635"}, - {"2001:559:c363::/48", "33659"}, - {"2001:1440:204::/32", "8469"}, - {"2404:1100::/32", "134078"}, - {"2406:da16::/36", "16509"}, - {"240e:438:7a20::/43", "140647"}, - {"2a00:6280::/32", "12978"}, - {"2001:250:801::/48", "24348"}, - {"2401:d800:7530::/41", "7552"}, - {"240a:a848::/32", "144770"}, - {"2610:128:1300::/34", "11686"}, - {"2620:98:e008::/48", "399728"}, - {"2a02:2940::/32", "13246"}, - {"2001:559:185::/48", "7015"}, - {"2001:13c7:6019::/48", "52508"}, - {"2001:16a2:4032::/39", "39386"}, - {"2600:370f:9024::/41", "32261"}, - {"2607:f278::/32", "6360"}, - {"2a00:e50::/29", "15451"}, - {"2a0e:5fc0::/29", "207686"}, - {"240a:ac69::/32", "145827"}, - {"2a02:26f7:b581::/46", "20940"}, - {"2a0f:5381::/35", "208135"}, - {"2a01:a040::/32", "39791"}, - {"2a0d:57c0::/29", "44212"}, - {"2a0e:c080::/29", "6768"}, - {"2001:1490::/47", "8895"}, - {"2402:5300:2210::/39", "45903"}, - {"2405:c700::/32", "17939"}, - {"2408:8456:3050::/39", "17816"}, - {"2a01:6480:11::/46", "29049"}, - {"2408:8256:3996::/48", "17816"}, - {"2804:14c:5b88::/43", "28573"}, - {"2804:6db0::/32", "270549"}, - {"2804:7ed0::/32", "271649"}, - {"2a03:7460::/32", "24971"}, - {"2001:559:c121::/48", "33659"}, - {"2401:17c0::/32", "136533"}, - {"2402:4440:9c10::/42", "24423"}, - {"2405:b580::/32", "135234"}, - {"2a02:2160:7111::/46", "201308"}, - {"2620:13a:c013::/42", "53356"}, - {"2001:559:83a7::/44", "33652"}, - {"2600:1488:a281::/39", "20940"}, - {"2600:370f:734f::/42", "32261"}, - {"2620:0:1aa0::/48", "20464"}, - {"2804:809c::/32", "271762"}, - {"2402:3000::/32", "23637"}, - {"2405:6e00:f800::/48", "133612"}, - {"2606:2040::/32", "49791"}, - {"2a09:9180:ec00::/42", "42081"}, - {"2c0f:fc89:8023::/43", "36992"}, - {"2001:579:1934::/37", "22773"}, - {"2001:4048:105::/48", "198345"}, - {"2804:204:21e::/42", "28186"}, - {"2a01:8840:bd::/48", "207266"}, - {"2a01:8840:1ba::/45", "12041"}, - {"2a02:26f7:eac0::/48", "36183"}, - {"2a07:59c6:eed3::/48", "48646"}, - {"2001:df0:3a80::/48", "139002"}, - {"2001:1248:98a5::/48", "11172"}, - {"2a02:2ca7:2e::/48", "58305"}, - {"2001:da8:9008::/45", "24369"}, - {"240e:41:4800::/32", "4134"}, - {"2a00:d1a0:2::/32", "61317"}, - {"2a02:26f0:d100::/48", "9121"}, - {"2a02:7c40:8000::/33", "8758"}, - {"2001:df7:1680::/48", "19151"}, - {"2001:1248:a4de::/47", "11172"}, - {"2800:484:d400::/39", "14080"}, - {"2a07:a343:aee0::/44", "9009"}, - {"2a0e:1d80:10::/46", "9009"}, - {"2001:67c:22ec::/48", "197874"}, - {"2401:4900:519c::/46", "45609"}, - {"2600:6c38:7d::/40", "20115"}, - {"2804:2c0:fbc1::/37", "262834"}, - {"2804:2370::/32", "264162"}, - {"2a02:2278:211::/45", "28907"}, - {"2a07:cf40::/32", "209578"}, - {"2600:d0a:4000::/31", "20161"}, - {"2800:bf0:80d4::/44", "27947"}, - {"2804:14c:7571::/46", "28573"}, - {"2804:161c:e00::/45", "263268"}, - {"2001:67c:2d38::/48", "207576"}, - {"240a:a46c::/32", "143782"}, - {"2600:0:2::/30", "1239"}, - {"2804:8298::/32", "272528"}, - {"2001:678:c10::/48", "207488"}, - {"240a:a8da::/32", "144916"}, - {"240e:44d:1d00::/41", "140345"}, - {"2803:1a00:150e::/43", "262186"}, - {"2803:5110:1000::/48", "271993"}, - {"2803:bee0::/48", "269989"}, - {"2a06:3040:12::/48", "203020"}, - {"2a0b:f740::/29", "198776"}, - {"2a10:2f00:120::/48", "205977"}, - {"2001:559:838d::/48", "7015"}, - {"2600:6c7f:93a0::/44", "19115"}, - {"2a00:12f8::/37", "9198"}, - {"2602:fc6a:200::/48", "399747"}, - {"2803:4480::/33", "263189"}, - {"2804:2214::/44", "28177"}, - {"2a02:26f7:c489::/46", "20940"}, - {"2a02:26f7:cb88::/48", "36183"}, - {"2401:1b00::/32", "18103"}, - {"2401:d800:f5e2::/38", "7552"}, - {"2607:f6f0:1c00::/40", "15830"}, - {"2607:f768::/34", "33152"}, - {"2001:c38:902b::/41", "9931"}, - {"2409:8b31::/29", "9808"}, - {"240a:a15d::/32", "142999"}, - {"240a:a50e::/32", "143944"}, - {"2600:1406:800::/48", "35994"}, - {"2a06:e380::/47", "203507"}, - {"2401:d800:26e2::/39", "7552"}, - {"2804:1e90:1009::/38", "264436"}, - {"2a07:1b40::/31", "48804"}, - {"2001:250:3c00::/46", "138369"}, - {"2001:250:5426::/38", "23910"}, - {"2001:3c8:5007::/48", "17479"}, - {"2001:559:8691::/48", "33659"}, - {"2804:6e84::/32", "270602"}, - {"2a02:26f7:bfcd::/42", "20940"}, - {"2a02:2808:2501::/48", "197185"}, - {"2001:250:2101::/37", "23910"}, - {"2001:648:20f0::/48", "199399"}, - {"2001:67c:218::/48", "51172"}, - {"2401:d800:5ac0::/42", "7552"}, - {"240a:aa67::/32", "145313"}, - {"240a:ad99::/32", "146131"}, - {"240e:108:2f::/48", "134760"}, - {"2a0f:d8c0::/29", "207715"}, - {"2604:4a80::/32", "54665"}, - {"2804:14d:885::/46", "28573"}, - {"2806:2f0:11a0::/38", "17072"}, - {"2a0e:8f02:f032::/48", "211242"}, - {"2401:4900:2340::/43", "45609"}, - {"2600:1004:9000::/44", "6167"}, - {"2600:141b:6001::/36", "20940"}, - {"2804:214:8743::/43", "26615"}, - {"2001:559:82b1::/48", "33668"}, - {"2001:678:58::/48", "198147"}, - {"240e:980:8100::/40", "4134"}, - {"2602:fc30::/40", "21538"}, - {"2604:9d40::/48", "393290"}, - {"2607:fcd0:100:6600::/52", "8100"}, - {"2a00:1d58:cb80::/37", "47524"}, - {"2a01:6f0:200::/32", "42366"}, - {"2a0d:7fc0::/29", "211748"}, - {"2001:67c:2058::/48", "20712"}, - {"2001:67c:2544::/48", "44574"}, - {"2401:d800:bec0::/42", "7552"}, - {"2408:8256:3c61::/43", "17623"}, - {"240a:a40d::/32", "143687"}, - {"240c:ca1b::/32", "24363"}, - {"2620:72:4000::/48", "5050"}, - {"2800:2a0:2101::/37", "27947"}, - {"2a02:26f7:b704::/48", "36183"}, - {"2804:7650::/32", "271103"}, - {"2a03:3a00::/31", "49931"}, - {"2001:fd8:1e8::/38", "4775"}, - {"2408:840d:d200::/42", "17621"}, - {"240a:ac64::/32", "145822"}, - {"2600:6c38:149::/45", "20115"}, - {"2620:0:5070::/48", "302"}, - {"2620:a5:6001::/48", "16509"}, - {"2800:160:1107::/44", "14259"}, - {"2806:33f::/32", "270131"}, - {"2a02:26f7:f484::/48", "36183"}, - {"2409:8c35::/28", "9808"}, - {"2602:fc5d:350::/48", "399866"}, - {"2602:fed3:6::/48", "21769"}, - {"2a00:4300::/32", "44611"}, - {"2a03:5960::/32", "201324"}, - {"2001:559:227::/48", "13367"}, - {"2001:648:2420::/47", "31563"}, - {"2001:978:1d02::/38", "174"}, - {"2001:df0:2e1::/48", "58381"}, - {"2408:8456:4e00::/42", "17622"}, - {"240a:a4ea::/32", "143908"}, - {"2600:380:c800::/38", "7018"}, - {"2804:7d4c::/32", "271552"}, - {"2806:230:4043::/45", "265594"}, - {"2a02:568:fe02::/48", "31529"}, - {"2001:559:590::/48", "7016"}, - {"2400:5200:1400::/40", "55410"}, - {"240a:ab10::/32", "145482"}, - {"2605:8000:de01::/42", "4261"}, - {"2605:dd40:8990::/44", "16509"}, - {"2804:8384::/32", "272203"}, - {"2a02:26f7:b909::/46", "20940"}, - {"2001:559:c236::/48", "33662"}, - {"2001:1248:8749::/43", "11172"}, - {"2620:39::/48", "39984"}, - {"2804:2710::/32", "263873"}, - {"2a02:26f7:f105::/46", "20940"}, - {"2a05:6dc0::/29", "34822"}, - {"2a0c:b641:2f0::/44", "212424"}, - {"2400:7400:24::/44", "38044"}, - {"2402:c800::/40", "38639"}, - {"2a02:26f7:11c::/48", "36183"}, - {"2001:559:c20a::/48", "33491"}, - {"2405:1a80::/32", "18283"}, - {"240a:ac80::/32", "145850"}, - {"2a00:9e80::/40", "56791"}, - {"2001:df0:217::/48", "56201"}, - {"2402:800:9547::/43", "7552"}, - {"2803:8800::/32", "28022"}, - {"2804:19f4::/32", "61828"}, - {"2806:2f0:42e3::/39", "17072"}, - {"2001:67c:1484::/48", "28917"}, - {"2001:1248:5641::/44", "11172"}, - {"240e:438:3a20::/43", "140647"}, - {"2600:6c38:74::/46", "20115"}, - {"2600:9000:f530::/47", "16509"}, - {"2606:1640::/32", "25787"}, - {"2a01:b945::/30", "48635"}, - {"2401:d800:dff0::/44", "7552"}, - {"2409:8c28:a2c1::/39", "56041"}, - {"2604:9e80::/32", "30396"}, - {"2620:125:f000::/44", "395114"}, - {"2a02:7c8::/32", "24864"}, - {"2a06:1c40::/29", "204035"}, - {"2a11:7e01::/32", "44094"}, - {"2001:559:166::/48", "7922"}, - {"2001:44b8:4064::/48", "7545"}, - {"2a00:eac0::/32", "20915"}, - {"2001:5b0:24f4::/36", "6621"}, - {"2400:9800:5::/46", "24203"}, - {"2605:9440::/32", "397446"}, - {"2001:16b8:c00::/35", "8881"}, - {"2600:1480:8800::/48", "21342"}, - {"2600:370f:3645::/46", "32261"}, - {"2600:370f:52e3::/43", "32261"}, - {"2620:119:10::/46", "36692"}, - {"2804:20e0::/32", "264518"}, - {"2a02:26f7:c684::/48", "36183"}, - {"2a04:5080::/29", "35579"}, - {"2001:559:c335::/46", "7015"}, - {"2403:9100::/32", "45302"}, - {"2405:1c0:6861::/45", "55303"}, - {"2602:fd10:860::/43", "398795"}, - {"2608:106::/48", "27046"}, - {"2a00:4b00:22e::/40", "41935"}, - {"2a02:26f7:eb41::/46", "20940"}, - {"2001:da8:266::/48", "24348"}, - {"2a0b:3700::/47", "61317"}, - {"2a10:da80::/29", "211987"}, - {"2c0f:eb00:100::/40", "61266"}, - {"2001:559:872e::/43", "7922"}, - {"2001:678:6dc::/48", "41029"}, - {"2406:840:f890::/48", "212034"}, - {"2409:8043:2904::/47", "24444"}, - {"240e:44d:80::/41", "4134"}, - {"2804:14c:65d8::/42", "28573"}, - {"2a01:57a0::/32", "208909"}, - {"2a0f:9981::/29", "40676"}, - {"2404:bd40:10::/48", "138005"}, - {"2602:feda:2d0::/47", "133492"}, - {"2607:fb10:7100::/43", "2906"}, - {"2804:704c::/32", "270718"}, - {"2a03:4340::/32", "47279"}, - {"2a0f:35c0::/29", "60262"}, - {"2605:2100::/36", "14442"}, - {"2001:16f8:667::/34", "25525"}, - {"2804:4c9c::/32", "267380"}, - {"2a0d:ca47:8379::/33", "8423"}, - {"2001:3c8:a701::/48", "9562"}, - {"2001:df7:aa00::/48", "133800"}, - {"2600:370f:750a::/45", "32261"}, - {"2804:934::/32", "263059"}, - {"2804:e94::/41", "262468"}, - {"2804:5a5c:6000::/35", "268768"}, - {"2a01:bfe0::/32", "199997"}, - {"2a03:5a00:3f::/48", "197394"}, - {"2a06:dac0:100::/44", "212661"}, - {"2001:44b8:37::/48", "4739"}, - {"2404:1c40:2f::/43", "24432"}, - {"2a02:40::/32", "9009"}, - {"2a11:e87:2000::/36", "208861"}, - {"2c0f:f308::/32", "37223"}, - {"2605:cdc0:30::/47", "398088"}, - {"2a10:3d40::/29", "204790"}, - {"240a:a823::/32", "144733"}, - {"2600:80c:900::/40", "701"}, - {"2a02:26f7:c2c4::/48", "36183"}, - {"2a05:7440:a5ac::/48", "200165"}, - {"2001:43c8::/32", "20928"}, - {"2620:12e:f000::/40", "46771"}, - {"2800:160:185b::/45", "14259"}, - {"2a00:85c0:1::/48", "203315"}, - {"2a04:e4c0:30::/47", "36692"}, - {"2a0c:e100::/29", "33962"}, - {"2001:559:7ba::/48", "7922"}, - {"2001:67c:24b4::/48", "8587"}, - {"240a:a8f5::/32", "144943"}, - {"2800:484:400::/38", "10620"}, - {"2a12:a4c2::/32", "45036"}, - {"2001:559:c4c7::/48", "33651"}, - {"2001:1248:96b6::/44", "11172"}, - {"2404:0:5003::/45", "17709"}, - {"2409:896a:9200::/39", "9808"}, - {"2600:6c10:ff2d::/40", "20115"}, - {"2600:6c38:f0a::/45", "20115"}, - {"2602:fc23:116::/48", "8095"}, - {"2804:1b2:f104::/36", "18881"}, - {"2804:83b4::/32", "272213"}, - {"2a06:7240:6::/48", "57878"}, - {"240a:a1cb::/32", "143109"}, - {"2620:171:3d::/46", "715"}, - {"2a02:2e0:3fc::/48", "205766"}, - {"2a04:6e80:1::/46", "174"}, - {"2001:559:70::/47", "13367"}, - {"2405:84c0:9700::/44", "9886"}, - {"2610:108:3100::/40", "13506"}, - {"240e:d:800::/37", "58563"}, - {"240e:978:5100::/36", "4134"}, - {"2804:3bd4::/32", "266173"}, - {"2a0a:2306:e000::/46", "20853"}, - {"2406:3d40::/32", "134980"}, - {"2600:6c38:71a::/42", "20115"}, - {"2804:b44::/32", "262448"}, - {"2a03:4b40:5183::/38", "50710"}, - {"2600:6c10:f20b::/42", "20115"}, - {"2a01:b943::/29", "48635"}, - {"2a0e:be00::/29", "210662"}, - {"2602:ffb7:594::/48", "62874"}, - {"2001:1248:8701::/46", "11172"}, - {"2403:e440::/32", "138096"}, - {"2408:8456:8200::/42", "17622"}, - {"2600:6c38:d12::/47", "20115"}, - {"2607:6400:1101::/32", "30688"}, - {"2803:bd80::/32", "28007"}, - {"2804:3548::/32", "266279"}, - {"2a02:13b0:100::/40", "48635"}, - {"2a0c:e640:1018::/45", "141011"}, - {"240a:ab03::/32", "145469"}, - {"240e:44d:700::/41", "140345"}, - {"2604:4600::/28", "19531"}, - {"2604:4700:8000::/33", "53591"}, - {"2620:149:a31::/46", "6185"}, - {"2001:67c:2118::/48", "44033"}, - {"2602:fc3d::/36", "14051"}, - {"2804:529c:100::/32", "268529"}, - {"2804:7e34::/32", "271609"}, - {"2a02:20d8::/29", "31638"}, - {"2a04:2b00:119::/48", "206925"}, - {"2001:559:c1f3::/45", "7725"}, - {"2402:800:9ed3::/44", "7552"}, - {"2407:4ac0:6d81::/32", "142045"}, - {"2409:8f20::/25", "9808"}, - {"240a:ac06::/32", "145728"}, - {"2607:ffb0:300c::/47", "6327"}, - {"2a01:4a80::/32", "15630"}, - {"2a02:d740::/29", "199567"}, - {"2a03:4bc0:2900::/48", "30893"}, - {"2a0f:e2c0::/29", "8422"}, - {"2001:250:e00::/46", "138375"}, - {"2400:c980::/40", "132816"}, - {"240a:a7ec::/32", "144678"}, - {"240b:240::/26", "2516"}, - {"240b:4003:7::/48", "45102"}, - {"2602:fedd:1::/48", "397023"}, - {"2607:f740:90::/48", "36236"}, - {"2001:1248:a01a::/45", "11172"}, - {"2001:4b10::/32", "3213"}, - {"2804:1c84:7::/37", "61659"}, - {"2a10:cc47:1000::/36", "210662"}, - {"2001:978:7b01:2::/32", "174"}, - {"2001:deb::/48", "63528"}, - {"2600:1003:f100::/44", "6167"}, - {"2600:1406:f800::/48", "35994"}, - {"2804:2c54::/32", "265210"}, - {"2400:54a0:1004::/48", "149476"}, - {"2600:1416:2000::/48", "25019"}, - {"2804:4eb8::/32", "268277"}, - {"2a02:ff0:3f00::/40", "12735"}, - {"2a02:e980:d8::/42", "19551"}, - {"2a10:b40::/29", "212144"}, - {"2408:8978::/30", "4837"}, - {"2804:7c2c::/32", "271480"}, - {"2a02:26f7:cb48::/48", "36183"}, - {"2a06:a600::/30", "400177"}, - {"2408:80ea:76e0::/43", "17623"}, - {"2600:1009:9110::/36", "22394"}, - {"2607:f5a8:8000::/33", "27589"}, - {"2607:f740:e020::/48", "63911"}, - {"2404:3e00::/32", "38758"}, - {"2408:8459:2150::/38", "17816"}, - {"2606:19c0::/32", "398860"}, - {"2607:fcd0::/39", "8100"}, - {"2803:5c80:5593::/48", "64114"}, - {"2804:14c:65e5::/43", "28573"}, - {"2a06:e881:6203::/48", "61138"}, - {"240a:a055::/32", "142735"}, - {"2804:68c:8000::/33", "262594"}, - {"2804:5e04::/33", "269006"}, - {"2a00:7ee0:8::/46", "16347"}, - {"2401:4900:47f0::/44", "45609"}, - {"2800:440:9200::/42", "27738"}, - {"2a02:78a0::/29", "59970"}, - {"2001:500:94::/48", "33517"}, - {"2402:3a80:b00::/41", "38266"}, - {"2404:8d06:b100::/31", "10089"}, - {"2406:e001:9000::/36", "23655"}, - {"240e:1f:2::/36", "134774"}, - {"2600:6c3b:4c1::/42", "20115"}, - {"2803:3aa0::/32", "266876"}, - {"2a12:4946:1650::/48", "211398"}, - {"2a02:26f0:9e00::/48", "34164"}, - {"2001:559:5f7::/48", "33652"}, - {"2600:6:ffc7::/31", "1239"}, - {"2600:1404:a801::/38", "20940"}, - {"2804:1380:2::/45", "263536"}, - {"2804:3170::/32", "265015"}, - {"2001:253:104::/48", "142070"}, - {"2403:b800:1000::/48", "45671"}, - {"240e:44d:3900::/41", "140345"}, - {"2804:3764::/32", "266409"}, - {"2804:5cfc::/32", "268944"}, - {"2a02:26f7:e4c8::/48", "36183"}, - {"2a02:26f7:ea49::/46", "20940"}, - {"2a06:f902::/36", "56630"}, - {"2404:4400::/28", "9790"}, - {"2800:160:1474::/44", "14259"}, - {"2a03:120::/32", "201718"}, - {"2001:559:8426::/48", "7015"}, - {"2001:1248:5586::/44", "11172"}, - {"2402:b400:4608::/42", "45960"}, - {"2a0e:1c80:f::/48", "3399"}, - {"2a0f:4240::/29", "52000"}, - {"2001:559:8407::/44", "7016"}, - {"2400:c540:1cc::/48", "59238"}, - {"240a:a4bf::/32", "143865"}, - {"240e:17:4000::/32", "4134"}, - {"2603:4000::/31", "3"}, - {"2001:978:4001::/38", "174"}, - {"2600:100d:f000::/44", "6167"}, - {"2806:2f0:4403::/42", "17072"}, - {"2c0f:f4c8::/32", "327872"}, - {"2409:8904:4d60::/38", "24547"}, - {"2a02:8040::/32", "25490"}, - {"2a0d:d180::/29", "206211"}, - {"2001:428:2001:205::/64", "20940"}, - {"240e:a64:2600::/32", "4134"}, - {"2602:fbf1::/44", "38136"}, - {"2a02:26f7:b84c::/48", "36183"}, - {"2a04:16c0::/39", "48921"}, - {"2403:400:600::/36", "23820"}, - {"240a:a649::/32", "144259"}, - {"2600:6c10:204::/44", "20115"}, - {"2a02:26f7:c898::/48", "36183"}, - {"2a02:26f7:f0c8::/48", "36183"}, - {"2001:559:232::/48", "20214"}, - {"240e:1f:6000::/36", "4816"}, - {"2804:81a8::/32", "272468"}, - {"2400:ca04:f037::/30", "23688"}, - {"2804:1b0:1a84::/37", "18881"}, - {"2001:1248:96ff::/39", "11172"}, - {"2400:4ec0:8e03::/39", "64300"}, - {"2402:f740:8000::/36", "138391"}, - {"240a:a9a7::/32", "145121"}, - {"2a02:ee80:40b4::/44", "3573"}, - {"2a02:ee80:4281::/46", "3573"}, - {"2a03:2880:f120::/47", "32934"}, - {"2a0c:cbc0::/35", "209620"}, - {"2a0e:97c3:502::/48", "20473"}, - {"2405:4cc1:e00::/40", "38794"}, - {"2409:8080:2a9f::/48", "56040"}, - {"2a0c:d000::/29", "20612"}, - {"2c0f:f440::/32", "5713"}, - {"240a:a3ff::/32", "143673"}, - {"2600:400:3610::/36", "15147"}, - {"2600:1411:1::/48", "24319"}, - {"2a03:8ae0::/32", "35677"}, - {"2804:954:801::/35", "263073"}, - {"2804:7a14::/32", "271346"}, - {"2001:a68::/32", "15830"}, - {"2402:e280:221a::/45", "134674"}, - {"2600:1403:6001::/38", "20940"}, - {"2800:440:8086::/48", "27738"}, - {"2001:559:c4a2::/48", "22909"}, - {"2001:1248:563d::/46", "11172"}, - {"2401:bd00:dc03::/48", "38636"}, - {"2404:3d00::/38", "3573"}, - {"2405:fd80:900::/37", "135391"}, - {"2600:9000:a104::/48", "16509"}, - {"2804:4134::/32", "266010"}, - {"2001:fd8:b230::/44", "4775"}, - {"240a:a9b9::/32", "145139"}, - {"2a02:26f7:ec44::/48", "36183"}, - {"2800:4b0:8100::/37", "12252"}, - {"2804:248:5::/44", "28598"}, - {"2804:2a80:22::/33", "53094"}, - {"2a03:2a84::/30", "47232"}, - {"2606:7c80:1::/48", "40300"}, - {"2a03:d780::/32", "49770"}, - {"2001:559:8546::/48", "33491"}, - {"2001:4878:8261::/48", "12222"}, - {"2400:3dc0:601::/39", "134371"}, - {"2409:806a:1900::/34", "9808"}, - {"2607:fcc0:6000::/35", "32244"}, - {"2620:3e:a000::/48", "393802"}, - {"2a09:1d40::/48", "209132"}, - {"2402:3a80:8::/46", "38266"}, - {"2408:8459:1e30::/41", "17622"}, - {"2607:c00::/32", "3801"}, - {"2803:6780::/32", "264635"}, - {"2a00:d3e0::/29", "15600"}, - {"2a01:b740:a1f::/48", "714"}, - {"2a09:4e06::/31", "208861"}, - {"2a0b:e980::/29", "51783"}, - {"2408:8256:3aa0::/39", "17816"}, - {"2600:6c42::/32", "20115"}, - {"2800:160:170f::/43", "14259"}, - {"2001:df6:7980::/48", "138719"}, - {"2404:af40::/47", "137020"}, - {"2404:af80::/48", "38026"}, - {"2620:136:bb::/48", "12025"}, - {"2806:230:204a::/48", "265594"}, - {"2408:84f3:3440::/44", "17623"}, - {"240e:4::/37", "140061"}, - {"2803:b2c0:3100::/47", "264851"}, - {"2804:2b1c::/32", "265135"}, - {"2a07:3501:1030::/48", "15542"}, - {"2401:d800:f560::/40", "7552"}, - {"2403:9800:b016::/48", "4771"}, - {"2405:b900:20::/44", "55701"}, - {"240a:a2fe::/32", "143416"}, - {"240a:a4bd::/32", "143863"}, - {"2604:7780::/32", "54489"}, - {"2804:6dfc::/32", "270568"}, - {"2001:559:3ff::/37", "33652"}, - {"2408:8957:a300::/40", "17816"}, - {"2409:8d14:2700::/36", "56044"}, - {"2606:2800:6a18::/47", "15133"}, - {"2a0f:1940::/29", "60262"}, - {"2a10:2840::/29", "213381"}, - {"2001:559:c30a::/48", "33657"}, - {"2001:4878:8321::/45", "12222"}, - {"2800:860:7::/44", "262197"}, - {"2804:7e4:8002::/40", "52865"}, - {"2804:4244::/32", "267489"}, - {"2804:7c9c::/32", "271507"}, - {"2a07:b440::/29", "43366"}, - {"2a10:7d00::/32", "399975"}, - {"2001:67c:2440::/48", "16107"}, - {"2404:bf40:8842::/39", "139084"}, - {"2408:8459:6610::/42", "17623"}, - {"2409:896a:8800::/39", "9808"}, - {"2800:5f0:101::/36", "22724"}, - {"2a11:f140::/29", "34907"}, - {"2607:f758::/35", "13649"}, - {"2803:ab00:91::/48", "52471"}, - {"2804:2be0::/33", "262503"}, - {"2001:559:c4ce::/48", "33491"}, - {"2400:ca03:f024::/29", "23688"}, - {"2600:1408:11::/44", "20940"}, - {"2804:890::/32", "52873"}, - {"2a01:518::/32", "25151"}, - {"2c0f:ffc8::/33", "22355"}, - {"2a07:c881::/32", "47557"}, - {"2001:67c:1bd4::/48", "25373"}, - {"240e:a::/29", "4134"}, - {"2604:6400:40e0::/37", "29974"}, - {"2804:4f0c::/32", "268300"}, - {"2a02:888:824a::/45", "47794"}, - {"2a02:5aa0::/32", "57795"}, - {"2a10:c5c1:beef::/48", "211547"}, - {"2001:559:8268::/48", "13367"}, - {"2001:978:6704::/43", "174"}, - {"2406:840:eb00::/45", "142553"}, - {"240a:a946::/32", "145024"}, - {"2605:900:f100::/36", "12110"}, - {"2610:1a0:70::/38", "40193"}, - {"2804:269c:fe01::/46", "47065"}, - {"2a07:60c0::/29", "24679"}, - {"2600:1014:b100::/42", "6167"}, - {"2001:67c:13d8::/48", "203158"}, - {"2001:12f8:c::/47", "14650"}, - {"2404:3d00:40ad::/43", "3573"}, - {"2409:8a52:100::/38", "56047"}, - {"240a:a544::/32", "143998"}, - {"2804:7c:3::/32", "28585"}, - {"2804:8404::/32", "272234"}, - {"2400:7400:57::/44", "38044"}, - {"2602:801:1008::/47", "11281"}, - {"2001:559:80c2::/48", "33657"}, - {"2a09:9440::/32", "47596"}, - {"2001:da8:c2::/48", "138378"}, - {"240a:a1de::/32", "143128"}, - {"2800:bf0:8100::/45", "52257"}, - {"2001:559:83de::/48", "33662"}, - {"2001:67c:2e0::/48", "43758"}, - {"2001:4490:d760::/46", "9829"}, - {"2408:805c::/34", "17816"}, - {"2001:470:4b::/45", "6939"}, - {"2404:3d80::/39", "61138"}, - {"240a:aa23::/32", "145245"}, - {"2800:160:1e57::/44", "14259"}, - {"2804:14d:90b0::/46", "28573"}, - {"2001:559:55e::/48", "33657"}, - {"2001:559:571::/48", "33287"}, - {"2001:5b0:8c00::/38", "6621"}, - {"2404:4a00:6501::/64", "55423"}, - {"240a:ac4a::/32", "145796"}, - {"2a05:500::/48", "174"}, - {"2a06:f080::/32", "203299"}, - {"2001:df0:ec0::/48", "56231"}, - {"2620:196::/32", "14014"}, - {"2804:52c::/32", "262501"}, - {"2001:67c:15d8::/48", "43668"}, - {"240e:f8::/32", "134773"}, - {"2600:1410:9001::/34", "20940"}, - {"2a02:26f7:dc81::/46", "20940"}, - {"2a10:9100:3::/48", "48721"}, - {"2a10:fcc0::/29", "62336"}, - {"2001:67c:44::/48", "8423"}, - {"2401:3cc0:101::/38", "137409"}, - {"2801:1fc:2e::/48", "27951"}, - {"2804:26a8::/32", "263847"}, - {"2a00:801:4c::/28", "1257"}, - {"2001:559:818b::/48", "33287"}, - {"2001:da8:4e02::/39", "23910"}, - {"240e:967:9800::/34", "4134"}, - {"2801:80:13a0::/48", "264080"}, - {"2804:5c9c::/32", "268919"}, - {"2a06:2b80::/29", "61317"}, - {"2a0f:53c0::/29", "8823"}, - {"2400:400:9::/48", "4766"}, - {"2404:1280:1::/48", "393398"}, - {"2800:bf0:8260::/45", "52257"}, - {"2a02:26f0:c100::/48", "34164"}, - {"2a03:ae40::/34", "61233"}, - {"2402:800:63f7::/44", "7552"}, - {"240a:af52::/32", "146572"}, - {"2600:1407:3801::/37", "20940"}, - {"2001:559:3a8::/48", "7016"}, - {"2401:3c00:c8::/45", "38322"}, - {"2602:fe0e::/36", "394378"}, - {"2a02:26f7:bec0::/48", "36183"}, - {"2a05:d03a:6000::/40", "16509"}, - {"2a0e:aa07:e026::/48", "210872"}, - {"2001:559:39f::/42", "33652"}, - {"2001:df1:fd80::/48", "42960"}, - {"2408:8957:a600::/40", "17622"}, - {"2607:f110::/45", "21889"}, - {"2804:15e4:ffc::/32", "53001"}, - {"2a01:8900::/32", "30847"}, - {"2a02:13f0:8100::/48", "48874"}, - {"2a02:26f7:c604::/48", "36183"}, - {"2001:559:512::/48", "7922"}, - {"2001:df7:f400::/47", "17436"}, - {"2400:a980:2000::/38", "133111"}, - {"2804:4240::/32", "267488"}, - {"2001:122c::/32", "18592"}, - {"2409:8087:6300::/36", "9808"}, - {"2606:f900::/35", "812"}, - {"2620:1d0:5b::/48", "397220"}, - {"2a04:6600::/29", "33856"}, - {"2401:4900:4dd0::/38", "45609"}, - {"2001:559:d7::/44", "7922"}, - {"240a:a20b::/32", "143173"}, - {"2800:484:3900::/38", "10620"}, - {"2804:7df4::/32", "271593"}, - {"2a00:ad87:1302::/48", "15465"}, - {"2c0f:ed00:351::/48", "328442"}, - {"2001:559:8210::/48", "33491"}, - {"2001:559:81cb::/48", "7015"}, - {"2001:559:8562::/48", "33651"}, - {"2001:559:c22b::/48", "33661"}, - {"2403:2d00:4::/32", "17516"}, - {"240a:a55f::/32", "144025"}, - {"2600:1407:22::/45", "35994"}, - {"2605:b900:2::/32", "36218"}, - {"2800:300::/33", "27986"}, - {"2a01:5041:200e::/48", "202196"}, - {"2a0c:b642:1a07::/48", "7489"}, - {"2001:df0:b980::/48", "139251"}, - {"2400:3e20:2000::/35", "210542"}, - {"2404:bf40:a300::/48", "2764"}, - {"240a:a378::/32", "143538"}, - {"2600:6c20:c3a::/41", "20115"}, - {"2605:6c00:1000::/33", "2734"}, - {"2607:f740:e604::/48", "63911"}, - {"2620:117:c000::/48", "21837"}, - {"2a00:7380:feee::/39", "51906"}, - {"2001:559:2b1::/48", "33491"}, - {"2001:559:7a3::/48", "7016"}, - {"2001:67c:1000::/47", "43893"}, - {"2606:ae00:bd41::/38", "7287"}, - {"2a05:fb43::/32", "208861"}, - {"2408:8459:8610::/42", "17623"}, - {"2001:559:dc::/48", "7016"}, - {"2001:559:c30e::/48", "33659"}, - {"2001:df7:780::/48", "141667"}, - {"2407:2a80::/32", "133524"}, - {"2800:484:b500::/38", "14080"}, - {"2a01:b740:a1b::/48", "714"}, - {"2404:cc80::/32", "135352"}, - {"2801:80:25a0::/48", "268001"}, - {"2001:559:42c::/48", "33657"}, - {"2001:559:87c9::/48", "7015"}, - {"2403:df40:17::/39", "14630"}, - {"2408:8456:5440::/39", "17816"}, - {"2806:109f:c::/43", "8151"}, - {"2a01:90e0::/32", "199733"}, - {"2a02:2e02:8ed0::/42", "12479"}, - {"2001:559:80ac::/48", "33668"}, - {"2406:e780:eb0::/48", "63678"}, - {"2804:16d8:56f1::/34", "262729"}, - {"2804:70d4:8000::/34", "270751"}, - {"2a00:d120:30::/44", "29990"}, - {"2a02:587:50fb::/34", "6799"}, - {"2a02:4780::/45", "47583"}, - {"2605:9d80:9003::/48", "4809"}, - {"2620:0:6e0::/48", "4185"}, - {"2a02:16e0::/32", "12703"}, - {"2a05:fe80::/29", "39702"}, - {"2405:1500:71::/40", "58717"}, - {"2620:130:1002::/48", "62649"}, - {"2803:6601:c000::/37", "28075"}, - {"2806:2f0:9be3::/37", "17072"}, - {"2a00:a980::/32", "9022"}, - {"2a02:26f0:4900::/48", "35994"}, - {"2a06:1c0::/30", "50873"}, - {"2a0f:5707:aa90::/44", "212592"}, - {"2401:d800:de40::/42", "7552"}, - {"240a:a74a::/32", "144516"}, - {"240a:ab16::/32", "145488"}, - {"2606:9440::/32", "400289"}, - {"2605:6dc0::/32", "394838"}, - {"2a02:f50::/32", "41833"}, - {"2a0f:b400:b::/29", "60781"}, - {"2610:20:2020::/38", "7764"}, - {"2620:9c:c000::/48", "393717"}, - {"2803:760:171::/35", "269816"}, - {"2401:d800:dcb2::/41", "7552"}, - {"2600:1415:3401::/36", "20940"}, - {"2602:fe60::/36", "209"}, - {"2804:3914::/32", "266523"}, - {"2a02:f30::/32", "15879"}, - {"2a02:cb43:2001::/48", "20546"}, - {"240a:a161::/32", "143003"}, - {"2804:4a24:50::/48", "267221"}, - {"2806:2f0:2043::/43", "22884"}, - {"240a:a7fd::/32", "144695"}, - {"240a:aca4::/32", "145886"}, - {"2600:1419:2c01::/38", "20940"}, - {"2603:c0e8:2800::/39", "1218"}, - {"2804:6b48::/32", "270390"}, - {"2001:250:5834::/46", "24363"}, - {"2001:559:c416::/44", "7015"}, - {"2401:9280::/32", "63494"}, - {"2402:800:32ee::/39", "7552"}, - {"2408:8459:7c30::/41", "17622"}, - {"2600:1901:4010::/44", "396982"}, - {"2600:6c10:186::/38", "20115"}, - {"2600:6c10:ff02::/45", "20115"}, - {"2603:b011::/25", "11796"}, - {"2804:4b40:40::/32", "267293"}, - {"2a0f:e640::/29", "60781"}, - {"2c0f:f980::/35", "33763"}, - {"2001:400:a000:3::/61", "293"}, - {"2402:9e00:403::/32", "24183"}, - {"2402:fb00::/34", "3300"}, - {"2605:a401:80e0::/44", "33363"}, - {"2804:ae0:2d00::/32", "28352"}, - {"2401:9d40::/32", "59165"}, - {"2408:8456:c40::/39", "17816"}, - {"2408:8957:b400::/40", "17622"}, - {"240e:40:9::/46", "4134"}, - {"2803:4580:8106::/40", "52468"}, - {"2a01:1b1::/32", "39292"}, - {"2a01:4bc0:901::/32", "12422"}, - {"2a10:8240::/32", "198175"}, - {"2402:800:51e0::/44", "7552"}, - {"2403:5cc0::/40", "134883"}, - {"2804:53a0::/35", "268596"}, - {"2a02:2ab0:503::/32", "702"}, - {"2c0f:4200:2000::/32", "328790"}, - {"2404:f4c0:a667::/36", "210320"}, - {"2607:5d80::/32", "20042"}, - {"2a01:8840:da::/45", "12041"}, - {"2a06:6540:3081::/48", "3549"}, - {"2a0a:59c7:1005::/46", "204724"}, - {"2406:840:e03f::/48", "142418"}, - {"2a10:7f80::/29", "60193"}, - {"2001:df7:7400::/48", "136052"}, - {"2408:84f3:2e40::/44", "17623"}, - {"2600:6c10:ff9a::/45", "20115"}, - {"2606:8e40:1::/48", "46513"}, - {"2a02:cb42::/32", "20546"}, - {"2a05:3a80::/48", "201499"}, - {"2401:d800:2660::/40", "7552"}, - {"2408:8256:379f::/36", "17816"}, - {"2a00:fb00::/29", "24951"}, - {"2a02:2b80:101::/48", "45012"}, - {"2a02:ee80::/34", "3573"}, - {"240a:a50f::/32", "143945"}, - {"240a:a70c::/32", "144454"}, - {"2605:dd40:8880::/44", "16509"}, - {"2800:160:1762::/44", "14259"}, - {"2804:e94:a0::/41", "262468"}, - {"2001:da8:b3::/48", "24362"}, - {"240e:1f:cf00::/40", "134774"}, - {"2604:ae80:6001::/46", "11904"}, - {"2803:cbc0:1000::/36", "265749"}, - {"2a02:26f7:d500::/48", "36183"}, - {"240a:acdd::/32", "145943"}, - {"240e:108:1182::/48", "133776"}, - {"2a02:26f7:d944::/48", "36183"}, - {"2405:fd80::/40", "135391"}, - {"2407:1000:1001::/32", "24005"}, - {"2600:1408:c801::/38", "20940"}, - {"2a00:1348:11::/32", "8879"}, - {"2a0d:8680::/32", "204570"}, - {"2a0e:aa06::/40", "4842"}, - {"2405:c40::/32", "138887"}, - {"2a00:1508::/32", "49835"}, - {"2a02:2455:8000::/30", "20880"}, - {"2a02:26f7:ef85::/46", "20940"}, - {"2a06:5840::/29", "21067"}, - {"2c0f:f178::/32", "32437"}, - {"2a00:1678:1337::/48", "49453"}, - {"2403:f2c0::/32", "64043"}, - {"2408:8956:4800::/40", "17622"}, - {"2600:803:638::/48", "32982"}, - {"2606:b400:8804::/48", "7160"}, - {"2a02:28d0::/32", "6877"}, - {"2409:8050:2c00::/38", "9808"}, - {"2409:8c28:5e91::/39", "56041"}, - {"240e:44d:1580::/41", "4134"}, - {"2600:6c7f:90b0::/48", "20115"}, - {"2800:a010::/32", "19192"}, - {"2001:1248:5a47::/43", "11172"}, - {"2800:160:15bc::/41", "14259"}, - {"2804:71fc::/33", "270824"}, - {"2a04:b480:23::/29", "60110"}, - {"240c:ce04::/32", "24359"}, - {"2604:8340::/32", "53877"}, - {"2620:1ec:8f0::/48", "8068"}, - {"2800:160:133d::/41", "14259"}, - {"2804:1aa4::/32", "61873"}, - {"2806:2f0:91c1::/38", "17072"}, - {"2a02:26f7:17::/48", "20940"}, - {"2a09:b540::/29", "39326"}, - {"2804:3bb4::/32", "266166"}, - {"2804:3ce0::/32", "266240"}, - {"2a0f:c580::/32", "210625"}, - {"2001:559:793::/48", "33659"}, - {"2001:67c:344::/48", "50156"}, - {"2001:db0:3800::/33", "17766"}, - {"2600:9000:108c::/48", "16509"}, - {"2804:1230::/32", "263462"}, - {"2a03:3580::/32", "42082"}, - {"2001:df0:e3::/48", "9536"}, - {"2400:4ec0::/32", "64300"}, - {"2401:3c0:202::/47", "45528"}, - {"2407:0:0:4::/64", "65066"}, - {"240a:a1f6::/32", "143152"}, - {"2001:18c8:200::/40", "10464"}, - {"2403:5a00:fff1::/44", "23783"}, - {"240a:a3a3::/32", "143581"}, - {"2a02:17a5::/32", "204405"}, - {"2a02:c240:103::/48", "30383"}, - {"2001:559:5dd::/48", "33659"}, - {"2001:fd8:1a4::/46", "132199"}, - {"2001:1248:9751::/46", "11172"}, - {"2402:400::/32", "7610"}, - {"240a:a822::/32", "144732"}, - {"240a:acbe::/32", "145912"}, - {"2a05:1085::/32", "209300"}, - {"2001:559:c09f::/48", "33287"}, - {"2402:800:9aa9::/43", "7552"}, - {"2a02:ec80:600::/48", "14907"}, - {"2600:5002:1806::/48", "26793"}, - {"2606:6340::/32", "399857"}, - {"2a01:87c0::/32", "51406"}, - {"2408:8956:b00::/40", "17816"}, - {"240a:ae17::/32", "146257"}, - {"2600:1417:6f::/48", "20940"}, - {"2a02:1670::/32", "16024"}, - {"2001:67c:1f0::/48", "31172"}, - {"2a07:2a80::/29", "3301"}, - {"2408:8256:2f9b::/48", "17816"}, - {"240e:44d:4d00::/42", "140345"}, - {"2a0b:9bc0:1::/46", "9074"}, - {"2001:1248:4345::/42", "11172"}, - {"2403:4e80::/32", "131270"}, - {"240a:afa7::/32", "146657"}, - {"240e:108:45::/48", "58461"}, - {"2610:b0:4113::/45", "3573"}, - {"2a02:88::/32", "8240"}, - {"2a02:ad8:5600::/36", "12389"}, - {"2402:a7c1::/32", "133752"}, - {"2804:240::/34", "262798"}, - {"2804:4710::/32", "267029"}, - {"2a04:9740::/29", "196954"}, - {"2001:559:3d7::/48", "33287"}, - {"2606:5000:2a00::/33", "209"}, - {"2a02:ee80:41ec::/47", "21433"}, - {"2a03:4bc0:2100::/48", "30893"}, - {"2a0c:9a40:8088::/48", "43927"}, - {"2001:67c:24dc::/48", "197944"}, - {"2608:100:8::/48", "27064"}, - {"2a01:8840:cd::/48", "207266"}, - {"2a02:5740::/47", "41564"}, - {"2a04:4e40:6400::/48", "54113"}, - {"2001:218:3005::/32", "2914"}, - {"2001:44b8:30e0::/48", "7545"}, - {"2800:3a0:193::/48", "52229"}, - {"2a01:8840:fa::/48", "12041"}, - {"2a02:26f7:e1c9::/42", "20940"}, - {"2408:8256:2f8d::/48", "17816"}, - {"2409:8904:8a90::/39", "24547"}, - {"2804:c8::/32", "28366"}, - {"2804:3bf4::/32", "266182"}, - {"2804:7dec::/32", "271591"}, - {"2001:500:8c::/48", "20144"}, - {"2001:559:305::/48", "33651"}, - {"240a:a4f3::/32", "143917"}, - {"2a0d:9080::/29", "56708"}, - {"2600:387:14::/48", "13965"}, - {"2620:10a:f000::/43", "21869"}, - {"2804:7c74::/32", "271497"}, - {"2001:559:3dd::/48", "33652"}, - {"2403:a040:886::/48", "38047"}, - {"2801:80:3ef0::/48", "272576"}, - {"2a00:ff0:fffe::/48", "25409"}, - {"2a02:1c8:90::/44", "24955"}, - {"2a06:a005:f0::/44", "141694"}, - {"2a0e:8f02:f023::/48", "211522"}, - {"2408:8459:3450::/38", "17816"}, - {"2804:4744::/32", "267042"}, - {"2a02:26f0:7b01::/37", "20940"}, - {"2a0e:b107:530::/44", "209114"}, - {"2402:8100:26c0::/47", "45271"}, - {"2800:bf0:2000::/48", "52257"}, - {"2804:6b10::/32", "270375"}, - {"2804:849c::/32", "272271"}, - {"2a02:26f0:5f01::/34", "20940"}, - {"2001:4830:c600::/48", "22147"}, - {"2800:bf0:8160::/46", "52257"}, - {"2804:7770::/32", "271178"}, - {"2806:2f0:41c3::/42", "17072"}, - {"2001:67c:2d70::/48", "57118"}, - {"2406:3100::/32", "9411"}, - {"2602:807:4000::/44", "174"}, - {"2604:d600:1306::/44", "32098"}, - {"2801:80:3e20::/44", "271246"}, - {"2a00:bda0::/32", "42525"}, - {"2001:df0:ba00::/48", "132753"}, - {"2402:800:5d71::/44", "7552"}, - {"240a:a7ae::/32", "144616"}, - {"2600:6c10:6b::/43", "20115"}, - {"2001:400:b30::/48", "44"}, - {"2001:559:8577::/48", "7922"}, - {"2402:800:580f::/43", "7552"}, - {"2804:5250:c000::/37", "268510"}, - {"2a02:2070:ffff::/48", "31560"}, - {"2a02:2e02:d70::/40", "12479"}, - {"2a0c:20c0::/29", "204344"}, - {"2a0f:8f80::/29", "43414"}, - {"2001:44b8:2030::/46", "7545"}, - {"2404:f4c0:204::/40", "146961"}, - {"240e:3bc::/35", "134773"}, - {"2600:1405:f001::/30", "20940"}, - {"2600:6c10::/46", "20115"}, - {"2606:2800:40c::/46", "15133"}, - {"2804:1a0::/47", "28189"}, - {"240a:a350::/32", "143498"}, - {"240a:abc2::/32", "145660"}, - {"2a03:4bc0:2200::/48", "30893"}, - {"2001:559:2f8::/48", "20214"}, - {"2001:678:10c::/48", "21155"}, - {"2401:b0c0:a000::/48", "136941"}, - {"2405:b000:e00::/32", "6262"}, - {"2405:ec00:9054::/33", "23955"}, - {"2408:8256:3177::/44", "17623"}, - {"2602:ffe4:c34::/48", "21859"}, - {"2a0e:2b80:203::/32", "28875"}, - {"2604:3f00::/32", "21547"}, - {"2800:bf0:830f::/48", "27947"}, - {"2804:40b4::/32", "265976"}, - {"2a02:24a0::/32", "58343"}, - {"2a02:6680:2162::/48", "16116"}, - {"2400:6500::/32", "16509"}, - {"2405:e40:8::/48", "24511"}, - {"2604:ac0::/32", "40090"}, - {"2604:6600:2602::/45", "40676"}, - {"2804:14c:5f00::/40", "28573"}, - {"2804:10f4::/32", "52683"}, - {"2a00:1728:2c::/48", "26506"}, - {"2a0f:85c1:beef::/48", "207781"}, - {"2001:4450::/42", "9299"}, - {"2406:f400:120::/44", "134451"}, - {"2408:8459:7450::/38", "17816"}, - {"2603:c011:6000::/36", "31898"}, - {"2804:14c:fc8b::/43", "28573"}, - {"2804:161c:30::/45", "263268"}, - {"2a10:cc41:100::/44", "49367"}, - {"2001:559:81d4::/48", "33668"}, - {"240a:a571::/32", "144043"}, - {"2600:100f:a100::/44", "6167"}, - {"2800:160:2448::/45", "14259"}, - {"2a02:26f0:3901::/33", "20940"}, - {"2a02:cb43:4007::/48", "20546"}, - {"240a:a886::/32", "144832"}, - {"240e:97f::/33", "58543"}, - {"2a02:970:1053::/42", "44002"}, - {"2a0a:e780::/29", "62455"}, - {"2001:dc7:9d0d::/46", "24406"}, - {"2400:8500:6703::/48", "7506"}, - {"2803:58e0::/32", "269878"}, - {"2804:5c84::/32", "268913"}, - {"2a02:26f7:ef40::/48", "36183"}, - {"2001:df5:9600::/48", "135480"}, - {"2407:2580::/33", "44592"}, - {"2408:8456:ee00::/42", "17622"}, - {"240a:adc8::/32", "146178"}, - {"2605:4840:ffff::/48", "63473"}, - {"2804:3e98:c0::/32", "266608"}, - {"2a07:2f00:dead::/48", "203132"}, - {"2001:da8:7012::/48", "24363"}, - {"2408:8956:1100::/38", "17816"}, - {"2604:ca00:f::/48", "36492"}, - {"2607:d500:304::/40", "13768"}, - {"2620:67:a000::/48", "6491"}, - {"2a00:1e98::/29", "34058"}, - {"2001:559:82c9::/48", "33657"}, - {"2001:1497:2::/47", "208520"}, - {"2408:80e2::/33", "4837"}, - {"2408:8256:2f7b::/48", "17816"}, - {"2408:8459:ef50::/35", "17816"}, - {"2804:3d0::/32", "262400"}, - {"2a02:26f7:e688::/48", "36183"}, - {"2001:460:78::/46", "7991"}, - {"2001:559:c124::/48", "7016"}, - {"2607:fc68:21::/39", "2711"}, - {"2a00:cb0:8000::/34", "13289"}, - {"2a01:300:10:5::/64", "6461"}, - {"2a02:26f7:35::/48", "20940"}, - {"2a02:26f7:d645::/46", "20940"}, - {"2001:559:86cc::/48", "33652"}, - {"2405:a900:ffef::/43", "55992"}, - {"240e:438:8e20::/43", "140647"}, - {"2804:5384::/32", "268589"}, - {"2a0b:2f00::/29", "48112"}, - {"2001:559:8130::/47", "7016"}, - {"2001:559:82f9::/48", "33661"}, - {"2001:67c:10ec::/48", "559"}, - {"2001:da8:700d::/46", "24363"}, - {"2605:a7c0:101::/44", "16509"}, - {"2001:ec0:c00::/40", "131293"}, - {"2408:8957:f640::/40", "17622"}, - {"240a:a970::/32", "145066"}, - {"240a:ab55::/32", "145551"}, - {"240a:ad4f::/32", "146057"}, - {"2600:6c38:a24::/43", "20115"}, - {"2602:fdbb:a::/45", "17144"}, - {"2606:9500:3000::/36", "14427"}, - {"2800:160:11cd::/46", "14259"}, - {"2001:4998:29::/43", "10310"}, - {"2401:33c0::/32", "131578"}, - {"2803:3340::/32", "264700"}, - {"2a01:b740:2::/43", "714"}, - {"2a0d:9780::/32", "20860"}, - {"2600:380:7b80::/37", "20057"}, - {"2607:fc48:c10::/48", "40009"}, - {"2a02:88d:8000::/44", "48695"}, - {"2001:503:c27::/48", "26415"}, - {"2001:559:814f::/48", "33657"}, - {"2001:dce:5200::/48", "38064"}, - {"2001:4490:d980::/46", "9829"}, - {"2407:6fc0::/32", "137169"}, - {"2804:64c::/32", "262557"}, - {"2a02:26f7:e709::/46", "20940"}, - {"2001:4cb8::/40", "28878"}, - {"2605:ed00:4c71::/34", "11427"}, - {"2a02:26f7:fb49::/42", "20940"}, - {"2605:ef80:6::/43", "36492"}, - {"2804:6598::/32", "269502"}, - {"2001:a40::/32", "9186"}, - {"2402:d400:fa30::/37", "17762"}, - {"2a02:26f7:be80::/48", "36183"}, - {"2a0d:8480:2::/48", "48282"}, - {"2001:559:c165::/48", "7922"}, - {"2607:ffb0:2004::/35", "6327"}, - {"2804:702c::/32", "262909"}, - {"2804:832c::/32", "272181"}, - {"2a02:26f7:ce49::/42", "20940"}, - {"2a07:cd00::/48", "43260"}, - {"2001:253::/39", "38272"}, - {"2400:8800:1e83::/44", "3491"}, - {"2408:8957:5100::/40", "17816"}, - {"2800:bf0:8066::/47", "27947"}, - {"2804:14c:7589::/42", "28573"}, - {"2a02:26f7:3f::/48", "20940"}, - {"2620:c4::/48", "88"}, - {"2806:2f0:41e1::/46", "17072"}, - {"2a0d:5000:2::/48", "15440"}, - {"2001:b400:f208::/45", "17421"}, - {"240e:438:620::/43", "140647"}, - {"2600:1407:9801::/34", "20940"}, - {"2600:370f:6100::/45", "32261"}, - {"2804:805c::/32", "271746"}, - {"2a03:6740::/29", "20910"}, - {"2001:559:8665::/48", "7016"}, - {"2a03:4500::/32", "30827"}, - {"2001:df3:2c80::/48", "132670"}, - {"2408:8957:5f00::/40", "17816"}, - {"2602:800:1005::/48", "397677"}, - {"2a04:2740::/29", "31169"}, - {"2409:8924:5d00::/38", "56046"}, - {"2602:801:f000::/46", "32590"}, - {"2a09:8e40::/33", "200735"}, - {"2001:67c:1740::/48", "34019"}, - {"240a:a8be::/32", "144888"}, - {"2600:1014:d100::/41", "6167"}, - {"2607:f6f0:205::/48", "12085"}, - {"2001:18b8:3a::/41", "29789"}, - {"2a02:d480:240::/42", "42873"}, - {"2a04:1447::/45", "51964"}, - {"240a:aa74::/32", "145326"}, - {"2803:5c80:6054::/44", "64114"}, - {"2001:19f0:8800::/38", "20473"}, - {"2405:6e00:2440::/42", "133612"}, - {"2600:1003:a400::/44", "6167"}, - {"2607:f290::/32", "6106"}, - {"2801:1d:a001::/48", "263779"}, - {"2806:3a6::/32", "265625"}, - {"2a02:26f0:3e::/41", "20940"}, - {"2a02:26f7:c041::/46", "20940"}, - {"2402:ef03:6100::/29", "7633"}, - {"2603:c020:4000::/35", "31898"}, - {"2620:149:1050::/42", "714"}, - {"2001:250:224::/44", "23910"}, - {"2600:1417:3000:300::/48", "24203"}, - {"2a06:c004::/32", "206766"}, - {"2a11:29c5:b00b::/48", "212149"}, - {"2001:fb0:1035::/48", "133167"}, - {"2409:8924:8b00::/37", "56046"}, - {"240a:a65b::/32", "144277"}, - {"240e:90e:3000::/27", "4134"}, - {"2607:fdf0:5ef8::/46", "8008"}, - {"2804:1730::/32", "263130"}, - {"2804:21f4::/32", "52568"}, - {"2a0c:8700::/29", "44050"}, - {"2001:67c:21d8::/48", "41701"}, - {"2a0f:cdc0::/31", "34535"}, - {"2001:559:853f::/48", "7015"}, - {"2404:a3c0::/32", "134823"}, - {"2407:9a00:1::/48", "55446"}, - {"2804:2d74::/32", "265283"}, - {"2a00:5480::/29", "42346"}, - {"2a02:26f0:8401::/39", "20940"}, - {"2001:df5:9000::/48", "36351"}, - {"2404:7180:a021::/46", "23848"}, - {"2409:8057:3003::/44", "56040"}, - {"2602:801:3000::/47", "6556"}, - {"2a0a:2340::/30", "400177"}, - {"2a10:6bc0::/48", "201511"}, - {"2001:559:3c2::/48", "33491"}, - {"2402:800:f5d0::/42", "7552"}, - {"2a0a:8600::/29", "61317"}, - {"2001:559:c29c::/48", "7922"}, - {"2001:4878:2027::/48", "12222"}, - {"2001:4d18::/48", "39543"}, - {"2404:4f01::/32", "23686"}, - {"2a02:26f7:dec5::/46", "20940"}, - {"2a02:26f7:eb51::/42", "20940"}, - {"2404:c000:8003::/33", "17727"}, - {"2406:6e00:fff0::/44", "7280"}, - {"2408:8459:c230::/41", "17622"}, - {"2a09:bac0:227::/48", "13335"}, - {"2a0b:94c0::/48", "205558"}, - {"2001:418:1401:7d::/64", "20940"}, - {"2a02:6940::/32", "39642"}, - {"2408:8256:3b7b::/48", "17816"}, - {"2607:fa38::/32", "25649"}, - {"2620:52:1::/48", "31976"}, - {"2801:80:ce0::/48", "264372"}, - {"2804:3e90::/33", "266606"}, - {"2a02:26f7:e8d1::/42", "20940"}, - {"2a02:6060::/32", "60717"}, - {"2620:106:a000::/44", "25739"}, - {"2804:1e54::/32", "52746"}, - {"2a00:9f00:d::/32", "29314"}, - {"2a02:88d:210::/44", "48695"}, - {"2a02:22a8::/32", "8369"}, - {"2a03:2880:f16e::/47", "32934"}, - {"2a10:ccc2:20::/43", "35619"}, - {"2001:678:c38::/48", "207411"}, - {"240a:a8b0::/32", "144874"}, - {"240e:982:c100::/40", "38283"}, - {"2803:7200:8008::/47", "27696"}, - {"2a00:9801::/32", "51178"}, - {"2a02:26f7:cf90::/48", "36183"}, - {"2a02:cd80::/29", "49100"}, - {"2001:510:130::/48", "36786"}, - {"2605:b81::/32", "395378"}, - {"2804:2664:9000::/33", "52721"}, - {"2a10:e800:1::/48", "28885"}, - {"2001:559:82ac::/47", "7922"}, - {"2402:800:9463::/43", "7552"}, - {"240a:ab23::/32", "145501"}, - {"2600:370f:37c5::/44", "32261"}, - {"2a02:26f7:cec4::/48", "36183"}, - {"2001:559:c3cd::/48", "33657"}, - {"2001:1388:8a83::/35", "6147"}, - {"2001:579:70b5::/39", "22773"}, - {"2804:2ca0::/32", "265231"}, - {"2a00:13d1::/29", "42689"}, - {"2a0f:e586::/32", "207656"}, - {"2001:559:801f::/48", "33287"}, - {"2001:df7:8a00::/48", "132937"}, - {"2401:d800:ff0::/34", "7552"}, - {"2406:b400:a4::/44", "55577"}, - {"2409:8914:6a00::/39", "56044"}, - {"240a:a30c::/32", "143430"}, - {"2804:5b0c::/32", "268815"}, - {"2a04:7300::/29", "200008"}, - {"2a04:88c0:1::/48", "210550"}, - {"2a0e:97c0:180::/44", "200303"}, - {"2001:cb0:210::/34", "4637"}, - {"2001:448a:50b0::/41", "7713"}, - {"2804:14c:d4b0::/47", "28573"}, - {"2804:3558::/32", "53155"}, - {"2a02:26f7:20::/48", "36183"}, - {"2a02:26f7:e588::/48", "36183"}, - {"2a02:26f7:e88d::/42", "20940"}, - {"2402:e380:134::/44", "139073"}, - {"2804:e0c:c0::/48", "28176"}, - {"2804:6fd0::/32", "270686"}, - {"2806:219:509::/48", "28509"}, - {"2a01:4240::/32", "31246"}, - {"2001:df1:2780::/48", "133725"}, - {"2402:800:9e01::/42", "7552"}, - {"2408:8957:ac00::/40", "17622"}, - {"2409:4001:4000::/30", "55836"}, - {"240e:940:cf00::/34", "4134"}, - {"2a02:a10::/32", "60703"}, - {"2a02:2698:6c00::/38", "51570"}, - {"2a02:2a58:230::/32", "702"}, - {"2001:559:83d4::/48", "7015"}, - {"2001:da8:a5::/48", "24360"}, - {"2001:14b0::/41", "12374"}, - {"240a:a53a::/32", "143988"}, - {"2607:f368:3224::/48", "46846"}, - {"2a02:e480::/29", "47441"}, - {"2a0d:db00::/29", "212144"}, - {"2c0f:fcb0::/34", "36916"}, - {"2400:7fc0:8000::/36", "55960"}, - {"240e:13:804::/48", "140856"}, - {"2607:6002::/32", "12189"}, - {"2803:7000::/33", "52362"}, - {"2a03:7220::/32", "197422"}, - {"2001:578:d50::/31", "22773"}, - {"2607:7d00::/32", "18780"}, - {"2804:1cc::/32", "28130"}, - {"2804:5958::/32", "268184"}, - {"2a0e:97c0:260::/44", "58057"}, - {"2001:559:48b::/48", "7016"}, - {"2001:67c:26d4::/48", "57801"}, - {"2001:ac8:88::/48", "16247"}, - {"2001:1248:9c28::/43", "11172"}, - {"2600:370f:7020::/46", "32261"}, - {"2602:fd26:1::/48", "22855"}, - {"2804:3d24::/32", "266256"}, - {"2001:1900:2377::/40", "3356"}, - {"2409:8750:f00::/35", "56047"}, - {"2603:c002:350::/36", "31898"}, - {"2607:f160:10::/47", "6167"}, - {"2001:448a:2030::/41", "7713"}, - {"2406:840:fef8::/48", "142438"}, - {"2607:d500:303::/48", "63213"}, - {"2806:2f0:3223::/41", "17072"}, - {"2001:44c8:4850::/42", "45430"}, - {"2403:1e40:151::/32", "137967"}, - {"2803:8e20::/32", "27843"}, - {"2804:7f20:140::/38", "271668"}, - {"2806:2f0:2401::/48", "22884"}, - {"2a01:390::/32", "29405"}, - {"2a0f:8ac1:574b::/48", "205749"}, - {"2a02:26f7:ba86::/47", "20940"}, - {"2a03:6080:8::/30", "16285"}, - {"2a07:8d40::/29", "207075"}, - {"2406:840:eb06::/44", "142553"}, - {"2408:8624::/30", "4837"}, - {"240a:a692::/32", "144332"}, - {"240e:931::/30", "4134"}, - {"2a03:2880:f155::/44", "32934"}, - {"2a04:4e40:1e00::/48", "54113"}, - {"2001:448a:60d0::/42", "7713"}, - {"2403:9600::/32", "131157"}, - {"2620:10a:8020::/48", "55195"}, - {"2a02:ac80:41::/43", "25145"}, - {"2401:d800:b8b0::/41", "7552"}, - {"240a:a1a9::/32", "143075"}, - {"2600:1488:a421::/41", "20940"}, - {"2602:807:6006::/40", "53978"}, - {"2620:56:6000::/48", "46924"}, - {"2800:160:17c6::/43", "14259"}, - {"2a02:270::/32", "2116"}, - {"2a02:e186:3000::/48", "33517"}, - {"2001:559:84aa::/48", "33287"}, - {"2001:559:85f9::/48", "7015"}, - {"2600:1406:4201::/37", "20940"}, - {"2604:2180::/32", "396098"}, - {"2607:fd78:904::/32", "26677"}, - {"2620:13a:c003::/43", "53356"}, - {"2a02:26f7:b700::/48", "36183"}, - {"2a03:6400::/43", "11054"}, - {"2a09:bac0:165::/44", "13335"}, - {"2001:559:815b::/48", "20214"}, - {"2001:559:825b::/48", "7922"}, - {"2001:c20:c83f::/41", "9255"}, - {"2604:cb80::/32", "21554"}, - {"2620:11c:f00d::/48", "393667"}, - {"2a05:dac0:4::/29", "44166"}, - {"2409:8080:2aa0::/44", "9808"}, - {"2600:380:9300::/40", "7018"}, - {"2804:28c4::/32", "263979"}, - {"2001:559:868f::/48", "33659"}, - {"2404:bf40:a1c1::/38", "139084"}, - {"240a:a88d::/32", "144839"}, - {"240e:3bc:ec00::/35", "140314"}, - {"2620:74:90::/47", "11840"}, - {"2620:1bc:1015::/46", "7726"}, - {"2a0f:f300::/29", "208163"}, - {"2001:1890:1fff:104::/29", "7018"}, - {"2402:6f80::/32", "134220"}, - {"2404:f4c0:facf::/48", "142284"}, - {"2408:8456:8600::/42", "17622"}, - {"2605:3380:4154::/47", "12025"}, - {"2800:160:160c::/43", "14259"}, - {"2803:6900:543::/48", "52423"}, - {"2804:6814::/32", "269668"}, - {"2a02:26f7:d481::/46", "20940"}, - {"2a09:bac0:118::/47", "13335"}, - {"2001:559:87c3::/48", "33287"}, - {"2409:806a:2100::/36", "9808"}, - {"2a02:ee80:425c::/46", "3573"}, - {"2a0e:b107:f0::/48", "209861"}, - {"2001:559:8177::/44", "7922"}, - {"2001:67c:18a0::/48", "39686"}, - {"2a00:800:234::/37", "1257"}, - {"2a07:cd40::/29", "212855"}, - {"2001:1248:59c1::/46", "11172"}, - {"240a:a514::/32", "143950"}, - {"2600:cc00:1::/46", "32298"}, - {"2a0e:4480::/32", "57757"}, - {"2001:559:810c::/48", "7922"}, - {"2804:7bcc::/32", "271455"}, - {"2a00:5d80::/32", "20860"}, - {"2a0a:4280::/29", "3339"}, - {"2001:57a:8058::/38", "22773"}, - {"2001:678:810::/48", "1836"}, - {"2001:67c:1300::/48", "1836"}, - {"2606:6680:31::/46", "6315"}, - {"2606:b780::/32", "14589"}, - {"2607:a480::/32", "395512"}, - {"2a05:9f06::/31", "206898"}, - {"2001:d18::/32", "9821"}, - {"2402:5300:4800::/37", "45903"}, - {"2404:bf40:a442::/42", "139084"}, - {"2620:149:a0b::/48", "714"}, - {"2403:cfc0:1100::/44", "135134"}, - {"2606:1a40:f006::/43", "398962"}, - {"2607:f378::/32", "131"}, - {"2620:10a:80ba::/48", "25192"}, - {"2804:2b40::/32", "265143"}, - {"2a0b:ae00::/35", "207044"}, - {"2001:67c:19b0::/46", "16086"}, - {"2600:6c39:28a::/42", "20115"}, - {"2804:4afc:e000::/35", "267276"}, - {"2a0c:b641:710::/47", "206368"}, - {"2001:678:3b0::/48", "206186"}, - {"2400:d400:b00b::/48", "45671"}, - {"240a:a7e5::/32", "144671"}, - {"2600:140f:3a01::/39", "20940"}, - {"2604:f400:800::/37", "26878"}, - {"2804:63ac::/32", "269376"}, - {"2604:3700::/48", "10973"}, - {"2607:fcd0:106:6001::/47", "8100"}, - {"2804:6c4:9000::/36", "262893"}, - {"2a06:bfc0::/29", "200918"}, - {"2001:fd0:2401::/35", "10029"}, - {"2405:600:1003::/33", "55805"}, - {"2804:2b54::/32", "265147"}, - {"2804:6eac::/32", "270612"}, - {"2a0d:b201:e0b0::/41", "206026"}, - {"2407:bb00::/36", "45625"}, - {"2600:140b:7800::/48", "24319"}, - {"2604:2a80::/32", "20413"}, - {"2607:7000::/32", "25905"}, - {"2804:e94:1000::/41", "262468"}, - {"2804:8558::/32", "272573"}, - {"2a02:27b8:1111::/46", "49278"}, - {"2a03:aac0::/32", "48473"}, - {"240a:a3d4::/32", "143630"}, - {"2804:628c::/34", "269303"}, - {"2a02:26f7:100::/48", "36183"}, - {"2a0c:9e80::/32", "199520"}, - {"2400:f400::/32", "24278"}, - {"2401:d800:f3b0::/41", "7552"}, - {"2406:8dc0:2500::/40", "51044"}, - {"2600:6c30::/32", "20115"}, - {"2606:2800:3fff::/33", "15133"}, - {"2804:6cec::/32", "270501"}, - {"2a0c:e780::/29", "209936"}, - {"2001:470:113::/48", "15096"}, - {"2801:1e:1800::/47", "3970"}, - {"2a02:17c0::/32", "44869"}, - {"2001:559:c05f::/42", "7922"}, - {"2001:67c:3c::/48", "1257"}, - {"2600:9000:20de::/39", "16509"}, - {"2804:65f4::/32", "52743"}, - {"2804:771c::/32", "271156"}, - {"2001:67c:2c08::/48", "31424"}, - {"2001:1bc8::/29", "29422"}, - {"240e:9b:f01b::/45", "140254"}, - {"2620:74:81::/48", "30060"}, - {"2804:14c:bf00::/40", "28573"}, - {"2804:f8c:8100::/36", "263591"}, - {"2804:4568::/32", "266924"}, - {"2001:1248:5788::/43", "11172"}, - {"2407:3000:6b::/45", "17707"}, - {"2408:8459:7a50::/37", "17816"}, - {"2604:b840::/32", "397732"}, - {"2a02:580::/30", "6799"}, - {"2a02:1660::/32", "35132"}, - {"2a09:d400::/32", "41001"}, - {"2400:f940::/43", "45766"}, - {"2409:8054:30::/48", "9808"}, - {"2409:8e80:3000::/33", "9808"}, - {"240a:a085::/32", "142783"}, - {"2001:500:a6::/48", "393246"}, - {"2001:559:5b::/48", "33287"}, - {"2001:df0:e9::/48", "55680"}, - {"2402:800:58c5::/43", "7552"}, - {"2404:bd40:3::/48", "138005"}, - {"2405:b900:4000::/48", "55701"}, - {"2620:1ff::/36", "10497"}, - {"2a01:3b8:6000::/32", "33885"}, - {"2a01:8a60:200::/34", "60191"}, - {"2001:978:3c05::/44", "174"}, - {"2001:48a8:68f7::/48", "229"}, - {"2804:1148::/32", "263668"}, - {"2804:70c0:13::/48", "270746"}, - {"2402:800:9db7::/41", "7552"}, - {"2404:5580::/48", "213059"}, - {"2600:100d:b030::/44", "22394"}, - {"2602:fcff:11::/48", "213216"}, - {"2804:294:4100::/32", "28604"}, - {"2001:559:5ab::/48", "33662"}, - {"2402:57c0::/32", "134913"}, - {"2403:c800::/32", "9738"}, - {"2803:360::/32", "264773"}, - {"2803:2180:10::/46", "27941"}, - {"2804:40:4000::/36", "28657"}, - {"2804:2334::/32", "264148"}, - {"2001:559:84ef::/48", "20214"}, - {"2604:2980::/32", "62943"}, - {"2605:f700:80::/44", "18978"}, - {"2804:6f04::/32", "270633"}, - {"2a02:df4::/32", "58250"}, - {"2001:df5:580::/48", "138243"}, - {"2400:cb00:214::/44", "13335"}, - {"240a:ab65::/32", "145567"}, - {"240a:ad34::/32", "146030"}, - {"2a02:26f0:d601::/40", "20940"}, - {"2a03:6c0::/32", "198520"}, - {"2a03:6800::/32", "47902"}, - {"2001:fb0:109f:8007::/64", "36040"}, - {"2401:1d40:101::/36", "59019"}, - {"2a0f:1f80::/29", "60781"}, - {"2400:adc5:300::/37", "9541"}, - {"2402:90c0::/32", "55720"}, - {"2403:fbc0:4000::/48", "23959"}, - {"240a:a361::/32", "143515"}, - {"2604:3548::/32", "399587"}, - {"2a02:278::/32", "42227"}, - {"2408:875c:10::/32", "4837"}, - {"2600:6c7f:9062::/48", "20115"}, - {"2606:af00::/32", "30236"}, - {"2803:2540:a2::/44", "264668"}, - {"2804:3708::/32", "266385"}, - {"2804:85d8::/32", "272604"}, - {"2a00:6920:d000::/40", "42003"}, - {"2a01:6c60:3000::/36", "39535"}, - {"2a02:aec0:1::/46", "57363"}, - {"2404:63c0::/44", "131645"}, - {"2404:7e40:2::/32", "138649"}, - {"240a:a16e::/32", "143016"}, - {"240a:a470::/32", "143786"}, - {"2804:16cc::/32", "61917"}, - {"2804:5938::/32", "268176"}, - {"2806:2f0:91a1::/41", "17072"}, - {"2a00:86c0:2057::/42", "2906"}, - {"2a00:fd80:aaab::/33", "38719"}, - {"2a01:7a80::/29", "197301"}, - {"2001:468:1a08::/48", "302"}, - {"2001:67c:948::/48", "30920"}, - {"2001:da8:a001::/46", "24352"}, - {"2001:df1:7780::/48", "30823"}, - {"240e:67b:1800::/32", "4134"}, - {"2600:140f:400::/48", "55836"}, - {"2607:f110:28::/43", "21889"}, - {"2a12:b80::/29", "204790"}, - {"2001:67c:2cec::/48", "2686"}, - {"2408:8210::/29", "4837"}, - {"2409:804b:29ff::/48", "9808"}, - {"2602:fc64:a00::/48", "36829"}, - {"2803:fae0::/32", "269956"}, - {"2806:2f0:5223::/41", "17072"}, - {"2806:370:53c0::/44", "28403"}, - {"2001:67c:2028::/48", "43591"}, - {"2001:13d2:3810::/33", "7303"}, - {"2800:26a::/32", "19429"}, - {"2804:58d0::/32", "268151"}, - {"2a02:7380::/32", "8680"}, - {"2a05:d050:e080::/44", "16509"}, - {"2001:500:856e::/48", "396574"}, - {"2001:559:7c2::/47", "33659"}, - {"2407:500::/45", "58940"}, - {"2800:160:11c2::/44", "14259"}, - {"2a02:9e8::/32", "3257"}, - {"2a0d:b201:1050::/40", "206026"}, - {"2600:370f:744a::/42", "32261"}, - {"2620:1ec:21::/45", "8068"}, - {"2405:9800:9811::/48", "45458"}, - {"240e:964:d400::/39", "58772"}, - {"240e:982:e100::/40", "134764"}, - {"2620:0:c91::/46", "8076"}, - {"2620:135:e000::/40", "2495"}, - {"2804:2a60:25::/39", "263089"}, - {"2a07:e480::/48", "202261"}, - {"2001:44b8:3085::/48", "4739"}, - {"2a02:26f7:e380::/48", "36183"}, - {"2a03:29c0:c000::/34", "61189"}, - {"2400:8000::/45", "4800"}, - {"2401:d800:b360::/40", "7552"}, - {"2409:8000:301b::/40", "9808"}, - {"240a:ae66::/32", "146336"}, - {"2800:d302:11::/46", "11830"}, - {"2804:0:5c01::/34", "2716"}, - {"2001:250:211::/48", "23910"}, - {"2402:4200:1100::/48", "24284"}, - {"2600:1802:8::/43", "16552"}, - {"2001:678:c74::/48", "8881"}, - {"2001:44b8:3089::/48", "4739"}, - {"2406:e007:c000::/34", "23655"}, - {"2409:8900::/31", "56048"}, - {"2a02:5740:11::/48", "41564"}, - {"2001:579:a17d::/40", "22773"}, - {"2405:9800:d201::/34", "45430"}, - {"240a:a62a::/32", "144228"}, - {"2600:141c:c001::/35", "20940"}, - {"2606:2e00:8008::/46", "36351"}, - {"2803:10e0:ced1::/34", "269853"}, - {"2804:1040:6667::/35", "263626"}, - {"2804:3a5c::/32", "53174"}, - {"2a03:5640:f500::/48", "16509"}, - {"2402:800:9dc5::/42", "7552"}, - {"2408:8459:6c50::/38", "17816"}, - {"2a02:26f7:d140::/48", "36183"}, - {"2001:559:c00c::/47", "7922"}, - {"2405:8a00:6014::/46", "55824"}, - {"2600:100d:a000::/43", "6167"}, - {"2a0e:b107:dce::/48", "212237"}, - {"2a12::/29", "204790"}, - {"2001:579:a07d::/40", "22773"}, - {"2602:fec3::/38", "62563"}, - {"2a06:f500::/29", "34549"}, - {"2408:8957:3400::/40", "17622"}, - {"240a:a4c8::/32", "143874"}, - {"2600:6001::/32", "11351"}, - {"2001:520:100e::/43", "8103"}, - {"2401:f540:4::/48", "134094"}, - {"2409:803c:1100::/37", "9808"}, - {"2a0e:cd01:2f00::/29", "23031"}, - {"2604:d600:1246::/43", "32098"}, - {"2606:2800:511b::/48", "15133"}, - {"2a00:7700:8a03::/33", "31200"}, - {"240a:a1f3::/32", "143149"}, - {"2605:9480::/37", "31775"}, - {"2800:160:1ead::/43", "14259"}, - {"2804:2784::/32", "263906"}, - {"2a01:8840:72::/45", "12041"}, - {"2a0a:e5c0:2c::/48", "208731"}, - {"2001:da8:c9::/48", "138369"}, - {"2001:db0:1800::/34", "17766"}, - {"2402:2c00::/32", "17645"}, - {"2402:8100:26b0::/46", "45271"}, - {"2408:8456:2400::/42", "17622"}, - {"240e:5e:1090::/44", "140309"}, - {"2600:1008:6010::/32", "22394"}, - {"2607:fdc8:10::/48", "30036"}, - {"2804:6354::/32", "269354"}, - {"2608:101:8::/48", "5974"}, - {"2804:8398::/32", "272207"}, - {"2a09:fc80::/29", "62240"}, - {"2400:cb00:38::/47", "13335"}, - {"2610:20:2000::/43", "7764"}, - {"2804:2a88::/48", "264077"}, - {"2a04:4280:20::/48", "43260"}, - {"2a04:6100::/29", "60169"}, - {"2a04:d140::/29", "202040"}, - {"2a0d:2b40::/29", "210437"}, - {"2607:f110:e430::/41", "21889"}, - {"2804:1a0:c10::/32", "28189"}, - {"2a02:26f7:bb01::/46", "20940"}, - {"2a04:c500::/29", "202146"}, - {"2402:ee40:51::/44", "17754"}, - {"2a02:f784:8000::/47", "25252"}, - {"2a06:8280::/43", "51786"}, - {"2a0d:ae80::/32", "34953"}, - {"2001:67c:2dc::/48", "2119"}, - {"2402:800:5b39::/41", "7552"}, - {"2804:3838::/46", "53170"}, - {"2804:6c2c::/32", "270450"}, - {"2a0e:97c0:450::/44", "211208"}, - {"2a0e:97c0:730::/48", "208699"}, - {"2a06:e881:5506::/48", "209864"}, - {"240a:a443::/32", "143741"}, - {"2a02:e0:3805::/44", "34984"}, - {"2402:800:b740::/42", "7552"}, - {"2402:c480:9000::/48", "63916"}, - {"240a:3:b90::/44", "9605"}, - {"2600:6c38:215::/42", "20115"}, - {"2804:295c::/32", "53209"}, - {"2804:708c::/32", "270733"}, - {"2a00:8d40::/33", "29584"}, - {"2402:800:5eb1::/44", "7552"}, - {"240a:ad72::/32", "146092"}, - {"2804:1a04:25::/46", "61832"}, - {"2a02:198::/32", "16171"}, - {"2001:550:3205::/37", "174"}, - {"2405:f080:800::/43", "136907"}, - {"2408:8444::/40", "140726"}, - {"2804:14d:b400::/40", "28573"}, - {"2804:8560::/32", "272575"}, - {"2a01:7420::/32", "200924"}, - {"2a0c:6100::/29", "50332"}, - {"2001:559:816e::/48", "7016"}, - {"2001:67c:1988::/48", "198333"}, - {"2401:d1c0::/33", "136994"}, - {"2408:84f3:2c60::/40", "17623"}, - {"2600:370f:5208::/47", "32261"}, - {"2a01:8e00::/29", "48803"}, - {"2a02:2880::/32", "28886"}, - {"2a06:fbc0::/29", "48918"}, - {"2400:f000::/32", "17888"}, - {"2600:100f:b100::/42", "6167"}, - {"2804:1734::/32", "52869"}, - {"2a00:6900:10::/48", "60199"}, - {"2405:6e00:498::/41", "133612"}, - {"2607:f190::/34", "11320"}, - {"2800:320:404::/44", "27882"}, - {"2804:5528::/32", "268693"}, - {"2a00:1188:1a::/29", "8455"}, - {"2a0c:b641:2c0::/44", "212510"}, - {"2a11:8c00::/29", "204790"}, - {"2001:559:c1dd::/48", "33650"}, - {"2a00:6440::/32", "12406"}, - {"2605:f440:5700::/32", "54874"}, - {"2801:170:1::/46", "264648"}, - {"2001:1998:8a0::/41", "7843"}, - {"2a04:9dc0:21::/29", "9009"}, - {"2404:bf40:86c2::/39", "139084"}, - {"2409:8a53:500::/38", "56047"}, - {"240a:a8f7::/32", "144945"}, - {"2409:8087:2800::/44", "56041"}, - {"2620:108:1000::/40", "394009"}, - {"2804:402c::/32", "265942"}, - {"2a00:1210:fffe::/48", "204385"}, - {"2c0e:2700::/28", "37457"}, - {"2001:4878:2347::/48", "12222"}, - {"2409:8914:6800::/39", "56044"}, - {"240e:3bd:ac00::/35", "4134"}, - {"2803:fd80:11::/36", "18747"}, - {"2804:1cd4:1d00::/32", "61678"}, - {"2a02:26f7:e7c9::/46", "20940"}, - {"2a0c:1340::/29", "43260"}, - {"2a0e:a580::/29", "328663"}, - {"2a11:7600::/29", "211199"}, - {"2001:67c:148c::/48", "199564"}, - {"2001:4c78::/32", "12350"}, - {"2402:3a80:c01f::/42", "38266"}, - {"2409:876b:200::/27", "9808"}, - {"240a:a559::/32", "144019"}, - {"2a02:c18:8::/32", "15436"}, - {"2a02:2e02:1980::/38", "12479"}, - {"2a02:7980:106::/32", "43937"}, - {"2a03:db80:5461::/46", "680"}, - {"2a09:bac0:132::/48", "13335"}, - {"240a:adfe::/32", "146232"}, - {"2604:1300:7701::/32", "3833"}, - {"2604:3d09:9000::/33", "6327"}, - {"2a02:26f7:f480::/48", "36183"}, - {"2a0e:b107:3d0::/46", "207687"}, - {"2400:4ec0:880a::/43", "64300"}, - {"2403:6f80::/32", "134795"}, - {"2600:1016:9110::/34", "6167"}, - {"2a00:79e1:f0b::/48", "395973"}, - {"2a02:1c8::/47", "24955"}, - {"2001:559:c342::/48", "33657"}, - {"240a:a5b6::/32", "144112"}, - {"2607:f038:e::/33", "21527"}, - {"2a00:7147:e1::/44", "51430"}, - {"2a09:e40::/32", "50673"}, - {"2001:559:82c3::/48", "7015"}, - {"2409:8055:50::/48", "9808"}, - {"2409:8087:6c60::/44", "9808"}, - {"2606:3000:c000::/48", "30295"}, - {"2a02:26f7:bfc1::/46", "20940"}, - {"2a03:bb40::/32", "61211"}, - {"2001:550:2a00:2::/47", "174"}, - {"2406:ae00::/39", "55564"}, - {"2804:ae0::/34", "28352"}, - {"2804:452c::/32", "262529"}, - {"2a00:c30::/32", "5391"}, - {"2a00:1970::/32", "12480"}, - {"2a03:8c00::/32", "39458"}, - {"2001:420:94::/33", "109"}, - {"2001:12f8:a::/47", "11284"}, - {"2401:d800:57f0::/36", "7552"}, - {"2408:8656:3300::/37", "17816"}, - {"240e:95d:800::/38", "136192"}, - {"2001:1bf0::/29", "2586"}, - {"240e:3b7:ac00::/35", "4134"}, - {"2a10:c941:10:4::/60", "35277"}, - {"2804:46d8::/32", "267015"}, - {"2a02:c18:2::/45", "15436"}, - {"2001:559:83aa::/48", "33651"}, - {"2001:559:87d2::/48", "33659"}, - {"2001:df2:d80::/48", "136284"}, - {"2400:3800::/32", "9617"}, - {"240e:18:51::/31", "4812"}, - {"2a0d:f9c3::/32", "24953"}, - {"2001:559:7f7::/48", "7015"}, - {"2400:dd01:3003::/45", "7497"}, - {"2600:6c10:f066::/44", "20115"}, - {"2804:5a08::/32", "268741"}, - {"2a03:db80:4c80::/48", "5501"}, - {"2a0a:54c1:9::/43", "62240"}, - {"2001:559:82c2::/48", "7016"}, - {"240a:a06c::/32", "142758"}, - {"240a:a85d::/32", "144791"}, - {"2604:d600::/44", "32098"}, - {"2607:fcd0:100:801::/54", "8100"}, - {"2604:8200:e000::/36", "23089"}, - {"2604:e3c0::/32", "19523"}, - {"2804:214:401a::/39", "26615"}, - {"2804:7ddc::/32", "271587"}, - {"2a02:128:15::/48", "62008"}, - {"2a06:1900::/32", "200635"}, - {"2a0e:b940::/29", "208395"}, - {"2a0f:b780::/29", "49095"}, - {"2001:559:833a::/48", "33657"}, - {"2001:559:c325::/48", "7725"}, - {"2001:dcc:500::/46", "23596"}, - {"2600:1000:9000::/44", "6167"}, - {"2803:f340:1020::/41", "14754"}, - {"2804:2488:11::/34", "264228"}, - {"2a0a:d500::/29", "206928"}, - {"2a0c:b641:568::/45", "210481"}, - {"2001:250:701f::/48", "23910"}, - {"2001:559:8379::/48", "33287"}, - {"2001:67c:2218::/47", "2485"}, - {"2001:da8:20b::/45", "23910"}, - {"2600:1008:a000::/43", "6167"}, - {"2605:e740:500::/40", "398710"}, - {"2800:800:b90::/41", "26611"}, - {"2404:d900::/32", "58656"}, - {"2409:803c:3900::/31", "9808"}, - {"2a02:888:4a::/45", "47794"}, - {"2a02:26f7:51::/48", "20940"}, - {"2a07:3500:10a0::/48", "58083"}, - {"2001:678:a00::/48", "49697"}, - {"2607:fb90:3d00::/33", "21928"}, - {"2800:381:5151::/48", "265760"}, - {"2a02:26f7:d6c2::/47", "20940"}, - {"2001:998:82::/48", "49762"}, - {"240a:a5c8::/32", "144130"}, - {"240a:aad9::/32", "145427"}, - {"2800:160:17a7::/44", "14259"}, - {"2804:fc::/33", "28142"}, - {"2a02:70e0::/32", "61296"}, - {"2a10:9903:102::/48", "212806"}, - {"2001:678:aac::/48", "208658"}, - {"2a0b:a2c0::/29", "205584"}, - {"2404:1c40:f6::/44", "24432"}, - {"2409:8948:8c00::/40", "24445"}, - {"2605:5300:200::/32", "21557"}, - {"2a00:79e1:f00::/47", "36384"}, - {"2a02:26f7:efc5::/46", "20940"}, - {"2a04:6d80::/30", "199993"}, - {"2a0f:5701:3300::/37", "206499"}, - {"2001:da8:b00a::/47", "24371"}, - {"2a01:a940::/32", "15954"}, - {"2001:678:8cc::/48", "210146"}, - {"2001:4130:140::/48", "29067"}, - {"2404:bf40:8801::/41", "139084"}, - {"240e:3b2:5600::/34", "136199"}, - {"2604:8540:fc0c::/47", "33353"}, - {"2a02:166a::/32", "20473"}, - {"2a02:26f7:f3c0::/48", "36183"}, - {"2a02:4007::/32", "56821"}, - {"2c0f:ef58::/32", "36924"}, - {"2001:df0:4e00::/48", "134823"}, - {"2001:2000:1100::/34", "1299"}, - {"2409:8c85:aa15::/46", "9808"}, - {"240a:ac1c::/32", "145750"}, - {"240a:ac77::/32", "145841"}, - {"2a02:26f7:bf8c::/48", "36183"}, - {"2a0e:8f02:21a4::/47", "208763"}, - {"2a0f:cc87:7000::/32", "210625"}, - {"2a02:26f7:6d::/48", "20940"}, - {"2a05:dfc7:120::/33", "61138"}, - {"2a07:9944:30::/48", "58305"}, - {"2a01:9080::/32", "39658"}, - {"2001:678:e3c::/48", "208169"}, - {"2a04:92c6::/31", "62240"}, - {"2001:15f8:1::/48", "25384"}, - {"2404:b0:1006::/44", "4750"}, - {"240a:a546::/32", "144000"}, - {"2600:6c5a::/32", "20115"}, - {"2804:61e8::/32", "269264"}, - {"2a04:4e40:ec00::/48", "54113"}, - {"2a0e:b107:e80::/44", "39282"}, - {"2001:559:c1cb::/45", "7922"}, - {"2401:5f80:7::/33", "38731"}, - {"2408:8456:1f40::/40", "17816"}, - {"2a10:2600::/29", "8888"}, - {"240d:c040::/44", "132203"}, - {"240e:c3:2800::/37", "63838"}, - {"2600:380:8b80::/37", "20057"}, - {"2804:17f8::/39", "262628"}, - {"2001:559:50b::/45", "7015"}, - {"2001:1248:5f1e::/42", "11172"}, - {"2001:16a2:c130::/40", "39891"}, - {"2607:f428:9150::/42", "20115"}, - {"2610:68::/33", "5774"}, - {"2620:171:47::/48", "715"}, - {"2803:e0e0:100::/47", "269852"}, - {"2806:230:4024::/48", "265594"}, - {"2403:5a40:50::/48", "134562"}, - {"240a:2000::/29", "23844"}, - {"2a04:4e40:e600::/48", "54113"}, - {"2a06:fc0::/29", "29632"}, - {"2001:559:8212::/47", "33657"}, - {"2605:52c0:5::/48", "54574"}, - {"2408:8957:4600::/40", "17622"}, - {"240a:a524::/32", "143966"}, - {"240e:3b2:ac00::/35", "4134"}, - {"2404:bf40:c082::/41", "139084"}, - {"2600:1000:b170::/40", "22394"}, - {"2602:fed2:7300::/48", "139693"}, - {"2a03:22c0::/32", "199551"}, - {"2a0d:3d80::/29", "204635"}, - {"2001:1248:9a81::/45", "11172"}, - {"2800:110:2201::/37", "4270"}, - {"2804:50e8::/32", "268418"}, - {"2a02:398::/32", "30781"}, - {"2001:4c0::/47", "855"}, - {"2001:da8:e80d::/48", "24368"}, - {"2804:6e20::/32", "270577"}, - {"2a00:cb8:48::/47", "15695"}, - {"2a02:26f7:ec0c::/48", "36183"}, - {"2a0a:de40::/32", "205890"}, - {"2804:815c::/32", "272449"}, - {"2a02:26f7:c441::/46", "20940"}, - {"2001:df2:7d00::/48", "45780"}, - {"2409:8055:38::/48", "9808"}, - {"2607:f188::/32", "21769"}, - {"2a0f:2140::/29", "60262"}, - {"2400:c2c0::/32", "63959"}, - {"2404:bf40:83c1::/46", "7545"}, - {"2604:6000::/32", "11351"}, - {"2804:3d18::/32", "266253"}, - {"2804:8074::/32", "271751"}, - {"2a00:1080::/32", "43646"}, - {"2a02:26f7:c8c8::/48", "36183"}, - {"2a02:ee80:4184::/44", "3573"}, - {"2a02:cb80:4220::/45", "43766"}, - {"2a0a:3980:2::/48", "198949"}, - {"2001:559:8455::/46", "7725"}, - {"2403:67c0::/32", "135772"}, - {"240a:abd5::/32", "145679"}, - {"2600:802:1109::/31", "701"}, - {"2600:130c::/32", "20021"}, - {"2607:f298:6050::/44", "26347"}, - {"2804:63b8::/32", "269379"}, - {"2804:64fc:8000::/33", "269461"}, - {"2a02:26f7:68::/48", "36183"}, - {"2a0f:9400:8008::/48", "207756"}, - {"240e:44d:5200::/41", "140345"}, - {"2600:380:e000::/44", "20057"}, - {"2800:484:a00::/40", "10620"}, - {"2001:67c:18ac::/48", "62316"}, - {"2401:4900:5cc0::/44", "45609"}, - {"2606:6680:13::/48", "64249"}, - {"2806:2f0:4781::/42", "17072"}, - {"2a02:e00:ffe9::/48", "62240"}, - {"2a02:26f7:c80c::/48", "36183"}, - {"2a0e:8f02:f015::/48", "212243"}, - {"2800:160:1ad6::/44", "14259"}, - {"2001:559:73d::/48", "7015"}, - {"2001:559:c02d::/48", "33287"}, - {"240e:438:6c40::/38", "4134"}, - {"2804:90:6100::/38", "28580"}, - {"2804:20fc:700::/35", "264525"}, - {"2804:4d5c:c000::/34", "268192"}, - {"2c0f:f748::/39", "37662"}, - {"2001:559:210::/47", "7922"}, - {"2400:7400:e032::/45", "23736"}, - {"2402:e280:2213::/44", "134674"}, - {"240a:a4bb::/32", "143861"}, - {"2a0f:8646:b00b::/48", "212149"}, - {"2001:67c:690::/48", "1836"}, - {"2803:9460::/32", "262186"}, - {"2a02:26f0:4301::/37", "20940"}, - {"240e:438:1c20::/43", "140647"}, - {"2804:37f8:8000::/33", "266447"}, - {"240a:61::/36", "9605"}, - {"240a:a8c3::/32", "144893"}, - {"2801:1c8:88::/48", "19429"}, - {"2804:310::/46", "262688"}, - {"2806:2f0:50a1::/46", "17072"}, - {"2001:df3:2900::/48", "24060"}, - {"2406:2000:ef65::/48", "58525"}, - {"2406:f400:20::/44", "38001"}, - {"2605:59c0:2000::/35", "36492"}, - {"2a04:f580:9070::/48", "4809"}, - {"240a:abfd::/32", "145719"}, - {"2607:fc28::/33", "22911"}, - {"2001:57a:3a06::/33", "22773"}, - {"2001:67c:1398::/48", "199355"}, - {"2403:a200:9999::/48", "133111"}, - {"2407:8800:bf02::/33", "7545"}, - {"2408:8256:3271::/48", "17623"}, - {"2603:90f5:f::/43", "11426"}, - {"2804:1cd8::/46", "262691"}, - {"2804:3b6c:c018::/42", "265442"}, - {"2a04:2181:c010::/47", "61272"}, - {"2a0e:3840:2::/48", "40676"}, - {"2001:1248:87b0::/36", "11172"}, - {"2001:4830:c601::/36", "27552"}, - {"240e:a7:7fed::/32", "4134"}, - {"2600:140f:9c01::/34", "20940"}, - {"2600:6c2e:cf::/39", "20115"}, - {"2801:17:a800::/48", "19429"}, - {"2a03:c980:5fb5::/48", "210079"}, - {"2a0a:53c0::/48", "42780"}, - {"2a0d:e40::/29", "39402"}, - {"2001:559:805e::/48", "33657"}, - {"240a:aa7a::/32", "145332"}, - {"2a01:ce95::/32", "51964"}, - {"2001:550:20c::/39", "174"}, - {"2001:67c:2100::/48", "41011"}, - {"2604:3b40::/32", "399494"}, - {"2806:2f0:4381::/46", "17072"}, - {"2a00:a5a0::/32", "24971"}, - {"2a05:4140:185::/48", "211358"}, - {"2a0a:56c4:8000::/47", "42649"}, - {"2001:559:81::/48", "33287"}, - {"2405:8a00:2022::/43", "55824"}, - {"2408:8459:4050::/38", "17816"}, - {"2a00:a400::/32", "8943"}, - {"2a09:7:2001::/48", "43992"}, - {"2a0a:4cc0::/40", "197540"}, - {"2407:aa80::/32", "135407"}, - {"240a:a5b5::/32", "144111"}, - {"2a01:280:330::/48", "29518"}, - {"2a02:2010:2620::/45", "20978"}, - {"2a0e:aa00:212::/44", "41378"}, - {"240e:5::/35", "17638"}, - {"2600:1017:f400::/44", "22394"}, - {"2001:df6:6880::/48", "16509"}, - {"2600:6c38:d0::/45", "20115"}, - {"2605:dd40:8f80::/44", "16509"}, - {"2a00:1ca0:2402::/32", "21413"}, - {"2600:1480:7000::/48", "21342"}, - {"2804:204:901::/32", "28186"}, - {"2a0d:3340::/32", "36492"}, - {"2a0e:e40::/32", "208638"}, - {"2001:ee0:dd40::/40", "45899"}, - {"2409:805c:30b1::/41", "9808"}, - {"2600:8807:bc2::/35", "22773"}, - {"2603:c027::/35", "31898"}, - {"2804:4b7c::/32", "28227"}, - {"2001:41a8::/37", "6762"}, - {"2804:810c::/32", "272428"}, - {"2a07:7d80::/29", "50304"}, - {"2401:47c0::/35", "41095"}, - {"2001:4e0:1050::/48", "64251"}, - {"240e:bf:b000::/36", "134768"}, - {"2804:4f58::/33", "268321"}, - {"2001:67c:6f0::/48", "44934"}, - {"2001:df2:3680::/48", "131124"}, - {"240a:a028::/32", "142690"}, - {"2600:1010:be0e::/40", "22394"}, - {"2804:2990:6000::/32", "264022"}, - {"2a10:7040::/29", "212602"}, - {"2001:678:ea4::/48", "39704"}, - {"2600:1406:41::/46", "20940"}, - {"2804:44c::/32", "262761"}, - {"2804:7c0:a000::/33", "262316"}, - {"2a03:2a60:8000::/47", "59871"}, - {"2a10:d503::/32", "398464"}, - {"2a12:b180::/29", "49581"}, - {"2c0f:fe88::/32", "12556"}, - {"2001:559:155::/48", "33652"}, - {"2405:2040:1202::/48", "48024"}, - {"2600:14c0:c::/26", "20940"}, - {"2602:fd43::/36", "63267"}, - {"2801:1b:8801::/48", "18678"}, - {"2804:2124::/32", "264538"}, - {"2806:230:101a::/48", "265594"}, - {"2a02:26f0:b401::/39", "20940"}, - {"2001:678:6ac::/48", "49852"}, - {"2a02:26f7:dfc0::/48", "36183"}, - {"2a03:5260::/32", "48576"}, - {"2001:b28:f23c::/48", "44907"}, - {"2a02:26f7:d2c0::/48", "36183"}, - {"2001:678:744::/48", "203660"}, - {"2804:14d:5c21::/41", "28573"}, - {"2804:59ec::/32", "268734"}, - {"2804:8058::/32", "271745"}, - {"2806:2f0:5043::/40", "17072"}, - {"2a0a:a000::/32", "200564"}, - {"2001:559:83b7::/48", "7015"}, - {"2400:a980:40ff::/48", "38587"}, - {"2403:7100:10::/48", "132220"}, - {"2600:380:1c00::/38", "7018"}, - {"2600:1417:19::/48", "20940"}, - {"2a0f:f680::/29", "60262"}, - {"240a:aeda::/32", "146452"}, - {"2602:101:4001::/46", "20115"}, - {"2603:c001:2e10::/35", "31898"}, - {"2a0e:97c3:425::/48", "20473"}, - {"2c0f:f830::/32", "30844"}, - {"2409:8054:3014::/46", "56040"}, - {"2804:29f4:800::/32", "264047"}, - {"2804:7e6c::/32", "271623"}, - {"2a0d:2600::/29", "39736"}, - {"2001:df6:8c80::/48", "136744"}, - {"2407:a600:8000::/36", "18004"}, - {"2602:feda:b64::/48", "146950"}, - {"2607:f358:a::/47", "18779"}, - {"2804:14d:2a79::/45", "28573"}, - {"2a01:8840:a2::/45", "12041"}, - {"2a02:26f7:fbc1::/46", "20940"}, - {"2a0a:ad80::/29", "60670"}, - {"2a10:3000::/29", "2830"}, - {"240e:44d:4680::/41", "4134"}, - {"2a02:128:8::/48", "50916"}, - {"2402:5c40:2000::/48", "64089"}, - {"2600:1419:1::/45", "20940"}, - {"2602:feda:e3c::/48", "147028"}, - {"2a07:85c5::/48", "174"}, - {"2409:8073:2a04::/29", "9808"}, - {"2600:1417:3d::/41", "20940"}, - {"2803:7bc0::/47", "266185"}, - {"2804:1544::/32", "28252"}, - {"2001:559:859a::/48", "33667"}, - {"2001:660:3005::/46", "2486"}, - {"240a:a14c::/32", "142982"}, - {"2a00:6ec0:100::/40", "56837"}, - {"2a02:26f7:aa::/48", "36183"}, - {"2a0a:a2c0::/47", "205992"}, - {"2c0f:f6e0::/32", "37618"}, - {"2401:8d00:b::/45", "38345"}, - {"2602:805:7000::/44", "40069"}, - {"2a0d:eb40::/29", "39070"}, - {"2001:8e0::/29", "8758"}, - {"2607:f750:fe01::/46", "23473"}, - {"2607:fb10:2013::/45", "2906"}, - {"2610:190:5e00::/34", "62"}, - {"2a02:26f7:76::/48", "36183"}, - {"2a03:1280::/32", "197227"}, - {"2600:6c38:2c::/41", "20115"}, - {"2a0c:9a40:10aa::/48", "213288"}, - {"2001:678:7f8::/48", "200273"}, - {"2a02:f90::/32", "12886"}, - {"2001:559:82a6::/48", "33490"}, - {"2408:8256:3379::/48", "17816"}, - {"240a:a1c3::/32", "143101"}, - {"2606:2800:4a58::/46", "15133"}, - {"2610:128:9100::/37", "11686"}, - {"2620:115:81::/46", "18888"}, - {"2a02:20c8:2331::/37", "50304"}, - {"2a0e:fd45:2b71::/40", "44103"}, - {"2001:c20:48c6::/48", "9255"}, - {"2409:8054:11::/45", "56040"}, - {"2409:8c28:35b1::/33", "56041"}, - {"2607:1280:1350::/42", "394972"}, - {"2804:4488:4010::/44", "262480"}, - {"2804:4870:7400::/32", "267121"}, - {"2804:7c18:40::/32", "267398"}, - {"2a00:9d20:49::/48", "28753"}, - {"2a00:ff0:9999::/48", "12672"}, - {"2a0e:1bc0::/35", "208621"}, - {"2001:500:f0::/48", "53535"}, - {"2403:8600:c09::/45", "45820"}, - {"2a05:9f00::/47", "44222"}, - {"2a0f:5701:3522::/45", "205593"}, - {"2800:160:1bba::/47", "14259"}, - {"2a07:42c0::/29", "34670"}, - {"2a0a:c802:2::/45", "39798"}, - {"240e:981:8100::/36", "4134"}, - {"2600:1006:9050::/39", "22394"}, - {"2602:fd10:c00::/48", "19529"}, - {"2607:1d80::/32", "11287"}, - {"2a00:4800:1a0::/44", "13124"}, - {"2a02:26f7:f6fc::/48", "36183"}, - {"2a09:d980::/29", "209681"}, - {"2a0f:3b05:100::/44", "35487"}, - {"2001:df4:dd80::/48", "8888"}, - {"2409:8920::/29", "56046"}, - {"2602:feda:b40::/48", "142130"}, - {"2001:559:822e::/48", "7922"}, - {"2001:4478:ff02::/40", "4802"}, - {"2001:44b8:4045::/48", "4739"}, - {"2402:4e00:101::/33", "45090"}, - {"2409:8087:6a19::/42", "9808"}, - {"240a:a9ca::/32", "145156"}, - {"2607:f070::/32", "13855"}, - {"2804:2140:1024::/36", "53059"}, - {"2001:550:2200:208::/46", "174"}, - {"2001:559:80f0::/48", "7922"}, - {"2409:8070:b00::/35", "9808"}, - {"2605:a980::/48", "1996"}, - {"2804:1b50::/32", "61719"}, - {"2804:794c::/32", "271297"}, - {"2a00:1670::/32", "8902"}, - {"2a04:2dc0::/48", "39216"}, - {"2001:dc2::/32", "2515"}, - {"2606:3c0::/46", "399016"}, - {"2804:47c8::/32", "267076"}, - {"2804:7fd8::/32", "271713"}, - {"2a12:f280::/29", "209097"}, - {"2001:da8:4005::/48", "23910"}, - {"2403:d500::/32", "132029"}, - {"240e:109:8046::/48", "134756"}, - {"2801:18:8800::/48", "267892"}, - {"2804:106c::/32", "263635"}, - {"2a03:9c60::/32", "43420"}, - {"2a10:3b40::/29", "204790"}, - {"2001:559:c0e1::/48", "7015"}, - {"2400:8b00:a400::/44", "45727"}, - {"2606:f280::/34", "46261"}, - {"2803:8f80::/32", "263829"}, - {"2804:84cc:4100::/32", "272541"}, - {"2a03:e440::/29", "206978"}, - {"2a05:fb40::/32", "208861"}, - {"2a0c:8dc0::/29", "25145"}, - {"2c0f:5c00::/32", "328805"}, - {"2409:8d10::/30", "9808"}, - {"240a:a69c::/32", "144342"}, - {"240a:aae7::/32", "145441"}, - {"2620:bd:c000::/48", "393638"}, - {"2804:77c8::/32", "271199"}, - {"2a00:c827:b::/32", "60330"}, - {"2a02:908::/32", "3209"}, - {"2001:1248:98e3::/48", "11172"}, - {"2406:a800::/32", "45437"}, - {"2600:140f:5800::/48", "9498"}, - {"2600:1480:d801::/37", "20940"}, - {"2806:2f0:84::/38", "17072"}, - {"2a06:4380::/29", "51711"}, - {"2001:559:290::/48", "7016"}, - {"2001:559:c423::/48", "7015"}, - {"2409:8000:3100::/37", "9808"}, - {"2600:5c01:34b9::/32", "10796"}, - {"2804:7f6c:32::/41", "271687"}, - {"2a0d:1dc0::/29", "197706"}, - {"2001:559:114::/48", "7016"}, - {"240e:44d:800::/41", "140345"}, - {"2600:1409:d001::/34", "20940"}, - {"2804:4b70::/32", "267306"}, - {"2001:c20:48ac::/47", "3758"}, - {"2001:16d8:53::/45", "16150"}, - {"240a:af41::/32", "146555"}, - {"2806:269:300::/37", "13999"}, - {"2a02:2e02:82b0::/41", "12479"}, - {"2a04:1cc0::/32", "202916"}, - {"2001:559:4d::/46", "33651"}, - {"2001:559:c373::/48", "33287"}, - {"2402:e280:100::/47", "134674"}, - {"2607:fb90::/36", "21928"}, - {"2804:2a44::/32", "264064"}, - {"240a:ad95::/32", "146127"}, - {"2804:6cc8::/32", "270491"}, - {"2a02:cb80:4158::/47", "43766"}, - {"2a03:7202::/32", "44895"}, - {"2a0e:97c0:7b0::/44", "207716"}, - {"2001:559:c061::/48", "33287"}, - {"2001:c10:ff03::/45", "7473"}, - {"2001:da8:254::/48", "23910"}, - {"2401:8180::/32", "24341"}, - {"2406:8e00::/32", "18139"}, - {"240a:af84::/32", "146622"}, - {"2804:40a0:acc4::/33", "265971"}, - {"2a02:26f7:f448::/48", "36183"}, - {"2a02:f680::/48", "35196"}, - {"2c0f:ec80::/32", "37315"}, - {"2001:559:c3f6::/48", "33657"}, - {"2409:8c3c:900::/45", "9808"}, - {"2600:180b:5002::/29", "16552"}, - {"2602:fd50:bb::/48", "206628"}, - {"2603:6038::/32", "10838"}, - {"2804:83ac::/32", "272211"}, - {"2a0b:b87:ffe3::/48", "205117"}, - {"2a0f:9400:8024::/47", "53356"}, - {"2804:218:bef0::/33", "27715"}, - {"2804:5880::/32", "268133"}, - {"2a01:40:494a::/32", "5459"}, - {"2a0b:b87:fff0::/44", "7489"}, - {"2001:da8:211::/48", "24348"}, - {"2804:b28::/32", "52944"}, - {"2a01:b740:a20::/48", "6185"}, - {"2a01:c8ce:2::/31", "25454"}, - {"2001:500:a8::/48", "21556"}, - {"2001:67c:1441::/48", "45018"}, - {"2404:b300:10::/48", "59318"}, - {"2600:180c:6002::/32", "16552"}, - {"2a04:64c0::/29", "208484"}, - {"2401:d800:9ed2::/39", "7552"}, - {"240a:aad6::/32", "145424"}, - {"2804:ae0:8300::/37", "28352"}, - {"2a06:a001:a107::/44", "210384"}, - {"2407:e2c0::/32", "147030"}, - {"2620:57:e000::/48", "397031"}, - {"2a02:17a0::/29", "47232"}, - {"2001:978:1b04::/47", "210743"}, - {"2604:8900::/48", "40285"}, - {"2605:a200::/32", "33576"}, - {"2806:2f0:5483::/34", "17072"}, - {"2a02:50::/48", "15464"}, - {"2a02:a30::/39", "8926"}, - {"2a03:8f84::/32", "52023"}, - {"2a0e:fd45:2b61::/44", "44103"}, - {"240e:44d:200::/42", "140345"}, - {"2a02:2018::/32", "51218"}, - {"2001:1b58::/29", "35283"}, - {"240e:280::/23", "4134"}, - {"2605:1080:12::/45", "23367"}, - {"2607:1e00::/35", "22489"}, - {"2a02:2278::/38", "28907"}, - {"2a02:26f7:d84c::/47", "36183"}, - {"2a04:4e40:4400::/47", "54113"}, - {"2001:559:8381::/48", "33652"}, - {"2600:1415:4401::/36", "20940"}, - {"2600:6c38:c8::/46", "20115"}, - {"2804:10::/32", "28299"}, - {"2a01:5480::/32", "34497"}, - {"2a05:f787:ffff::/48", "57667"}, - {"2a0a:dd40::/32", "206147"}, - {"2a0c:bc80::/29", "34979"}, - {"2a0e:b107:2a0::/44", "31798"}, - {"2407:b1c0::/32", "138524"}, - {"2408:8459:8430::/41", "17622"}, - {"2409:804f:900::/35", "9808"}, - {"2606:1a40:2017::/48", "132335"}, - {"2800:5e0::/32", "28007"}, - {"2804:14c:8300::/40", "28573"}, - {"2804:1c4c:1a3::/37", "61648"}, - {"2a05:bd40:d13::/48", "29264"}, - {"2001:559:c38c::/48", "7016"}, - {"2400:7400:5f::/48", "23736"}, - {"2401:d800:f830::/41", "7552"}, - {"2402:3a80:1cb8::/45", "38266"}, - {"2409:8c54::/36", "56040"}, - {"2801:140:144::/48", "262249"}, - {"2a00:4802:3c00::/44", "13124"}, - {"2001:559:c176::/48", "33657"}, - {"2001:1248:996b::/43", "11172"}, - {"2405:1c0:7191::/45", "55303"}, - {"2409:8620::/27", "9808"}, - {"240a:a59d::/32", "144087"}, - {"2001:4403:dead::/48", "9896"}, - {"2401:cc00::/32", "24363"}, - {"2402:ef14::/32", "24397"}, - {"240a:ae28::/32", "146274"}, - {"2606:3b80::/32", "394109"}, - {"2606:5e40:dc05::/48", "399606"}, - {"2806:10be:6::/44", "8151"}, - {"2a03:b202::/29", "20860"}, - {"2a12:70c0::/29", "49778"}, - {"240a:a102::/32", "142908"}, - {"2605:f700:140::/40", "18978"}, - {"2001:678:d58::/48", "39409"}, - {"2001:67c:27c4::/48", "213032"}, - {"240a:a813::/32", "144717"}, - {"2607:f7b8::/32", "10490"}, - {"2620:0:2e80::/48", "33631"}, - {"2804:cd4::/32", "52558"}, - {"2804:44d8::/32", "267657"}, - {"2806:2f0:7183::/42", "17072"}, - {"2a0e:6e80::/44", "208800"}, - {"2001:559:85db::/45", "7015"}, - {"2001:df5:b480::/56", "137455"}, - {"2001:fd8:268::/40", "4775"}, - {"2a07:4e00::/29", "203058"}, - {"2001:559:199::/48", "7016"}, - {"2001:df0:6b40::/48", "149375"}, - {"2a01:8740::/48", "57344"}, - {"2a02:26f0:c0::/48", "34164"}, - {"2a0b:10c0::/48", "48749"}, - {"2806:1000::/32", "8151"}, - {"2a02:26f7:71::/48", "20940"}, - {"2a04:8f40:2000::/48", "205505"}, - {"2401:4900:39b0::/44", "45609"}, - {"2001:550:2607::/48", "142580"}, - {"240e:978:2900::/40", "146966"}, - {"2600:1400:e::/43", "20940"}, - {"2602:fe5b::/36", "53872"}, - {"2620:101:403a::/48", "36421"}, - {"2a02:6b00::/36", "28757"}, - {"2a03:9d40:2d00::/38", "41095"}, - {"2001:df6:600::/48", "135653"}, - {"2409:8915:5000::/39", "56044"}, - {"2600:5c01:31cc::/37", "10796"}, - {"2604:9cc0:400::/38", "201106"}, - {"2620:dc:c000::/48", "27009"}, - {"2600:1400:1801::/37", "20940"}, - {"2604:6600:2001::/48", "201106"}, - {"2804:1e58:8000::/33", "264422"}, - {"2a02:26f7:bfc8::/48", "36183"}, - {"2a02:2e02::/39", "12479"}, - {"2a03:f80:852::/48", "9009"}, - {"2001:250:341c::/46", "138393"}, - {"2001:559:c1f6::/48", "7016"}, - {"2001:67c:20f8::/48", "34290"}, - {"2001:67c:2730::/48", "198524"}, - {"2409:8a00::/31", "56048"}, - {"2804:3b58::/32", "266143"}, - {"2a03:5344:40::/44", "34414"}, - {"2a0d:7540::/29", "8888"}, - {"2001:448a:5110::/42", "7713"}, - {"2401:8800:c00::/45", "17439"}, - {"2406:dc0:235e::/47", "9221"}, - {"2620:116:800c::/46", "16509"}, - {"2620:13b:30e1::/48", "13607"}, - {"2804:1f18::/32", "52890"}, - {"2a0c:5247:5000::/36", "59504"}, - {"2001:559:249::/48", "33667"}, - {"2600:1402:4001::/35", "20940"}, - {"2620:74:8::/48", "30060"}, - {"2620:ba:8000::/48", "2386"}, - {"2803:7140::/32", "264639"}, - {"2a04:92c7:33::/45", "62240"}, - {"2a07:90c0::/29", "202771"}, - {"2a0b:33c0:1::/46", "57395"}, - {"2a0e:b107:df2::/48", "20473"}, - {"2001:559:7fa::/47", "7922"}, - {"2001:559:8143::/48", "7015"}, - {"2001:df0:206::/48", "9449"}, - {"2408:8256:3b95::/48", "17816"}, - {"2607:f750:4000::/40", "23473"}, - {"2a0e:8f02:215f::/48", "211869"}, - {"2a0e:8f02:f00d::/48", "212360"}, - {"2001:678:464::/48", "34087"}, - {"2405:8e40::/32", "139838"}, - {"2a0e:b107:270::/48", "207852"}, - {"2001:67c:22e0::/48", "48803"}, - {"2001:dc8:c000::/47", "24066"}, - {"2408:8957:5700::/40", "17816"}, - {"240a:ab46::/32", "145536"}, - {"2600:6c38:194::/44", "20115"}, - {"2804:71f0::/32", "270821"}, - {"2a02:26f7:d340::/48", "36183"}, - {"2620:171:37::/44", "42"}, - {"2804:6f90::/32", "270669"}, - {"2804:70c0:a::/48", "270746"}, - {"2a00:1728:24::/48", "198228"}, - {"2a01:7a20::/32", "35383"}, - {"2a0f:1000::/29", "200567"}, - {"2409:8c54:2820::/35", "56040"}, - {"240e:13:808::/48", "140860"}, - {"2a0d:77c7::/36", "7489"}, - {"2403:d240::/32", "138368"}, - {"2404:4a00:8500:1::/36", "45629"}, - {"2404:bf40:e300::/48", "2764"}, - {"2610:20:8068::/38", "6629"}, - {"2620:149:a2a::/43", "714"}, - {"2a10:6d40::/29", "30633"}, - {"2001:250:207::/44", "24349"}, - {"2001:550:d05::/44", "174"}, - {"2001:550:1d00:300::/47", "174"}, - {"2404:f4c0:f202::/47", "139589"}, - {"2408:8456:b810::/42", "134543"}, - {"240d:c010:7b::/48", "139341"}, - {"240e:3b2:1800::/34", "4134"}, - {"2a09:dd81::/30", "12637"}, - {"2a0b:2e00::/29", "15600"}, - {"2a0f:e5c0::/48", "60781"}, - {"2001:559:c1a6::/48", "33662"}, - {"2406:7100::/32", "132692"}, - {"2001:470:79::/48", "393763"}, - {"2001:67c:2e4c::/48", "48724"}, - {"2402:3f80:1400::/40", "133475"}, - {"2409:8008:d7::/48", "24547"}, - {"2606:2480::/32", "36511"}, - {"2a05:8540::/29", "44543"}, - {"2602:fed2:7600::/40", "1239"}, - {"2804:6cf8::/32", "270504"}, - {"2a07:14c0:5000::/36", "59504"}, - {"2001:67c:16e4::/48", "197521"}, - {"2001:e60:1050::/42", "4766"}, - {"2401:d800:97b0::/41", "7552"}, - {"2402:800:330f::/43", "7552"}, - {"2405:6e00:2240::/40", "133612"}, - {"240e:965:8800::/38", "133775"}, - {"2a04:4e40:a00::/47", "54113"}, - {"2a10:2f00:11a::/48", "207317"}, - {"2001:559:828a::/48", "7922"}, - {"2001:4998:44::/46", "36646"}, - {"2409:8028:800::/40", "56041"}, - {"2a00:fd80::/32", "38719"}, - {"2a02:26f7:b3c4::/48", "36183"}, - {"2a02:7160::/32", "43885"}, - {"2a0b:5b00::/29", "48205"}, - {"2402:ef0e::/32", "38536"}, - {"2806:2f0:3523::/41", "17072"}, - {"2001:428:6402:6::/54", "209"}, - {"2404:3d00:40f6::/47", "21433"}, - {"240e:3ba:9c00::/34", "140310"}, - {"2801:80:c70::/48", "61749"}, - {"2a03:4460::/32", "201466"}, - {"2a0b:4342:2000::/36", "57578"}, - {"2607:f368:2000::/40", "46846"}, - {"2804:fc:5100::/32", "28142"}, - {"2804:8138::/35", "272440"}, - {"2a02:490::/29", "20811"}, - {"2408:8956:e200::/40", "17622"}, - {"2804:2d80:ab00::/35", "262378"}, - {"2401:ff80::/32", "133954"}, - {"2600:140b:5c01::/34", "20940"}, - {"2001:559:497::/48", "7016"}, - {"2a01:280:350::/48", "3301"}, - {"2a02:26f7:ee44::/48", "36183"}, - {"2a10:9100:4::/48", "49453"}, - {"2402:eac0::/32", "137852"}, - {"2404:3f80::/32", "24556"}, - {"2801:192::/40", "262589"}, - {"2804:220c::/32", "264588"}, - {"2a02:2000::/45", "35297"}, - {"2a06:a005:b2::/48", "207941"}, - {"2602:ff7c::/36", "55039"}, - {"2804:14c:ccec::/47", "28573"}, - {"2a02:26f0:cc::/43", "20940"}, - {"2a09:4ec0::/48", "47447"}, - {"2409:8924:300::/37", "56046"}, - {"2603:90f4::/32", "7843"}, - {"2604:be00::/32", "22663"}, - {"2806:268:300::/40", "13999"}, - {"2001:678:180::/48", "204188"}, - {"2001:67c:2e0c::/48", "209721"}, - {"2402:940::/32", "137990"}, - {"2804:18:5028::/45", "26599"}, - {"2806:250:22::/47", "28509"}, - {"2a02:26f7:cac1::/46", "20940"}, - {"2a03:f80:ed31::/48", "57169"}, - {"240a:acaf::/32", "145897"}, - {"2604:d600:129a::/39", "32098"}, - {"2606:6200:1c01::/32", "21570"}, - {"2804:519c::/32", "268465"}, - {"2001:16a2:c0f0::/46", "39891"}, - {"240a:a597::/32", "144081"}, - {"240e:6bb:3000::/29", "4134"}, - {"2804:1890::/32", "61940"}, - {"2804:7558::/32", "271040"}, - {"2a03:2887:ff2e::/43", "63293"}, - {"2a04:8900::/29", "38938"}, - {"2a06:7fc0::/29", "206893"}, - {"2001:559:87b8::/41", "7015"}, - {"2600:ac00::/28", "14007"}, - {"2a02:45c0:16::/47", "3209"}, - {"2a12:5440::/45", "51235"}, - {"2400:a980:2500::/36", "133111"}, - {"2605:a401:832d::/41", "33363"}, - {"2620:110::/47", "16692"}, - {"2a03:6947:1800::/40", "28952"}, - {"2001:408:8001::/33", "14793"}, - {"2408:8956:4000::/40", "17622"}, - {"2620:11f:d000::/47", "393941"}, - {"2806:366::/47", "28435"}, - {"2a02:26f7:f440::/48", "36183"}, - {"2001:df6:e300::/48", "138225"}, - {"2001:fd8:164::/46", "132199"}, - {"2001:43f8:1800::/40", "37724"}, - {"2409:8020:51::/42", "56046"}, - {"2a04:92c7:53::/32", "62240"}, - {"2a10:e000:1::/48", "210909"}, - {"2409:8904:a340::/37", "24547"}, - {"2600:1406:4800::/48", "35994"}, - {"2600:6c38:517::/41", "20115"}, - {"2600:6c7f:90c0::/48", "20115"}, - {"2607:f368:1004::/36", "32982"}, - {"2a03:4f40::/32", "206825"}, - {"240a:afd2::/32", "146700"}, - {"2604:eb00:201::/32", "19212"}, - {"2800:370:12::/48", "28006"}, - {"2800:4f0:500::/41", "28006"}, - {"2804:2868::/42", "263961"}, - {"2a01:af::/32", "200363"}, - {"2a02:5420:1::/48", "9053"}, - {"2a0f:6a40::/29", "29329"}, - {"2404:2480:8101::/33", "135391"}, - {"2404:a800::/45", "9498"}, - {"2a00:dd80:3a::/45", "36236"}, - {"2001:7f0:3000::/46", "60380"}, - {"2408:8459:4030::/41", "17622"}, - {"2408:8957:4000::/40", "17622"}, - {"2604:af80:1448::/36", "18859"}, - {"2606:bc00:9000::/34", "19419"}, - {"2a03:1a20::/48", "207467"}, - {"2a0a:a100::/32", "206906"}, - {"2a0d:8540::/29", "49558"}, - {"2a0e:b107:4b8::/45", "135309"}, - {"240a:a4fd::/32", "143927"}, - {"240e:3b2:1400::/38", "134773"}, - {"2600:1402:c00::/48", "35994"}, - {"2602:809:2000::/44", "398312"}, - {"2a02:4640::/32", "25542"}, - {"2a05:4740::/32", "59741"}, - {"2001:559:c3e5::/48", "7725"}, - {"2409:8a4d:e00::/30", "9808"}, - {"240a:ae22::/32", "146268"}, - {"2804:7800::/32", "271214"}, - {"2806:20d:1643::/40", "32098"}, - {"2001:678:df4::/48", "212899"}, - {"2407:c940:1103::/34", "48024"}, - {"2600:1417:1801::/34", "20940"}, - {"2a03:7020::/47", "59625"}, - {"2a0c:93c0:8000::/48", "212465"}, - {"2001:67c:2448::/48", "43065"}, - {"2001:a00::/32", "41437"}, - {"2620:101:b068::/43", "12079"}, - {"2804:1b94:900::/32", "52974"}, - {"2a04:ea40::/29", "3331"}, - {"2001:559:81db::/48", "33651"}, - {"2001:67c:1500::/48", "1257"}, - {"2400:cb80:813f::/48", "141174"}, - {"2408:8456:a40::/39", "17816"}, - {"2600:3504:c000::/31", "396998"}, - {"2605:f700:c0::/44", "18978"}, - {"2a0e:9846::/32", "52000"}, - {"2001:4c8::/35", "15290"}, - {"2607:f640:e::/32", "32354"}, - {"2803:a40::/47", "263817"}, - {"2804:404c:1012::/39", "265950"}, - {"2a01:40::/33", "5459"}, - {"2804:57a4::/32", "268077"}, - {"240a:aea3::/32", "146397"}, - {"2602:ffde::/36", "16504"}, - {"2001:678:b6c::/48", "207880"}, - {"2401:d180:10::/47", "133865"}, - {"2408:8459:8830::/41", "17622"}, - {"240a:abef::/32", "145705"}, - {"2a0f:d440::/29", "51088"}, - {"2001:12a0:a001::/36", "28292"}, - {"2804:3368::/32", "265394"}, - {"2a02:26f0:5600::/48", "34164"}, - {"2600:1012:b140::/42", "6167"}, - {"2602:ff63::/48", "19754"}, - {"2806:2f0:2402::/48", "17072"}, - {"2a0a:4944::/30", "208972"}, - {"2001:559:8619::/48", "33491"}, - {"2001:4200:38a::/37", "2018"}, - {"2400:7400:e011::/48", "23736"}, - {"2402:800:5d01::/44", "7552"}, - {"2a0b:7280:0:6::/29", "48635"}, - {"2001:1248:9850::/45", "11172"}, - {"2408:8956:9300::/40", "17816"}, - {"2600:5800:2b05::/32", "11426"}, - {"2801:14:b000::/48", "52318"}, - {"2409:8714::/33", "56044"}, - {"240e:3b1:1800::/34", "4134"}, - {"2600:9000:11db::/45", "16509"}, - {"2607:f018::/32", "36375"}, - {"2a01:666:500::/31", "48951"}, - {"2a07:a340::/32", "62217"}, - {"2401:a240::/32", "17958"}, - {"240a:adac::/32", "146150"}, - {"2600:140f:f000::/48", "9498"}, - {"2a0d:68c0::/29", "211175"}, - {"2400:dcc0:a904::/38", "38631"}, - {"2620:129:5000::/45", "393347"}, - {"2a03:f280::/29", "42306"}, - {"2a03:2940::/32", "51440"}, - {"2a07:2a00::/29", "203099"}, - {"2001:678:448::/48", "57760"}, - {"2405:6e00:a00::/35", "133612"}, - {"2408:8459:8450::/38", "17816"}, - {"240a:a68c::/32", "144326"}, - {"2603:6034::/32", "11351"}, - {"2804:4d3c:3100::/33", "267420"}, - {"2a00:6d40::/30", "31034"}, - {"2a02:e980:bf::/41", "19551"}, - {"2404:bf40:c101::/40", "139084"}, - {"2404:e801:200f::/43", "55430"}, - {"2409:896a:a800::/39", "9808"}, - {"2804:59d8:a200::/35", "268729"}, - {"2806:230:2003::/48", "11888"}, - {"2806:370:4180::/44", "28403"}, - {"2a00:1bb8::/32", "12810"}, - {"2001:1980::/39", "29838"}, - {"2402:7700::/32", "18074"}, - {"2602:fc23:11a::/48", "213045"}, - {"2602:feda:ab0::/46", "141011"}, - {"2a03:8fa0::/36", "35258"}, - {"2401:b0c0:c000::/48", "136941"}, - {"2404:e801:1008::/46", "55430"}, - {"2600:6c3b:1c::/42", "20115"}, - {"2804:878::/39", "262374"}, - {"2804:8194::/32", "272463"}, - {"2806:283:6000::/37", "265515"}, - {"2a02:d0c2:1::/48", "59793"}, - {"2c0f:f858::/46", "36947"}, - {"2001:1248:5ae8::/45", "11172"}, - {"240a:a58f::/32", "144073"}, - {"2610:a0:25::/32", "7786"}, - {"2806:230:300a::/48", "265594"}, - {"2a02:26f7:e489::/46", "20940"}, - {"2a03:c342::/32", "57324"}, - {"2a0d:f407:1003::/48", "47687"}, - {"2600:1406:ec01::/38", "20940"}, - {"2606:7040::/32", "400006"}, - {"2803:5a40::/32", "27795"}, - {"2804:46ec::/34", "267020"}, - {"2804:4c14:db01::/34", "267348"}, - {"2a07:e02:1400::/40", "210083"}, - {"2a0c:8305::/32", "61049"}, - {"2a0d:6cc0::/29", "49191"}, - {"2001:428:1003::/48", "2560"}, - {"2001:559:21c::/47", "22258"}, - {"2001:559:847f::/40", "7922"}, - {"2001:4998:1b0::/48", "10880"}, - {"2404:3d00:410a::/43", "3573"}, - {"2600:380:8a00::/39", "20057"}, - {"2620:130:3041::/48", "62861"}, - {"2804:7a8::/39", "262309"}, - {"2a09:7:2000::/48", "39220"}, - {"2001:250:680e::/47", "138373"}, - {"2606:8ac0::/32", "400164"}, - {"2a0c:b642:902::/40", "204625"}, - {"2001:468:1900::/40", "57"}, - {"2001:559:3ef::/48", "20214"}, - {"240a:aebc::/32", "146422"}, - {"240e:108:11d4::/48", "131325"}, - {"2620:0:1a10::/48", "159"}, - {"2806:230:4017::/48", "11888"}, - {"2a02:26f0:4001::/38", "20940"}, - {"2001:67c:2190::/48", "51400"}, - {"2408:84f3:4640::/36", "17816"}, - {"240a:a1e9::/32", "143139"}, - {"240a:ab1e::/32", "145496"}, - {"2001:67c:2d44::/48", "201170"}, - {"2001:1248:a462::/44", "11172"}, - {"2403:780:10::/32", "64098"}, - {"2602:260::/32", "54058"}, - {"2a04:2340::/29", "59455"}, - {"2001:fb0:1071::/48", "133761"}, - {"2804:25c0::/32", "264300"}, - {"2a00:800:441::/31", "1257"}, - {"2405:1c0:6a51::/46", "55303"}, - {"2804:848::/32", "262737"}, - {"2804:17b0::/32", "263165"}, - {"2806:370:4000::/44", "28403"}, - {"2a02:4e0:2c00::/41", "16135"}, - {"2a0c:75c0::/46", "44486"}, - {"2001:df0:7::/48", "8075"}, - {"240a:a757::/32", "144529"}, - {"2a06:d700:4444::/48", "201849"}, - {"2605:a900:f::/35", "46887"}, - {"2606:2800:11f::/42", "15133"}, - {"2a02:7200::/32", "30721"}, - {"2001:559:8250::/48", "33652"}, - {"2001:579:f138::/41", "22773"}, - {"2407:f800:201::/39", "38182"}, - {"240a:aa2f::/32", "145257"}, - {"240a:ad54::/32", "146062"}, - {"2803:2e40:10b::/32", "27796"}, - {"2804:525c::/32", "268513"}, - {"2a02:26f7:37::/48", "20940"}, - {"2a04:76c7:200::/48", "13213"}, - {"2001:559:82b5::/48", "33651"}, - {"2606:2800:422c::/48", "15133"}, - {"2a0f:4780::/29", "197706"}, - {"2c0f:f348:1601::/32", "24757"}, - {"2001:c20:c835::/48", "9255"}, - {"2406:3000:1000:100::/31", "4657"}, - {"2409:8c15:4e00::/32", "56044"}, - {"2804:5880:b000::/33", "268133"}, - {"2a02:26f7:b400::/48", "36183"}, - {"2a02:26f7:c301::/45", "20940"}, - {"2a02:2a48::/32", "43853"}, - {"2001:559:8696::/48", "7015"}, - {"240a:aa71::/32", "145323"}, - {"2804:10c8:d010::/34", "263649"}, - {"2001:559:84ac::/48", "7015"}, - {"2001:df1:f180::/48", "139771"}, - {"2402:800:f080::/42", "7552"}, - {"240a:af05::/32", "146495"}, - {"2804:83fc::/32", "272232"}, - {"2a02:26f7:a1::/48", "20940"}, - {"2603:c020:8000::/35", "31898"}, - {"2a00:b340:10::/48", "196745"}, - {"2a01:8180:3000::/36", "29063"}, - {"2a0e:b107:3f6::/47", "57883"}, - {"2001:4:112::/48", "112"}, - {"2605:a7c0:121::/44", "16509"}, - {"2801:10:e800::/48", "27951"}, - {"2804:5e6c::/32", "269032"}, - {"240e:a8:e200::/39", "140647"}, - {"2804:1430::/32", "263316"}, - {"2804:3e64::/32", "266593"}, - {"2a02:20a0::/32", "50217"}, - {"2a07:6fc0:1::/44", "34549"}, - {"2a10:cc42:110::/48", "206671"}, - {"2001:df7:1e80::/48", "138277"}, - {"2402:800:97c5::/43", "7552"}, - {"2606:1a40:1010::/44", "398962"}, - {"2804:a50::/32", "28349"}, - {"2001:df0:3780::/47", "131365"}, - {"2620:12:2001::/48", "54976"}, - {"2620:74:15::/48", "29403"}, - {"2804:3b0:9500::/33", "53062"}, - {"2804:6bb0::/32", "270417"}, - {"2a00:6e80::/32", "2119"}, - {"240a:a8aa::/32", "144868"}, - {"2804:7ec0::/32", "271645"}, - {"2a00:1ca8:78::/40", "50673"}, - {"2a00:6500::/29", "20723"}, - {"2a01:570:2::/32", "33941"}, - {"2a06:9040::/29", "13101"}, - {"2620:0:900::/48", "4185"}, - {"2804:63e0::/32", "269389"}, - {"2a04:5b81:1000::/40", "202265"}, - {"2c0f:1500:2000::/36", "328888"}, - {"2001:1af0:9020::/48", "43009"}, - {"2402:800:579b::/42", "7552"}, - {"2604:a1c0::/32", "395466"}, - {"2001:559:8714::/48", "33662"}, - {"2407:1e00:1004::/32", "45158"}, - {"2600:6c38:707::/44", "20115"}, - {"2606:6500::/28", "19331"}, - {"2607:ffd8:801::/48", "17048"}, - {"2800:160:1826::/44", "14259"}, - {"2806:2f0:72c1::/46", "17072"}, - {"2a02:970:117a::/40", "44002"}, - {"2a02:26f7:cb85::/46", "20940"}, - {"2401:800::/32", "9812"}, - {"2804:2d3c::/32", "265268"}, - {"2804:5e70::/32", "269033"}, - {"2a0d:d740:107::/48", "207675"}, - {"240a:ae40::/32", "146298"}, - {"240e:105:f500::/40", "139316"}, - {"2a01:4a60:ffbf::/48", "196939"}, - {"2001:559:129::/48", "7922"}, - {"2001:fd8:2f3::/39", "4775"}, - {"2408:8256:2d60::/44", "17623"}, - {"2804:1d4c:8040::/33", "264359"}, - {"2a02:21b2:b2ee::/48", "57370"}, - {"2001:c20:c841::/48", "3758"}, - {"2408:8957:e300::/40", "17816"}, - {"2a01:4b40:1000::/33", "21299"}, - {"2a0c:9a40:808d::/48", "201106"}, - {"2001:4d78:2200::/37", "15830"}, - {"2408:8956:ae00::/40", "17622"}, - {"240e:925:1000::/34", "4134"}, - {"2604:3dc0::/32", "394449"}, - {"2a02:26f7:d285::/46", "20940"}, - {"2001:1938:4007::/48", "33438"}, - {"2602:803:4072::/47", "398223"}, - {"2803:3640::/32", "264750"}, - {"2a02:21e8::/32", "197036"}, - {"2a02:26f7:cb10::/48", "36183"}, - {"2a09:3cc0::/29", "204326"}, - {"2401:4900:4680::/44", "45609"}, - {"240e:3bc:7a00::/32", "140313"}, - {"2800:bf0:b400::/45", "52257"}, - {"2a02:26f7:c885::/46", "20940"}, - {"2607:6004:100::/40", "12189"}, - {"2800:160:1ebd::/41", "14259"}, - {"2603:8070::/31", "10796"}, - {"2606:2800:5a48::/46", "15133"}, - {"2804:6180::/32", "269238"}, - {"2a02:26f7:c284::/48", "36183"}, - {"2a02:26f7:c381::/46", "20940"}, - {"2a0c:7e43:2e10::/48", "20473"}, - {"2a11:7a40::/29", "204790"}, - {"2400:7400:77::/32", "38044"}, - {"2406:3003:2000::/42", "55430"}, - {"2804:1e78::/32", "28658"}, - {"2a02:26f7:d44d::/42", "20940"}, - {"2c0f:f9a8::/32", "37680"}, - {"2403:4540::/32", "137991"}, - {"240a:ab35::/32", "145519"}, - {"240e:3b8:f700::/36", "4134"}, - {"2620:22:e000::/48", "64273"}, - {"2a0a:11c0::/29", "43129"}, - {"2401:d800:db70::/40", "7552"}, - {"2402:800:319b::/41", "7552"}, - {"2405:4500:e::/32", "9671"}, - {"2600:100e:a110::/35", "6167"}, - {"2604:f980:2100::/44", "19957"}, - {"2800:ba0:6::/48", "263812"}, - {"2a02:26f7:e::/48", "36183"}, - {"2a02:26f7:fac5::/46", "20940"}, - {"2a02:2e02:1f60::/40", "12479"}, - {"2a09:3345::/30", "209509"}, - {"2606:4000:300::/40", "11074"}, - {"2607:f650::/32", "32869"}, - {"2804:1b08:4000::/32", "61704"}, - {"2a02:ff00::/29", "60475"}, - {"2806:2f0:5283::/41", "17072"}, - {"2001:559:c047::/44", "7922"}, - {"2001:648:2800::/48", "5470"}, - {"2401:d800:2380::/42", "7552"}, - {"2602:fe90:602::/45", "35913"}, - {"2806:2f0:9ec1::/42", "17072"}, - {"2a07:4340::/29", "200612"}, - {"2a10:f540::/29", "15600"}, - {"2001:506:30::/48", "13830"}, - {"240a:ae16::/32", "146256"}, - {"240e:44d:2e80::/41", "4134"}, - {"2605:a000:1f00::/32", "10796"}, - {"2620:101:9008::/47", "40934"}, - {"2800:5d0:802::/32", "52302"}, - {"2803:25e0::/32", "28032"}, - {"2a02:26f7:ce01::/46", "20940"}, - {"2001:678:658::/48", "3209"}, - {"2408:8459:2e10::/41", "17623"}, - {"2605:a401:9::/48", "33363"}, - {"2804:50e4::/32", "268417"}, - {"240e:108:48::/48", "134769"}, - {"2001:559:824c::/47", "33651"}, - {"2001:67c:840::/48", "212688"}, - {"2001:da8:801f::/48", "133475"}, - {"2402:800:74a0::/41", "7552"}, - {"2408:84f3:3460::/40", "17623"}, - {"240e:108:10b0::/47", "134420"}, - {"2001:559:5ad::/48", "7725"}, - {"2001:559:8142::/48", "33491"}, - {"2001:fff::/40", "38620"}, - {"240a:a519::/32", "143955"}, - {"2605:3380:4186::/44", "12025"}, - {"2a11:b00::/29", "208959"}, - {"2001:250:c00::/44", "138374"}, - {"2001:559:c044::/48", "7725"}, - {"240a:acb9::/32", "145907"}, - {"2800:160:1f92::/45", "14259"}, - {"2806:2f0:9501::/46", "17072"}, - {"2a02:c47:4::/48", "48446"}, - {"2001:1a11:78::/48", "8781"}, - {"2402:7b40::/32", "132894"}, - {"2403:f000:100::/40", "38220"}, - {"240a:a39a::/32", "143572"}, - {"2a00:1268::/32", "39761"}, - {"2a03:71c0::/32", "29208"}, - {"2a07:59c1:201a::/45", "210770"}, - {"2a0a:e6c0::/29", "197075"}, - {"2403:7900::/32", "1851"}, - {"2600:1408:3c00::/48", "35994"}, - {"2607:fc48:810::/48", "40009"}, - {"2804:5458:1000::/34", "268644"}, - {"2a01:7a00:adac::/33", "51701"}, - {"2a0b:1306::/48", "198018"}, - {"2001:559:82f8::/48", "33667"}, - {"2001:67c:2704::/48", "47914"}, - {"2401:3ac0::/32", "133189"}, - {"240e:3b1:9200::/36", "140317"}, - {"2600:6c38:8ea::/47", "20115"}, - {"2a02:2248::/32", "12615"}, - {"2405:8340::/32", "132923"}, - {"240a:a0a7::/32", "142817"}, - {"2620:123:9000::/48", "394976"}, - {"2803:c010:7::/48", "271799"}, - {"2804:104c:c000::/40", "263629"}, - {"2806:2f0:2442::/48", "17072"}, - {"2400:1c00:1d0::/42", "45143"}, - {"2600:9000:224e::/43", "16509"}, - {"2603:d000::/24", "30600"}, - {"2001:4998:181::/43", "10310"}, - {"2408:8459:1930::/41", "17622"}, - {"240a:a96a::/32", "145060"}, - {"2605:3380:4149::/45", "12025"}, - {"2620:9f:c000::/48", "6109"}, - {"2620:118:8010::/48", "40885"}, - {"2804:151c::/32", "263371"}, - {"2401:4900:4f80::/44", "45609"}, - {"2401:d800:71f0::/38", "7552"}, - {"2600:6c10:4a::/43", "20115"}, - {"2804:28f4::/32", "263989"}, - {"2804:6720::/32", "269605"}, - {"2a01:4d0::/32", "31400"}, - {"2a07:3b80::/48", "47869"}, - {"2a0b:4340:1340::/48", "205152"}, - {"2600:140f:3401::/39", "20940"}, - {"2600:6c10:f345::/46", "20115"}, - {"2a02:26f7:d185::/46", "20940"}, - {"240a:a0ba::/32", "142836"}, - {"240a:a0c3::/32", "142845"}, - {"2a04:f7c0::/30", "201766"}, - {"2401:4900:a80::/39", "45609"}, - {"2404:7c0::/32", "138109"}, - {"240a:a104::/32", "142910"}, - {"2804:2f3c:2010::/42", "264879"}, - {"2001:218:2200::/40", "18259"}, - {"2407:4c00::/32", "38719"}, - {"240a:aefa::/32", "146484"}, - {"2604:5680::/32", "14860"}, - {"2001:559:c180::/48", "33659"}, - {"2001:da8:b00d::/46", "24371"}, - {"2001:4bf0:1::/48", "29527"}, - {"2401:4900:3f10::/41", "45609"}, - {"240e:db:9801::/34", "4134"}, - {"2001:550:800:200::/39", "174"}, - {"2001:559:4e9::/48", "33651"}, - {"2001:648:20f1::/38", "5408"}, - {"240e:3b2:2800::/38", "4134"}, - {"240e:45c:cb00::/40", "140538"}, - {"2a02:2100::/32", "39134"}, - {"2a0a:56c4:8400::/47", "42649"}, - {"2a0e:fd45:da0::/47", "60557"}, - {"2409:8907:7f20::/32", "24547"}, - {"2409:8c20:9c74::/34", "56046"}, - {"2804:7be8:c005::/44", "271462"}, - {"2001:df0:29f::/48", "58445"}, - {"2404:bf40:e701::/48", "2764"}, - {"240a:af0e::/32", "146504"}, - {"2602:ffe2:99::/48", "53334"}, - {"2606:7480::/32", "394232"}, - {"2607:8500::/32", "14987"}, - {"2001:559:8214::/48", "7015"}, - {"2001:67c:6f4::/48", "50073"}, - {"2a02:26f0:c700::/48", "9121"}, - {"2001:559:26e::/48", "7922"}, - {"2404:7cc0:7f04::/47", "10100"}, - {"2409:8d61::/30", "9808"}, - {"2801:10e::/48", "271844"}, - {"2a01:c50e:f200::/39", "12479"}, - {"2a02:26f7:d7c8::/48", "36183"}, - {"2a10:adc0::/29", "59474"}, - {"2001:da8:b1::/48", "24356"}, - {"2001:dcd:30::/48", "38796"}, - {"240a:a38d::/32", "143559"}, - {"2602:fc26:12::/48", "211562"}, - {"2602:fed2:7316::/47", "53356"}, - {"2604:2d80:c00::/38", "30036"}, - {"2620:171:e0::/43", "42"}, - {"2804:b1c::/32", "53008"}, - {"2804:44cc::/32", "267654"}, - {"2a01:664:1400::/36", "48951"}, - {"2a02:26f0:6201::/40", "20940"}, - {"2001:559:82e1::/48", "33651"}, - {"2605:3380:4189::/41", "12025"}, - {"2607:9b80::/40", "46558"}, - {"2001:559:1a4::/48", "33652"}, - {"2001:559:1dc::/47", "33659"}, - {"2402:800:5cc5::/43", "7552"}, - {"2600:1006:f140::/44", "6167"}, - {"2a0c:9a40:2a00::/40", "34927"}, - {"2a0e:e900::/29", "209994"}, - {"2001:1520:4::/46", "8972"}, - {"2804:35e0:2000::/36", "266312"}, - {"2001:44c8:4680::/44", "131445"}, - {"2001:4d50:fa00::/37", "34309"}, - {"2401:b680::/32", "59029"}, - {"2401:d800:9312::/41", "7552"}, - {"2803:d400::/32", "52384"}, - {"2804:7b88::/32", "271437"}, - {"2a02:2188:1000::/36", "48469"}, - {"2600:140f:9001::/37", "20940"}, - {"2600:6c3b:491::/45", "20115"}, - {"2604:af80:1048::/37", "18859"}, - {"2610:128::/35", "11686"}, - {"2803:9800:b505::/46", "11664"}, - {"2804:14d:3200::/40", "28573"}, - {"2804:1644:240::/39", "262903"}, - {"2a00:1af4:1001::/30", "35699"}, - {"2a00:79e0:500::/47", "395973"}, - {"2a01:40:4949::/48", "204979"}, - {"2a03:6a00::/29", "6908"}, - {"2a09:5640:1::/48", "9186"}, - {"2a0c:b641:5b3::/45", "213015"}, - {"2407:9440:72::/32", "141626"}, - {"2408:8459:de10::/42", "17623"}, - {"240e:108:46::/48", "134756"}, - {"2a01:54e0:6800::/38", "62287"}, - {"2a02:6900:8814::/48", "7160"}, - {"2a09:a200::/29", "51711"}, - {"2a0c:a080::/29", "43646"}, - {"2400:f940:13::/32", "45766"}, - {"2408:891c::/32", "4837"}, - {"2409:8028:1100::/37", "9808"}, - {"2a01:bf00::/32", "9044"}, - {"2a04:4e41:40::/44", "54113"}, - {"2a0a:2f40::/32", "5385"}, - {"2001:559:380::/48", "33659"}, - {"2401:d800:5620::/41", "7552"}, - {"2408:8459:be30::/41", "17622"}, - {"2604:880:6::/48", "29802"}, - {"2800:440:1400::/42", "27738"}, - {"2800:4b0:403f::/40", "12252"}, - {"2a03:4d47:800::/48", "199610"}, - {"2400:ec40::/32", "10214"}, - {"240a:ae54::/32", "146318"}, - {"2620:11d:2000::/40", "63154"}, - {"2804:6b64::/32", "270397"}, - {"2a04:2000::/29", "198184"}, - {"2001:559:474::/48", "33491"}, - {"2001:fd8:b240::/42", "132199"}, - {"2401:1fc0::/32", "141671"}, - {"2408:8456:8000::/42", "17622"}, - {"240a:a0a6::/32", "142816"}, - {"2605:5e00::/32", "40317"}, - {"2620:154:a10::/48", "16733"}, - {"2804:33dc::/32", "265421"}, - {"2804:3cdc::/32", "266239"}, - {"2a02:1388:3000::/33", "29247"}, - {"2a02:68e0::/32", "201896"}, - {"2403:fa00::/32", "9474"}, - {"2600:1015:b0c2::/39", "6167"}, - {"2602:fd26::/48", "14639"}, - {"2800:440:9800::/42", "27738"}, - {"2001:559:8563::/48", "33659"}, - {"2001:4b99:1::/48", "203476"}, - {"240a:ac9a::/32", "145876"}, - {"2a01:9560::/32", "62094"}, - {"2a04:e800:5020::/48", "57976"}, - {"2001:559:19c::/48", "33652"}, - {"2001:1a11:129::/48", "8781"}, - {"2407:4800:8000::/34", "45193"}, - {"240a:aceb::/32", "145957"}, - {"240e:44d:2f80::/41", "4134"}, - {"2a02:ee80:41a1::/43", "3573"}, - {"2001:1541:4110::/42", "16243"}, - {"2404:e4:119::/31", "703"}, - {"2620:125:9009::/48", "397415"}, - {"2a00:c8a0::/29", "48057"}, - {"240e:438:8a40::/37", "4134"}, - {"2600:100a:b100::/42", "6167"}, - {"2620:107:300f::/48", "16509"}, - {"2804:1b3:4001::/46", "18881"}, - {"2a02:26f7:df4d::/42", "20940"}, - {"2001:67c:28fc::/48", "48635"}, - {"2409:801a:3007::/29", "132525"}, - {"240a:a297::/32", "143313"}, - {"2607:f8b8::/32", "3043"}, - {"2800:a0::/29", "6057"}, - {"2a01:7e0:1fd::/32", "44066"}, - {"2a0c:ab07:c000::/36", "208861"}, - {"2001:4d20:8000::/33", "39290"}, - {"2600:1411:6000:1::/32", "20940"}, - {"2606:e600:ffff::/48", "11608"}, - {"2001:44b8:405a::/48", "7545"}, - {"240e:1c:b000::/36", "136190"}, - {"2600:9000:210d::/43", "16509"}, - {"2605:9880:400::/42", "23470"}, - {"2804:8210::/32", "272496"}, - {"2001:67c:2370::/48", "24681"}, - {"2400:8100::/32", "45671"}, - {"240e:3ba:7600::/39", "140313"}, - {"2604:b900:7000::/32", "11042"}, - {"2a01:c50e:cf00::/35", "12479"}, - {"2a03:2880:f05f::/42", "32934"}, - {"2804:1344::/32", "263525"}, - {"2806:20d:3218::/42", "32098"}, - {"2a03:9300::/32", "29649"}, - {"2001:930:131::/41", "15924"}, - {"2001:df5:5e80::/48", "141413"}, - {"2600:1f01:4800::/45", "16509"}, - {"2804:7d7c::/39", "271564"}, - {"2804:85bc:4000::/36", "272597"}, - {"2a0e:97c3:764::/48", "20473"}, - {"2a11:2380::/29", "60935"}, - {"2602:fcce:bae::/37", "399200"}, - {"2a0f:9400:7385::/48", "210537"}, - {"2001:559:83bc::/48", "33491"}, - {"2401:d800:7870::/40", "7552"}, - {"2803:d8a0::/32", "266812"}, - {"2804:77e0::/32", "271205"}, - {"2407:a600:a000::/36", "18004"}, - {"2620:10a:8001::/46", "27299"}, - {"2804:ddc::/32", "262387"}, - {"2804:4cec::/32", "267401"}, - {"2a00:4800:3f0::/30", "8717"}, - {"2c0f:eb50:1::/46", "328580"}, - {"2001:1998:8d0::/44", "13343"}, - {"2803:4580:8210::/44", "52468"}, - {"2a02:2050::/32", "47264"}, - {"240a:a3b7::/32", "143601"}, - {"2607:f790:fff0::/48", "62588"}, - {"2804:3918::/32", "266524"}, - {"2a03:2880:ff0d::/31", "32934"}, - {"2a04:4740:6293::/48", "25468"}, - {"2a05:de00::/29", "30835"}, - {"2405:6e00:450::/42", "18291"}, - {"2409:8914:7000::/36", "56044"}, - {"240a:a04f::/32", "142729"}, - {"240a:acc3::/32", "145917"}, - {"2600:6c38:8d2::/42", "20115"}, - {"2607:3c80::/32", "54039"}, - {"2803:af60::/32", "264637"}, - {"2001:1248:8409::/43", "11172"}, - {"2605:840::/32", "26209"}, - {"2a01:7f20::/48", "43385"}, - {"2a02:26f7:e888::/48", "36183"}, - {"2a06:b1c0::/29", "203765"}, - {"2001:4248:11::/41", "30999"}, - {"2402:e8c0::/32", "137847"}, - {"2804:2090::/32", "264498"}, - {"2a02:26f7:d48d::/42", "20940"}, - {"2a04:f840::/40", "9150"}, - {"2a07:3340::/48", "5539"}, - {"2a0f:e000::/29", "208317"}, - {"2404:bf40:a480::/48", "7545"}, - {"2409:8057:3800::/48", "9808"}, - {"2600:6c10:ffec::/43", "20115"}, - {"2603:f3f0::/29", "397165"}, - {"2404:4a00:7500:1::/36", "45629"}, - {"2620:0:5000::/48", "23431"}, - {"2a0f:5701:3200::/40", "34681"}, - {"240e:964:2b00::/40", "133775"}, - {"2602:803:4070::/48", "398223"}, - {"2606:f40:1::/48", "16509"}, - {"2401:1700:7c10::/42", "55666"}, - {"2a04:840::/43", "33182"}, - {"2a0e:b107:1110::/44", "42394"}, - {"2409:8914:b600::/39", "56044"}, - {"2600:1413:a001::/35", "20940"}, - {"2620:149:a06::/48", "6185"}, - {"2804:1458::/32", "263326"}, - {"2a02:ee80:416a::/43", "3573"}, - {"2607:f428:9410::/44", "20001"}, - {"2803:40e0::/32", "269846"}, - {"2a05:87c0::/29", "198440"}, - {"2a0b:b400::/29", "207141"}, - {"2001:250:3415::/46", "138438"}, - {"2001:df6:580::/48", "131984"}, - {"2001:df7:d000::/47", "133155"}, - {"2620:0:3b0::/48", "20452"}, - {"2806:3be::/32", "270119"}, - {"2a02:e980::/42", "19551"}, - {"2a10:5e40::/29", "8875"}, - {"2001:559:8690::/48", "7922"}, - {"2001:6d0:6d06::/48", "8985"}, - {"2402:800:9ad3::/42", "7552"}, - {"2408:8409:b400::/40", "4808"}, - {"2604:d600:15e3::/44", "32098"}, - {"2607:f000::/32", "26978"}, - {"2804:267c::/32", "264345"}, - {"2001:57a:8001::/43", "22773"}, - {"2001:4430:4f08::/35", "17853"}, - {"2408:8459:650::/36", "17816"}, - {"2607:7b80::/32", "32798"}, - {"2803:c4e0::/35", "269809"}, - {"2001:1398:16::/48", "27678"}, - {"2001:43f8:391::/48", "327775"}, - {"2408:8762::/29", "4837"}, - {"2408:8956:c300::/40", "17816"}, - {"2804:4c04::/32", "267343"}, - {"2804:8460::/32", "272257"}, - {"2a02:26f7:bb80::/48", "36183"}, - {"2600:1000:b1f0::/36", "22394"}, - {"2804:4ee4::/32", "268289"}, - {"2001:559:83ab::/48", "33650"}, - {"2600:1001:9100::/44", "6167"}, - {"2804:dd4:8100::/33", "53024"}, - {"2a01:c9c0:8030::/48", "2285"}, - {"2a07:3f80::/29", "203103"}, - {"2804:b84::/32", "52788"}, - {"2804:7c84::/33", "271501"}, - {"2806:2f0:9f81::/46", "17072"}, - {"2001:559:8276::/48", "7922"}, - {"2400:4e80:79fd::/46", "131584"}, - {"2600:370f:754a::/42", "32261"}, - {"2a06:e500::/29", "199733"}, - {"2400:f340:9::/48", "131746"}, - {"2408:8256:3661::/43", "17623"}, - {"240a:a626::/32", "144224"}, - {"240e:698:2000::/40", "4134"}, - {"2a02:b98::/32", "12897"}, - {"2c0f:eed0::/32", "328316"}, - {"240c:ca43::/32", "24363"}, - {"2610:a1:1079::/48", "397228"}, - {"2620:107:907d::/48", "22787"}, - {"2804:ee4::/32", "263557"}, - {"2804:7fa4::/32", "271700"}, - {"2a02:26f0:8b::/45", "20940"}, - {"2a04:7440::/30", "196714"}, - {"2001:df2:c000::/48", "132644"}, - {"2400:adc0:4100::/46", "9541"}, - {"2607:b80:4::/32", "30247"}, - {"2804:cb0:a001::/37", "52742"}, - {"2804:7540::/35", "271034"}, - {"2a01:358::/35", "9121"}, - {"2001:250:5817::/44", "24363"}, - {"2001:49f0:d0fa::/48", "30058"}, - {"2600:5c01:319d::/41", "10796"}, - {"2001:978:4a01::/37", "174"}, - {"2400:1f00:12::/47", "45769"}, - {"2a0a:4e00::/29", "57755"}, - {"240d:c010:88::/48", "139341"}, - {"2600:140f:3e01::/33", "20940"}, - {"2604:0:c1::/48", "40484"}, - {"2607:f180:3200::/33", "35908"}, - {"2a03:4200::/32", "5413"}, - {"2001:678:9fc::/48", "15550"}, - {"2401:7000:7003::/32", "45177"}, - {"2405:9800:9c00::/40", "38443"}, - {"2620:52:10::/48", "399140"}, - {"2804:3660::/32", "266344"}, - {"2806:2f0:3181::/46", "17072"}, - {"2a02:26f7:e84d::/46", "20940"}, - {"2a03:6660::/32", "43287"}, - {"2001:1a11:139::/46", "8781"}, - {"240e:108:1071::/44", "4134"}, - {"2600:1417:38::/48", "24319"}, - {"2607:9800::/32", "15085"}, - {"2607:f110:41::/46", "21889"}, - {"2a04:4e40:7800::/47", "54113"}, - {"2001:559:c062::/45", "7922"}, - {"2600:1406:1a00::/48", "35994"}, - {"2801:10:c800::/48", "14080"}, - {"2803:a0a0:903::/48", "269799"}, - {"2001:43f8:10a0::/48", "328268"}, - {"2801:1a:1800::/48", "19429"}, - {"2a03:dc80::/32", "42697"}, - {"2a0a:ab00::/29", "25057"}, - {"2402:800:bfc0::/42", "7552"}, - {"240a:a8cc::/32", "144902"}, - {"2606:b600:100::/48", "26527"}, - {"2804:1b3:4000::/48", "10429"}, - {"2804:4dc::/32", "262474"}, - {"2a02:2188::/48", "48469"}, - {"2a04:9300::/32", "62239"}, - {"2001:ec0:8a5::/48", "147027"}, - {"2409:8b75::/28", "9808"}, - {"2600:1417:34::/46", "20940"}, - {"2602:ffc1::/32", "36731"}, - {"2a01:c50f:3180::/42", "5511"}, - {"2a0a:d6c0:eff1::/46", "61423"}, - {"2001:7f8:80::/48", "8695"}, - {"2408:8459:c810::/42", "17623"}, - {"2409:896a:5000::/39", "9808"}, - {"2600:1012:9020::/40", "22394"}, - {"2606:b940::/32", "61138"}, - {"2800:1d0::/32", "14187"}, - {"2a04:5d80::/29", "61310"}, - {"2001:1a90::/32", "8851"}, - {"2a05:5b80::/29", "38999"}, - {"2001:678:330::/48", "3301"}, - {"2606:3840::/32", "31915"}, - {"2803:95e0::/32", "270036"}, - {"2a02:26f7:ba01::/46", "20940"}, - {"2001:559:8230::/48", "13367"}, - {"2404:e80::/32", "134697"}, - {"2406:3000:51::/35", "4657"}, - {"2409:8a54::/32", "56040"}, - {"2806:2f0:3321::/46", "17072"}, - {"2001:470:f8::/48", "64238"}, - {"2001:44b8:406d::/48", "4739"}, - {"240a:a454::/32", "143758"}, - {"240a:a4e6::/32", "143904"}, - {"2800:bf0:3b80::/48", "52257"}, - {"2001:559:c29f::/42", "33657"}, - {"2001:648:2422::/40", "5408"}, - {"2001:44b8:309d::/46", "7545"}, - {"2404:8000:1009::/46", "17451"}, - {"2404:e600::/48", "132804"}, - {"240a:a169::/32", "143011"}, - {"2604:af80:900::/37", "18859"}, - {"2001:559:4c0::/48", "33491"}, - {"2001:559:84d3::/48", "7016"}, - {"2001:4830:c000::/40", "27552"}, - {"2604:d3c0::/32", "14534"}, - {"2804:34e0:fc00::/38", "265486"}, - {"2804:3c04::/47", "266185"}, - {"2a02:26f7:bb81::/46", "20940"}, - {"2a03:5c60::/32", "201157"}, - {"2001:559:8496::/48", "33667"}, - {"240a:a49f::/32", "143833"}, - {"2600:6c4c::/32", "20115"}, - {"2804:a00:2::/45", "262838"}, - {"2a02:26f7:b9c9::/46", "20940"}, - {"2a0f:f340::/32", "208164"}, - {"2001:1a40:202::/32", "5416"}, - {"2001:4450:40::/48", "20940"}, - {"2409:803c::/40", "24444"}, - {"2001:ac8:63::/44", "9009"}, - {"2800:23:3:16::/32", "11271"}, - {"2804:2e28::/32", "265328"}, - {"2806:230:3011::/48", "11888"}, - {"2a02:26f7:dc45::/46", "20940"}, - {"2a02:2af8:403::/45", "702"}, - {"2a0f:8647:b00c::/33", "25682"}, - {"2001:18c8::/39", "8015"}, - {"2402:3a80:1080::/41", "38266"}, - {"2600:1003:f000::/44", "6167"}, - {"2620:17b:5::/48", "209"}, - {"2800:160:19d2::/44", "14259"}, - {"2804:28fc::/32", "263991"}, - {"2a00:1520::/32", "51815"}, - {"2001:559:80ad::/48", "7922"}, - {"2409:802f:2a06::/39", "56041"}, - {"240a:a40e::/32", "143688"}, - {"240a:aade::/32", "145432"}, - {"2600:380:7780::/36", "20057"}, - {"2a01:b740:a08::/48", "6185"}, - {"2a10:9800::/29", "212708"}, - {"2001:559:4d3::/48", "33657"}, - {"2001:559:821d::/48", "20214"}, - {"2001:c20:48c5::/48", "3758"}, - {"2400:dd01:3005::/43", "7497"}, - {"2602:fbf5:1::/46", "212149"}, - {"2804:3fec::/32", "265922"}, - {"2804:8248::/32", "272510"}, - {"2806:20d:100d::/39", "32098"}, - {"2001:559:215::/48", "33659"}, - {"2606:ae00:7120::/32", "7287"}, - {"2607:5700::/32", "20093"}, - {"2804:5380::/32", "268588"}, - {"2a0b:a740::/32", "25276"}, - {"2404:1a0:2012::/30", "24334"}, - {"2404:3980::/32", "134967"}, - {"2404:f4c0:1108::/48", "32167"}, - {"2800:68:1aa6::/32", "61468"}, - {"2801:1fc:2a::/48", "27951"}, - {"2804:4f34::/32", "268311"}, - {"2600:1406:7401::/36", "20940"}, - {"2605:7f40::/32", "396357"}, - {"2801:a4::/32", "262742"}, - {"2804:5258::/32", "268512"}, - {"2a00:9d20:102::/48", "395954"}, - {"2a03:2880:f21d::/46", "32934"}, - {"2001:253:102::/48", "142068"}, - {"2001:480:421::/48", "518"}, - {"2001:67c:c4::/48", "210138"}, - {"2400:cc00:8d00::/33", "17477"}, - {"240a:af99::/32", "146643"}, - {"240e:438:640::/36", "4134"}, - {"2409:8752:d00::/38", "56047"}, - {"240a:a9fe::/32", "145208"}, - {"240a:ac4d::/32", "145799"}, - {"2803:9800:a4c3::/39", "11664"}, - {"2804:5510::/32", "268687"}, - {"2804:80a0::/32", "271763"}, - {"2001:e60:1000::/44", "4766"}, - {"240a:a312::/32", "143436"}, - {"240e:b18::/25", "4134"}, - {"2602:fcf5::/36", "14058"}, - {"2620:bd:4000::/48", "398713"}, - {"2001:578:13::/45", "22773"}, - {"2001:67c:7a4::/48", "199121"}, - {"2401:d800:b10::/42", "7552"}, - {"2600:141b:d::/43", "20940"}, - {"2803:daa0::/32", "266875"}, - {"2804:4390:2020::/32", "28194"}, - {"2804:5cc0::/32", "268928"}, - {"2a0b:2540::/32", "57848"}, - {"2a0e:2900::/30", "209929"}, - {"2804:40d4::/32", "265984"}, - {"2a02:26f7:a::/48", "36183"}, - {"2a05:dfc7:31::/41", "61138"}, - {"2001:559:8151::/48", "7016"}, - {"2409:8a45:400::/28", "24445"}, - {"240a:a10d::/32", "142919"}, - {"2804:1264::/32", "263474"}, - {"2804:161c:800::/45", "263268"}, - {"2804:2df8:eecf::/35", "265315"}, - {"2620:10a:8022::/48", "394354"}, - {"2a01:14f::/32", "47443"}, - {"2a02:8d0::/32", "49413"}, - {"2a03:d000:7301::/46", "31133"}, - {"240a:a96c::/32", "145062"}, - {"2600:1406:f000::/48", "35994"}, - {"2605:b980::/32", "23376"}, - {"2402:5300:2040::/39", "45903"}, - {"2402:e7c0:1000::/32", "59078"}, - {"2602:809:3004::/48", "34553"}, - {"2602:80c:2000::/43", "399976"}, - {"2604:d500::/32", "54098"}, - {"2a03:68c0::/34", "61327"}, - {"2a10:3d00::/29", "212457"}, - {"2001:559:c227::/48", "7922"}, - {"2401:c900:1800::/40", "36351"}, - {"2610:170::/32", "11260"}, - {"2804:4164:a000::/33", "267430"}, - {"2804:7980::/32", "271309"}, - {"2a00:1288:ef6b::/40", "10310"}, - {"2a01:8ae0::/32", "51105"}, - {"2a02:a000::/26", "5432"}, - {"2a03:1840::/46", "51248"}, - {"2401:1801:821::/35", "58683"}, - {"2402:800:94ee::/43", "7552"}, - {"2a03:c300::/32", "20514"}, - {"2001:67c:194::/48", "39138"}, - {"2001:1b70:81::/48", "16086"}, - {"2401:d800:d9f0::/38", "7552"}, - {"2402:c000:2::/34", "9230"}, - {"2001:559:171::/48", "33657"}, - {"2001:6d0:ffd5::/46", "42385"}, - {"2402:3a80:1500::/38", "38266"}, - {"2402:ab00:b0::/41", "24206"}, - {"2408:84f3:2e90::/35", "17816"}, - {"2801:17e::/47", "262589"}, - {"2804:7d74::/32", "271562"}, - {"2001:559:831b::/48", "33660"}, - {"2402:9800:4004::/48", "46025"}, - {"240a:af7a::/32", "146612"}, - {"2a01:8840:a6::/44", "12041"}, - {"2401:ff00:a000::/36", "64073"}, - {"240a:ac19::/32", "145747"}, - {"2600:1409:f000::/48", "35994"}, - {"2604:86c0:f100::/38", "63023"}, - {"2804:19a0:2000::/48", "61808"}, - {"2a0b:2400::/32", "16097"}, - {"2001:ec0:400c::/48", "147027"}, - {"240a:a133::/32", "142957"}, - {"2600:5c01:3045::/39", "10796"}, - {"2804:14d:c000::/40", "28573"}, - {"2a02:26f7:fb45::/46", "20940"}, - {"2a11:7640::/29", "49655"}, - {"2001:579:a08c::/43", "22773"}, - {"2001:1248:98ad::/43", "11172"}, - {"240e:45c:5300::/40", "140529"}, - {"2600:6c20:e2a::/41", "20115"}, - {"2804:262c::/32", "264326"}, - {"2a01:358:3b12::/33", "9121"}, - {"2402:800:369b::/41", "7552"}, - {"2402:800:587f::/40", "7552"}, - {"2406:8800:60::/32", "17465"}, - {"2409:8020:1061::/43", "56046"}, - {"2c0f:f850:dc06::/34", "327979"}, - {"240a:a651::/32", "144267"}, - {"240a:a8a4::/32", "144862"}, - {"2a02:23e9::/32", "49509"}, - {"2a03:77e0:4401::/48", "48305"}, - {"2a11:9280::/29", "204790"}, - {"2602:fcff:18::/47", "38041"}, - {"2804:13ac::/32", "263545"}, - {"2804:17bc::/32", "52739"}, - {"2001:43f0::/32", "37183"}, - {"2409:8057:3019::/48", "56040"}, - {"2806:1010:d000::/34", "8151"}, - {"2a04:f580:9020::/48", "4809"}, - {"2a12:3a00::/29", "204790"}, - {"2001:559:8013::/48", "7016"}, - {"2408:8459:6430::/41", "17622"}, - {"2600:8807:1f42::/42", "22773"}, - {"2803:ae10::/32", "271969"}, - {"2804:e68::/32", "262953"}, - {"2a0a:2ec0::/29", "201050"}, - {"2a10:ad40::/29", "211656"}, - {"240e:44d:7800::/42", "140345"}, - {"2606:2800:e::/47", "15133"}, - {"2801:0:480::/48", "27817"}, - {"2803:8180::/47", "263237"}, - {"2804:1b7c::/32", "61731"}, - {"2a0c:1d00:15::/32", "39614"}, - {"2001:559:8153::/48", "33287"}, - {"2001:4220:8013::/45", "24835"}, - {"2602:fd37::/46", "398493"}, - {"2607:f148:103::/48", "11734"}, - {"2804:680:1000::/32", "262589"}, - {"2804:3d1c::/32", "266254"}, - {"2a0f:4800::/29", "50064"}, - {"2402:800:94a9::/43", "7552"}, - {"2600:1408:1000::/48", "35994"}, - {"2a00:11c0:d::/42", "42473"}, - {"2001:57a:50f::/48", "33438"}, - {"2001:978:4701::/36", "174"}, - {"2001:fd8:31f0::/38", "4775"}, - {"2001:1900:2019::/45", "3356"}, - {"2a0f:c500::/29", "201299"}, - {"2a11:5380::/29", "56485"}, - {"2001:a17::/32", "204679"}, - {"2408:840d:d00::/42", "17621"}, - {"2804:80e4::/32", "272419"}, - {"2a02:2680::/32", "51675"}, - {"2607:7000:a100::/33", "25905"}, - {"2803:9800:94c3::/39", "11664"}, - {"2001:fd8:371::/40", "4775"}, - {"2408:845c::/31", "4837"}, - {"2806:230:3003::/48", "11888"}, - {"2400:c500:100::/38", "17434"}, - {"240a:afde::/32", "146712"}, - {"2804:5bdc::/46", "268873"}, - {"2a0f:9700::/29", "208386"}, - {"2401:bd00:b001::/46", "38636"}, - {"2404:a1c0::/32", "55699"}, - {"2602:feb4:290::/44", "25961"}, - {"2804:20a4::/32", "264503"}, - {"2a01:7080:15::/46", "42848"}, - {"2a02:e180::/46", "15135"}, - {"2a09:59c0::/29", "63023"}, - {"2a00:fea0::/32", "60592"}, - {"2a0a:1ec0::/31", "205790"}, - {"2a0d:3842:1290::/48", "57629"}, - {"2605:a40e:2::/45", "33363"}, - {"2608:121::/48", "5376"}, - {"2a02:26f7:e600::/48", "36183"}, - {"2a0a:5680::/29", "35048"}, - {"2a11:d6c0::/29", "49189"}, - {"2a00:d280::/48", "43919"}, - {"2001:559:c420::/47", "7016"}, - {"2401:4100::/32", "9387"}, - {"2409:8078:1900::/34", "9808"}, - {"2604:7500::/32", "6368"}, - {"2605:5b40::/32", "36363"}, - {"2804:14d:8a00::/40", "28573"}, - {"2804:5234::/32", "268502"}, - {"2806:2f0:3060::/40", "17072"}, - {"2001:5a0:3b06::/37", "6453"}, - {"2402:c480:8000::/47", "63916"}, - {"2620:149:a09::/46", "6185"}, - {"2a01:548::/32", "9113"}, - {"2a02:c08::/32", "21050"}, - {"2c0f:ef68::/46", "37662"}, - {"2001:cf8::/45", "9619"}, - {"2600:1417:c801::/37", "20940"}, - {"2604:b2c0:d00::/40", "7018"}, - {"2803:2540:ae::/32", "264668"}, - {"2a01:6640::/29", "204790"}, - {"2a02:26f7:c8d5::/46", "20940"}, - {"2a0d:95c0::/29", "42375"}, - {"2404:4a00:5542:4::/54", "55423"}, - {"240a:a89d::/32", "144855"}, - {"2600:1417:1b::/45", "20940"}, - {"2607:f110:9::/43", "21889"}, - {"2607:f578::/32", "14263"}, - {"2804:16c0::/32", "61914"}, - {"2a10:9100:8::/48", "49453"}, - {"2409:8c15:9800::/30", "56044"}, - {"2607:9280:1::/48", "395502"}, - {"2804:4da0::/32", "268209"}, - {"240a:abc9::/32", "145667"}, - {"2604:2f80::/32", "26523"}, - {"2a00:1100::/29", "51483"}, - {"2a00:17cf::/32", "12511"}, - {"2a04:cb40::/29", "41552"}, - {"2a05:bec0::/42", "197071"}, - {"2001:559:84f3::/45", "33659"}, - {"2001:b28:a70d:1::/33", "42065"}, - {"2001:1900:201f::/39", "3356"}, - {"2400:cb00:500::/48", "13335"}, - {"2402:800:74c2::/39", "7552"}, - {"2403:8940:5::/44", "135817"}, - {"2a02:2650::/32", "41302"}, - {"2a0e:b107:230::/48", "209419"}, - {"2803:d100:e700::/41", "52362"}, - {"2804:3de4::/32", "266560"}, - {"2a09:3a00:2000::/48", "200299"}, - {"240e:3b1:6400::/35", "140312"}, - {"2606:2800:2aa::/45", "14153"}, - {"2804:5ba8:4000::/32", "268861"}, - {"2a01:5b0:3::/48", "8391"}, - {"2001:579:f034::/44", "22773"}, - {"2804:94::/32", "53081"}, - {"2804:5318::/32", "268563"}, - {"2001:579:5084::/41", "22773"}, - {"2001:da8:b000::/44", "24371"}, - {"2401:4900:3af0::/48", "45609"}, - {"240e:979:9600::/30", "4134"}, - {"2801:80:140c::/48", "11097"}, - {"2804:2598::/32", "264290"}, - {"2a04:e640::/29", "34241"}, - {"2402:800:7580::/42", "7552"}, - {"2409:8087:1e00::/39", "24400"}, - {"2a02:26f7:c9c4::/48", "36183"}, - {"2a04:f580:9080::/48", "4809"}, - {"2001:559:3::/48", "7922"}, - {"2404:f4c0:1000::/40", "17920"}, - {"2804:57e0::/32", "268092"}, - {"2001:250:401::/44", "24352"}, - {"2001:559:84fc::/47", "33651"}, - {"2600:100d:f100::/44", "6167"}, - {"2602:107:2210::/48", "20115"}, - {"2804:3774:2300::/37", "266416"}, - {"2a00:ec0::/32", "20634"}, - {"2001:4350:3001::/48", "5438"}, - {"2620:a4:2050::/48", "394592"}, - {"2a0d:5600:1::/44", "9009"}, - {"2001:678:560::/48", "49225"}, - {"2401:803e:4025::/31", "9919"}, - {"2404:1640::/32", "138494"}, - {"240a:a685::/32", "144319"}, - {"2804:784::/32", "262653"}, - {"2a02:1c8:5::/48", "47775"}, - {"2a0b:4340:30::/44", "41979"}, - {"2a10:b5c0::/29", "211668"}, - {"2001:57a:c204::/42", "22773"}, - {"240e:3ba:6400::/35", "140312"}, - {"2001:4e0::/35", "2381"}, - {"2001:579:d244::/42", "22773"}, - {"2001:4868:209::/42", "701"}, - {"2405:d6c0::/32", "132369"}, - {"240a:a28e::/32", "143304"}, - {"240a:a865::/32", "144799"}, - {"240e:980:9b00::/40", "134761"}, - {"2607:fdf0:5e98::/45", "8008"}, - {"2804:ff0::/32", "263609"}, - {"2402:c480:6000::/46", "63916"}, - {"2a02:88d:8200::/44", "48695"}, - {"2a07:4680::/32", "200697"}, - {"2001:559:8722::/47", "33657"}, - {"2001:559:c3ce::/48", "20214"}, - {"2001:67c:424::/48", "8220"}, - {"240e:f7:1000::/36", "4134"}, - {"2602:ffe2:100::/48", "53334"}, - {"2620:13a:b003::/48", "54344"}, - {"2804:3004::/32", "264926"}, - {"2a01:3e0:d02::/32", "6453"}, - {"2a02:26f0:11b::/48", "34164"}, - {"2a02:26f7:e440::/48", "36183"}, - {"2a02:26f7:f8cd::/46", "20940"}, - {"2600:100f:f010::/40", "22394"}, - {"2a02:2518::/43", "28917"}, - {"2a02:ac40::/29", "25459"}, - {"2a0a:d6c0:efef::/48", "61423"}, - {"2620:108:9001::/48", "12159"}, - {"2a01:8840:e9::/48", "207266"}, - {"2a0d:b201:e030::/41", "206026"}, - {"2001:559:32b::/45", "7922"}, - {"2402:5300:610::/39", "45903"}, - {"240e:45c:8300::/40", "140533"}, - {"2607:fb10:7142::/47", "2906"}, - {"2a02:26f7:cc40::/48", "36183"}, - {"2a02:e982:31::/48", "62571"}, - {"2001:559:759::/48", "7015"}, - {"2001:678:3dc::/48", "39508"}, - {"2408:8956:8f00::/40", "17816"}, - {"2409:8735::/28", "9808"}, - {"2600:8800::/30", "22773"}, - {"2606:6c00:4000::/48", "32787"}, - {"2620:0:840::/48", "13998"}, - {"2a0f:3c40::/29", "3175"}, - {"2001:7be:1::/31", "12859"}, - {"2409:8070:1900::/34", "9808"}, - {"2804:4b04::/32", "267278"}, - {"2a04:b240::/29", "8680"}, - {"240a:a724::/32", "144478"}, - {"2804:2050:1abd::/34", "264485"}, - {"2804:5da8::/32", "268985"}, - {"2806:2f0:7181::/46", "17072"}, - {"2001:579:b05::/37", "22773"}, - {"2001:67c:17dc::/48", "1257"}, - {"2001:df4:a900::/48", "137327"}, - {"2408:8256:337a::/45", "17623"}, - {"240e:3b7:d000::/36", "134772"}, - {"2605:9780:30::/48", "393544"}, - {"2804:3568::/32", "266284"}, - {"2804:4924:10::/32", "267167"}, - {"2001:678:ba4::/48", "207824"}, - {"240c:ca44::/30", "23910"}, - {"2620:107:6000:1146::/53", "6462"}, - {"2800:bf0:800f::/43", "52257"}, - {"2a10:dd40::/29", "34907"}, - {"2001:579:701c::/42", "22773"}, - {"2407:61c0::/32", "131986"}, - {"2408:8957:cd40::/40", "17816"}, - {"240a:a74b::/32", "144517"}, - {"240a:a816::/32", "144720"}, - {"240c:ca18::/31", "24363"}, - {"2603:c001:3e20::/33", "31898"}, - {"2804:7d94::/32", "271570"}, - {"2806:230:1034::/48", "265594"}, - {"2a03:53c0::/32", "197495"}, - {"2a0c:b641:160::/48", "211139"}, - {"2001:df6:1680::/48", "140786"}, - {"2406:19c0::/32", "140659"}, - {"240e:44d:6a80::/41", "4134"}, - {"2806:2f0:8121::/46", "17072"}, - {"2a0d:5c00::/32", "21396"}, - {"2610:d0::/32", "3943"}, - {"2804:4e10::/32", "268237"}, - {"2a03:2960:200::/32", "201590"}, - {"2001:67c:2458::/48", "2119"}, - {"2001:ed8::/32", "18422"}, - {"2001:43f8:6e0::/48", "37354"}, - {"2001:4488:fb62::/37", "7713"}, - {"2a02:f700::/29", "12812"}, - {"2620:34:a000::/48", "62947"}, - {"2620:106:6008::/48", "377"}, - {"2800:98:1710::/36", "14754"}, - {"2800:9a0:2100::/35", "14522"}, - {"2804:11c::/32", "28357"}, - {"2804:f7c::/32", "262715"}, - {"2407:ff00::/32", "45884"}, - {"2408:8256:376b::/48", "17816"}, - {"2800:bf0:802a::/48", "27947"}, - {"2804:60fc::/32", "269204"}, - {"2a01:48c0::/32", "34960"}, - {"2a09:bac0:160::/48", "13335"}, - {"2001:1520:7::/44", "8972"}, - {"2400:7400:e020::/48", "38044"}, - {"2600:1003:b8e0::/33", "22394"}, - {"2600:1010:fe00::/44", "6167"}, - {"2800:110:2800::/48", "27875"}, - {"2800:484:ef00::/35", "14080"}, - {"2804:27c0::/32", "263920"}, - {"2804:5494::/32", "268659"}, - {"2001:67c:1250::/48", "49697"}, - {"2405:2300:ff09::/41", "13443"}, - {"2408:825c::/31", "4837"}, - {"2800:160:1cff::/39", "14259"}, - {"240a:aab5::/32", "145391"}, - {"2605:3380:4145::/46", "12025"}, - {"2606:a600:9::/33", "23005"}, - {"2001:c20:c818::/42", "3758"}, - {"2401:8140::/32", "133736"}, - {"2403:bc00:1::/48", "45668"}, - {"2001:559:24b::/45", "33491"}, - {"240a:a186::/32", "143040"}, - {"2600:3505:8000::/33", "396998"}, - {"2607:2f00::/43", "12025"}, - {"2607:f598:f002::/36", "32329"}, - {"2a07:4ec0::/29", "5606"}, - {"2404:f100:e000::/38", "17483"}, - {"2606:4240::/32", "399513"}, - {"2620:40:a000::/48", "54495"}, - {"2804:548::/39", "53005"}, - {"2a04:4e42:3d::/41", "54113"}, - {"2001:fd8:3f1::/44", "4775"}, - {"2607:ed80::/32", "395785"}, - {"2a01:4e0::/29", "24651"}, - {"2402:800:322b::/41", "7552"}, - {"240a:a3a7::/32", "143585"}, - {"2400:9380:9ec0::/44", "136167"}, - {"2001:67c:10dc::/48", "199215"}, - {"2001:4478:1310:2000::/47", "4802"}, - {"2402:800:981d::/41", "7552"}, - {"2404:4340::/47", "133275"}, - {"2606:6680:30::/48", "12129"}, - {"2001:12f0:b3f::/48", "1916"}, - {"2403:6ec0::/32", "131247"}, - {"2a03:f80:389::/48", "25467"}, - {"2a0e:aa00:120::/45", "41378"}, - {"2001:500:d0::/47", "12041"}, - {"2401:24c0::/32", "37897"}, - {"2620:1ec:12::/47", "8068"}, - {"2001:559:850f::/48", "7922"}, - {"2402:f080:a::/45", "38150"}, - {"2800:960::/32", "27768"}, - {"2600:100f:9110::/36", "22394"}, - {"2001:559:8241::/48", "7922"}, - {"2402:1440:30::/48", "132168"}, - {"2800:4b0:8401::/36", "12252"}, - {"2804:6164:8000::/34", "262424"}, - {"2806:230:1024::/48", "265594"}, - {"2a02:26f7:e3cd::/42", "20940"}, - {"2600:1417:2001::/36", "20940"}, - {"2804:3374::/32", "265397"}, - {"2a02:26f7:b780::/48", "36183"}, - {"2a02:6680:1130::/44", "16116"}, - {"2a07:e040::/32", "211895"}, - {"2801:0:140::/48", "52314"}, - {"2a03:2887:ff43::/45", "63293"}, - {"2001:559:c2ab::/48", "7725"}, - {"2607:9e00:1002::/34", "30536"}, - {"2804:374::/32", "262844"}, - {"2a02:568:fe03::/39", "8763"}, - {"2a0c:b9c0::/32", "202448"}, - {"2001:67c:2af4::/48", "8562"}, - {"2401:d800:fc02::/42", "7552"}, - {"2806:2f0:20e1::/48", "22884"}, - {"2a02:26f7:d8c1::/46", "20940"}, - {"2a0a:a600::/29", "61317"}, - {"2a0c:e642:32::/41", "211323"}, - {"2001:da8:b803::/45", "24372"}, - {"2402:d000:7001::/32", "9329"}, - {"2a00:1b68::/32", "43226"}, - {"2a02:888:4050::/48", "48695"}, - {"2a03:720:5::/44", "57073"}, - {"2001:dc7:1000::/48", "24409"}, - {"2406:cbc0::/48", "135901"}, - {"2408:876c::/27", "4837"}, - {"2605:6440:3005::/33", "396356"}, - {"2620:ff:c000::/48", "64238"}, - {"2620:11b:e0bd::/41", "3356"}, - {"2800:160:1d7d::/40", "14259"}, - {"2804:2e1c:e681::/39", "265324"}, - {"2408:823c::/31", "4837"}, - {"2408:8772::/29", "4837"}, - {"2001:400:14:3::/38", "293"}, - {"2001:44c8:4870::/44", "131445"}, - {"2402:cf80:100::/44", "62597"}, - {"2408:8656:30f6::/44", "17623"}, - {"2409:8904:60b0::/38", "24547"}, - {"2409:8c1e::/34", "9808"}, - {"2800:160:11f9::/38", "14259"}, - {"2804:418::/32", "262415"}, - {"2804:6fc:1b::/42", "28158"}, - {"2001:b18:1000::/47", "47787"}, - {"2001:4c20::/32", "29636"}, - {"2804:bec::/32", "263018"}, - {"2001:418:1401:70::/63", "20940"}, - {"2001:559:8371::/45", "33287"}, - {"2404:e400::/44", "45345"}, - {"2408:8000:9ffd::/48", "140979"}, - {"2606:3340::/32", "399414"}, - {"2620:11b:e000::/43", "3356"}, - {"2a00:6901:e005::/48", "20926"}, - {"2001:67c:2e80::/48", "20712"}, - {"2603:60bd::/32", "11426"}, - {"2620:12d:400e::/47", "53988"}, - {"2804:17cc:4140::/32", "263252"}, - {"2001:67c:560::/48", "8949"}, - {"2001:1250:3000::/44", "22894"}, - {"2600:6c21:23c::/37", "20115"}, - {"2605:6ac0:1000::/36", "13789"}, - {"2806:2f0:1061::/48", "17072"}, - {"2001:559:795::/48", "33287"}, - {"2001:49f0:d0c1::/44", "174"}, - {"2405:c0:30::/48", "138881"}, - {"2409:8000::/40", "56048"}, - {"240a:a26f::/32", "143273"}, - {"2600:1408:f000::/48", "35994"}, - {"2806:240::/32", "14178"}, - {"2405:d3c0::/32", "133164"}, - {"240a:a45e::/32", "143768"}, - {"2600:370f:3541::/45", "32261"}, - {"2602:fd66::/36", "14756"}, - {"2804:204:24f::/43", "28186"}, - {"240e:438:4440::/38", "4134"}, - {"2a01:5700::/32", "209041"}, - {"2001:559:481::/48", "33287"}, - {"2404:7a40:1002::/48", "132556"}, - {"2406:2000:a9::/41", "10310"}, - {"240b:4007:fffe::/47", "45102"}, - {"2600:6c10:e50::/32", "20115"}, - {"2620:10c:c01c::/48", "6071"}, - {"2406:e001:6800::/35", "23655"}, - {"240a:a47c::/32", "143798"}, - {"240e:108:94::/46", "4134"}, - {"2600:380:ec80::/41", "20057"}, - {"2a01:c50f:8040::/35", "12479"}, - {"2c0f:f470::/32", "37640"}, - {"2001:fd8:ff00::/40", "132199"}, - {"2402:3800::/32", "7503"}, - {"2600:6c38:78::/47", "20115"}, - {"2602:fd12::/48", "16509"}, - {"2602:fed2:7060::/44", "53356"}, - {"2607:ae80:4::/47", "26558"}, - {"2607:fcc8:6000::/32", "10796"}, - {"2801:80:1ae0::/48", "266365"}, - {"2806:10ae:17::/48", "8151"}, - {"2407:1400:2::/45", "23752"}, - {"2600:6c38:13::/44", "20115"}, - {"2801:13:8800::/48", "269758"}, - {"2804:4d34::/32", "267418"}, - {"2001:559:87d8::/47", "7015"}, - {"2403:6200::/33", "45629"}, - {"2409:896a:4e00::/39", "9808"}, - {"240e:108:11b1::/48", "136190"}, - {"2a09:4b40::/29", "61317"}, - {"2001:250:6c3f::/41", "138370"}, - {"2607:3c00:6414::/47", "26380"}, - {"2608:121:1::/44", "721"}, - {"2a02:26f7:c8d1::/46", "20940"}, - {"2a03:5640:f506::/48", "2906"}, - {"2a04:1c40::/30", "201035"}, - {"2406:e5c0::/32", "4782"}, - {"240f::/23", "2516"}, - {"2801:1fc:1e::/48", "27951"}, - {"2a01:ce82:4000::/32", "51964"}, - {"2a0d:2d41::/32", "209419"}, - {"2a0e:3080::/29", "208921"}, - {"2a0e:b107:16b0::/44", "58336"}, - {"2a11:6c0:caff::/29", "211083"}, - {"2c0f:f000:500::/38", "36891"}, - {"2801:19:e800::/48", "267777"}, - {"2001:678:bc0::/48", "41064"}, - {"2001:44b8:6067::/48", "4739"}, - {"2620:0:2e50::/44", "15088"}, - {"2620:128:1008::/48", "53620"}, - {"2800:160:12dd::/42", "14259"}, - {"2a0e:b107:17fe::/47", "142553"}, - {"2001:559:8123::/48", "33287"}, - {"2600:1417:6801::/35", "20940"}, - {"2620:0:870::/48", "3856"}, - {"2a05:1cc0::/29", "201601"}, - {"2001:67c:460::/48", "15542"}, - {"2605:2340::/32", "393898"}, - {"2804:2e0c:2001::/32", "263019"}, - {"2804:67ac:8::/43", "269643"}, - {"2806:20d:505a::/42", "32098"}, - {"2001:559:c26d::/46", "7922"}, - {"2409:8002:900::/37", "9808"}, - {"240a:a7af::/32", "144617"}, - {"2600:370f:6068::/40", "32261"}, - {"2606:2800:747::/48", "15133"}, - {"2804:13b0:6c00::/43", "263546"}, - {"2a00:fd40:3::/48", "201924"}, - {"2001:559:1c3::/48", "33659"}, - {"2001:4546:1003::/48", "20940"}, - {"2603:c010:a000::/36", "31898"}, - {"2804:49c:31::/48", "7162"}, - {"2001:3a0:f006::/48", "38644"}, - {"2001:5f8:7f0e::/32", "5056"}, - {"2409:8a7d::/30", "9808"}, - {"2a00:1188:d::/46", "8455"}, - {"2a02:e28::/32", "41696"}, - {"2a02:26f7:ba40::/48", "36183"}, - {"2408:840c:9e00::/40", "17621"}, - {"2001:df7:6300::/48", "132772"}, - {"240e:983:1e02::/48", "134763"}, - {"2804:1e3c::/32", "264416"}, - {"2605:7040::/48", "46176"}, - {"2804:8054:1000::/40", "271744"}, - {"2a0c:b641:92::/48", "210103"}, - {"2408:8957:b900::/40", "17816"}, - {"2605:a401:8df7::/38", "33363"}, - {"2804:51dc::/32", "268481"}, - {"2001:df7:d200::/48", "136179"}, - {"2400:9380:92a0::/47", "4809"}, - {"2404:cf00::/36", "38511"}, - {"240a:a99b::/32", "145109"}, - {"2a01:6420::/29", "62193"}, - {"2001:559:516::/48", "33489"}, - {"2001:57a:aa02::/44", "22773"}, - {"2001:fd8:b2f0::/44", "4775"}, - {"2404:59c0::/34", "58507"}, - {"2408:8459:2010::/42", "17623"}, - {"2801:1c:a800::/48", "19429"}, - {"2804:7568::/32", "271044"}, - {"2a0e:6b80::/29", "202709"}, - {"2a0f:7b40::/29", "21227"}, - {"2001:559:3f2::/47", "7015"}, - {"2001:579:e138::/40", "22773"}, - {"2409:805f:900::/35", "9808"}, - {"240e:3bc:f700::/36", "4134"}, - {"2600:1fa0:20c0::/44", "8987"}, - {"2806:2f0:45e3::/38", "17072"}, - {"2408:8459:cc50::/39", "17816"}, - {"240e:267:2400::/36", "4134"}, - {"2a02:28::/47", "8359"}, - {"2001:559:c4e4::/47", "33491"}, - {"2a05:7c0::/32", "34156"}, - {"240a:a451::/32", "143755"}, - {"2804:399c:e006::/35", "266039"}, - {"2a02:46e0:facf::/37", "60049"}, - {"2001:559:c33d::/48", "7016"}, - {"2001:590:1007::/34", "3257"}, - {"2402:1840::/32", "45355"}, - {"240e:44d:2b00::/42", "140345"}, - {"2600:1003:b4d0::/44", "6167"}, - {"2600:6c38:a1d::/42", "20115"}, - {"2804:7abc::/32", "271389"}, - {"2a00:e760::/32", "8368"}, - {"2001:250:3405::/44", "138393"}, - {"2404:3d00:4142::/47", "3573"}, - {"2a02:26f7:ce85::/46", "20940"}, - {"2a04:f180::/29", "42695"}, - {"2a0e:3780:8150::/48", "206059"}, - {"2a0f:5701:3520::/48", "205593"}, - {"2606:2680:b000::/48", "7138"}, - {"2a12:da00::/29", "1239"}, - {"2001:4408:7300::/37", "4758"}, - {"2405:201:e800::/35", "55836"}, - {"2408:840c:8600::/40", "17621"}, - {"240e:964:2800::/38", "133776"}, - {"2606:2800:60f7::/44", "15133"}, - {"2001:67c:1bf4::/48", "58010"}, - {"2001:c20:4891::/45", "9255"}, - {"2605:a7c0:151::/44", "16509"}, - {"2400:f8c0::/32", "135517"}, - {"2409:803c:800::/40", "24444"}, - {"2607:f7a8::/39", "21687"}, - {"2408:8459:c610::/42", "17623"}, - {"240a:ac29::/32", "145763"}, - {"240a:ad74::/32", "146094"}, - {"2602:ffd1::/48", "393336"}, - {"2001:4428::/32", "18119"}, - {"2405:5340::/32", "63781"}, - {"240a:a75d::/32", "144535"}, - {"2604:6600:6::/42", "40676"}, - {"2a02:26f0::/48", "20940"}, - {"2001:559:82cd::/48", "7725"}, - {"2804:3bb0::/32", "266165"}, - {"2806:2f0:33a3::/41", "17072"}, - {"2001:c20:48a3::/48", "3758"}, - {"2001:559:557::/48", "33491"}, - {"2001:559:c174::/48", "21508"}, - {"2405:f280:2::/43", "131464"}, - {"240a:ac18::/32", "145746"}, - {"2804:6070::/32", "269167"}, - {"2a07:4140::/29", "50084"}, - {"2001:559:bc::/48", "33652"}, - {"2804:8444::/32", "272250"}, - {"240e:3b8:2800::/38", "4134"}, - {"2606:ed00:7::/32", "47869"}, - {"2804:1ec::/32", "53127"}, - {"2001:559:8310::/48", "7016"}, - {"2001:fd0:2100::/38", "10029"}, - {"2001:1388:3686::/36", "6147"}, - {"240e:d0::/33", "140329"}, - {"2806:2f0:1083::/43", "17072"}, - {"2a0c:e640:9::/42", "211876"}, - {"2001:559:c16a::/48", "22909"}, - {"2804:45c8:2::/32", "266949"}, - {"2a0c:9a40:1097::/48", "34927"}, - {"2001:1a11:6f::/43", "42298"}, - {"2a02:b48:4100::/34", "3491"}, - {"2a0e:aa00:311::/48", "41378"}, - {"2a0f:1c0::/29", "60262"}, - {"2804:2114::/32", "264531"}, - {"2a06:b500:2010::/44", "211768"}, - {"2001:559:30d::/48", "33657"}, - {"2a06:a006:2000::/32", "61138"}, - {"2001:fd8:303e::/47", "132199"}, - {"240a:af35::/32", "146543"}, - {"2603:c010:8000::/36", "31898"}, - {"2804:3178::/32", "265017"}, - {"2a0c:9a40:8a00::/48", "213234"}, - {"2001:559:83ce::/48", "33659"}, - {"240a:a99d::/32", "145111"}, - {"240a:a9ee::/32", "145192"}, - {"2800:110:1019::/45", "4270"}, - {"2001:500:13::/48", "393225"}, - {"2604:2d80:8000::/36", "30036"}, - {"2804:14c:65c5::/46", "28573"}, - {"2804:6014:8000::/33", "269144"}, - {"2a02:2e0:cd4f::/29", "12306"}, - {"2a02:26f7:6::/48", "36183"}, - {"2804:1010::/34", "263617"}, - {"2a03:5380::/32", "34612"}, - {"2001:67c:29bc::/48", "207439"}, - {"2600:40ff:ff92::/41", "701"}, - {"2804:ce8::/32", "52574"}, - {"2a02:26f7:f585::/46", "20940"}, - {"2a06:9680:44::/32", "31293"}, - {"2001:67c:518::/48", "206138"}, - {"2401:b8c0:d::/48", "141731"}, - {"2405:6e00:f850::/48", "133612"}, - {"2620:11a:e00e::/48", "22300"}, - {"2804:30f8:80b::/38", "264984"}, - {"2a01:53c0:ffcf::/43", "54994"}, - {"2401:d800:2a70::/40", "7552"}, - {"2402:800:57c5::/43", "7552"}, - {"2405:9800:50::/44", "131445"}, - {"240a:a1a8::/32", "143074"}, - {"2800:160:1c82::/43", "14259"}, - {"2a02:e980:30::/40", "19551"}, - {"2600:1417:a801::/35", "20940"}, - {"2a0a:af80::/29", "24867"}, - {"2402:800:92a9::/43", "7552"}, - {"2404:1c40:4d::/48", "24432"}, - {"2409:8a28:4600::/32", "56041"}, - {"2800:160:1bc9::/43", "14259"}, - {"2804:18e0::/32", "262698"}, - {"2806:102e:15::/44", "8151"}, - {"2001:559:c329::/48", "33659"}, - {"2408:840d:5d00::/42", "17621"}, - {"240e:1e:4000::/36", "140313"}, - {"2001:559:437::/48", "33287"}, - {"2401:d800:f6a0::/41", "7552"}, - {"2408:8256:32a0::/39", "17816"}, - {"2607:1280:11d0::/44", "394972"}, - {"2804:998:2::/43", "28589"}, - {"2a0d:f302::/32", "40994"}, - {"2400:cb00:a9a0::/46", "13335"}, - {"2406:3400:5d::/42", "10143"}, - {"2409:896a:3600::/39", "9808"}, - {"2a05:e840::/29", "34622"}, - {"2a0b:5d40::/29", "6761"}, - {"2c0f:f670::/32", "37532"}, - {"2600:6c38:616::/44", "20115"}, - {"2804:4fac::/32", "268342"}, - {"2806:2f0:4301::/42", "17072"}, - {"2001:4878:2158::/48", "12222"}, - {"2001:4878:c270::/47", "34164"}, - {"240e:3ba:2800::/38", "4134"}, - {"2804:4024:fff0::/44", "265937"}, - {"2001:250:702e::/48", "24370"}, - {"2401:c900:2700::/36", "36351"}, - {"2402:9900:b11::/48", "27435"}, - {"2409:8c30::/41", "9808"}, - {"2602:fcf6:ff9::/48", "212577"}, - {"2620:128:1000::/48", "53620"}, - {"2800:68:15::/48", "52343"}, - {"2804:514c::/32", "268444"}, - {"2001:dce:9501::/33", "23869"}, - {"2001:fd8:400::/38", "132199"}, - {"240a:a4c4::/32", "143870"}, - {"2600:1406:4601::/39", "20940"}, - {"2600:6c38:e33::/44", "20115"}, - {"2602:ffe4::/46", "21859"}, - {"2605:2800::/40", "6922"}, - {"2a01:c8c0::/28", "25454"}, - {"2600:1415:3001::/37", "20940"}, - {"2a00:1298::/32", "5578"}, - {"2603:c002:e10::/35", "31898"}, - {"2606:4640::/32", "399521"}, - {"2804:4488:5010::/44", "262480"}, - {"2a02:26f7:a4::/48", "36183"}, - {"2001:400:8815::/44", "293"}, - {"2001:550:4603::/39", "174"}, - {"2001:559:5f9::/48", "33491"}, - {"2001:b200::/37", "9505"}, - {"2408:8459:5850::/38", "17816"}, - {"2600:6c3a:11::/44", "20115"}, - {"2602:803:1::/48", "5769"}, - {"2800:bf0:14c::/47", "52257"}, - {"2804:73e0::/32", "270943"}, - {"2a0e:a880:1000::/36", "209043"}, - {"2607:f3a0:a000::/48", "399808"}, - {"2a00:1358:f100::/30", "6866"}, - {"2001:579:c5c0::/38", "22773"}, - {"2001:44b8:403e::/47", "4739"}, - {"2400:5a20:a::/45", "139006"}, - {"2401:c1c0::/32", "136966"}, - {"240e:ff:c004::/48", "134772"}, - {"2605:ed00:4c64::/43", "11427"}, - {"2804:161c:f00::/45", "263268"}, - {"2a0f:4700::/29", "208235"}, - {"2001:559:191::/48", "33659"}, - {"2409:8751:900::/38", "56047"}, - {"2600:140b:801::/38", "20940"}, - {"2605:e700:3000::/32", "6913"}, - {"2a0a:2784::/32", "206774"}, - {"2a0a:dc80::/29", "206597"}, - {"2607:2780::/48", "11878"}, - {"2a00:1580::/46", "39010"}, - {"2a00:ad87:4600::/48", "9890"}, - {"2a02:26f7:f5cc::/48", "36183"}, - {"2a02:6f20::/32", "15598"}, - {"2407:a800:3e11:111b::/48", "3949"}, - {"2600:c05:3011::/32", "11855"}, - {"2620:104:2011::/46", "40185"}, - {"2804:1670::/32", "263286"}, - {"2a00:fa40::/35", "45031"}, - {"2a03:6440:1001::/46", "199055"}, - {"2402:9d80:900::/47", "131429"}, - {"2804:7040::/32", "270715"}, - {"2a02:6900:8204::/48", "206209"}, - {"2001:678:d28::/48", "209314"}, - {"2001:7b8::/37", "12859"}, - {"2401:d800:ab0::/41", "7552"}, - {"2408:8456:2440::/39", "17816"}, - {"2600:1419:4601::/36", "20940"}, - {"2001:2090::/31", "3301"}, - {"240e:978:900::/40", "137697"}, - {"2610:85:3000::/30", "6079"}, - {"2804:748c::/32", "270988"}, - {"2806:230:6026::/48", "265594"}, - {"240a:aced::/32", "145959"}, - {"2804:122c::/32", "263461"}, - {"2a05:a100::/29", "200899"}, - {"2404:b0:2002::/33", "4750"}, - {"2603:4:1400::/48", "44273"}, - {"2620:9b:c000::/47", "54413"}, - {"2620:109:5000::/46", "46435"}, - {"2a02:1620:8005::/33", "1290"}, - {"2a07:dc00:1810::/42", "29997"}, - {"2408:8956:8000::/40", "17622"}, - {"240a:acbd::/32", "145911"}, - {"2605:5c0:c040::/45", "28885"}, - {"2804:3030::/32", "264935"}, - {"2a04:4e42:3b::/45", "54113"}, - {"2a10:8b40::/32", "42369"}, - {"2806:2f0:81c3::/43", "17072"}, - {"2a0b:7340::/29", "202895"}, - {"2c0f:ef18:4000::/32", "328266"}, - {"2001:559:8574::/47", "7015"}, - {"2400:8c80::/32", "132158"}, - {"2a02:2070:fffe::/48", "197498"}, - {"2a0e:e704:50::/44", "47837"}, - {"2001:250:600f::/42", "24364"}, - {"2400:4be0::/48", "141898"}, - {"2404:e801:101b::/45", "55430"}, - {"2409:8050:3002::/40", "56047"}, - {"2409:8420::/27", "9808"}, - {"2406:c800:a1cb::/33", "38016"}, - {"2408:8459:3e30::/41", "17622"}, - {"2607:f820::/34", "11051"}, - {"2800:490:8000::/37", "27951"}, - {"2001:250:3420::/46", "138438"}, - {"2001:dce:d455::/34", "23869"}, - {"2409:800b:2b06::/40", "9808"}, - {"2806:2f0:9e23::/41", "17072"}, - {"2a02:26f7:e504::/48", "36183"}, - {"2a0a:5c40::/29", "205976"}, - {"2001:579:404c::/42", "22773"}, - {"2401:d800:7560::/40", "7552"}, - {"2408:8459:bc50::/38", "17816"}, - {"2600:140f:401::/39", "20940"}, - {"2602:fe9c::/36", "33345"}, - {"2620:111:1004::/47", "18469"}, - {"2a02:a30:f091::/45", "8926"}, - {"240e:3bd:7800::/39", "4134"}, - {"2604:b180:510::/44", "14976"}, - {"2607:f358::/46", "18779"}, - {"2804:2448::/32", "264212"}, - {"2001:1820::/43", "12956"}, - {"240a:a79d::/32", "144599"}, - {"240e:5e:10a0::/44", "140311"}, - {"2605:b100:200::/40", "577"}, - {"2804:6d28:8000::/48", "270516"}, - {"2a11:1040::/29", "60561"}, - {"2001:559:c308::/48", "33287"}, - {"2001:13d2:280f::/43", "7303"}, - {"2001:4878:8027::/48", "12222"}, - {"2806:250:20::/48", "28512"}, - {"2a02:26f7:1d::/48", "20940"}, - {"2a02:26f7:bac8::/48", "36183"}, - {"2a06:e881:6500::/44", "208958"}, - {"2001:559:8419::/48", "33657"}, - {"2001:579:f15c::/40", "22773"}, - {"2404:18c:2100::/32", "6619"}, - {"240e:3b5::/35", "134773"}, - {"2a02:26f7:e3c0::/48", "36183"}, - {"2a06:9080::/32", "203271"}, - {"2a0e:8f02:f003::/48", "213033"}, - {"2401:d800:96c0::/42", "7552"}, - {"2402:6940::/38", "7645"}, - {"2404:2ac0::/32", "139699"}, - {"240a:aa60::/32", "145306"}, - {"2803:d700:2100::/35", "61461"}, - {"2804:1f52::/32", "266474"}, - {"2a01:7f0::/32", "34685"}, - {"2001:da8::/45", "23910"}, - {"2402:800:591d::/42", "7552"}, - {"2602:fe90:809::/48", "35913"}, - {"2602:ffe4:4::/37", "21859"}, - {"2804:51a4:6100::/32", "268467"}, - {"2001:3c8:c306::/36", "4621"}, - {"2001:678:a74::/48", "197838"}, - {"2409:8030:1009::/45", "9808"}, - {"2600:4041:1000::/24", "701"}, - {"2602:fdaf::/36", "396176"}, - {"2803:2ac0::/32", "52300"}, - {"2001:559:c1ed::/46", "33287"}, - {"2001:44c8:4090::/41", "45430"}, - {"2620:132:7040::/40", "19537"}, - {"2001:67c:6e8::/48", "201641"}, - {"2001:1388:7c2::/36", "6147"}, - {"2001:4500::/35", "18183"}, - {"2400:d740::/32", "136106"}, - {"2409:4051:3000::/33", "55836"}, - {"2804:5550:7692::/32", "263067"}, - {"2001:1850::/32", "32181"}, - {"2804:3fbc::/32", "265911"}, - {"2a00:126f::/32", "57472"}, - {"2a00:18d0::/32", "47887"}, - {"2408:826a::/32", "4837"}, - {"2804:1b2:f000::/41", "18881"}, - {"2c0f:eeb8::/32", "328303"}, - {"2001:559:429::/48", "22909"}, - {"2800:bf0:8279::/48", "27947"}, - {"2806:250:200::/46", "28555"}, - {"2a05:d050:90c0::/44", "16509"}, - {"2a0c:e304:1::/48", "208529"}, - {"2001:559:c103::/48", "7922"}, - {"2001:778::/32", "2847"}, - {"2405:6e00:2480::/45", "18291"}, - {"2a07:c882::/32", "207249"}, - {"2a0b:4f40::/48", "197473"}, - {"2001:250:83a::/48", "23910"}, - {"2a01:2c0:23dc::/32", "8282"}, - {"2a02:158::/37", "44946"}, - {"2a02:26f7:e6c0::/48", "36183"}, - {"2c0f:eba0::/32", "328596"}, - {"2001:559:2a7::/44", "7015"}, - {"2400:9380:83c0::/44", "136167"}, - {"2404:8000:1031::/40", "17451"}, - {"2408:8459:9430::/41", "17622"}, - {"2620:11f:f000::/40", "2381"}, - {"2606:fa00::/32", "239"}, - {"2001:559:378::/48", "33287"}, - {"2401:d800:f072::/40", "7552"}, - {"2600:6c40::/32", "20115"}, - {"2620:12f:90ff::/48", "6200"}, - {"2a10:ff00::/31", "212242"}, - {"2001:df5:1400::/48", "133255"}, - {"2001:559:c38a::/48", "7015"}, - {"2001:67c:3d4::/48", "207143"}, - {"2001:1388:8a80::/46", "264684"}, - {"2600:1419:6c00::/48", "35994"}, - {"2a02:26f7:bc48::/48", "36183"}, - {"2a09:6200::/29", "38946"}, - {"2001:67c:2de8::/48", "50476"}, - {"2a03:4bc0:1000::/47", "43893"}, - {"2a05:5f40::/31", "201366"}, - {"2001:49f0:d034::/48", "174"}, - {"2404:0:5000::/46", "24154"}, - {"2409:8904:3ea0::/39", "24547"}, - {"2602:107:2910::/48", "20115"}, - {"2801:196:2::/48", "19429"}, - {"2a00:e880::/32", "15557"}, - {"2405:1c0:6a11::/46", "55303"}, - {"240a:a475::/32", "143791"}, - {"2804:2d44::/32", "265270"}, - {"240e:44d:1f80::/41", "4134"}, - {"2600:1007:a010::/40", "22394"}, - {"2806:2f0:3103::/42", "17072"}, - {"2a00:bb40::/32", "3257"}, - {"2800:160:16a8::/46", "14259"}, - {"2804:6158::/32", "269229"}, - {"2a03:7c40::/32", "48173"}, - {"2a0d:ac00:6::/47", "205202"}, - {"2001:678:cc4::/48", "42086"}, - {"2408:840d:9c00::/42", "17621"}, - {"240a:abe2::/32", "145692"}, - {"2600:100e:bf1e::/33", "6167"}, - {"2600:6c38:e3::/45", "20115"}, - {"2a01:5041:600e::/48", "202196"}, - {"2a0b:a240::/29", "205535"}, - {"2c0f:3800::/32", "37616"}, - {"2402:ff00::/32", "45637"}, - {"240a:a6e3::/32", "144413"}, - {"2806:230:2053::/48", "11888"}, - {"2407:d040::/32", "58411"}, - {"2408:8459:7430::/41", "17622"}, - {"240e:878:600::/42", "137689"}, - {"2602:800:cc00::/38", "397695"}, - {"2800:160:1f3c::/41", "14259"}, - {"2a02:26f7:be81::/46", "20940"}, - {"2408:840d:6800::/42", "17621"}, - {"2600:6000:f571::/40", "12271"}, - {"2605:e700::/34", "6913"}, - {"2804:5284:e000::/35", "268523"}, - {"2a00:dd00:3::/45", "56484"}, - {"2600:1405:1001::/36", "20940"}, - {"2600:140f:a800::/48", "9498"}, - {"2800:4b0:4419::/45", "12252"}, - {"2804:2e4::/32", "53234"}, - {"2a02:2620::/32", "29124"}, - {"2a02:26f7:f6f4::/48", "36183"}, - {"2a10:7300::/29", "399975"}, - {"2001:8b0:1629::/33", "20712"}, - {"2403:6dc0::/40", "134526"}, - {"2406:840:eb0f::/48", "142553"}, - {"2603:ff20::/27", "397165"}, - {"2804:4c14:8b01::/35", "267348"}, - {"2001:250:c11::/44", "138374"}, - {"2605:9e00::/32", "15082"}, - {"2605:b740::/40", "2773"}, - {"2620:11b:3002::/48", "36351"}, - {"2001:ee0:d340::/37", "45899"}, - {"2600:1415:b::/43", "20940"}, - {"2a02:26f7:c3d1::/46", "20940"}, - {"2a0a:7300:1000::/34", "56911"}, - {"2001:1248:5a2b::/45", "11172"}, - {"2001:4868:224::/48", "7046"}, - {"2400:6280:10b::/48", "132280"}, - {"2405:1c0:6531::/45", "55303"}, - {"2408:8459:5080::/42", "136959"}, - {"240a:a959::/32", "145043"}, - {"2607:f740:70::/48", "36236"}, - {"2804:6748::/32", "269618"}, - {"2001:250:5800::/46", "24363"}, - {"240a:a957::/32", "145041"}, - {"2607:f5a8::/33", "27589"}, - {"2a02:4840:101::/48", "203557"}, - {"2001:678:690::/48", "49677"}, - {"2408:8957:2500::/40", "17816"}, - {"240a:a9bd::/32", "145143"}, - {"240a:af0f::/32", "146505"}, - {"2600:140f:1200::/48", "9498"}, - {"2607:f4e8:111::/37", "22822"}, - {"2804:4368:500::/35", "267568"}, - {"2404:c480::/32", "135328"}, - {"2405:84c0:8d00::/40", "9886"}, - {"2804:691c::/32", "270249"}, - {"2a0f:12c0::/29", "60262"}, - {"2a11:8900::/29", "204790"}, - {"240a:a0d9::/32", "142867"}, - {"240a:a91d::/32", "144983"}, - {"2001:550:a13::/39", "174"}, - {"2001:5000::/36", "1273"}, - {"2605:72c0:5::/48", "40401"}, - {"2a02:26f7:d28c::/48", "36183"}, - {"2001:253:127::/48", "142093"}, - {"2801:13c::/42", "18747"}, - {"2001:559:80a9::/48", "33651"}, - {"2001:67c:2d2c::/48", "206321"}, - {"2402:47c0::/39", "137280"}, - {"2620:0:1a30::/48", "10546"}, - {"2a02:26f7:d1c0::/48", "36183"}, - {"2001:67c:13f8::/48", "39057"}, - {"2a02:1368::/32", "51873"}, - {"2001:678:2b4::/48", "48882"}, - {"2001:1a68:35::/41", "15694"}, - {"2402:3a80:1436::/41", "38266"}, - {"240a:ab66::/32", "145568"}, - {"2602:fcba::/36", "399332"}, - {"2605:a900:1002::/45", "46887"}, - {"2606:a600:8::/48", "33297"}, - {"2804:6eb8::/32", "270615"}, - {"2806:2a0:800::/40", "28548"}, - {"2a02:5400::/48", "33353"}, - {"2a0e:40c0:1::/48", "15626"}, - {"2a0e:b107:bd0::/48", "140936"}, - {"2a01:5042:1::/48", "202196"}, - {"2001:67c:2390::/48", "21155"}, - {"2405:9800:c92d::/48", "138915"}, - {"240e:438:4a20::/43", "140647"}, - {"2a0b:6b83::/35", "202562"}, - {"2001:1248:9500::/41", "11172"}, - {"2405:1c0:6581::/46", "55303"}, - {"2a01:488:bb18::/48", "34440"}, - {"2001:559:7ea::/48", "33490"}, - {"2001:67c:1440::/48", "44597"}, - {"2400:a980:7500::/36", "133111"}, - {"2605:7840:2000::/36", "32482"}, - {"2a02:26f7:ef89::/42", "20940"}, - {"2a04:8484::/30", "21413"}, - {"2a0e:b80::/29", "208951"}, - {"2a10:8440::/31", "50455"}, - {"2001:9d0::/32", "8387"}, - {"240e:84::/31", "4134"}, - {"2607:f8a8::/32", "40913"}, - {"2800:68:16::/48", "27947"}, - {"2001:559:c47a::/48", "33489"}, - {"2001:67c:189c::/48", "1257"}, - {"240a:ad92::/32", "146124"}, - {"2600:1402:2001::/35", "20940"}, - {"2600:6c38:a35::/44", "20115"}, - {"2804:4618:3200::/39", "266968"}, - {"2001:16b0::/32", "12741"}, - {"2401:d800:9580::/42", "7552"}, - {"2402:dc00::/32", "45682"}, - {"2409:804d:3100::/36", "9808"}, - {"2409:8a55:f700::/30", "56040"}, - {"240a:ac3d::/32", "145783"}, - {"2607:9480:f0::/44", "14338"}, - {"2804:73f0::/32", "270947"}, - {"2402:800:93a9::/43", "7552"}, - {"2606:1880::/35", "32931"}, - {"2a00:1ed0::/32", "43541"}, - {"2a09:9900::/32", "199046"}, - {"2404:8000:a0::/53", "17451"}, - {"2804:175c:8420::/33", "263140"}, - {"2001:67c:230::/48", "49788"}, - {"2001:15f8:1000::/40", "15776"}, - {"2400:c700:88::/39", "55644"}, - {"2402:800:3e40::/43", "7552"}, - {"2607:ff40::/32", "7871"}, - {"2804:2200::/32", "264585"}, - {"2806:230:2043::/48", "11888"}, - {"2a00:fb8:8000::/29", "8881"}, - {"2a01:5041:efd::/46", "202196"}, - {"2a0e:b107:c10::/48", "137256"}, - {"2400:5000::/32", "38826"}, - {"2a00:79e1:800::/45", "36384"}, - {"2a02:2e02:ec0::/39", "12479"}, - {"2a02:c500::/31", "199246"}, - {"2a06:bbc2:1::/48", "212044"}, - {"2a06:f400::/29", "203387"}, - {"2a0c:b641:102::/44", "213154"}, - {"2a11:d0c0::/29", "49655"}, - {"2001:df2:2280::/48", "135851"}, - {"2403:3400::/32", "7604"}, - {"2600:1fa0:e020::/44", "16509"}, - {"2600:9000:10d6::/44", "16509"}, - {"2a00:ef0::/32", "6834"}, - {"2a00:b180::/32", "15557"}, - {"2a03:ca00::/32", "25592"}, - {"2a0d:9a81::/40", "49959"}, - {"2a12:73c0::/29", "400522"}, - {"240e:3bc:dc00::/34", "4134"}, - {"2600:1003:f440::/44", "6167"}, - {"2600:1417:55::/46", "9498"}, - {"2804:66dc::/32", "269587"}, - {"240e:940:ef00::/30", "4134"}, - {"2800:bf0:8277::/48", "27947"}, - {"2a02:970:1193::/38", "44002"}, - {"2a04:b540::/36", "61424"}, - {"2600:1406:6801::/37", "20940"}, - {"2620:10f:3000::/40", "6510"}, - {"2804:99c::/32", "262519"}, - {"2806:20d:1002::/44", "32098"}, - {"2a02:2698:2c::/38", "12768"}, - {"2001:2b8:bc::/48", "1237"}, - {"2001:448a:5130::/41", "7713"}, - {"2402:800:94b7::/41", "7552"}, - {"240a:a2dc::/32", "143382"}, - {"240a:a733::/32", "144493"}, - {"2800:860:face::/48", "20299"}, - {"2a02:26f7:f4c1::/46", "20940"}, - {"2a04:9140:3104::/48", "201958"}, - {"2a0c:1a00::/32", "205389"}, - {"2001:1248:883a::/47", "11172"}, - {"2001:18e8:810::/37", "19782"}, - {"2806:20d:5a05::/46", "32098"}, - {"2a01:240:ab02::/33", "30781"}, - {"2a03:a300:3000::/48", "35104"}, - {"240a:ac05::/32", "145727"}, - {"2001:400:a000:e::/59", "293"}, - {"2a02:26f7:a0::/48", "36183"}, - {"2a03:42e0:1::/32", "59753"}, - {"2a09:60c0::/29", "207668"}, - {"2001:559:85d1::/46", "33287"}, - {"2001:4de0:6200::/39", "33438"}, - {"2409:896a:7e00::/39", "9808"}, - {"240e:1a:130::/41", "23650"}, - {"2600:1417:77::/48", "38266"}, - {"2603:c001:650::/35", "31898"}, - {"2610:b0:4107::/48", "21433"}, - {"2a00:e4c0::/32", "42908"}, - {"2001:559:854c::/47", "33652"}, - {"2401:d800:21a0::/41", "7552"}, - {"2401:d800:b090::/42", "7552"}, - {"240a:a026::/32", "142688"}, - {"2001:df3:2980::/48", "131713"}, - {"2409:8c20:4a23::/37", "56046"}, - {"2603:4:1700::/48", "44273"}, - {"2a00:4802:2b0::/44", "8717"}, - {"2409:8053:900::/37", "9808"}, - {"240e:f:c000::/37", "4134"}, - {"2602:ff98::/39", "63447"}, - {"2803:d820::/32", "265813"}, - {"2a0b:7c00::/32", "8437"}, - {"2001:559:733::/48", "33652"}, - {"2408:8409:5400::/40", "4808"}, - {"2409:8c85:411::/44", "9808"}, - {"2607:1280:1010::/44", "394972"}, - {"2801:80:580::/47", "52740"}, - {"2804:179c:3091::/32", "263159"}, - {"2a07:9d80::/29", "202716"}, - {"2a0e:73c0::/29", "51519"}, - {"2001:559:82a8::/48", "33657"}, - {"2404:f300:11::/48", "58463"}, - {"2801:131::/45", "272084"}, - {"2a0a:580:1100::/40", "15404"}, - {"2001:4998:69::/39", "10310"}, - {"2804:e6c:2000::/33", "262954"}, - {"2001:400:6441:61::/32", "293"}, - {"2001:559:373::/48", "7922"}, - {"2604:ca00:f029::/48", "36492"}, - {"2800:5f0:80d::/42", "22724"}, - {"2a00:6060:b000::/48", "199881"}, - {"2a07:3b80:2::/48", "62240"}, - {"2404:de00::/32", "55819"}, - {"2405:1480:2000::/48", "23724"}, - {"2408:843f:2600::/25", "4837"}, - {"240e:40:c::/48", "58519"}, - {"2600:1200::/24", "4152"}, - {"2a02:26f7:c308::/48", "36183"}, - {"2a09:1980::/29", "209810"}, - {"2a0a:ec02:201::/46", "42692"}, - {"2001:559:c181::/46", "7922"}, - {"2605:1980:402::/32", "13951"}, - {"2a09:1840::/32", "209568"}, - {"2001:559:419::/48", "7015"}, - {"240a:a16c::/32", "143014"}, - {"240e:3b5:d000::/36", "134772"}, - {"2a07:a40:b::/48", "48821"}, - {"2800:370:67::/43", "28006"}, - {"2001:3c8:2809::/38", "4621"}, - {"2402:3a80:1b30::/41", "38266"}, - {"2a0f:2dc0::/29", "60262"}, - {"2404:8000:d3::/42", "17451"}, - {"2605:7380:c000::/34", "25697"}, - {"2620:12d:5002::/44", "55128"}, - {"2a04:4e80:2::/47", "211400"}, - {"2001:559:758::/48", "33657"}, - {"2400:cb00:450::/45", "13335"}, - {"2a03:db80:2c15::/35", "680"}, - {"2001:67c:2d14::/48", "204088"}, - {"240a:a29c::/32", "143318"}, - {"240a:ab2c::/32", "145510"}, - {"2a02:26f7:b844::/48", "36183"}, - {"240a:a21f::/32", "143193"}, - {"240a:a74d::/32", "144519"}, - {"2800:68:38::/48", "61468"}, - {"2804:4488:3010::/44", "262480"}, - {"2804:4afc:f010::/36", "267276"}, - {"2402:ae80::/32", "38800"}, - {"240a:a706::/32", "144448"}, - {"2602:fea6::/36", "40676"}, - {"2804:3790::/32", "266421"}, - {"2a0d:5600:11::/44", "9009"}, - {"2408:840d:1100::/42", "17621"}, - {"2408:8459:5630::/41", "17622"}, - {"2804:c84:32::/32", "52720"}, - {"2a01:20e::/32", "41051"}, - {"2001:559:c1cf::/48", "7725"}, - {"2408:8956:d840::/40", "17622"}, - {"2404:1800::/32", "17705"}, - {"2620:13b:b000::/45", "138005"}, - {"2804:14d:3c00::/40", "28573"}, - {"2804:e60::/32", "61888"}, - {"240e:3b9::/35", "134773"}, - {"240e:438:6c20::/43", "140647"}, - {"2800:1e0:2200::/37", "7195"}, - {"2001:559:37f::/48", "33660"}, - {"2404:cc00:6::/34", "24441"}, - {"2409:8c85:410::/48", "24547"}, - {"2620:cb:8000::/48", "54058"}, - {"2804:7fc0::/32", "271707"}, - {"2a01:53c0:ff0a::/43", "54994"}, - {"2a0c:b641:5d2::/48", "212952"}, - {"2a0e:b107:fff::/48", "42394"}, - {"2a0f:18c0::/29", "60262"}, - {"2001:67c:214::/48", "25057"}, - {"2001:1260:c::/46", "28537"}, - {"2401:8e00:9100::/33", "9260"}, - {"2a02:26f7:d881::/46", "20940"}, - {"2401:dd40:1::/48", "24289"}, - {"2403:5000::/39", "9304"}, - {"2001:559:2c5::/48", "33287"}, - {"2408:8656:3aff::/48", "17623"}, - {"240a:a7e4::/32", "144670"}, - {"2607:fcd0:10a::/45", "8100"}, - {"2803:9800:90a2::/39", "11664"}, - {"2804:2674:d::/46", "264344"}, - {"2a02:e30:f007::/48", "199943"}, - {"2a0f:5707:abf0::/45", "212895"}, - {"240e:44d:3640::/42", "140353"}, - {"2804:4230::/32", "267484"}, - {"2804:7404::/32", "270953"}, - {"2607:f428:9380::/44", "10796"}, - {"2620:171:1a::/45", "42"}, - {"2a12:9d00::/29", "8888"}, - {"2001:559:c50a::/48", "33659"}, - {"2001:67c:2bdc::/48", "205700"}, - {"2001:da8:d00d::/42", "24359"}, - {"2400:8800:1e82::/48", "7262"}, - {"2804:1644:ff00::/40", "262903"}, - {"2a02:26f7:f84c::/48", "36183"}, - {"2001:559:82a9::/48", "33287"}, - {"2001:da8:7039::/36", "23910"}, - {"2600:100d:9e00::/44", "6167"}, - {"2804:7f48::/32", "271678"}, - {"2806:2f0:21c2::/48", "17072"}, - {"2a12:28c0::/29", "60741"}, - {"240a:a49e::/32", "143832"}, - {"240a:aec3::/32", "146429"}, - {"2600:6c29::/30", "20115"}, - {"2607:f7a8:606::/48", "397488"}, - {"2804:4e08::/34", "268235"}, - {"2804:6dac::/32", "270548"}, - {"2806:230:2024::/48", "265594"}, - {"2a04:8300::/29", "34410"}, - {"2001:418:1401:3::/64", "2639"}, - {"240a:a6b6::/32", "144368"}, - {"2803:9a40:8003::/33", "263824"}, - {"2804:249c::/32", "264233"}, - {"2a04:4e40:5200::/48", "54113"}, - {"2001:1a68:14::/48", "51373"}, - {"2402:8100:20d7::/44", "45271"}, - {"2602:fed2:7107::/48", "205096"}, - {"2804:2874::/32", "263962"}, - {"2a11:5706:b00b::/48", "212149"}, - {"2404:bf40:80c0::/47", "7545"}, - {"2600:370f:3088::/43", "32261"}, - {"2607:6980:3a70::/44", "32931"}, - {"2a06:e380:2::/32", "203507"}, - {"2001:559:352::/47", "33651"}, - {"240e:fe:2000::/33", "134774"}, - {"2605:dd40:8beb::/37", "398549"}, - {"2606:1a40:2018::/46", "398962"}, - {"2001:678:e04::/48", "212810"}, - {"2001:da8:2000::/44", "24357"}, - {"2409:896a:8000::/39", "9808"}, - {"2806:230:4010::/48", "265594"}, - {"2001:559:811b::/45", "7922"}, - {"2001:4d98:3ffa::/33", "3303"}, - {"2408:8957:7a00::/40", "17622"}, - {"2409:8002:800::/40", "38019"}, - {"240e:fc:7000::/32", "134772"}, - {"2620:96:4000::/48", "63126"}, - {"2803:ba00::/39", "52286"}, - {"2804:5070::/32", "268389"}, - {"2806:106e:a::/45", "8151"}, - {"240a:a69b::/32", "144341"}, - {"240e:183:8220::/46", "140656"}, - {"2600:1415:4c01::/35", "20940"}, - {"2804:73ec::/33", "270946"}, - {"2a0c:3d40::/32", "204315"}, - {"2001:559:80d6::/48", "33287"}, - {"2001:678:50::/48", "57382"}, - {"2001:67c:714::/48", "224"}, - {"2606:e300::/32", "13370"}, - {"2804:1d80:8000::/36", "264374"}, - {"2a00:e0c0::/32", "16174"}, - {"2600:141b:1401::/38", "20940"}, - {"2801:80:3920::/48", "270591"}, - {"2801:102::/48", "19429"}, - {"2804:5f14::/32", "269075"}, - {"2a0d:1f00::/29", "39122"}, - {"2405:b40:2::/42", "55674"}, - {"2804:54d0::/32", "268671"}, - {"2804:7378::/32", "270917"}, - {"2a06:3b80:21::/46", "206614"}, - {"2602:fed2:7184::/46", "53356"}, - {"2804:466c::/32", "262689"}, - {"2a02:26f7:b980::/48", "36183"}, - {"2a09:4e07:9000::/36", "208861"}, - {"2001:559:579::/48", "7725"}, - {"240c:ca48::/24", "23910"}, - {"2607:fdf0:5e5a::/42", "8008"}, - {"2a02:e980:212::/45", "19551"}, - {"2c0f:fbb8::/32", "37454"}, - {"2001:559:8757::/44", "7015"}, - {"240a:a742::/32", "144508"}, - {"2606:2d00::/36", "32478"}, - {"2804:1ac4::/46", "61884"}, - {"2600:100e:9110::/36", "6167"}, - {"2806:2f0:24c0::/48", "17072"}, - {"2a0c:4144:100::/48", "25091"}, - {"2402:9900:c11::/48", "27435"}, - {"2600:380:2900::/35", "20057"}, - {"2606:2800:6a38::/47", "15133"}, - {"2804:818::/32", "262345"}, - {"2a07:8504::/32", "1104"}, - {"2a09:c140:db::/48", "210079"}, - {"2600:9000:2314::/44", "16509"}, - {"2604:d600:151b::/42", "32098"}, - {"2804:1b68:700::/32", "61726"}, - {"2a02:2928::/32", "39288"}, - {"2c0f:fb08:ff00::/40", "12091"}, - {"2001:559:c450::/48", "7922"}, - {"2402:800:79d0::/42", "7552"}, - {"2402:800:b770::/40", "7552"}, - {"240a:a814::/32", "144718"}, - {"2600:6c3a:c11::/41", "20115"}, - {"2602:fc64:ca00::/48", "36829"}, - {"2804:2f60::/39", "264887"}, - {"2a0c:6d00:232::/48", "3218"}, - {"2a0e:8f01:107::/48", "38230"}, - {"2402:3700::/32", "38496"}, - {"2606:400::/32", "14051"}, - {"2800:6f0:5800::/40", "20207"}, - {"2a00:7ee0::/46", "16347"}, - {"2a00:9fe0::/29", "15600"}, - {"2a02:ff0:2c00::/40", "12735"}, - {"2409:804e:1900::/34", "9808"}, - {"2600:6000:f5d5::/48", "11351"}, - {"2607:7c80:58::/48", "11661"}, - {"2607:f398::/32", "11090"}, - {"2803:4e00::/32", "20002"}, - {"2804:3074::/32", "264952"}, - {"2a02:26f7:fb::/45", "20940"}, - {"2a03:7100::/29", "49567"}, - {"2001:678:ac::/48", "49251"}, - {"2001:67c:18f4::/48", "1257"}, - {"2408:8459:9450::/38", "17816"}, - {"2409:4052:3000::/31", "55836"}, - {"240e:44d:7580::/41", "4134"}, - {"2605:de40:2005::/35", "397553"}, - {"2a0e:ac80::/29", "35600"}, - {"2001:550:9c06::/38", "174"}, - {"2403:6a40:1000::/33", "135967"}, - {"240a:a6a4::/32", "144350"}, - {"240a:ac92::/32", "145868"}, - {"2606:2800:557::/44", "15133"}, - {"2804:1554::/32", "263384"}, - {"2001:559:c44d::/48", "33657"}, - {"240a:aee2::/32", "146460"}, - {"2a04:d380::/29", "41997"}, - {"2001:57a:ef02::/40", "22773"}, - {"2403:1ec0:1400::/48", "136958"}, - {"2605:b540::/32", "15353"}, - {"2804:34:ff08::/40", "28306"}, - {"2a00:1678:2470::/48", "49453"}, - {"2a07:8100::/29", "202865"}, - {"2404:bf40:e301::/48", "139084"}, - {"240d:c010:16::/48", "132203"}, - {"2605:9cc0:450::/48", "14618"}, - {"2804:26dc::/32", "263861"}, - {"2a02:26f7:ef11::/42", "20940"}, - {"2001:67c:3b4::/48", "52092"}, - {"2001:6d0:6d07::/48", "42385"}, - {"2602:fbda:600::/48", "7721"}, - {"2a01:6060::/32", "199990"}, - {"2a02:450:8000::/48", "34372"}, - {"2a0a:e5c0:27::/44", "207996"}, - {"2a0b:1306:3::/48", "29018"}, - {"2001:678:68::/48", "199670"}, - {"2001:da8:ad::/48", "24350"}, - {"2401:d800:5fe0::/43", "7552"}, - {"2803:65e0::/42", "270034"}, - {"2803:9800:98ce::/47", "11664"}, - {"2804:40:6000::/36", "28657"}, - {"2a03:5e60::/32", "6895"}, - {"2001:559:8092::/48", "33660"}, - {"2406:840:e11a::/48", "141712"}, - {"240e:a5:5000::/32", "4134"}, - {"2a0f:3640::/29", "60262"}, - {"2001:559:c4a3::/48", "7922"}, - {"2001:b08:20::/48", "198444"}, - {"2600:6c10:f095::/44", "20115"}, - {"2602:fe67::/36", "40646"}, - {"2a03:7380:1e00::/42", "13188"}, - {"2400:8b00:d80::/42", "45727"}, - {"2a01:d0:309::/43", "29632"}, - {"2a03:7380:2fc0::/35", "13188"}, - {"2408:8245::/35", "140726"}, - {"240a:a44d::/32", "143751"}, - {"2405:1500:61::/43", "58717"}, - {"2806:2f0:34c1::/46", "17072"}, - {"2a00:f88::/32", "15726"}, - {"2a02:4fc0::/33", "199081"}, - {"2a03:a6c0::/32", "201502"}, - {"240a:a091::/32", "142795"}, - {"2600:140f:5c00::/48", "9498"}, - {"2804:6b88::/32", "270406"}, - {"2a02:2698:4c28::/38", "42682"}, - {"2a09:24c0::/32", "209323"}, - {"2001:148f:fffe::/47", "20701"}, - {"2402:8100:27b0::/47", "45271"}, - {"2804:3b44::/32", "266139"}, - {"2a0f:5707:ab23::/48", "48646"}, - {"2a0f:df00::/48", "41281"}, - {"2400:c540:80::/48", "59238"}, - {"2a02:2f8::/32", "12335"}, - {"2a02:26f7:12::/48", "36183"}, - {"2a05:1084::/47", "59598"}, - {"2a0c:4300:70::/40", "43722"}, - {"2001:410:1000::/40", "271"}, - {"2409:8b1e::/31", "24400"}, - {"2804:34:2021::/45", "28306"}, - {"2a03:ac1::/32", "42953"}, - {"2a03:f000::/30", "25472"}, - {"2a09:80c0::/29", "209335"}, - {"2001:67c:a4::/48", "48908"}, - {"2408:8957:4300::/40", "17816"}, - {"2409:8904:52b0::/39", "24547"}, - {"2603:f530::/25", "397165"}, - {"2606:2800:133::/45", "15133"}, - {"2001:559:1db::/48", "7016"}, - {"2801:80:3e00::/48", "271213"}, - {"2804:1408::/33", "28635"}, - {"2806:230:202c::/48", "265594"}, - {"2a02:26f7:facc::/48", "36183"}, - {"2001:250:6000::/48", "24364"}, - {"2400:57a0::/32", "149487"}, - {"2402:800:979b::/42", "7552"}, - {"2606:ae00:2044::/48", "7287"}, - {"2803:9620::/34", "265865"}, - {"2804:535c::/32", "268579"}, - {"2a03:90c0:1a0::/41", "199524"}, - {"2a06:e881:480f::/48", "134666"}, - {"2a0c:4481:1::/46", "204720"}, - {"2a0f:6b40::/29", "60251"}, - {"2001:fb0:109f:8008::/64", "7470"}, - {"2402:800:9ce0::/39", "7552"}, - {"2402:800:b242::/42", "7552"}, - {"2607:ff28:3::/44", "62904"}, - {"2806:230:2032::/48", "265594"}, - {"2a04:4e40:7410::/44", "54113"}, - {"2407:b001:1100::/34", "24121"}, - {"2a02:88d:801f::/48", "47794"}, - {"2001:559:742::/48", "7015"}, - {"2001:559:c3f0::/48", "33651"}, - {"240a:a22e::/32", "143208"}, - {"2620:12c:b005::/48", "43251"}, - {"2620:160:e700::/44", "10837"}, - {"2804:270c::/32", "262732"}, - {"2620:c0:c000::/44", "393501"}, - {"2a02:26f0:a801::/39", "20940"}, - {"2600:380:f10f::/48", "64011"}, - {"2600:9000:211d::/41", "16509"}, - {"2806:2f0:70c1::/46", "17072"}, - {"2402:6940:1402::/32", "7645"}, - {"2a0c:2f07:4663::/48", "206924"}, - {"2a0c:e6c0::/29", "39259"}, - {"2001:df5:4000::/48", "132647"}, - {"2607:f4e8:c::/47", "22822"}, - {"2801:0:100::/48", "28039"}, - {"2001:550:2401::/46", "174"}, - {"2001:559:324::/48", "33491"}, - {"2408:8957:7700::/36", "17816"}, - {"240a:a0d4::/32", "142862"}, - {"2804:6c80::/32", "270472"}, - {"2a03:89c0::/32", "24978"}, - {"2404:e00:365::/48", "15695"}, - {"240a:a59e::/32", "144088"}, - {"2607:4f80::/32", "7029"}, - {"2804:6d24::/32", "270515"}, - {"2a00:7380:600::/32", "51906"}, - {"2a02:7a8::/32", "47917"}, - {"2a04:c680::/29", "201277"}, - {"2a10:1140::/29", "33438"}, - {"2602:febb:200::/36", "394989"}, - {"2a02:7040:ff00::/47", "203501"}, - {"2409:8a1a:1200::/33", "132525"}, - {"2401:4900:1c0e::/47", "24560"}, - {"2607:fcd0:100:bc01::/45", "8100"}, - {"2001:3c8:1402::/38", "4621"}, - {"2001:67c:25e0::/48", "44760"}, - {"2402:600:c1b2::/34", "38515"}, - {"2620:10a:80bb::/45", "40568"}, - {"2620:10a:80d4::/48", "27299"}, - {"2a02:26f7:f54d::/42", "20940"}, - {"2a10:1a40::/29", "206236"}, - {"2001:559:83fc::/48", "7015"}, - {"2402:1b80::/38", "63956"}, - {"2405:7f00:ae40::/40", "133414"}, - {"2604:1ec0::/36", "11260"}, - {"2607:7e80:6000::/35", "395354"}, - {"2620:130::/48", "13460"}, - {"2801:1d:8801::/48", "18747"}, - {"2a00:5800::/32", "198500"}, - {"2a00:b3a0::/36", "62023"}, - {"2a02:888:4044::/46", "48695"}, - {"2a0b:9fc0::/48", "48858"}, - {"2402:800:6148::/47", "7552"}, - {"2408:8256:318b::/48", "17623"}, - {"2409:8053:2c00::/47", "9808"}, - {"2806:230:3010::/48", "265594"}, - {"2001:559:84b5::/48", "7725"}, - {"2405:9800:c902::/48", "45458"}, - {"2607:f6f0:208::/48", "27330"}, - {"2803:6f40::/32", "265641"}, - {"2804:f20::/32", "52741"}, - {"2a07:a880:4603::/45", "3399"}, - {"2a09:bd80::/29", "208861"}, - {"2a0f:9bc0::/29", "212144"}, - {"2409:8904:d140::/42", "24547"}, - {"240a:a244::/32", "143230"}, - {"2804:3e90:4200::/46", "65891"}, - {"2a02:26f7:cac5::/46", "20940"}, - {"2a07:2d80::/29", "42929"}, - {"2001:1248:9922::/44", "11172"}, - {"2401:d800:2d60::/40", "7552"}, - {"2804:61f4::/32", "269267"}, - {"2a00:cc80::/32", "15557"}, - {"2c0e:2208::/30", "37457"}, - {"2406:840:fc00::/48", "140938"}, - {"2409:8070:302d::/40", "9808"}, - {"2804:1d1c:c3::/32", "53196"}, - {"2a00:cc0:ffff::/29", "13237"}, - {"2409:805c:3900::/33", "9808"}, - {"240a:ae7c::/32", "146358"}, - {"2606:ae00:bec1::/42", "7287"}, - {"2620:133::/40", "19692"}, - {"2a0c:8fc1:8000::/40", "142275"}, - {"2001:559:84c9::/46", "33287"}, - {"2610:a1:3028::/48", "12008"}, - {"2804:6a14:200::/32", "61601"}, - {"2402:ef0b:a000::/36", "24515"}, - {"2600:9000:235b::/42", "16509"}, - {"2801:80:70::/48", "28193"}, - {"2804:803c::/32", "271738"}, - {"2a0e:46c4:110::/48", "137490"}, - {"2001:678:6b0::/48", "33873"}, - {"2803:d760::/32", "269827"}, - {"2804:4334::/32", "267555"}, - {"2806:268:2302::/37", "13999"}, - {"2a02:408:7722::/48", "44112"}, - {"2400:cb00:346::/47", "13335"}, - {"2408:8456:cc40::/40", "17816"}, - {"2a02:26f0:106::/47", "34164"}, - {"2a07:3502:1130::/48", "33915"}, - {"2a0e:8f02:2184::/48", "210714"}, - {"2001:1538::/32", "16363"}, - {"2610:28::/33", "81"}, - {"2620:11c:4000::/40", "30698"}, - {"2a0b:89c1:89c3::/33", "3214"}, - {"2401:d800:2572::/40", "7552"}, - {"240e:965:c400::/39", "133775"}, - {"2800:3a0:192::/48", "28008"}, - {"2804:56c:2200::/32", "28210"}, - {"2401:be00::/48", "23724"}, - {"2409:831e::/31", "24400"}, - {"2409:8a52:d00::/38", "56047"}, - {"240a:a893::/32", "144845"}, - {"2804:1ebc::/32", "264446"}, - {"2804:24e8:c000::/34", "53171"}, - {"2804:3310::/32", "265114"}, - {"2804:3650::/32", "266341"}, - {"2a04:6d00::/29", "211892"}, - {"2408:840c:b600::/40", "17621"}, - {"240a:ac75::/32", "145839"}, - {"240a:acc1::/32", "145915"}, - {"2604:6600:2002::/44", "40676"}, - {"2604:7b80::/32", "32808"}, - {"2607:fc48:800::/48", "40009"}, - {"2001:1900:235f::/42", "3356"}, - {"2405:b40:21::/46", "55674"}, - {"240a:a5f4::/32", "144174"}, - {"2600:80d:14::/40", "6984"}, - {"2620:136:a008::/46", "36198"}, - {"2800:2a0:232::/34", "27947"}, - {"2806:2f0:30c3::/42", "17072"}, - {"2a01:488:bb0b::/48", "26496"}, - {"2001:3a0:f008::/36", "7521"}, - {"2001:418:c07::/35", "2914"}, - {"2602:ffcb::/36", "21757"}, - {"2610:a1:3004::/48", "12008"}, - {"2806:230:fff3::/48", "11888"}, - {"2a02:26f0:10f::/48", "20940"}, - {"2a02:26f7:2c::/48", "36183"}, - {"240e:bf:d000::/25", "4134"}, - {"2603:c0f8:2020::/39", "20054"}, - {"2a02:2e02:1460::/40", "12479"}, - {"2403:9800:7f05::/48", "4648"}, - {"2403:e900::/32", "45133"}, - {"2406:b400:d2::/45", "18209"}, - {"240e:3b4:4c00::/35", "136200"}, - {"2600:6c38:51::/42", "20115"}, - {"2605:8bc0:30::/48", "26695"}, - {"2803:1a00:5013::/44", "262186"}, - {"2a04:2d01::/48", "56647"}, - {"2a09:4c0:301::/46", "58057"}, - {"2001:fd8:f0c0::/42", "132199"}, - {"2001:4d8f::/32", "41637"}, - {"2403:b300::/32", "16509"}, - {"240a:a1e5::/32", "143135"}, - {"240a:ac4e::/32", "145800"}, - {"2605:e3c0::/32", "398479"}, - {"2620:83:2000::/48", "13699"}, - {"2804:3ac0:f7b0::/36", "266107"}, - {"2804:3b38::/32", "266136"}, - {"2a07:7bc0::/29", "202882"}, - {"240a:a866::/32", "144800"}, - {"2607:f208:df01::/48", "26496"}, - {"2a02:26f7:c849::/42", "20940"}, - {"2401:f480::/32", "58703"}, - {"2804:6740::/33", "269616"}, - {"2a01:9980:1::/46", "50837"}, - {"2a0e:9f40::/29", "208436"}, - {"2402:f00::/32", "23918"}, - {"240a:a340::/32", "143482"}, - {"240a:a5bc::/32", "144118"}, - {"240e:44d:2480::/41", "4134"}, - {"2606:2800:505b::/48", "14153"}, - {"2a02:888:8252::/47", "48695"}, - {"2c0f:fc89:7c::/40", "36992"}, - {"2607:fbc0::/32", "7029"}, - {"2a01:6780:7::/48", "8426"}, - {"2001:559:c119::/48", "20214"}, - {"2001:678:6e4::/46", "202329"}, - {"2001:67c:1318::/48", "206594"}, - {"2406:1fc0::/32", "140689"}, - {"240e:ff:c003::/48", "134774"}, - {"2804:2274::/32", "264101"}, - {"2a09:bac0:94::/48", "13335"}, - {"2001:559:55b::/48", "7922"}, - {"2001:fb0:109f:15::/62", "7470"}, - {"2602:80b:8011::/48", "26229"}, - {"2804:8e4::/32", "52874"}, - {"2804:4a54::/32", "267233"}, - {"2804:6c98::/32", "270479"}, - {"2a11:780::/29", "208861"}, - {"240a:a82a::/32", "144740"}, - {"2001:678:c0c::/48", "15823"}, - {"2001:ee0:c140::/38", "45899"}, - {"2a02:26f7:ba45::/46", "20940"}, - {"2a0b:fd00::/32", "57119"}, - {"2a0d:7100:a::/48", "34672"}, - {"2001:298::/32", "9600"}, - {"2001:df2:c280::/48", "139989"}, - {"2407:1e40:401::/39", "141732"}, - {"240a:a4e5::/32", "143903"}, - {"2804:7cf8::/39", "271530"}, - {"2001:468:2621::/44", "11537"}, - {"2401:d800:2fd0::/42", "7552"}, - {"240a:ab25::/32", "145503"}, - {"2a02:4780:13::/48", "47583"}, - {"2a06:1b00:101::/46", "8302"}, - {"2001:559:1d0::/48", "7015"}, - {"2001:1260:6::/48", "13591"}, - {"2001:4878:8062::/47", "12222"}, - {"2620:1ec:910::/47", "8068"}, - {"2800:120:7::/32", "27843"}, - {"2a02:26f7:d640::/48", "36183"}, - {"2400:e480::/44", "131588"}, - {"2a06:9900::/29", "12552"}, - {"2a10:2f01:2af::/48", "212995"}, - {"2a00:1a30::/32", "25369"}, - {"2a02:26f7:e044::/48", "36183"}, - {"2a10:2f01:310::/44", "39526"}, - {"2405:9800:c981::/35", "45430"}, - {"2a02:26f7:fb88::/48", "36183"}, - {"2a0f:ce00::/29", "208261"}, - {"2001:c38:9057::/42", "9931"}, - {"2402:800:f810::/42", "7552"}, - {"2402:e380:308::/48", "137256"}, - {"240a:a1e7::/32", "143137"}, - {"2605:7900:20::/47", "63442"}, - {"2806:2f0:6021::/46", "17072"}, - {"2001:559:8112::/45", "7922"}, - {"2405:6e00:2ee::/48", "18291"}, - {"2408:840c:a900::/40", "17621"}, - {"240a:a9a9::/32", "145123"}, - {"2804:2538:200::/33", "28183"}, - {"2806:2f0:2462::/48", "17072"}, - {"2001:559:463::/48", "20214"}, - {"2a04:ae00::/26", "1257"}, - {"2a11:f940::/29", "210118"}, - {"240e:3ba:c000::/37", "140315"}, - {"2a04:de40::/42", "20860"}, - {"2001:16e8:1115::/46", "25542"}, - {"2402:fb00:4000::/32", "3300"}, - {"2409:896a:4800::/39", "9808"}, - {"240a:6b::/32", "9605"}, - {"2604:9fc0::/32", "63270"}, - {"2804:5444::/32", "268638"}, - {"2a02:26f0:a301::/37", "20940"}, - {"2001:418:144d::/48", "275"}, - {"240a:a768::/32", "144546"}, - {"2600:1488:a081::/41", "20940"}, - {"2800:160:126f::/43", "14259"}, - {"2a01:664:1b00::/30", "48951"}, - {"2a02:26f7:de85::/46", "20940"}, - {"2001:1248:9822::/44", "11172"}, - {"2404:f4c0:f54e::/48", "140498"}, - {"2408:8756:4c00::/40", "136959"}, - {"2602:fe3f::/32", "21907"}, - {"2602:ff62:104::/47", "61317"}, - {"2a06:500::/29", "38990"}, - {"2409:8959:cb44::/43", "9808"}, - {"2801:80:e0::/48", "53215"}, - {"2803:9c0::/40", "207036"}, - {"2804:15cc::/32", "263411"}, - {"2001:678:668::/48", "39591"}, - {"2001:4c08:2001::/48", "10753"}, - {"2602:fe7e::/36", "32494"}, - {"2801:1ea::/44", "27951"}, - {"2a10:bcc0::/29", "211597"}, - {"2001:9c8::/29", "29518"}, - {"2600:6c3b:405::/42", "20115"}, - {"2804:14d:a04b::/40", "28573"}, - {"2804:5c20::/32", "268890"}, - {"2001:ee0:3020::/39", "45899"}, - {"2604:d600:c7d::/46", "32098"}, - {"2804:6ef0::/32", "270628"}, - {"2a01:c50e:1600::/36", "12479"}, - {"2401:fd80:ffff::/48", "139853"}, - {"2408:8456:1a40::/40", "17816"}, - {"2806:2f0:6261::/46", "17072"}, - {"2408:80f1:40::/44", "138421"}, - {"2804:145c:cc10::/39", "263327"}, - {"2806:32d::/32", "28431"}, - {"2a02:26f7:d945::/46", "20940"}, - {"2001:e60:a808::/40", "4766"}, - {"2401:d800:d930::/41", "7552"}, - {"2804:5808::/32", "268101"}, - {"2a03:2880:f202::/44", "32934"}, - {"2407:ed40::/32", "147079"}, - {"2408:8656:30fb::/48", "17816"}, - {"2409:8004:3013::/42", "24547"}, - {"240a:a01b::/32", "142677"}, - {"2620:66:a000::/48", "30323"}, - {"2804:59e8::/36", "268733"}, - {"2804:6ce4::/32", "270499"}, - {"2a01:190:15e8::/48", "29330"}, - {"2a02:2d8:1:780b::/32", "9002"}, - {"2001:470:56::/48", "7175"}, - {"2001:559:c2c0::/48", "33660"}, - {"2001:4888:a670::/33", "6167"}, - {"2804:880::/32", "28270"}, - {"2a0c:1700:4::/29", "205112"}, - {"2001:559:80f2::/48", "33659"}, - {"2408:80ea:75a0::/41", "17816"}, - {"2605:d580::/32", "46690"}, - {"2620:186:8::/46", "19690"}, - {"2804:5988::/32", "268708"}, - {"2a00:16f8:11::/32", "6461"}, - {"2a02:26f0:4500::/48", "34164"}, - {"2a02:26f0:8601::/39", "20940"}, - {"2a0d:2d42::/29", "62075"}, - {"2a11:b80::/29", "208861"}, - {"2001:67c:105c::/48", "58226"}, - {"2400:a980:a100::/29", "133111"}, - {"240a:ae2c::/32", "146278"}, - {"2605:3600:fffc::/46", "30452"}, - {"2a04:4e40:da10::/41", "54113"}, - {"2a09:2944::/31", "207996"}, - {"2001:df7:ea80::/48", "146972"}, - {"2405:9f40::/32", "139898"}, - {"240a:ae64::/32", "146334"}, - {"2620:17:a000::/48", "32334"}, - {"2804:2550::/32", "264273"}, - {"2a05:6080::/29", "44920"}, - {"2a0f:600::/48", "51044"}, - {"2001:49f0:d0e7::/43", "174"}, - {"2600:1406:6c01::/35", "20940"}, - {"2610:130:1d00::/34", "6122"}, - {"2804:69f0::/32", "270301"}, - {"2001:579:5a44::/43", "22773"}, - {"2001:678:f0::/48", "29695"}, - {"2400:cb00:410::/45", "13335"}, - {"2406:d840::/32", "141322"}, - {"240a:a1ec::/32", "143142"}, - {"240e:980:2a00::/40", "63835"}, - {"2800:160:1fcc::/43", "14259"}, - {"2a00:1eb8:c001::/48", "50065"}, - {"2a02:26f7:f90c::/48", "36183"}, - {"2a02:2e02:11c0::/38", "12479"}, - {"2a0f:a180::/29", "208083"}, - {"2606:1040::/35", "12243"}, - {"2a00:1728:31::/46", "34224"}, - {"2a00:1bf8::/32", "8487"}, - {"2a06:41c0:6::/44", "51559"}, - {"2001:559:8101::/48", "33287"}, - {"2602:fdf0::/36", "396056"}, - {"2606:4100::/32", "11745"}, - {"2800:160:1a9d::/42", "14259"}, - {"2804:1260::/32", "263473"}, - {"2a08:600:e0::/47", "210536"}, - {"2400:bd00:8004::/33", "45267"}, - {"2404:f4c0:f70f::/48", "138517"}, - {"2600:100c:b0f0::/38", "22394"}, - {"2606:ae80:1474::/44", "26762"}, - {"2806:2f0:44c1::/46", "17072"}, - {"2a00:bf00::/32", "5387"}, - {"2a02:ac80:1001::/34", "25145"}, - {"2c0f:f6d0:23::/44", "327687"}, - {"2001:ee0:ed00::/40", "45899"}, - {"2403:89c0:3::/32", "55824"}, - {"2405:d300::/43", "17477"}, - {"2408:840d:2700::/42", "17621"}, - {"2409:8c85:aa5d::/42", "9808"}, - {"2a04:2fc7::/32", "43238"}, - {"2001:67c:1724::/48", "25151"}, - {"2400:9940::/35", "136224"}, - {"2405:9800:c921::/45", "45430"}, - {"2803:ecc0:d00::/34", "264814"}, - {"2a02:cb40::/32", "20546"}, - {"2620:100:5000::/45", "19557"}, - {"2804:222c:400::/32", "264596"}, - {"2804:8220::/32", "272500"}, - {"2806:2f0:9561::/46", "17072"}, - {"2a0f:607:1052::/48", "212425"}, - {"2001:559:2d2::/48", "7016"}, - {"2400:4ec0:9502::/38", "64300"}, - {"2602:fd3f:f00::/48", "6939"}, - {"2606:2800:4111::/46", "15133"}, - {"2804:49e0::/32", "267206"}, - {"2804:55ec::/32", "267965"}, - {"2806:2f0:4181::/46", "17072"}, - {"2a0f:ff40::/29", "207641"}, - {"2001:ee0:8040::/39", "45899"}, - {"2402:e100::/32", "58485"}, - {"240e:438:ac20::/43", "140647"}, - {"2a01:c50f:c40::/35", "12479"}, - {"2a12:4440::/32", "213052"}, - {"2001:250:7034::/48", "24370"}, - {"2001:16d8:afff::/35", "16150"}, - {"2602:fdb7::/47", "396073"}, - {"2800:190:408::/33", "11664"}, - {"2804:1f48::/32", "53016"}, - {"2402:800:fba0::/41", "7552"}, - {"240c:ce82::/25", "23910"}, - {"2a0e:b107:710::/48", "206843"}, - {"2402:6800:760::/48", "55429"}, - {"2804:110::/32", "28590"}, - {"2a01:5f20::/32", "56784"}, - {"2a10:d502::/32", "22773"}, - {"2409:8060:1100::/36", "9808"}, - {"240a:a318::/32", "143442"}, - {"2a09:84c0:500::/32", "8145"}, - {"2001:559:31f::/48", "33491"}, - {"2407:5280:500::/45", "133557"}, - {"2a05:eb80::/29", "39479"}, - {"2001:470:e4::/48", "36103"}, - {"2409:8c54:3100::/33", "56040"}, - {"2600:370f:6061::/46", "32261"}, - {"2800:bf0:a806::/48", "27947"}, - {"2001:67c:3b8::/48", "44786"}, - {"2001:4878:4246::/48", "12222"}, - {"2409:8008:2100::/36", "24547"}, - {"2605:3380:41fc::/46", "12025"}, - {"2a0e:7180::/29", "200023"}, - {"2001:67c:2cd8::/48", "47867"}, - {"2001:1410::/32", "25538"}, - {"240a:a3fb::/32", "143669"}, - {"2804:5d30::/32", "268956"}, - {"2a02:26f7:da89::/42", "20940"}, - {"2a02:26f7:ea8c::/48", "36183"}, - {"2a05:5c00::/29", "51630"}, - {"2001:c38:1000::/34", "9335"}, - {"240a:a2e7::/32", "143393"}, - {"2604:3400:aaac::/48", "209453"}, - {"2604:d600:102d::/43", "32098"}, - {"2804:150:f000::/31", "10954"}, - {"2602:fd11::/36", "40895"}, - {"2803:6604:6000::/37", "28075"}, - {"2804:7cc0::/32", "271516"}, - {"2806:230:2050::/48", "265594"}, - {"2a00:18e0:5::/48", "16509"}, - {"2a00:a360::/32", "60435"}, - {"2001:250:5805::/46", "138371"}, - {"2400:e780::/32", "131198"}, - {"2409:8c85:aa6b::/45", "9808"}, - {"2600:9000:238c::/48", "16509"}, - {"2804:6264::/32", "269294"}, - {"2804:736c::/32", "270914"}, - {"2001:503:d2d::/48", "396566"}, - {"2001:df1:df00::/48", "136805"}, - {"2404:4a00:2095::/35", "45629"}, - {"240a:afd3::/32", "146701"}, - {"2620:110:e000::/48", "16653"}, - {"2a03:afc0:1::/44", "52000"}, - {"2001:678:284::/48", "206885"}, - {"2402:800:3ed3::/44", "7552"}, - {"2602:fe3a:5::/48", "20119"}, - {"2803:2e10::/32", "271968"}, - {"2001:67c:2ae4::/48", "20572"}, - {"2620:7e:c080::/48", "33187"}, - {"2a01:be00::/32", "197248"}, - {"2001:df0:3600::/48", "135014"}, - {"2600:370f:9063::/43", "32261"}, - {"2804:694:3001::/36", "262596"}, - {"2a03:c7c0::/32", "59432"}, - {"2606:ae00:bf80::/33", "7287"}, - {"2a00:7e80::/32", "197197"}, - {"2a02:26f7:de04::/48", "36183"}, - {"2600:6c21:11::/45", "20115"}, - {"2a02:26f7:bf4d::/46", "20940"}, - {"2001:67c:1c8::/48", "48896"}, - {"2001:df5:4500::/48", "137876"}, - {"2001:490:2000::/35", "14803"}, - {"2001:67c:2150::/48", "49750"}, - {"2400:9380:80c0::/44", "136167"}, - {"240e:63:3000::/33", "140312"}, - {"2604:6e00:2800::/37", "13977"}, - {"2a00:5ba0::/29", "680"}, - {"240a:a2f7::/32", "143409"}, - {"240e:44d:b80::/41", "4134"}, - {"2a01:9000::/29", "43424"}, - {"2a01:ade0::/32", "24641"}, - {"2a02:26f0:100::/45", "20940"}, - {"2604:f6c0::/32", "22987"}, - {"2607:fbe8::/32", "7055"}, - {"2804:1a0:2::/36", "28189"}, - {"2a02:a400::/25", "1136"}, - {"2a02:e980:14f::/43", "19551"}, - {"2401:f000:2:200::/56", "23838"}, - {"2409:8c20:5000::/42", "56046"}, - {"240a:a4c3::/32", "143869"}, - {"2804:6f5c::/32", "270655"}, - {"2001:67c:2fd8::/48", "205496"}, - {"2401:c680:b::/45", "133854"}, - {"2402:ef03:2100::/33", "7633"}, - {"2405:f900::/32", "132509"}, - {"2406:fd00:100::/40", "24459"}, - {"2620:0:c12::/45", "22317"}, - {"2a01:111:2003::/48", "8068"}, - {"2a0a:4580::/29", "29670"}, - {"2c0f:2600::/32", "328848"}, - {"2408:843c::/35", "4837"}, - {"2409:8c18::/31", "134810"}, - {"2604:7e00:80::/32", "17378"}, - {"2604:d600:68e::/43", "32098"}, - {"2a05:d9c0::/29", "200970"}, - {"2a10:3144::/30", "398481"}, - {"240e:608::/35", "137691"}, - {"2804:1850::/32", "61929"}, - {"2a00:79e1:806::/42", "36384"}, - {"2a05:c0c0::/29", "49920"}, - {"2a0b:4040::/29", "62217"}, - {"2a10:bb00::/29", "47864"}, - {"2001:fd8:3042::/44", "132199"}, - {"2403:9400:1::/46", "10006"}, - {"240e:ff:c002::/48", "134773"}, - {"240e:108:88::/48", "38283"}, - {"2a0c:ec00::/29", "205255"}, - {"2408:8956:2300::/40", "17816"}, - {"240a:a2a5::/32", "143327"}, - {"240e:967:c600::/36", "4134"}, - {"2800:160:1b5b::/42", "14259"}, - {"2001:5f8:7d04::/38", "5056"}, - {"2001:43f8:9f0::/48", "327705"}, - {"2408:840c:2d00::/40", "17621"}, - {"240a:a8ea::/32", "144932"}, - {"2a00:8740:15::/44", "49037"}, - {"2a02:5740:21::/48", "41564"}, - {"2a04:e4c0:59::/48", "36692"}, - {"2001:559:34f::/43", "33651"}, - {"2001:578:10::/46", "22773"}, - {"2001:4980:4445::/32", "7753"}, - {"2600:6c38:f36::/44", "20115"}, - {"2620:a0:4002:107::/48", "55064"}, - {"2402:800:521d::/42", "7552"}, - {"2804:62e4:faa3::/41", "269326"}, - {"2a02:26f7:b9c8::/48", "36183"}, - {"2a06:cb80::/32", "60804"}, - {"2001:da8:6013::/42", "24355"}, - {"2401:ab80::/32", "38197"}, - {"2409:8030:3802::/40", "9808"}, - {"240e:1a:110::/44", "134769"}, - {"2600:387:c::/43", "7018"}, - {"2a02:2e02:1020::/40", "12479"}, - {"2a0c:9e00::/32", "7018"}, - {"2403:4000::/43", "24122"}, - {"2600:6c10:f40f::/40", "20115"}, - {"2a0b:1980::/29", "206529"}, - {"240a:af7d::/32", "146615"}, - {"2600:380:d410::/38", "7018"}, - {"2600:1007:a100::/44", "6167"}, - {"2602:feda:30::/44", "46997"}, - {"2804:5ac::/32", "10412"}, - {"2a03:9060::/32", "28768"}, - {"2a0a:c9c0::/32", "205818"}, - {"2600:6c10:ff91::/45", "20115"}, - {"2806:230:500a::/48", "265594"}, - {"2a06:24c0::/29", "12576"}, - {"2a0d:e940::/36", "35507"}, - {"2001:250:3015::/44", "24357"}, - {"240e:449::/32", "140553"}, - {"2602:80c:1004::/48", "10796"}, - {"2602:fcf6:ffd::/48", "59417"}, - {"2a05:b40::/29", "57043"}, - {"2a0a:800::/29", "64478"}, - {"2001:579:7114::/41", "22773"}, - {"2001:12f0:7c0::/36", "1916"}, - {"2408:8409:1800::/40", "4808"}, - {"2605:a401:8d3a::/40", "33363"}, - {"2607:b400:100::/36", "40220"}, - {"2800:bf0:a828::/48", "27947"}, - {"2a03:2887:ff27::/44", "63293"}, - {"2a09:6d80::/32", "13984"}, - {"2a02:26f0:4d01::/40", "20940"}, - {"2401:4900:3b70::/44", "45609"}, - {"240a:a083::/32", "142781"}, - {"240a:a50b::/32", "143941"}, - {"2804:bc8::/32", "52829"}, - {"2804:738c::/32", "270922"}, - {"2001:43f8:1f4::/48", "37663"}, - {"240e:56:c000::/37", "38283"}, - {"2001:4858::/32", "32097"}, - {"2406:da70:4000::/40", "16509"}, - {"240a:aafd::/32", "145463"}, - {"2607:f928:15::/46", "14085"}, - {"2620:74:a8::/48", "26134"}, - {"2806:230:5004::/48", "265594"}, - {"2001:918:1ac::/36", "3303"}, - {"2607:f368::/36", "32982"}, - {"2620:1bc:102d::/46", "7726"}, - {"2001:559:c179::/48", "33652"}, - {"2001:c38:9014::/42", "9931"}, - {"2409:811e::/31", "24400"}, - {"2600:370f:2063::/45", "32261"}, - {"2605:dd40:8f90::/41", "398549"}, - {"2001:559:8337::/48", "13367"}, - {"2a01:30::/31", "8875"}, - {"2a0e:fd45:2b60::/48", "210383"}, - {"2001:550:3c01::/39", "174"}, - {"2406:840:fefa::/48", "141694"}, - {"2409:8051:3100::/37", "9808"}, - {"2409:8924:b500::/38", "56046"}, - {"2804:1198::/32", "263426"}, - {"2804:673c:600::/40", "269615"}, - {"2a09:8700::/32", "12586"}, - {"2a0b:4340:3211::/42", "48024"}, - {"2001:504:57::/48", "64213"}, - {"2602:80a:2004::/48", "398351"}, - {"2001:67c:1844::/48", "199846"}, - {"2001:978:5300:1::/47", "174"}, - {"2001:b08:f::/43", "3267"}, - {"240d:c010:74::/47", "139341"}, - {"2600:4405::/30", "6130"}, - {"2800:310::/47", "18678"}, - {"2a02:26f7:ec10::/48", "36183"}, - {"2a03:f80:420::/48", "174"}, - {"2a0d:ce80::/29", "204189"}, - {"2001:1970::/32", "7992"}, - {"2404:92c0:ff00::/48", "48024"}, - {"240b:4003:e::/48", "45102"}, - {"2602:fbcf:c1::/46", "213384"}, - {"2a00:d101::/34", "15704"}, - {"2a02:26f7:e68d::/42", "20940"}, - {"2a0b:4341:a14::/48", "57695"}, - {"2a0e:fd45:1337::/48", "207740"}, - {"2804:3b34::/32", "266135"}, - {"240a:a9aa::/32", "145124"}, - {"2605:ce80::/37", "393713"}, - {"2606:2f40::/32", "399398"}, - {"2a0c:8fc1::/40", "34081"}, - {"2a0e:1c80:4::/48", "47869"}, - {"2607:6400::/35", "30688"}, - {"2a02:26f7:d7c5::/46", "20940"}, - {"2a0c:4181::/32", "56434"}, - {"2804:4d38::/32", "267419"}, - {"2a06:e881:119::/48", "39753"}, - {"2a07:c387::/32", "8288"}, - {"2a0b:3080:20::/32", "206516"}, - {"2a10:c5c0::/31", "211547"}, - {"2001:550:3704::/36", "174"}, - {"2801:80:1c20::/48", "266068"}, - {"2001:67c:7e0::/48", "41399"}, - {"2001:67c:1954::/48", "44574"}, - {"240a:a85e::/32", "144792"}, - {"240e:108:1130::/47", "137693"}, - {"2600:6c10:ffc2::/42", "20115"}, - {"2604:b000::/34", "14638"}, - {"2a09:10c0::/29", "6886"}, - {"2a10:6180::/29", "204790"}, - {"2600:6c34:302::/48", "33588"}, - {"2804:174::/32", "53152"}, - {"2804:f08::/32", "263563"}, - {"2001:559:799::/48", "7922"}, - {"2001:559:822c::/48", "7922"}, - {"2001:1248:70f2::/48", "11172"}, - {"240a:a098::/32", "142802"}, - {"240a:ae74::/32", "146350"}, - {"2600:1406:3601::/36", "20940"}, - {"2a01:8740:1::/48", "203380"}, - {"2a02:26f7:bdc4::/48", "36183"}, - {"2001:1248:9a2e::/43", "11172"}, - {"2400:a040:ffff::/48", "137995"}, - {"2408:8957:9d00::/40", "17816"}, - {"2804:5804::/32", "268100"}, - {"2806:103e:1::/46", "8151"}, - {"2a00:1528::/39", "6696"}, - {"2a09:bac0:382::/48", "13335"}, - {"2400:ba40::/32", "64271"}, - {"2605:5080::/33", "3367"}, - {"2620:b1:8000::/48", "7018"}, - {"2a10:fa80:212::/48", "57050"}, - {"240e:108:11d3::/48", "134756"}, - {"2604:1380:4550::/42", "54825"}, - {"2804:18:850::/44", "26599"}, - {"2c0f:e9e0::/32", "22572"}, - {"2001:df6:a900::/48", "133320"}, - {"2804:a4c::/32", "262268"}, - {"2804:69a0::/32", "270281"}, - {"2a0e:46c7::/48", "34681"}, - {"2001:fe0::/36", "4775"}, - {"2405:6e00:2690::/41", "18291"}, - {"240a:a8ac::/32", "144870"}, - {"2606:2800:4a0c::/46", "15133"}, - {"2a0b:f400::/32", "15698"}, - {"2001:559:a5::/46", "7922"}, - {"2a01:4ba0::/46", "199987"}, - {"2404:bf40:84c1::/42", "139084"}, - {"2409:8077:2905::/28", "9808"}, - {"240a:a86b::/32", "144805"}, - {"2604:6600:38c::/34", "40676"}, - {"2604:8d00::/32", "3700"}, - {"2a00:4b80:3::/48", "41368"}, - {"2a02:7ac0::/32", "42708"}, - {"2a10:c680::/29", "42357"}, - {"2001:da8:3051::/36", "23910"}, - {"2a02:26f7:be45::/46", "20940"}, - {"2a05:5ec0:2::/29", "201364"}, - {"2408:80ea:6400::/41", "17816"}, - {"2600:1488:6481::/32", "20940"}, - {"2605:d000::/32", "15108"}, - {"2a03:5820::/32", "47736"}, - {"2a04:54c0::/29", "202230"}, - {"240e:982:3200::/39", "138991"}, - {"2600:1419:d401::/36", "20940"}, - {"2605:c540:c010::/44", "398378"}, - {"2804:77a4::/32", "271190"}, - {"2a05:4200:a::/45", "21534"}, - {"240a:ab7c::/32", "145590"}, - {"2605:9740::/32", "398052"}, - {"2803:df00::/32", "262199"}, - {"2a0d:7f00::/29", "8560"}, - {"2401:160c::/32", "133090"}, - {"240a:ad66::/32", "146080"}, - {"2804:2e7c::/32", "265348"}, - {"2001:559:8655::/48", "7725"}, - {"2409:8a3c:8a00::/31", "24444"}, - {"2001:559:8505::/48", "7015"}, - {"2001:c20:19::/37", "3758"}, - {"2400:a980:ef::/37", "133111"}, - {"2401:1d40::/48", "23724"}, - {"2401:b200:93::/32", "24186"}, - {"2600:1015:9010::/39", "6167"}, - {"2600:6c04::/40", "20115"}, - {"2800:bf0:a833::/35", "27947"}, - {"2a06:7280::/29", "204096"}, - {"2403:300:a0a::/48", "6185"}, - {"2600:100e:f010::/39", "6167"}, - {"2620:c:4000::/48", "14834"}, - {"2a0f:3740::/29", "60262"}, - {"2409:8904:6770::/40", "24547"}, - {"2804:6ab0::/32", "270353"}, - {"2a03:5342::/44", "8983"}, - {"2402:8400:200::/40", "17820"}, - {"2804:104c::/40", "263629"}, - {"2a03:7580:4100::/32", "28785"}, - {"2a0b:2281::/29", "43685"}, - {"2001:348::/32", "7679"}, - {"2407:16c0::/48", "135905"}, - {"2408:8459:cb30::/41", "17622"}, - {"2409:8057:801::/45", "56040"}, - {"2600:2100::/32", "54858"}, - {"2607:f368:2100::/36", "32982"}, - {"2001:1248:9aaa::/45", "11172"}, - {"2404:c140:154::/38", "138997"}, - {"2409:893c::/31", "24444"}, - {"2600:6c20:11a::/38", "20115"}, - {"2a03:c040:5::/46", "199484"}, - {"2a03:c480::/32", "198095"}, - {"2a0d:dbc0::/29", "212660"}, - {"2001:559:8747::/48", "7015"}, - {"2407:e500:c::/46", "38551"}, - {"240a:aa49::/32", "145283"}, - {"2620:17a:8::/48", "7345"}, - {"2804:4438::/32", "267610"}, - {"2001:550:2208::/46", "174"}, - {"2001:67c:540::/48", "3301"}, - {"2001:df4:5c80::/48", "135752"}, - {"240c:c726::/32", "24364"}, - {"2606:5940::/32", "399599"}, - {"2804:5d40::/32", "268960"}, - {"2600:1417:2c::/48", "9498"}, - {"2a00:4bc0:2130::/46", "16509"}, - {"2a0d:c140::/29", "211332"}, - {"2a0f:4f40::/48", "48749"}, - {"2405:1c0:6000::/46", "55303"}, - {"2a02:4d0::/32", "8816"}, - {"2409:8053:1802::/40", "56047"}, - {"2606:2800:4130::/47", "15133"}, - {"2804:7228::/32", "270836"}, - {"2a02:26f7:db05::/46", "20940"}, - {"2804:7484::/32", "270986"}, - {"2001:67c:84c::/48", "210775"}, - {"2400:6540::/48", "135905"}, - {"240e:981:9100::/34", "4134"}, - {"2401:7c00::/36", "18400"}, - {"240e:848:50::/42", "4134"}, - {"2800:440:70::/48", "27738"}, - {"2804:7768::/32", "271176"}, - {"2a04:2b00:13cc::/48", "60890"}, - {"2400:adce::/40", "9541"}, - {"2408:8456:1600::/42", "17622"}, - {"240a:ae6a::/32", "146340"}, - {"2620:1f7:81d::/35", "18703"}, - {"2a02:58::/32", "25596"}, - {"2400:6300::/48", "17825"}, - {"2600:140f:5801::/39", "20940"}, - {"2604:6600:2608::/39", "40676"}, - {"2a06:3f00::/29", "62163"}, - {"2405:fd80:1300::/40", "135391"}, - {"2803:7000:9000::/33", "52362"}, - {"2a02:26f7:c640::/48", "36183"}, - {"2a03:9600::/32", "31562"}, - {"2407:1e40:6::/38", "141732"}, - {"240a:aef0::/32", "146474"}, - {"240a:af5c::/32", "146582"}, - {"2600:6c3a:7f::/37", "20115"}, - {"2804:8658::/39", "272637"}, - {"2a01:6500:a04c::/43", "42925"}, - {"2a01:ce8d:3000::/32", "51964"}, - {"2a02:26f7:e788::/48", "36183"}, - {"2a0b:6580::/29", "204007"}, - {"2401:d800:2f70::/40", "7552"}, - {"2405:7f00:82a0::/39", "133414"}, - {"2408:8956:e300::/40", "17816"}, - {"2806:2f0:7261::/46", "17072"}, - {"2a03:b640::/32", "9038"}, - {"2001:559:8702::/48", "7015"}, - {"2001:678:1b::/48", "51966"}, - {"2001:df7:c180::/48", "147087"}, - {"2400:7a00::/32", "6939"}, - {"2408:8456:6c40::/39", "17816"}, - {"240a:a08e::/32", "142792"}, - {"240a:a772::/32", "144556"}, - {"2600:380:9400::/39", "20057"}, - {"2600:6c10:c0a::/45", "20115"}, - {"2a00:d480::/32", "16246"}, - {"2606:8000::/32", "17253"}, - {"2800:484:c200::/40", "14080"}, - {"2a0a:d880:102::/48", "16509"}, - {"2001:67c:918::/48", "209460"}, - {"2408:8256:3b96::/44", "17623"}, - {"2604:f980:5100::/40", "19957"}, - {"2a02:1348::/32", "51059"}, - {"2a0d:8d07:119::/32", "207616"}, - {"2a10:5640::/32", "211690"}, - {"2c0f:ec40:6000::/32", "327936"}, - {"2001:67c:2270::/48", "196674"}, - {"2001:930:14a::/32", "15924"}, - {"2405:100::/39", "9905"}, - {"240a:add0::/32", "146186"}, - {"2605:3ac0:1000::/36", "6939"}, - {"2620:15e:101::/46", "30383"}, - {"2804:2fbc::/32", "264909"}, - {"2401:3900::/32", "45447"}, - {"2401:5e40:1100::/36", "63770"}, - {"2605:a404:37::/44", "33363"}, - {"2a00:1610::/29", "34183"}, - {"2a01:6800::/32", "41809"}, - {"2001:559:80ed::/48", "7922"}, - {"2001:559:85ed::/48", "33662"}, - {"2001:4b20:100:598::/64", "65505"}, - {"240a:a0f9::/32", "142899"}, - {"2600:6c46::/32", "20115"}, - {"2a05:4140:201::/48", "211522"}, - {"2408:8456:a210::/42", "134543"}, - {"2603:4:1304::/48", "44273"}, - {"2607:fb90:6d00::/35", "21928"}, - {"2a01:63a0::/32", "199907"}, - {"2a02:26f7:bb09::/42", "20940"}, - {"2a07:db01:40::/42", "204527"}, - {"2001:67c:1901::/46", "6848"}, - {"2404:bf40:a301::/46", "7545"}, - {"2605:8000:91::/38", "4261"}, - {"2804:2674::/47", "264344"}, - {"2804:74d8::/32", "271007"}, - {"2a03:2880:f246::/44", "32934"}, - {"2402:9900:211::/48", "27435"}, - {"240a:ad16::/32", "146000"}, - {"2a0f:c940::/29", "210107"}, - {"2001:579:90fd::/39", "22773"}, - {"240e:44d:4000::/41", "140345"}, - {"2801:158::/36", "52336"}, - {"2806:2f0:3241::/46", "17072"}, - {"2806:2f0:3501::/46", "17072"}, - {"2806:2f0:9361::/40", "17072"}, - {"2a0d:cb80::/29", "61062"}, - {"2a0d:e8c0:2::/29", "35829"}, - {"2001:1b75::/36", "28852"}, - {"2408:8256:3d69::/48", "17816"}, - {"2409:8959:ca54::/39", "56040"}, - {"2600:9000:229f::/48", "16509"}, - {"2a05:e4c0::/31", "39521"}, - {"2001:250:6009::/48", "24364"}, - {"2604:b200::/32", "29"}, - {"2a01:9b80::/32", "12301"}, - {"2a0a:6c0::/29", "47447"}, - {"2001:678:e0c::/48", "212783"}, - {"2403:4e00:30c::/32", "45528"}, - {"2404:1c40:6::/48", "24432"}, - {"2408:8256:379c::/46", "17623"}, - {"2607:f368:320f::/48", "46846"}, - {"2a02:a18::/32", "29492"}, - {"2a02:2e02:3d60::/32", "12479"}, - {"2a02:6ea0:e400::/39", "211612"}, - {"2a04:ac06::/32", "56534"}, - {"2001:67c:1898::/48", "31337"}, - {"2001:67c:2e58::/48", "205376"}, - {"2001:1248:5982::/45", "11172"}, - {"2600:3c0f:2::/45", "63949"}, - {"2602:fea7:d00::/40", "399139"}, - {"2806:230:1012::/48", "265594"}, - {"2c0f:fa10::/32", "30844"}, - {"2404:b680::/32", "135290"}, - {"2600:100a:b140::/40", "22394"}, - {"2600:1801:12::/47", "16552"}, - {"2605:7680::/32", "11042"}, - {"2607:f060:1000::/46", "17017"}, - {"2804:746c::/33", "270980"}, - {"2a02:c6c0::/32", "12722"}, - {"2402:3a80:50::/46", "38266"}, - {"2600:1000:f010::/40", "22394"}, - {"2804:20b0::/32", "264508"}, - {"2806:230:302f::/36", "11888"}, - {"2a02:26f0:8201::/39", "20940"}, - {"2a04:e00:18::/47", "54103"}, - {"2c0f:f7a8:9210::/47", "4809"}, - {"2001:67c:15f4::/48", "41103"}, - {"240a:a660::/32", "144282"}, - {"2a02:850:ffff::/48", "1921"}, - {"2a05:2607::/32", "57948"}, - {"2a07:6cc0:20::/47", "61098"}, - {"2a0f:a940::/29", "60781"}, - {"2a00:6f60::/32", "44923"}, - {"2a00:f826:3::/48", "30823"}, - {"2a02:26f7:c2c5::/46", "20940"}, - {"2a09:12c0::/48", "34775"}, - {"2a0b:e600::/29", "203964"}, - {"2a0e:97c3:467::/48", "20473"}, - {"2a10:4646:6::/48", "47484"}, - {"2001:559:495::/46", "7922"}, - {"2600:8807:a1c0::/36", "22773"}, - {"2600:9000:21cc::/42", "16509"}, - {"2804:6cc::/32", "262607"}, - {"2804:1a04:27::/33", "61832"}, - {"2001:418:149d::/48", "93"}, - {"2001:559:81fb::/48", "7015"}, - {"2001:559:87ae::/47", "7922"}, - {"2600:1419:1a::/48", "20940"}, - {"2620:13f:701c::/48", "59116"}, - {"2a03:f80:7::/48", "56630"}, - {"2a0b:b86:fff0::/44", "50867"}, - {"2a0c:5247:4000::/36", "208861"}, - {"2402:800:9efe::/39", "7552"}, - {"2605:1f00::/32", "14335"}, - {"2606:ae00:a000::/47", "7287"}, - {"2001:df4:5c00::/48", "135724"}, - {"2401:d800:fcd0::/42", "7552"}, - {"2600:100e:9010::/39", "6167"}, - {"2602:fd15::/47", "398465"}, - {"2607:fc58:1:44::/64", "13536"}, - {"2a02:2288::/29", "41765"}, - {"2400:6180:f000::/36", "14061"}, - {"2406:e000:32b::/45", "23655"}, - {"240a:afc9::/32", "146691"}, - {"2607:5300::/32", "16276"}, - {"2a02:888:8148::/47", "48695"}, - {"2a02:1f0::/32", "34080"}, - {"2402:800:4303::/40", "7552"}, - {"2406:2700::/32", "38283"}, - {"240a:a580::/32", "144058"}, - {"2600:1403:6400::/48", "35994"}, - {"2605:640f:85ab::/48", "210935"}, - {"2a02:2e02:1500::/43", "12479"}, - {"2a0e:fd45:da6::/43", "44103"}, - {"2400:1a00:f000::/36", "17501"}, - {"2804:e0c:200::/48", "28176"}, - {"2a00:4a00::/34", "39356"}, - {"2602:fbcf:b1::/48", "209018"}, - {"2804:62f8::/32", "269331"}, - {"2001:678:918::/48", "57166"}, - {"2400:cb00:134::/44", "13335"}, - {"2406:f00:2::/48", "58758"}, - {"2600:9000:1e38::/47", "16509"}, - {"2607:9800:a10a::/33", "15085"}, - {"2806:230:6011::/48", "11888"}, - {"2a06:eec0::/29", "56722"}, - {"2a10:cc42:120::/44", "58336"}, - {"2a11:9c00::/40", "213354"}, - {"2400:1a00:b1e1::/36", "17501"}, - {"2407:9440::/47", "141626"}, - {"2408:8456:3450::/39", "17816"}, - {"2600:1404:d800::/48", "35994"}, - {"2605:a404:7db::/42", "33363"}, - {"2001:678:60::/48", "42"}, - {"2408:8456:b010::/42", "134543"}, - {"2804:279c::/32", "263913"}, - {"2a0b:fc0::/29", "42217"}, - {"2a10:9107:f000::/36", "209588"}, - {"2400:cb00:150::/44", "13335"}, - {"2404:bf40:8142::/42", "139084"}, - {"2604:8580::/32", "32363"}, - {"2800:bf0:3a42::/40", "27947"}, - {"2a0d:e380:2::/29", "204460"}, - {"2001:1978:802::/48", "13895"}, - {"2001:df5:ca80::/48", "132513"}, - {"2409:8c15:2800::/40", "9808"}, - {"2600:9000:1e2e::/48", "16509"}, - {"2602:ff4d::/36", "20412"}, - {"2804:77a0::/32", "271155"}, - {"2a00:1440::/32", "43727"}, - {"2001:559:c395::/48", "33667"}, - {"2001:da8:103c::/41", "24361"}, - {"2408:84f3:ac10::/42", "134543"}, - {"2803:7200:4::/46", "27696"}, - {"2a02:26f7:bd05::/46", "20940"}, - {"2a03:3160::/32", "62149"}, - {"2001:67c:278c::/48", "12732"}, - {"240e:980:2d00::/40", "136197"}, - {"2602:fc4b::/36", "6977"}, - {"2806:230:302c::/48", "265594"}, - {"2a0e:97c0:7e0::/48", "51076"}, - {"2001:428:6402:220::/64", "2639"}, - {"240a:ab47::/32", "145537"}, - {"2800:4e0:c000::/34", "16629"}, - {"2a02:26f7:d401::/46", "20940"}, - {"2001:df0:6380::/48", "135972"}, - {"2401:2d00:12::/48", "17625"}, - {"2403:6000::/39", "24085"}, - {"2405:3200:502::/38", "17639"}, - {"2a0f:4340::/29", "211626"}, - {"2a12:84c0::/45", "207420"}, - {"2001:4db8::/32", "35706"}, - {"2404:e4c0:5105::/48", "54201"}, - {"2806:2f0:6103::/42", "17072"}, - {"2a02:24b8::/40", "52030"}, - {"2a02:f784:20::/48", "25252"}, - {"2409:8c60:ea01::/30", "9808"}, - {"2602:fed3:8::/48", "19969"}, - {"2803:e840::/32", "61498"}, - {"2806:230:fff2::/48", "265594"}, - {"2a00:1228:103::/32", "31148"}, - {"2a0c:9a40:c002::/47", "209022"}, - {"2a0d:d742:40::/44", "210400"}, - {"2607:6100:e1::/48", "54380"}, - {"2804:17b4::/32", "263166"}, - {"2a02:cb00::/29", "43352"}, - {"2620:11f:d00a::/48", "393941"}, - {"2a02:e70:157::/40", "33965"}, - {"2a07:e345:100::/46", "212477"}, - {"2001:1a11:d7::/44", "42298"}, - {"2800:2a0:2401::/35", "27947"}, - {"2a06:f903::/36", "56630"}, - {"2001:428:4003::/48", "26062"}, - {"2804:35e8::/32", "266314"}, - {"2a00:1f19::/32", "197519"}, - {"2a01:618:400::/45", "43519"}, - {"2a02:26f7:ddc5::/46", "20940"}, - {"2a09:f200::/29", "39305"}, - {"2a0e:46c4:2c00::/44", "213326"}, - {"2001:43f8:a30::/48", "20294"}, - {"2a0e:2000::/29", "62068"}, - {"2001:1b40:3334::/32", "20860"}, - {"2409:8051:1900::/37", "9808"}, - {"240e:37e:ac00::/33", "4134"}, - {"2806:3ca::/32", "270124"}, - {"2a0e:2240:4::/48", "60781"}, - {"2001:559:84cf::/48", "22909"}, - {"240a:aa7e::/32", "145336"}, - {"240a:ad94::/32", "146126"}, - {"2603:f020::/25", "397165"}, - {"2801:15:6800::/48", "13489"}, - {"2a02:27b0::/33", "9146"}, - {"2406:1e40:f012::/47", "4837"}, - {"240e:3b3:d000::/36", "134772"}, - {"2600:c0b:1021::/32", "14745"}, - {"2605:a404:db9::/41", "33363"}, - {"2a03:1120::/32", "19419"}, - {"2401:4900:20::/56", "45609"}, - {"2404:2e00::/44", "10226"}, - {"2600:1480:8801::/37", "20940"}, - {"2602:fed2:7020::/46", "39753"}, - {"2001:559:112::/48", "7016"}, - {"2401:d800:470::/40", "7552"}, - {"2402:d340::/32", "38381"}, - {"2402:f180:3::/48", "58579"}, - {"240a:a11c::/32", "142934"}, - {"240a:a3d8::/32", "143634"}, - {"240a:aec1::/32", "146427"}, - {"2607:f8f0:660::/47", "36391"}, - {"2a03:2fc0::/32", "61394"}, - {"2001:67c:1034::/48", "48854"}, - {"2620:0:1600::/48", "4390"}, - {"2804:6e8c::/32", "270604"}, - {"2a02:af40::/29", "60187"}, - {"2a0a:2c0:5::/48", "12998"}, - {"240e:13:8000::/37", "148969"}, - {"2801:80:2250::/47", "267626"}, - {"2a09:bac0:417::/48", "13335"}, - {"2a0a:f940::/32", "48642"}, - {"2a10:2ec7:5000::/36", "208861"}, - {"2001:250:1c00::/44", "138376"}, - {"2001:1248:551b::/42", "11172"}, - {"2402:8100:20e6::/44", "45271"}, - {"240a:aef8::/32", "146482"}, - {"2600:1407:1c::/48", "3257"}, - {"2620:0:2e64::/48", "29997"}, - {"2620:149:fa::/45", "714"}, - {"2803:51c0::/32", "262181"}, - {"2001:978:900::/48", "47132"}, - {"2804:14d:5c77::/40", "28573"}, - {"2806:286:9000::/34", "265524"}, - {"2001:678:24::/48", "201612"}, - {"240e:3bf:dc00::/34", "4134"}, - {"2605:f480::/31", "7979"}, - {"2607:8b00:2::/47", "36454"}, - {"2804:6b3c::/32", "270387"}, - {"2a00:7c00::/32", "41783"}, - {"2a02:c48::/29", "49024"}, - {"240a:a168::/32", "143010"}, - {"2600:3501:5000::/32", "396998"}, - {"2610:20:90e2::/48", "3477"}, - {"2804:78cc::/32", "271266"}, - {"2a02:d8::/44", "44654"}, - {"2400:9380:8003::/48", "4134"}, - {"2804:294c::/32", "52556"}, - {"2a0c:de80::/48", "49453"}, - {"2a0e:f0c0::/29", "200713"}, - {"240a:a3c0::/32", "143610"}, - {"2600:1403:5401::/36", "20940"}, - {"2a00:1f98::/32", "43557"}, - {"2a07:3500:1460::/48", "34108"}, - {"240e:108:1173::/44", "4134"}, - {"2620:8d:c000::/48", "26365"}, - {"2a06:6c0:254::/47", "200738"}, - {"2a0e:a840::/47", "208440"}, - {"2401:cd80:100::/37", "63920"}, - {"2401:d040::/32", "136988"}, - {"2406:3000:a:2::/61", "4657"}, - {"2409:8043:2906::/37", "9808"}, - {"240e:183:8218::/46", "140654"}, - {"2804:4dfc::/32", "268232"}, - {"2804:7d7c:120::/43", "271564"}, - {"2a06:1440::/29", "30892"}, - {"2001:da8:248::/48", "23910"}, - {"2001:4250::/32", "17400"}, - {"2407:fe40::/32", "147184"}, - {"2605:4a00:310::/44", "14361"}, - {"2a02:26f7:d54c::/48", "36183"}, - {"2a07:9240::/29", "34907"}, - {"2001:448a:3070::/33", "7713"}, - {"2607:fd00:4::/48", "32922"}, - {"2801:15e::/44", "19429"}, - {"2a05:1500::/40", "200837"}, - {"2a0c:b641:6::/48", "34872"}, - {"2406:2a40::/32", "140734"}, - {"2620:103:90d2::/47", "15084"}, - {"2620:1bc:1018::/42", "7726"}, - {"2a02:26f7:cf80::/48", "36183"}, - {"2a05:2880::/32", "59827"}, - {"2a0c:4a00:c10::/42", "203351"}, - {"2a0e:97c3:7b8::/48", "20473"}, - {"2605:fd40::/32", "398930"}, - {"2c0f:fb88::/32", "37143"}, - {"2604:9d80:13::/32", "395172"}, - {"2606:2e00:8027::/44", "13213"}, - {"2800:110:1018::/48", "52442"}, - {"2800:bf0:a82a::/48", "27947"}, - {"2a02:2aa8:129::/45", "702"}, - {"2a10:80c0:1000::/48", "211331"}, - {"240a:a9b8::/32", "145138"}, - {"2604:f980:3000::/36", "19957"}, - {"2607:f3b0::/32", "21976"}, - {"2a00:e79::/30", "34602"}, - {"2a11:e87:3000::/33", "210625"}, - {"2001:4878:c048::/48", "12222"}, - {"2408:8456:5c40::/39", "17816"}, - {"2605:b900::/47", "36218"}, - {"2a04:bf80::/29", "198101"}, - {"2001:678:c58::/48", "213080"}, - {"2402:800:3d9b::/41", "7552"}, - {"2408:8474::/28", "4837"}, - {"2600:6c38:e10::/42", "20115"}, - {"2806:250:100::/40", "28554"}, - {"2a01:8840:19::/48", "207266"}, - {"2a02:888:8154::/38", "47794"}, - {"2a02:26f7:e745::/46", "20940"}, - {"2c0f:f2a0::/46", "327849"}, - {"240a:a7a0::/32", "144602"}, - {"240e:979:1e00::/40", "134770"}, - {"2610:38::/32", "21570"}, - {"2a11:9300::/29", "204790"}, - {"2001:559:c3fd::/48", "33667"}, - {"2404:e480::/32", "18127"}, - {"240e:44d:6080::/41", "4134"}, - {"2600:6c10:fc03::/43", "20115"}, - {"2001:1938:4002::/48", "33438"}, - {"240e:44d:1040::/42", "140358"}, - {"2400:cb00:260::/47", "13335"}, - {"2401:4900:2150::/42", "45609"}, - {"2402:3780::/48", "132789"}, - {"2402:8100:20dd::/46", "45271"}, - {"2404:8d04:2643::/32", "10089"}, - {"2408:8256:376a::/48", "17623"}, - {"2800:320:822::/48", "27882"}, - {"2804:5e0::/32", "262414"}, - {"2001:44b8:3082::/48", "7545"}, - {"2402:800:3255::/42", "7552"}, - {"2408:8957:900::/40", "17816"}, - {"2a0b:6b83:4243::/32", "202562"}, - {"2001:4c8:1068::/48", "46482"}, - {"2001:fd8:221::/46", "4775"}, - {"240a:a619::/32", "144211"}, - {"2607:f430::/32", "3663"}, - {"2804:2e1c:e481::/39", "265324"}, - {"2402:800:9d63::/43", "7552"}, - {"2604:d600:64d::/43", "32098"}, - {"2a07:140::/29", "44702"}, - {"2604:980:7000::/46", "21859"}, - {"2803:7f20::/32", "61317"}, - {"2a01:4bc0::/36", "12422"}, - {"2a12:6e40::/29", "209114"}, - {"2c0f:fe20::/32", "18931"}, - {"2600:6c38:b57::/44", "20115"}, - {"2804:5568::/32", "267933"}, - {"2a00:4bc0:2110::/44", "16509"}, - {"2a0e:c6c1::/32", "209419"}, - {"2408:8459:3410::/41", "17623"}, - {"2620:10f:6000::/40", "102"}, - {"2803:a410:9039::/48", "64114"}, - {"2804:54cc::/32", "268670"}, - {"2a03:cfc0::/32", "201814"}, - {"2a04:1120::/30", "3257"}, - {"2001:67c:14a4::/48", "42191"}, - {"2401:d800:f420::/41", "7552"}, - {"240a:a6a7::/32", "144353"}, - {"2607:fe28:2100::/33", "53347"}, - {"2804:14d:1200::/40", "28573"}, - {"2804:314:4030::/46", "61568"}, - {"2604:880:275::/39", "29802"}, - {"2620:c8::/48", "53708"}, - {"2801:11c:e1::/48", "14080"}, - {"2a04:444::/32", "12346"}, - {"2a0a:f582::/32", "51837"}, - {"2804:1560::/32", "52711"}, - {"2a05:e201::/32", "60079"}, - {"2001:438:fffd:125::/62", "397601"}, - {"2001:559:d4::/47", "33652"}, - {"2600:8400::/28", "14813"}, - {"2a02:26f7:c8d9::/42", "20940"}, - {"2001:44b8:205e::/42", "7545"}, - {"2407:d140::/36", "8849"}, - {"2a02:970:1449::/34", "44002"}, - {"2001:559:216::/48", "7016"}, - {"2001:dc7:1001::/34", "24151"}, - {"2408:8956:7700::/36", "17816"}, - {"2409:806a:1100::/36", "9808"}, - {"2a02:f080::/30", "15800"}, - {"2a07:3500:1ac0::/48", "1136"}, - {"2a0e:fd45:40fe::/48", "44103"}, - {"2620:0:2a03::/48", "25046"}, - {"2001:da8:a80a::/45", "24370"}, - {"2402:800:99a9::/43", "7552"}, - {"2402:8100:27b2::/44", "55644"}, - {"240a:af9d::/32", "146647"}, - {"2804:3614::/32", "266325"}, - {"2806:2f0:3563::/43", "17072"}, - {"2001:559:1d1::/46", "7922"}, - {"2001:4878:a151::/48", "12222"}, - {"2001:4998:1c0::/48", "7280"}, - {"2602:feda:2b8::/45", "138210"}, - {"2804:3420::/32", "265437"}, - {"2a00:79e1:f0e::/48", "395973"}, - {"2402:800:358d::/43", "7552"}, - {"2620:107:f0ff::/48", "36564"}, - {"2804:2594::/32", "264289"}, - {"2806:108e:1c::/46", "8151"}, - {"2a03:8860::/32", "200931"}, - {"2001:da8:262::/48", "24350"}, - {"2800:160:1d90::/47", "14259"}, - {"2a00:11c8::/32", "8457"}, - {"2a02:26f7:bc45::/46", "20940"}, - {"2a03:2880:f0fe::/47", "32934"}, - {"2a0f:9201:1::/29", "45009"}, - {"2001:579:a09c::/41", "22773"}, - {"2a0b:9ec0::/32", "44330"}, - {"2c0f:f2b8::/32", "328471"}, - {"2408:8256:2d8c::/48", "17816"}, - {"240a:a576::/32", "144048"}, - {"2600:8807:c722::/40", "22773"}, - {"2001:4c08:2026::/48", "32787"}, - {"2803:a00::/32", "52381"}, - {"2804:14c:7f55::/40", "28573"}, - {"2a00:d1a0::/47", "61317"}, - {"2a01:b100::/32", "43127"}, - {"2001:648:2810::/48", "12364"}, - {"2402:a800:fff1::/44", "9601"}, - {"240a:acb5::/32", "145903"}, - {"2600:1417:8001::/35", "20940"}, - {"2803:b5a0:c000::/34", "269804"}, - {"2804:4c::/32", "8055"}, - {"240e:44d:7000::/42", "140345"}, - {"240e:981:f100::/38", "136197"}, - {"2607:fcf0::/47", "13445"}, - {"2804:154c::/39", "263382"}, - {"2a01:d0:44::/38", "29632"}, - {"2a0c:9a40:8103::/48", "200857"}, - {"2402:3a80:c00d::/43", "38266"}, - {"2801:146::/48", "19429"}, - {"2804:807c::/32", "271753"}, - {"2a00:7240::/30", "16234"}, - {"2001:67c:2734::/48", "198531"}, - {"2600:1407:b801::/33", "20940"}, - {"2605:a401:81bc::/41", "33363"}, - {"2605:f500:8107::/43", "1828"}, - {"2804:2144:a800::/33", "52795"}, - {"2a02:2698:b000::/36", "47911"}, - {"2a02:26f7:d789::/46", "20940"}, - {"2402:3dc0:570::/48", "11179"}, - {"240a:a248::/32", "143234"}, - {"240e:250::/38", "137693"}, - {"2620:1d:2000::/48", "13539"}, - {"2620:171:6a::/48", "715"}, - {"2803:6604:6600::/36", "28075"}, - {"2a0d:200:1c::/48", "44000"}, - {"2c0f:f488::/32", "37363"}, - {"2801:166::/48", "19429"}, - {"2a02:970:1177::/44", "44002"}, - {"2a02:26f7:cd00::/48", "36183"}, - {"2a10:3c80::/29", "212144"}, - {"2600:1017:9010::/39", "6167"}, - {"2607:5380::/32", "53610"}, - {"2804:4918:8300::/33", "267164"}, - {"2a09:33c0::/29", "400522"}, - {"2a12:5840:1f1::/46", "209768"}, - {"240e:352:5c00::/34", "134419"}, - {"2600:370f:3688::/42", "32261"}, - {"2804:151:3::/41", "10954"}, - {"2804:2100::/32", "264526"}, - {"2a02:26f7:d6c4::/48", "36183"}, - {"2001:559:56f::/48", "7016"}, - {"2001:57a:3202::/36", "22773"}, - {"2001:678:894::/48", "209894"}, - {"2400:cb00:440::/47", "13335"}, - {"2606:9800::/32", "13536"}, - {"2804:14c:ccee::/43", "28573"}, - {"2a02:578:7c00::/32", "9031"}, - {"2a07:a905:ffec::/46", "46261"}, - {"2001:559:73::/48", "33287"}, - {"2001:559:8176::/48", "7725"}, - {"2408:8256:3580::/44", "17623"}, - {"240a:a688::/32", "144322"}, - {"2600:140b:9c00::/48", "24319"}, - {"2a02:e38:8100::/40", "14616"}, - {"2a02:26f7:d5c5::/46", "20940"}, - {"2a0d:d9c0::/30", "208948"}, - {"2001:559:83ca::/48", "7922"}, - {"2620:1b:6000::/47", "30150"}, - {"2804:104c:400::/40", "263629"}, - {"2804:4430::/32", "267608"}, - {"2a0e:7d44:f069::/48", "207618"}, - {"2400:e1c0:800::/37", "58659"}, - {"2402:4100::/32", "9326"}, - {"2607:f740:e623::/45", "63911"}, - {"2804:4da4::/32", "268210"}, - {"2001:67c:2fe4::/48", "9002"}, - {"2400:8b00:300::/42", "45727"}, - {"2408:864c::/32", "4837"}, - {"240e:966:5000::/37", "58772"}, - {"2600:1004:b240::/33", "22394"}, - {"2600:1007:f006::/47", "22394"}, - {"2600:1304::/32", "20021"}, - {"2804:4a4c::/32", "267231"}, - {"2a01:b840::/32", "21321"}, - {"2408:8459:6650::/36", "17816"}, - {"240e:3b4:1800::/34", "4134"}, - {"240e:979:8600::/35", "4134"}, - {"2602:fc1c:fa0::/44", "53356"}, - {"2605:cd40::/47", "14363"}, - {"2607:cd80:c000::/36", "6528"}, - {"2806:105e:1f::/42", "8151"}, - {"2a01:b747:800::/39", "714"}, - {"2a06:e040:5902::/34", "198507"}, - {"2a09:9180:fd::/48", "786"}, - {"2405:8a00:ab::/34", "55824"}, - {"2607:fc48:c28::/48", "40009"}, - {"2803:1040::/35", "263751"}, - {"2001:250:343c::/47", "138393"}, - {"2401:93c0:1::/44", "135834"}, - {"2408:8406:9000::/39", "4808"}, - {"240a:acb1::/32", "145899"}, - {"2620:171:25::/48", "42"}, - {"2801:1a6::/37", "271825"}, - {"2804:bd8:ec00::/35", "52838"}, - {"2001:4878:b007::/44", "12222"}, - {"2406:b200::/32", "9326"}, - {"240a:a3ad::/32", "143591"}, - {"2600:1404:d000::/48", "35994"}, - {"2801:80:3870::/48", "270308"}, - {"2804:4c28::/32", "267353"}, - {"2a00:a520::/32", "198570"}, - {"2a02:26f0:6301::/37", "20940"}, - {"240a:a0a5::/32", "142815"}, - {"2604:a00:17::/39", "19318"}, - {"2605:a404:962::/38", "33363"}, - {"2001:ac8:3a::/41", "9009"}, - {"2001:4828::/32", "16942"}, - {"2400:3980::/32", "2497"}, - {"2402:800:921d::/41", "7552"}, - {"2404:bf40:86c1::/48", "7545"}, - {"2806:20d:5030::/45", "32098"}, - {"2a01:8840:4::/47", "207266"}, - {"2001:559:842a::/48", "7016"}, - {"2409:8904:a740::/36", "24547"}, - {"2600:1409:c::/43", "35994"}, - {"2801:1be::/40", "19429"}, - {"2803:c600:20::/32", "27901"}, - {"2804:b18:85::/44", "52941"}, - {"2406:3a40::/32", "131677"}, - {"2406:fc00::/32", "45477"}, - {"2607:6100:1007::/44", "54380"}, - {"2607:f8f0:c00::/40", "16462"}, - {"2804:2144:309::/36", "52795"}, - {"2806:2f0:32c3::/42", "17072"}, - {"2a00:8a03:8000::/43", "28723"}, - {"2a12:74c0::/29", "400522"}, - {"2602:fe8c:0:10::/60", "2711"}, - {"2a0f:c440::/48", "212073"}, - {"2001:1250:e100::/44", "22894"}, - {"2402:800:b1c0::/42", "7552"}, - {"2a03:4440::/32", "62020"}, - {"2001:250:6407::/48", "23910"}, - {"2001:da8:2020::/46", "24357"}, - {"2408:8a05:6000::/47", "17816"}, - {"240e:9b:f024::/46", "140257"}, - {"2803:b920::/32", "266677"}, - {"2804:840:8300::/33", "262680"}, - {"2a02:26f7:d28d::/42", "20940"}, - {"2a03:96c0::/32", "29319"}, - {"2a09:cc80::/29", "35712"}, - {"2001:250:5809::/43", "24363"}, - {"2001:559:86c1::/48", "33491"}, - {"2605:c500::/32", "19515"}, - {"2606:3d40:2::/47", "400097"}, - {"2804:42f8::/32", "267540"}, - {"2a01:8840:c9::/48", "207266"}, - {"2602:fda6:302::/48", "398051"}, - {"2804:35e0::/36", "266312"}, - {"2804:70c0::/46", "270746"}, - {"2a0c:c9c2:ab::/29", "202414"}, - {"2403:c80::/32", "45062"}, - {"2407:4ac0:1001::/33", "142045"}, - {"240a:ad97::/32", "146129"}, - {"2a02:26f7:ed81::/46", "20940"}, - {"2a10:da00::/32", "34576"}, - {"2001:579:1c84::/39", "22773"}, - {"2408:8034::/32", "4837"}, - {"2602:fcc1::/36", "399204"}, - {"2402:800:5171::/44", "7552"}, - {"2409:8069:2908::/38", "9808"}, - {"2620:171:cd::/48", "715"}, - {"2a0a:25c0::/29", "42977"}, - {"2a0b:3b40::/29", "7"}, - {"2a0d:5300::/38", "135391"}, - {"2600:3503:6000::/32", "396998"}, - {"2602:fd92:900::/40", "174"}, - {"2607:9b00::/32", "30041"}, - {"2804:69d8::/32", "270295"}, - {"2a01:37:2000::/35", "8875"}, - {"2a04:9a00:1042::/45", "212157"}, - {"2a01:4d80::/32", "39702"}, - {"2a03:5480::/29", "35223"}, - {"2a0b:2d40::/32", "209135"}, - {"2001:559:d2::/48", "7922"}, - {"2600:140f:9000::/48", "9498"}, - {"2606:3380:100::/46", "53334"}, - {"2a02:6080::/32", "62214"}, - {"2001:559:c3eb::/48", "33668"}, - {"2001:67c:2efc::/48", "31152"}, - {"240e:d:1000::/32", "4134"}, - {"2001:67c:6ac::/48", "201742"}, - {"2001:15c8::/32", "20495"}, - {"2604:5400:4000::/38", "11776"}, - {"2803:1240:65::/34", "27855"}, - {"2804:2488:9000::/33", "264228"}, - {"2a00:1c28::/29", "20764"}, - {"2a05:57c0::/36", "31259"}, - {"2a0d:6180::/29", "200899"}, - {"2c0f:f570::/32", "327980"}, - {"2001:df6:ca00::/48", "136026"}, - {"2405:1400::/32", "38176"}, - {"2605:cdc0:ffff::/48", "398088"}, - {"2a02:4e0:2000::/41", "16135"}, - {"2001:e60:d300::/42", "4766"}, - {"2a04:6440::/29", "35368"}, - {"2c0f:f070::/32", "36912"}, - {"2406:2580::/32", "397086"}, - {"2a02:fb0::/32", "5503"}, - {"2a02:26f7:bc49::/42", "20940"}, - {"2001:559:513::/48", "7015"}, - {"2403:8300:82bf::/48", "24442"}, - {"2405:7400::/32", "9246"}, - {"240e:3b2:ec00::/35", "140314"}, - {"2600:370f:3183::/41", "32261"}, - {"2800:4d0:24a0::/32", "7004"}, - {"2001:559:c25f::/42", "33490"}, - {"2001:559:c4eb::/48", "33662"}, - {"2001:579:90b0::/41", "22773"}, - {"2001:b011:ae00::/33", "3462"}, - {"2401:a580:4::/47", "55403"}, - {"2409:8924:a300::/37", "56046"}, - {"240e:974:ec00::/30", "4134"}, - {"2806:2f0:2061::/48", "22884"}, - {"2a01:c50f:f900::/40", "12479"}, - {"2a02:26f7:c644::/47", "36183"}, - {"2a03:de40::/32", "21057"}, - {"240a:ac6d::/32", "145831"}, - {"2a02:e980:ed::/43", "19551"}, - {"2001:559:3fa::/48", "33491"}, - {"240a:ad96::/32", "146128"}, - {"2804:37d8:3000::/32", "266439"}, - {"2a03:90c0:9981::/48", "199524"}, - {"2404:e740::/46", "139195"}, - {"240e:838:40::/44", "140647"}, - {"2804:521c:2::/48", "268495"}, - {"2c0f:fdd0::/32", "37358"}, - {"2804:4014::/32", "265933"}, - {"2a0c:7fc0::/40", "43997"}, - {"2806:2f0:7243::/42", "17072"}, - {"2a04:f400:3001::/48", "15404"}, - {"2405:17c0::/47", "139331"}, - {"2409:4054:1000::/34", "55836"}, - {"240a:ac0a::/32", "145732"}, - {"2607:700:1700::/32", "22343"}, - {"2800:bf0:3463::/40", "27947"}, - {"2804:544c::/32", "268641"}, - {"2a00:bba0::/32", "207375"}, - {"2001:678:c40::/48", "207754"}, - {"2403:bf00::/32", "7616"}, - {"2600:1413:2001::/36", "20940"}, - {"2801:1c:6800::/48", "13489"}, - {"2a02:26f7:bd90::/48", "36183"}, - {"240a:a974::/32", "145070"}, - {"240a:addf::/32", "146201"}, - {"2a03:98a0::/32", "203449"}, - {"2a04:b907:1::/48", "16509"}, - {"2a10:ee40::/29", "47787"}, - {"2001:1248:9acf::/43", "11172"}, - {"2404:ba80::/32", "38517"}, - {"240a:a6c8::/32", "144386"}, - {"240e:37e:1a00::/34", "140330"}, - {"240e:45c:7600::/40", "131285"}, - {"2600:140b:7801::/38", "20940"}, - {"2a04:8b40::/29", "62126"}, - {"2a11:e380::/29", "49778"}, - {"2001:4c8:110b::/43", "15290"}, - {"2400:58a0::/32", "38008"}, - {"2a0e:b107:23::/48", "44024"}, - {"2001:6e8::/29", "16086"}, - {"2a02:26f7:e205::/46", "20940"}, - {"2a10:5780::/29", "37478"}, - {"2406:f40::/32", "135697"}, - {"2408:8459:6e10::/42", "17623"}, - {"2409:895a:8400::/33", "56040"}, - {"240b:4003:fc00::/48", "45102"}, - {"2600:180c:3002::/33", "16552"}, - {"2804:500c::/32", "268366"}, - {"2a02:2870:8000::/33", "60781"}, - {"2001:67c:2988::/47", "58151"}, - {"2408:8459:3e50::/33", "17816"}, - {"2804:396c::/32", "262846"}, - {"2a07:b6c0::/29", "50782"}, - {"2001:67c:1b30::/48", "15415"}, - {"240a:a8a5::/32", "144863"}, - {"240e:264:3000::/32", "4134"}, - {"2600:1488:6141::/43", "20940"}, - {"2604:61c0:5001::/32", "29831"}, - {"2804:6074::/32", "269168"}, - {"2401:3c0:21e::/48", "45528"}, - {"2806:230:2035::/48", "11888"}, - {"2a01:c50e:e610::/36", "12479"}, - {"2a0c:b641:130::/44", "142438"}, - {"2001:4188:2::/48", "49666"}, - {"2600:6c38:87b::/45", "20115"}, - {"2a0f:4a00::/29", "29066"}, - {"2001:67c:211c::/48", "8447"}, - {"2001:df5:9780::/48", "55736"}, - {"2001:1248:9a3f::/41", "11172"}, - {"2409:8052:3000::/47", "56047"}, - {"2606:900::/32", "12261"}, - {"2804:3f10:6203::/35", "262566"}, - {"2806:32d:b000::/33", "28431"}, - {"2a01:6780:8::/48", "12586"}, - {"2a0a:5c80::/29", "47926"}, - {"2001:67c:192c::/48", "24961"}, - {"2402:e380:31a::/48", "141376"}, - {"2409:8754::/34", "9808"}, - {"2600:370f:7563::/45", "32261"}, - {"2804:45fc:138::/32", "266959"}, - {"2a06:3b00::/48", "50007"}, - {"240a:a0e4::/32", "142878"}, - {"2600:1480:b801::/37", "20940"}, - {"2600:370e:7100::/43", "32261"}, - {"2600:370f:3445::/44", "32261"}, - {"2607:b680::/32", "174"}, - {"2620:1ec:a92::/48", "8068"}, - {"2804:42f4::/32", "267539"}, - {"2400:a980:7d00::/32", "133111"}, - {"2401:7500:300::/40", "33480"}, - {"2406:840:380::/48", "139317"}, - {"2408:8656:3900::/38", "17816"}, - {"2a03:2880:f06b::/45", "32934"}, - {"2001:480:1611::/41", "668"}, - {"2401:4900:4620::/41", "45609"}, - {"2408:844b::/29", "4837"}, - {"2409:805f:100::/36", "9808"}, - {"2606:9500:202::/40", "393423"}, - {"2400:3f60:1::/46", "138467"}, - {"2602:ffc5:10c::/48", "40676"}, - {"2801:80:2380::/48", "267322"}, - {"2804:4ba4::/32", "267320"}, - {"2a01:b740:a0a::/48", "6185"}, - {"2620:11b:4006::/47", "47870"}, - {"2804:c94::/32", "262720"}, - {"2408:8459:4230::/41", "17622"}, - {"2409:8915:8c00::/39", "56044"}, - {"240a:aa8b::/32", "145349"}, - {"2001:559:856d::/48", "33287"}, - {"2001:559:8673::/45", "7015"}, - {"2a02:26f7:c68d::/42", "20940"}, - {"2a07:b2c0::/32", "56911"}, - {"2001:559:739::/48", "33287"}, - {"2001:da8:276::/44", "23910"}, - {"2400:5200:401::/48", "55410"}, - {"2409:8904:36a0::/39", "24547"}, - {"2800:160:1948::/42", "14259"}, - {"2a00:efc0::/32", "29394"}, - {"240e:dd:d800::/37", "139220"}, - {"2600:9000:21e6::/44", "16509"}, - {"2602:ff3b::/36", "395723"}, - {"2607:f6f0:5001::/48", "394749"}, - {"2a02:ee80:4106::/44", "3573"}, - {"2400:6280:10c::/48", "138911"}, - {"240e:108:10f0::/48", "134760"}, - {"2604:d600:c12::/47", "32098"}, - {"2620:10d::/44", "33503"}, - {"2a09:d180::/29", "35710"}, - {"2001:559:7ed::/46", "7016"}, - {"2404:c600::/32", "38195"}, - {"2600:1404:6::/42", "20940"}, - {"2803:d910::/32", "272011"}, - {"2804:41c8::/32", "267456"}, - {"2600:100a:f010::/40", "22394"}, - {"2620:9e:6000::/47", "3970"}, - {"2620:136:3000::/40", "18874"}, - {"2a0e:fd45:40f3::/48", "201106"}, - {"2001:67c:2548::/48", "6782"}, - {"2404:2ec0::/44", "131675"}, - {"2408:8459:ca10::/42", "17623"}, - {"2804:127c::/32", "263479"}, - {"2804:1638::/32", "263276"}, - {"2001:e30:1111::/48", "2697"}, - {"2803:ec40::/32", "263792"}, - {"2401:4900:5d6a::/48", "45609"}, - {"2600:1017:b8e0::/33", "6167"}, - {"2600:40f0:1130::/32", "701"}, - {"2603:fdb0::/25", "397165"}, - {"2001:559:c264::/48", "33652"}, - {"2001:df7:a900::/48", "135987"}, - {"2409:8055:60::/48", "9808"}, - {"240a:a719::/32", "144467"}, - {"2620:104:6000::/48", "2386"}, - {"2803:3680::/32", "27851"}, - {"2a0d:9d00::/29", "50954"}, - {"2001:559:83e0::/48", "33652"}, - {"2602:ff0b::/36", "11071"}, - {"2001:579:b80c::/43", "22773"}, - {"240a:a482::/32", "143804"}, - {"2c0f:2800::/32", "328543"}, - {"2001:559:81b9::/48", "7015"}, - {"2605:2b80::/32", "16832"}, - {"2800:484:2700::/40", "10620"}, - {"2806:2f0:4583::/42", "17072"}, - {"2001:559:86cf::/48", "33657"}, - {"240b:4009::/32", "45102"}, - {"2803:7260:21::/32", "52238"}, - {"2804:2830::/32", "263946"}, - {"2a00:1cc8::/30", "15605"}, - {"2a01:5b40:ac3::/48", "208045"}, - {"2a10:d700::/29", "44874"}, - {"2406:3003:1015::/48", "4657"}, - {"240a:a738::/32", "144498"}, - {"2600:1002:6010::/32", "22394"}, - {"2804:59f8::/32", "268737"}, - {"2806:20d:5220::/47", "32098"}, - {"2a05:f240::/29", "1828"}, - {"2001:559:c228::/48", "33491"}, - {"2804:6a48::/32", "270324"}, - {"2a02:2e02:3a90::/39", "12479"}, - {"2001:559:c027::/48", "33652"}, - {"240e:f9::/33", "4134"}, - {"2600:1408:e800::/48", "35994"}, - {"2804:4994::/32", "267191"}, - {"2001:df6:c080::/48", "141822"}, - {"2001:1450::/32", "5602"}, - {"2403:580::/38", "134715"}, - {"2409:8904::/34", "24547"}, - {"2620:79:e000::/48", "398065"}, - {"2804:1b2:f102::/47", "10429"}, - {"2001:559:853e::/48", "7922"}, - {"2602:feda:b60::/46", "146950"}, - {"2606:9e40::/32", "19523"}, - {"2804:236c:d000::/34", "264161"}, - {"2a02:7040::/32", "199236"}, - {"2402:e300::/46", "131706"}, - {"2405:d540::/32", "140223"}, - {"2605:ab00::/32", "32277"}, - {"2607:f170:20::/44", "13768"}, - {"2804:38e8::/32", "266509"}, - {"2a00:6bc0::/32", "6855"}, - {"2a0a:1d00::/32", "201401"}, - {"2a00:fb40::/32", "198792"}, - {"2001:df3:4300::/48", "133616"}, - {"240a:a728::/32", "144482"}, - {"240a:abb1::/32", "145643"}, - {"2a02:dc80::/29", "13227"}, - {"2001:44b8:2043::/45", "7545"}, - {"2400:a980:1fff::/48", "133515"}, - {"2409:8002:2a00::/40", "9808"}, - {"240a:a5ea::/32", "144164"}, - {"2a00:edc0:1000::/45", "62597"}, - {"2a09:5e00::/29", "209350"}, - {"2001:559:80b6::/48", "33652"}, - {"2001:2000:4000::/40", "3301"}, - {"240a:a2e5::/32", "143391"}, - {"240a:abae::/32", "145640"}, - {"2600:40fc:1017::/30", "701"}, - {"2a00:b2c0:fade::/48", "2611"}, - {"2a01:488:bb0f::/48", "397516"}, - {"2a02:26f7:d708::/47", "36183"}, - {"2001:559:867f::/48", "33652"}, - {"2405:8a00:8000::/48", "55847"}, - {"2602:fce9::/36", "62943"}, - {"2605:a000:1e00::/40", "11955"}, - {"2606:6480::/32", "22113"}, - {"2a0d:580::/32", "206767"}, - {"2001:559:8424::/48", "7922"}, - {"2001:67c:1718::/48", "2263"}, - {"2001:df5:4080::/48", "135839"}, - {"2600:9000:245a::/47", "16509"}, - {"2001:559:c2c6::/48", "33657"}, - {"2408:8456:7600::/42", "17622"}, - {"2409:8904:2740::/36", "24547"}, - {"2a0b:4340:b0::/48", "205058"}, - {"2408:840c:2700::/40", "17621"}, - {"2803:c2c0::/32", "264836"}, - {"2804:3158::/32", "265008"}, - {"2001:559:7b6::/48", "33287"}, - {"2001:67c:1b24::/48", "30931"}, - {"2600:5c00:140::/48", "11351"}, - {"2606:2800:4adc::/46", "15133"}, - {"2600:380:d820::/39", "7018"}, - {"2803:5440:4067::/44", "264738"}, - {"2402:8100:b::/48", "45271"}, - {"2405:201:3200::/39", "55836"}, - {"2a00:a180::/32", "51922"}, - {"2a01:630::/32", "39839"}, - {"2a0a:2780::/31", "206774"}, - {"2001:559:37d::/48", "21508"}, - {"2408:8256:398d::/48", "17816"}, - {"2620:1ec:a93::/39", "8075"}, - {"2a02:26f7:b900::/48", "36183"}, - {"2a02:26f7:c701::/46", "20940"}, - {"2a07:8c00::/32", "208692"}, - {"2001:559:837b::/48", "33652"}, - {"2001:df5:3100::/48", "137854"}, - {"2404:98c0:10::/32", "135259"}, - {"2602:ff87::/36", "36243"}, - {"2804:ccc::/32", "262827"}, - {"2804:269c:fe50::/46", "47065"}, - {"2a00:f7a0:101::/32", "21277"}, - {"2a02:26f7:c5c1::/46", "20940"}, - {"2a0a:3740::/29", "1257"}, - {"2a11:a80::/29", "208861"}, - {"2800:68:2c::/43", "61468"}, - {"2804:14c:5be1::/46", "28573"}, - {"2a01:b000::/44", "35266"}, - {"2a01:ce88::/32", "51964"}, - {"2001:559:c26f::/48", "33662"}, - {"2001:678:16c::/48", "44872"}, - {"2408:8406:2400::/39", "4808"}, - {"240e:45c:3700::/40", "140528"}, - {"2804:13b4::/32", "262288"}, - {"2001:2f0::/32", "7514"}, - {"2607:fb10:5082::/47", "55095"}, - {"2620:6e:8000::/48", "21680"}, - {"2806:2f4:800::/40", "265540"}, - {"2a00:c120::/32", "60331"}, - {"2a02:958::/32", "29008"}, - {"2a0e:97c3:5a2::/48", "20473"}, - {"2a11:3500::/29", "211344"}, - {"2600:370f:74ca::/42", "32261"}, - {"2605:fb80:f000::/48", "50131"}, - {"2804:5864::/32", "268126"}, - {"2a0e:b107:9d0::/46", "213262"}, - {"2001:559:c3ff::/48", "33489"}, - {"2408:8456:3250::/39", "17816"}, - {"2602:808:b001::/48", "40417"}, - {"2804:74a4::/32", "270994"}, - {"2a01:4d60::/32", "30870"}, - {"2a05:3580:f800::/39", "35807"}, - {"2a03:90c0:3f0::/37", "199524"}, - {"2a0f:4507:8000::/33", "204506"}, - {"2001:67c:f8::/48", "49125"}, - {"240a:a699::/32", "144339"}, - {"2804:3508::/32", "265496"}, - {"2001:67c:568::/48", "57533"}, - {"2600:6c38:c0f::/43", "20115"}, - {"2806:3a9:400::/38", "265626"}, - {"2a01:6e80:ffff::/48", "47223"}, - {"2a02:26f0:df00::/48", "36183"}, - {"2001:4870:e00c::/31", "3549"}, - {"240e:3b2:2c00::/35", "134774"}, - {"2602:ff89::/38", "26269"}, - {"2804:712c::/32", "270772"}, - {"2a02:26f7:d741::/46", "20940"}, - {"2a05:8945::/30", "8468"}, - {"2a0c:6900::/32", "208091"}, - {"2001:559:4a2::/48", "33491"}, - {"2001:67c:14b8::/48", "12655"}, - {"2409:8000:2100::/37", "9808"}, - {"2409:8924:6100::/38", "56046"}, - {"2409:8924:c300::/37", "56046"}, - {"2600:381:3900::/40", "13965"}, - {"2a0e:fd45:b80::/41", "44103"}, - {"2400:6280:13c::/48", "132280"}, - {"2400:cc00:4000::/32", "17477"}, - {"2607:f220:600::/44", "26810"}, - {"2607:ffa0:2::/32", "19355"}, - {"2a07:9cc5::/32", "209589"}, - {"2001:559:8102::/48", "33650"}, - {"2001:67c:220c::/48", "48155"}, - {"2402:5c80::/32", "132296"}, - {"2606:8100::/32", "21817"}, - {"2a05:d01c::/36", "16509"}, - {"2001:559:80e9::/48", "33657"}, - {"2405:203:99b::/45", "55836"}, - {"2408:8459:5830::/41", "17622"}, - {"2600:6c39:226::/44", "20115"}, - {"2604:af80:c48::/35", "18859"}, - {"2a01:b480::/32", "35362"}, - {"2001:559:84c3::/48", "7922"}, - {"2408:81a3:ca66::/48", "140707"}, - {"2804:49c:4208::/48", "7162"}, - {"2804:34d8::/32", "265484"}, - {"2a02:788:1::19/29", "12843"}, - {"2a02:26f7:ee84::/48", "36183"}, - {"2001:5d8::/32", "3742"}, - {"2406:8600:ef69::/48", "23879"}, - {"240e:981:7000::/40", "140061"}, - {"2603:90f5:1500::/40", "33363"}, - {"2803:f500::/32", "60022"}, - {"2a02:26f7:f584::/48", "36183"}, - {"2001:559:c03d::/48", "33491"}, - {"2001:df5:dd80::/48", "135192"}, - {"2607:2f00:15::/44", "12025"}, - {"2607:f2f8::/32", "25795"}, - {"2a00:67c0::/32", "57660"}, - {"2a03:5640:f530::/46", "16509"}, - {"2a06:bcc0:1::/45", "203724"}, - {"2602:fc62:ff::/48", "399760"}, - {"2804:14d:b291::/41", "28573"}, - {"2806:2f0:2482::/48", "17072"}, - {"2a03:20::/32", "200561"}, - {"2a05:f480:1000::/34", "20473"}, - {"2001:559:2e8::/48", "33652"}, - {"2001:67c:2950::/48", "3303"}, - {"2001:df1:3e00::/48", "134868"}, - {"2402:8100:25c0::/43", "45271"}, - {"2403:e000:fec1::/39", "9555"}, - {"2404:0:10a7::/41", "17709"}, - {"2408:8957:600::/40", "17622"}, - {"2605:62c0::/32", "395349"}, - {"2620:36:8000::/48", "33246"}, - {"2001:678:6b8::/48", "209869"}, - {"2402:800:931d::/41", "7552"}, - {"2402:8100:27c2::/44", "55644"}, - {"2408:8957:8700::/40", "17816"}, - {"2600:1402:8801::/35", "20940"}, - {"2607:4000:500::/40", "64247"}, - {"2620:107::/40", "11318"}, - {"2a0b:3b00::/29", "50628"}, - {"2600:9000:117c::/48", "16509"}, - {"2804:701c::/32", "270706"}, - {"2a03:5a00:9::/48", "59738"}, - {"2a10:9c00::/29", "30823"}, - {"2001:978:5302::/37", "174"}, - {"2406:d500:14::/48", "136557"}, - {"2801:121::/48", "19429"}, - {"2a02:d38::/29", "50785"}, - {"2a02:8300::/28", "16019"}, - {"2a02:d180::/29", "39090"}, - {"2a06:e881:53f4::/44", "209859"}, - {"2404:c140::/39", "138997"}, - {"2602:fed2:31::/48", "49134"}, - {"2610:e0:5000::/32", "2572"}, - {"2a06:4740::/29", "207627"}, - {"2001:67c:6d8::/48", "62359"}, - {"2001:c10:ff07::/44", "7473"}, - {"2405:a3c0::/32", "139908"}, - {"240a:a971::/32", "145067"}, - {"2604:5400::/35", "11776"}, - {"2806:1040:fd::/32", "8151"}, - {"2a0f:e842::/32", "60781"}, - {"2409:8335::/21", "9808"}, - {"2804:6154::/32", "269228"}, - {"2a01:3a0::/29", "3308"}, - {"2001:559:221::/45", "33491"}, - {"2001:559:83d9::/46", "33287"}, - {"2405:58c0:3400::/38", "133101"}, - {"2409:8020:d1::/35", "56046"}, - {"2620:101:d000::/45", "53582"}, - {"2800:1e0:1024::/41", "7195"}, - {"2804:1e48:9004::/33", "4809"}, - {"2402:800:567f::/40", "7552"}, - {"2408:840d:3800::/42", "17621"}, - {"240a:a3a6::/32", "143584"}, - {"240a:a909::/32", "144963"}, - {"2804:14d:a485::/43", "28573"}, - {"2a03:e140:35::/48", "56674"}, - {"2408:8956:a900::/40", "17816"}, - {"2605:380:19::/48", "42473"}, - {"2a02:26f7:f449::/42", "20940"}, - {"2a03:5640:f513::/44", "16509"}, - {"2a10:de80::/32", "211993"}, - {"2001:559:81f7::/48", "7922"}, - {"2001:1838:1009::/46", "23352"}, - {"2620:118:c000::/42", "237"}, - {"2804:37d8::/34", "266439"}, - {"2a01:7a5::/30", "29066"}, - {"2a10:1646::/31", "206330"}, - {"240a:a52f::/32", "143977"}, - {"2803:8240:2::/40", "52511"}, - {"2a0f:a40::/29", "399975"}, - {"2404:4200::/32", "24536"}, - {"2409:8d18::/31", "134810"}, - {"2600:140f:7000::/48", "9498"}, - {"2a00:14f8::/32", "21056"}, - {"2406:840:e360::/47", "149292"}, - {"2409:8904:2540::/38", "24547"}, - {"2605:dd40:8890::/39", "398549"}, - {"2a0d:5642:115::/48", "35487"}, - {"240a:a2fb::/32", "143413"}, - {"240a:af96::/32", "146640"}, - {"2606:6c00:120::/44", "35994"}, - {"2803:7200:8019::/45", "27696"}, - {"2804:6488::/32", "269433"}, - {"2a02:888:54::/40", "47794"}, - {"2a12:4944::/32", "212123"}, - {"2001:bf8::/32", "378"}, - {"2409:8c54:1840::/44", "9808"}, - {"2804:3d4:8::/43", "262401"}, - {"2a0b:7140::/48", "39378"}, - {"2c0f:ed00:110::/48", "328442"}, - {"2001:df2:5c00::/48", "133947"}, - {"240e:981:f000::/40", "134760"}, - {"2607:f740:e050::/48", "398748"}, - {"2a02:26f0:4201::/39", "20940"}, - {"2001:559:84ce::/48", "33659"}, - {"2400:e500:36::/44", "138322"}, - {"2404:4f80:320::/32", "58715"}, - {"2001:da8:d0::/38", "23910"}, - {"2409:8914:6600::/39", "56044"}, - {"240a:a253::/32", "143245"}, - {"240a:a37e::/32", "143544"}, - {"2600:1008:20::/33", "22394"}, - {"2801:17c::/44", "14080"}, - {"2a02:888:154::/33", "47794"}, - {"2001:559:83f8::/48", "13367"}, - {"2001:1388:8a64::/43", "6147"}, - {"2408:896e::/31", "4837"}, - {"2401:d800:d4e0::/39", "7552"}, - {"2402:df80::/32", "58473"}, - {"240a:aa61::/32", "145307"}, - {"2a02:ff80::/29", "34764"}, - {"2001:579:a00c::/41", "22773"}, - {"2804:1b1:9000::/34", "18881"}, - {"2804:829c::/32", "272529"}, - {"2806:2f0:2083::/43", "22884"}, - {"2a02:c18::/47", "15436"}, - {"2001:da8:4000::/45", "24353"}, - {"2001:df6:2e80::/48", "139504"}, - {"2409:8904:5cb0::/39", "24547"}, - {"2604:d600:130d::/43", "32098"}, - {"2604:f340:1::/46", "398736"}, - {"2804:16c4::/32", "61915"}, - {"2804:3b6c:c030::/35", "266148"}, - {"2806:20d:1607::/43", "32098"}, - {"2a02:26f7:b7c1::/46", "20940"}, - {"2a02:26f7:c804::/47", "36183"}, - {"2c0f:e938::/32", "328714"}, - {"2405:9800:b0::/41", "45430"}, - {"2600:5800:2b04::/48", "33363"}, - {"2a02:738::/32", "5588"}, - {"2001:559:c4b4::/44", "7922"}, - {"2405:7f00:a0a0::/39", "133414"}, - {"2804:3160::/46", "265010"}, - {"2a02:500::/33", "5538"}, - {"2a06:1301:4100::/48", "203004"}, - {"2001:559:5a1::/48", "33287"}, - {"240e:103:8b20::/44", "139462"}, - {"2001:67c:2924::/48", "211960"}, - {"240e:350:5c00::/34", "134419"}, - {"2604:f700:1::/48", "16509"}, - {"2801:1f:f000::/48", "19429"}, - {"2804:204:204::/47", "28186"}, - {"2804:1ecc::/32", "264448"}, - {"2804:73bc:5::/46", "270934"}, - {"2a01:4a0:2000::/46", "51191"}, - {"2400:6280:140::/48", "132280"}, - {"2408:8957:c9c0::/38", "17622"}, - {"240e:4:800::/32", "4134"}, - {"2600:141c:5001::/34", "20940"}, - {"2600:9000:10c1::/45", "16509"}, - {"2602:fed2:712c::/48", "20473"}, - {"2a0f:3cc0::/29", "207936"}, - {"2404:cf00:e001::/35", "38511"}, - {"2406:840:f40f::/48", "142111"}, - {"2409:8004:1900::/34", "24547"}, - {"2607:fa40:3::/32", "25899"}, - {"2620:84:6000::/48", "393936"}, - {"2806:2f0:21c0::/48", "17072"}, - {"2a05:4140:101::/46", "208753"}, - {"2001:250:84b::/48", "23910"}, - {"2001:1938:7001::/44", "33438"}, - {"240a:ac1d::/32", "145751"}, - {"2604:f980:4500::/44", "19957"}, - {"2a02:26f0:cf01::/35", "20940"}, - {"2a02:26f7:de44::/48", "36183"}, - {"2a02:2e02:1580::/42", "12479"}, - {"2c0f:4e00::/32", "328840"}, - {"2001:559:42b::/48", "21508"}, - {"2607:6100:100c::/48", "400053"}, - {"2a01:c50f:a7c0::/36", "12479"}, - {"2600:6c10:f484::/43", "20115"}, - {"2409:8010:1900::/34", "9808"}, - {"240a:a0ed::/32", "142887"}, - {"2806:230:2031::/48", "11888"}, - {"2001:67c:1758::/48", "8820"}, - {"2403:5800:2::/47", "4764"}, - {"2402:800:9bfe::/37", "7552"}, - {"240e:44::/33", "140061"}, - {"240e:37e::/35", "140329"}, - {"240e:67f:1000::/37", "140330"}, - {"2602:101:4004::/46", "20115"}, - {"2a01:c50f:98c0::/37", "12479"}, - {"2a09:4c0:57e1::/32", "58057"}, - {"2402:800:fd90::/42", "7552"}, - {"2a00:8860:500::/40", "207134"}, - {"2a00:a580::/32", "15557"}, - {"2a02:26f0:129::/43", "20940"}, - {"2a06:f740::/29", "203398"}, - {"2001:559:821e::/48", "7015"}, - {"2001:559:855d::/46", "7015"}, - {"2001:1248:8703::/45", "11172"}, - {"240e:c9:6000::/29", "4134"}, - {"240e:ff:e000::/36", "58466"}, - {"2600:6000:f0cb::/48", "11351"}, - {"2803:13e0::/32", "270072"}, - {"2a02:752:3::/29", "42708"}, - {"2a02:26f7:be4d::/46", "20940"}, - {"240a:a7f7::/32", "144689"}, - {"240e:44d:6f00::/42", "140345"}, - {"2604:380::/32", "237"}, - {"2804:4e64:c000::/34", "268258"}, - {"2a02:848::/32", "33868"}, - {"2a02:26f7:f811::/46", "20940"}, - {"2a03:6f00:9::/48", "9123"}, - {"2402:c800:ff72::/47", "18259"}, - {"2600:1488:a481::/39", "20940"}, - {"2605:2800:8301::/33", "6922"}, - {"2804:1448::/32", "263324"}, - {"2001:559:80cc::/48", "7725"}, - {"2400:cb00:34::/47", "13335"}, - {"240a:a279::/32", "143283"}, - {"240e:63:d000::/34", "140314"}, - {"2804:6fc8:8800::/35", "270684"}, - {"2001:559:5c::/47", "7922"}, - {"2001:559:1cd::/48", "20214"}, - {"2001:559:82e6::/48", "33662"}, - {"2001:559:866a::/48", "7922"}, - {"2606:2940::/32", "15017"}, - {"2a01:c50f:2c80::/39", "12479"}, - {"2a0d:2580:1000::/36", "213262"}, - {"2403:300:a26::/44", "714"}, - {"240e:264:2000::/36", "140330"}, - {"2804:204:306::/43", "28186"}, - {"2a02:888:804a::/45", "47794"}, - {"240a:a8ad::/32", "144871"}, - {"2604:880:11::/48", "54540"}, - {"2804:18:6810::/44", "10429"}, - {"2a00:1fc3::/32", "41209"}, - {"2001:559:c0d7::/48", "33652"}, - {"2409:8c70:3ac0::/43", "9808"}, - {"240e:472::/32", "4134"}, - {"2605:4040::/32", "46300"}, - {"2a0f:b300:2001::/46", "42072"}, - {"2001:67c:1090::/48", "199178"}, - {"2a04:5b80:300::/48", "202265"}, - {"2404:bc0:1::/48", "137735"}, - {"2404:bf40:8541::/42", "139084"}, - {"2800:bf0:3601::/40", "27947"}, - {"2a06:8147:cc9a::/48", "199364"}, - {"2404:4a40::/32", "138571"}, - {"2602:feb4:280::/44", "25961"}, - {"2a02:26f7:b989::/48", "20940"}, - {"2a11:3f80::/29", "204790"}, - {"2001:3c8:c10b::/48", "37932"}, - {"2602:fcf1::/36", "398998"}, - {"2804:17e8::/32", "28245"}, - {"2a03:fa80::/32", "15471"}, - {"2600:1f70:e000::/40", "16509"}, - {"2a06:11c0:5::/29", "31169"}, - {"2001:4b22:0:1::/44", "34288"}, - {"2405:6e00:2420::/43", "133612"}, - {"2a06:5a40::/29", "39650"}, - {"2a07:b941:e10::/42", "209103"}, - {"2a09:da40::/29", "211626"}, - {"2a0d:4140::/32", "31463"}, - {"2600:6c10:39::/45", "20115"}, - {"2a00:4802:2600::/44", "13124"}, - {"2a00:b701::/30", "51659"}, - {"2405:4803:2f8::/39", "18403"}, - {"2408:8956:e00::/40", "17622"}, - {"2409:8706::/28", "9808"}, - {"2409:8751:300::/37", "56047"}, - {"2600:140b:bc00::/48", "24319"}, - {"2606:b040:111::/40", "399726"}, - {"2a02:888:144::/46", "48695"}, - {"2a0e:46c4:2c21::/46", "137509"}, - {"2605:a401:82dc::/39", "33363"}, - {"2804:7ea0::/32", "271636"}, - {"2a0b:2640::/29", "208684"}, - {"2001:559:c45e::/48", "33287"}, - {"240e:44d:5980::/41", "4134"}, - {"2409:8054:3022::/45", "56040"}, - {"240a:a87b::/32", "144821"}, - {"2603:c025:4000::/35", "31898"}, - {"2607:fdc8::/44", "30036"}, - {"2a07:a905:fff0::/30", "46261"}, - {"2409:8052:1100::/37", "9808"}, - {"2404:3d00:40d8::/46", "3573"}, - {"2600:9000:2353::/45", "16509"}, - {"2a00:6520::/32", "48739"}, - {"2a0e:9480::/32", "32338"}, - {"2409:8904:8440::/39", "24547"}, - {"2600:5c01:2d39::/48", "20115"}, - {"2620:149:12::/41", "714"}, - {"2804:9c::/32", "262695"}, - {"2a00:f1c0::/32", "21267"}, - {"2a04:3e00:1000::/48", "50311"}, - {"2001:678:7f0::/48", "6730"}, - {"2408:8256:3789::/48", "17816"}, - {"2603:c012:c000::/36", "31898"}, - {"2607:fb10:7232::/32", "2906"}, - {"2607:fc58:3000:44::/64", "13536"}, - {"2a0b:4340:1501::/48", "48883"}, - {"2409:8027:2a04::/46", "9808"}, - {"2803:8e60::/32", "267914"}, - {"2a0a:4140::/29", "60111"}, - {"2a0e:8f02:2040::/44", "212746"}, - {"2a10:e800:2::/48", "50010"}, - {"2001:559:c1e5::/48", "13367"}, - {"2400:8b00:2280::/42", "45727"}, - {"2a00:f00::/32", "8359"}, - {"2605:6000:800::/31", "11427"}, - {"2620:0:5300::/44", "11131"}, - {"2803:d100:e040::/38", "52362"}, - {"2800:bf0:3ac1::/39", "27947"}, - {"2001:1248:8443::/45", "11172"}, - {"2001:44b8:4040::/47", "7545"}, - {"2600:6c21:1d::/46", "20115"}, - {"2607:fb10:7120::/41", "2906"}, - {"2a0f:b506:ff06::/43", "206313"}, - {"2406:2b00::/32", "4049"}, - {"2a03:2881:1b::/32", "32934"}, - {"2406:e000:36a::/43", "23655"}, - {"2607:1e00:1001::/32", "22489"}, - {"2607:fc48:c40::/48", "40009"}, - {"2804:4f74::/32", "268328"}, - {"2a02:26f7:f589::/46", "20940"}, - {"2409:8924:bb00::/37", "56046"}, - {"2409:8c1e:8fa0::/41", "9808"}, - {"2606:8e80:2800::/37", "32133"}, - {"2804:88c::/32", "52872"}, - {"2a00:1940::/32", "16353"}, - {"2a01:56f::/48", "51603"}, - {"2001:559:52::/47", "33651"}, - {"2001:559:c132::/48", "7922"}, - {"2600:5c00:21d2::/38", "20001"}, - {"2a01:c50f:91c0::/36", "12479"}, - {"2001:df5:4c00::/48", "132711"}, - {"240a:ac67::/32", "145825"}, - {"2603:f620::/27", "397165"}, - {"2804:1e38:2018::/33", "264415"}, - {"2a00:4802:2c40::/39", "8717"}, - {"2a02:9c8::/29", "5619"}, - {"2a02:26f7:d5c0::/48", "36183"}, - {"2001:559:c14e::/48", "33652"}, - {"2001:559:c4ca::/48", "33491"}, - {"2001:67c:4e4::/48", "204896"}, - {"2001:4408:4100::/38", "4758"}, - {"2408:8956:9500::/40", "17816"}, - {"2806:6::/28", "6503"}, - {"2a00:eb40::/32", "28889"}, - {"2a03:7380::/38", "13188"}, - {"2001:250:e0e::/43", "138375"}, - {"2407:a200::/32", "56123"}, - {"240a:ac9d::/32", "145879"}, - {"2600:1012:a020::/40", "22394"}, - {"2806:10a6:1e::/32", "8151"}, - {"2001:dce:8001::/38", "23869"}, - {"2001:1248:84d6::/44", "11172"}, - {"2409:8a5c:4e00::/26", "9808"}, - {"2604:880:273::/45", "29802"}, - {"2a02:26f7:cc85::/46", "20940"}, - {"2001:4878:a000::/48", "12222"}, - {"2402:3940::/32", "137252"}, - {"2408:8459:f700::/40", "17623"}, - {"240a:a201::/32", "143163"}, - {"240a:a209::/32", "143171"}, - {"2604:1380:3020::/33", "54825"}, - {"2606:ac80::/32", "393582"}, - {"2a02:940::/32", "21013"}, - {"2a02:ee80:42a9::/48", "3573"}, - {"2800:40:2b::/45", "16814"}, - {"2620:84:e000::/48", "29818"}, - {"240a:a4c6::/32", "143872"}, - {"240e:45c:6c00::/40", "131285"}, - {"2a02:26f7:eac8::/48", "36183"}, - {"2a03:60::/29", "60022"}, - {"240a:a95d::/32", "145047"}, - {"2600:1014:b140::/40", "22394"}, - {"2602:fd32:1::/48", "30496"}, - {"2804:5e30::/32", "269017"}, - {"2a02:26f7:ea41::/46", "20940"}, - {"2a0d:3842:1160::/48", "57629"}, - {"2a10:9100:9::/48", "209588"}, - {"2001:559:83c2::/48", "33659"}, - {"2408:80ea:7a90::/32", "17816"}, - {"2600:9000:2226::/44", "16509"}, - {"2606:6800:3000::/40", "394896"}, - {"2804:199c::/32", "61806"}, - {"2402:6800:740::/48", "38622"}, - {"2408:84f3:9240::/37", "17816"}, - {"240c:c984::/22", "23910"}, - {"2607:f9d0:f000::/40", "11979"}, - {"2001:559:826b::/48", "22909"}, - {"2001:579:b098::/41", "22773"}, - {"2804:70c0:10::/48", "270746"}, - {"2a02:ff0:1000::/40", "12735"}, - {"2a0e:97c0:740::/46", "208260"}, - {"2001:559:188::/48", "7922"}, - {"2804:7be8:c012::/34", "271462"}, - {"2400:3200::/32", "37963"}, - {"2604:2280:4000::/38", "53340"}, - {"2606:8c00:6::/48", "22995"}, - {"2804:9c0::/32", "262989"}, - {"2a02:26f7:ee45::/42", "20940"}, - {"2001:da8:300d::/48", "23910"}, - {"2620:119:5012::/45", "13443"}, - {"2001:1930:d00::/38", "11985"}, - {"2409:8060:8eb::/43", "9808"}, - {"2620:119:5009::/46", "13443"}, - {"2801:80:390::/48", "262382"}, - {"2804:5ab0::/32", "268789"}, - {"2a00:cb20::/35", "60266"}, - {"2a10:dc00::/29", "61193"}, - {"2409:894a:ad00::/31", "24445"}, - {"2a0e:46c6:700::/40", "34924"}, - {"2a0e:8100::/32", "60742"}, - {"2001:1248:883f::/41", "11172"}, - {"2402:28c0:ffae::/48", "137910"}, - {"2404:7840:1::/46", "138638"}, - {"240a:a100::/32", "142906"}, - {"240e:108:1161::/48", "138982"}, - {"2a02:5120::/32", "1257"}, - {"2a0d:4d40:12::/45", "50630"}, - {"2001:218:2300::/35", "2914"}, - {"2001:500:8d::/48", "26710"}, - {"2001:510:20d::/39", "376"}, - {"2001:559:207::/48", "33652"}, - {"2400:9600:8800::/48", "4812"}, - {"240a:a841::/32", "144763"}, - {"2605:8bc0:50::/44", "26695"}, - {"2800:160:11b5::/41", "14259"}, - {"2804:3714::/32", "266388"}, - {"2804:4e84::/32", "268266"}, - {"2c0f:f608:4000::/36", "21351"}, - {"2409:8c1e:27b0::/33", "9808"}, - {"2a0b:4d07:601::/46", "44239"}, - {"2001:44b8:603e::/41", "4739"}, - {"2400:a800::/32", "2514"}, - {"2605:9d80:9061::/48", "4809"}, - {"2a02:26f7:e0cd::/42", "20940"}, - {"2001:550:b02::/37", "174"}, - {"2620:11f:a008::/48", "62491"}, - {"2001:1270:3001::/36", "22908"}, - {"2405:b900:1::/44", "55701"}, - {"2600:1015:b1e0::/33", "6167"}, - {"2607:f380:804::/48", "257"}, - {"2802:0:13::/44", "18747"}, - {"2803:eb80::/32", "61493"}, - {"2a03:efc0:1500::/40", "33438"}, - {"2a0b:6a00::/29", "207056"}, - {"2a10:1040::/32", "59589"}, - {"2001:df1:2100::/48", "141671"}, - {"2804:52bc::/32", "268538"}, - {"2a07:b800::/29", "44066"}, - {"2a10:9540::/29", "211784"}, - {"2001:559:466::/48", "33659"}, - {"240a:a894::/32", "144846"}, - {"2a02:26f7:f044::/48", "36183"}, - {"2001:67c:1754::/48", "201456"}, - {"2806:2f0:5041::/46", "17072"}, - {"2a00:1d36:1200::/39", "47331"}, - {"2a01:89c0::/32", "25428"}, - {"2a04:6a00:d4::/48", "43460"}, - {"2a07:9443::/32", "205055"}, - {"2401:ee00:131::/38", "23951"}, - {"2405:200::/39", "55836"}, - {"240a:af3f::/32", "146553"}, - {"2603:c0fc::/40", "54253"}, - {"2a01:5c40:3::/48", "6807"}, - {"2400:a140:ffff::/48", "131964"}, - {"2409:8053:3100::/37", "9808"}, - {"2602:fc35::/36", "399285"}, - {"2620:136:4000::/44", "19694"}, - {"2804:2e4:8001::/33", "53234"}, - {"2001:67c:1008::/48", "42385"}, - {"2400:9800:7::/44", "24203"}, - {"240a:ac5e::/32", "145816"}, - {"2803:b9e0::/32", "270024"}, - {"2a02:26f7:c78d::/42", "20940"}, - {"2a06:fec0:3203::/48", "205476"}, - {"2a09:a040::/29", "25486"}, - {"2001:578:13f::/36", "22773"}, - {"2001:678:2::/48", "31529"}, - {"240a:ae15::/32", "146255"}, - {"240a:af04::/32", "146494"}, - {"240e:45c:7800::/32", "131285"}, - {"2a00:c700:8000::/34", "24645"}, - {"2a02:449::/32", "34146"}, - {"2a02:26f7:b60c::/48", "36183"}, - {"2a0b:4342:3000::/36", "57695"}, - {"2a10:e400::/29", "39810"}, - {"2001:579:5a54::/44", "22773"}, - {"2402:9800:4000::/48", "131117"}, - {"2406:b400:f10::/48", "18209"}, - {"2600:1003:b058::/45", "6167"}, - {"2602:feda:d40::/44", "38136"}, - {"2a00:edc0:1007::/48", "395403"}, - {"2a04:4e40:8200::/48", "54113"}, - {"2001:559:7e9::/48", "33657"}, - {"2408:80ea:64c0::/38", "17816"}, - {"2409:8914:4800::/34", "56044"}, - {"2607:fe10:3100::/32", "11796"}, - {"2804:1dac:400::/32", "264385"}, - {"2804:5bb8::/42", "268865"}, - {"2804:5de0::/32", "268998"}, - {"2804:6604:8100::/33", "269528"}, - {"2804:667c::/32", "269563"}, - {"2a02:348:1002::/32", "35470"}, - {"2a02:26f7:d840::/48", "36183"}, - {"2a02:7c00::/32", "21060"}, - {"2001:559:81ee::/48", "33287"}, - {"2001:678:f24::/48", "211514"}, - {"2806:211::/32", "28539"}, - {"2001:67c:2ed8::/48", "6766"}, - {"2400:8800:1e8f::/48", "7262"}, - {"2406:ec40::/32", "134469"}, - {"2407:ff80:2000::/32", "135881"}, - {"240e:878:200::/39", "137689"}, - {"2804:cf4::/32", "52579"}, - {"2a02:26f7:bc88::/48", "36183"}, - {"2001:559:5f2::/45", "7922"}, - {"2606:3c80:a400::/35", "33582"}, - {"2804:214:9::/43", "26615"}, - {"2804:7b14::/32", "271409"}, - {"2a05:8280::/32", "202448"}, - {"2a0c:7e40:b397::/48", "20473"}, - {"2a0c:b641:540::/44", "210546"}, - {"2a0e:7400::/29", "39305"}, - {"2001:4d60::/32", "1126"}, - {"2408:8956:e600::/40", "17622"}, - {"2409:8b79::/29", "9808"}, - {"2620:91:c000::/47", "54900"}, - {"2a05:1500:600::/36", "48635"}, - {"2402:3a80:38::/46", "38266"}, - {"2606:ae80:1440::/43", "26762"}, - {"2804:30c4:2000::/32", "264973"}, - {"2a0b:b87:ff13::/48", "210632"}, - {"2c0f:ed38::/35", "328437"}, - {"2404:1a0:2009::/43", "24334"}, - {"2a00:4120:8005::/48", "210587"}, - {"2a02:26f7:f205::/46", "20940"}, - {"2a0c:b340:2::/29", "206262"}, - {"2605:7700::/48", "36024"}, - {"2401:d800:2c10::/42", "7552"}, - {"2402:800:bdb0::/41", "7552"}, - {"2409:803d:2c00::/25", "9808"}, - {"240a:af79::/32", "146611"}, - {"2804:104c:6400::/40", "263629"}, - {"2a10:3240::/30", "208256"}, - {"2001:559:804c::/48", "21508"}, - {"240e:978:8000::/40", "137702"}, - {"2600:4c00:80::/41", "63410"}, - {"2605:1100::/32", "29953"}, - {"2a02:26f0:ad01::/38", "20940"}, - {"2a02:26f7:f345::/46", "20940"}, - {"2a02:6560::/32", "201932"}, - {"2001:1248:5f59::/42", "11172"}, - {"2001:559:8063::/48", "33650"}, - {"2001:67c:2764::/48", "12552"}, - {"2405:7600:4000::/35", "23956"}, - {"2602:fed2:711d::/48", "140244"}, - {"2804:7dd0:2100::/32", "271584"}, - {"2a00:a900:7aff::/32", "60819"}, - {"2a02:26f7:e649::/42", "20940"}, - {"2604:c580::/32", "55230"}, - {"2804:6c6c::/32", "270467"}, - {"2a00:8900::/32", "41625"}, - {"2001:559:2ef::/48", "33652"}, - {"2400:2000:f::/43", "20940"}, - {"2800:160:1676::/44", "14259"}, - {"2a03:db80:4c81::/46", "680"}, - {"2001:df5:f500::/48", "133296"}, - {"240a:a653::/32", "144269"}, - {"2803:32a0::/32", "266858"}, - {"2804:90c::/40", "262617"}, - {"2804:43f0::/32", "267600"}, - {"2a0e:bfc0::/29", "211619"}, - {"2a11:db00::/29", "204790"}, - {"240a:a65e::/32", "144280"}, - {"2804:854:c::/32", "28368"}, - {"2a00:4460::/32", "199374"}, - {"2a02:2e02:8fb0::/41", "12479"}, - {"2405:3bc0::/48", "139182"}, - {"2408:8456:400::/42", "17622"}, - {"2600:9000:11bf::/48", "16509"}, - {"2801:1fc:26::/48", "27951"}, - {"2a00:b320::/48", "9009"}, - {"2a02:26f7:3a::/48", "36183"}, - {"2a02:26f7:e785::/46", "20940"}, - {"2a06:e881:260c::/48", "206740"}, - {"2001:460:7c::/40", "3561"}, - {"2409:8055:20::/48", "9808"}, - {"2800:200:b3b0::/41", "12252"}, - {"2800:bf0:8290::/48", "27947"}, - {"2804:7ab0::/32", "271386"}, - {"2806:230:300c::/48", "265594"}, - {"2401:d800:b120::/41", "7552"}, - {"2407:7c0:9422::/48", "9422"}, - {"2001:559:5f::/42", "7922"}, - {"2600:1400:12::/36", "20940"}, - {"2a00:11c0:9020::/48", "42473"}, - {"2406:f040:131::/48", "131775"}, - {"2602:fe38::/36", "17177"}, - {"2804:1ac:400::/33", "53175"}, - {"2804:6238::/32", "269283"}, - {"2607:ff18::/36", "40630"}, - {"2801:80:37c0::/48", "269560"}, - {"2803:5160::/39", "269730"}, - {"2804:5e2c::/36", "269016"}, - {"2001:559:359::/46", "33659"}, - {"2401:d800:5ec0::/42", "7552"}, - {"2408:8956:9600::/40", "17622"}, - {"240a:abb5::/32", "145647"}, - {"2800:9e0::/32", "26505"}, - {"2804:2ab8::/44", "53180"}, - {"2a10:86c0::/29", "211850"}, - {"2804:bb4::/38", "52812"}, - {"2806:2f0:94c0::/39", "17072"}, - {"2802:3:2::/44", "18747"}, - {"2804:43f4:30::/41", "267601"}, - {"2001:418:1430:100::/56", "20940"}, - {"2001:559:5a9::/48", "33491"}, - {"2001:1248:9a8d::/43", "11172"}, - {"2403:f4c0::/48", "4847"}, - {"2408:8459:9250::/37", "17816"}, - {"240a:a323::/32", "143453"}, - {"240a:a469::/32", "143779"}, - {"240a:a6be::/32", "144376"}, - {"240e:930::/32", "134420"}, - {"2a02:2e02:3180::/36", "12479"}, - {"2a02:6a80::/33", "3245"}, - {"2001:14c0::/32", "8520"}, - {"2404:3d00:4128::/46", "3573"}, - {"2406:daa0:c040::/44", "16509"}, - {"2804:58e0::/32", "268155"}, - {"2a02:26f7:b809::/42", "20940"}, - {"2a02:26f7:bfcc::/48", "36183"}, - {"2409:8055:3035::/41", "56040"}, - {"2600:9c0f::/32", "7979"}, - {"2605:fb80:e000::/36", "16584"}, - {"2a00:b404::/32", "205867"}, - {"2a10:7340::/29", "52126"}, - {"2408:8244:1200::/32", "4837"}, - {"2409:8055:306d::/43", "56040"}, - {"2620:101:f000::/47", "12093"}, - {"2a01:4f80::/29", "51053"}, - {"2a01:9700:1870::/32", "8376"}, - {"2a05:5180::/47", "211262"}, - {"2a0e:d380::/48", "203566"}, - {"2001:250:859::/48", "23910"}, - {"2804:2cfc::/32", "265255"}, - {"2a0f:5707:ab2a::/48", "53356"}, - {"2001:1938:2203::/39", "33438"}, - {"2406:840:ac10::/44", "139317"}, - {"240e:983:1600::/46", "58563"}, - {"2607:6b80:61::/46", "133480"}, - {"2a02:578::/34", "9031"}, - {"2a02:2ba0::/32", "42781"}, - {"2a07:bd80::/29", "43350"}, - {"2001:e60:8000::/37", "4766"}, - {"2408:8957:8900::/40", "17816"}, - {"2a01:9660:1a::/32", "199743"}, - {"2001:559:c31f::/48", "33651"}, - {"240e:3b1:f100::/37", "134775"}, - {"2605:1ec0::/32", "394501"}, - {"2610:e8:1900::/48", "10753"}, - {"2409:804c:3100::/36", "9808"}, - {"240a:a79f::/32", "144601"}, - {"240a:a8a8::/32", "144866"}, - {"2607:f9c8::/32", "26949"}, - {"2401:9c00::/32", "23923"}, - {"2407:5400::/32", "17551"}, - {"240e:3b0:7600::/39", "140313"}, - {"2600:6000:fd40::/48", "11351"}, - {"2602:ffeb::/36", "54819"}, - {"2605:d100::/32", "19844"}, - {"2800:98:1810::/32", "14754"}, - {"2804:4034::/32", "265944"}, - {"2a02:22d0:d::/32", "61323"}, - {"2a02:29a8::/36", "60142"}, - {"2001:559:8677::/48", "33650"}, - {"2001:1248:59ff::/38", "11172"}, - {"2405:e800::/32", "17675"}, - {"2408:8459:dc30::/41", "17622"}, - {"240a:a9ae::/32", "145128"}, - {"2600:1f70:5000::/40", "16509"}, - {"2a0c:e304::/48", "198985"}, - {"2001:559:c386::/48", "33287"}, - {"2804:5944::/32", "268180"}, - {"2a02:26f7:e241::/46", "20940"}, - {"2a02:26f7:f140::/48", "36183"}, - {"2001:559:80d5::/48", "33652"}, - {"2409:8904:35a0::/38", "24547"}, - {"2a02:26f7:b588::/48", "36183"}, - {"2a02:cb43:a000::/47", "20546"}, - {"2001:808::/35", "9112"}, - {"2408:840d:5f00::/42", "17621"}, - {"2409:8704:500::/34", "24547"}, - {"2607:f8f8:1f02::/45", "201106"}, - {"2804:1a30::/38", "61844"}, - {"2804:5efc::/32", "269069"}, - {"2a01:53c0:ff16::/48", "54994"}, - {"2407:1600::/32", "1299"}, - {"240a:a6ec::/32", "144422"}, - {"240e:324::/30", "4134"}, - {"2607:8380::/32", "11961"}, - {"2804:1880::/32", "61936"}, - {"2a01:190:15ed::/48", "16099"}, - {"2001:559:8397::/48", "7015"}, - {"2606:e400::/34", "26271"}, - {"2a00:61c0::/29", "44143"}, - {"2a01:9e00:ac54::/31", "41495"}, - {"2a01:ce89:b000::/33", "51964"}, - {"2001:470:9b::/48", "6939"}, - {"2001:559:25e::/48", "33659"}, - {"2001:df0:273::/48", "58477"}, - {"2602:ffe4:c32::/48", "21859"}, - {"2604:d600:608::/46", "32098"}, - {"2605:ed80::/32", "20303"}, - {"2a01:6da0::/32", "3249"}, - {"2620:113:8083::/41", "3680"}, - {"2801:80:39b0::/48", "270952"}, - {"2001:1a68:b::/48", "42503"}, - {"2804:8c::/33", "28216"}, - {"2804:21f8:13::/41", "262272"}, - {"2a0b:880::/45", "210834"}, - {"2001:fd8:1e4::/46", "132199"}, - {"2401:47c0:2000::/32", "41095"}, - {"240a:aacf::/32", "145417"}, - {"2600:1005:b0b0::/41", "6167"}, - {"2605:a40e:526::/32", "33363"}, - {"2a03:d602::/31", "42487"}, - {"2001:df0:3ac0::/48", "142507"}, - {"2402:800:b9a2::/41", "7552"}, - {"2408:8459:4430::/41", "17622"}, - {"2804:7a08::/32", "271343"}, - {"2a00:ab00:6000::/36", "61976"}, - {"2606:f40:6800::/48", "16509"}, - {"2620:119:fc::/48", "36692"}, - {"2a02:2330::/40", "12578"}, - {"2806:2f0:9863::/39", "17072"}, - {"2a09:bac0:31::/48", "13335"}, - {"2a0b:1580::/29", "206766"}, - {"240a:a6b9::/32", "144371"}, - {"2408:802a:8000::/33", "4837"}, - {"2408:84f3:f650::/44", "17816"}, - {"240a:aae1::/32", "145435"}, - {"2605:1900::/47", "12208"}, - {"2620:100:403e::/47", "25923"}, - {"2804:4024:ff00::/40", "265937"}, - {"2001:4c8:10a2::/41", "15290"}, - {"2406:da12::/36", "16509"}, - {"2801:1a6:800::/37", "271825"}, - {"2a00:1858::/35", "25454"}, - {"2a0b:b900::/29", "62183"}, - {"2603:b0e0:efad::/35", "11796"}, - {"2604:e180::/45", "55002"}, - {"2605:7900:24::/48", "63442"}, - {"2605:a401:8501::/40", "33363"}, - {"2605:ed00:6888::/32", "11427"}, - {"2806:2f0:34a3::/41", "17072"}, - {"2a03:7b20::/32", "48450"}, - {"2001:67c:26fc::/48", "50344"}, - {"2620:98:e005::/46", "399728"}, - {"2804:58d8::/32", "268153"}, - {"2a02:26f7:f700::/48", "36183"}, - {"2400:5280:1800::/34", "63199"}, - {"2600:1404:b800::/48", "35994"}, - {"2602:ffa6:500::/40", "62731"}, - {"2001:559:80a1::/46", "7015"}, - {"2001:67c:554::/48", "12525"}, - {"2001:4998:24::/46", "36647"}, - {"2402:4f00::/33", "58453"}, - {"2806:2f0:1021::/46", "22884"}, - {"2a02:26f7:d940::/48", "36183"}, - {"2a03:220:f000::/48", "209406"}, - {"2a0a:56c4:8300::/47", "42649"}, - {"2001:678:72c::/48", "201697"}, - {"2402:ec00::/32", "7575"}, - {"2806:283:5000::/36", "265515"}, - {"2402:3a80:1e10::/45", "38266"}, - {"240a:a1ef::/32", "143145"}, - {"2804:314:4025::/46", "61568"}, - {"2806:20d:5077::/38", "32098"}, - {"2a02:f7f:4::/46", "198408"}, - {"2a04:e700::/30", "48849"}, - {"2a0a:d6c0:145::/48", "15404"}, - {"2001:470:97::/44", "6939"}, - {"2001:559:861b::/48", "7922"}, - {"2604:a180:4000::/36", "11139"}, - {"2a09:ac80::/29", "209723"}, - {"2001:559:845f::/48", "7922"}, - {"240e:44d:880::/41", "4134"}, - {"2803:3b80:d::/34", "263702"}, - {"2804:81f4::/32", "272488"}, - {"2a06:afc0:2::/48", "41011"}, - {"2803:f720::/32", "266764"}, - {"2a04:3a60::/33", "56467"}, - {"2001:67c:1748::/48", "60799"}, - {"2a02:390::/32", "12496"}, - {"2a03:6087::/32", "16285"}, - {"240a:a92e::/32", "145000"}, - {"2a00:bf40::/32", "57928"}, - {"2a02:26f0:128::/48", "6762"}, - {"2001:559:736::/48", "22909"}, - {"2001:559:c240::/48", "33650"}, - {"2001:1ad0::/32", "24953"}, - {"240a:ab78::/32", "145586"}, - {"2800:160:1dd9::/46", "14259"}, - {"2801:80:1c80::/48", "266161"}, - {"2804:680:19::/37", "262589"}, - {"2804:4580:1100::/32", "266931"}, - {"2a05:ca80::/29", "49603"}, - {"2408:8459:1f30::/41", "17622"}, - {"2408:84f3:3010::/44", "17623"}, - {"2605:64c0::/47", "63294"}, - {"2a00:7600::/32", "21412"}, - {"2a0c:c0c0::/29", "202438"}, - {"2400:4d60::/32", "63793"}, - {"2604:2e8e::/34", "30036"}, - {"2604:5200::/48", "32504"}, - {"2a03:3820::/32", "201838"}, - {"2401:d800:bc20::/41", "7552"}, - {"2800:800:790::/41", "26611"}, - {"2a09:ba00:4::/48", "61323"}, - {"2c0f:f4e8::/32", "327750"}, - {"2001:67c:10e4::/48", "2119"}, - {"2407:c2c0::/32", "142631"}, - {"2001:559:396::/48", "7725"}, - {"240e:908::/33", "4134"}, - {"2804:f6c:2021::/41", "263585"}, - {"2a10:a200::/48", "16509"}, - {"240a:a4af::/32", "143849"}, - {"2620:11a:a029::/46", "36040"}, - {"2803:2a00:1000::/37", "27895"}, - {"2804:640:7b::/45", "262713"}, - {"2804:29b0:2000::/35", "61577"}, - {"2804:30bc::/32", "52609"}, - {"2403:9800:7f01::/48", "4648"}, - {"240a:a531::/32", "143979"}, - {"2620:101:200b::/45", "16417"}, - {"2a04:5201:2::/48", "200740"}, - {"2402:4400::/32", "44356"}, - {"2404:6380::/48", "23650"}, - {"2600:1806:20::/44", "16552"}, - {"2804:53b8::/32", "268602"}, - {"2a00:1388:1000::/40", "8328"}, - {"2a00:aca0::/32", "49223"}, - {"2401:d800:5030::/41", "7552"}, - {"240e:108:42::/48", "58466"}, - {"240e:3bd:c000::/37", "140315"}, - {"240e:7b2:1000::/32", "4134"}, - {"2600:1012:b130::/44", "22394"}, - {"2605:f980::/32", "7753"}, - {"2804:81c4::/32", "272475"}, - {"2a02:26f7:df81::/46", "20940"}, - {"2a03:6947:100::/40", "50973"}, - {"2a12:a307::/48", "23748"}, - {"2400:ac40:b60::/43", "136255"}, - {"2408:8957:3f00::/40", "17816"}, - {"2606:9500:1000::/36", "393423"}, - {"2804:e50::/32", "53067"}, - {"2a0c:36c2::/31", "9009"}, - {"2600:1010:6010::/32", "22394"}, - {"2620:107:901d::/42", "22787"}, - {"2800:160:116c::/46", "14259"}, - {"2402:5600::/32", "10083"}, - {"2404:bf40:e303::/37", "139084"}, - {"240a:aee4::/32", "146462"}, - {"2803:7d80:5021::/41", "11664"}, - {"2a01:3f1:c00::/34", "8674"}, - {"2001:559:87b6::/48", "7015"}, - {"2600:1007:d040::/40", "22394"}, - {"2605:ed00::/33", "11427"}, - {"2800:800:5f0::/44", "26611"}, - {"2a02:26f7:d280::/48", "36183"}, - {"2a04:f580:9250::/48", "4809"}, - {"2404:a8:10::/48", "24514"}, - {"2408:840c:6100::/40", "17621"}, - {"2001:df5:7800::/48", "133465"}, - {"2402:1d40::/46", "58826"}, - {"2600:1406:1601::/36", "20940"}, - {"2a02:2b60::/45", "42947"}, - {"2a02:c2c0::/29", "12513"}, - {"2a0f:3103::/32", "29182"}, - {"2001:559:832e::/48", "33651"}, - {"2001:559:c15e::/48", "33657"}, - {"2001:fd8:21c8::/38", "4775"}, - {"2408:803e::/32", "4837"}, - {"2801:80:1910::/48", "264958"}, - {"2804:6914::/32", "270247"}, - {"2a01:98::/32", "8190"}, - {"2001:559:c2b9::/48", "33490"}, - {"2001:678:348::/48", "43861"}, - {"2405:54c0::/48", "56150"}, - {"2a05:fdc0::/35", "42313"}, - {"2a10:3c40::/29", "204790"}, - {"2409:8915:3800::/39", "56044"}, - {"2804:14c:9d00::/40", "28573"}, - {"2804:75d4:2800::/32", "271072"}, - {"2a04:1b00:c::/47", "61005"}, - {"2001:408:10::/44", "6250"}, - {"2001:67c:229c::/48", "212002"}, - {"2408:8a06:100::/47", "9929"}, - {"2604:fe80::/32", "7030"}, - {"2610:a1:1024::/48", "397226"}, - {"2a01:1d0::/32", "50670"}, - {"2001:16d8:baff::/39", "16150"}, - {"2001:49f0:d010::/44", "174"}, - {"2804:820::/32", "262352"}, - {"2a02:26f7:b3c8::/48", "36183"}, - {"2a04:600::/29", "61161"}, - {"2a0a:7040::/32", "203712"}, - {"2001:678:cb4::/48", "56396"}, - {"2404:3800:f::/48", "38719"}, - {"2602:ffc5:158::/48", "40676"}, - {"2620:107:90d0::/48", "22787"}, - {"2804:7288::/32", "270859"}, - {"2405:e9c0::/32", "135572"}, - {"2604:a300::/32", "17056"}, - {"2804:14d:4cb5::/46", "28573"}, - {"2804:1d20:2600::/32", "264349"}, - {"2001:559:c266::/48", "33287"}, - {"2400:adc0:c000::/47", "9541"}, - {"2401:2680::/32", "23776"}, - {"2401:d800:d2b0::/41", "7552"}, - {"240a:a8f3::/32", "144941"}, - {"2803:17e0::/32", "52468"}, - {"2a11:6c0:100::/32", "211083"}, - {"2a12:a307:3::/48", "138181"}, - {"2600:9000:a100::/48", "16509"}, - {"2a02:330::/45", "31261"}, - {"2001:978:a02::/35", "174"}, - {"2400:9380:9009::/46", "4809"}, - {"240a:a3e7::/32", "143649"}, - {"240a:a446::/32", "143744"}, - {"2001:559:82db::/48", "13367"}, - {"2402:a00:98::/39", "45916"}, - {"2402:f800:ef01::/40", "7602"}, - {"2803:9800:b501::/45", "11664"}, - {"2804:5ee4::/32", "269063"}, - {"2a02:2608::/32", "44306"}, - {"2a09:ee40::/29", "201011"}, - {"2a0b:b680::/29", "204790"}, - {"2001:4c48::/29", "5483"}, - {"2400:8280::/32", "58511"}, - {"2400:b000:800::/48", "132796"}, - {"2600:1408:6c01::/38", "20940"}, - {"2a02:888:140::/46", "48695"}, - {"2408:8459:1a50::/39", "17816"}, - {"240e:108:27::/48", "133774"}, - {"240e:3b5:9c00::/34", "140310"}, - {"2600:1480:4000::/40", "33905"}, - {"2600:6c47:8000::/28", "20115"}, - {"2a0c:8540:6::/48", "42198"}, - {"2407:d6c0:1::/46", "136785"}, - {"2408:8459:3010::/41", "17623"}, - {"2409:8054:19::/45", "56040"}, - {"240a:a36b::/32", "143525"}, - {"240a:a471::/32", "143787"}, - {"240a:a63a::/32", "144244"}, - {"2a02:26f7:d6c9::/46", "20940"}, - {"2a0a:f480::/29", "206576"}, - {"2001:df0:c480::/48", "138398"}, - {"2402:8100:20ca::/43", "45271"}, - {"2600:1406:35::/48", "35994"}, - {"2a00:f500::/29", "13194"}, - {"2400:c700:a001::/35", "55644"}, - {"240e:a64::/35", "140329"}, - {"2620:19:2000::/48", "803"}, - {"2a0e:1c80:6::/48", "3399"}, - {"2a11:c800::/29", "42375"}, - {"2409:8a50::/38", "56047"}, - {"240e:44d:5f00::/41", "140345"}, - {"2600:370f:352d::/41", "32261"}, - {"2602:fc26:4::/44", "211562"}, - {"2800:484:c600::/40", "10620"}, - {"2803:9800:b507::/36", "11664"}, - {"2804:25c4::/32", "264301"}, - {"2804:673c:c300::/40", "264598"}, - {"2804:68e8::/32", "269724"}, - {"2001:250:1001::/43", "24353"}, - {"2001:67c:10f8::/48", "199233"}, - {"240a:a29b::/32", "143317"}, - {"2606:2700::/32", "54044"}, - {"2804:7d04::/32", "271533"}, - {"2408:840d:d400::/42", "17621"}, - {"2a06:d581:1000::/36", "13283"}, - {"2a07:b700::/29", "57626"}, - {"2001:579:e041::/40", "22773"}, - {"2606:6a00::/32", "14280"}, - {"2a07:cb81::/32", "15404"}, - {"2a0f:16c0::/29", "60262"}, - {"2001:41c8::/31", "35425"}, - {"2804:a54::/47", "262664"}, - {"2a02:2e02:2b00::/37", "12479"}, - {"2a04:6fb0::/31", "58005"}, - {"2001:559:7e8::/48", "21508"}, - {"2001:1a11:ed::/46", "8781"}, - {"240a:a0c1::/32", "142843"}, - {"240a:ad75::/32", "146095"}, - {"2600:6c38:73a::/47", "20115"}, - {"2603:c0fa:4000::/35", "20054"}, - {"2a02:26f7:e180::/48", "36183"}, - {"2a0c:bec0::/29", "12735"}, - {"2001:559:765::/48", "7922"}, - {"2001:559:84a4::/48", "7016"}, - {"2001:67c:2010::/48", "21344"}, - {"2403:e800:516::/44", "4637"}, - {"2804:3c78::/48", "266214"}, - {"2001:978:801:1::/40", "174"}, - {"2401:d800:fbf0::/37", "7552"}, - {"2402:b280::/32", "133934"}, - {"240a:a923::/32", "144989"}, - {"2620:186:4::/46", "396016"}, - {"2801:80:3741::/48", "269406"}, - {"2804:5c4c::/32", "268900"}, - {"2806:102e:10::/46", "8151"}, - {"2a0c:9a40:8113::/45", "204438"}, - {"2a11:f980::/29", "204790"}, - {"2001:559:c4a8::/48", "7922"}, - {"2600:1012:9000::/43", "6167"}, - {"2606:6c0::/32", "399049"}, - {"2a0b:8580::/29", "206429"}, - {"2a10:780::/32", "200780"}, - {"2001:df0:2ee::/48", "55384"}, - {"2405:d800::/39", "24247"}, - {"2a09:cd45::/30", "202448"}, - {"2001:678:a48::/48", "209163"}, - {"2001:67c:1920::/48", "12552"}, - {"2408:8256:319c::/48", "17816"}, - {"240a:a33e::/32", "143480"}, - {"240a:a42c::/32", "143718"}, - {"240a:ada2::/32", "146140"}, - {"2600:370f:74e3::/45", "32261"}, - {"2a05:1a00::/34", "43754"}, - {"2001:559:298::/48", "33652"}, - {"2001:67c:64::/48", "2121"}, - {"2a0d:5642:104::/47", "35487"}, - {"2c0f:efa0::/48", "36902"}, - {"2001:be7::/32", "21233"}, - {"2001:1210::/32", "2549"}, - {"2001:44a8::/32", "23836"}, - {"2804:e30:409::/43", "11338"}, - {"240a:acee::/32", "145960"}, - {"2804:28e4:c::/43", "28260"}, - {"2001:559:81b7::/48", "33650"}, - {"2400:7180::/32", "45671"}, - {"240a:a1f5::/32", "143151"}, - {"240a:aada::/32", "145428"}, - {"240c:ca28::/31", "24363"}, - {"2620:12d:e02f::/48", "3356"}, - {"2a02:e7c0::/29", "50599"}, - {"2a0d:2146:8580::/45", "39526"}, - {"2001:559:8572::/48", "7016"}, - {"2001:df3:ac00::/47", "63972"}, - {"2408:8957:3a00::/40", "17622"}, - {"2409:8053:2c03::/38", "9808"}, - {"240a:a61d::/32", "144215"}, - {"2600:c01::/32", "14743"}, - {"2605:1000::/32", "19662"}, - {"2001:388::/44", "7575"}, - {"2001:678:2d0::/48", "25482"}, - {"2001:cd8::/33", "4780"}, - {"2402:3a80:1860::/40", "38266"}, - {"2408:80ca::/32", "17816"}, - {"2804:73b8::/32", "270933"}, - {"2a0c:2f07:72::/47", "208024"}, - {"2c0f:efe0::/32", "328366"}, - {"2001:559:2a5::/48", "33491"}, - {"2001:1b38::/32", "8554"}, - {"2a00:1560:11::/45", "29684"}, - {"2001:559:193::/48", "33287"}, - {"2001:4878:204::/48", "12222"}, - {"2402:3a80:1400::/42", "38266"}, - {"2404:4e00:c000::/48", "32787"}, - {"2804:6280:5::/32", "269301"}, - {"2804:71a8::/32", "270803"}, - {"2a00:4120:8000:7::/45", "20804"}, - {"2a0e:63c0::/29", "208516"}, - {"2001:559:812c::/48", "33652"}, - {"2001:559:857a::/48", "7016"}, - {"2001:48b0::/32", "2497"}, - {"240a:a7e3::/32", "144669"}, - {"2803:d200::/32", "28086"}, - {"2a00:83a0::/32", "60772"}, - {"2a10:ca00:3::/45", "212217"}, - {"2001:df0:dd80::/48", "135839"}, - {"2620:0:dc0::/49", "683"}, - {"2403:2500:8000::/48", "36236"}, - {"2409:8089:1021::/23", "9808"}, - {"2800:160:112d::/43", "14259"}, - {"2804:441c::/32", "267603"}, - {"2804:7f8c:1130::/32", "271695"}, - {"2a02:26f7:1e::/48", "36183"}, - {"2001:67c:2750::/48", "200745"}, - {"2408:8956:dd00::/40", "17816"}, - {"2600:6c38:b5c::/42", "20115"}, - {"2806:230:6025::/48", "11888"}, - {"2a04:5b82:9::/45", "202265"}, - {"2001:559:56d::/48", "7922"}, - {"2001:df0:e4::/48", "56026"}, - {"2409:8435::/23", "9808"}, - {"240a:aff9::/32", "146739"}, - {"240e:45c:c500::/40", "140536"}, - {"2a05:5f00::/30", "203170"}, - {"2a01:5640::/32", "43207"}, - {"2a02:26f7:c208::/48", "36183"}, - {"2001:559:96::/48", "33287"}, - {"2401:cf80:600e::/41", "55303"}, - {"2402:800:77a2::/36", "7552"}, - {"2402:3380::/32", "134119"}, - {"2a01:b7c0::/32", "60384"}, - {"240a:aeaa::/32", "146404"}, - {"240a:aec2::/32", "146428"}, - {"2804:10c8:d002::/44", "263649"}, - {"2a00:13d8::/29", "3212"}, - {"240a:a8b4::/32", "144878"}, - {"240e:108:1080::/48", "132153"}, - {"2600:1009:b170::/40", "22394"}, - {"2803:7a80::/36", "263713"}, - {"2a0a:acc0::/48", "6369"}, - {"2401:d800:780::/42", "7552"}, - {"2602:fe19:4017::/34", "26073"}, - {"2803:6f00::/36", "14117"}, - {"2a02:26f7:e7c0::/48", "36183"}, - {"2a07:6b40::/29", "559"}, - {"2a0e:8480::/29", "42156"}, - {"2001:978:9e00:1::/34", "174"}, - {"240a:a811::/32", "144715"}, - {"2604:d600:655::/44", "32098"}, - {"2a0a:e200:1911::/38", "33438"}, - {"2001:559:250::/46", "33652"}, - {"2400:c180:19::/48", "132513"}, - {"2405:73c0::/48", "41095"}, - {"2804:3d4:1a::/42", "262401"}, - {"2c0f:f6b0::/32", "327728"}, - {"2001:1398:274::/48", "52234"}, - {"2800:b90::/32", "263246"}, - {"2a01:664:400::/36", "48951"}, - {"2001:67c:1ba4::/48", "59586"}, - {"2400:c700::/44", "55644"}, - {"240a:a402::/32", "143676"}, - {"2803:ae0::/32", "269930"}, - {"2804:2f44::/32", "264881"}, - {"2a03:c2c0::/32", "61205"}, - {"2a0e:b107:3ef::/48", "212034"}, - {"2001:559:81de::/47", "33651"}, - {"2409:8020:10d1::/34", "56046"}, - {"240a:a6aa::/32", "144356"}, - {"2800:160:1d02::/44", "14259"}, - {"2a07:f0c0::/29", "200768"}, - {"2a00:6060:b001::/33", "60983"}, - {"2a02:5d00::/32", "196861"}, - {"2c0f:2e00:400::/32", "328578"}, - {"2600:380:cc00::/41", "20057"}, - {"2600:100f:f100::/44", "6167"}, - {"2804:18:7060::/39", "10429"}, - {"2a07:44c0::/29", "203081"}, - {"2001:559:8a::/48", "21508"}, - {"2001:559:c12a::/48", "33287"}, - {"2401:d800:27a0::/41", "7552"}, - {"2600:1003:f840::/44", "6167"}, - {"2604:be40::/32", "13857"}, - {"2a00:91c0::/32", "204558"}, - {"2001:559:8270::/48", "7016"}, - {"2001:559:c35d::/48", "7016"}, - {"2001:678:104::/48", "20609"}, - {"2001:67c:17e4::/48", "2119"}, - {"2400:9380:a002::/47", "23764"}, - {"2409:8050:2002::/40", "56047"}, - {"2409:8959:ce44::/43", "9808"}, - {"240a:a11b::/32", "142933"}, - {"2804:3fd4:3000::/33", "265918"}, - {"2804:54dc::/32", "268674"}, - {"2a00:1c48::/31", "12695"}, - {"2a00:cee4:dcd::/31", "60268"}, - {"2a01:bc40::/32", "197453"}, - {"2c0f:f7a8:9020::/48", "4809"}, - {"2408:8957:2c00::/40", "17622"}, - {"240e:3b6:1400::/38", "134773"}, - {"2a01:280:3::/45", "12381"}, - {"2001:559:85cd::/48", "33657"}, - {"2404:f4c0:f948::/46", "142551"}, - {"240a:ad2f::/32", "146025"}, - {"2604:ea80::/32", "33438"}, - {"2a12:7700::/29", "212144"}, - {"2001:559:867e::/48", "33650"}, - {"2404:2280:1bd::/46", "24429"}, - {"2605:300::/32", "46849"}, - {"2401:4900:1af0::/44", "45609"}, - {"2804:50c0::/32", "268408"}, - {"2001:255::/32", "38255"}, - {"2001:1218:60bc::/47", "278"}, - {"2001:42d0:a::/48", "37301"}, - {"2800:870::/35", "6762"}, - {"2001:550:e06::/39", "174"}, - {"2401:d800:bc50::/42", "7552"}, - {"240a:ab6a::/32", "145572"}, - {"2600:370f:30e3::/39", "32261"}, - {"2a07:d40::/29", "203338"}, - {"2a0c:5700:3134::/33", "30893"}, - {"2001:559:c0e0::/48", "33659"}, - {"2405:b900:10::/44", "55701"}, - {"2409:806a:2903::/38", "9808"}, - {"2a06:11c0:3::/45", "208086"}, - {"2a0c:5242::/29", "208861"}, - {"2001:400:a000:7::/64", "46846"}, - {"240a:ae0c::/32", "146246"}, - {"2600:9000:209f::/48", "16509"}, - {"2a02:26f7:d344::/48", "36183"}, - {"2a04:7f40::/29", "197212"}, - {"2a04:fcc0::/29", "21396"}, - {"2a06:c780::/29", "198024"}, - {"2a0c:5247:a000::/35", "208861"}, - {"2001:1a11:12c::/48", "8781"}, - {"2602:fed2:770c::/47", "53356"}, - {"2606:ae00:b801::/38", "7287"}, - {"2804:15a4:8010::/34", "263400"}, - {"2406:d00:aaaa::/48", "132165"}, - {"2600:6c2e:635::/40", "20115"}, - {"2804:2f5c::/32", "264886"}, - {"2a0f:c180::/29", "12996"}, - {"2001:67c:2ff0::/48", "50180"}, - {"2409:8958:cc44::/43", "9808"}, - {"2604:61c0::/35", "29831"}, - {"2a00:b0a1::/32", "203434"}, - {"2a03:9d40:6000::/36", "41095"}, - {"2a04:9140:3043::/45", "201958"}, - {"2a0c:e140::/29", "42136"}, - {"2620:125:9050::/48", "397415"}, - {"2001:253:10a::/45", "38272"}, - {"2001:fd8:1f70::/34", "132199"}, - {"2408:8256:2f77::/44", "17623"}, - {"2804:10e0::/32", "263653"}, - {"2804:742c::/32", "270963"}, - {"2a10:80::/29", "207382"}, - {"2001:510:c011::/34", "376"}, - {"240a:aae8::/32", "145442"}, - {"2600:4000::/25", "701"}, - {"2603:c002:9410::/39", "31898"}, - {"2620:141:47e::/48", "6075"}, - {"2001:559:803d::/46", "7922"}, - {"2602:fed2:7319::/46", "53356"}, - {"2603:c0fc:2000::/40", "54253"}, - {"2604:d600:112f::/43", "32098"}, - {"2606:6080:2001::/46", "32489"}, - {"2001:44b8:3087::/48", "4739"}, - {"2403:d000::/32", "23720"}, - {"2600:1000:fe10::/40", "22394"}, - {"2620:11a:c014::/48", "54113"}, - {"2a03:ec00:b300::/37", "24921"}, - {"2001:559:844e::/48", "7922"}, - {"240a:aebd::/32", "146423"}, - {"2804:30f4::/32", "264983"}, - {"2a07:cc0::/29", "60721"}, - {"2a0a:3e80::/29", "206606"}, - {"2001:502:d399::/48", "397226"}, - {"2001:1218:6036::/47", "278"}, - {"2405:2000::/37", "6453"}, - {"2408:8957:2400::/40", "17622"}, - {"2409:8c34:d00::/38", "9808"}, - {"2600:141c:3001::/36", "20940"}, - {"2804:2fd0::/32", "264913"}, - {"2804:581c::/32", "268107"}, - {"2001:1248:55a4::/46", "11172"}, - {"2607:f8f0:6a0::/48", "55185"}, - {"2a02:20c8::/35", "50304"}, - {"2a0a:b382::/32", "19318"}, - {"2a0a:e200:1910::/48", "199156"}, - {"2400:7400:45::/44", "38044"}, - {"2604:b180:10::/44", "32779"}, - {"2a02:16e8::/32", "31376"}, - {"2001:da8:c7::/48", "138441"}, - {"2001:df5:900::/48", "136167"}, - {"2001:4878:a220::/48", "12222"}, - {"2402:2840::/32", "10011"}, - {"2405:6e00:f802::/47", "133612"}, - {"240a:a96e::/32", "145064"}, - {"240a:afce::/32", "146696"}, - {"2800:5f0:203f::/41", "22724"}, - {"2a09:e1c1:f000::/44", "20473"}, - {"2600:6c34:309::/46", "33588"}, - {"2801:80:2e00::/40", "267976"}, - {"2a02:26f7:ba08::/48", "36183"}, - {"2001:b28:f23e::/48", "42065"}, - {"2001:4b98::/36", "29169"}, - {"2401:d800:db40::/42", "7552"}, - {"2402:9d80:3cc::/42", "131429"}, - {"2605:5b00::/32", "15317"}, - {"2a01:367:abcd::/48", "201061"}, - {"2603:c022:4000::/35", "31898"}, - {"2a0e:b102:120::/48", "208765"}, - {"2001:978:1e04::/40", "174"}, - {"2001:da8:238::/48", "24350"}, - {"2001:4c10::/32", "24586"}, - {"2408:8459:e830::/41", "17622"}, - {"240e:e9:5800::/37", "4134"}, - {"2600:6c38:12a::/45", "20115"}, - {"2620:135:a000::/40", "394889"}, - {"2804:2d88::/32", "265288"}, - {"2804:74a0::/32", "270993"}, - {"2405:2300:ff03::/44", "13443"}, - {"240e:6b4::/36", "136198"}, - {"2620:171:30::/45", "42"}, - {"2804:37fc::/32", "266448"}, - {"2a02:26f7:be85::/46", "20940"}, - {"2a02:26f7:d989::/42", "20940"}, - {"2402:cf80:1001::/46", "395403"}, - {"240a:a81e::/32", "144728"}, - {"240e:44d:3080::/41", "4134"}, - {"2600:1013:f010::/36", "6167"}, - {"2600:1404:c001::/37", "20940"}, - {"2800:160:1541::/45", "14259"}, - {"2801:130::/36", "3816"}, - {"2a0d:2a00:ab1::/46", "205157"}, - {"2001:559:c17a::/47", "7016"}, - {"2400:6d00::/32", "45355"}, - {"240a:aba1::/32", "145627"}, - {"2620:ca:4000::/48", "394229"}, - {"2804:7678::/32", "271114"}, - {"2a01:5041:500e::/48", "202196"}, - {"2a03:9e40::/32", "31399"}, - {"2a0d:f107::/32", "208449"}, - {"240e:698:4800::/40", "134769"}, - {"240e:983:1402::/44", "4134"}, - {"2600:e408::/29", "30404"}, - {"2607:fdf0:5eef::/43", "8008"}, - {"2806:210::/32", "28466"}, - {"2a0b:b86:f4::/48", "3280"}, - {"2408:8459:ed30::/41", "17622"}, - {"2001:559:504::/48", "7922"}, - {"2401:9cc0:200::/48", "59256"}, - {"2401:a100:4::/32", "45194"}, - {"2600:6c20:79::/39", "20115"}, - {"2804:1100::/34", "53178"}, - {"2a02:2e02:8850::/39", "12479"}, - {"2a0a:e2c1::/32", "50560"}, - {"2800:870:1002::/48", "6461"}, - {"2a02:2010:2020::/45", "20978"}, - {"2a07:f00::/29", "203412"}, - {"2a0b:dd40::/29", "204817"}, - {"2400:8b00:200::/42", "45727"}, - {"2401:55c0::/32", "131954"}, - {"2804:7214::/32", "270831"}, - {"2a03:2880:f038::/46", "32934"}, - {"240e:3b8:8200::/35", "140316"}, - {"2a02:2e02:1680::/42", "12479"}, - {"2a0c:6a40::/31", "30823"}, - {"2a0c:8080::/32", "204772"}, - {"2001:559:827f::/48", "33652"}, - {"2001:c78::/31", "2764"}, - {"240e:44d:7c40::/42", "140355"}, - {"2600:140f:c000::/48", "24309"}, - {"2600:370f:7510::/47", "32261"}, - {"2804:2f40::/32", "264880"}, - {"2a00:10e8:3::/29", "44574"}, - {"2a10:4646:40::/44", "211617"}, - {"2001:df7:6a00::/48", "132136"}, - {"240a:a08d::/32", "142791"}, - {"2a00:1e1a::/29", "8896"}, - {"2001:3c8:1602::/39", "4621"}, - {"2408:8459:5c50::/38", "17816"}, - {"2605:6400:30::/48", "53667"}, - {"2804:14c:3b89::/43", "28573"}, - {"2804:7480::/32", "270985"}, - {"2806:2f0:3201::/46", "17072"}, - {"2a00:1ff0::/32", "43717"}, - {"2001:67c:10c8::/48", "1257"}, - {"2600:1419:201::/37", "20940"}, - {"2803:6320::/32", "264825"}, - {"2001:1520:300::/32", "8972"}, - {"2400:cb00:a2f0::/46", "13335"}, - {"2402:800:5d1d::/42", "7552"}, - {"2408:84f3:a210::/42", "134543"}, - {"2804:3b0:8306::/44", "53062"}, - {"2a06:8782::/32", "3624"}, - {"2604:ca00:f014::/42", "36492"}, - {"2a02:2e02:8710::/40", "12479"}, - {"2001:67c:2b44::/48", "25525"}, - {"2401:7700::/32", "24150"}, - {"240e:980:2500::/40", "134756"}, - {"2a01:5ae0::/32", "12703"}, - {"2a05:fc80::/29", "57118"}, - {"2a0c:6f40::/29", "205801"}, - {"2001:13c7:7014::/48", "28504"}, - {"240e:44d:6880::/41", "4134"}, - {"2605:1140:1800::/37", "394142"}, - {"2804:5b28::/32", "268822"}, - {"2001:678:df0::/48", "29014"}, - {"2401:d800:d0::/42", "7552"}, - {"2a02:17a6::/31", "47232"}, - {"2001:559:469::/46", "7922"}, - {"240e:97d:3000::/36", "4134"}, - {"2600:80c:1400::/39", "11486"}, - {"2804:72c::/32", "52851"}, - {"2804:7024::/32", "270708"}, - {"2a00:5180::/48", "51957"}, - {"2a12:8400::/32", "198722"}, - {"2001:559:3c7::/48", "33287"}, - {"2001:1838:5002::/48", "13331"}, - {"240a:a00a::/32", "142660"}, - {"240e:44d:6e80::/41", "4134"}, - {"2001:67c:275c::/48", "31371"}, - {"2402:800:3ec0::/43", "7552"}, - {"2402:800:56e0::/44", "7552"}, - {"2406:840:e241::/48", "141011"}, - {"2407:2800::/32", "38227"}, - {"2600:6c20:16::/44", "20115"}, - {"2606:c00:36::/32", "9505"}, - {"2a03:4b21::/32", "201396"}, - {"2a05:fc40::/29", "200797"}, - {"2403:300:1cf2::/38", "714"}, - {"2404:b0:13::/35", "4750"}, - {"2804:24c8::/32", "52846"}, - {"2a0a:62c0::/32", "16086"}, - {"2a0a:89c0::/29", "206010"}, - {"2001:43f8:b70::/48", "327974"}, - {"2401:3cc0:801::/41", "137409"}, - {"2405:1c0:6361::/45", "55303"}, - {"2409:8c28:31b1::/37", "56041"}, - {"2600:6c38:221::/46", "20115"}, - {"2a07:cbc0:1c0::/29", "201299"}, - {"2a0f:9400:770f::/48", "211266"}, - {"240a:aea7::/32", "146401"}, - {"2607:fdf0:5e94::/46", "8008"}, - {"2001:fb0:1036::/41", "7470"}, - {"240e:67a:8800::/38", "140330"}, - {"240e:a53:6400::/26", "4134"}, - {"2001:559:19d::/48", "33650"}, - {"2408:84f3:b410::/42", "134543"}, - {"2605:fe80::/32", "7203"}, - {"2a0e:fd45:b31::/41", "44103"}, - {"2404:e5c0::/32", "146834"}, - {"2620:11a:a01f::/48", "36040"}, - {"2a00:4802:280::/44", "13124"}, - {"2a02:2028::/32", "15943"}, - {"2a0e:46c4:22a1::/48", "136918"}, - {"2400:4ec0:ff1a::/40", "64300"}, - {"2400:8000:9::/34", "4800"}, - {"2804:211c::/32", "264536"}, - {"2001:559:75a::/48", "7922"}, - {"2001:678:f34::/48", "64396"}, - {"2402:e380:e000::/35", "50131"}, - {"2600:1417:54::/48", "20940"}, - {"2800:bf0:288::/48", "27947"}, - {"2a03:1e80:ff6::/47", "8767"}, - {"2a11:87c0::/29", "208241"}, - {"2001:978:2306::/47", "174"}, - {"2405:2000:503::/32", "6453"}, - {"2408:840e:dd00::/34", "17621"}, - {"240a:a5b8::/32", "144114"}, - {"240c:ca05::/32", "138371"}, - {"2600:140f:5a01::/39", "20940"}, - {"2801:80:14e0::/43", "11097"}, - {"2804:12fc::/32", "263508"}, - {"2409:8904:5870::/40", "24547"}, - {"2409:896a:2600::/39", "9808"}, - {"2804:2450:c00::/32", "264214"}, - {"2607:6b80:40::/48", "46562"}, - {"2804:7f24:2::/44", "268853"}, - {"2a02:26f0:99::/46", "20940"}, - {"2404:e100:3001::/48", "133840"}, - {"240a:ab59::/32", "145555"}, - {"2604:25c0::/32", "33392"}, - {"2607:f738:b80::/37", "17184"}, - {"2806:2f0:45e1::/46", "17072"}, - {"2a01:6200::/32", "16095"}, - {"2001:559:c2a3::/48", "7922"}, - {"2001:1248:9cbf::/41", "11172"}, - {"2405:e640:c000::/34", "393954"}, - {"2406:cb41::/48", "395092"}, - {"240a:ab01::/32", "145467"}, - {"2606:ba00::/32", "16700"}, - {"2804:16d8:1d06::/48", "262729"}, - {"2804:5e7c:c100::/34", "269036"}, - {"2804:65b0::/32", "269508"}, - {"2a0e:b107:27e::/48", "212519"}, - {"2402:800:5aee::/39", "7552"}, - {"2804:35a8::/32", "266299"}, - {"2a02:2a90::/32", "702"}, - {"2600:370f:350a::/45", "32261"}, - {"2606:2800:333::/45", "15133"}, - {"2804:3df4::/32", "266565"}, - {"2a00:1c78:2::/29", "25408"}, - {"2a02:888:8047::/48", "47794"}, - {"2a03:7be0::/32", "201787"}, - {"2001:dee:8001::/48", "10084"}, - {"2804:1b04::/45", "53048"}, - {"2a05:9282::/29", "31019"}, - {"2001:df0:21a::/48", "23855"}, - {"2405:a00::/32", "4783"}, - {"2602:ffd1:4::/48", "29802"}, - {"2804:1810:d000::/34", "263262"}, - {"2a0d:1a40:7813::/40", "208563"}, - {"2001:4c0:8003::/33", "855"}, - {"2001:4998:ef99::/48", "26101"}, - {"2400:adc3:800::/39", "9541"}, - {"2a03:1ac0:5f4f::/48", "42682"}, - {"2a03:1b00::/32", "47478"}, - {"2a04:2dc0:19::/48", "39216"}, - {"2001:559:1b8::/48", "7015"}, - {"240a:a4ae::/32", "143848"}, - {"2600:1406:2c01::/38", "20940"}, - {"2001:559:4f4::/48", "7015"}, - {"2405:9800:c917::/44", "45430"}, - {"2603:c010:e000::/36", "31898"}, - {"240a:a98f::/32", "145097"}, - {"2804:14d:5495::/41", "28573"}, - {"2804:e8c:4000::/34", "52561"}, - {"2a00:1238:4::/32", "35236"}, - {"2402:9900:911::/48", "27435"}, - {"2404:c140:956f::/33", "138997"}, - {"240a:a2b7::/32", "143345"}, - {"2801:19:4800::/48", "10753"}, - {"2001:df3:7580::/48", "140570"}, - {"2409:8008:d5::/46", "9808"}, - {"2607:f738:f00::/41", "17184"}, - {"2804:2e04::/32", "265318"}, - {"2a0a:e5c0:1e::/48", "209898"}, - {"2a0f:1240::/29", "60262"}, - {"2409:8915:3a00::/33", "56044"}, - {"2606:b400:8018::/48", "792"}, - {"2a01:42e0:1700::/32", "29046"}, - {"2001:67c:133c::/48", "35052"}, - {"2405:6e00:600::/43", "133612"}, - {"2409:8088::/32", "24445"}, - {"240a:a23a::/32", "143220"}, - {"2600:1015:9110::/34", "6167"}, - {"2607:7c80:57::/48", "6373"}, - {"2a05:4200:2::/47", "35180"}, - {"2404:ce80::/32", "135356"}, - {"240a:a02f::/32", "142697"}, - {"240a:ae3b::/32", "146293"}, - {"2600:370f:3745::/46", "32261"}, - {"2603:c0f9::/36", "20054"}, - {"2a0a:c840::/31", "205394"}, - {"2408:8456:c600::/42", "17622"}, - {"2401:3bc0:1001::/44", "137409"}, - {"2403:ad80:80::/44", "134835"}, - {"2620:0:b80::/48", "701"}, - {"2620:8:8200::/48", "54282"}, - {"2804:14c:6300::/42", "28573"}, - {"2a07:3500:19a0::/48", "38915"}, - {"2c0f:e8f8::/35", "328699"}, - {"2001:df3:ff80::/48", "140924"}, - {"2402:800:5655::/42", "7552"}, - {"2600:6c38:50f::/43", "20115"}, - {"2607:fc58:1:42::/64", "13536"}, - {"2804:3b8:68::/47", "52965"}, - {"2a10:6580::/29", "204790"}, - {"2001:678:7b0::/48", "199568"}, - {"240e:c0:1800::/37", "63835"}, - {"240e:45c:7400::/40", "131285"}, - {"2001:fb0:1003::/44", "7470"}, - {"2408:8956:a300::/40", "17816"}, - {"240a:af07::/32", "146497"}, - {"2604:ebc0::/32", "54225"}, - {"2806:2f0:9e41::/42", "17072"}, - {"240e:3b3:6400::/35", "140312"}, - {"2001:559:7fe::/48", "7922"}, - {"2001:559:8225::/48", "7015"}, - {"2001:c38:900e::/47", "9931"}, - {"240e:45c:8400::/40", "131285"}, - {"2602:fc5c:3::/48", "32748"}, - {"2a02:26f7:e384::/48", "36183"}, - {"2a02:26f7:f7c5::/46", "20940"}, - {"2a03:9d40::/36", "41095"}, - {"2001:500:110::/48", "10745"}, - {"240a:a8c7::/32", "144897"}, - {"2803:ea10:1::/45", "271927"}, - {"2a02:26f7:4a::/48", "36183"}, - {"2a11:9140::/29", "49655"}, - {"2001:559:1f0::/48", "33659"}, - {"240e:44d:5d00::/41", "140345"}, - {"240e:97c:1000::/34", "4134"}, - {"2804:14d:5400::/40", "28573"}, - {"2806:2a0::/43", "28548"}, - {"2a09:be40:3680::/44", "212276"}, - {"2402:800:7210::/42", "7552"}, - {"240a:a504::/32", "143934"}, - {"2804:e1c:2::/32", "52545"}, - {"2a0a:d6c0:134::/47", "208650"}, - {"2c0f:fc70::/32", "37305"}, - {"2404:a140:2::/44", "138915"}, - {"2408:8644:1200::/32", "4837"}, - {"2409:8c28:902::/37", "56041"}, - {"2605:7940:1::/46", "30456"}, - {"2a02:3e0::/32", "39837"}, - {"2a02:16d8:104::/46", "5518"}, - {"2a02:26f7:e249::/42", "20940"}, - {"2404:d540:2::/32", "2501"}, - {"2600:1409:e801::/37", "20940"}, - {"2602:300::/24", "7018"}, - {"2001:559:8416::/48", "21508"}, - {"240a:a0f7::/32", "142897"}, - {"240a:a346::/32", "143488"}, - {"2804:81f0::/32", "272487"}, - {"2a01:190:1501::/43", "1764"}, - {"2a02:f7f:14::/48", "42927"}, - {"2a06:b500:2110::/44", "203759"}, - {"2001:43f8:cc0::/44", "23889"}, - {"2a04:c442:6500::/35", "10725"}, - {"240a:aaf8::/32", "145458"}, - {"2602:fed2:7010::/48", "134666"}, - {"2620:34:a001::/48", "7381"}, - {"2804:2080::/32", "264494"}, - {"2605:a240::/32", "21769"}, - {"2606:3c80:8001:1::/39", "33582"}, - {"2607:3a80:25::/48", "398480"}, - {"2800:150:1::/48", "12956"}, - {"2a0f:88c1::/30", "395003"}, - {"2603:c013:8000::/36", "31898"}, - {"2605:3380:4163::/44", "12025"}, - {"2804:184::/32", "262749"}, - {"2001:67c:f0::/48", "50381"}, - {"2001:df7:c900::/48", "138616"}, - {"2001:1388:2f02::/45", "6147"}, - {"2402:800:9355::/42", "7552"}, - {"240e:44d:3d00::/41", "140345"}, - {"2606:6c00:a000::/48", "32787"}, - {"2804:2af8::/32", "265128"}, - {"2a00:cc0:3::/32", "13237"}, - {"240a:a834::/32", "144750"}, - {"2620:0:6c0::/48", "16807"}, - {"2804:4d28::/32", "267415"}, - {"2a05:91c4::/32", "56430"}, - {"2a0d:7b80::/29", "204556"}, - {"2600:6000:fd83::/48", "11351"}, - {"2804:e0::/46", "28330"}, - {"2001:559:8247::/48", "33657"}, - {"2600:1017:b4d0::/44", "22394"}, - {"2a0c:e640:6780::/48", "17830"}, - {"2001:559:8776::/44", "7015"}, - {"2a03:b580::/32", "51978"}, - {"2001:550:2503::/38", "174"}, - {"2001:1248:4310::/44", "11172"}, - {"2803:e880:810e::/43", "52468"}, - {"2804:2b10:e::/47", "52916"}, - {"2a00:12d8:14::/33", "12586"}, - {"2a06:a100::/29", "48685"}, - {"2a0c:1ec0::/29", "60341"}, - {"2404:bf40:8702::/41", "139084"}, - {"2605:bc0:800::/47", "54201"}, - {"2605:f500:115::/38", "1828"}, - {"2a02:26f7:b9c1::/46", "20940"}, - {"2804:13b0:1c90::/42", "263546"}, - {"2001:43f8:7d0::/48", "37591"}, - {"2400:ddc0:2100::/32", "4785"}, - {"2402:800:7d10::/42", "7552"}, - {"2804:10:9000::/33", "28299"}, - {"2804:f04::/32", "262591"}, - {"2804:1348::/32", "263526"}, - {"2406:840:e145::/48", "142164"}, - {"2600:1418:4001::/32", "20940"}, - {"2602:feda:f3::/48", "205058"}, - {"2804:37a4::/36", "262543"}, - {"2806:230:204f::/48", "11888"}, - {"2a00:1651::/33", "213277"}, - {"2a01:8a60:2301:1::/32", "60191"}, - {"2001:559:8466::/48", "33287"}, - {"2620:115::/45", "18888"}, - {"2804:218:d4::/33", "27715"}, - {"240a:a7e0::/32", "144666"}, - {"2a00:1ab0::/32", "57633"}, - {"2a04:db80::/32", "44724"}, - {"2402:8640:a::/32", "137491"}, - {"2602:fc5d:51::/46", "399866"}, - {"2a02:88d:821f::/48", "47794"}, - {"2a02:26f7:ee00::/48", "36183"}, - {"2a04:ad40::/29", "60156"}, - {"2a06:1b00:9a::/39", "8302"}, - {"2a0e:cb00::/29", "60377"}, - {"2402:9200::/32", "10084"}, - {"2605:9f80::/32", "63018"}, - {"2620:160:eb00::/44", "10837"}, - {"2806:2f0:1123::/41", "22884"}, - {"2001:559:c291::/48", "33659"}, - {"2403:9800:c031::/44", "4648"}, - {"2604:e180:de09::/34", "55002"}, - {"2a0f:5701::/34", "206499"}, - {"2408:8256:397c::/48", "17816"}, - {"2600:1408:b401::/33", "20940"}, - {"2600:370f:73a8::/45", "32261"}, - {"2001:df0:23c0::/48", "147125"}, - {"2402:8100:30f0::/44", "45271"}, - {"240a:af85::/32", "146623"}, - {"2603:c011:c000::/36", "31898"}, - {"2804:5764::/32", "53241"}, - {"2a00:10d8::/44", "42005"}, - {"2a00:f826:25::/48", "201061"}, - {"2a02:26f7:d850::/48", "36183"}, - {"2a02:26f7:da11::/42", "20940"}, - {"2a04:1d80::/29", "60989"}, - {"2a07:c100::/29", "202398"}, - {"2a07:f600:4033::/48", "6679"}, - {"2400:1a00:b112::/40", "17501"}, - {"2401:d800:91a0::/41", "7552"}, - {"2402:b600::/32", "7532"}, - {"2604:e180:86::/35", "55002"}, - {"2a06:c6c0::/48", "21100"}, - {"2400:cb00:160::/46", "13335"}, - {"2402:4880::/32", "134160"}, - {"2403:6240::/32", "134595"}, - {"2408:8a04:8000::/36", "9929"}, - {"2602:fead::/36", "395567"}, - {"2606:a600:9000::/33", "23005"}, - {"2402:800:9801::/44", "7552"}, - {"240a:a550::/32", "144010"}, - {"2602:ffc8:3e5::/34", "20278"}, - {"2605:ef80:36::/44", "36492"}, - {"2804:7c8:9000::/33", "262323"}, - {"2804:4114::/32", "266002"}, - {"2a00:6920:f000::/40", "42003"}, - {"2a02:26f7:fb89::/42", "20940"}, - {"2a09:1cc0::/29", "208574"}, - {"2804:1db8::/32", "264389"}, - {"2804:398c::/32", "266035"}, - {"2001:1a11:156::/32", "8781"}, - {"240a:abc7::/32", "145665"}, - {"2604:c0c0:4000::/35", "14525"}, - {"2605:dd40:5216::/41", "398549"}, - {"2404:b280:1000::/34", "17670"}, - {"2408:8456:3c00::/41", "17623"}, - {"2409:8904:3aa0::/39", "24547"}, - {"2a0f:1540::/29", "399975"}, - {"2001:559:865a::/47", "33657"}, - {"2a02:26f7:c245::/46", "20940"}, - {"2a0b:1f80::/29", "62412"}, - {"2604:7480::/47", "54826"}, - {"2620:74:13::/48", "26134"}, - {"2800:300:8940::/40", "27651"}, - {"2a00:47c0:200::/48", "44568"}, - {"2001:559:2a6::/48", "33650"}, - {"2001:579:524c::/40", "22773"}, - {"2404:2400:200::/48", "38280"}, - {"240e:e5:8000::/30", "4812"}, - {"240e:44d:7640::/42", "140352"}, - {"2001:56b:5::/44", "852"}, - {"240e:966:f600::/31", "4134"}, - {"2604:dc00::/35", "19752"}, - {"2803:7da0:51::/48", "64114"}, - {"2a03:34c0::/32", "9009"}, - {"2a03:5a00:38::/48", "62247"}, - {"2a0d:5d80::/29", "200899"}, - {"2001:559:82d4::/48", "33660"}, - {"2600:1003:b1a0::/44", "6167"}, - {"2804:3528::/32", "266272"}, - {"2a02:26f0:a5::/44", "34164"}, - {"2a0c:b642:ace::/48", "208753"}, - {"240e:3bc:d000::/36", "134772"}, - {"240e:967:5000::/37", "58772"}, - {"2600:370f:4022::/47", "32261"}, - {"2604:4100::/36", "29713"}, - {"2804:1e20:9950::/48", "264409"}, - {"2804:2250:543a::/34", "262756"}, - {"2401:4900:1bc0::/44", "45609"}, - {"2600:6c38:632::/44", "20115"}, - {"2804:1668::/32", "53132"}, - {"2001:559:c198::/48", "7922"}, - {"2600:370f:1124::/43", "32261"}, - {"2804:1a00::/32", "61831"}, - {"2804:5a50::/32", "268764"}, - {"2a10:5880::/29", "37289"}, - {"2001:579:114c::/42", "22773"}, - {"2001:df3:f780::/48", "141052"}, - {"2401:d800:5090::/42", "7552"}, - {"2620:109:a000::/45", "15294"}, - {"2620:119:17::/48", "36692"}, - {"2800:160:1c3a::/41", "14259"}, - {"2804:4498:9000::/33", "267641"}, - {"2a0b:8f80:201::/48", "12859"}, - {"2001:256:100::/48", "24367"}, - {"2001:18e8:10::/38", "19782"}, - {"2401:fa40::/32", "134326"}, - {"2620:149:150::/38", "714"}, - {"2804:2438::/35", "264209"}, - {"2804:6260::/32", "269293"}, - {"2804:654c:200::/40", "269481"}, - {"2a0a:e5c0:26::/48", "213081"}, - {"2a10:840::/29", "62240"}, - {"2408:8459:5a30::/41", "17622"}, - {"240e:67c:e400::/39", "140330"}, - {"2804:41d4::/36", "267459"}, - {"2a01:5340::/29", "62298"}, - {"2001:559:7ff::/48", "33287"}, - {"2602:ffaa::/36", "32621"}, - {"2001:250:40a::/38", "23910"}, - {"2400:5be0::/32", "148968"}, - {"2600:40f0:b::/45", "701"}, - {"2607:fc58:1:87::/64", "13536"}, - {"2a02:ee80:429c::/47", "21433"}, - {"2401:d800:bd10::/42", "7552"}, - {"2407:a080:6000::/35", "133480"}, - {"2409:8051:800::/47", "56047"}, - {"2602:feda:3c5::/48", "205947"}, - {"2801:80:3a00::/40", "270410"}, - {"2804:53b0::/46", "268600"}, - {"2a01:7900::/32", "35100"}, - {"2a02:ee80:4104::/47", "21433"}, - {"2804:37b4::/32", "266430"}, - {"2c0f:f288::/32", "328039"}, - {"2c0f:f850:dc04::/47", "327979"}, - {"2001:da8:270::/46", "23910"}, - {"2001:1a11:125::/48", "42298"}, - {"240a:ac55::/32", "145807"}, - {"2602:fd63::/36", "11805"}, - {"2803:e40:8b::/32", "27797"}, - {"2804:62e0::/32", "269325"}, - {"2a03:f480:1::/46", "198068"}, - {"2a10:ac40:2::/47", "397349"}, - {"2001:559:8472::/48", "33662"}, - {"2001:fd8:b0e0::/44", "132199"}, - {"2401:b00::/43", "17564"}, - {"240a:a850::/32", "144778"}, - {"2604:7180::/36", "36446"}, - {"2604:a140:1502::/45", "4755"}, - {"2804:3238::/32", "265063"}, - {"2001:250:4836::/35", "23910"}, - {"2001:2000:3080:2345::4/41", "1299"}, - {"2406:5a00::/32", "55850"}, - {"2408:8459:aa50::/37", "17816"}, - {"2600:1fa0:2080::/44", "8987"}, - {"2803:a520::/32", "266685"}, - {"2804:3f50::/32", "266652"}, - {"2804:6a80:3002::/32", "270340"}, - {"2a02:26f7:10f::/48", "20940"}, - {"2001:468:364::/48", "10490"}, - {"2001:678:824::/48", "59891"}, - {"2804:d1c::/32", "52600"}, - {"2a02:26f7:d5ca::/42", "20940"}, - {"240a:aa3b::/32", "145269"}, - {"2620:f7:4000::/48", "2828"}, - {"2a11:eb80::/29", "204790"}, - {"2c0f:f048::/32", "36924"}, - {"240a:a3a5::/32", "143583"}, - {"2804:11d0::/32", "263441"}, - {"2804:6018::/32", "269145"}, - {"2001:559:701::/48", "33491"}, - {"2001:4878:4204::/48", "12222"}, - {"2401:b8c0::/44", "64074"}, - {"2804:70b8::/32", "270744"}, - {"2a09:c180::/29", "209707"}, - {"2405:7600:2::/34", "23956"}, - {"2600:5c00:3fc9::/48", "20115"}, - {"2804:2140:1017::/42", "53059"}, - {"2a02:26f7:c289::/41", "20940"}, - {"2c0f:f448::/39", "327880"}, - {"2001:559:86d1::/48", "33287"}, - {"2400:1620::/32", "147314"}, - {"2406:600:2212::/32", "4694"}, - {"2407:6ec0::/32", "133384"}, - {"2604:fb80:1600::/48", "15128"}, - {"2605:a401:8068::/46", "33363"}, - {"2a0d:f301::/48", "40994"}, - {"2001:438:65::/48", "26762"}, - {"2407:2d00::/32", "14381"}, - {"2600:9000:2322::/44", "16509"}, - {"2620:11a:a024::/47", "36040"}, - {"2a0a:cc80::/47", "206667"}, - {"2001:268:83c::/41", "2516"}, - {"2402:800:fc40::/42", "7552"}, - {"2404:8000:79::/40", "17451"}, - {"2600:6c39:5::/44", "20115"}, - {"2401:d800:bfb0::/41", "7552"}, - {"2408:8000::/48", "4837"}, - {"240a:a32b::/32", "143461"}, - {"2a02:60::/29", "35492"}, - {"2a02:100e:bef8::/48", "201318"}, - {"2a02:1390:1000::/34", "21351"}, - {"2001:559:80e0::/48", "33657"}, - {"2803:2880::/32", "262159"}, - {"2a0e:3304::/32", "43312"}, - {"2620:102:3000::/44", "3136"}, - {"2804:4158::/32", "267427"}, - {"2403:8000::/44", "4796"}, - {"2600:1410:c001::/34", "20940"}, - {"2800:bf0:340c::/43", "27947"}, - {"2804:4d80:c001::/34", "268200"}, - {"2804:7c04::/32", "271470"}, - {"2a0c:4b40::/29", "202449"}, - {"2405:9800:d004::/46", "45430"}, - {"2600:6c10:ff95::/44", "20115"}, - {"2604:6800::/32", "36436"}, - {"2607:f6f0:1002::/40", "12085"}, - {"2804:9fc::/32", "263008"}, - {"2a04:2b00:14dd::/48", "212390"}, - {"2405:aac0:55::/46", "139949"}, - {"2405:ed80:a::/32", "135106"}, - {"2408:84f3:a240::/37", "17816"}, - {"240a:af74::/32", "146606"}, - {"2607:d080::/32", "29946"}, - {"2620:19:4000::/48", "395611"}, - {"2803:e210::/32", "271907"}, - {"2a0f:5707:ab80::/44", "56382"}, - {"2001:559:531::/48", "33652"}, - {"2408:8459:be10::/42", "17623"}, - {"2600:1010:6000::/44", "6167"}, - {"2600:bc00::/32", "54600"}, - {"2610:128:2200::/33", "11686"}, - {"240e:438:1420::/43", "140647"}, - {"2804:4bf4::/32", "267339"}, - {"2a00:d102::/34", "15704"}, - {"2001:67c:1443::/48", "31649"}, - {"2001:67c:2ff4::/48", "47699"}, - {"2408:8956:a700::/40", "17816"}, - {"240a:a47d::/32", "143799"}, - {"2a01:8840:a1::/48", "207266"}, - {"2a02:26f7:d240::/48", "36183"}, - {"2600:1017:f410::/38", "6167"}, - {"2605:3380:47fd::/46", "12025"}, - {"2606:2e00:8007::/48", "32780"}, - {"2607:f518:2403::/32", "46887"}, - {"2604:1380:45d0::/38", "54825"}, - {"2804:14c:7de2::/43", "28573"}, - {"2a03:1e80:c000::/40", "3320"}, - {"2001:559:8605::/48", "7015"}, - {"240a:a7da::/32", "144660"}, - {"240e:438:20::/43", "140647"}, - {"2620:138:3018::/45", "22604"}, - {"2a02:348:c9::/35", "35470"}, - {"2001:559:8295::/48", "33490"}, - {"2405:8a00:a04d::/43", "55824"}, - {"2806:2f0:95e1::/46", "17072"}, - {"2806:2f0:9803::/42", "17072"}, - {"2a01:5c8::/32", "12312"}, - {"2a03:be00::/32", "50522"}, - {"2400:c700:1184::/38", "55644"}, - {"240a:a825::/32", "144735"}, - {"2a0f:28c0::/29", "399975"}, - {"2a11:b244::/32", "62068"}, - {"2001:559:4e4::/48", "7922"}, - {"2001:43f8:10f0::/48", "328280"}, - {"2001:43f8:1430::/48", "37520"}, - {"2401:fd80:101::/44", "43519"}, - {"2402:800:337f::/40", "7552"}, - {"2a10:ccc2::/43", "35619"}, - {"2001:67c:22c8::/48", "1257"}, - {"2001:df0:ee::/48", "55951"}, - {"2001:1a40:71::/40", "5416"}, - {"2600:1415:16::/44", "20940"}, - {"2602:801:7000::/47", "397955"}, - {"2806:2f0:9d41::/46", "17072"}, - {"2a03:f80:3991::/48", "56630"}, - {"2a05:ef00::/29", "202536"}, - {"2a0e:97c3:78f::/48", "20473"}, - {"2401:7400:2fe::/48", "132915"}, - {"2402:800:f870::/40", "7552"}, - {"2409:8c4c:19::/42", "9808"}, - {"240a:aa41::/32", "145275"}, - {"240e:979:1000::/36", "4134"}, - {"2804:14d:e600::/41", "28573"}, - {"2001:410:a011::/44", "8111"}, - {"2001:df3:ce00::/48", "132148"}, - {"2606:2800:7022::/48", "15133"}, - {"2804:4900:8000::/33", "267158"}, - {"2a02:2ca7:2f::/32", "210662"}, - {"2a03:ef43:c000::/48", "57218"}, - {"2a0a:6a80::/29", "13045"}, - {"2001:4408:4308::/37", "4758"}, - {"2001:49f0:d102::/48", "3257"}, - {"2404:ddc0:6000::/36", "139074"}, - {"2409:8020:a1::/43", "56046"}, - {"2620:129:f000::/48", "393462"}, - {"2a02:26f7:f149::/42", "20940"}, - {"2604:7280::/32", "31877"}, - {"2803:cda0::/32", "267788"}, - {"2804:19c::/32", "262755"}, - {"2a00:1ca8:d5::/32", "50673"}, - {"2a01:698::/32", "15373"}, - {"2001:4868:10c::/48", "62795"}, - {"2804:3e70:1235::/32", "266596"}, - {"2804:5934::/32", "268175"}, - {"2804:84bc::/32", "272278"}, - {"2a02:4540:c0::/45", "197207"}, - {"2001:468:2611::/44", "11537"}, - {"2408:8706::/28", "4808"}, - {"2804:1a14:4000::/36", "28153"}, - {"2a00:1cd8::/29", "48620"}, - {"2a12:5e00::/29", "204790"}, - {"2408:8456:2100::/42", "17622"}, - {"2409:895a:c800::/37", "9808"}, - {"2602:806:5000::/44", "22617"}, - {"2a00:4bc0:212f::/48", "31004"}, - {"2406:2000::/40", "10310"}, - {"2409:8915:5800::/39", "56044"}, - {"2607:fa78::/32", "10430"}, - {"2607:fb90:5700::/34", "21928"}, - {"2a02:88d:23f::/34", "47794"}, - {"2402:800:7060::/40", "7552"}, - {"2405:9800:c920::/48", "45458"}, - {"2409:806c:2100::/36", "9808"}, - {"2803:6602:8000::/31", "28075"}, - {"2804:17f4::/32", "263260"}, - {"2804:762c::/32", "271094"}, - {"2a02:26f7:d7c0::/48", "36183"}, - {"2401:d800:2a40::/42", "7552"}, - {"240a:a7b5::/32", "144623"}, - {"2804:5718::/32", "268043"}, - {"2001:559:8308::/47", "7922"}, - {"2001:df0:293::/48", "10010"}, - {"2401:d800:1f0::/38", "7552"}, - {"2606:ae00:9e00::/44", "7287"}, - {"2800:160:1b96::/44", "14259"}, - {"2407:24c0:1::/46", "136835"}, - {"2407:a600:6000::/36", "18004"}, - {"240e:67b:8c00::/33", "4134"}, - {"2602:feb4:230::/44", "25961"}, - {"2804:6b2c::/32", "270383"}, - {"2a02:4780:8::/43", "47583"}, - {"2605:cc00::/32", "15065"}, - {"2804:1618::/32", "263267"}, - {"2a02:26f7:c89c::/48", "36183"}, - {"2a02:2ca5::/32", "58305"}, - {"2001:19f8:9000::/33", "4927"}, - {"2400:7400:34::/47", "38044"}, - {"2400:cb00:419::/48", "13335"}, - {"2600:4402::/34", "6130"}, - {"2602:fc23:158::/48", "54625"}, - {"2603:fd30::/25", "397165"}, - {"2620:7b:2000::/48", "398222"}, - {"2803:8080::/32", "12180"}, - {"2001:67c:65c::/48", "198903"}, - {"2404:e601::/48", "132805"}, - {"2604:a940:1::/48", "54538"}, - {"2606:29c0::/39", "31775"}, - {"2806:230:3014::/48", "265594"}, - {"2001:67c:634::/48", "198089"}, - {"2405:4c0::/32", "139281"}, - {"2406:840:e080::/44", "141776"}, - {"2801:80:3ea0::/48", "272432"}, - {"2804:6c4::/36", "262893"}, - {"2001:559:8754::/48", "7016"}, - {"2604:880:3c::/48", "29802"}, - {"2607:f330:2002::/47", "25996"}, - {"2800:484:5100::/36", "10620"}, - {"2804:72f0::/32", "270885"}, - {"2a03:1b20:beef::/48", "39351"}, - {"2a03:96e0::/33", "15659"}, - {"2405:1c0:6221::/46", "55303"}, - {"2406:bd00:decd::/48", "55651"}, - {"2804:4b44::/32", "267294"}, - {"2a04:6ac0::/29", "8100"}, - {"2a04:f581:110a::/47", "23764"}, - {"2001:da8:b80d::/46", "24372"}, - {"2600:180a:1002::/33", "16552"}, - {"2a01:5741:1::/32", "57763"}, - {"2a03:29c0::/32", "61189"}, - {"2a04:e580::/29", "197395"}, - {"2a0d:5642:201::/48", "35487"}, - {"2001:559:84be::/48", "33657"}, - {"2407:7f00::/48", "132898"}, - {"2408:8456:4610::/42", "134543"}, - {"240e:a28::/25", "4134"}, - {"2804:5d64::/32", "268969"}, - {"2a00:1fa0::/32", "8359"}, - {"2001:559:87e0::/45", "7015"}, - {"2401:c5c0:2::/47", "55492"}, - {"2401:fa00:60::/32", "45566"}, - {"240a:a16a::/32", "143012"}, - {"240a:ad9c::/32", "146134"}, - {"2001:df0:65::/48", "38567"}, - {"2607:f3a0:4000::/32", "23342"}, - {"2a01:8840:55::/48", "207266"}, - {"2401:d800:7f00::/42", "7552"}, - {"2404:bf40:8500::/48", "7545"}, - {"2408:8956:f640::/40", "17622"}, - {"2600:1417:49::/46", "20940"}, - {"2607:ffb0:8001::/33", "6327"}, - {"2804:3bf0::/33", "266181"}, - {"2804:640c::/32", "269401"}, - {"2a00:13c0:201::/48", "12616"}, - {"2a02:26f7:b841::/46", "20940"}, - {"2a0b:2800::/29", "207195"}, - {"2a0d:8200::/29", "205144"}, - {"2605:a404:1f9::/38", "33363"}, - {"2607:8300:a::/48", "13876"}, - {"2607:f838::/32", "22581"}, - {"2804:4dc8::/32", "268219"}, - {"2a00:7147:e10::/48", "51430"}, - {"2a02:2aa8:130::/38", "702"}, - {"2a02:2e00:2000::/36", "12479"}, - {"2a0a:2842:463::/48", "136796"}, - {"2a11:ae00::/32", "31515"}, - {"2610:a1:3050::/48", "12008"}, - {"2620:114:d000::/44", "3671"}, - {"2800:490:e800::/39", "27951"}, - {"2804:988::/32", "28239"}, - {"2a03:2800::/29", "12488"}, - {"2a05:b340::/29", "49223"}, - {"2a0e:8f02:f040::/48", "207212"}, - {"2001:1248:97ed::/46", "11172"}, - {"2001:4998:161::/44", "10310"}, - {"240a:a369::/32", "143523"}, - {"240e:966:c600::/36", "4134"}, - {"2607:f640::/44", "32354"}, - {"2620:121:6000::/44", "40267"}, - {"2a00:1ec8:64::/40", "2854"}, - {"2001:67c:1438::/48", "44418"}, - {"240a:a962::/32", "145052"}, - {"240a:ac7e::/32", "145848"}, - {"2804:7b9c::/32", "271439"}, - {"2a03:1aa0:9000::/33", "201730"}, - {"2a09:f180::/48", "50007"}, - {"2001:250:23b::/48", "24348"}, - {"2405:2300:ff73::/45", "13443"}, - {"2405:d980::/32", "23703"}, - {"2406:8800:9013::/45", "17465"}, - {"2605:6c80:3::/48", "13768"}, - {"2a03:9c40:800::/48", "34655"}, - {"2a10:2a80:42::/48", "207727"}, - {"2001:250:4000::/45", "24358"}, - {"2001:559:165::/48", "33287"}, - {"2603:c025:c000::/35", "31898"}, - {"2620:17e::/42", "26072"}, - {"2804:b6c::/32", "52777"}, - {"2806:230:1021::/48", "11888"}, - {"2001:500:203::/44", "394353"}, - {"2001:559:89::/48", "20214"}, - {"2001:559:c01f::/48", "7725"}, - {"2407:680::/33", "9676"}, - {"2610:b0:4151::/44", "3573"}, - {"2803:4a10:b000::/33", "271916"}, - {"2a00:dd80:fb81::/48", "199438"}, - {"2403:be80::/32", "58405"}, - {"2405:3340:e000::/48", "141362"}, - {"2405:6e00:1e00::/39", "133612"}, - {"240a:ac5d::/32", "145815"}, - {"2600:6c38:a54::/47", "20115"}, - {"2605:79c0::/32", "26801"}, - {"2605:a401:816d::/43", "33363"}, - {"2a06:c005::/32", "45027"}, - {"2a10:1f40::/29", "211007"}, - {"2a10:cbc0::/29", "208553"}, - {"2409:8914:200::/39", "56044"}, - {"2600:9800::/24", "4193"}, - {"2803:6900:1514::/48", "52423"}, - {"2804:41d0::/38", "267458"}, - {"2804:4cc8::/32", "267391"}, - {"2a0f:b506:ffee::/48", "206313"}, - {"2001:559:8298::/47", "33661"}, - {"2400:a980:de::/47", "133111"}, - {"2403:c00:1000::/40", "17488"}, - {"2620:1f7:81c::/48", "1747"}, - {"2800:160:1f75::/44", "14259"}, - {"2804:49bc::/32", "267200"}, - {"2a02:888:dd::/48", "48695"}, - {"2001:550:7709::/32", "174"}, - {"2001:dc0:2000::/35", "4608"}, - {"2a09:4040::/48", "50007"}, - {"2001:678:f7c::/48", "213027"}, - {"2001:da8:4806::/37", "23910"}, - {"2404:9140::/48", "134687"}, - {"2804:174c::/32", "263135"}, - {"2804:1e90:a0c0::/39", "264436"}, - {"2001:7a8:820::/34", "13193"}, - {"2402:800:9171::/40", "7552"}, - {"240a:ae5c::/32", "146326"}, - {"2804:1b6c::/32", "61727"}, - {"2a00:a040::/38", "12849"}, - {"2a02:26f7:e3c9::/46", "20940"}, - {"2001:67c:88::/48", "57436"}, - {"2600:140b:e001::/37", "20940"}, - {"2602:fe27:b1::/48", "6473"}, - {"2a0a:4780::/32", "59504"}, - {"2001:559:a::/48", "33652"}, - {"2001:559:c3cf::/48", "21508"}, - {"2001:df2:e800::/48", "131302"}, - {"2408:8957:2f00::/40", "17816"}, - {"240e:14::/36", "140329"}, - {"2804:534:667::/32", "22177"}, - {"2001:559:1da::/48", "33659"}, - {"2602:ff96:8::/48", "26548"}, - {"2607:cd8a::/32", "6528"}, - {"2803:9360::/32", "263222"}, - {"2804:2e70::/32", "265346"}, - {"2a0d:b201:30::/41", "206026"}, - {"2001:1360::/32", "52286"}, - {"2402:c7c0::/32", "137576"}, - {"2408:8409:7800::/40", "4808"}, - {"2c0f:f430::/32", "29614"}, - {"240a:a2e6::/32", "143392"}, - {"2620:171:61::/48", "715"}, - {"2a00:5540::/33", "50763"}, - {"2001:559:8158::/47", "33287"}, - {"240e:679:800::/37", "140329"}, - {"2620:124:3000::/40", "46900"}, - {"2620:1f8:f046::/48", "40443"}, - {"2806:104e:7::/43", "8151"}, - {"2406:4a00:900::/40", "56038"}, - {"2408:8956:8900::/40", "17816"}, - {"2602:fe32::/36", "397081"}, - {"2606:2800:4046::/48", "14210"}, - {"2606:2e00:2::/33", "29854"}, - {"2804:4bbc::/32", "28333"}, - {"2a02:26f7:c491::/42", "20940"}, - {"2001:559:81e6::/48", "7016"}, - {"2402:1c00:5000::/32", "23838"}, - {"2402:9e80:200::/46", "142561"}, - {"2602:fc91:163::/48", "399561"}, - {"2a01:358:5f12::/32", "9121"}, - {"2a02:752:2::/48", "43948"}, - {"2a02:2b60:6::/44", "42947"}, - {"2a02:2698:3800::/42", "59713"}, - {"2a02:26f7:f445::/46", "20940"}, - {"2409:8c20:c17::/35", "56046"}, - {"2804:7514::/32", "271022"}, - {"2806:230:1018::/48", "265594"}, - {"2a09:2::/48", "3258"}, - {"2001:559:57a::/48", "33659"}, - {"2001:559:845c::/48", "7725"}, - {"2401:4900:1800::/40", "45609"}, - {"240e:c0:2000::/30", "4134"}, - {"2602:fd10::/40", "19529"}, - {"2a05:dfc7:bef0::/33", "61138"}, - {"2a0c:4780::/29", "204814"}, - {"2a0f:75c0:1::/48", "44016"}, - {"2001:1248:9885::/46", "11172"}, - {"2001:4878:8151::/48", "12222"}, - {"2605:b9c0::/34", "30705"}, - {"2a0c:8880::/29", "39421"}, - {"2001:1248:8019::/40", "11172"}, - {"2407:b640:40::/47", "132046"}, - {"2600:6c60::/32", "20115"}, - {"2804:73fc::/32", "270950"}, - {"2a01:7c80::/33", "24852"}, - {"240a:ab39::/32", "145523"}, - {"2804:40a0:f200::/39", "265971"}, - {"2804:4318::/32", "267548"}, - {"2a02:9b8::/31", "5610"}, - {"2a0a:4a00::/29", "48662"}, - {"2a10:2ec2::/32", "210625"}, - {"2001:504:b::/48", "101"}, - {"2402:800:54e0::/44", "7552"}, - {"240e:983:1::/48", "4134"}, - {"2600:1488:a341::/42", "20940"}, - {"2600:6c38:b27::/44", "20115"}, - {"2806:2f0:2181::/48", "22884"}, - {"2a00:4802:2e50::/39", "8717"}, - {"2a02:2250::/32", "196714"}, - {"2a04:ec80::/29", "39441"}, - {"2607:f740:b::/43", "36236"}, - {"2804:760:2000::/32", "262638"}, - {"2a06:c300::/29", "197660"}, - {"2a06:e881:2100::/47", "206479"}, - {"2a0b:4d07:b01::/48", "44239"}, - {"2604:d600:1c::/46", "32098"}, - {"2607:fc28:5000::/34", "22911"}, - {"2a03:90c0:610::/44", "199524"}, - {"2a06:3040:9::/48", "203020"}, - {"2c0f:fe38:2120::/38", "33771"}, - {"2409:8000:5900::/40", "9808"}, - {"2400:8000:3003::/32", "4800"}, - {"2400:dcc0:aa04::/39", "38631"}, - {"240a:a0d2::/32", "142860"}, - {"240e:109:8043::/48", "63835"}, - {"2605:a401:8bfa::/37", "33363"}, - {"2a00:1288:ef84::/48", "40986"}, - {"2001:df3:1680::/48", "133296"}, - {"2001:df7:8400::/48", "134819"}, - {"2804:18b0::/32", "61947"}, - {"2a0a:e740::/29", "207020"}, - {"2001:67c:4c4::/48", "48171"}, - {"2402:2b40:8000::/36", "55967"}, - {"2406:840:eee0::/43", "139216"}, - {"2605:bc0::/47", "54201"}, - {"2800:bf0:8270::/48", "52257"}, - {"2803:2a80:20::/47", "262928"}, - {"2804:14c:bb85::/44", "28573"}, - {"2804:52ec::/32", "268550"}, - {"2804:5e7c::/32", "269036"}, - {"2a04:e00:17::/48", "39855"}, - {"2600:1408:7000::/48", "35994"}, - {"2a0a:d400::/29", "39650"}, - {"2001:418:1401:1::/64", "3949"}, - {"2001:559:488::/46", "33657"}, - {"240a:a385::/32", "143551"}, - {"2a01:6900::/32", "16091"}, - {"2a0e:d0c0::/29", "208376"}, - {"2603:90f5::/48", "11426"}, - {"2804:8150:4000::/32", "272446"}, - {"2a00:12e0::/32", "6798"}, - {"2a00:7440::/32", "12625"}, - {"2001:678:a8c::/48", "208727"}, - {"2001:c20:c815::/48", "9255"}, - {"2600:1908::/29", "15169"}, - {"2a01:b1c1::/32", "200548"}, - {"2402:800:7150::/42", "7552"}, - {"2406:daa0:f0c0::/44", "16509"}, - {"240e:5e:1000::/42", "134773"}, - {"2605:a404:343::/40", "33363"}, - {"2607:f4d8::/32", "26785"}, - {"2803:e600:1c::/48", "65500"}, - {"2001:559:87::/48", "33657"}, - {"2001:4878:c000::/48", "12222"}, - {"2606:3c00::/32", "36273"}, - {"2620:10f:400f::/48", "10390"}, - {"2801:1fc:24::/48", "27951"}, - {"2a00:4880::/32", "50348"}, - {"2a02:26f7:77::/48", "20940"}, - {"2a03:70c0::/32", "197068"}, - {"240a:a7d2::/32", "144652"}, - {"2600:370e:108::/47", "32261"}, - {"2605:a404:83e::/41", "33363"}, - {"2a01:5b0:26::/48", "8561"}, - {"2407:6640::/40", "142275"}, - {"2803:e600:999a::/34", "18809"}, - {"2804:24c4:3000::/32", "264241"}, - {"2a01:5042:efd::/48", "202196"}, - {"2a04:7680::/29", "9007"}, - {"2a0b:6b81:205::/48", "203729"}, - {"2406:daa0:20c0::/44", "16509"}, - {"2600:140b:9c01::/34", "20940"}, - {"2800:110:3e01::/32", "4270"}, - {"2800:bf0:800a::/48", "27947"}, - {"2a0f:6940::/32", "207881"}, - {"2001:559:456::/48", "33489"}, - {"2001:559:8644::/48", "7922"}, - {"2401:8940:fc00::/38", "131291"}, - {"2600:1406:7c00::/48", "35994"}, - {"2804:8330::/32", "272182"}, - {"2a02:2070::/32", "48467"}, - {"2001:579:10c8::/39", "22773"}, - {"2001:df5:f680::/48", "147273"}, - {"2a0e:97c0:1a1::/48", "211868"}, - {"2001:559:c140::/46", "33657"}, - {"2804:59dc::/32", "268730"}, - {"2a02:6680:1::/46", "16116"}, - {"2a03:2880:f1fe::/47", "32934"}, - {"2406:1a00::/32", "56028"}, - {"2600:1419:6000::/48", "52376"}, - {"2607:f5a0:802::/32", "17048"}, - {"2607:fb58:4000::/36", "36086"}, - {"2800:160:1c4f::/43", "14259"}, - {"2a01:8840:d5::/48", "207266"}, - {"2a02:ff0:c00::/40", "12735"}, - {"2a06:4180::/48", "48293"}, - {"2a0e:8f02:f000::/48", "213127"}, - {"2407:74c0::/32", "138864"}, - {"2804:1690::/37", "263292"}, - {"2001:1248:a6da::/39", "11172"}, - {"2001:da8:5854::/37", "23910"}, - {"2001:1380:2000::/36", "19180"}, - {"240a:a907::/32", "144961"}, - {"240a:ac85::/32", "145855"}, - {"240a:aca5::/32", "145887"}, - {"2806:230:3024::/48", "265594"}, - {"2a0a:a140::/48", "206446"}, - {"2a11:ce80::/29", "204790"}, - {"2001:44b8:4065::/48", "4739"}, - {"2402:800:5eee::/43", "7552"}, - {"2405:9800:c91f::/48", "45430"}, - {"240a:a780::/32", "144570"}, - {"2a06:e7c0::/32", "202236"}, - {"2001:44b8:20::/46", "4739"}, - {"2405:4802:31b0::/33", "18403"}, - {"240a:a505::/32", "143935"}, - {"2604:ca00:f031::/46", "36492"}, - {"2a0d:4f00:10::/44", "48492"}, - {"2001:df5:bd80::/48", "134502"}, - {"2a09:94c0::/29", "209327"}, - {"2a0e:fd45:d30::/45", "207803"}, - {"2001:1438::/32", "8881"}, - {"2803:a640::/32", "46198"}, - {"2a01:bc00::/29", "43406"}, - {"2a07:240::/32", "16089"}, - {"2408:8459:7030::/41", "17622"}, - {"2804:c64::/32", "52699"}, - {"2804:1a08::/32", "262780"}, - {"2804:5ee8::/33", "269064"}, - {"2a02:26f7:da00::/48", "36183"}, - {"2001:1248:8301::/37", "11172"}, - {"2001:1bd0::/32", "28716"}, - {"2600:1417:74::/46", "20940"}, - {"2800:160:1b1d::/46", "14259"}, - {"2a02:26f7:c205::/46", "20940"}, - {"2a02:26f7:d15a::/47", "20940"}, - {"2404:4ac0::/32", "138572"}, - {"2804:1a6c::/32", "61858"}, - {"2804:5cb4::/32", "268925"}, - {"2804:67a4:124::/32", "269641"}, - {"2a03:a8a0::/29", "203195"}, - {"2a0e:8f02:f01b::/48", "213326"}, - {"2001:559:f::/48", "33287"}, - {"2001:678:9cc::/48", "61384"}, - {"2001:678:fb8::/48", "211042"}, - {"2001:67c:12b0::/48", "29468"}, - {"2402:800:9847::/43", "7552"}, - {"2409:8050:802::/40", "56047"}, - {"2803:100::/32", "7727"}, - {"2402:1b80:400::/35", "63956"}, - {"2801:11:1000::/48", "264633"}, - {"2803:2a80:f0::/47", "262928"}, - {"2803:d100:8000::/35", "52362"}, - {"2804:66cc::/32", "269583"}, - {"2804:6700::/32", "269597"}, - {"2804:777c:8000::/33", "271181"}, - {"2a0f:580::/29", "213250"}, - {"2a0f:9400:7b11::/40", "210872"}, - {"2001:1a11:119::/45", "42298"}, - {"2001:4490:dd18::/46", "9829"}, - {"2600:1403:16::/34", "20940"}, - {"2804:a00:5::/44", "262838"}, - {"2804:307c::/32", "264954"}, - {"2a0f:1e83:1::/48", "60781"}, - {"240e:44d:5b80::/41", "4134"}, - {"2610:b0:403a::/47", "3573"}, - {"2a06:a340::/29", "47689"}, - {"2602:ffb0:1c::/48", "64245"}, - {"2001:559:11c::/48", "20214"}, - {"2001:67c:2db8::/48", "39798"}, - {"240a:af38::/32", "146546"}, - {"2801:1f2::/44", "271820"}, - {"2804:14d:b08b::/41", "28573"}, - {"2001:559:8184::/48", "7016"}, - {"2401:d800:7670::/40", "7552"}, - {"2402:800:9701::/44", "7552"}, - {"2404:ec80::/32", "10076"}, - {"2607:f738:200::/41", "17184"}, - {"2a02:26f7:f488::/48", "36183"}, - {"2a0e:8f04::/30", "58299"}, - {"2001:559:106::/48", "33651"}, - {"2001:da8:5ff0::/45", "24360"}, - {"2406:7400:4::/48", "24309"}, - {"2800:160:10c4::/46", "14259"}, - {"2400:cb00:502::/45", "13335"}, - {"2604:a880:cad::/48", "14061"}, - {"2400:a980:c1::/48", "134169"}, - {"2406:da00:9000::/40", "16509"}, - {"2804:5354::/32", "268577"}, - {"2602:feda:f100::/38", "46997"}, - {"2804:60bc::/32", "269187"}, - {"2804:6ba8::/32", "270415"}, - {"2a07:14c0::/47", "59504"}, - {"2a0a:4d80::/29", "44462"}, - {"2402:800:5863::/43", "7552"}, - {"2408:8956:e100::/40", "17816"}, - {"2803:b000::/32", "27975"}, - {"2a07:b941:f00::/43", "209103"}, - {"2a0d:3a40:1::/48", "41838"}, - {"2001:da8:302e::/48", "23910"}, - {"2001:4998:124::/46", "26101"}, - {"2401:8e00:2800::/35", "9260"}, - {"240a:a534::/32", "143982"}, - {"2803:fc10::/32", "23031"}, - {"2804:28b8::/32", "263976"}, - {"2607:fb90:bf00::/33", "21928"}, - {"2804:27f0::/43", "263930"}, - {"2c0f:f1a0:8200::/33", "37314"}, - {"2001:67c:14a0::/48", "199665"}, - {"240a:ab41::/32", "145531"}, - {"2606:2800:4acc::/48", "15133"}, - {"2606:7b00:3fff::/48", "6939"}, - {"2806:2f0:44e1::/46", "17072"}, - {"2a02:26f7:d9c5::/46", "20940"}, - {"2409:8753:b00::/37", "56047"}, - {"240e:3b0:5600::/34", "136199"}, - {"2600:1802:15::/31", "16552"}, - {"2a02:6680:1162::/48", "16116"}, - {"2001:559:c277::/48", "33657"}, - {"2001:1978:202::/48", "13768"}, - {"2602:fd8c::/36", "32945"}, - {"2607:1400::/48", "13354"}, - {"2800:840::/32", "19422"}, - {"2801:160::/40", "52456"}, - {"2a07:9980::/29", "8487"}, - {"2600:1016:9010::/39", "6167"}, - {"2600:6c20:20::/44", "20115"}, - {"2803:5c80:5034::/48", "64114"}, - {"2a06:2400::/29", "49788"}, - {"2a09:5::/48", "3258"}, - {"2606:ca00::/37", "14537"}, - {"2620:5e:a000::/47", "394855"}, - {"2804:37f0:2100::/36", "266445"}, - {"2a02:c6c1:4::/47", "9009"}, - {"2001:559:c0df::/48", "33287"}, - {"2001:c20:5009::/38", "3758"}, - {"2001:1248:a560::/45", "11172"}, - {"2409:8a51:700::/36", "56047"}, - {"2606:87c0::/48", "399132"}, - {"2001:c20:8409::/48", "9255"}, - {"2402:800:5255::/42", "7552"}, - {"2801:1d0:1::/48", "3549"}, - {"2806:1050::/32", "8151"}, - {"2a03:cac0:a::/47", "61149"}, - {"2a0a:3280::/29", "49748"}, - {"2001:67c:6bc::/48", "201723"}, - {"2001:c20:c848::/45", "3758"}, - {"2400:36a0::/42", "63991"}, - {"2600:140f:fc00::/48", "9498"}, - {"2604:5500:5000::/38", "19165"}, - {"2804:3db8::/32", "266549"}, - {"2600:140f:4a01::/37", "20940"}, - {"2600:1419:2e01::/35", "20940"}, - {"2804:14d:8c89::/41", "28573"}, - {"2a00:d780::/32", "15557"}, - {"2a0e:4f80::/29", "51083"}, - {"2001:3c8:1013::/38", "4621"}, - {"2001:dca:1000::/33", "9735"}, - {"2404:3d00:4109::/48", "21433"}, - {"2600:100f:b1e0::/33", "22394"}, - {"2600:6c10:115::/44", "20115"}, - {"2a02:cb46::/31", "20546"}, - {"2a12:7900::/29", "1239"}, - {"2001:559:29c::/47", "7922"}, - {"2606:2800:357::/44", "15133"}, - {"2a04:dd00::/30", "60117"}, - {"2001:da8:23e::/48", "24350"}, - {"2001:67c:10a8::/47", "48387"}, - {"2409:8c85:aa4d::/43", "9808"}, - {"2606:6680:27::/44", "33387"}, - {"240e:44d:6700::/41", "140345"}, - {"2604:6980:1b0::/47", "26787"}, - {"2620:f3:8000::/48", "29825"}, - {"2804:9c4::/43", "53055"}, - {"2804:6ef4:4000::/32", "270629"}, - {"2804:8178::/32", "272456"}, - {"2a04:4e40:6230::/41", "54113"}, - {"2a06:fc40::/29", "204793"}, - {"2401:d800:8d0::/42", "7552"}, - {"240a:a60f::/32", "144201"}, - {"2a11:f2c0:ffff::/48", "210563"}, - {"2400:a7c0::/32", "133168"}, - {"2406:b400:d0::/47", "55577"}, - {"240a:aeab::/32", "146405"}, - {"2804:3d28::/44", "7063"}, - {"2a02:128:4::/48", "209863"}, - {"2a03:600::/32", "15774"}, - {"2a04:4e40:7a00::/48", "54113"}, - {"2620:1f:a000::/48", "396231"}, - {"2804:30b8::/40", "28154"}, - {"2804:7cd4::/32", "271521"}, - {"2a00:17c0:c4::/48", "29802"}, - {"240e:45c:8100::/40", "140533"}, - {"2600:1419:8c01::/35", "20940"}, - {"2600:2c01::/36", "16695"}, - {"2604:c00::/32", "32875"}, - {"2804:14d:5a00::/40", "28573"}, - {"2a02:26f7:d488::/48", "36183"}, - {"2a0a:d100::/29", "198551"}, - {"2406:a00::/32", "4694"}, - {"2409:8753:700::/36", "56047"}, - {"240e:964:cac0::/42", "133775"}, - {"2600:140b:a801::/37", "20940"}, - {"2604:4ec0::/35", "396480"}, - {"2804:1070:2000::/36", "28209"}, - {"2a0e:97c0:6e0::/47", "213367"}, - {"240a:17:f90::/44", "9605"}, - {"2804:14a0::/32", "263340"}, - {"2806:2f0:6041::/46", "17072"}, - {"2a01:3f8::/32", "34270"}, - {"2a02:5740:14::/48", "58065"}, - {"2a02:ee80:4217::/44", "3573"}, - {"2a0d:8040::/30", "61439"}, - {"2001:559:796::/48", "7015"}, - {"2001:579:7200::/36", "22773"}, - {"2409:8734:aa00::/33", "9808"}, - {"240a:ae02::/32", "146236"}, - {"2607:f330:5000::/48", "15130"}, - {"2a0a:5940::/48", "207080"}, - {"2a0e:acc0:ac01::/46", "208414"}, - {"2001:559:368::/48", "7922"}, - {"2602:fdeb:4::/47", "16509"}, - {"2604:f980:4400::/44", "19957"}, - {"2806:230:6035::/32", "11888"}, - {"2a02:730:5001::/32", "29278"}, - {"2a0b:1b80::/32", "206521"}, - {"2001:250:a80a::/33", "23910"}, - {"2001:dc1::/48", "16509"}, - {"2001:44b8:2050::/48", "7545"}, - {"2404:e7::/38", "703"}, - {"2404:bf40:8646::/40", "139084"}, - {"2804:5018::/32", "268369"}, - {"2806:2f0:9c81::/46", "17072"}, - {"2a09:ea80::/29", "213314"}, - {"2a0a:9301::/46", "35196"}, - {"2402:800:f3b0::/41", "7552"}, - {"2606:2800:6a28::/46", "15133"}, - {"2001:16c0:fefe::/48", "49981"}, - {"2605:3380:4408::/47", "12025"}, - {"2804:6be4::/32", "270432"}, - {"2804:8600::/32", "272613"}, - {"2a00:4bc0:211b::/42", "16509"}, - {"2a00:6fa0::/34", "49206"}, - {"2001:470:df::/42", "6939"}, - {"2401:4900:1050::/42", "45609"}, - {"2402:28c0:3::/45", "136620"}, - {"2408:8456:6440::/39", "17816"}, - {"2409:4070:5000::/31", "55836"}, - {"2604:fec0::/32", "21808"}, - {"2a02:888:404a::/45", "47794"}, - {"2a02:26f0:ee01::/35", "20940"}, - {"2a0b:b600:110::/44", "43350"}, - {"2001:559:4d5::/48", "33657"}, - {"2606:5d40::/32", "399440"}, - {"2804:22c0:4000::/32", "264120"}, - {"2806:2f0:95e3::/38", "17072"}, - {"2a01:498:600::/32", "42018"}, - {"2a0c:b642:a01::/48", "208753"}, - {"2001:559:c476::/48", "33650"}, - {"2001:1248:84ef::/43", "11172"}, - {"2001:4878:a225::/48", "12222"}, - {"2409:807c:4100::/30", "9808"}, - {"240e:3b5:1800::/34", "4134"}, - {"2606:b900::/32", "33089"}, - {"2804:38:4205::/46", "19089"}, - {"2804:5a04::/32", "268740"}, - {"2600:8807:bb2::/41", "22773"}, - {"2620:107:90f1::/48", "22787"}, - {"2a02:ee80:407f::/48", "3573"}, - {"2408:84f3:9640::/36", "17816"}, - {"240e:44d:3b00::/41", "140345"}, - {"2a09:d80::/29", "208861"}, - {"2001:67c:15b8::/48", "48345"}, - {"2604:4200::/32", "36374"}, - {"2a02:26f7:f5c0::/48", "36183"}, - {"2a10:b080::/29", "198473"}, - {"2001:67c:1808::/48", "56837"}, - {"240a:aba0::/32", "145626"}, - {"2600:1419:fc01::/30", "20940"}, - {"2600:1fa0:81c0::/44", "16509"}, - {"2607:ff28:b003::/45", "62904"}, - {"2620:11b:e090::/42", "3356"}, - {"2804:66ec::/32", "269591"}, - {"2a01:ce88:9000::/31", "51964"}, - {"2001:67c:74::/48", "35684"}, - {"2001:559:4b8::/48", "33287"}, - {"2409:8c85:aa02::/48", "38019"}, - {"2602:107:100d::/48", "33363"}, - {"2804:2000::/38", "264459"}, - {"2804:7afc::/32", "271404"}, - {"2a02:26f7:d508::/48", "36183"}, - {"2400:9d80:2::/32", "58714"}, - {"2405:a140::/32", "132559"}, - {"2606:82c0:e008::/48", "32167"}, - {"2804:301:4000::/35", "53237"}, - {"2804:3668::/32", "266346"}, - {"2a02:2370:c000::/48", "32787"}, - {"2a0f:9400:7a00::/48", "135395"}, - {"2001:398::/32", "7682"}, - {"240a:aea2::/32", "146396"}, - {"2801:0:3c0::/48", "61463"}, - {"2801:10:6800::/48", "271821"}, - {"2001:470:58::/48", "393350"}, - {"2001:559:c27b::/48", "33651"}, - {"240a:414c::/31", "58834"}, - {"240a:a0a1::/32", "142811"}, - {"2620:132:5000::/44", "20182"}, - {"2804:1080::/32", "28287"}, - {"2001:559:33e::/48", "7922"}, - {"2407:7a80:22::/48", "30337"}, - {"240a:a5e4::/32", "144158"}, - {"2607:6b80:5::/48", "46562"}, - {"2a00:1ec0:3::/34", "8544"}, - {"2a04:a9c0::/29", "35574"}, - {"2a0f:ea00::/46", "60781"}, - {"2001:559:c0f0::/47", "7922"}, - {"2607:ba80::/32", "394666"}, - {"2a09:bac0:472::/48", "13335"}, - {"2400:9380:93c0::/44", "136167"}, - {"2600:1404:29::/36", "20940"}, - {"2605:13c0::/32", "397103"}, - {"2804:49c0::/32", "267201"}, - {"2400:6280:143::/45", "132280"}, - {"2600:370e:7114::/46", "32261"}, - {"2804:6a38:1000::/34", "270320"}, - {"2405:7040:6000::/48", "4812"}, - {"2409:800b:2c00::/46", "24547"}, - {"240a:4082:c000::/35", "58834"}, - {"2804:27c8::/32", "263922"}, - {"2a0a:6040:ac6a::/40", "61138"}, - {"2001:678:790::/48", "201292"}, - {"240e:108:1143::/44", "4134"}, - {"2600:6c10:ffe8::/46", "20115"}, - {"2804:fe0::/34", "263049"}, - {"2804:1ba4::/32", "61741"}, - {"2401:d800:fa70::/40", "7552"}, - {"240a:a0ca::/32", "142852"}, - {"2602:fda7::/36", "397894"}, - {"2a0f:7840::/29", "6764"}, - {"2001:559:8179::/48", "7016"}, - {"2001:fd8:3440::/42", "132199"}, - {"2405:1c0:6671::/46", "55303"}, - {"240a:a916::/32", "144976"}, - {"2a00:cb60::/48", "49312"}, - {"2a09:2700:8::/48", "208187"}, - {"2001:559:82f7::/48", "33668"}, - {"2402:cf80:1003::/45", "62597"}, - {"2404:bf40:85c0::/48", "7545"}, - {"240a:ae2e::/32", "146280"}, - {"2a02:26f7:d20c::/48", "36183"}, - {"2001:4408:4300::/45", "55824"}, - {"2400:2000:8::/46", "17676"}, - {"2600:1006:b1f0::/33", "22394"}, - {"2607:fb90:db00::/34", "21928"}, - {"2a05:55c1:f::/29", "50597"}, - {"2a0e:7f00::/29", "62177"}, - {"2001:5f8:7f0a::/47", "18883"}, - {"2001:44b8:4067::/48", "4739"}, - {"2602:fc24:10::/45", "210630"}, - {"2a03:4d47::/48", "199610"}, - {"2001:df4:2680::/48", "140389"}, - {"2001:df7:5d00::/48", "133296"}, - {"2001:4878:2102::/48", "12222"}, - {"2404:b0:1002::/45", "4750"}, - {"240e:983:1200::/48", "134766"}, - {"2804:275c::/32", "263896"}, - {"2a00:e340::/29", "25160"}, - {"2001:1358::/32", "11960"}, - {"2400:4d40:206a::/32", "134204"}, - {"2403:8600:c90::/44", "45820"}, - {"240e:44d:6380::/41", "4134"}, - {"2607:fbd8::/32", "11260"}, - {"2606:ab40:1::/48", "400339"}, - {"2803:8d80::/33", "11664"}, - {"2804:3300::/32", "61587"}, - {"2806:230:2051::/48", "11888"}, - {"2001:559:80d8::/47", "7922"}, - {"2804:8360::/32", "272194"}, - {"2401:1d40:2f00::/48", "4811"}, - {"2604:1100:d000::/39", "11911"}, - {"2a02:2230:2200::/40", "25467"}, - {"2a0e:b107:17b0::/48", "210490"}, - {"2001:5014:400:5::/21", "1273"}, - {"2409:8087:7500::/36", "9808"}, - {"2600:1f11::/36", "16509"}, - {"2620:f0:c002::/45", "14148"}, - {"2a0c:7882::/29", "60781"}, - {"2001:b01::/29", "12874"}, - {"2a02:16f8::/32", "12703"}, - {"2a0a:5e40:1::/48", "200353"}, - {"240a:a375::/32", "143535"}, - {"2600:1017:a010::/39", "6167"}, - {"2804:2c58::/35", "265211"}, - {"2a01:6480:2::/44", "29049"}, - {"2a0c:a200::/29", "62183"}, - {"2a0e:8f02:f03c::/48", "208137"}, - {"2408:8957:28c0::/38", "17816"}, - {"2409:805a:2900::/48", "9808"}, - {"240e:44d:6a00::/42", "140345"}, - {"2804:3d2c::/32", "266258"}, - {"2a00:16d0::/32", "12714"}, - {"2402:c0c0::/32", "135071"}, - {"2404:e200:1::/46", "18353"}, - {"240e:3b3:c800::/37", "4134"}, - {"2600:140b:b400::/48", "24319"}, - {"2800:d302:28::/43", "11830"}, - {"2001:559:8111::/48", "33491"}, - {"2402:800:971d::/42", "7552"}, - {"2a07:3502:1100::/48", "213132"}, - {"2001:1248:9e00::/43", "11172"}, - {"2400:adc0:200::/48", "9541"}, - {"240a:a2d1::/32", "143371"}, - {"2600:3003::/29", "13649"}, - {"2607:a500:5::/44", "12025"}, - {"2a06:e881:79ff::/48", "211230"}, - {"2a0c:b641:410::/44", "31396"}, - {"2a10:4640::/47", "212815"}, - {"2001:500:d937::/48", "396566"}, - {"2804:3418:4000::/32", "265435"}, - {"2a0d:f340::/29", "208861"}, - {"2602:fcf6::/36", "51999"}, - {"2a04:6543::/32", "200168"}, - {"2a10:6680::/29", "204790"}, - {"2001:da8:269::/48", "133111"}, - {"240a:a630::/32", "144234"}, - {"2800:bf0:8085::/44", "27947"}, - {"2a01:9ce0::/32", "28682"}, - {"2a02:26f7:df44::/48", "36183"}, - {"2c0f:fc89:80b0::/33", "36992"}, - {"2408:8957:a400::/40", "17622"}, - {"240a:abec::/32", "145702"}, - {"2605:92c0:f000::/36", "13904"}, - {"2001:559:421::/48", "7922"}, - {"2001:998:83::/29", "719"}, - {"2001:df0:5980::/48", "139041"}, - {"2001:4479::/37", "7545"}, - {"2401:0:4000::/40", "23966"}, - {"2001:559:c06d::/48", "7922"}, - {"2405:1c0:6a31::/46", "55303"}, - {"240a:a34d::/32", "143495"}, - {"240c:c406::/32", "24369"}, - {"240d:c010:20::/43", "132203"}, - {"2a02:960::/32", "34168"}, - {"2a10:2f00:128::/48", "213372"}, - {"2001:df0:4b::/48", "45881"}, - {"2001:df0:ea00::/48", "135469"}, - {"2001:1a68:2d::/46", "15694"}, - {"2001:da8:26d::/46", "23910"}, - {"2001:df4:f80::/48", "140443"}, - {"2408:8456:5600::/42", "17622"}, - {"2408:8459:b210::/42", "17623"}, - {"2604:8700::/36", "19578"}, - {"2a0b:d080::/32", "205747"}, - {"2400:d400:18::/48", "45671"}, - {"2600:1415:4801::/37", "20940"}, - {"2604:880:12::/48", "29802"}, - {"2620:149:a07::/44", "714"}, - {"2a02:2398:100::/38", "9166"}, - {"2001:43f8:13f0::/48", "328541"}, - {"2400:9380:8cc0::/44", "136167"}, - {"240e:940:8e00::/40", "136197"}, - {"2a03:ffc0::/32", "199354"}, - {"2804:4b6c::/32", "267305"}, - {"2a0a:6200::/32", "680"}, - {"2c0f:f528::/46", "327782"}, - {"2001:fd8:f370::/36", "4775"}, - {"2407:fc40::/32", "7676"}, - {"2600:1406:401::/39", "20940"}, - {"2804:247c::/32", "264226"}, - {"2a01:358:3021::/36", "9121"}, - {"2600:140f:f401::/38", "20940"}, - {"2620:116:c000::/46", "62708"}, - {"2a00:1328::/32", "31078"}, - {"2a06:a400::/30", "203596"}, - {"2a09:5740::/29", "206793"}, - {"2400:dcc0:af04::/33", "38631"}, - {"2607:2700::/32", "11239"}, - {"2a02:26f0:cc01::/40", "20940"}, - {"2a08:600:99::/48", "206747"}, - {"2001:559:c1fe::/48", "33667"}, - {"2001:7fb:ff00::/45", "12654"}, - {"2409:8062:807::/40", "9808"}, - {"240e:978:3a00::/37", "4134"}, - {"240e:980:4400::/40", "134768"}, - {"2800:800:640::/40", "26611"}, - {"2804:7c08::/32", "271471"}, - {"2a06:9682::/29", "31293"}, - {"2a09:2040::/29", "61157"}, - {"2406:1600:201::/39", "23871"}, - {"2607:fc58:1:18::/64", "13536"}, - {"2801:80:260::/48", "53012"}, - {"2806:267:3300::/41", "13999"}, - {"2a01:4440::/32", "31499"}, - {"2a05:83c0::/29", "201248"}, - {"2001:7fb:fe03::/45", "12654"}, - {"2401:400::/32", "7604"}, - {"240a:abd8::/32", "145682"}, - {"2804:68c0::/32", "269713"}, - {"2001:df3:6b00::/48", "137217"}, - {"2400:e340:3::/32", "136450"}, - {"2408:840d:1a00::/42", "17621"}, - {"2600:6c38:9e::/42", "20115"}, - {"2806:310:31::/46", "16960"}, - {"240a:aa92::/32", "145356"}, - {"240a:ac47::/32", "145793"}, - {"240a:af2b::/32", "146533"}, - {"2a02:6200::/29", "35206"}, - {"2001:559:20d::/48", "33287"}, - {"2001:559:84f5::/48", "33657"}, - {"2001:559:85ff::/48", "21508"}, - {"240a:a9d9::/32", "145171"}, - {"2a0b:7280:0:4::/63", "43345"}, - {"2a0b:dc00::/29", "37002"}, - {"2001:559:84c7::/48", "7015"}, - {"2804:301:8000::/34", "53237"}, - {"2a04:8400::/32", "207176"}, - {"2a0f:8645:b00c::/30", "25682"}, - {"2001:df0:fb00::/48", "136105"}, - {"2001:4350:ffef::/48", "37703"}, - {"2001:43f8:110::/48", "37181"}, - {"240a:ad09::/32", "145987"}, - {"2605:f440:53::/48", "57439"}, - {"2a02:ee80:4252::/44", "3573"}, - {"2001:67c:2644::/48", "6908"}, - {"2001:bf7:1322::/44", "206813"}, - {"2a0c:7e80::/29", "204790"}, - {"2001:250:c2a::/45", "138374"}, - {"2a0c:9c0::/48", "210021"}, - {"2401:2f00::/32", "17617"}, - {"240a:a924::/32", "144990"}, - {"2605:e80::/32", "11269"}, - {"2800:160:200e::/43", "14259"}, - {"2800:bf0:3400::/44", "52257"}, - {"2803:21e0::/32", "262186"}, - {"2804:df4:8000::/35", "52531"}, - {"2804:2a00::/32", "264050"}, - {"2a0b:6b86:200::/40", "60271"}, - {"2804:5240::/32", "268505"}, - {"2409:8751:b00::/37", "56047"}, - {"240a:aba5::/32", "145631"}, - {"2804:52f4::/36", "268552"}, - {"2400:7400:4a::/48", "23736"}, - {"2407:5f80::/32", "135155"}, - {"240a:a0e3::/32", "142877"}, - {"2804:14c:87b3::/41", "28573"}, - {"2804:7828::/32", "271224"}, - {"2a00:f826:a::/48", "204254"}, - {"2001:da8:a3::/48", "24361"}, - {"2607:fb90:c13e::/48", "22140"}, - {"2a0b:fb00::/29", "200548"}, - {"2402:3580:8011::/48", "134118"}, - {"2402:e280:212c::/47", "134674"}, - {"2408:840c:5000::/40", "17621"}, - {"2408:8456:4e40::/39", "17816"}, - {"2600:1406:cc01::/35", "20940"}, - {"2600:1901:c120::/44", "396982"}, - {"2610:28:5031::/32", "81"}, - {"2620:128:1004::/48", "53620"}, - {"2400:cb00:350::/45", "13335"}, - {"2610:a1:1081::/48", "397228"}, - {"2001:559:8301::/48", "7015"}, - {"2001:67c:2070::/48", "200000"}, - {"2400:fc00:e50::/33", "45773"}, - {"2408:8459:ba10::/42", "17623"}, - {"240a:a126::/32", "142944"}, - {"240a:a613::/32", "144205"}, - {"2a00:8f00:205::/48", "16349"}, - {"2a10:a080::/29", "51083"}, - {"2608:c101:1::/48", "27066"}, - {"2806:102e:7::/44", "8151"}, - {"2a0b:b9c0::/32", "45040"}, - {"2001:67c:8e4::/48", "41666"}, - {"2001:67c:10b8::/48", "207021"}, - {"240e:37e:2600::/32", "4134"}, - {"2600:8807:5360::/34", "22773"}, - {"2a00:da8::/32", "34086"}, - {"2a06:4fc0::/29", "8888"}, - {"2a10:9840:1::/46", "211757"}, - {"2001:559:8334::/48", "20214"}, - {"2406:e040::/48", "140765"}, - {"2409:8915:1c00::/39", "56044"}, - {"2602:fc52:320::/48", "212243"}, - {"2602:ffe4:c25::/46", "21859"}, - {"2610:b0:401e::/42", "3573"}, - {"2804:4960::/32", "267181"}, - {"2a02:26f7:c380::/48", "36183"}, - {"2a0b:b8c0::/31", "60405"}, - {"2001:559:44d::/46", "7922"}, - {"240e:3be:5600::/34", "4134"}, - {"240e:980:8a00::/40", "134238"}, - {"2605:a404:8ad::/43", "33363"}, - {"2a0e:fd45:6938::/47", "207972"}, - {"2001:ee0:d140::/38", "45899"}, - {"2408:8957:7100::/40", "17816"}, - {"2804:22c:f700::/36", "22689"}, - {"2804:104c:6000::/40", "263629"}, - {"2806:1040:fc::/48", "20940"}, - {"2a02:26f7:f841::/46", "20940"}, - {"2a02:2e02:92a0::/37", "12479"}, - {"2a05:5940::/29", "42632"}, - {"2a05:fb41::/30", "59504"}, - {"2409:8a55:3e00::/33", "9808"}, - {"2605:6e00::/32", "40298"}, - {"2804:68b4::/34", "269710"}, - {"2a01:b740:a05::/48", "714"}, - {"2a02:29e0::/32", "49367"}, - {"2001:559:c537::/48", "33491"}, - {"2404:1a40::/39", "9744"}, - {"240a:a401::/32", "143675"}, - {"2a01:664:2::/38", "48951"}, - {"2a01:a5e0::/32", "201808"}, - {"2a02:17e0::/32", "29164"}, - {"2a03:6e0:8000::/33", "6663"}, - {"2405:2400::/48", "58640"}, - {"2605:e040::/32", "398325"}, - {"2620:123:20c0::/47", "30103"}, - {"2409:8c20:5a63::/34", "56046"}, - {"2605:9d80:a011::/48", "36678"}, - {"2a10:cdc0:f401::/36", "213100"}, - {"2801:80:760::/48", "263576"}, - {"2804:23fc::/32", "264196"}, - {"2a00:f520::/32", "29551"}, - {"2a10:600::/32", "209208"}, - {"2001:559:34a::/48", "33491"}, - {"2001:559:8476::/48", "7016"}, - {"240e:44d:6e40::/42", "140354"}, - {"2610:e0:9000::/36", "2572"}, - {"2a0c:b642:fc0::/43", "213190"}, - {"2404:b0:f::/43", "7568"}, - {"2404:ec:200::/39", "703"}, - {"2620:63:2000::/48", "18966"}, - {"2620:11b:e0bc::/48", "202818"}, - {"2001:678:e0::/48", "3303"}, - {"240e:958:2100::/30", "4134"}, - {"2804:9a4::/32", "23074"}, - {"2a02:8400::/25", "15557"}, - {"2a04:4e40:7000::/48", "54113"}, - {"2804:2430::/32", "264207"}, - {"2804:7604::/34", "271084"}, - {"2001:559:790::/48", "33659"}, - {"2001:67c:2828::/48", "61013"}, - {"2001:44b8:4051::/48", "4739"}, - {"2602:fd59:10::/48", "25773"}, - {"2804:5128::/32", "268434"}, - {"2001:559:79c::/48", "7016"}, - {"2600:380:a380::/36", "20057"}, - {"2605:bc0:2134::/47", "54201"}, - {"2804:57b4::/32", "268081"}, - {"2804:388::/30", "22085"}, - {"2001:559:c131::/48", "33491"}, - {"2001:559:c2a8::/48", "7922"}, - {"2800:160:1d3d::/46", "14259"}, - {"2800:800:a52::/42", "26611"}, - {"2804:58f4::/32", "268160"}, - {"2a01:8740:2::/45", "57344"}, - {"2a04:6f00::/32", "3214"}, - {"2a04:f340::/36", "8758"}, - {"2001:67c:12d8::/48", "1101"}, - {"2001:67c:2780::/48", "200060"}, - {"2404:0:3000::/36", "17709"}, - {"2806:2f0:99c1::/42", "17072"}, - {"2a00:8f20::/32", "60687"}, - {"2001:559:704::/48", "7922"}, - {"2407:e1c0:4c::/40", "146872"}, - {"2001:559:8536::/48", "33651"}, - {"2402:800:bad0::/42", "7552"}, - {"2405:9800::/45", "45430"}, - {"2408:84f3:a410::/42", "134543"}, - {"240e:4e::/37", "17633"}, - {"2620:4d:400b::/45", "62597"}, - {"2a02:26f7:d161::/43", "20940"}, - {"2001:559:c4cb::/45", "7922"}, - {"2408:8957:6b00::/40", "17816"}, - {"240a:aab9::/32", "145395"}, - {"2804:1110:ab02::/33", "262901"}, - {"2a00:1d23::/32", "206570"}, - {"2a02:2580::/32", "2119"}, - {"2a0d:c900::/29", "31543"}, - {"2001:559:37c::/48", "7016"}, - {"2001:df2:d580::/48", "140101"}, - {"240a:a498::/32", "143826"}, - {"240e:44d:3500::/42", "140345"}, - {"2620:6f:2000::/48", "397529"}, - {"2a02:388::/32", "39040"}, - {"2a02:26f7:f5c8::/48", "36183"}, - {"2001:4878:c347::/48", "12222"}, - {"2400:8b00:a00::/42", "45727"}, - {"240c:ca02::/31", "138371"}, - {"2607:f740:e644::/44", "63911"}, - {"2801:96::/40", "28586"}, - {"2804:76c8::/34", "271134"}, - {"2001:559:856c::/48", "33650"}, - {"2001:6d0:ffc8::/48", "204582"}, - {"2403:e200:11::/46", "45543"}, - {"2620:123:9001::/48", "33695"}, - {"2804:20fc:30::/37", "264525"}, - {"2a02:26f0:3701::/36", "20940"}, - {"2a04:4e40:2e30::/41", "54113"}, - {"2001:418:1401:2::/64", "2914"}, - {"2001:500:8e::/48", "12041"}, - {"2001:da8:8020::/44", "24364"}, - {"2400:ca02:f0e3::/39", "23688"}, - {"2803:ba0:100::/40", "267756"}, - {"2803:4980::/32", "52328"}, - {"2804:7b20::/32", "271412"}, - {"2a0e:e140::/48", "58255"}, - {"2001:67c:27a4::/48", "3301"}, - {"2001:de1::/42", "7667"}, - {"2401:d800:9d60::/40", "7552"}, - {"2600:370f:34ea::/39", "32261"}, - {"2620:149:a33::/40", "714"}, - {"2804:3710::/32", "266387"}, - {"2a00:a8e0:301::/48", "17054"}, - {"2001:559:87b4::/48", "33657"}, - {"2402:ef0b:c000::/36", "24515"}, - {"2405:b640::/47", "24305"}, - {"2409:8904:5570::/40", "24547"}, - {"2604:a100:200::/48", "6939"}, - {"2a00:7180:8008::/46", "207808"}, - {"2a02:26f7:d409::/42", "20940"}, - {"2400:f6c0::/37", "136530"}, - {"2620:0:6c2::/48", "16807"}, - {"2803:3440::/32", "263784"}, - {"2806:2f0:42e1::/46", "17072"}, - {"2a02:26f7:e185::/46", "20940"}, - {"2001:559:8265::/48", "7922"}, - {"2001:ee0:324b::/37", "45899"}, - {"240a:a37f::/32", "143545"}, - {"2803:1dc0::/32", "20207"}, - {"2806:2f0:8203::/42", "17072"}, - {"2a02:26f7:c705::/46", "20940"}, - {"2600:140f:5200::/48", "9829"}, - {"2a02:16a0::/32", "13030"}, - {"2a04:53c0:82::/47", "47784"}, - {"2a0d:3b00::/29", "204939"}, - {"2a00:f440:d::/32", "48347"}, - {"2a02:26f7:c7c5::/46", "20940"}, - {"2a03:1a00::/32", "39647"}, - {"2a00:1d34:4500::/34", "9121"}, - {"2001:1a68:ed00::/35", "15694"}, - {"2a03:3320:4::/48", "8670"}, - {"2a0b:fe40::/29", "2116"}, - {"2001:559:c2fc::/48", "33659"}, - {"2400:e1c0:10::/47", "58659"}, - {"2401:d800:7280::/42", "7552"}, - {"2402:3a80:58::/46", "38266"}, - {"2804:4f0::/32", "22129"}, - {"2401:d000::/28", "38195"}, - {"240a:a785::/32", "144575"}, - {"2606:4700:8390::/44", "13335"}, - {"2800:160:118c::/43", "14259"}, - {"2804:14d:4cb7::/44", "28573"}, - {"2a02:9010:45::/48", "20905"}, - {"2a04:1c42:100::/32", "201035"}, - {"2400:9380:9030::/47", "4809"}, - {"2408:84f3:f850::/44", "17816"}, - {"2408:8957:a500::/40", "17816"}, - {"240a:a105::/32", "142911"}, - {"2604:ee00:7::/48", "18865"}, - {"2804:3274::/32", "265079"}, - {"2409:8055:40::/48", "9808"}, - {"240e:978:100::/37", "4134"}, - {"2600:140b:e800::/48", "24319"}, - {"2a00:dfa0::/32", "50673"}, - {"2a02:24f0::/32", "8592"}, - {"2001:253:120::/48", "142086"}, - {"2001:559:c014::/48", "33651"}, - {"2001:ce1::/32", "137207"}, - {"240e:978::/40", "137702"}, - {"2607:6100::/45", "54380"}, - {"2a02:26f7:bb00::/48", "36183"}, - {"2001:da8:c807::/44", "24356"}, - {"2804:1a64::/32", "14457"}, - {"2a02:f240::/29", "18779"}, - {"2a10:d000:1d::/29", "35506"}, - {"2405:1c0:6771::/46", "55303"}, - {"2a02:25b0:aaab::/33", "49101"}, - {"2a03:3620::/32", "48522"}, - {"2a04:4e42:8::/43", "54113"}, - {"2406:840:e010::/47", "213069"}, - {"2408:840d:200::/42", "17621"}, - {"2602:feb2:80::/36", "62492"}, - {"2803:fbe0:10::/46", "270092"}, - {"2804:14d:4491::/41", "28573"}, - {"2001:559:81fe::/48", "33490"}, - {"2001:559:87b2::/48", "21508"}, - {"2402:800:bbf0::/37", "7552"}, - {"2804:62a8::/32", "269310"}, - {"2a01:bb60::/32", "202120"}, - {"2a03:2440::/32", "199660"}, - {"2001:1a10:ce::/39", "8781"}, - {"2402:800:31d3::/44", "7552"}, - {"2804:4dcc::/33", "52856"}, - {"240a:a0d8::/32", "142866"}, - {"240a:ab05::/32", "145471"}, - {"2600:1407:8001::/37", "20940"}, - {"2604:d600:1408::/39", "32098"}, - {"2a00:19a0::/32", "34222"}, - {"2a0d:8d06:1::/36", "60557"}, - {"2402:7500:800::/38", "24158"}, - {"240a:a9ba::/32", "145140"}, - {"2620:103::/47", "19994"}, - {"2804:46bc::/32", "267008"}, - {"2a00:1cb8:1::/46", "12713"}, - {"2a00:fd40:b::/48", "204402"}, - {"2a0e:aa07:f0d0::/46", "139216"}, - {"2001:559:356::/47", "7015"}, - {"2001:559:c09b::/45", "7922"}, - {"240a:ad37::/32", "146033"}, - {"2804:ef4:6420::/32", "28642"}, - {"2804:f78::/32", "263587"}, - {"2a0d:8700::/29", "3268"}, - {"2001:360:12::/45", "135887"}, - {"240a:a9d5::/32", "145167"}, - {"2603:90bc::/32", "11427"}, - {"2a0b:1040::/29", "50582"}, - {"2402:9b00:84::/32", "45796"}, - {"2405:a200::/32", "17534"}, - {"2406:3000:3:7::/60", "4657"}, - {"240a:a7ff::/32", "144697"}, - {"2804:1040:b0c1::/42", "263626"}, - {"2804:390c::/32", "266520"}, - {"2a0a:fa80::/29", "5582"}, - {"2001:ee0:3c40::/33", "45899"}, - {"2001:4200:8010::/34", "2018"}, - {"2402:800:b950::/42", "7552"}, - {"2620:10d:9004::/48", "25993"}, - {"2a03:2100::/42", "51559"}, - {"2001:fd8:1940::/37", "4775"}, - {"2408:8459:4c80::/42", "136959"}, - {"2602:fed2:fe0::/44", "53356"}, - {"2620:16:e000::/48", "396027"}, - {"2a03:d000:1110::/46", "31163"}, - {"2408:8256:3680::/48", "17816"}, - {"240a:a59c::/32", "144086"}, - {"240e:950:1000::/33", "4134"}, - {"2602:fcd3:210::/44", "1239"}, - {"2604:a180:c000::/34", "11139"}, - {"2620:5c:a000::/48", "397138"}, - {"2620:13d:e002::/47", "398123"}, - {"2801:19:9800::/48", "14080"}, - {"2804:14c:f427::/40", "28573"}, - {"2804:6fc0::/32", "270682"}, - {"2a00:8b40::/29", "60426"}, - {"2401:d800:d7f0::/36", "7552"}, - {"2405:b000:200::/37", "6262"}, - {"2a0e:cd00:680::/31", "23031"}, - {"2409:805c:3071::/40", "9808"}, - {"2620:31:4000::/40", "14977"}, - {"2620:119:5006::/44", "13443"}, - {"2a06:c700::/34", "6810"}, - {"2607:fcd0:1336::/47", "29761"}, - {"2604:8200:8000::/36", "23089"}, - {"2620:100:f00a::/48", "40068"}, - {"2806:2f0:7281::/46", "17072"}, - {"2a10:2f40::/32", "49824"}, - {"2001:559:71a::/48", "7015"}, - {"240a:abc3::/32", "145661"}, - {"2001:df0:d7::/44", "8075"}, - {"2001:fd8:b0f0::/39", "4775"}, - {"2406:8800:9023::/45", "17465"}, - {"2804:3bc0::/32", "262576"}, - {"2a01:73c0:700::/32", "21450"}, - {"2a02:2ad0:639::/45", "702"}, - {"2001:559:876a::/48", "33660"}, - {"2607:f548::/32", "22878"}, - {"2804:518::/32", "262491"}, - {"2a02:26f7:10::/48", "36183"}, - {"2a06:a000:180::/48", "48741"}, - {"2c0f:f6d0:84::/47", "327687"}, - {"2001:559:7b4::/48", "33491"}, - {"2001:559:85c3::/48", "13367"}, - {"2607:e880:5060::/46", "12220"}, - {"2804:842c::/32", "272244"}, - {"2a02:cb80:40f0::/48", "43766"}, - {"2001:559:587::/48", "7015"}, - {"2001:610:121::/29", "1103"}, - {"2400:9380:9220::/47", "4809"}, - {"2605:b640:1101::/48", "53736"}, - {"2804:74e8::/32", "271011"}, - {"2408:8456:a040::/38", "17816"}, - {"240a:ad68::/32", "146082"}, - {"2602:fdd9::/36", "396935"}, - {"2804:285c::/32", "263958"}, - {"2804:2bf4:c0c0::/34", "262785"}, - {"2a06:dd80::/29", "203544"}, - {"2a0e:1c80:e::/48", "1299"}, - {"2001:678:f78::/48", "213027"}, - {"2001:fd8:f1c0::/42", "132199"}, - {"2001:12e0:806::/37", "10429"}, - {"2408:8957:4e00::/40", "17622"}, - {"2600:1419:c401::/36", "20940"}, - {"2804:3ccc::/32", "266235"}, - {"2a00:79e1:f12::/47", "36384"}, - {"2402:800:52c5::/43", "7552"}, - {"240a:aa29::/32", "145251"}, - {"240a:ace9::/32", "145955"}, - {"2a09:d840::/29", "400522"}, - {"2610:a1:3038::/48", "12008"}, - {"2620:8e:2000::/48", "397263"}, - {"2806:20d:2100::/35", "32098"}, - {"2a02:d68::/32", "12778"}, - {"2001:500:99::/46", "30133"}, - {"2001:559:c2f5::/46", "7922"}, - {"2402:3a80:1e00::/45", "38266"}, - {"2406:daa0:80c0::/44", "16509"}, - {"2620:0:ee0::/48", "47015"}, - {"2a07:4080::/29", "47132"}, - {"2400:9800:6011::/45", "139994"}, - {"2402:f800:e000::/36", "7602"}, - {"2404:e200:5::/46", "18353"}, - {"2405:1a40::/48", "135981"}, - {"240e:3b1::/35", "134773"}, - {"2602:ffc5:104::/48", "44954"}, - {"2606:3c00:f010::/36", "20365"}, - {"2806:230:301e::/48", "265594"}, - {"2407:6e00:253::/45", "38332"}, - {"240a:a087::/32", "142785"}, - {"2605:12c0::/32", "394743"}, - {"2804:3d6c::/32", "266530"}, - {"2a00:1a18::/29", "20755"}, - {"2a04:3540::/30", "202053"}, - {"2a04:de40:80::/39", "201971"}, - {"2a05:89c0::/29", "49223"}, - {"2001:559:7f1::/48", "33490"}, - {"2001:df6:5680::/48", "142020"}, - {"2606:3c80:8100:3::/36", "33582"}, - {"2a01:6c8:2000::/36", "59705"}, - {"2001:e60:d3b0::/45", "4766"}, - {"2401:d800:2222::/41", "7552"}, - {"240a:a450::/32", "143754"}, - {"2804:1968::/32", "61793"}, - {"2a0e:b107:dc6::/48", "211486"}, - {"2001:559:3e5::/48", "33490"}, - {"240a:ad2b::/32", "146021"}, - {"240e:2c:c000::/31", "4134"}, - {"240e:3bf:6400::/35", "140312"}, - {"2620:119:e011::/42", "30337"}, - {"2600:9000:10dc::/42", "16509"}, - {"2a01:b960:230f::/48", "213246"}, - {"2a0c:9a40:8082::/48", "61138"}, - {"2401:7000:d902::/34", "45177"}, - {"240a:a2ca::/32", "143364"}, - {"240a:af6d::/32", "146599"}, - {"2606:4700:57::/44", "13335"}, - {"2001:559:8569::/48", "33651"}, - {"2804:3270::/32", "265078"}, - {"2408:8760::/32", "4837"}, - {"240a:aa3c::/32", "145270"}, - {"240a:ac10::/32", "145738"}, - {"2606:9500:4000::/36", "396071"}, - {"2a0c:7e41:8600::/48", "20473"}, - {"2a11:8b40::/29", "1239"}, - {"2001:43f8:1000::/48", "328739"}, - {"240e:3ba:3e00::/33", "140308"}, - {"2602:107:310::/48", "11426"}, - {"2804:6b40::/33", "270388"}, - {"2a00:1850:2e6::/44", "29357"}, - {"2a01:348:fac::/32", "39326"}, - {"2804:6cfc::/32", "270505"}, - {"240a:a3d9::/32", "143635"}, - {"2804:1a14:3000::/36", "265962"}, - {"2a00:d88::/32", "15498"}, - {"2a06:e881:5700::/40", "209619"}, - {"2a10:3044::/30", "398481"}, - {"2c0f:2d00::/32", "328916"}, - {"2001:559:8342::/48", "33651"}, - {"2001:559:c09e::/48", "33659"}, - {"2001:918:fff2::/48", "208813"}, - {"2804:3e70:abce::/35", "266596"}, - {"2a03:2c60::/32", "49627"}, - {"2a0a:df00::/29", "201894"}, - {"2a10:bc80::/29", "212081"}, - {"2602:fcf6:ff8::/48", "212623"}, - {"2605:a000:70f::/36", "10796"}, - {"2800:300:85e0::/36", "27986"}, - {"2001:559:852a::/48", "7015"}, - {"2001:559:c39c::/48", "7015"}, - {"2620:137:a001::/48", "394707"}, - {"2800:a30:7adf::/32", "262187"}, - {"2804:2c6c::/32", "265217"}, - {"2401:d800:28f0::/39", "7552"}, - {"2600:1a0f:2000::/48", "10307"}, - {"2a05:1083:fcc0::/44", "209870"}, - {"2001:67c:2ac0::/48", "29663"}, - {"2001:e60:a000::/43", "4766"}, - {"240a:a03f::/32", "142713"}, - {"2620:93:4000::/48", "36359"}, - {"2001:559:4bf::/48", "7016"}, - {"2001:1250:e500::/44", "22894"}, - {"2404:8000:1025::/44", "17451"}, - {"2804:8574::/32", "272580"}, - {"2001:67c:1770::/48", "3301"}, - {"2001:1248:5f8f::/42", "11172"}, - {"2001:4c40::/32", "8368"}, - {"240a:a82f::/32", "144745"}, - {"2605:6ac0::/36", "14586"}, - {"2400:8b00:700::/42", "45727"}, - {"240e:a7:9000::/28", "4134"}, - {"2600:140b:5400::/48", "31109"}, - {"2804:75d0::/32", "271071"}, - {"2001:67c:ac::/48", "44329"}, - {"2a0d:6d00::/29", "49223"}, - {"2a0f:9400:802c::/48", "213234"}, - {"2408:8256:397f::/48", "17816"}, - {"240e:474::/23", "4134"}, - {"2600:1407:4800::/48", "35994"}, - {"2600:1480:d000::/48", "21342"}, - {"2804:36e8::/32", "52924"}, - {"2806:230:403a::/48", "265594"}, - {"2001:550:8d02::/38", "174"}, - {"2600:380:7880::/39", "20057"}, - {"2600:5c00:3a89::/41", "20001"}, - {"2a05:e2c0::/29", "30766"}, - {"2001:250:600c::/46", "23910"}, - {"2401:d800:522::/40", "7552"}, - {"2401:f000:19::/32", "38477"}, - {"2409:802f:2909::/46", "56041"}, - {"240a:a973::/32", "145069"}, - {"240e:d6:7000::/28", "4134"}, - {"240e:966:2800::/37", "133776"}, - {"2600:1403:4001::/37", "20940"}, - {"2a02:26f7:e544::/48", "36183"}, - {"2a0a:65c0::/32", "15703"}, - {"2a0e:b102:130::/44", "39526"}, - {"2001:67c:2850::/48", "212894"}, - {"2405:f000::/32", "7530"}, - {"240e:9b:f012::/45", "140251"}, - {"2607:fd48:fff0:1031::/57", "13536"}, - {"2620:12c::/44", "19966"}, - {"240a:aac9::/32", "145411"}, - {"2620:105:b0bc::/41", "2055"}, - {"2804:1528::/32", "263374"}, - {"2a05:1082:5::/48", "136918"}, - {"2401:d800:5112::/41", "7552"}, - {"2602:80a:2000::/48", "398351"}, - {"2a01:6e40::/32", "21274"}, - {"2001:550:6c05::/38", "174"}, - {"2001:559:f4::/48", "7725"}, - {"2408:8256:268::/39", "17622"}, - {"2408:8456:9000::/42", "17622"}, - {"240e:5e:2101::/35", "4134"}, - {"2604:d600:15b4::/46", "32098"}, - {"2804:1a14:5000::/32", "28153"}, - {"2409:8914:a400::/39", "56044"}, - {"2600:1419:5c01::/38", "20940"}, - {"2a00:86c0:1053::/34", "2906"}, - {"2a02:2e02:1b40::/40", "12479"}, - {"2806:370:5000::/44", "28403"}, - {"2a03:5341:10::/44", "18666"}, - {"2a06:98c0:1001::/48", "139242"}, - {"2a06:e881:8706::/44", "210554"}, - {"2001:559:8193::/48", "33660"}, - {"2401:2700:a::/48", "9286"}, - {"2600:6c34:381::/48", "33588"}, - {"2607:f4e8:ac2::/48", "38622"}, - {"2620:131:1092::/41", "26450"}, - {"2804:163c:201::/39", "263277"}, - {"2a00:adc0::/35", "41655"}, - {"2a02:26f7:c35e::/42", "20940"}, - {"2a04:a181::/32", "47474"}, - {"2001:559:86ec::/48", "33667"}, - {"2408:8956:4500::/40", "17816"}, - {"240e:980:8c00::/40", "4134"}, - {"2600:140f:b000::/48", "9498"}, - {"2402:800:9a47::/43", "7552"}, - {"240a:a43d::/32", "143735"}, - {"2803:8ae0::/32", "269933"}, - {"2a00:f18::/32", "39545"}, - {"2a00:ab40:5001::/32", "41798"}, - {"2001:678:fd0::/48", "213103"}, - {"2600:803:639::/35", "701"}, - {"2602:200::/32", "7992"}, - {"2804:1e5c::/32", "264424"}, - {"2001:559:2c3::/48", "33287"}, - {"2001:c20:48a1::/48", "3758"}, - {"2001:4800::/32", "33070"}, - {"2600:1416:a001::/33", "20940"}, - {"2607:fb50::/36", "22781"}, - {"2405:d000::/33", "18024"}, - {"240a:a800::/32", "144698"}, - {"2606:2800:5a3c::/46", "15133"}, - {"2801:80:ea0::/48", "264095"}, - {"2803:9800:98c5::/46", "11664"}, - {"2a05:dac0::/46", "44166"}, - {"2a0e:b107:938::/48", "204446"}, - {"2405:1c0:6331::/45", "55303"}, - {"2603:fc88::/29", "63023"}, - {"2803:6604:c600::/34", "28075"}, - {"2804:d70:440::/32", "52626"}, - {"2a06:b100::/29", "198024"}, - {"2600:1f01:4880::/47", "16509"}, - {"2a02:26f7:d109::/42", "20940"}, - {"2a04:5d00:81::/29", "60241"}, - {"2408:8957:9c00::/40", "17622"}, - {"2607:f8f0:1000::/40", "271"}, - {"2a0d:6f80::/29", "212144"}, - {"2001:559:c1b8::/48", "33657"}, - {"2001:559:c38b::/48", "7922"}, - {"2001:67c:2198::/48", "8605"}, - {"2408:8646:1200::/32", "4837"}, - {"2804:4f6c::/32", "268326"}, - {"2001:559:c092::/48", "7922"}, - {"2402:5300:4e00::/40", "38733"}, - {"2a10:bac0::/32", "39396"}, - {"2400:a980:9100::/34", "133111"}, - {"2620:34::/48", "3356"}, - {"2620:11c:8900::/37", "19"}, - {"2a02:26f7:c002::/48", "36183"}, - {"2804:215c::/32", "264550"}, - {"2a02:26f7:c689::/48", "20940"}, - {"2a0e:b107:a20::/44", "213215"}, - {"2a12:a6c0::/29", "400522"}, - {"2001:559:8503::/45", "7922"}, - {"240e:3b5:dc00::/34", "4134"}, - {"2600:140f:5a00::/48", "55836"}, - {"2a01:53a0:1::/48", "199953"}, - {"2a02:d280::/29", "197296"}, - {"2a0c:e640:1000::/48", "57401"}, - {"2001:250:834::/48", "23910"}, - {"2001:4888:8040::/48", "6167"}, - {"2401:3cc0:701::/36", "137409"}, - {"2605:8d80::/37", "812"}, - {"2a00:d91:1::/29", "12552"}, - {"2a01:5041:3000::/48", "202196"}, - {"2a02:6c20:828::/48", "208143"}, - {"2a0c:e2c0::/29", "62275"}, - {"2c0f:ef30::/32", "328334"}, - {"2a0e:b107:11b0::/44", "140731"}, - {"2001:4878:a347::/48", "12222"}, - {"2a11:3280::/29", "204790"}, - {"2804:b18:d000::/34", "52941"}, - {"2804:56e8::/32", "268031"}, - {"2804:6860::/32", "269688"}, - {"2a0c:4400::/32", "39405"}, - {"2a0c:9a40:1070::/40", "34927"}, - {"2403:2c00:7:1::4/62", "4058"}, - {"240a:a8df::/32", "144921"}, - {"2804:5a00::/32", "268739"}, - {"2a0a:200::/29", "786"}, - {"2001:df0:7540::/48", "142439"}, - {"2409:8028:30a1::/43", "56041"}, - {"2603:c012:4000::/36", "31898"}, - {"2a01:110:9009::/33", "6584"}, - {"2a02:e0::/43", "34984"}, - {"2001:559:30::/48", "33287"}, - {"2602:feda:d91::/48", "57401"}, - {"2804:61dc:7000::/32", "269261"}, - {"2a0d:ee80::/32", "42061"}, - {"2001:1248:5a1b::/42", "11172"}, - {"2409:804b:2b09::/32", "24445"}, - {"2607:fc58:1:50::/64", "13536"}, - {"2620:10e:1000::/47", "33397"}, - {"2a00:8007:ff00::/40", "197898"}, - {"2a02:26f7:f8cc::/48", "36183"}, - {"2606:2800:4224::/48", "15133"}, - {"2a01:9dc0::/32", "48684"}, - {"2001:648:2001::/44", "5408"}, - {"2001:d10:8402::/44", "4787"}, - {"2001:dc7:ffd6::/42", "24151"}, - {"2001:128c:7100::/32", "25933"}, - {"2001:4490:3fc::/37", "9829"}, - {"2400:bd00::/32", "45267"}, - {"2607:cd8c::/31", "6528"}, - {"2607:f750:6000::/40", "23473"}, - {"2804:39d4::/32", "266053"}, - {"2403:9800:b066::/33", "4648"}, - {"2408:8256:3b8b::/48", "17816"}, - {"2602:fc23::/43", "8095"}, - {"2607:fc98::/32", "29854"}, - {"2a0f:1202::/32", "60781"}, - {"2604:b040:1::/48", "26282"}, - {"2605:2e00::/36", "63017"}, - {"2400:9700:130::/32", "24550"}, - {"2409:896a:ac00::/39", "9808"}, - {"2600:5c00:200::/48", "11351"}, - {"2620:13f:700a::/47", "51439"}, - {"2806:268:380:12::/37", "13999"}, - {"2a02:26f0:e400::/48", "34164"}, - {"2001:559:c3f7::/48", "33655"}, - {"2001:fd8:224::/46", "132199"}, - {"2408:8956:6b00::/40", "17816"}, - {"240e:e7::/28", "4134"}, - {"2604:fe00:8::/32", "30517"}, - {"2a02:26f7:c844::/48", "36183"}, - {"2a0c:7dc0::/29", "18779"}, - {"2001:df0:1a::/48", "38244"}, - {"2001:df5:9180::/48", "9009"}, - {"2400:a140::/32", "59125"}, - {"2404:bf40:8001::/48", "2764"}, - {"2407:f1c0::/48", "135921"}, - {"2804:4eb4::/32", "61593"}, - {"2001:4479:f000::/39", "7545"}, - {"2001:b400:e000::/36", "17421"}, - {"2402:800:3eee::/43", "7552"}, - {"2600:6c10:fffa::/29", "20115"}, - {"2801:80:ad0::/48", "52826"}, - {"2804:14d:c283::/41", "28573"}, - {"2a0f:c400:ca::/48", "60781"}, - {"2001:559:175::/48", "7922"}, - {"2602:fde5:2b::/36", "393424"}, - {"2a09:bac0:50::/46", "13335"}, - {"2405:d300:400::/48", "38809"}, - {"2602:fe4c::/36", "397427"}, - {"2a02:26f7:f4c9::/42", "20940"}, - {"2a06:e881:180f::/48", "206885"}, - {"2001:418:1401:99::/54", "2914"}, - {"2403:9bc0::/44", "135562"}, - {"2408:80ea:62c0::/42", "17622"}, - {"240a:a5d7::/32", "144145"}, - {"2620:0:2902::/48", "22843"}, - {"2a02:2698:202e::/38", "51645"}, - {"2a0c:280::/30", "34966"}, - {"2405:2001:2::/48", "6421"}, - {"2409:8e01::/28", "9808"}, - {"240e:44d:5a00::/42", "140345"}, - {"2603:fdd0::/22", "397165"}, - {"2604:d600:689::/45", "32098"}, - {"2604:f840::/32", "397026"}, - {"2405:600:3::/35", "55805"}, - {"2a10:4f40:1::/48", "28693"}, - {"2408:8456:c240::/39", "17816"}, - {"240a:adbd::/32", "146167"}, - {"2607:4880:e000::/36", "53508"}, - {"2804:3700::/32", "262312"}, - {"2804:7724::/32", "271158"}, - {"2001:559:c2e5::/48", "33491"}, - {"2401:d800:7612::/41", "7552"}, - {"2403:d4c0::/32", "136714"}, - {"2605:a404:53::/42", "33363"}, - {"2607:b600:8::/48", "10397"}, - {"2a00:8860:b00::/40", "39239"}, - {"2a02:26f7:fc05::/46", "20940"}, - {"2a0b:6903:fdb::/48", "206873"}, - {"2001:938:4052::/32", "8437"}, - {"240a:a096::/32", "142800"}, - {"240e:44d:3800::/42", "140345"}, - {"2605:dd40:8260::/44", "16509"}, - {"2606:f40:4000::/48", "16509"}, - {"2a00:f740:401::/32", "28875"}, - {"2a02:2ab0:213::/44", "702"}, - {"2a0b:20c0:200::/34", "205766"}, - {"2a0f:3105::/32", "199669"}, - {"2001:559:731::/48", "33661"}, - {"2001:1248:5920::/43", "11172"}, - {"2401:d800:d80::/42", "7552"}, - {"2404:ffc0:18::/32", "62707"}, - {"2405:ba00:880c::/48", "7160"}, - {"240a:a110::/32", "142922"}, - {"2a01:b747:4f2::/38", "714"}, - {"2401:8800:600::/40", "17439"}, - {"2605:c380::/32", "21713"}, - {"2606:6140:4000::/32", "31764"}, - {"2a0c:abc0::/29", "212961"}, - {"2001:559:827e::/48", "7922"}, - {"2001:67c:11c::/48", "196883"}, - {"2001:dc7:5d78::/40", "24151"}, - {"2001:ee0:d900::/37", "45899"}, - {"2607:f740:e614::/47", "63911"}, - {"2800:860:b::/36", "262197"}, - {"2603:f130::/25", "397165"}, - {"2a0e:aa07:f0d4::/48", "139216"}, - {"2001:f40::/43", "9930"}, - {"2409:4051:5000::/30", "55836"}, - {"2606:6c00:ffff::/48", "32787"}, - {"2800:160:15d3::/42", "14259"}, - {"2a0e:8a80::/32", "209916"}, - {"2a0f:9247::/44", "207267"}, - {"2402:800:7440::/42", "7552"}, - {"240a:a63c::/32", "144246"}, - {"2602:fd25::/40", "25848"}, - {"2a02:c800:43::/32", "43930"}, - {"2001:250:3410::/45", "138393"}, - {"2001:559:2ee::/48", "33657"}, - {"2001:559:425::/48", "33659"}, - {"2001:559:4f6::/48", "62644"}, - {"2406:3003:2028::/45", "4657"}, - {"2a0d:2587:8100::/41", "142055"}, - {"2001:16a2:c0f3::/48", "39891"}, - {"2402:800:7322::/41", "7552"}, - {"2a09:1::/48", "210937"}, - {"2408:80ea:76a0::/41", "17816"}, - {"2409:805c:3031::/41", "9808"}, - {"2602:fea3::/36", "399611"}, - {"2a01:5043:b::/48", "202196"}, - {"2a01:6880::/32", "13121"}, - {"2a02:2e02:1e40::/42", "12479"}, - {"2600:1480:6000::/40", "33905"}, - {"2803:2b00:8002::/33", "52468"}, - {"2803:d4a0::/32", "266827"}, - {"2001:250:222::/48", "133111"}, - {"2600:5c01:10df::/36", "10796"}, - {"2600:9000:1182::/45", "16509"}, - {"2800:bf0:14e::/43", "27947"}, - {"2001:16e0::/29", "12611"}, - {"2409:8904:8340::/37", "24547"}, - {"240e:688::/29", "4812"}, - {"2a0b:11c0:20::/44", "198682"}, - {"2a00:8280::/32", "45011"}, - {"2001:559:41::/48", "33668"}, - {"2001:559:ce::/47", "7922"}, - {"2001:1248:a402::/43", "11172"}, - {"2620:123:2085::/48", "30103"}, - {"2a02:348:5c::/42", "35470"}, - {"2001:678:be8::/48", "207563"}, - {"2001:67c:1b00::/48", "58027"}, - {"2408:8956:aa00::/40", "17622"}, - {"240e::/32", "4134"}, - {"240e:108:22::/48", "58466"}, - {"2600:1409:801::/35", "20940"}, - {"2607:fb28:11::/32", "9"}, - {"2800:5f0:a001::/35", "22724"}, - {"2001:67c:19dc::/48", "12552"}, - {"2400:2000:11::/20", "17676"}, - {"240e:44d:2680::/41", "4134"}, - {"2804:5854::/32", "268122"}, - {"2a00:c40:8095::/48", "206785"}, - {"2400:cb00:110::/44", "13335"}, - {"2408:8956:ed40::/40", "17816"}, - {"2408:8957:a100::/40", "17816"}, - {"2a01:8280:3331::/32", "44735"}, - {"2a02:b50::/34", "15570"}, - {"2001:418:1439::/48", "1225"}, - {"240e:967:c400::/39", "133775"}, - {"2620:10a:80ae::/48", "394354"}, - {"2801:114:3::/48", "23059"}, - {"2a02:26f7:d005::/46", "20940"}, - {"2a04:4e40:be00::/48", "54113"}, - {"2001:df0:7600::/48", "133281"}, - {"2402:800:372b::/41", "7552"}, - {"2408:8256:3769::/48", "17816"}, - {"2408:8459:8810::/42", "17623"}, - {"2408:8956:4400::/40", "17622"}, - {"240e:9b:f006::/44", "140247"}, - {"2a05:d050:1040::/44", "16509"}, - {"2408:8459:1b30::/41", "17622"}, - {"240e:a64:1a00::/34", "140330"}, - {"2604:b800::/32", "30029"}, - {"2605:f140::/32", "398735"}, - {"2804:7be8::/47", "271462"}, - {"2a02:10:32::/40", "24785"}, - {"2c0f:f0e0::/32", "36972"}, - {"2001:4b69::/32", "12635"}, - {"2600:6c10:f80f::/42", "20115"}, - {"2604:c6c0::/48", "46323"}, - {"2804:23b0:8001::/34", "262645"}, - {"2001:579:40ff::/39", "22773"}, - {"2001:45b1:1000::/28", "4780"}, - {"2406:da70:9000::/40", "16509"}, - {"2600:1417:8::/43", "20940"}, - {"2600:370f:20c3::/45", "32261"}, - {"2804:1094:b020::/36", "263641"}, - {"2804:3888::/32", "266484"}, - {"2804:5120::/32", "268432"}, - {"2c0f:e9c0::/32", "327750"}, - {"2001:67c:45c::/48", "15542"}, - {"240a:a3e4::/32", "143646"}, - {"240e:5f:600c::/48", "4134"}, - {"2620:107:9080::/48", "22787"}, - {"2804:744::/39", "262632"}, - {"2804:8650::/32", "272635"}, - {"2a00:1d58:fa00::/43", "47524"}, - {"2a09:4c0:fe1::/34", "58057"}, - {"2001:559:5ec::/48", "33657"}, - {"240e:44d:3200::/41", "140345"}, - {"2604:9200::/32", "36687"}, - {"2606:4700:302d::/43", "13335"}, - {"2001:559:1be::/48", "33667"}, - {"2001:67c:25cc::/48", "56511"}, - {"2001:67c:2b80::/48", "60997"}, - {"240a:a95e::/32", "145048"}, - {"2600:9000:1e08::/47", "16509"}, - {"2604:3d00:fc00::/28", "6327"}, - {"2a02:26f7:f6cd::/43", "20940"}, - {"2a02:2800::/29", "15388"}, - {"2605:b8c0::/32", "22534"}, - {"2a00:de20::/32", "62405"}, - {"2a07:3140::/29", "48408"}, - {"240e:982:c300::/35", "4134"}, - {"2605:1080::/46", "23367"}, - {"2605:a404:b22::/40", "33363"}, - {"2804:7fac::/32", "271702"}, - {"2a02:2aa8::/39", "702"}, - {"2a0e:b107:440::/44", "207445"}, - {"2409:8c20:8ab2::/35", "56046"}, - {"2620:96:e000::/48", "398324"}, - {"2001:559:2c4::/48", "33652"}, - {"2001:44b8:605c::/48", "7545"}, - {"2804:6974::/32", "270271"}, - {"2a00:1828::/32", "34240"}, - {"2406:b640::/39", "139138"}, - {"2600:6c38:1d8::/42", "20115"}, - {"2607:f608::/32", "7412"}, - {"2804:1bf0:8::/46", "61758"}, - {"2804:3354::/32", "265389"}, - {"2a04:4880::/29", "56450"}, - {"2405:201:2800::/35", "55836"}, - {"2600:1488:a381::/37", "20940"}, - {"2600:6c10:417::/44", "20115"}, - {"2602:806:1000::/48", "397556"}, - {"2804:6088::/32", "269173"}, - {"2a03:5341::/44", "10455"}, - {"2c0f:fa88::/32", "328191"}, - {"2001:678:6d8::/48", "39334"}, - {"2806:10ae:e::/43", "8151"}, - {"2804:c98::/32", "52726"}, - {"2a11:8680::/29", "18779"}, - {"2001:559:840f::/48", "22909"}, - {"2600:1419:11::/46", "20940"}, - {"2806:230:300f::/48", "11888"}, - {"2a02:26f0:6401::/38", "20940"}, - {"2a0a:54c1:25::/46", "62240"}, - {"240a:a83a::/32", "144756"}, - {"2804:663c::/32", "269535"}, - {"2001:4408:8310::/37", "4758"}, - {"240a:a74c::/32", "144518"}, - {"2602:ffc5:180::/46", "29802"}, - {"2603:c002:1d10::/40", "31898"}, - {"2804:29ec::/32", "264045"}, - {"2804:46dc:8400::/33", "267016"}, - {"2a01:53c0:2f::/48", "54994"}, - {"2a01:a080::/32", "30915"}, - {"2001:559:c2af::/43", "33657"}, - {"2001:df6::/46", "132557"}, - {"2407:2f40::/48", "140787"}, - {"2001:559:591::/48", "7015"}, - {"2001:67c:2fc::/48", "41700"}, - {"240a:a282::/32", "143292"}, - {"2a02:74a0:a008::/47", "204038"}, - {"2a03:a240::/46", "199441"}, - {"2001:df7:2980::/48", "142612"}, - {"2401:7000:a0a2::/36", "45177"}, - {"2409:8a14:4a00::/34", "56044"}, - {"2803:db40::/47", "64100"}, - {"2a02:888:8254::/29", "47794"}, - {"2a02:2e02:8d0::/42", "12479"}, - {"2a09:f900::/48", "29182"}, - {"2a0c:4680::/29", "47945"}, - {"2600:1806:120::/47", "16552"}, - {"2a07:14c0:3000::/36", "59504"}, - {"2a09:a4c0::/32", "210625"}, - {"2400:1700:210::/47", "136552"}, - {"2401:d800:fb00::/42", "7552"}, - {"240e:5f:6001::/48", "134774"}, - {"2620:171:56::/44", "42"}, - {"2800:3f0:4006::/32", "15169"}, - {"2804:1e94::/32", "264437"}, - {"2a02:26f7:c7c0::/48", "36183"}, - {"2404:98c0::/44", "135259"}, - {"240e:848::/44", "140553"}, - {"2a07:5900:102::/29", "203014"}, - {"2800:160:14b1::/44", "14259"}, - {"2a09:bac0:455::/48", "13335"}, - {"2600:1416:3001::/32", "20940"}, - {"2804:6da8::/32", "270547"}, - {"2404:4800:20::/48", "9892"}, - {"240e:84c:10::/42", "4134"}, - {"2806:230:3008::/48", "265594"}, - {"2a02:2e02:c40::/43", "12479"}, - {"2a03:ce40::/47", "28753"}, - {"2400:b5c0::/32", "9891"}, - {"2606:6dc0:1338::/32", "13781"}, - {"2804:88::/47", "28135"}, - {"2804:1bc:114::/48", "28122"}, - {"2804:21f8:f::/43", "262272"}, - {"2806:230:101b::/48", "11888"}, - {"2607:f8c0:205::/46", "25885"}, - {"2610:20:8050::/44", "6629"}, - {"2803:5840::/32", "262145"}, - {"2804:4b0:102::/44", "262459"}, - {"2a01:5e0::/32", "16019"}, - {"2a0a:bd40::/29", "208808"}, - {"2001:559:445::/48", "7016"}, - {"2600:100c:9210::/34", "22394"}, - {"2804:3698::/32", "266358"}, - {"2a00:13a0::/32", "31242"}, - {"2a01:8840:de::/42", "12041"}, - {"2a06:2c40::/29", "28952"}, - {"2a0e:e704:47::/48", "210683"}, - {"2408:8374::/28", "4837"}, - {"2600:1010:f000::/44", "6167"}, - {"2801:80:6e0::/44", "262829"}, - {"2804:6ed8::/32", "270622"}, - {"2806:10ae:19::/46", "8151"}, - {"2001:559:194::/48", "7016"}, - {"2001:668:117::/48", "25973"}, - {"2406:840:90::/48", "139317"}, - {"240a:a48c::/32", "143814"}, - {"2806:2f0:1380::/48", "22884"}, - {"2a02:23e8::/32", "51514"}, - {"240a:a166::/32", "143008"}, - {"240a:aa96::/32", "145360"}, - {"240e:438:7e40::/32", "4134"}, - {"2a02:26f7:e3::/48", "20940"}, - {"2a02:2e02:1d00::/41", "12479"}, - {"2a0c:59c0::/32", "3214"}, - {"2c0f:f7f8:1::/46", "10753"}, - {"2a03:9e44::/30", "31399"}, - {"2001:4998:efe7::/44", "10310"}, - {"2602:fe90:800::/46", "35913"}, - {"2001:c20:c831::/48", "9255"}, - {"2400:8b00:2080::/42", "45727"}, - {"2a02:26f7:ec85::/46", "20940"}, - {"2001:559:a1::/48", "7015"}, - {"2402:800:9b71::/40", "7552"}, - {"2408:8256:f96::/35", "17622"}, - {"2408:8957:d8c0::/38", "17816"}, - {"240e:95c::/34", "58563"}, - {"2800:1e0:e02::/39", "7195"}, - {"2804:1288:f01::/35", "263482"}, - {"2a00:7b00:e900::/35", "12338"}, - {"2a03:db80::/34", "680"}, - {"2001:559:569::/48", "33287"}, - {"2001:da8:22b::/48", "24350"}, - {"2402:2f80:4::/48", "63956"}, - {"2607:6980::/43", "62217"}, - {"2801:f0:20::/48", "13679"}, - {"2a02:2e02:8630::/41", "12479"}, - {"2600:141c:b001::/33", "20940"}, - {"2620:5a:6000::/48", "397088"}, - {"2a02:988::/32", "30925"}, - {"2001:480:34::/48", "252"}, - {"2001:559:543::/48", "21508"}, - {"2001:559:85bc::/48", "33657"}, - {"2402:800:5ce0::/39", "7552"}, - {"2605:f500:602::/32", "1828"}, - {"2a03:9b80:4000::/34", "5411"}, - {"2a0d:5080::/30", "62240"}, - {"240a:a9ce::/32", "145160"}, - {"240e:67f:e400::/39", "140330"}, - {"2620:76:e000::/48", "397869"}, - {"2a02:2878:8000::/34", "62310"}, - {"2a02:2b10::/32", "24992"}, - {"2001:dd8:1c::/46", "30133"}, - {"2402:4800::/32", "18228"}, - {"240e:1c:4000::/36", "4134"}, - {"2620:dd::/48", "19764"}, - {"2a01:c50e:400::/36", "12479"}, - {"2a07:22c0:a000::/35", "213190"}, - {"2001:da8:a02b::/38", "23910"}, - {"2001:df2:b680::/48", "140070"}, - {"2620:9f:14::/48", "3549"}, - {"2a00:1158:4::/32", "8972"}, - {"2001:67c:2cf4::/48", "59951"}, - {"240e:44d:5880::/41", "4134"}, - {"2607:f8f0:670::/48", "271"}, - {"2806:2f0:9d43::/40", "17072"}, - {"2a02:26f7:b8c8::/48", "36183"}, - {"2001:da8:21e::/48", "23910"}, - {"2602:fcad:1::/46", "54316"}, - {"2602:feda:2a0::/45", "204185"}, - {"2606:2800:4a80::/46", "15133"}, - {"2804:774:8800::/33", "52858"}, - {"2804:3018:caff::/34", "263020"}, - {"2a00:1058::/32", "39905"}, - {"2408:8459:2240::/40", "17623"}, - {"2409:8d05::/32", "24547"}, - {"2607:f160:8800::/40", "6167"}, - {"2806:230:2010::/48", "265594"}, - {"2001:559:8502::/48", "20214"}, - {"2001:1960:13::/40", "5650"}, - {"2400:480:9::/48", "4766"}, - {"2406:6cc0:a100::/48", "63515"}, - {"2409:800b:2909::/38", "9808"}, - {"2804:1278::/32", "263478"}, - {"2804:386c::/32", "266476"}, - {"2a01:6dc0::/32", "204467"}, - {"2408:8956:8a00::/40", "17622"}, - {"240a:a4dc::/32", "143894"}, - {"240a:a60c::/32", "144198"}, - {"2605:a401:8e3e::/41", "33363"}, - {"2a02:a38::/32", "2119"}, - {"2a02:26f0:be::/47", "20940"}, - {"2a10:9903:120::/44", "212806"}, - {"2001:579:8d4::/44", "22773"}, - {"2408:8456:640::/39", "17816"}, - {"240a:a871::/32", "144811"}, - {"240a:aeac::/32", "146406"}, - {"240e:968:2000::/36", "63835"}, - {"2a03:401:1::/48", "208258"}, - {"2409:8c4c:23::/45", "9808"}, - {"240e:438:6820::/43", "140647"}, - {"2a00:d2c0::/45", "12975"}, - {"2a03:5420::/32", "16353"}, - {"2402:e280:2159::/46", "134674"}, - {"2405:7e40::/32", "137515"}, - {"2408:8456:c840::/40", "17816"}, - {"240a:ab6f::/32", "145577"}, - {"240e:608:1200::/29", "4134"}, - {"2001:559:838e::/48", "13367"}, - {"2409:8924:7700::/36", "56046"}, - {"240a:af49::/32", "146563"}, - {"240e:438:a420::/43", "140647"}, - {"2600:1406:ac01::/35", "20940"}, - {"2806:2f0:9523::/41", "17072"}, - {"2001:253:126::/48", "142092"}, - {"2401:7640::/32", "63771"}, - {"2401:ce00::/32", "24139"}, - {"240e:67d:c400::/39", "140330"}, - {"2603:8078::/32", "10838"}, - {"2408:80ea:6900::/35", "17816"}, - {"2409:8055:21::/45", "56040"}, - {"2604:e480::/32", "36827"}, - {"2605:3680::/32", "63010"}, - {"2a04:f580:9290::/48", "4809"}, - {"2001:559:3ae::/48", "7922"}, - {"2401:3800::/32", "24424"}, - {"2408:8459:1010::/41", "17622"}, - {"240a:a6c7::/32", "144385"}, - {"2804:62d4::/32", "269321"}, - {"2a02:6900:8824::/48", "43898"}, - {"2a10:7ac0::/29", "212238"}, - {"2001:da8:8009::/48", "23910"}, - {"2001:df4:c00::/48", "133985"}, - {"2001:1900:5:2:2:0:c:2280/126", "29632"}, - {"240a:abf0::/32", "145706"}, - {"2600:3001:28::/35", "13649"}, - {"2a01:278::/32", "41913"}, - {"2001:678:35c::/48", "12331"}, - {"2a00:1a28:1106::/48", "33886"}, - {"2a02:26f7:d3c1::/46", "20940"}, - {"2a02:26f7:f340::/48", "36183"}, - {"2a02:cdc6:3101::/31", "59715"}, - {"2a0b:39c0:1010::/44", "12372"}, - {"2a10:2a80:ac::/48", "207727"}, - {"2400:cb00:a640::/45", "13335"}, - {"2404:b0:11::/46", "4750"}, - {"2001:67c:598::/48", "206897"}, - {"2402:9d80:a71::/44", "131429"}, - {"240e:982:6000::/40", "58563"}, - {"2600:802:1107::/44", "701"}, - {"2600:1012:b1f0::/33", "22394"}, - {"2602:107:410::/48", "12271"}, - {"2800:6a0::/32", "27932"}, - {"2804:1e34::/32", "264414"}, - {"2a00:a780::/45", "44229"}, - {"2001:678:71c::/48", "57265"}, - {"2806:370:71c0::/42", "28403"}, - {"2a10:cc40:120::/44", "210881"}, - {"2001:559:8273::/48", "7725"}, - {"2001:578:3f::/39", "22773"}, - {"2600:140f:a400::/48", "9498"}, - {"2400:dd05:1007::/30", "7497"}, - {"2404:4a00:6a00::/64", "55423"}, - {"240a:a99c::/32", "145110"}, - {"2605:f080:200::/40", "62755"}, - {"2a02:ee80:4097::/42", "3573"}, - {"2a04:4e40:b800::/47", "54113"}, - {"2a0c:c400::/32", "8473"}, - {"2001:559:8570::/47", "33651"}, - {"2620:1d0:5d::/48", "397226"}, - {"2a02:26f7:c501::/45", "20940"}, - {"2a05:78c0::/32", "51975"}, - {"2001:4998::/44", "10310"}, - {"2409:8054:3019::/48", "56040"}, - {"2804:78c::/32", "52859"}, - {"2001:df2:7480::/48", "139909"}, - {"2408:8957:f240::/40", "17622"}, - {"2804:51bc::/32", "268473"}, - {"2a02:26f7:fa81::/46", "20940"}, - {"2408:8256:3ca0::/39", "17816"}, - {"240a:a8f1::/32", "144939"}, - {"240e:44d:3480::/41", "4134"}, - {"240e:45c:2000::/37", "131285"}, - {"2a05:2600::/29", "57948"}, - {"2405:6e00:470::/40", "133612"}, - {"240a:a1fa::/32", "143156"}, - {"2804:7a60::/39", "271367"}, - {"2a03:db80:4420::/48", "5501"}, - {"2001:559:598::/48", "7015"}, - {"2001:678:cbc::/48", "43021"}, - {"2402:800:feb0::/39", "7552"}, - {"2600:1419:5001::/37", "20940"}, - {"2604:e840:11::/32", "396965"}, - {"2607:ae80::/46", "26558"}, - {"2620:192::/46", "396367"}, - {"2800:200:e850::/40", "12252"}, - {"2a04:4e40:800::/47", "54113"}, - {"2a0a:db40::/29", "200601"}, - {"2408:8456:c800::/42", "17622"}, - {"2804:72d0::/32", "270877"}, - {"2a00:cc40:1::/46", "8932"}, - {"2a0d:1a40:7900::/47", "207960"}, - {"2001:df0:24c0::/48", "149062"}, - {"2408:8256:3197::/44", "17623"}, - {"2800:bf0:2840::/40", "27947"}, - {"2a0f:8447::/32", "212521"}, - {"2620:171:a::/43", "42"}, - {"2804:36ec::/32", "266380"}, - {"2804:7ad8::/32", "271395"}, - {"2a00:cb8:44::/48", "15695"}, - {"2a01:8840:7e::/40", "12041"}, - {"2a0e:8d80::/29", "207999"}, - {"2603:c002:1f20::/34", "31898"}, - {"2605:1540::/32", "22497"}, - {"2804:218::/40", "27715"}, - {"2804:6c10::/32", "270443"}, - {"2a09:3740::/29", "208944"}, - {"2a0c:e340:2::/32", "30150"}, - {"2c0f:6a00::/32", "328829"}, - {"2001:253:107::/48", "142073"}, - {"2001:559:464::/48", "7725"}, - {"2408:84f3:ba10::/42", "134543"}, - {"2804:4dd4::/32", "268222"}, - {"2804:71f4::/32", "270822"}, - {"2001:559:c3dd::/48", "33287"}, - {"2401:ee00:1041::/40", "23951"}, - {"2600:140b:401::/36", "20940"}, - {"2804:c14:4000::/34", "52671"}, - {"2a00:1878::/29", "8448"}, - {"2402:800:557f::/40", "7552"}, - {"2402:8100:39c0::/44", "45271"}, - {"240a:a716::/32", "144464"}, - {"2600:1008::/43", "6167"}, - {"2804:5544::/32", "268699"}, - {"2001:67c:27a0::/48", "44404"}, - {"2001:4490:da30::/46", "9829"}, - {"2408:8956:3f00::/40", "17816"}, - {"240a:a51c::/32", "143958"}, - {"2606:9100:4000::/34", "1421"}, - {"2607:f588::/32", "3257"}, - {"2620:b4:4000::/48", "63314"}, - {"2403:1f00::/32", "10010"}, - {"240e:3b0:1400::/38", "134773"}, - {"2801:17:d000::/48", "265696"}, - {"2806:2f0:1282::/48", "22884"}, - {"2a00:65c0::/47", "25156"}, - {"2a02:2798::/32", "28775"}, - {"2a0b:f940:4af3::/32", "205373"}, - {"240a:a2d8::/32", "143378"}, - {"2801:80:39d0::/48", "271047"}, - {"2a03:f80:370::/47", "56630"}, - {"2001:2063::/24", "1299"}, - {"2409:8c54:1001::/42", "56040"}, - {"2803:3b80:3030::/33", "263702"}, - {"2804:b4:9000::/33", "28294"}, - {"2804:5e90::/32", "269041"}, - {"2401:1c00:4100::/35", "38809"}, - {"2405:9800:c90c::/46", "45458"}, - {"240a:a7f6::/32", "144688"}, - {"2804:2008::/32", "264461"}, - {"2a07:3403::/32", "46516"}, - {"2409:8907:7720::/36", "24547"}, - {"2604:2e80:1804::/37", "30036"}, - {"2604:a880:fffe::/48", "14061"}, - {"2804:164c:fb::/36", "263280"}, - {"2804:64e4::/32", "3"}, - {"2806:363:2000::/35", "22566"}, - {"2a01:1b8:5::/48", "206804"}, - {"2a02:26f7:e740::/48", "36183"}, - {"2a03:7380:1e80::/42", "13188"}, - {"2a05:1083:ff06::/48", "211876"}, - {"2001:559:724::/48", "33657"}, - {"2001:678:d44::/48", "213279"}, - {"2001:978::/46", "174"}, - {"2409:8054:34::/48", "9808"}, - {"2806:230:6000::/48", "265594"}, - {"2a00:4120:8000:6::/64", "201044"}, - {"2a01:c50f:af00::/40", "12479"}, - {"2a03:a8e0::/32", "57090"}, - {"2a06:3cc0::/29", "57763"}, - {"2001:67c:188c::/48", "196858"}, - {"2408:8459:8c10::/42", "17623"}, - {"240a:a529::/32", "143971"}, - {"240b:4003:3e8::/48", "45102"}, - {"2620:57:4001::/48", "393818"}, - {"2620:116:f000::/46", "14157"}, - {"2804::/37", "2716"}, - {"2a00:f10:171::/38", "48635"}, - {"2a00:c580::/32", "47114"}, - {"2a03:5a00:2f::/48", "203784"}, - {"2a05:d050:a040::/44", "16509"}, - {"2a12:3fc7::/48", "39753"}, - {"2001:4350:2001::/36", "2609"}, - {"2a00:17e8::/29", "50226"}, - {"2a09:7c0::/29", "209624"}, - {"2406:2000:efbc::/48", "10229"}, - {"2406:f940::/32", "141596"}, - {"240a:a17f::/32", "143033"}, - {"2607:6000:700::/40", "12189"}, - {"2620:118:8000::/48", "40885"}, - {"2620:171:c00::/45", "42"}, - {"2a02:3b0::/32", "31736"}, - {"2a02:26f7:c60d::/42", "20940"}, - {"2001:559:84a7::/48", "21508"}, - {"2602:fed2:7307::/48", "33696"}, - {"2604:9100::/36", "29944"}, - {"2a03:2c00::/32", "41268"}, - {"2602:fc88::/36", "14618"}, - {"2606:6680:10::/46", "40676"}, - {"2a10:fa81:1::/48", "48878"}, - {"2001:559:274::/48", "20214"}, - {"2001:559:87b3::/48", "7016"}, - {"2600:1480:1000::/40", "33905"}, - {"2604:f540::/32", "36435"}, - {"2620:ae:c000::/48", "18686"}, - {"2409:8a56:9300::/28", "56040"}, - {"2610:88::/46", "14037"}, - {"2804:30d8::/32", "264976"}, - {"2a03:2a60:8100::/47", "59871"}, - {"2001:668::/39", "3257"}, - {"2001:67c:273c::/48", "3303"}, - {"2409:40c0:1000::/32", "55836"}, - {"240a:a4a2::/32", "143836"}, - {"240c:ca31::/25", "23910"}, - {"2a00:1d58:b900::/37", "47524"}, - {"2a05:2605::/30", "49544"}, - {"2001:559:81b5::/48", "33657"}, - {"2405:8a00:4002::/44", "55824"}, - {"2606:9680:2000::/44", "22918"}, - {"2620:11c:8000::/36", "19"}, - {"2401:48c0::/32", "136119"}, - {"2804:2780::/32", "263905"}, - {"2806:20d:3512::/38", "32098"}, - {"2a02:26f7:70::/48", "36183"}, - {"2620:12f:6000::/44", "393668"}, - {"2408:8456:ec40::/40", "17816"}, - {"2409:8751:100::/38", "56047"}, - {"2606:1980:a::/45", "54994"}, - {"2804:2650::/32", "264340"}, - {"2804:5428::/32", "268632"}, - {"2804:7a30:8000::/33", "271353"}, - {"2806:230:5016::/48", "265594"}, - {"2a00:c78::/32", "28707"}, - {"2401:d800:9372::/40", "7552"}, - {"2404:bb40::/32", "138978"}, - {"240a:a2c5::/32", "143359"}, - {"240a:ae78::/32", "146354"}, - {"2607:f380:a50::/44", "2152"}, - {"2620:130:800a::/47", "3356"}, - {"2400:9380:8ac0::/44", "136167"}, - {"2606:9d00::/32", "46231"}, - {"2801:18:1800::/48", "271963"}, - {"2804:14d:4ced::/46", "28573"}, - {"2804:6728::/32", "269608"}, - {"2806:106e:12::/45", "8151"}, - {"2a00:1ca8:45::/48", "58061"}, - {"2a01:c50f:a4c0::/38", "12479"}, - {"2a0e:7f80::/29", "208927"}, - {"2001:559:8211::/48", "33651"}, - {"2a05:df01:2::/29", "47891"}, - {"2a0f:fe40::/48", "207642"}, - {"2400:cb00:458::/48", "13335"}, - {"2400:cb00:a773::/45", "13335"}, - {"2606:c700:6000::/32", "53850"}, - {"2a00:c7c0::/32", "205617"}, - {"2a09:3d05::/30", "210625"}, - {"2001:579:d164::/40", "22773"}, - {"2405:8a00:602f::/43", "55824"}, - {"2405:b900:40::/44", "55701"}, - {"2408:84f3:ae10::/42", "134543"}, - {"2001:67c:17ec::/48", "13127"}, - {"240a:a9c2::/32", "145148"}, - {"2600:6c10:f80a::/45", "20115"}, - {"2602:800:1006::/44", "16970"}, - {"2607:6b80:7::/48", "46562"}, - {"2a02:2440::/32", "33835"}, - {"2a11:740::/29", "204790"}, - {"2001:250:5064::/48", "23910"}, - {"2001:67c:6ec::/48", "1101"}, - {"2804:11bc:8000::/38", "263435"}, - {"2a00:a300::/32", "47764"}, - {"2400:9380:92b0::/45", "4809"}, - {"2403:9800:112::/33", "4648"}, - {"2406:e640::/48", "140766"}, - {"2a01:7160::/32", "49223"}, - {"2001:559:600::/40", "7922"}, - {"2001:579:d044::/40", "22773"}, - {"2600:1417:58:100::/56", "4788"}, - {"2804:14d:9000::/40", "28573"}, - {"2a00:da8:fffc::/46", "34086"}, - {"2a00:66e0::/32", "48953"}, - {"2a01:4800::/32", "8767"}, - {"2a02:26f7:cf49::/42", "20940"}, - {"2001:550:1d02::/45", "174"}, - {"2001:559:484::/48", "33287"}, - {"2404:8240::/32", "56067"}, - {"2804:18ec::/32", "61763"}, - {"2a02:26f7:c354::/47", "36183"}, - {"2001:16a2:3a::/45", "25019"}, - {"2001:48d8::/32", "6596"}, - {"240e:cf:8000::/36", "134238"}, - {"2600:1806:521::/48", "16552"}, - {"2620:89:8000::/48", "22990"}, - {"2804:3f7c::/32", "265896"}, - {"2a03:6f40::/32", "199508"}, - {"2a04:4640::/29", "16347"}, - {"2600:5c00:21cf::/48", "3456"}, - {"2804:1ac::/38", "53175"}, - {"2804:371c:2::/48", "266390"}, - {"2a02:2698:9c00::/38", "34150"}, - {"2001:67c:1212::/48", "42728"}, - {"240a:aed3::/32", "146445"}, - {"240e:f7:4000::/36", "58461"}, - {"2602:107:200d::/48", "20115"}, - {"2620:135:5005::/44", "26457"}, - {"2804:4618:3400::/32", "266968"}, - {"2a0f:5707:ab28::/48", "136620"}, - {"2c0f:fef0::/32", "36958"}, - {"2001:4c08:2009::/46", "3356"}, - {"2604:2d80:6680::/36", "30036"}, - {"2607:9e00:5002::/32", "30536"}, - {"2401:d800:9980::/42", "7552"}, - {"2a02:768::/32", "44489"}, - {"2a02:26f7:b880::/48", "36183"}, - {"2409:8052:1900::/37", "9808"}, - {"2600:1406:400::/48", "35994"}, - {"2a00:4802:300::/44", "13124"}, - {"2a02:26f7:e5c0::/48", "36183"}, - {"2a07:c800::/29", "42159"}, - {"2001:4860:4865::/32", "15169"}, - {"2600:1406:7801::/38", "20940"}, - {"2804:1a9c::/32", "61871"}, - {"2a00:11c0:63::/48", "42473"}, - {"2a00:1ec8:55::/42", "2854"}, - {"2a02:ef0::/32", "39242"}, - {"2a02:26f7:f58d::/42", "20940"}, - {"2a0e:4844::/32", "33823"}, - {"240a:ac08::/32", "145730"}, - {"2804:5110:161::/32", "268428"}, - {"2a10:65c0::/29", "9063"}, - {"2600:1406:1801::/39", "20940"}, - {"2606:5cc0:1100::/37", "36263"}, - {"2804:7ea8::/32", "271638"}, - {"2a02:26f7:f798::/48", "36183"}, - {"2001:2001:4000::/36", "3301"}, - {"2409:8c54:1000::/48", "9808"}, - {"240e:848:40::/44", "140553"}, - {"2620:100::/47", "19637"}, - {"2804:6fc:17::/44", "28158"}, - {"2804:6ea0::/33", "270609"}, - {"2a00:c020:9000::/33", "200414"}, - {"2a02:70:2::/39", "3326"}, - {"2600:140b:3::/48", "24319"}, - {"2602:fcde::/36", "14618"}, - {"2604:f440:6::/48", "397373"}, - {"2a02:26f0:3c::/48", "20940"}, - {"2a09:f140::/29", "211332"}, - {"2001:3c8:2707::/48", "4762"}, - {"2804:1c14::/32", "61636"}, - {"2a0c:9a40:8018::/46", "207965"}, - {"2001:250:6417::/48", "23910"}, - {"2001:559:8150::/48", "20214"}, - {"2001:1a11:148::/46", "42298"}, - {"2804:534c::/32", "268575"}, - {"240a:ac0d::/32", "145735"}, - {"2a00:b2a0::/32", "3212"}, - {"2403:ad80:98::/42", "134835"}, - {"2600:1408:cc01::/35", "20940"}, - {"2804:28c::/32", "262822"}, - {"2a00:e040:c00::/47", "15953"}, - {"2a0d:1f80::/32", "205614"}, - {"2001:253:129::/48", "142095"}, - {"2001:559:c241::/48", "7725"}, - {"2400:cb00:180::/46", "13335"}, - {"2401:d800:2e80::/42", "7552"}, - {"2a02:26f7:e685::/46", "20940"}, - {"2403:2c00:c::/32", "4058"}, - {"240a:afb2::/32", "146668"}, - {"2605:eac0::/32", "398698"}, - {"2a00:7c40::/32", "202940"}, - {"2400:5280:f803::/48", "23724"}, - {"2405:7f00:ab00::/37", "133414"}, - {"2a0d:7980::/47", "48635"}, - {"2001:418:8404::/63", "20940"}, - {"2001:678:b::/48", "51955"}, - {"2403:a000::/32", "9658"}, - {"2406:7700::/32", "132694"}, - {"2806:322:2030::/40", "28546"}, - {"2a0d:8900::/29", "40970"}, - {"2800:bf0:82c1::/44", "27947"}, - {"2804:2c98::/32", "265229"}, - {"2001:dcd:11::/48", "38796"}, - {"2001:1248:a45e::/42", "11172"}, - {"2403:2c00:fffc::/46", "4058"}, - {"2409:8914:3e00::/39", "56044"}, - {"2804:7ae4::/32", "271398"}, - {"2602:107:210::/48", "10796"}, - {"2607:f6b0::/32", "6189"}, - {"2804:69b8::/32", "270287"}, - {"240a:ad11::/32", "145995"}, - {"2604:f980:4380::/43", "19957"}, - {"2610:20:1000::/40", "10616"}, - {"2804:8f0::/32", "263040"}, - {"2a01:4a0:39::/41", "201011"}, - {"2a00:cbe0:100::/38", "60297"}, - {"2a02:26f7:e201::/46", "20940"}, - {"2604:55c0:a::/45", "4138"}, - {"2001:1a11:7b::/48", "8781"}, - {"2604:81c0::/39", "396422"}, - {"2806:288:4097::/48", "28469"}, - {"2a0d:2902:caf0::/45", "204185"}, - {"240e:438:4620::/43", "140647"}, - {"2a00:1490:f1ea::/48", "42416"}, - {"2a00:1588:d801::/46", "36040"}, - {"2a00:1807::/32", "57728"}, - {"2403:5f40:2::/44", "9268"}, - {"2408:84f3:2c90::/38", "17816"}, - {"2408:872b:404::/32", "4837"}, - {"2409:8a03::/32", "9808"}, - {"2a02:5d01::/29", "28972"}, - {"2a0a:c940::/32", "2119"}, - {"2001:570::/48", "6066"}, - {"2001:12e0:800::/45", "10429"}, - {"2602:fcb1::/36", "399306"}, - {"2804:1010:5000::/32", "263617"}, - {"2804:8280:800::/32", "272521"}, - {"2801:140:dddd::/48", "265731"}, - {"2804:5a2c::/32", "268753"}, - {"2804:7634::/32", "271096"}, - {"2a06:b040::/29", "203779"}, - {"2402:c680::/32", "134518"}, - {"2605:a404:aac::/41", "33363"}, - {"2803:74a0::/32", "267701"}, - {"2402:800:389b::/41", "7552"}, - {"2600:1406:4c01::/38", "20940"}, - {"2001:df4:7700::/46", "137176"}, - {"240a:a6ba::/32", "144372"}, - {"2605:900::/32", "12110"}, - {"2806:2f0:9b81::/46", "17072"}, - {"2001:768::/32", "8356"}, - {"240e:982:c200::/40", "139220"}, - {"2a01:c50f:c700::/36", "12479"}, - {"2a02:4540:7000::/43", "197207"}, - {"2402:800:9b0f::/43", "7552"}, - {"2800:160:1f0d::/43", "14259"}, - {"2402:e280:2160::/47", "134674"}, - {"2408:8256:2d6c::/48", "17816"}, - {"240a:ad28::/32", "146018"}, - {"2804:2c0:6608::/35", "262834"}, - {"2a0e:b107:7f0::/48", "207722"}, - {"2a10:e440::/32", "50293"}, - {"2001:770::/32", "1213"}, - {"2409:801f:3003::/45", "24400"}, - {"240a:a382::/32", "143548"}, - {"2600:1400:9001::/34", "20940"}, - {"2803:2ce0::/32", "269907"}, - {"2a02:26f7:b84d::/46", "20940"}, - {"2001:559:7b9::/48", "7015"}, - {"2405:c400:175::/46", "38880"}, - {"2600:6c38:8f::/43", "20115"}, - {"2606:2800:4ae0::/46", "15133"}, - {"2804:479c::/32", "267065"}, - {"2804:52a4::/32", "268531"}, - {"2a07:7e80::/29", "202870"}, - {"2a0b:f304:463::/32", "62240"}, - {"2a0b:f4c0:1b4::/48", "205100"}, - {"2401:d800:b710::/42", "7552"}, - {"2604:d600:15a6::/47", "32098"}, - {"2620:0:871::/45", "715"}, - {"2804:3b18::/32", "266129"}, - {"2a01:8780::/31", "50343"}, - {"2a01:a300::/32", "21310"}, - {"2a02:26f7:d6c0::/47", "36183"}, - {"2a0a:f00::/29", "207822"}, - {"2405:6000::/32", "4770"}, - {"240a:a520::/32", "143962"}, - {"2600:40ff:ff10::/47", "1321"}, - {"2607:f6f0:4005::/40", "29884"}, - {"2404:e800:104::/31", "55430"}, - {"2408:8956:cfc0::/35", "17622"}, - {"240a:a359::/32", "143507"}, - {"240e:44d:4700::/41", "140345"}, - {"2605:9840::/32", "1448"}, - {"2a00:d08::/32", "48218"}, - {"2001:250:201::/45", "23910"}, - {"2001:559:508::/48", "7922"}, - {"2001:924::/30", "8220"}, - {"2409:8006::/31", "9808"}, - {"2600:1404:cc01::/38", "20940"}, - {"2604:d600:1625::/44", "32098"}, - {"2a02:26f7:ec48::/48", "36183"}, - {"2a04:62c0::/31", "47477"}, - {"2001:550:702::/36", "174"}, - {"2001:c20:48c7::/48", "3758"}, - {"2001:1248:5a7f::/40", "11172"}, - {"2001:1900:2370::/48", "10753"}, - {"2409:8052:1802::/40", "56047"}, - {"240a:ab8b::/32", "145605"}, - {"2606:2e00:1::/48", "13213"}, - {"2607:1280:1120::/43", "394972"}, - {"2800:160:1b13::/44", "14259"}, - {"2a02:26f0:88::/48", "34164"}, - {"2c0f:f058::/32", "32860"}, - {"2001:1a11:101::/48", "8781"}, - {"2400:6280:11a::/48", "132280"}, - {"2408:8656:1800::/34", "17816"}, - {"2409:8939::/30", "9808"}, - {"2804:3e44:3000::/32", "266584"}, - {"2a00:1851:3e21::/39", "29357"}, - {"2a02:26f7:c352::/47", "20940"}, - {"2a02:26f7:db00::/48", "36183"}, - {"2a02:2bc0::/32", "31708"}, - {"2a02:2e02:2e80::/43", "12479"}, - {"2a0c:da04:15::/48", "202365"}, - {"2400:7400:64::/48", "38044"}, - {"2607:fb10:2011::/46", "55095"}, - {"2804:5040::/32", "268377"}, - {"2a04:3544:c000::/30", "202053"}, - {"2a0e:f200:144::/48", "30633"}, - {"2400:cb00:31::/48", "13335"}, - {"2401:bcc0::/48", "133311"}, - {"2602:fed2:3e8::/48", "139693"}, - {"2605:a000::/37", "10796"}, - {"2804:2e8:80c0::/33", "262847"}, - {"2804:2674:d004::/48", "264344"}, - {"2a03:c980:d990::/48", "210079"}, - {"2a09:bac0:451::/48", "13335"}, - {"2001:559:837c::/48", "20214"}, - {"2401:d800:9e72::/40", "7552"}, - {"240e:30e:5600::/31", "4134"}, - {"2604:d600:653::/45", "32098"}, - {"2804:f44::/32", "263574"}, - {"2401:a580:6::/32", "55403"}, - {"2600:1415:c00::/48", "24319"}, - {"2605:3380:4451::/46", "12025"}, - {"2405:800:2000::/33", "7545"}, - {"2a09:bac0:80::/47", "13335"}, - {"2001:df4:a700::/48", "134021"}, - {"240e:183:821c::/46", "140655"}, - {"2600:ec00::/29", "26073"}, - {"2604:5800::/32", "19969"}, - {"2001:559:1d9::/48", "20214"}, - {"2001:648:3500::/29", "5408"}, - {"2001:df2:d00::/48", "134026"}, - {"2001:4408:5::/39", "4758"}, - {"2600:ec04:3f3::/28", "26073"}, - {"2602:fd47:d01::/38", "398461"}, - {"2a00:13fa::/32", "42087"}, - {"2001:858::/32", "8437"}, - {"2001:4878:a102::/48", "12222"}, - {"2400:9380:96c0::/44", "136167"}, - {"2806:20d:52ff::/37", "32098"}, - {"2402:800:5dc5::/43", "7552"}, - {"2406:840:e777::/48", "136591"}, - {"240e:974:e200::/47", "38283"}, - {"2604:9e40:4::/32", "29457"}, - {"2804:ae0:8630::/33", "28352"}, - {"2804:145c:5000::/32", "263327"}, - {"2806:2f0:3341::/46", "17072"}, - {"2001:1218:6056::/40", "278"}, - {"2607:fb10:2043::/43", "2906"}, - {"2800:d302:22::/47", "11830"}, - {"2a11:5c80::/29", "204790"}, - {"2001:559:c127::/48", "33489"}, - {"2600:380:d980::/41", "20057"}, - {"2804:7f78::/32", "271690"}, - {"2a02:26f7:d081::/46", "20940"}, - {"2402:800:f990::/42", "7552"}, - {"2409:4073:3000::/33", "55836"}, - {"2a03:7380:4000::/40", "13188"}, - {"2a0f:9400::/45", "139686"}, - {"2001:1a11:144::/48", "8781"}, - {"240a:a759::/32", "144531"}, - {"240e:97a:2e00::/31", "4134"}, - {"2606:2800:6a20::/47", "15133"}, - {"2a01:827::/32", "30722"}, - {"2001:559:8282::/48", "33660"}, - {"2001:4b22:10:1::/47", "34288"}, - {"2806:230:203f::/48", "11888"}, - {"2806:282::/32", "265509"}, - {"2001:559:7eb::/48", "7015"}, - {"2401:d800:f5c0::/42", "7552"}, - {"2403:7100::/44", "132220"}, - {"2a02:50a0::/32", "201787"}, - {"2a07:3500:19e0::/48", "38915"}, - {"2001:4d0::/39", "297"}, - {"2001:559:861e::/48", "7922"}, - {"2409:8043:2903::/48", "9808"}, - {"2803:c240:2000::/32", "41095"}, - {"2a02:ee80:407d::/46", "3573"}, - {"2a09:4b44:c::/47", "61317"}, - {"2001:500:133::/48", "396549"}, - {"2001:559:c270::/48", "33651"}, - {"2800:be0:3e8::/37", "267848"}, - {"2804:2b5c::/32", "265150"}, - {"2a02:26f7:d9c4::/48", "36183"}, - {"2001:559:336::/48", "33650"}, - {"2001:559:5c5::/48", "33668"}, - {"2001:67c:398::/48", "50213"}, - {"2602:fc3b::/39", "399970"}, - {"2001:500:ed30::/48", "7342"}, - {"2001:4048::/39", "33922"}, - {"2a01:5460::/32", "57795"}, - {"2603:c011:4000::/36", "31898"}, - {"2804:354:b::/32", "262874"}, - {"2001:559:c234::/48", "33652"}, - {"2800:440:8066::/48", "27738"}, - {"2a02:26f7:bdc5::/46", "20940"}, - {"2c0f:f5f8::/32", "37717"}, - {"2001:44b8:6050::/48", "7545"}, - {"2409:8924:2500::/38", "56046"}, - {"2600:370f:6042::/45", "32261"}, - {"2800:bf0:8141::/45", "52257"}, - {"2c0f:1200::/32", "328820"}, - {"2001:da8:203e::/48", "23910"}, - {"2409:8069:2a06::/47", "9808"}, - {"2001:559:422::/48", "7725"}, - {"2001:559:877e::/48", "7015"}, - {"2409:8914:600::/39", "56044"}, - {"2602:809:6000::/44", "399214"}, - {"2804:85a8::/32", "272593"}, - {"2001:67c:2d0::/48", "21155"}, - {"2605:bcc0::/33", "40718"}, - {"2a09:1f00::/29", "197205"}, - {"2a0d:1a45:27::/34", "57782"}, - {"2602:fc09:819::/40", "13780"}, - {"2804:4304::/32", "267543"}, - {"2001:550:1:200::/55", "174"}, - {"2a06:1b80::/29", "199462"}, - {"2a0b:2c0:deae::/29", "205831"}, - {"2001:16f7::/32", "201370"}, - {"2408:8456:600::/42", "17622"}, - {"240e:9b:f015::/46", "140252"}, - {"2001:559:807d::/46", "33657"}, - {"240a:a436::/32", "143728"}, - {"2a0f:a02::/29", "60781"}, - {"2a10:d504:2::/31", "22773"}, - {"2001:559:50d::/48", "33490"}, - {"2001:579:904b::/40", "22773"}, - {"2001:6d0:ffb9::/48", "43832"}, - {"2408:8000:5004::/48", "139007"}, - {"2409:8904:5a70::/40", "24547"}, - {"240a:61:2e00::/48", "9605"}, - {"240e:3bb:2c00::/35", "134774"}, - {"240e:44d:4b80::/41", "4134"}, - {"2a0f:ca87:7::/48", "208471"}, - {"2800:bf0:81c3::/45", "52257"}, - {"2a02:7aa0:1619::/48", "52173"}, - {"2a0d:9e40:1000::/36", "9558"}, - {"2600:6c38:d2d::/41", "20115"}, - {"2a02:26f7:d0c1::/46", "20940"}, - {"2600:1417:1800:100::/54", "16625"}, - {"2409:8052:2800::/47", "56047"}, - {"240a:a3a1::/32", "143579"}, - {"240e:7:4800::/37", "4134"}, - {"2a0e:8140::/29", "35048"}, - {"2001:559:c043::/48", "7922"}, - {"2400:9380:a042::/48", "23764"}, - {"2401:b400:1::/45", "58448"}, - {"2409:8d4c::/30", "9808"}, - {"2605:7e80::/32", "62969"}, - {"2804:e78::/32", "262957"}, - {"2a02:26f7:da45::/46", "20940"}, - {"2a09:ff00:102::/48", "1239"}, - {"2a0d:40c0::/32", "203448"}, - {"2001:253:137::/48", "142103"}, - {"2001:1978:2000::/40", "13768"}, - {"2404:3e00:a300::/37", "38758"}, - {"240e:983:1b01::/48", "134771"}, - {"2620:7d:e000::/48", "42909"}, - {"2806:2f0:60a3::/41", "17072"}, - {"2001:559:c4a7::/48", "33657"}, - {"2600:26c6:8::/48", "20115"}, - {"2602:ff99:2::/47", "14333"}, - {"2804:8480:100::/36", "272264"}, - {"2600:1fa0:2040::/44", "8987"}, - {"2600:e00c::/32", "22995"}, - {"2804:54a0:1c00::/39", "27688"}, - {"2804:8268::/32", "272518"}, - {"240e:966:2000::/37", "4134"}, - {"2801:80:a50::/48", "28148"}, - {"2a07:3502:10e0::/48", "1136"}, - {"2001:559:821f::/48", "7725"}, - {"2001:7f8:18::/48", "2128"}, - {"240e:9b:f030::/46", "140261"}, - {"2803:6d00::/32", "52444"}, - {"2804:1364::/32", "263532"}, - {"2a01:570::/47", "33941"}, - {"2a0e:8f02:2151::/46", "211869"}, - {"2406:840:a08::/48", "139317"}, - {"2408:824e::/27", "4837"}, - {"2804:3f88::/32", "265899"}, - {"2a0f:e404:107::/48", "58057"}, - {"240a:a4aa::/32", "143844"}, - {"2804:6940::/32", "270258"}, - {"2a00:a6a0:1::/48", "60587"}, - {"2a03:4b00::/32", "49888"}, - {"2a09:ce00::/29", "208861"}, - {"2800:160:2184::/43", "14259"}, - {"2a02:610:fffe::/48", "43615"}, - {"2a0e:f41::/32", "208567"}, - {"2001:608::/32", "5539"}, - {"2001:67c:25c4::/48", "31080"}, - {"2001:4d78:100::/36", "15830"}, - {"2400:cb00:474::/46", "13335"}, - {"2409:8924:2d00::/38", "56046"}, - {"2409:8d20::/29", "56046"}, - {"2001:9a8::/32", "15703"}, - {"2401:d800:7130::/41", "7552"}, - {"2607:f6f0:4001::/48", "394749"}, - {"2a00:16f8:f::/48", "6461"}, - {"2a02:26f7:f941::/46", "20940"}, - {"2001:67c:e0::/48", "197000"}, - {"2801:80:2510::/48", "268507"}, - {"2806:20d:110c::/43", "32098"}, - {"2a00:8c40:238::/48", "42037"}, - {"2a02:ac87:59cc::/32", "25145"}, - {"2804:3e60:110::/41", "266592"}, - {"2804:4c40::/32", "267359"}, - {"2001:559:81c1::/48", "33287"}, - {"2404:bf40:8540::/48", "7545"}, - {"2600:6c10:f347::/44", "20115"}, - {"2804:11ec::/32", "52850"}, - {"2001:579:1d84::/34", "22773"}, - {"2402:800:f480::/39", "7552"}, - {"2408:8459:c830::/41", "17622"}, - {"2409:8070:ab5::/44", "9808"}, - {"2a02:26f0:d1::/48", "34164"}, - {"2a06:8340::/29", "202177"}, - {"2a0e:46c4:2820::/44", "210631"}, - {"2a0e:8f02:f00f::/48", "212358"}, - {"240e:3bf:ac00::/35", "4134"}, - {"2804:14c:fc99::/41", "28573"}, - {"2a06:1e00:2d::/48", "212968"}, - {"2a0e:97c3:7f6::/48", "20473"}, - {"2401:d800:fc32::/40", "7552"}, - {"2600:400:3e10::/32", "15147"}, - {"2001:4878:4000::/48", "12222"}, - {"2001:4998:10::/46", "10310"}, - {"2607:f160:12::/48", "22394"}, - {"2804:e70::/32", "262955"}, - {"2a0f:a304::/32", "44326"}, - {"2401:d180::/46", "133865"}, - {"2607:f380:806::/47", "257"}, - {"2804:1414::/32", "263311"}, - {"2a04:cc40::/29", "59770"}, - {"2a0c:9e40:1::/46", "60781"}, - {"2a09:d2c1:4::/48", "207518"}, - {"2001:df7:5100::/48", "4826"}, - {"2409:8704:3100::/36", "24547"}, - {"2607:fdc8:c00::/48", "30036"}, - {"2804:6a78::/32", "270338"}, - {"240a:a373::/32", "143533"}, - {"240e:109:804c::/25", "4134"}, - {"2600:1407:a001::/36", "20940"}, - {"2804:1578::/32", "61906"}, - {"2804:37a8:1214::/44", "266428"}, - {"2a0b:c6c0::/29", "57407"}, - {"2a11:380::/29", "211319"}, - {"2a11:29c0:1::/48", "210738"}, - {"2c0f:f588::/32", "327966"}, - {"2001:df0:218::/48", "38830"}, - {"2408:8256:3d7c::/46", "17623"}, - {"2001:df7:9f80::/48", "147050"}, - {"2409:802f:2b08::/37", "56041"}, - {"2602:ffb6::/36", "174"}, - {"240a:a0e7::/32", "142881"}, - {"2600:1016:a010::/39", "6167"}, - {"2804:5b60::/32", "268838"}, - {"2001:559:822f::/48", "33287"}, - {"2001:df5:e800::/48", "133498"}, - {"2800:160:2b9d::/42", "14259"}, - {"2a01:37:4000::/35", "8875"}, - {"2401:5840::/38", "132113"}, - {"2402:800:5ec0::/43", "7552"}, - {"2607:f368:f00::/40", "46846"}, - {"2800:800:a42::/43", "26611"}, - {"2801:1c8:8a::/48", "27951"}, - {"2804:2b34::/32", "265140"}, - {"2804:4150::/32", "267426"}, - {"2001:b031:ae00::/30", "3462"}, - {"2404:3d00:417c::/40", "3573"}, - {"2408:8a04:e000::/40", "9929"}, - {"2607:fc50:2002::/33", "36236"}, - {"2600:381:400::/34", "7018"}, - {"2804:21a4::/34", "53190"}, - {"2a03:e140:1a::/48", "50317"}, - {"2a0d:2400::/30", "62068"}, - {"2403:e800:922::/32", "4637"}, - {"2605:a000:40e::/48", "11955"}, - {"2606:7240::/48", "399914"}, - {"2620:0:50e0::/48", "31859"}, - {"2804:4b0::/39", "262459"}, - {"2804:744:1100::/32", "262632"}, - {"2804:7180::/39", "270793"}, - {"2a03:5640:f501::/48", "2906"}, - {"2a09:4c2:4a::/48", "212904"}, - {"2408:8026:390::/37", "17621"}, - {"2408:8956:ab00::/40", "17816"}, - {"240a:2:c90::/44", "9605"}, - {"2606:1a40:100c::/47", "398962"}, - {"2806:1016:1::/48", "8151"}, - {"2a04:c444::/32", "2047"}, - {"2001:559:2f0::/48", "33650"}, - {"2402:8100:26b3::/44", "55644"}, - {"2600:6c20:dfb::/45", "20115"}, - {"2a03:d400:122::/47", "198913"}, - {"2001:559:7a::/48", "33657"}, - {"2402:bfc0:1::/44", "136361"}, - {"240e:980:2600::/40", "4134"}, - {"2607:f110:e370::/37", "21889"}, - {"2a11:73c0::/29", "18779"}, - {"2001:559:8124::/48", "7015"}, - {"2001:559:c0a3::/48", "7725"}, - {"2001:559:c42a::/47", "33657"}, - {"2404:2400:101::/44", "56132"}, - {"2408:8256:319d::/46", "17623"}, - {"2605:1900:8440::/33", "12208"}, - {"2620:11b:400a::/47", "47870"}, - {"2a02:26f7:ed05::/46", "20940"}, - {"2001:1248:a548::/47", "11172"}, - {"2404:3d00:412c::/47", "21433"}, - {"2602:fcd3:10::/44", "212934"}, - {"2806:103e:9::/48", "8151"}, - {"2001:578:115::/46", "22773"}, - {"2600:380:f104::/46", "20057"}, - {"2600:880b:6000::/29", "22773"}, - {"2c0f:fe68::/32", "36868"}, - {"2001:559:c9::/46", "33491"}, - {"2001:43f8:11d0::/48", "328381"}, - {"2603:c013:4000::/36", "31898"}, - {"2804:1b1:b6c2::/33", "18881"}, - {"2a02:530:23::/44", "21191"}, - {"2001:df6:be80::/48", "138277"}, - {"240a:a7c0::/32", "144634"}, - {"2604:c880:60::/32", "46455"}, - {"2607:1280:1380::/44", "394972"}, - {"2804:674c::/32", "269619"}, - {"2a03:2460::/32", "59908"}, - {"2001:559:480::/48", "33657"}, - {"2408:8956:b400::/40", "17622"}, - {"240a:a6c3::/32", "144381"}, - {"240e:45c:a800::/40", "131285"}, - {"2600:3500::/35", "396998"}, - {"2c0f:5900::/32", "60171"}, - {"2001:678:76c::/48", "8315"}, - {"2403:c00:900::/45", "17488"}, - {"2600:380:b000::/38", "20057"}, - {"2800:3b0:1001::/48", "6429"}, - {"2001:df2:6200::/48", "135247"}, - {"2400:b300::/47", "38470"}, - {"240a:ab7f::/32", "145593"}, - {"2620:112:f002::/47", "6336"}, - {"2a02:88d:3f::/40", "47794"}, - {"2409:8907:7420::/39", "24547"}, - {"240c:ca0c::/32", "138371"}, - {"240e:44d:1300::/41", "140345"}, - {"2605:1e80:3000::/36", "396930"}, - {"2401:4900:1a70::/40", "45609"}, - {"2600:140f:f801::/38", "20940"}, - {"2001:559:8294::/48", "7922"}, - {"2001:df0:fd80::/48", "139345"}, - {"240a:a7ef::/32", "144681"}, - {"2804:3248::/32", "61582"}, - {"2a02:fd40::/31", "31034"}, - {"2001:200:900::/40", "7660"}, - {"2001:658::/29", "20676"}, - {"2001:4978:10ae::/48", "13331"}, - {"2620:129:b000::/47", "394575"}, - {"2804:1684::/32", "53169"}, - {"2605:46c0:a::/32", "395658"}, - {"2804:4bd0::/32", "262320"}, - {"2001:16a8::/32", "12533"}, - {"2407:c080:5000::/37", "55990"}, - {"2607:f6f0:2000::/48", "54588"}, - {"2806:267:300::/37", "13999"}, - {"2a0b:5480::/29", "50599"}, - {"2406:840:d000::/36", "38136"}, - {"240e:e9:b000::/37", "137697"}, - {"2620:123:2040::/47", "30103"}, - {"2806:310:34::/46", "16960"}, - {"2001:df3:1600::/48", "9555"}, - {"240a:a8fe::/32", "144952"}, - {"2620:11b:e0c1::/48", "202818"}, - {"2a00:1680::/32", "31726"}, - {"2a02:d98::/32", "25146"}, - {"2a04:3780::/29", "48097"}, - {"2001:559:8402::/48", "7015"}, - {"2001:67c:5fc::/48", "8447"}, - {"2001:978:8701::/36", "174"}, - {"2405:25c0:a200::/40", "131969"}, - {"2405:a640::/32", "131668"}, - {"2600:6c20:3f::/41", "20115"}, - {"2603:c0e2:4000::/35", "54253"}, - {"2804:88:2::/35", "28135"}, - {"2804:e94:60::/40", "262468"}, - {"2804:37dc::/32", "266440"}, - {"2a01:d0:306::/44", "29632"}, - {"2a02:88d:802f::/48", "47794"}, - {"2a02:d28::/32", "3257"}, - {"2001:67c:108::/48", "202244"}, - {"2001:67c:2d64::/48", "39923"}, - {"2801:80:1418::/48", "11097"}, - {"2804:4414::/32", "267620"}, - {"2804:8540::/32", "272567"}, - {"2a06:93c0::/29", "680"}, - {"2a10:cc46:12c::/48", "48635"}, - {"2001:250:2420::/46", "24356"}, - {"240a:a327::/32", "143457"}, - {"2620:c8:4000::/48", "36210"}, - {"2a02:888:4048::/47", "48695"}, - {"2a04:a840::/29", "20559"}, - {"2a04:b0c0::/44", "201017"}, - {"2001:559:809a::/48", "33287"}, - {"2600:1005:f100::/44", "6167"}, - {"2803:1520::/32", "266688"}, - {"2804:5c::/32", "28201"}, - {"2804:2160:1ff0::/44", "264551"}, - {"2a01:ba80::/32", "49063"}, - {"2a02:970:1209::/41", "44002"}, - {"2c0f:f988::/32", "37353"}, - {"2400:3dc0::/38", "134371"}, - {"2400:7400:60::/48", "38044"}, - {"2409:8753:1100::/32", "56047"}, - {"2600:370f:728e::/47", "32261"}, - {"2620:115:2000::/46", "12259"}, - {"2804:37f0:b900::/33", "266445"}, - {"2001:df1:2a00::/48", "134553"}, - {"2407:500:100::/48", "58940"}, - {"2408:8956:8e00::/40", "17622"}, - {"240a:a289::/32", "143299"}, - {"240a:a3d3::/32", "143629"}, - {"240a:ae6e::/32", "146344"}, - {"2604:3400:ac01::/48", "209453"}, - {"2804:7598:c010::/44", "265442"}, - {"2a01:3e0:d01::/48", "38191"}, - {"2a02:26f7:c841::/46", "20940"}, - {"2001:250:5009::/48", "23910"}, - {"2406:4a00:17::/48", "56038"}, - {"2804:3288:b1b2::/33", "52827"}, - {"2001:550:5403::/39", "174"}, - {"2409:8002:1000::/40", "38019"}, - {"2a00:b0a0::/46", "203434"}, - {"2a02:4545:e0::/46", "197207"}, - {"2001:67c:23b0::/48", "210223"}, - {"2401:1801:e0::/39", "58683"}, - {"2600:8807:7c6::/36", "22773"}, - {"2a0d:2587:8200::/48", "141011"}, - {"2401:d800:f2f0::/39", "7552"}, - {"2403:ac40::/32", "131149"}, - {"2a02:f181:3000::/48", "47420"}, - {"2a0d:da06::/32", "211675"}, - {"2001:678:868::/48", "8220"}, - {"2409:8915:7a00::/39", "56044"}, - {"240a:a98c::/32", "145094"}, - {"2600:8807:4fe0::/35", "22773"}, - {"2804:4210::/35", "267475"}, - {"2804:83cc::/32", "272221"}, - {"2a0c:9a40:8086::/48", "3280"}, - {"2402:6f40:2::/47", "45079"}, - {"2402:8c00:9::/48", "17753"}, - {"2403:7240::/36", "138171"}, - {"240a:a911::/32", "144971"}, - {"2804:67e0::/32", "269656"}, - {"2a04:d940::/29", "41887"}, - {"2a01:490::/32", "8251"}, - {"2a03:2900::/32", "48823"}, - {"2a0e:b107:1788::/48", "210667"}, - {"2001:df7:6700::/48", "138516"}, - {"2409:804c:3017::/44", "9808"}, - {"2604:b40::/32", "395846"}, - {"2804:a40::/32", "263036"}, - {"2804:340c::/32", "265434"}, - {"240a:a616::/32", "144208"}, - {"2804:7a94:1300::/34", "271380"}, - {"2001:67c:444::/48", "6730"}, - {"2409:8904:2fa0::/35", "24547"}, - {"2600:370f:1120::/46", "32261"}, - {"2610:30:4001::/32", "30313"}, - {"2a00:fe8::/32", "16178"}, - {"2a0c:ef00::/32", "212881"}, - {"2409:8052:900::/37", "9808"}, - {"2a00:f78::/32", "48451"}, - {"2600:1408:8801::/37", "20940"}, - {"2607:800::/32", "26794"}, - {"2800:bf0:2444::/48", "52257"}, - {"2804:5d34::/35", "52690"}, - {"2804:72e0::/32", "270881"}, - {"2a01:8200:ff00::/48", "4455"}, - {"2a03:1984::/32", "48260"}, - {"2a0c:4d40::/29", "57353"}, - {"2604:ca00:f007::/44", "36492"}, - {"2620:0:2a01::/48", "31997"}, - {"2620:42:2000::/48", "30542"}, - {"2a0a:4587:2010::/46", "208294"}, - {"2001:fd0:2301::/37", "10029"}, - {"2400:cb00:a970::/46", "13335"}, - {"2409:8004:801::/48", "9808"}, - {"2800:160:1eef::/43", "14259"}, - {"2a09:b684::/30", "208861"}, - {"2a0a:acc2:6::/48", "6233"}, - {"2400:d280::/44", "45648"}, - {"2405:1c0:6a21::/46", "55303"}, - {"2a02:e0c0:1c00::/34", "9100"}, - {"2a0d:dd80::/29", "200308"}, - {"2a0f:9207:25::/32", "45009"}, - {"2401:4900:2500::/45", "45609"}, - {"2620:6b:4000::/48", "62675"}, - {"2a01:c50f:c480::/41", "12479"}, - {"2a0e:8f02:f021::/48", "211498"}, - {"2400:cb00:435::/48", "13335"}, - {"2606:ae00:b3c0::/36", "7287"}, - {"2801:10:7000::/48", "19429"}, - {"2804:2d24::/40", "263032"}, - {"2001:610::/39", "1103"}, - {"2001:4878:c215::/46", "12222"}, - {"2405:9800:b810::/48", "133481"}, - {"2604:9b80::/32", "30144"}, - {"2804:1bc:f047::/36", "10310"}, - {"2a0d:a2c0::/29", "60721"}, - {"2404:bf40:e801::/39", "139084"}, - {"2600:370f:2025::/41", "32261"}, - {"2a03:db80:3824::/48", "199578"}, - {"2a0d:fec0:21::/48", "47481"}, - {"2a10:afc0:e010::/44", "212794"}, - {"2001:480:10::/48", "22"}, - {"2001:559:82ba::/47", "7015"}, - {"2001:559:831a::/48", "33659"}, - {"2606:2800:420a::/47", "15133"}, - {"2606:6800:1c00::/40", "394902"}, - {"2a00:d300::/32", "31742"}, - {"2a03:9c80::/34", "15525"}, - {"2a0a:5a00::/29", "28954"}, - {"2a0c:b641:100::/47", "213154"}, - {"2001:559:3aa::/48", "7015"}, - {"2001:da8:304a::/45", "24358"}, - {"2a02:f840::/47", "199483"}, - {"2402:800:388d::/43", "7552"}, - {"240a:af0b::/32", "146501"}, - {"2603:f2f0::/23", "397165"}, - {"2a0c:b340::/47", "206262"}, - {"2001:67c:478::/48", "212774"}, - {"2001:67c:2f2c::/48", "44894"}, - {"2001:1900:2262::/48", "21775"}, - {"2402:3a80:1100::/38", "38266"}, - {"2a02:26f7:c38d::/46", "20940"}, - {"2a04:2b00:200::/48", "42044"}, - {"2a0d:e4c2::/29", "208861"}, - {"2001:559:93::/48", "33651"}, - {"2001:678:ad4::/48", "205597"}, - {"240e:c:7800::/31", "4134"}, - {"2a01:500::/32", "39537"}, - {"2001:df0:d4::/48", "55870"}, - {"2001:1a11:71::/48", "8781"}, - {"2600:6000:fa69::/48", "11351"}, - {"2600:6c10:c0d::/43", "20115"}, - {"2607:8100::/32", "11404"}, - {"2804:6ae8::/32", "270365"}, - {"2a03:2880:f00b::/43", "32934"}, - {"240a:a337::/32", "143473"}, - {"2620:1ec:25::/46", "8075"}, - {"2803:5440:aca::/48", "264738"}, - {"2804:24b0:ffff::/48", "264238"}, - {"2806:230:200a::/48", "265594"}, - {"2a00:95a0::/32", "29425"}, - {"2a06:f904::/36", "56630"}, - {"2001:4c8:1094::/47", "15290"}, - {"2402:7e00::/32", "45280"}, - {"2404:bf40:8082::/48", "7545"}, - {"240a:aa19::/32", "145235"}, - {"2606:ef80:6::/48", "3595"}, - {"2804:4e18::/32", "268239"}, - {"2804:7330::/32", "270901"}, - {"2c0f:f3f8::/32", "327972"}, - {"2001:18e8:800::/44", "17"}, - {"2409:803c:2800::/38", "24444"}, - {"2604:d600:1549::/46", "32098"}, - {"2a0e:cc80::/29", "208766"}, - {"2c0f:ef48::/32", "328339"}, - {"2401:7800::/32", "7387"}, - {"2600:6c3a:810::/44", "20115"}, - {"2804:79a8::/32", "271319"}, - {"2a01:871::/29", "3209"}, - {"2a02:26f7:b701::/46", "20940"}, - {"2a02:26f7:b781::/46", "20940"}, - {"2a02:26f7:d2c1::/45", "20940"}, - {"2a07:db01::/47", "204527"}, - {"2001:559:807c::/48", "7015"}, - {"2001:678:c34::/48", "207437"}, - {"2607:fc58:1:52::/64", "13536"}, - {"2804:5c28::/48", "268892"}, - {"2001:b400:d208::/45", "17421"}, - {"2a02:26f7:e409::/42", "20940"}, - {"2a06:7a80::/48", "208712"}, - {"2001:310:3004::/32", "4694"}, - {"240e:3bf:7600::/39", "140313"}, - {"2804:c84:2::/42", "52720"}, - {"2a02:26f7:ceca::/42", "20940"}, - {"2a0f:1900:1000::/36", "209446"}, - {"240a:a636::/32", "144240"}, - {"2606:6800:2800::/40", "394898"}, - {"2a02:26f7:29::/48", "20940"}, - {"2a0f:9400:b00b::/48", "213163"}, - {"2001:559:83be::/47", "7922"}, - {"2402:a800::/32", "9601"}, - {"2403:ad80:3c00::/38", "134835"}, - {"2602:fd72::/36", "2740"}, - {"2602:ff25:e00::/39", "46657"}, - {"2620:104:2001::/46", "40185"}, - {"2804:3ed4::/47", "266623"}, - {"2a02:26f7:de80::/48", "36183"}, - {"2a0e:b107:700::/48", "140098"}, - {"2001:4de0:101::/48", "34343"}, - {"2402:800:31ee::/43", "7552"}, - {"240a:a6e6::/32", "144416"}, - {"240e:a7:7fe1::/46", "140519"}, - {"2800:484:6600::/35", "10620"}, - {"2a02:4540:c000::/41", "197207"}, - {"2a11:c0::/32", "47753"}, - {"2610:f0:37f::/40", "22925"}, - {"2a09:0:13::/48", "34549"}, - {"2c0f:e9a0::/32", "174"}, - {"2001:559:c4bf::/48", "33657"}, - {"2401:4900:4900::/43", "45609"}, - {"2406:daa0:f080::/44", "16509"}, - {"240e:13:809::/48", "140861"}, - {"2607:fe60::/32", "11280"}, - {"2804:fc:8e00::/33", "28142"}, - {"2a00:1d78::/32", "44050"}, - {"2a01:7400::/32", "47544"}, - {"2a02:26f7:c4c8::/48", "36183"}, - {"2409:8014::/44", "56044"}, - {"2409:8924:b00::/37", "56046"}, - {"240e:967:8c00::/35", "4134"}, - {"2604:d600:925::/46", "32098"}, - {"2a01:a700::/33", "39138"}, - {"2a06:1301:4003::/48", "49718"}, - {"2a0e:97c0:750::/44", "210836"}, - {"2001:fd8:33f0::/44", "4775"}, - {"2600:141c:4001::/36", "20940"}, - {"2a00:7b00:15::/44", "12338"}, - {"2001:559:c237::/48", "20214"}, - {"240a:a6c4::/32", "144382"}, - {"240e:108:87::/48", "4134"}, - {"240e:3bb:2800::/38", "4134"}, - {"2a01:67c0::/32", "16074"}, - {"2a02:db40::/48", "48749"}, - {"2a05:7140::/29", "25455"}, - {"2600:100b::/32", "6167"}, - {"2804:4d3c:3001::/40", "267420"}, - {"2a02:26f7:ec81::/46", "20940"}, - {"2a04:4440::/29", "31655"}, - {"2001:c00::/39", "4618"}, - {"2407:1e00::/35", "45158"}, - {"240e:6:d1b0::/37", "4134"}, - {"2604:bc0:1::/48", "46562"}, - {"2604:d600:15c7::/44", "32098"}, - {"2804:16c::/32", "28309"}, - {"2001:559:c0bb::/45", "33650"}, - {"2402:4e00:8031::/33", "45090"}, - {"2605:a401:8e4e::/40", "33363"}, - {"2620:1ec:900::/48", "8068"}, - {"2804:51c:a121::/33", "262495"}, - {"2804:6284::/32", "53090"}, - {"2610:20:8060::/45", "3477"}, - {"2800:440:1800::/42", "27738"}, - {"2803:4500::/32", "27660"}, - {"2a02:cb43:8008::/48", "20546"}, - {"2a11:3b80::/29", "62212"}, - {"2001:da8:e81c::/47", "138373"}, - {"2403:9b00::/32", "45110"}, - {"2a02:ac80:a01::/39", "25145"}, - {"2600:6c38:1f2::/38", "20115"}, - {"2001:67c:2cd4::/48", "29229"}, - {"2402:ea80:d::/48", "17747"}, - {"240a:a67f::/32", "144313"}, - {"2804:340:5000::/32", "28165"}, - {"2804:32d0::/32", "265099"}, - {"2804:6f9c::/32", "270672"}, - {"2a00:f740:101::/38", "28875"}, - {"2a05:c741::/32", "1299"}, - {"2a11:7cc0::/29", "34907"}, - {"2001:579:243b::/41", "22773"}, - {"240a:abbe::/32", "145656"}, - {"240e:978:1900::/40", "137697"}, - {"2800:440::/47", "27738"}, - {"2404:80::/28", "18182"}, - {"2408:840d:7900::/42", "17621"}, - {"2409:802f:290c::/38", "56041"}, - {"2605:3380:ff00::/46", "12025"}, - {"2804:188:b1a2::/33", "262750"}, - {"2400:ac40:dd0::/32", "136255"}, - {"240a:a912::/32", "144972"}, - {"2603:c0f2:4000::/35", "6142"}, - {"2606:a80::/32", "12212"}, - {"2804:1e38:4005::/35", "264415"}, - {"2804:323c::/32", "262367"}, - {"2a0d:5082:59::/29", "62240"}, - {"2804:cf8:c000::/45", "52580"}, - {"2a09:c3c0::/29", "209102"}, - {"2a0a:1f41::/32", "212144"}, - {"2001:67c:10e8::/48", "199220"}, - {"2001:1248:57fc::/47", "11172"}, - {"2400:cb00:479::/48", "13335"}, - {"2401:a100:c010::/34", "45194"}, - {"240a:a25f::/32", "143257"}, - {"2605:9780:f::/43", "36180"}, - {"2a02:7f80::/30", "51942"}, - {"2a03:a820::/32", "39235"}, - {"2001:559:8109::/48", "33651"}, - {"2001:12a0:5000::/32", "28292"}, - {"2620:130:2000::/47", "18701"}, - {"2001:67c:265c::/48", "24861"}, - {"2602:fe19:399a::/33", "26073"}, - {"2607:6000:900::/40", "12189"}, - {"2806:230:301d::/48", "11888"}, - {"2a00:af00:e000::/35", "15599"}, - {"2a0d:4300:2::/29", "204920"}, - {"2401:d800:9050::/42", "7552"}, - {"2402:1e80:0:3000::/48", "4672"}, - {"2804:3fd8:197::/32", "265919"}, - {"2806:322:900::/37", "28546"}, - {"2a0e:b107:3e0::/48", "212034"}, - {"2001:550:2211::/44", "174"}, - {"2408:8956:78c0::/39", "17816"}, - {"2409:8958:c954::/38", "56040"}, - {"2600:1014:d170::/34", "22394"}, - {"240e:944::/36", "58541"}, - {"2a02:26f7:dd04::/48", "36183"}, - {"2001:559:15f::/48", "33287"}, - {"2001:1248:84d4::/47", "11172"}, - {"2001:18e8:c04::/32", "19782"}, - {"2405:2500:5::/48", "136566"}, - {"2408:84f3:3260::/40", "17623"}, - {"2a06:580::/29", "200590"}, - {"2a09:3c00:1::/48", "213268"}, - {"2a0b:7cc0:1::/48", "41652"}, - {"2001:1248:5900::/43", "11172"}, - {"2401:d800:f890::/41", "7552"}, - {"240a:a2de::/32", "143384"}, - {"240a:a5ed::/32", "144167"}, - {"240a:a876::/32", "144816"}, - {"2804:6524::/32", "269471"}, - {"2a00:1358:d100::/36", "6866"}, - {"2001:250:3401::/48", "138393"}, - {"240a:afed::/32", "146727"}, - {"2804:2f98:c000::/34", "264901"}, - {"2a0d:9500::/29", "48551"}, - {"2001:418:1401:25::/64", "20940"}, - {"2001:16a2:b216::/37", "39386"}, - {"2404:b180::/35", "135310"}, - {"2406:7400:38::/46", "131269"}, - {"2606:1a40:1020::/44", "398962"}, - {"2804:4ec:1300::/37", "28668"}, - {"2a00:86c0:200a::/42", "2906"}, - {"2a05:9cc3::/29", "2116"}, - {"2a07:ec80:210::/47", "44949"}, - {"2404:f4c0:8864::/48", "210384"}, - {"2409:8070:3100::/30", "9808"}, - {"240e:979:1f00::/34", "4134"}, - {"240e:a51:5c00::/34", "134419"}, - {"2a0b:2700::/29", "206894"}, - {"240a:a022::/32", "142684"}, - {"240e:983:1000::/48", "136195"}, - {"2607:1b00:1::/46", "54456"}, - {"2a00:1582:3::/29", "39010"}, - {"2a01:c500::/29", "12479"}, - {"2404:0:8240::/36", "131591"}, - {"240a:adf2::/32", "146220"}, - {"2604:6600:fd01::/40", "40676"}, - {"2604:7e00::/42", "17378"}, - {"2806:230:203e::/48", "265594"}, - {"2a03:efc0:500::/40", "197640"}, - {"240a:a250::/32", "143242"}, - {"240a:ace4::/32", "145950"}, - {"2606:7c0::/32", "54804"}, - {"2607:fdc8:1400::/48", "30036"}, - {"2804:64d8::/32", "269453"}, - {"2a04:4e40:4a00::/48", "54113"}, - {"2a10:7680::/32", "209056"}, - {"2408:805c:4009::/36", "17622"}, - {"2607:f018:fffe::/48", "177"}, - {"2a04:5340:4::/48", "200081"}, - {"2001:559:80a7::/48", "7015"}, - {"2404:3d00:40e2::/45", "3573"}, - {"2409:896a:8a00::/39", "9808"}, - {"2600:6c3a:808::/45", "20115"}, - {"2603:c0f8:2110::/38", "20054"}, - {"2800:bf0:37c5::/42", "27947"}, - {"2001:559:f0::/47", "33490"}, - {"2001:43f8:b61::/48", "328010"}, - {"2001:48d0::/32", "195"}, - {"2400:a440::/48", "18019"}, - {"2600:1480:6100::/37", "20940"}, - {"2402:ee40:100::/44", "134033"}, - {"2408:80ea:7580::/43", "17623"}, - {"2409:8c1e:75c0::/32", "9808"}, - {"240a:aebb::/32", "146421"}, - {"2604:d600:155d::/42", "32098"}, - {"2801:141:1::/46", "271958"}, - {"2804:738c:c002::/44", "270922"}, - {"2a01:b740:a16::/47", "714"}, - {"2a01:c50e:7100::/32", "12479"}, - {"2001:67c:374::/48", "51861"}, - {"2600:1480:b800::/48", "21342"}, - {"2607:9500::/32", "22423"}, - {"2620:11a:a020::/46", "43515"}, - {"2c0f:f948:a::/48", "37582"}, - {"2001:480:630::/48", "84"}, - {"2001:559:334::/48", "7015"}, - {"2001:559:c42e::/48", "33651"}, - {"2408:8957:d4c0::/38", "17816"}, - {"2a0d:71c0::/29", "49191"}, - {"2001:12a0:5::/33", "28292"}, - {"2401:d800:f590::/42", "7552"}, - {"2402:800:97ee::/43", "7552"}, - {"2402:28c0:fffa::/45", "136620"}, - {"2620:11d:9003::/48", "14805"}, - {"2806:2f0:9c03::/41", "17072"}, - {"2a02:26f0:c401::/40", "20940"}, - {"2a02:2e02:c10::/42", "12479"}, - {"2a03:1000::/32", "25575"}, - {"2a04:c9c0::/29", "202113"}, - {"2402:9d80:a41::/43", "131429"}, - {"2405:9200:1100::/41", "131596"}, - {"2620:116:3000::/44", "33024"}, - {"2804:5d60::/32", "268968"}, - {"2404:c880::/36", "135220"}, - {"2406:840:f000::/44", "142582"}, - {"2800:bf0:2409::/43", "27947"}, - {"2803:ad20::/32", "266703"}, - {"2001:67c:614::/48", "50157"}, - {"2001:67c:1530::/48", "61283"}, - {"2403:6c0::/48", "137366"}, - {"240a:a063::/32", "142749"}, - {"2606:b400:8300::/47", "1215"}, - {"2620:f:7::/48", "3630"}, - {"2800:bf0:3ac0::/48", "52257"}, - {"2804:4248:9001::/33", "267490"}, - {"2804:5c60::/32", "268905"}, - {"2a02:26f7:f3cc::/48", "36183"}, - {"2c0f:f8c8::/32", "37531"}, - {"2401:803e:4001::/42", "9919"}, - {"2a02:2950::/32", "15566"}, - {"2001:ce0::/47", "3662"}, - {"2409:8055:3018::/48", "9808"}, - {"240e:96b:6009::/46", "140367"}, - {"2620:0:402::/47", "3389"}, - {"2800:160:1a4a::/43", "14259"}, - {"2804:7338::/32", "262842"}, - {"2a02:d70::/32", "41176"}, - {"2a02:26f7:e2c0::/48", "36183"}, - {"2400:cb00:439::/48", "13335"}, - {"2408:8256:2d7b::/48", "17816"}, - {"2800:5f0:103a::/34", "22724"}, - {"2a00:1728:2::/47", "34224"}, - {"2a04:e100::/31", "31034"}, - {"2604:d600:c46::/43", "32098"}, - {"2605:e000::/37", "20001"}, - {"2801:10::/45", "28068"}, - {"2a00:b400::/31", "12857"}, - {"2a04:cf40::/29", "12843"}, - {"2001:fd8:2178::/40", "132199"}, - {"2804:282c::/32", "263945"}, - {"2a0b:e540::/29", "205311"}, - {"2804:14c:9b84::/44", "28573"}, - {"2402:6640:fcf::/32", "134995"}, - {"2402:8a00:4080::/32", "24477"}, - {"2406:ef40:8::/48", "133811"}, - {"2600:6c38:b01::/45", "20115"}, - {"2604:d600:1f::/42", "32098"}, - {"2620:1ec::/46", "8075"}, - {"2804:641c::/32", "269407"}, - {"2804:7cbc::/32", "271515"}, - {"2a00:79e1:f000::/38", "36384"}, - {"2620:10d:c090::/44", "54115"}, - {"2a02:26f0:601::/40", "20940"}, - {"2a02:26f0:c801::/39", "20940"}, - {"240a:a639::/32", "144243"}, - {"2606:2800:4a08::/46", "15133"}, - {"2801:80:d10::/48", "264396"}, - {"2a01:7920::/29", "47292"}, - {"2a01:8480::/34", "15704"}, - {"2a03:c580::/32", "39104"}, - {"2405:1c0:6811::/45", "55303"}, - {"2408:842e::/32", "4837"}, - {"2001:b30:4211::/46", "2614"}, - {"2600:1408:e001::/37", "20940"}, - {"2804:7fb4::/33", "271704"}, - {"2a0e:f200:154::/48", "30633"}, - {"2001:67c:5dc::/48", "3303"}, - {"2402:3a80:1728::/48", "38266"}, - {"240a:a061::/32", "142747"}, - {"2600:1fa0:6080::/44", "16509"}, - {"2602:808:4001::/46", "16509"}, - {"2620:11d:9000::/48", "14805"}, - {"2801:1e2::/44", "27951"}, - {"2a00:13e0::/32", "44764"}, - {"2a04:4e40:ca10::/44", "54113"}, - {"2001:978:4200:100::/46", "174"}, - {"2409:803c:3000::/40", "24444"}, - {"2602:fffd::/36", "55022"}, - {"2804:257c::/32", "52716"}, - {"2a06:2640::/29", "200576"}, - {"2001:460:104::/32", "3561"}, - {"2001:1248:88ff::/39", "11172"}, - {"240a:ac3a::/32", "145780"}, - {"2604:2540::/32", "393299"}, - {"2620:11f:9006::/48", "14746"}, - {"2a02:26f7:b948::/48", "36183"}, - {"2a02:26f7:f409::/46", "20940"}, - {"2a02:6900:881c::/48", "43894"}, - {"2001:559:5fe::/48", "33287"}, - {"2001:4878:c321::/45", "12222"}, - {"2806:20d:7301::/37", "32098"}, - {"2a09:9840::/48", "34775"}, - {"2c0f:fbf0:2::/43", "32653"}, - {"2400:50c0::/32", "136039"}, - {"2406:2000:e8::/46", "10310"}, - {"2408:840c:c500::/40", "17621"}, - {"240e:3b0:d000::/36", "134772"}, - {"2804:2904:a01::/43", "262588"}, - {"2a02:26f7:e840::/48", "36183"}, - {"2a06:2f40::/29", "57878"}, - {"2a0d:2581:3::/48", "209261"}, - {"2001:678:328::/48", "206567"}, - {"2400:4ec0:8c0e::/43", "64300"}, - {"2a02:cb80:2940::/48", "43766"}, - {"2a07:8c80::/29", "202789"}, - {"2001:df5:d880::/48", "141680"}, - {"2620:11a:c016::/48", "54113"}, - {"2001:3b0::/32", "17529"}, - {"2001:4878:356::/48", "12222"}, - {"2a0e:4847::/48", "48749"}, - {"2404:4a00:8000::/64", "55423"}, - {"2a00:cee0::/36", "60268"}, - {"2a00:f720:2::/32", "24824"}, - {"2404:bf40:89c3::/42", "139084"}, - {"2405:1c0:6a41::/46", "55303"}, - {"2405:f080:400::/38", "136907"}, - {"2607:1280:1280::/43", "394972"}, - {"2804:82f0::/32", "272166"}, - {"2a02:26f7:c744::/47", "36183"}, - {"240a:a0ac::/32", "142822"}, - {"240e:964:cb00::/40", "133776"}, - {"2607:700:900::/35", "22343"}, - {"2804:3db0::/32", "266547"}, - {"2806:2f0:80a0::/41", "17072"}, - {"2001:559:84fa::/48", "7016"}, - {"2409:8c44:800::/48", "9808"}, - {"240e:473:ffff::/48", "140485"}, - {"2602:feda:b8e::/48", "211935"}, - {"2a05:bd04::/30", "42221"}, - {"2406:b400:b0::/47", "55577"}, - {"2804:28d8::/32", "263984"}, - {"2804:5f9c::/32", "269112"}, - {"2a0f:9400:7806::/44", "147028"}, - {"2402:a00:145::/32", "45916"}, - {"2404:e400:10::/44", "136402"}, - {"240a:ad1e::/32", "146008"}, - {"2a0c:c900::/29", "30931"}, - {"2001:559:818c::/48", "22909"}, - {"2604:3d00:4c00::/32", "6327"}, - {"2605:8680:12::/47", "25780"}, - {"2804:4bb0::/32", "267324"}, - {"240a:a3df::/32", "143641"}, - {"2804:14d:8c3::/42", "28573"}, - {"2804:2e08::/32", "265319"}, - {"2804:5464::/32", "268647"}, - {"2a03:6947:600::/40", "31027"}, - {"2a03:9e20::/32", "203672"}, - {"2a10:bbc0::/32", "25234"}, - {"2603:90f5:e00::/39", "20115"}, - {"2607:fdf0:5e27::/44", "8008"}, - {"2a02:1c8:30::/44", "57128"}, - {"2a07:e640::/29", "2613"}, - {"2401:4800:2::/48", "38457"}, - {"2409:8774:1000::/32", "9808"}, - {"240a:a190::/32", "143050"}, - {"240e:44d:c80::/41", "4134"}, - {"2a00:fb20:8000::/33", "199319"}, - {"2a04:31c0::/29", "60820"}, - {"2a0d:8d06::/48", "48079"}, - {"2401:d800:9170::/40", "7552"}, - {"2804:ab8::/32", "52911"}, - {"2a01:c50f:100::/38", "12479"}, - {"2a03:1240::/48", "34187"}, - {"2a0a:ec02:b01::/48", "42692"}, - {"2603:c002:9b10::/37", "31898"}, - {"2604:ca00:f00e::/47", "36492"}, - {"2607:f110:17::/44", "21889"}, - {"2804:2604::/32", "264318"}, - {"2a0a:4900::/29", "49425"}, - {"2001:678:598::/48", "31010"}, - {"2001:67c:2020::/48", "48598"}, - {"2001:1a10:1000::/44", "42298"}, - {"240a:a442::/32", "143740"}, - {"240c:0:1::/29", "45275"}, - {"2602:809:8000::/44", "397919"}, - {"2603:f0f0::/23", "397165"}, - {"2401:1d40:2f01::/35", "59019"}, - {"2401:d100:d::/32", "18705"}, - {"2600:6c38:f63::/45", "20115"}, - {"2620:12e:5000::/40", "47101"}, - {"2804:eec:11c4::/48", "25933"}, - {"2804:7ef0::/32", "271656"}, - {"2806:230:203a::/48", "265594"}, - {"240a:a737::/32", "144497"}, - {"240a:ae94::/32", "146382"}, - {"2602:ffc6:100::/37", "21777"}, - {"2607:fc48:1800::/48", "40009"}, - {"2a00:4d80::/32", "25394"}, - {"2a01:5241:200::/29", "58243"}, - {"2001:559:c0c1::/48", "33652"}, - {"2001:fd8:f340::/42", "132199"}, - {"2620:126:7001::/48", "53800"}, - {"2800:160:14f1::/46", "14259"}, - {"240a:ac1e::/32", "145752"}, - {"2a01:8840:92::/45", "12041"}, - {"2a0d:60c3::/32", "59504"}, - {"2400:bb40:8888::/48", "136787"}, - {"2a05:8800::/29", "57513"}, - {"2409:8061:3900::/30", "9808"}, - {"2001:44b8:405f::/48", "4739"}, - {"240e:6b2::/35", "134772"}, - {"2607:f380:a60::/45", "2152"}, - {"2804:318c:200::/34", "265023"}, - {"2806:230:200e::/48", "265594"}, - {"2001:978:1b06::/37", "174"}, - {"2600:380:f1e4::/43", "20057"}, - {"2604:880:72::/45", "29802"}, - {"2a02:2528:2614::/29", "25091"}, - {"2001:678:1c4::/48", "48971"}, - {"2400:bf40::/32", "135003"}, - {"2401:d800:7ab0::/41", "7552"}, - {"2a01:4b0::/47", "42310"}, - {"2a02:7ae0::/32", "201659"}, - {"2a03:cbc0::/29", "61200"}, - {"2a0a:9800::/29", "199163"}, - {"2a11:b100:b100::/48", "57167"}, - {"2804:14bc::/32", "263347"}, - {"2a00:1288:85::/46", "10310"}, - {"2a02:26f7:67::/48", "20940"}, - {"2a10:8802:1000::/29", "31743"}, - {"2001:418:1456:b23::/42", "2914"}, - {"2001:1248:9619::/45", "11172"}, - {"240a:a98b::/32", "145093"}, - {"2600:1407:8801::/37", "20940"}, - {"2600:1fa0:8140::/44", "16509"}, - {"2620:171:3::/48", "715"}, - {"2a02:26f7:64::/48", "36183"}, - {"2001:559:c4b2::/47", "7015"}, - {"2604:ca00:474::/40", "36492"}, - {"2a01:c50f:d500::/36", "12479"}, - {"2a02:26f7:c150::/48", "36183"}, - {"2a0e:240::/29", "209993"}, - {"2405:201:3400::/33", "55836"}, - {"2406:daa0:4040::/44", "16509"}, - {"2408:8456:e410::/42", "134543"}, - {"2804:46c::/32", "52978"}, - {"2a01:5b0:8::/48", "48519"}, - {"2a07:59c6:e000::/47", "203125"}, - {"2602:801:2::/48", "397781"}, - {"2a09:3c0::/29", "211170"}, - {"2c0f:ee78:8008::/33", "61317"}, - {"2001:559:280::/48", "21508"}, - {"2404:bf40:8585::/42", "139084"}, - {"2607:ffb0:600f::/35", "6327"}, - {"2a10:8802::/36", "15404"}, - {"2001:df2:ac00::/48", "134073"}, - {"2409:8054:302a::/43", "56040"}, - {"240a:ad83::/32", "146109"}, - {"240a:af4f::/32", "146569"}, - {"2602:ff06:677::/48", "25720"}, - {"2a02:26f7:dec1::/46", "20940"}, - {"2a02:ee80:404c::/43", "3573"}, - {"2401:4900:5870::/44", "45609"}, - {"2404:2400::/39", "56132"}, - {"2406:c500:ff4::/48", "58534"}, - {"240e:438:3040::/38", "4134"}, - {"2806:2f0:5103::/42", "17072"}, - {"2a03:d000:9008::/47", "20632"}, - {"2c0f:f718::/32", "37678"}, - {"240e:60c:b800::/33", "4134"}, - {"2600:8807:3b20::/33", "22773"}, - {"2605:a404:1bd::/41", "33363"}, - {"2a00:bec7:f800::/40", "12946"}, - {"2a02:7e0::/32", "200163"}, - {"2001:df0:a0c0::/48", "140037"}, - {"2405:4200:205::/32", "24482"}, - {"240e:3be:4c00::/35", "136200"}, - {"2801:80:1bd0::/48", "266512"}, - {"2804:4c0:fc02::/38", "3549"}, - {"2804:5534:b000::/37", "268696"}, - {"2a09:1500:8::/48", "208175"}, - {"2a0e:5000::/29", "49191"}, - {"2a0e:b107:1161::/48", "35761"}, - {"2001:c38:9009::/45", "9931"}, - {"2001:1248:842f::/43", "11172"}, - {"2620:1:2000::/48", "396152"}, - {"2804:18:90::/36", "26599"}, - {"2a0e:8f80::/48", "52051"}, - {"2001:559:2c2::/48", "33490"}, - {"2804:14c:75a8::/46", "28573"}, - {"2a04:e4c0:51::/45", "36692"}, - {"2001:250:a809::/48", "24370"}, - {"2001:559:197::/48", "33651"}, - {"2001:559:596::/47", "33287"}, - {"2404:1a8::/32", "9595"}, - {"2409:8c1f:c340::/34", "9808"}, - {"2804:59d8:b182::/33", "268729"}, - {"2a0d:3a00::/29", "208133"}, - {"2a0d:8d06:1002::/48", "48079"}, - {"2001:648:2303::/42", "5408"}, - {"2001:44c8:4730::/44", "45430"}, - {"2604:f580::/32", "54329"}, - {"2800:160:1da9::/45", "14259"}, - {"2804:1b3:a800::/37", "18881"}, - {"2a00:b340:32::/48", "196745"}, - {"2a02:26f7:e804::/48", "36183"}, - {"2408:8459:8850::/38", "17816"}, - {"2603:90b2::/32", "11351"}, - {"2604:dc40::/48", "393398"}, - {"2620:0:1b00::/48", "714"}, - {"2a01:8880:8001::/33", "8745"}, - {"2001:559:470::/48", "7922"}, - {"240e:438:7040::/38", "4134"}, - {"2a09:3580::/29", "38946"}, - {"2a10:2ec3::/29", "208861"}, - {"2001:1998:a04::/35", "7843"}, - {"240e:3b7:f100::/37", "134775"}, - {"2804:5d50::/32", "268964"}, - {"2a00:13c0::/38", "29076"}, - {"240a:a39e::/32", "143576"}, - {"2605:32c0:a002::/48", "5670"}, - {"2620:60:e000::/48", "19014"}, - {"2001:d68:7::/44", "38759"}, - {"240a:a52c::/32", "143974"}, - {"2600:1406:48::/39", "20940"}, - {"2804:33f0::/32", "265426"}, - {"2001:4220:800d::/46", "24835"}, - {"2001:4da8:c010::/44", "207564"}, - {"2406:140::/35", "398704"}, - {"240a:a262::/32", "143260"}, - {"2a05:5080::/48", "62222"}, - {"2a0c:e640:1010::/47", "141011"}, - {"2605:54c0::/32", "397735"}, - {"2a02:26f7:ea::/48", "36183"}, - {"2a07:7040::/48", "202915"}, - {"240e:3b6:6400::/35", "140312"}, - {"2620:128:6000::/48", "395361"}, - {"2803:6fa0::/48", "267790"}, - {"2c0f:f020::/46", "327907"}, - {"2001:559:2ad::/46", "7015"}, - {"2001:18d8::/32", "14"}, - {"2804:678c::/32", "269635"}, - {"2a02:26f7:c680::/48", "36183"}, - {"2a0a:6040:ac69::/48", "211954"}, - {"2404:4f80:31::/38", "58715"}, - {"2a04:e4c0:12::/48", "36692"}, - {"2001:470:31::/48", "6939"}, - {"2402:8100:27e8::/47", "45271"}, - {"2804:145c:8090::/39", "263327"}, - {"2804:1d00::/32", "61688"}, - {"2804:8258::/32", "272514"}, - {"240a:a48a::/32", "143812"}, - {"240a:a97b::/32", "145077"}, - {"2600:1000:ff00::/44", "6167"}, - {"2a07:2904::/32", "15585"}, - {"2401:d800:90e0::/39", "7552"}, - {"2405:58c0:3e00::/40", "133101"}, - {"2605:2e40::/32", "11260"}, - {"2a03:ad40:430::/48", "54995"}, - {"2a09:9bc0:a::/48", "9009"}, - {"2a01:54e0:a000::/38", "62287"}, - {"2a07:7201::/29", "34197"}, - {"2001:250:83d::/41", "138182"}, - {"2001:6f8:1a00::/32", "3257"}, - {"2001:da8:aa::/48", "24371"}, - {"240a:ac28::/32", "145762"}, - {"240e:44d:7c80::/41", "4134"}, - {"2a02:26f0:a401::/39", "20940"}, - {"2001:4298::/40", "30990"}, - {"2605:cf00::/32", "46525"}, - {"2804:7168::/32", "270787"}, - {"2a0d:5fc0::/29", "62412"}, - {"2402:8100:31e0::/45", "45271"}, - {"2403:2e80::/32", "23858"}, - {"240a:aaf1::/32", "145451"}, - {"2600:8807:9182::/38", "22773"}, - {"2602:fc3e:810::/48", "400190"}, - {"2a02:28:8::/45", "8359"}, - {"2001:918:1ab::/48", "8300"}, - {"2a00:17a0::/32", "34867"}, - {"2403:ac80:89::/32", "4785"}, - {"2402:28c0:5::/39", "136620"}, - {"2607:700:500::/36", "22343"}, - {"2402:9800:4001::/48", "131118"}, - {"2405:6740::/32", "139419"}, - {"2602:feda:afd::/48", "138210"}, - {"2a02:888:8050::/48", "48695"}, - {"2a02:26f7:be41::/46", "20940"}, - {"2a02:ac80:c001::/35", "25145"}, - {"2a09:d140::/29", "28753"}, - {"240e:967:d600::/34", "4134"}, - {"2607:f4e0::/38", "4150"}, - {"2a0e:e700::/31", "2027"}, - {"2001:67c:2468::/48", "48894"}, - {"2405:6800::/35", "18207"}, - {"2605:b940::/46", "19047"}, - {"2001:559:c128::/48", "33287"}, - {"2405:f600:30::/45", "45117"}, - {"2600:1017:9110::/38", "6167"}, - {"2803:ba00:e00::/32", "52286"}, - {"2a09:bac0:174::/48", "13335"}, - {"2001:938:400a::/47", "8437"}, - {"2401:7080::/32", "24157"}, - {"2406:30c0::/48", "38732"}, - {"2600:140f:9800::/48", "9498"}, - {"2803:9110:2001::/32", "271992"}, - {"2001:c20:8406::/44", "3758"}, - {"2001:df5:8480::/48", "141475"}, - {"2001:4868:900::/45", "701"}, - {"2401:4a00::/32", "17444"}, - {"240a:ad7e::/32", "146104"}, - {"240e:a7:7fcf::/43", "140513"}, - {"2405:84c0:ff20::/45", "59598"}, - {"2409:8087:400::/40", "24547"}, - {"2600:6c38:c22::/44", "20115"}, - {"2a02:26f7:fc08::/48", "36183"}, - {"2001:fb0:1079::/40", "7470"}, - {"2800:160:1ff0::/47", "14259"}, - {"2804:39c8::/32", "266050"}, - {"2a02:26f7:f5c1::/46", "20940"}, - {"2401:6bff:8000::/40", "9466"}, - {"2604:8b80::/48", "55106"}, - {"2804:1010:3000::/33", "263617"}, - {"2a02:26f7:f245::/46", "20940"}, - {"2a03:ad05::/30", "8208"}, - {"2001:559:c07e::/47", "33650"}, - {"2001:7f9:8::/48", "51354"}, - {"240a:a24d::/32", "143239"}, - {"240a:a414::/32", "143694"}, - {"2600:1419:1c::/38", "20940"}, - {"2607:f360:100:200::/32", "32592"}, - {"2801:1a1::/44", "272021"}, - {"2804:d3c:8110::/33", "52613"}, - {"2804:3c30::/32", "266195"}, - {"2806:2f0:9bc3::/42", "17072"}, - {"2a0a:9204:30::/48", "211375"}, - {"2407:6100::/32", "58952"}, - {"240a:ae2b::/32", "146277"}, - {"240e:438:7c40::/38", "4134"}, - {"2a0c:ec80::/32", "204659"}, - {"2001:559:c17f::/48", "33651"}, - {"2a00:b8e0::/48", "29119"}, - {"2a0f:1040::/29", "60262"}, - {"2a0f:9240:2000::/48", "212270"}, - {"2001:559:81d0::/48", "33651"}, - {"2402:e280:2120::/45", "134674"}, - {"2408:8256:317c::/48", "17816"}, - {"2804:7d24::/32", "271542"}, - {"2a05:d880::/30", "43066"}, - {"2001:388:3031::/41", "7575"}, - {"240e:965:ca00::/39", "133776"}, - {"2803:420:f800::/37", "265831"}, - {"2a00:1d18::/32", "43939"}, - {"2a02:6a80:530f::/32", "3245"}, - {"2a04:ed00::/29", "199468"}, - {"2804:33c::/32", "53137"}, - {"2804:ab0::/32", "52907"}, - {"2a00:8ee2::/40", "48635"}, - {"2001:559:c265::/48", "33662"}, - {"2408:8459:7c10::/42", "17623"}, - {"240a:a501::/32", "143931"}, - {"2607:f038:4005::/44", "21527"}, - {"2804:74c0::/32", "271001"}, - {"2a0c:ab07:2000::/36", "208861"}, - {"2a0c:f540::/29", "39238"}, - {"2001:67c:21e0::/48", "2116"}, - {"2600:1410:7001::/32", "20940"}, - {"2605:3c80:e7a::/40", "2773"}, - {"2a03:7204::/32", "197023"}, - {"2a0d:5600:10::/48", "50347"}, - {"240a:a0e5::/32", "142879"}, - {"2800:bf0:8271::/48", "27947"}, - {"2804:47fc::/32", "267090"}, - {"2a00:d02::/29", "41887"}, - {"2a12:6f40::/29", "210542"}, - {"2404:5680::/32", "136915"}, - {"240a:a5f1::/32", "144171"}, - {"2a10:4800::/29", "399975"}, - {"2a0b:41c0::/29", "30781"}, - {"2a0e:2e40::/29", "52193"}, - {"240e:974:e300::/37", "38283"}, - {"2a0d:f00::/29", "16186"}, - {"2001:559:87d6::/48", "33652"}, - {"2001:da8:300a::/45", "24358"}, - {"2401:fc00::/32", "55803"}, - {"2408:8956:6e00::/40", "17622"}, - {"2620:8f:4000::/48", "3424"}, - {"2804:5530::/32", "268695"}, - {"2a00:1158::/47", "8972"}, - {"2a02:c680::/31", "196983"}, - {"2001:559:c1c6::/48", "7016"}, - {"240e:438:8820::/43", "140647"}, - {"2804:5bfc::/32", "268881"}, - {"2a06:25c0::/32", "20473"}, - {"2001:550:3403::/45", "174"}, - {"2001:559:564::/48", "33491"}, - {"2620:10a:8054::/48", "55195"}, - {"2a01:bc60::/32", "1836"}, - {"2a12:49c7::/32", "211444"}, - {"2405:ba00:8810::/48", "63295"}, - {"2408:8459:8250::/37", "17816"}, - {"240e:44d:2800::/41", "140345"}, - {"240e:5e:4001::/46", "4134"}, - {"2804:380c::/32", "266452"}, - {"2a03:2880:f255::/44", "32934"}, - {"2a0f:103::/32", "1239"}, - {"2402:e200::/32", "17961"}, - {"2610:a1:300c::/48", "12008"}, - {"2804:63d8::/32", "269387"}, - {"2001:253:110::/48", "142076"}, - {"2001:bf7:170::/44", "206813"}, - {"2001:12f0:540::/38", "1916"}, - {"2400:5460::/46", "135177"}, - {"240e:982:e300::/40", "134763"}, - {"2602:107:2010::/48", "20115"}, - {"2804:24c0:f000::/36", "262290"}, - {"2001:678:7c::/48", "51955"}, - {"2803:9800:98c7::/44", "11664"}, - {"2a00:1288:ef6a::/48", "34010"}, - {"2a03:c040::/48", "199484"}, - {"2a04:2b00:212::/48", "42044"}, - {"2001:559:748::/48", "7015"}, - {"2404:a140:14::/47", "138915"}, - {"2404:c900:1::/45", "58682"}, - {"2409:804b:290d::/40", "24445"}, - {"2600:140f:2201::/39", "20940"}, - {"2605:a404:5cd::/38", "33363"}, - {"2804:3bac:5100::/32", "266164"}, - {"2a01:440:50b::/45", "29551"}, - {"2a05:a780::/29", "49353"}, - {"2001:559:82ab::/48", "33657"}, - {"240e:108:1081::/44", "4134"}, - {"2a02:ff0:3df3::/44", "12735"}, - {"2a02:26f7:c889::/46", "20940"}, - {"2803:5ce0:a00::/40", "10753"}, - {"2001:559:8741::/48", "7015"}, - {"2406:840:fefb::/48", "139231"}, - {"240e:44d:300::/42", "140345"}, - {"2607:1380::/32", "6576"}, - {"2804:1ac:5900::/32", "53175"}, - {"2804:38d8::/32", "266505"}, - {"2804:76b0::/32", "271128"}, - {"2a02:26f7:d581::/46", "20940"}, - {"2a04:5bc0:1::/46", "28695"}, - {"2a09:bac0:411::/46", "13335"}, - {"2408:8920::/32", "4837"}, - {"2a02:26f7:c685::/46", "20940"}, - {"2a02:f181:1000::/48", "174"}, - {"2a0c:efc0:4::/36", "206356"}, - {"2600:100d:b1f0::/36", "22394"}, - {"2806:370:7000::/44", "28403"}, - {"2a03:d600::/31", "12727"}, - {"2a04:5201:1::/48", "204154"}, - {"2401:d800:d5f0::/38", "7552"}, - {"2402:5840::/45", "137403"}, - {"2406:b400:1::/48", "18209"}, - {"2408:840c:1100::/40", "17621"}, - {"2408:8459:4010::/42", "17623"}, - {"2804:7580::/32", "271051"}, - {"2806:2f0:3221::/46", "17072"}, - {"2a04:1ac1:1::/46", "211960"}, - {"2a07:4400::/29", "24961"}, - {"2a0e:4380::/29", "208711"}, - {"2405:6e00:8f0::/44", "133612"}, - {"240e:982:e000::/40", "58466"}, - {"2620:cc:c000::/48", "394298"}, - {"2400:9380:8040::/48", "4134"}, - {"2401:d800:ef2::/39", "7552"}, - {"240a:a7d6::/32", "144656"}, - {"2a02:26f7:e644::/48", "36183"}, - {"2a0e:1b80:1003::/48", "54201"}, - {"2407:90c0::/32", "142433"}, - {"2604:3cc0:2010::/47", "396298"}, - {"2605:dd40:5276::/36", "398549"}, - {"2806:200::/32", "7438"}, - {"2a00:7f20::/32", "60791"}, - {"2a01:798::/29", "29695"}, - {"2a02:26f7:be88::/48", "36183"}, - {"2001:ee0:e300::/37", "45899"}, - {"2a0a:86c0:101::/29", "206163"}, - {"2001:559:8726::/48", "33657"}, - {"2001:660::/34", "2200"}, - {"2403:4e00:301::/46", "45528"}, - {"2806:230:6002::/48", "265594"}, - {"2409:8030:1010::/40", "9808"}, - {"240a:a9bc::/32", "145142"}, - {"2607:f281::/32", "46218"}, - {"2804:5cec::/32", "268939"}, - {"2001:250:586b::/48", "23910"}, - {"2001:559:c0e2::/48", "33489"}, - {"2001:4048:106::/47", "33922"}, - {"2402:8100:289e::/37", "55644"}, - {"2600:1406:3801::/38", "20940"}, - {"2607:fb10:5013::/45", "55095"}, - {"2607:fb10:5041::/46", "2906"}, - {"2803:6700:540::/48", "263210"}, - {"2404:5c0:2800::/48", "135106"}, - {"2620:0:50f0::/48", "3428"}, - {"2a02:26f7:ce81::/46", "20940"}, - {"2402:6940:500::/35", "7645"}, - {"240e:978:6100::/36", "4134"}, - {"2620:74:1e::/47", "16838"}, - {"2804:214:86a0::/39", "26615"}, - {"2804:46c8::/32", "267011"}, - {"2a00:e26::/32", "25048"}, - {"240e:967:2800::/37", "133776"}, - {"2600:380:be00::/33", "20057"}, - {"2600:8070::/28", "29992"}, - {"2606:2800:4a44::/46", "15133"}, - {"2800:bf0:82::/48", "27947"}, - {"240a:a0dd::/32", "142871"}, - {"2603:70bd::/32", "11351"}, - {"2620:44:a000::/48", "33302"}, - {"2001:559:8590::/48", "7725"}, - {"2404:6900:2012::/48", "394749"}, - {"240e:983:1001::/39", "4134"}, - {"2001:67c:11f8::/48", "204796"}, - {"2001:da8:6409::/36", "23910"}, - {"2402:800:9663::/43", "7552"}, - {"2600:3501:9000::/33", "396998"}, - {"2620:104:1000::/44", "20074"}, - {"2a03:47c0:1081::/34", "21277"}, - {"2a0d:7780::/29", "59441"}, - {"2001:330::/32", "6619"}, - {"2001:559:4c2::/48", "7015"}, - {"2001:978:201::/62", "174"}, - {"2001:2000:3100::/36", "1299"}, - {"2602:fd20::/36", "46980"}, - {"2620:38:a00::/48", "22695"}, - {"2001:559:95::/48", "7016"}, - {"2400:3f60:3::/48", "149056"}, - {"2402:800:9d47::/43", "7552"}, - {"2600:1417:e000::/48", "8966"}, - {"2804:17dc::/32", "263255"}, - {"2a02:26f7:c584::/48", "36183"}, - {"2a10:cc42:1fc3::/45", "20473"}, - {"2408:80f9:4000::/34", "4837"}, - {"2804:6bd8:2000::/32", "270429"}, - {"2a0c:5bc0::/29", "786"}, - {"2001:4268:2a1::/37", "15964"}, - {"2001:b400:f418::/45", "17421"}, - {"2402:800:5d0f::/43", "7552"}, - {"240a:a857::/32", "144785"}, - {"2a0d:f407:100::/44", "205148"}, - {"2401:d800:20b0::/41", "7552"}, - {"2409:896a:6700::/36", "9808"}, - {"2804:1040:7778::/32", "263626"}, - {"2804:5984:af00::/33", "268707"}, - {"2a06:7e80:4::/48", "12695"}, - {"2001:559:83c9::/48", "33651"}, - {"240e:63:b000::/33", "140315"}, - {"240e:3b4:c000::/37", "140315"}, - {"2804:65a0::/32", "269504"}, - {"2a02:26f7:b585::/46", "20940"}, - {"2a05:d050:60c0::/44", "16509"}, - {"2001:ee0:380::/41", "135905"}, - {"2401:d800:4d0::/42", "7552"}, - {"2806:230:2000::/48", "265594"}, - {"2001:9b0::/29", "8473"}, - {"2400:cb00:a1f0::/45", "13335"}, - {"2401:4900:1c20::/46", "24560"}, - {"2403:5840::/32", "136306"}, - {"2408:8956:2ac0::/39", "17816"}, - {"2408:8957:d100::/38", "17816"}, - {"240a:a484::/32", "143806"}, - {"2602:ffa7::/36", "46378"}, - {"2610:130:2302::/35", "6122"}, - {"2804:5534:e000::/37", "268696"}, - {"2a02:2578:1910::/38", "51375"}, - {"2001:480:560::/48", "22"}, - {"2001:559:c0a8::/48", "33651"}, - {"2401:4900:4c60::/44", "45609"}, - {"2402:800:34e0::/44", "7552"}, - {"2402:800:71e0::/38", "7552"}, - {"2605:a900:4808::/35", "46887"}, - {"2607:5b00::/32", "12260"}, - {"2801:80:1c10::/48", "52756"}, - {"2804:649c::/32", "61598"}, - {"2a0d:9880::/29", "41435"}, - {"2a03:8460:1::/48", "201222"}, - {"2a12:1d00:1492::/32", "210103"}, - {"2402:b400:40d0::/39", "45960"}, - {"240c::/48", "45275"}, - {"2804:c6c::/32", "52704"}, - {"2a02:26f7:f5cd::/42", "20940"}, - {"2001:410:2000::/47", "10965"}, - {"2001:978:2308::/46", "174"}, - {"2409:8924:3b00::/37", "56046"}, - {"2604:bc80:8000::/33", "29066"}, - {"2605:a40a::/32", "33363"}, - {"2a02:26f7:c3c5::/46", "20940"}, - {"2a0d:f700:400::/35", "207044"}, - {"2a0f:90c0::/29", "59597"}, - {"2001:559:81fc::/48", "7016"}, - {"2001:4310:f2::/32", "30983"}, - {"2802:3:10::/32", "18747"}, - {"2001:250:816::/48", "23910"}, - {"2400:1f00::/43", "45769"}, - {"2600:1010:fe10::/40", "22394"}, - {"2600:2000:2000::/42", "33517"}, - {"2806:2f0:7123::/41", "17072"}, - {"2a02:26f7:db04::/48", "36183"}, - {"2408:872b::/38", "4837"}, - {"2604:5400:8000::/37", "11776"}, - {"2605:3380:4180::/46", "12025"}, - {"240e:3b6:3e00::/33", "140308"}, - {"2600:b000::/28", "46595"}, - {"2804:4688::/32", "266995"}, - {"2a06:1c4::/32", "60571"}, - {"2001:250:6800::/47", "24368"}, - {"2001:4998:18::/48", "36088"}, - {"2403:9800:7f18::/46", "4771"}, - {"240e:41:4000::/37", "17897"}, - {"2a02:cb80:4138::/47", "43766"}, - {"2400:9380:85c0::/44", "136167"}, - {"2a00:1f90::/32", "9021"}, - {"2a00:f826:26::/31", "34549"}, - {"2a03:1b80::/44", "18705"}, - {"2604:c380::/32", "25853"}, - {"2804:2454::/32", "264215"}, - {"2a02:26f7:c700::/48", "36183"}, - {"2a0c:b641:90::/48", "210103"}, - {"2001:559:3d3::/45", "33652"}, - {"2001:df5:4880::/48", "141403"}, - {"2401:d800:7ed0::/42", "7552"}, - {"2408:8262::/29", "4837"}, - {"2409:8055:54::/48", "9808"}, - {"2605:9e80::/32", "6099"}, - {"2606:4300:1::/48", "3595"}, - {"2803:f520::/32", "266695"}, - {"2a02:27e8::/32", "51708"}, - {"2405:7b40::/48", "135994"}, - {"2408:8256:3b7c::/46", "17623"}, - {"2600:6c34:24c::/48", "33588"}, - {"2a00:f28:21::/35", "15802"}, - {"2a0d:f40::/32", "39080"}, - {"2401:d800:9662::/40", "7552"}, - {"2408:84f3:e840::/38", "17816"}, - {"2600:6c38:10a::/45", "20115"}, - {"2607:d500:302::/48", "54527"}, - {"2a08:600:ff::/48", "206747"}, - {"2403:7340::/32", "136308"}, - {"2602:fbff::/36", "400261"}, - {"2801:1fc:3a::/48", "27951"}, - {"2a02:26f7:bd0d::/46", "20940"}, - {"2a02:26f7:e809::/46", "20940"}, - {"2001:48c0::/46", "14589"}, - {"2404:e840::/32", "131949"}, - {"2602:fe19:11::/42", "26073"}, - {"2600:b400::/30", "18254"}, - {"2a0f:9400:6230::/47", "48741"}, - {"2001:648:2e80::/48", "8253"}, - {"2804:9ec:800::/32", "263002"}, - {"2405:f200::/32", "55406"}, - {"240a:a116::/32", "142928"}, - {"2804:7174::/32", "270790"}, - {"2a03:5a00:12::/48", "207079"}, - {"2a0b:fbc0::/32", "209985"}, - {"2a0c:2240::/48", "197988"}, - {"2001:559:7f5::/46", "7922"}, - {"2001:559:821c::/48", "7922"}, - {"2800:160:1e13::/42", "14259"}, - {"2a00:4802:350::/42", "13124"}, - {"2a02:fe0::/31", "41164"}, - {"2001:1248:a533::/44", "11172"}, - {"2404:ba00:fe00::/48", "17665"}, - {"240e:270::/28", "4134"}, - {"2804:4f30::/32", "268310"}, - {"2a00:1da0::/33", "29591"}, - {"2600:8807:93ca::/45", "22773"}, - {"2804:1308::/48", "263511"}, - {"2804:4870:1c1::/46", "267121"}, - {"2001:470:5a::/48", "13746"}, - {"2600:1009:f000::/44", "6167"}, - {"2600:6c20:a0c::/47", "20115"}, - {"2605:6c80:e::/47", "397373"}, - {"2001:1248:5b69::/43", "11172"}, - {"2401:8e00:3800::/32", "9260"}, - {"2607:ffd0:200::/37", "13767"}, - {"240a:a25e::/32", "143256"}, - {"2801:a0::/32", "28616"}, - {"2a02:28d8::/36", "15774"}, - {"2001:1388::/46", "6147"}, - {"2620:128:e082::/48", "22317"}, - {"2804:2e48::/32", "265336"}, - {"2c0f:f9f8::/32", "37424"}, - {"2602:fdce::/36", "397617"}, - {"2a06:a001:a0b0::/48", "210260"}, - {"2604:a180:5000::/36", "22933"}, - {"2604:e8c0::/48", "6233"}, - {"2001:468:1202::/48", "20130"}, - {"2001:67c:227c::/48", "3320"}, - {"2403:3800:1230::/40", "4007"}, - {"2409:8702::/32", "38019"}, - {"2800:bf0:300b::/43", "27947"}, - {"2804:7518::/32", "271023"}, - {"2a02:2090::/47", "48287"}, - {"2001:250:c007::/34", "23910"}, - {"2001:559:8404::/48", "20214"}, - {"2001:678:e44::/48", "61232"}, - {"2408:84f3:f640::/44", "17623"}, - {"240a:afa1::/32", "146651"}, - {"240e:12:9800::/33", "4134"}, - {"2600:6c7f:90e2::/48", "20115"}, - {"2607:ff90::/32", "32880"}, - {"2a01:a800::/29", "16086"}, - {"2a01:ce9c::/32", "51964"}, - {"2001:550:f01::/35", "174"}, - {"2804:8450::/32", "272253"}, - {"2a0c:2f07:384::/48", "206924"}, - {"2408:8957:3900::/40", "17816"}, - {"2a07:a080::/29", "51399"}, - {"2001:559:8790::/48", "7922"}, - {"2403:9f40::/32", "138074"}, - {"2606:6c40::/32", "25780"}, - {"2a01:bbc0::/32", "199673"}, - {"2a07:e03:200::/32", "210083"}, - {"2001:559:74e::/47", "7922"}, - {"2403:3600::/32", "9336"}, - {"240a:ac42::/32", "145788"}, - {"2606:a300::/46", "35847"}, - {"240a:aa8e::/32", "145352"}, - {"2607:f030::/32", "6536"}, - {"2a00:f46:10::/36", "21395"}, - {"2a01:8840:f9::/48", "207266"}, - {"2a02:26f7:7e::/48", "36183"}, - {"2408:8456:c000::/42", "17622"}, - {"240a:a832::/32", "144748"}, - {"2a02:26f7:e3c4::/48", "36183"}, - {"2001:678:a38::/48", "209220"}, - {"2a02:26f7:c890::/48", "36183"}, - {"2a0f:3340::/29", "328131"}, - {"2001:c20:4806::/41", "3758"}, - {"2001:ee0:e700::/36", "45899"}, - {"2408:8459:9e30::/41", "17622"}, - {"240a:a1e3::/32", "143133"}, - {"2600:3408:700::/29", "4181"}, - {"2a00:1e6a::/41", "49373"}, - {"2a00:cd00::/32", "39101"}, - {"2402:e5c0::/32", "134916"}, - {"2404:7ac0:660::/44", "4842"}, - {"240a:a13b::/32", "142965"}, - {"240e:3b7::/35", "134773"}, - {"2409:8924:7f00::/32", "56046"}, - {"2409:8c44:3::/37", "24445"}, - {"2a04:5880::/29", "34759"}, - {"2a10:7700:f216::/29", "399975"}, - {"2a11:3b40::/32", "210723"}, - {"2001:559:d1::/48", "33287"}, - {"2001:559:86eb::/48", "7015"}, - {"2001:44b8:40d8::/35", "4739"}, - {"2602:fe90:805::/46", "35913"}, - {"2604:ee00:3::/48", "18865"}, - {"2804:35d8::/32", "266310"}, - {"2a02:26f7:bf81::/46", "20940"}, - {"2001:978:3c0c::/33", "174"}, - {"2001:49f0:d089::/43", "174"}, - {"240a:a155::/32", "142991"}, - {"240a:a210::/32", "143178"}, - {"2620:6e:6000::/48", "11078"}, - {"2a02:2e02:9720::/36", "12479"}, - {"2001:1250:fe00::/48", "22894"}, - {"2605:dd00::/32", "231"}, - {"2804:26b8::/48", "263852"}, - {"2403:9800:b013::/45", "4648"}, - {"2803:cfa0::/32", "27847"}, - {"2404:7e80:1000::/36", "132717"}, - {"2600:140f:f001::/38", "20940"}, - {"2806:2f0:93c3::/42", "17072"}, - {"2a0e:97c3:7b3::/48", "20473"}, - {"2a10:7bc0:0:2::/48", "60905"}, - {"2001:559:72e::/48", "7015"}, - {"2001:559:8121::/48", "7922"}, - {"2603:c001:3410::/42", "31898"}, - {"2800:160:1650::/45", "14259"}, - {"2803:200::/32", "52284"}, - {"2a02:c38::/32", "30764"}, - {"2a0f:5707:aa20::/46", "207622"}, - {"2c0f:f118::/47", "328201"}, - {"2001:dcd:9::/48", "38796"}, - {"2001:df0:216::/48", "56110"}, - {"2406:2400:c0::/48", "45287"}, - {"2406:bd00:de50::/48", "55651"}, - {"2407:c080:4000::/37", "55990"}, - {"2804:1468::/32", "263328"}, - {"2804:2988::/32", "264020"}, - {"2a00:cb8:41::/48", "15695"}, - {"2a02:26f7:e088::/48", "36183"}, - {"2402:3a80:20::/46", "38266"}, - {"2407:4700::/32", "3462"}, - {"2408:840c:3400::/40", "17621"}, - {"2409:802e:2903::/48", "56041"}, - {"2600:1002:9000::/44", "6167"}, - {"2605:e380::/32", "7954"}, - {"2804:7ad0::/32", "271393"}, - {"2a02:348:9d::/42", "35470"}, - {"2a02:700::/32", "35826"}, - {"2600:6c39:63a::/45", "20115"}, - {"2604:6400:4670::/32", "29974"}, - {"2606:1a40:f013::/36", "398962"}, - {"2001:da8:e822::/48", "24368"}, - {"240a:abb6::/32", "145648"}, - {"2600:803:619::/42", "701"}, - {"2600:1003:9010::/40", "22394"}, - {"2607:f248::/32", "12009"}, - {"2804:204:32c::/47", "28186"}, - {"2a02:9d8::/32", "6672"}, - {"2a02:26f7:cdc4::/48", "36183"}, - {"2001:559:83f5::/48", "22909"}, - {"2402:800:fae0::/39", "7552"}, - {"2409:8d14:900::/35", "56044"}, - {"2605:ad80:ffed::/43", "62887"}, - {"2804:8034::/32", "271736"}, - {"2001:559:c2a1::/48", "7922"}, - {"2401:d800:5dd0::/42", "7552"}, - {"2600:1404:7400::/48", "35994"}, - {"2602:fda4::/36", "27228"}, - {"2602:ff1e::/36", "395688"}, - {"2a02:e100::/29", "8426"}, - {"2001:559:544::/48", "33657"}, - {"240a:aa1b::/32", "145237"}, - {"2600:6c38:26::/44", "20115"}, - {"2806:217:302::/37", "28394"}, - {"2a02:26f7:cb44::/48", "36183"}, - {"2a0a:cc40::/29", "44241"}, - {"2001:250:5061::/46", "24361"}, - {"240a:ac73::/32", "145837"}, - {"2604:e740::/32", "32281"}, - {"2a00:4e60::/32", "13306"}, - {"2a06:9a80::/29", "60241"}, - {"2a0f:9400:7004::/47", "211144"}, - {"2001:250:206::/48", "23910"}, - {"2408:8456:a010::/42", "134543"}, - {"2409:8752:500::/38", "56047"}, - {"240a:aabe::/32", "145400"}, - {"2600:6c38:f49::/42", "20115"}, - {"2604:a180::/35", "11139"}, - {"2606:4700:5d::/40", "13335"}, - {"2607:f6d0::/32", "32"}, - {"2800:bf0:8168::/48", "52257"}, - {"240e:44d:280::/41", "4134"}, - {"2600:e008::/40", "22995"}, - {"2804:37f0:7100::/36", "266445"}, - {"2a0d:c7c7::/32", "205610"}, - {"2001:559:863e::/48", "7922"}, - {"2001:559:c0ea::/48", "7015"}, - {"2001:13c7:6008::/48", "52324"}, - {"2409:896a:8c00::/39", "9808"}, - {"2607:5e00::/32", "40191"}, - {"2804:2488:6000::/32", "264228"}, - {"2a02:26f7:c545::/46", "20940"}, - {"2a02:26f7:d4c1::/46", "20940"}, - {"2a04:df80::/29", "201962"}, - {"2001:559:85e3::/48", "22909"}, - {"2001:67c:2568::/48", "16375"}, - {"2406:3ac0::/40", "135391"}, - {"2409:8914:1500::/38", "56044"}, - {"240a:a4fb::/32", "143925"}, - {"2804:b5c::/32", "52768"}, - {"2c0f:f6d8:4012::/47", "3573"}, - {"2404:efc0:235::/46", "10122"}, - {"2406:6dc0::/32", "141155"}, - {"2409:8f1a::/29", "9808"}, - {"2804:6334:8000::/33", "269345"}, - {"2a02:88d:800f::/48", "47794"}, - {"2001:559:c08e::/48", "7016"}, - {"2404:3d00:40fc::/39", "3573"}, - {"2804:538::/32", "53111"}, - {"2a02:b30::/32", "20886"}, - {"240e:67d:e200::/39", "140329"}, - {"2804:4340::/32", "267558"}, - {"2a01:b740:a23::/48", "714"}, - {"2a02:2698:3c00::/38", "50498"}, - {"2a05:d050:8010::/42", "16509"}, - {"2600:1017:a410::/38", "6167"}, - {"2804:4b68::/32", "267304"}, - {"2a00:4180:1::/46", "56665"}, - {"2a0e:b107:ac0::/48", "204307"}, - {"2406:9e00:10::/44", "55352"}, - {"2409:8055:30::/48", "9808"}, - {"2a0b:6240::/29", "197637"}, - {"2001:559:c2c8::/48", "33491"}, - {"2406:e00:1::/48", "134540"}, - {"2a01:b740:a09::/48", "714"}, - {"2a02:ff0:1800::/40", "12735"}, - {"2a02:25e0:f00::/40", "41691"}, - {"2a04:4e40:e200::/48", "54113"}, - {"2a0c:c80::/29", "200000"}, - {"2a10:4340::/29", "59441"}, - {"2001:559:83e3::/48", "33652"}, - {"2a11:f00::/29", "50178"}, - {"2001:559:8054::/47", "7922"}, - {"240a:aedc::/32", "146454"}, - {"2620:103:e001::/46", "13893"}, - {"2804:8338::/32", "272184"}, - {"2a06:1e82::/47", "207480"}, - {"2001:559:e7::/48", "7922"}, - {"2402:9880:100::/37", "58744"}, - {"2606:1780::/32", "40676"}, - {"2804:83bc::/32", "272216"}, - {"2001:559:c4d6::/48", "33659"}, - {"240a:a4f9::/32", "143923"}, - {"240e:3b7:7800::/39", "4134"}, - {"2607:3c00:6404::/47", "26380"}, - {"2620:127:d011::/46", "394941"}, - {"2a01:8840:a::/48", "207266"}, - {"2a01:c50f:bf80::/33", "12479"}, - {"2a0a:b40::/29", "208861"}, - {"2a0a:e5c0:1::/48", "213081"}, - {"2001:559:8133::/48", "7922"}, - {"240a:a175::/32", "143023"}, - {"2610:f0:389::/37", "22925"}, - {"2a03:db80:2c10::/48", "47610"}, - {"2001:dce:8801::/35", "23869"}, - {"2600:1404:ac01::/38", "20940"}, - {"2a02:26f7:f785::/46", "20940"}, - {"2a0c:b641:45b::/48", "210335"}, - {"2c0f:f720::/32", "327767"}, - {"2001:559:8110::/48", "33659"}, - {"2803:5700::/33", "28024"}, - {"2a06:900::/35", "34373"}, - {"2001:678:34::/48", "48283"}, - {"2001:4290::/32", "23889"}, - {"2406:8800:902b::/43", "17465"}, - {"2803:440::/32", "263774"}, - {"2001:1388:2482::/44", "6147"}, - {"240a:aca3::/32", "145885"}, - {"240e:44d:5b00::/41", "140345"}, - {"2a00:8740::/47", "49037"}, - {"2404:bf40:f282::/36", "139084"}, - {"240a:a75b::/32", "144533"}, - {"2803:e600:3::/48", "65500"}, - {"2804:146c::/32", "263329"}, - {"240a:a404::/32", "143678"}, - {"2804:2e1c:e501::/46", "265324"}, - {"2a03:7320::/48", "62222"}, - {"2a0b:f4c2::/40", "208294"}, - {"2001:559:5a0::/48", "33491"}, - {"2405:7f00:3205::/41", "133414"}, - {"2604:b180:200::/44", "15198"}, - {"2620:43:a000::/48", "395030"}, - {"2806:20d:520e::/43", "32098"}, - {"2a00:ccc3::/32", "60461"}, - {"2a02:26f7:d3c0::/48", "36183"}, - {"2a02:6a00::/32", "25276"}, - {"2001:678:720::/48", "25443"}, - {"2001:c38:500a::/48", "20940"}, - {"240a:a02a::/32", "142692"}, - {"240a:ac74::/32", "145838"}, - {"2620:a8:6000::/48", "54307"}, - {"2804:18:4830::/41", "26599"}, - {"2001:559:c4ec::/47", "7922"}, - {"2406:1000::/32", "4711"}, - {"2600:370f:7288::/45", "32261"}, - {"2602:fc97:10::/44", "399544"}, - {"2a07:e8c0::/32", "212926"}, - {"2400:1c00:b::/45", "45143"}, - {"2406:da14::/36", "16509"}, - {"2600:1000:a000::/43", "6167"}, - {"2a00:1d58:f821::/48", "47524"}, - {"2a02:5f40::/32", "199244"}, - {"2a0b:4340:22::/48", "205651"}, - {"2607:e680::/32", "40355"}, - {"2407:1580:1100::/36", "33438"}, - {"2803:6700:226::/48", "263210"}, - {"2804:4c0:fffd::/46", "3549"}, - {"2a0c:9a40:801b::/45", "207965"}, - {"2406:c300::/32", "137253"}, - {"2804:1b94::/37", "52974"}, - {"2a03:5840:10b::/32", "35661"}, - {"2a0e:b107:1d7::/48", "139328"}, - {"2409:8904:69b0::/35", "24547"}, - {"2600:1015:f010::/39", "6167"}, - {"2607:f4d0::/36", "17054"}, - {"2610:a1:2000::/44", "19905"}, - {"2a01:8b00::/32", "3303"}, - {"2a0b:33c0:50::/47", "57395"}, - {"2001:559:58::/48", "7922"}, - {"2001:559:4f2::/48", "33287"}, - {"2001:fd8:381::/43", "4775"}, - {"2600:c0e:3011::/32", "13789"}, - {"2620:a3:400a::/48", "22773"}, - {"2a0b:84c0::/29", "205582"}, - {"2a0d:12c0::/48", "205804"}, - {"2409:8959:34::/41", "9808"}, - {"2804:5654::/32", "267991"}, - {"2a02:26f7:c8d4::/48", "36183"}, - {"2a0e:7780::/29", "208846"}, - {"2604:6280::/32", "53755"}, - {"2606:2800:6002::/45", "15133"}, - {"2804:7d54::/32", "271554"}, - {"2806:20d:1620::/44", "32098"}, - {"2a05:ab40::/29", "25180"}, - {"2a0e:b780::/31", "205581"}, - {"2800:bf0:8278::/48", "52257"}, - {"2804:14f8::/34", "263362"}, - {"2a02:26f7:c6c4::/47", "36183"}, - {"2a0b:2740::/48", "205755"}, - {"2401:d800:df60::/40", "7552"}, - {"2402:7840::/32", "206264"}, - {"240e:44d:6180::/41", "4134"}, - {"2602:feda:180::/48", "35251"}, - {"2604:4000::/48", "15348"}, - {"2605:a401:82d2::/44", "33363"}, - {"2804:1408:9100::/34", "28635"}, - {"2804:7888::/32", "271249"}, - {"2a02:2e02:2e40::/42", "12479"}, - {"2a02:e980:15c::/48", "19551"}, - {"2a05:7640:20d0::/44", "174"}, - {"2001:559:82df::/48", "33491"}, - {"240e:3b3:ec00::/35", "140314"}, - {"2405:7f00:3251::/42", "133414"}, - {"2a03:5a00:2e::/48", "51011"}, - {"2a04:4e40:f610::/44", "54113"}, - {"2a0e:b107:1180::/48", "211509"}, - {"2001:250:583a::/48", "23910"}, - {"2001:13c7:6f00::/44", "27814"}, - {"2408:8957:1f40::/40", "17816"}, - {"2a00:4800:220::/44", "13124"}, - {"2001:678:198::/48", "61180"}, - {"2001:df4:3200::/48", "132476"}, - {"2001:df5:b00::/48", "136334"}, - {"2409:8087:6a63::/44", "9808"}, - {"240e:bf:b8dc::/46", "140238"}, - {"240e:438:9020::/43", "140647"}, - {"2801:80:3950::/48", "270681"}, - {"2804:55e8::/32", "267964"}, - {"2a02:26f7:e781::/46", "20940"}, - {"2a11:8600::/29", "51009"}, - {"240e:3b1:c800::/37", "4134"}, - {"2600:6000:f570::/48", "11351"}, - {"2800:680:12::/32", "3816"}, - {"2803:15c0::/33", "269822"}, - {"2001:559:828b::/48", "33657"}, - {"2001:559:862e::/48", "33659"}, - {"2001:67c:1b10::/48", "41681"}, - {"2405:1c0:6641::/46", "55303"}, - {"2604:d600:91b::/45", "32098"}, - {"2607:fa48:110::/40", "5769"}, - {"2a02:26e0::/32", "35401"}, - {"2a04:5b80:200::/48", "202265"}, - {"2001:579:b884::/41", "22773"}, - {"2001:df0:5fc0::/48", "149479"}, - {"2001:4878:b141::/48", "12222"}, - {"240a:ab99::/32", "145619"}, - {"2620:133:c000::/44", "22992"}, - {"2801:80:250::/48", "262512"}, - {"2804:42bc:320::/32", "267522"}, - {"2a0e:bbc0:8002::/45", "22604"}, - {"2405:8a00:a032::/41", "55824"}, - {"2406:840:f440::/47", "137835"}, - {"2406:1400:8386::/47", "24342"}, - {"2409:8003:2b00::/40", "38019"}, - {"240e:100:70::/31", "4134"}, - {"2606:2e80::/32", "63125"}, - {"2800:160:1b68::/47", "14259"}, - {"2a01:5040:41::/35", "43996"}, - {"2a02:ff0:1600::/40", "12735"}, - {"2a02:26f0:2001::/39", "20940"}, - {"2001:559:86a7::/48", "33667"}, - {"240a:a635::/32", "144239"}, - {"2606:5240::/32", "6649"}, - {"2607:ff70::/32", "62"}, - {"2610:a1:1075::/46", "397228"}, - {"2a06:6540:4101::/48", "8220"}, - {"2408:8446::/28", "4837"}, - {"2602:80a:2002::/48", "16509"}, - {"2804:a6c::/33", "262282"}, - {"2806:2f0:5101::/46", "17072"}, - {"2402:e7c0::/41", "59078"}, - {"2600:1010:a000::/43", "6167"}, - {"2604:1280:9::/46", "11696"}, - {"2620:1ec:bdf::/48", "8068"}, - {"2a00:ec80::/32", "15557"}, - {"2a02:c50:db9::/32", "51531"}, - {"2a02:26f7:f2cc::/48", "36183"}, - {"2402:800:312b::/41", "7552"}, - {"2407:7000:f301::/36", "9500"}, - {"240a:a596::/32", "144080"}, - {"2804:aa8:900::/32", "52903"}, - {"2a02:26f7:f948::/48", "36183"}, - {"2001:fd0:401::/45", "10029"}, - {"2401:d800:76a0::/41", "7552"}, - {"2402:4280::/32", "135895"}, - {"240a:a127::/32", "142945"}, - {"2600:1405:9::/36", "20940"}, - {"2602:fe65::/46", "396872"}, - {"2604:f980:4240::/44", "19957"}, - {"2803:6900:1510::/48", "52423"}, - {"2806:230:2015::/48", "11888"}, - {"2a02:26f7:c188::/48", "36183"}, - {"2a02:26f7:ed01::/46", "20940"}, - {"2a04:5202::/29", "50113"}, - {"2804:10dc::/32", "263652"}, - {"2a07:3500:1b30::/48", "1136"}, - {"2a07:9a00::/29", "202605"}, - {"2804:5d3c::/32", "268959"}, - {"2001:67c:2204::/53", "24708"}, - {"2405:cf80::/32", "133602"}, - {"2407:36c0::/32", "135247"}, - {"240a:ae26::/32", "146272"}, - {"2606:6680:1001::/48", "40676"}, - {"2a01:5042:2001::/48", "202196"}, - {"2a02:26f7:d14a::/47", "20940"}, - {"2a03:db80:2c11::/46", "680"}, - {"2a07:7c80::/29", "61251"}, - {"2a11:a380::/29", "8511"}, - {"2409:896a:5a00::/37", "9808"}, - {"240e:3bc:4c00::/35", "136200"}, - {"240e:980:2c00::/48", "4816"}, - {"2602:feb7::/48", "16827"}, - {"2804:7510::/33", "271021"}, - {"2804:8174::/32", "272455"}, - {"2a00:7a40::/32", "51945"}, - {"2001:559:738::/48", "33491"}, - {"2402:800:5d9b::/41", "7552"}, - {"2409:8915:3200::/39", "56044"}, - {"240b:4003:fd95::/46", "45102"}, - {"240d:c010:8d::/48", "139341"}, - {"2803:ad80:aa1::/48", "42388"}, - {"2804:3e8c::/32", "266605"}, - {"240a:aadb::/32", "145429"}, - {"2804:8494::/32", "272269"}, - {"2a03:a140::/32", "200185"}, - {"2a0b:3240::/32", "24971"}, - {"2600:3000:2711::/35", "13649"}, - {"2a02:26f7:f304::/48", "36183"}, - {"2a03:3f40:2::/48", "58061"}, - {"2a0f:97c0::/29", "41817"}, - {"2407:1300::/32", "132850"}, - {"2408:8459:e650::/36", "17816"}, - {"2804:4418::/32", "267602"}, - {"2806:230:100a::/48", "265594"}, - {"2a00:82c0::/32", "198433"}, - {"2001:310:9001::/33", "4694"}, - {"2001:690::/32", "1930"}, - {"2a07:f240::/29", "212144"}, - {"2001:678:f18::/48", "211586"}, - {"2620:112:e000::/44", "26679"}, - {"2001:559:28f::/48", "33659"}, - {"240e:967:f400::/39", "58772"}, - {"2001:559:c4e1::/46", "7922"}, - {"2406:daa0:90c0::/44", "16509"}, - {"240e:679:8c00::/33", "4134"}, - {"2620:10a:801d::/48", "55195"}, - {"2a06:6380::/29", "201453"}, - {"2a0b:2ac0::/29", "41366"}, - {"2a0e:2240:2::/48", "60781"}, - {"2606:3d40:5::/44", "400097"}, - {"2804:3094::/32", "264962"}, - {"2806:2f0:8141::/46", "17072"}, - {"2a03:f80:56::/48", "28099"}, - {"2a05:9100::/29", "41993"}, - {"2001:559:8259::/48", "7016"}, - {"2402:dfc0:50::/44", "4808"}, - {"2a02:26f7:e681::/46", "20940"}, - {"2a11:b200::/29", "204790"}, - {"2400:cb00:569::/48", "13335"}, - {"2405:8180:d00::/38", "135478"}, - {"240a:ac60::/32", "145818"}, - {"2600:1002:f100::/44", "6167"}, - {"2a02:26f7:d1c8::/48", "36183"}, - {"2600:100a:a110::/36", "22394"}, - {"2604:d40::/32", "577"}, - {"2001:559:c08d::/48", "13367"}, - {"2001:fb0:1010::/44", "7470"}, - {"2408:8456:b610::/42", "134543"}, - {"240a:af0a::/32", "146500"}, - {"2c0f:f7d0::/32", "15964"}, - {"2401:f000:8::/48", "23838"}, - {"2402:800:9eee::/43", "7552"}, - {"2409:8914:b400::/39", "56044"}, - {"2800:88::/44", "26210"}, - {"2a00:79e0:505::/32", "45566"}, - {"2a02:ee80:2040::/33", "3573"}, - {"2a06:ab00::/32", "60781"}, - {"2602:fed2:718e::/48", "53356"}, - {"2a02:a300::/27", "6830"}, - {"2a03:4900:fffb::/45", "197695"}, - {"2001:4c98::/32", "35062"}, - {"2406:daa0:c080::/44", "16509"}, - {"2a01:c50e:e200::/37", "12479"}, - {"2a11:e480::/32", "60674"}, - {"2001:3c8:c301::/48", "55545"}, - {"2001:559:86f2::/48", "33651"}, - {"2404:3d00:40c6::/47", "3573"}, - {"2600:1415:a001::/35", "20940"}, - {"2a00:b060::/32", "197690"}, - {"2a02:26f7:c481::/46", "20940"}, - {"2a10:8000::/31", "8551"}, - {"2001:559:8701::/48", "33652"}, - {"2001:67c:2794::/48", "57967"}, - {"240a:a62c::/32", "144230"}, - {"2800:160:14f4::/44", "14259"}, - {"2001:490:4a00::/46", "1248"}, - {"2001:dd8::/48", "24390"}, - {"2804:2cd4:d0::/32", "265246"}, - {"2804:68b0::/32", "269709"}, - {"2600:9000:2269::/48", "16509"}, - {"2604:6940::/40", "11006"}, - {"2605:91c0::/32", "397723"}, - {"2a03:720::/45", "57073"}, - {"2001:4c08:2027::/44", "3356"}, - {"2402:800:58d3::/44", "7552"}, - {"2600:cc01::/32", "32298"}, - {"2602:feda:102::/48", "396303"}, - {"2804:204:237::/44", "28186"}, - {"2a02:2e02:9430::/41", "12479"}, - {"2a0f:ca00:8000::/48", "42209"}, - {"2001:559:27e::/47", "33651"}, - {"2001:67c:300::/48", "39387"}, - {"2001:67c:1254::/48", "4455"}, - {"2001:67c:2974::/48", "39128"}, - {"2405:8d40:a07::/48", "139831"}, - {"240a:a760::/32", "144538"}, - {"2600:400:1810::/34", "15147"}, - {"2620:0:2e61::/48", "29997"}, - {"2620:57:4004::/40", "62831"}, - {"2800:160:1589::/45", "14259"}, - {"2800:3a0:7::/39", "23201"}, - {"2001:559:1c8::/48", "7725"}, - {"2001:559:8061::/48", "33657"}, - {"240a:a628::/32", "144226"}, - {"2804:22a0:d0::/38", "264112"}, - {"2a0f:cc87:9000::/33", "208861"}, - {"2600:100c::/32", "22394"}, - {"2604:8600:3000::/33", "14453"}, - {"2605:2540::/32", "397324"}, - {"2806:230:602d::/48", "11888"}, - {"2001:559:24f::/48", "33651"}, - {"240e:244:200::/40", "136195"}, - {"2607:f8f8:800::/35", "23033"}, - {"2a0b:a040::/29", "204790"}, - {"240e:250:2906::/48", "134419"}, - {"2803:1320::/32", "27843"}, - {"2402:8100:207d::/46", "45271"}, - {"2407:be40::/32", "135717"}, - {"240e:438:a020::/43", "140647"}, - {"240e:60c:fc00::/27", "4134"}, - {"2001:67c:197c::/48", "199852"}, - {"2408:8456:1840::/40", "17816"}, - {"2408:8456:3a50::/39", "17816"}, - {"2804:3214::/32", "265054"}, - {"2a01:8c40::/32", "8301"}, - {"2a04:8c00::/29", "44772"}, - {"2401:d800:5452::/40", "7552"}, - {"2408:8001:3000::/44", "17816"}, - {"2409:807e:2100::/36", "9808"}, - {"240e:62::/34", "140308"}, - {"2606:6c00:8000::/48", "32787"}, - {"2a0b:59c2::/29", "16082"}, - {"2001:7fb:ff0a::/45", "12654"}, - {"2001:c20:48b7::/44", "9255"}, - {"2409:8904:33a0::/37", "24547"}, - {"2a02:2260::/32", "49435"}, - {"2a02:26f0:67::/44", "21342"}, - {"2a02:26f7:cc84::/48", "36183"}, - {"2001:1998:380::/37", "7843"}, - {"2402:c800:f0::/32", "38639"}, - {"2408:8956:5d00::/40", "17816"}, - {"2804:1eec::/32", "264455"}, - {"2402:3300:6000::/48", "56300"}, - {"2600:3503:c000::/29", "396998"}, - {"2401:d800:20e0::/39", "7552"}, - {"2620:d1:4000::/47", "36324"}, - {"2401:13c0:8000::/36", "132652"}, - {"2404:3d00:4141::/48", "21433"}, - {"2600:140f:a401::/38", "20940"}, - {"2602:feda:e30::/47", "147028"}, - {"2605:a401:85cf::/38", "33363"}, - {"2a06:e040:6a00::/35", "198507"}, - {"2a10:df80::/29", "60274"}, - {"2001:1380::/37", "19180"}, - {"2001:4b27:ffff::a/123", "34288"}, - {"2408:8456:ca00::/42", "17622"}, - {"240a:a89e::/32", "144856"}, - {"2600:1005:a000::/43", "6167"}, - {"2600:1015:f110::/30", "6167"}, - {"2604:ed40::/32", "25697"}, - {"2804:7364::/32", "270912"}, - {"2a01:28::/32", "39392"}, - {"2001:559:43d::/48", "7016"}, - {"2402:e380:31d::/48", "141781"}, - {"2603:fc50::/24", "397165"}, - {"2607:fdf0:5e84::/47", "8008"}, - {"2804:1efc:f000::/36", "264458"}, - {"2804:21f0::/32", "263554"}, - {"2001:250:5833::/48", "138371"}, - {"2001:ee0:2f20::/35", "45899"}, - {"2001:4528:9700::/33", "18101"}, - {"2406:7e40::/32", "141190"}, - {"2801:8c::/32", "262857"}, - {"240e:351:6400::/30", "4134"}, - {"2607:f208:305::/48", "26496"}, - {"2620:11f:1001::/48", "397794"}, - {"2804:7278::/32", "270854"}, - {"2806:230:100f::/48", "11888"}, - {"2a0f:c840::/29", "212238"}, - {"2001:1900:224d::/48", "393819"}, - {"2402:800:359b::/41", "7552"}, - {"240e:946::/47", "58540"}, - {"2600:cc01:e000::/40", "62833"}, - {"2a02:4060::/29", "202008"}, - {"240a:ae71::/32", "146347"}, - {"2804:3c44::/32", "266200"}, - {"2800:4d0:248a::/45", "7004"}, - {"2804:67cc::/33", "269651"}, - {"2001:550:906::/48", "54412"}, - {"2001:fd8:b1b0::/44", "4775"}, - {"2405:d800:112::/32", "24247"}, - {"2407:f800:401::/39", "38182"}, - {"2600:6c38:89e::/42", "20115"}, - {"2806:2f0:32e1::/46", "17072"}, - {"2001:1348::/32", "27750"}, - {"2605:ce80:702::/32", "393713"}, - {"2606:3f80::/32", "394102"}, - {"2a02:26f0:1601::/39", "20940"}, - {"2a02:26f7:c908::/48", "36183"}, - {"2804:2658::/37", "264328"}, - {"2a01:b740:1001::/39", "714"}, - {"2a02:ee80:413f::/48", "3573"}, - {"2a0b:b300::/29", "206841"}, - {"2a0e:b107:458::/42", "57883"}, - {"2409:8087:300::/40", "9808"}, - {"2600:1400:c001::/34", "20940"}, - {"2600:1402:16::/48", "20940"}, - {"2804:14d:5600::/40", "28573"}, - {"2402:5a00::/32", "18077"}, - {"240a:a4ca::/32", "143876"}, - {"2600:3501:d000::/34", "396998"}, - {"2620:91::/48", "6124"}, - {"240a:a9e9::/32", "145187"}, - {"2001:408:20::/32", "14793"}, - {"240a:acb2::/32", "145900"}, - {"2604:f400:2800::/37", "19406"}, - {"2605:a00::/32", "26744"}, - {"2605:30c0:f11::/46", "29736"}, - {"2a02:6c20:6::/48", "207167"}, - {"2c0f:4a00::/32", "328818"}, - {"2001:67c:41c::/48", "28847"}, - {"2001:878::/30", "1835"}, - {"2403:1cc0:5201::/48", "45352"}, - {"240a:ac27::/32", "145761"}, - {"2804:351c::/35", "266269"}, - {"2804:7fa8::/32", "271701"}, - {"2a01:5800::/32", "39608"}, - {"2a03:7380:3c0::/37", "13188"}, - {"2001:67c:2200::/48", "50620"}, - {"2001:da8:ae::/48", "24351"}, - {"2409:8002:100::/37", "9808"}, - {"240a:adf1::/32", "146219"}, - {"2620:ba:c000::/48", "6971"}, - {"2804:1e38:1001::/36", "264415"}, - {"2804:27bc::/32", "263919"}, - {"2804:6e1c::/32", "270576"}, - {"2a00:1188:10::/48", "47543"}, - {"2a0b:6b86:b13::/45", "206699"}, - {"2001:559:140::/48", "20214"}, - {"2402:1180::/32", "134076"}, - {"2409:8055:69::/34", "56040"}, - {"2620:144:a00::/32", "53692"}, - {"2804:2484:8005::/40", "28258"}, - {"2001:67c:24e4::/48", "57381"}, - {"240a:a72d::/32", "144487"}, - {"240a:ae8f::/32", "146377"}, - {"2804:38dc::/32", "266506"}, - {"2806:230:2059::/36", "11888"}, - {"2a0d:a0c0::/48", "198426"}, - {"2001:250:7003::/48", "23910"}, - {"2001:550:2210::/48", "397601"}, - {"2001:559:351::/48", "7922"}, - {"2001:4dc0::/32", "12703"}, - {"2408:8957:eb00::/40", "17816"}, - {"240a:ac11::/32", "145739"}, - {"2602:fc41::/40", "20278"}, - {"2607:6003:2309::/48", "46385"}, - {"2607:6b80:4a::/43", "13213"}, - {"2001:1230::/39", "13579"}, - {"2603:4:1604::/48", "44273"}, - {"2804:204:224::/44", "28186"}, - {"2a0b:bb41::/32", "12570"}, - {"2a0e:2b00::/30", "1239"}, - {"2c0f:f4a0::/32", "31856"}, - {"2001:559:83b3::/45", "33287"}, - {"2001:1218:600e::/42", "278"}, - {"2606:2800:4a87::/48", "14210"}, - {"2a01:608::/32", "5577"}, - {"2a01:6500:4::/32", "42925"}, - {"2001:480:37::/41", "668"}, - {"2409:8057:301a::/48", "9808"}, - {"2600:6c10:411::/46", "20115"}, - {"2804:570c::/32", "268040"}, - {"2a0b:ab00::/29", "208861"}, - {"2620:9f:12::/48", "3356"}, - {"2804:3e60::/39", "266592"}, - {"2a00:8a84:a010::/30", "29119"}, - {"2400:8b00:600::/42", "45727"}, - {"2605:6500::/48", "26512"}, - {"2001:454f::/27", "9924"}, - {"2001:4978:1005::/40", "19255"}, - {"2400:7400:e02f::/43", "23736"}, - {"2600:1402:f::/43", "20940"}, - {"2620:113:80c4::/42", "3680"}, - {"2a03:2380:5::/48", "212522"}, - {"2001:559:382::/47", "7725"}, - {"2406:c40::/32", "140602"}, - {"2600:6c20:246::/44", "20115"}, - {"2a00:9480::/32", "34578"}, - {"2001:67c:cc::/48", "196870"}, - {"2406:840:fefc::/48", "133555"}, - {"2408:8956:5e00::/40", "17622"}, - {"2600:40ff:fcf9::/48", "7046"}, - {"2600:6c39:50d::/43", "20115"}, - {"2804:90c:facf::/37", "262617"}, - {"2806:230:301a::/48", "265594"}, - {"2a0d:c580::/29", "204490"}, - {"2001:559:c261::/48", "33652"}, - {"2001:559:866b::/48", "33287"}, - {"2001:1660::/32", "25417"}, - {"2407:6340::/32", "135021"}, - {"2408:840c:200::/40", "17621"}, - {"240e:951:2800::/38", "141157"}, - {"2600:3408:300::/37", "4181"}, - {"2600:9000:11bd::/48", "16509"}, - {"2620:131:1046::/44", "26450"}, - {"2804:5f4c::/32", "269090"}, - {"2001:da8:232::/48", "24348"}, - {"2001:1248:5783::/45", "11172"}, - {"2402:800:f132::/41", "7552"}, - {"2602:fcff:16::/48", "213216"}, - {"2800:bf0:2a06::/48", "27947"}, - {"2a0e:aa07:e030::/48", "210041"}, - {"2001:559:801a::/45", "7922"}, - {"2404:19c0::/32", "138505"}, - {"2409:8004:900::/35", "24547"}, - {"240d:c010:72::/48", "139341"}, - {"2001:4130:ce::/48", "29067"}, - {"2400:59e0::/32", "134337"}, - {"2804:2458::/32", "264216"}, - {"2806:2f0:6121::/46", "17072"}, - {"2a06:d500::/29", "51184"}, - {"2a0b:a1c0::/29", "213102"}, - {"2a0d:7740::/29", "208861"}, - {"2001:559:c392::/47", "33659"}, - {"2409:803c:2000::/40", "24444"}, - {"2600:6c38:30e::/43", "20115"}, - {"2804:41cc::/32", "267457"}, - {"2a01:ad00::/45", "51865"}, - {"2a03:5f00::/39", "29644"}, - {"2408:840d:9100::/42", "17621"}, - {"2408:8956:600::/40", "17622"}, - {"2408:8956:ef40::/40", "17816"}, - {"2803:4c60::/45", "267845"}, - {"2a02:2528::/34", "25091"}, - {"2a07:24c0::/29", "203235"}, - {"2a07:2ec0::/32", "48111"}, - {"2001:661:8000::/35", "2470"}, - {"240a:a89a::/32", "144852"}, - {"2600:1016:b030::/40", "6167"}, - {"2804:3920:8000::/36", "266013"}, - {"2a01:a320::/32", "49560"}, - {"2a0d:1640::/32", "200313"}, - {"2a10:d940::/29", "34907"}, - {"240e:183:8101::/46", "140647"}, - {"2606:ae00:beb1::/41", "7287"}, - {"2804:60c8::/32", "269190"}, - {"2804:8510::/32", "272555"}, - {"2a02:cb80:1020::/48", "43766"}, - {"2a0e:72c0::/47", "208479"}, - {"2400:cb00:a4a0::/45", "13335"}, - {"240a:a2a8::/32", "143330"}, - {"240a:aed1::/32", "146443"}, - {"2605:a404:deb::/43", "33363"}, - {"2607:f428:93a0::/44", "19115"}, - {"2620:126:2000::/40", "18694"}, - {"2803:e000::/32", "262215"}, - {"2804:4ec:1500::/38", "28668"}, - {"2a02:26f7:c786::/47", "20940"}, - {"2a0e:b107:180::/44", "6556"}, - {"2001:579:4f0a::/35", "22773"}, - {"2001:648:2e01::/48", "8581"}, - {"2402:800:3dfe::/38", "7552"}, - {"2600:6c3a:19::/46", "20115"}, - {"2603:c0f0:1000::/43", "6142"}, - {"2804:18c4::/32", "53049"}, - {"2804:4104::/32", "265998"}, - {"2001:250:213::/48", "23910"}, - {"2600:6c7f:90e0::/48", "20115"}, - {"2605:b100:900::/41", "577"}, - {"2a00:4802:4c00::/43", "13124"}, - {"2c0f:f6d8:4016::/47", "21433"}, - {"2001:559:36b::/48", "7725"}, - {"240a:a000::/32", "142650"}, - {"2604:940:34::/48", "40386"}, - {"2804:7118::/32", "270766"}, - {"2a01:9ac0::/32", "59919"}, - {"2a06:bc40::/29", "203939"}, - {"2a07:b8c1:12::/32", "14043"}, - {"2001:500:100::/46", "21775"}, - {"2001:559:8415::/48", "33287"}, - {"240e:5e:4006::/48", "134774"}, - {"240e:108:8c::/48", "4134"}, - {"2604:2e8e:c000::/34", "30036"}, - {"2402:8100:26ca::/45", "55644"}, - {"2407:8bc0::/40", "140984"}, - {"240a:aca9::/32", "145891"}, - {"2402:800:9555::/42", "7552"}, - {"2600:802:100::/48", "12234"}, - {"2803:6aa0::/32", "266872"}, - {"2a00:d00:124::/31", "41887"}, - {"2a02:888:147::/48", "47794"}, - {"2001:678:1ec::/48", "42700"}, - {"2001:a98:30::/48", "1967"}, - {"2402:800:989b::/42", "7552"}, - {"240e:982:9500::/34", "4134"}, - {"2604:63c0::/32", "19465"}, - {"2804:dfc:2000::/32", "263042"}, - {"2804:7d58::/32", "271555"}, - {"2a0b:76c0::/29", "201011"}, - {"2a10:9f80::/32", "207459"}, - {"2001:250:5807::/44", "23910"}, - {"2001:e60:d8a0::/45", "4766"}, - {"2400:4ec0:8c1f::/39", "64300"}, - {"2408:8256:2d7f::/48", "17816"}, - {"240e:6b6:5000::/31", "4134"}, - {"2602:802:b045::/48", "399788"}, - {"2a03:2cc0::/32", "57537"}, - {"2a0d:ca47:2::/48", "49423"}, - {"2001:720::/32", "766"}, - {"2402:800:578d::/43", "7552"}, - {"240a:ada7::/32", "146145"}, - {"2803:9800:9083::/43", "11664"}, - {"2804:e94:120::/43", "262468"}, - {"2804:3f10:8000::/39", "262566"}, - {"2804:42cc::/32", "267528"}, - {"2a02:26f7:2e::/48", "36183"}, - {"2600:1480:7800::/48", "21342"}, - {"2804:13f0::/32", "263303"}, - {"2a0f:ca87:3::/48", "211891"}, - {"2a11:8b81::/30", "207143"}, - {"2409:8054:5c::/48", "9808"}, - {"2600:6c38:a01::/43", "20115"}, - {"2600:9000:1148::/48", "16509"}, - {"2a02:26f7:d900::/48", "36183"}, - {"2a03:8100::/32", "5524"}, - {"2a06:aa80::/32", "43267"}, - {"2800:160:1435::/46", "14259"}, - {"2a02:26f7:bb08::/48", "36183"}, - {"240a:adf5::/32", "146223"}, - {"2801:1b:6800::/48", "27951"}, - {"2804:48b8::/32", "267140"}, - {"2a00:1900::/32", "8881"}, - {"2a01:8a00::/32", "42484"}, - {"2a09:6c40::/29", "209408"}, - {"2001:df0:c8::/48", "139612"}, - {"2403:8600:c00::/44", "45820"}, - {"2a0f:607:1024::/48", "212359"}, - {"2001:559:808a::/48", "33660"}, - {"2600:370f:7483::/42", "32261"}, - {"2607:f110:52::/40", "21889"}, - {"2803:e40:a00b::/33", "27797"}, - {"2803:ebc0::/32", "265753"}, - {"2804:3b7c::/32", "266152"}, - {"2001:4368::/32", "9129"}, - {"240a:a234::/32", "143214"}, - {"2806:2f0:81c1::/46", "17072"}, - {"2a02:26f7:b98c::/48", "36183"}, - {"2a03:6947:800::/38", "61266"}, - {"2001:fd8:3010::/44", "4775"}, - {"2404:2200:11::/45", "18200"}, - {"2409:8835::/24", "9808"}, - {"240a:a293::/32", "143309"}, - {"240a:af7e::/32", "146616"}, - {"2607:9000::/34", "11878"}, - {"2804:566c::/32", "267997"}, - {"2a09:13c0::/48", "209562"}, - {"2a0c:b641:16d::/48", "211139"}, - {"2001:df6:7280::/48", "142052"}, - {"2401:8800:e00::/40", "17439"}, - {"2406:e001:1000::/33", "23655"}, - {"2801:1fc:16::/48", "27951"}, - {"2804:3c90::/32", "266220"}, - {"2a0e:aa07:e01b::/48", "211843"}, - {"2001:67c:1428::/48", "49684"}, - {"2408:8456:a610::/42", "134543"}, - {"240a:a223::/32", "143197"}, - {"2602:ff2a::/32", "19323"}, - {"2606:6680:35::/46", "18779"}, - {"2a02:ee80:411d::/48", "3573"}, - {"2a0e:b107:1310::/44", "131668"}, - {"2001:559:c401::/46", "33659"}, - {"2405:d400::/32", "9927"}, - {"2620:a1:c000::/48", "35960"}, - {"2a05:e740:116::/48", "29108"}, - {"2a06:56c1:1000::/48", "16509"}, - {"2404:4a00:7000::/64", "55423"}, - {"2409:8087:7f00::/32", "9808"}, - {"2602:805:d000::/44", "46208"}, - {"2604:4300::/32", "33387"}, - {"2804:1a4::/32", "28140"}, - {"2804:4e60::/32", "268257"}, - {"2806:3d2::/48", "263167"}, - {"2a11:dd80::/29", "204790"}, - {"2001:559:819f::/48", "20214"}, - {"2001:67c:21b0::/48", "51871"}, - {"2001:1248:5a5b::/42", "11172"}, - {"2603:c023:c000::/35", "31898"}, - {"2603:c0e0:1000::/38", "54253"}, - {"2620:1f6::/36", "26305"}, - {"2804:5f10::/32", "269074"}, - {"2a02:2e02:3b70::/40", "12479"}, - {"2001:df3:7c80::/48", "140577"}, - {"2001:1a68:4::/46", "15694"}, - {"2400:dd01:3015::/44", "7497"}, - {"2606:2c0:3::/45", "16509"}, - {"2a0a:ba40::/29", "205958"}, - {"2001:250:852::/44", "138182"}, - {"240a:a371::/32", "143531"}, - {"2600:6c20:116::/47", "20115"}, - {"2607:fe58::/32", "46449"}, - {"2804:64ac::/32", "269441"}, - {"2a00:1418:1000::/34", "41391"}, - {"2a02:2e02:2310::/41", "12479"}, - {"2a04:4e40:fe00::/48", "54113"}, - {"2001:df5:4480::/48", "133296"}, - {"2401:1d80:3000::/47", "16509"}, - {"2600:6c10:c05::/44", "20115"}, - {"2600:9000:2483::/44", "16509"}, - {"2804:1e68::/32", "53006"}, - {"2804:8554::/32", "272572"}, - {"2001:4f8:c::/43", "1280"}, - {"2001:678:d38::/48", "42504"}, - {"240e:3b5:f100::/37", "134775"}, - {"2801:80:3800::/48", "269610"}, - {"2806:2f0:9743::/42", "17072"}, - {"2409:8c1a::/29", "132525"}, - {"2800:1e0:a04::/39", "7195"}, - {"2804:5b4c::/32", "268833"}, - {"2a02:26f7:cac4::/48", "36183"}, - {"2a0f:6580:106::/48", "60707"}, - {"2a0f:9400:7834::/44", "147028"}, - {"2001:df0:f8::/48", "9555"}, - {"2600:1488:a000::/47", "20940"}, - {"2401:d800:24c0::/42", "7552"}, - {"2401:d800:7310::/42", "7552"}, - {"2405:1e40::/47", "58475"}, - {"240a:a641::/32", "144251"}, - {"2600:6c38:e23::/45", "20115"}, - {"2604:ca00:f00a::/45", "36492"}, - {"2a06:6540:30c1::/48", "3549"}, - {"2001:44b8:2066::/44", "7545"}, - {"2604:aec0::/32", "11900"}, - {"2620:1a:4000::/48", "2572"}, - {"2801:80:ef0::/48", "264185"}, - {"2001:4c8:1096::/44", "15290"}, - {"240e:1f::/48", "134774"}, - {"2600:1406:8801::/38", "20940"}, - {"2a02:26f7:ca40::/48", "36183"}, - {"2a02:26f7:cf40::/48", "36183"}, - {"2a02:26f7:d288::/48", "36183"}, - {"2a03:9f00::/32", "8676"}, - {"2001:559:387::/48", "33287"}, - {"2001:559:4c3::/48", "33491"}, - {"240a:ab09::/32", "145475"}, - {"240e:44d:4900::/41", "140345"}, - {"2607:f798::/34", "812"}, - {"2800:160:145c::/42", "14259"}, - {"2804:8098::/32", "271761"}, - {"2a02:26f7:f684::/48", "36183"}, - {"2a04:5b87:1::/48", "202265"}, - {"2a0a:9bc0::/29", "48303"}, - {"2001:67c:19f0::/48", "199771"}, - {"240a:ab3e::/32", "145528"}, - {"240a:afba::/32", "146676"}, - {"2800:bf0:814d::/46", "52257"}, - {"2a01:7040::/32", "58123"}, - {"2a02:26f7:e881::/46", "20940"}, - {"2a02:7b01::/34", "48328"}, - {"2001:250:504a::/48", "23910"}, - {"2408:8459:1450::/38", "17816"}, - {"2409:8062:1900::/34", "9808"}, - {"2606:6d00:200::/32", "1403"}, - {"2804:584c::/32", "268120"}, - {"2806:230:202b::/48", "11888"}, - {"2a0b:f4c1:2::/48", "60729"}, - {"2001:468:2651::/40", "11537"}, - {"2001:559:c352::/48", "33667"}, - {"2407:e740:10b::/42", "59239"}, - {"2800:800:520::/44", "26611"}, - {"2a00:d101:4000::/36", "15704"}, - {"2a02:26f7:ec09::/46", "20940"}, - {"2001:8c0::/29", "2116"}, - {"2001:978:6402::/45", "174"}, - {"2409:8c28:1301::/34", "56041"}, - {"240e:3bb:9c00::/34", "140310"}, - {"2606:6a40::/44", "14638"}, - {"2804:7dd0::/34", "271584"}, - {"2a0c:da02::/32", "57878"}, - {"2400:5d00::/32", "58507"}, - {"2408:8a06::/47", "9929"}, - {"2409:8070:30e8::/48", "140105"}, - {"240a:ac7d::/32", "145847"}, - {"2600:1402:15::/48", "35994"}, - {"2600:6c10:b2::/44", "20115"}, - {"2804:5d90::/32", "13786"}, - {"2a01:8840:62::/45", "12041"}, - {"2600:1010:be00::/44", "6167"}, - {"2602:80c:100a::/48", "20115"}, - {"2606:3600:115::/48", "16839"}, - {"2607:ff60::/46", "3900"}, - {"2804:23d4::/32", "264186"}, - {"2a05:480::/29", "200000"}, - {"240e:3b5:5600::/34", "4134"}, - {"2406:af40::/32", "9237"}, - {"2602:feda:ab3::/44", "141011"}, - {"2603:90b9::/32", "10838"}, - {"2a0e:e2c1::/32", "42156"}, - {"2607:f6f0:1400::/40", "398811"}, - {"2a03:fc00::/29", "34756"}, - {"2001:1998:8e0::/38", "7843"}, - {"2001:49e8::/32", "6939"}, - {"240a:afca::/32", "146692"}, - {"2804:fb4:a040::/33", "263599"}, - {"2804:21b8::/48", "264569"}, - {"2a01:168::/29", "41670"}, - {"2a12:2600::/29", "44685"}, - {"2001:559:bf::/48", "7922"}, - {"2001:559:8682::/48", "33657"}, - {"2408:8957:800::/40", "17622"}, - {"2804:2b88::/32", "265158"}, - {"2806:1020::/37", "8151"}, - {"2a03:b00::/32", "8723"}, - {"2a0b:6940::/29", "49573"}, - {"2a0f:9400:8012::/48", "23470"}, - {"240e:44d:2040::/42", "140361"}, - {"2a02:26f7:bf09::/46", "20940"}, - {"2a02:26f7:d309::/42", "20940"}, - {"2001:550:40a::/39", "174"}, - {"2001:559:865c::/48", "7725"}, - {"2c0f:eb00:300::/40", "61266"}, - {"2604:e100:1::/48", "33028"}, - {"2620:13d:2000::/41", "20326"}, - {"2a00:cee0:dcd::/31", "60268"}, - {"2a02:26f7:eec0::/48", "36183"}, - {"2a02:ee80:41f8::/38", "3573"}, - {"2a03:8600:2::/45", "3399"}, - {"2402:3b00::/32", "38648"}, - {"2402:a800:fff0::/48", "55895"}, - {"2804:7a64:a000::/35", "271368"}, - {"2804:8130::/32", "272438"}, - {"2a0a:67c0::/29", "212796"}, - {"2001:da8:e810::/46", "24368"}, - {"2001:ee0:3101::/43", "45899"}, - {"2600:1480:c000::/40", "33905"}, - {"2a02:2e0:3fd::/46", "12306"}, - {"2001:da8:b81d::/37", "23910"}, - {"2001:43f8:750::/44", "37520"}, - {"2602:ff96:9::/48", "40676"}, - {"2804:28e4::/45", "28260"}, - {"2a04:5f80::/32", "60233"}, - {"2a0f:5707:b130::/44", "210633"}, - {"2402:e280:2228::/47", "134674"}, - {"240e:698:4500::/40", "58461"}, - {"2605:8100::/32", "7311"}, - {"2804:26d0::/32", "262454"}, - {"2a02:26f0:138::/45", "20940"}, - {"2a02:26f7:e08c::/48", "36183"}, - {"2a06:98c1:55::/46", "13335"}, - {"2001:da8:c00a::/37", "23910"}, - {"2401:7400:4001::/43", "4773"}, - {"2600:6c10:80a::/43", "20115"}, - {"2804:154c:502e::/32", "263382"}, - {"2001:559:4ed::/46", "33661"}, - {"2001:678:e90::/48", "8447"}, - {"2001:67c:26f8::/48", "41709"}, - {"2001:4888:8027::/44", "6167"}, - {"2404:3d00:414c::/47", "21433"}, - {"240e:5a:4000::/40", "140290"}, - {"2605:7bc0::/32", "395439"}, - {"2605:f440:beef::/48", "212105"}, - {"2804:39c:5200::/40", "28329"}, - {"2001:559:c499::/48", "7725"}, - {"2001:579:134::/36", "22773"}, - {"2406:8800:9049::/46", "17465"}, - {"2800:2d0::/32", "3603"}, - {"2804:39c4::/32", "266049"}, - {"2804:3cd8::/32", "266238"}, - {"2001:559:4a::/45", "7922"}, - {"2001:920::/31", "8220"}, - {"2600:6c38:abd::/46", "20115"}, - {"2602:fd69::/36", "14731"}, - {"2800:490:4e00::/39", "27951"}, - {"2800:bf0:145::/48", "27947"}, - {"2a05:3880::/29", "201518"}, - {"2607:fb10:7039::/41", "2906"}, - {"2804:3cf0::/32", "266243"}, - {"2804:7534::/32", "271031"}, - {"2806:260:4::/48", "13999"}, - {"2408:8256:2f6b::/48", "17816"}, - {"240a:ac41::/32", "145787"}, - {"2605:4480::/32", "21624"}, - {"2800:160:1581::/44", "14259"}, - {"2800:160:1a96::/44", "14259"}, - {"2806:230:403b::/48", "11888"}, - {"2a01:7520::/32", "62167"}, - {"2a02:ee80:41ba::/45", "21433"}, - {"2a0b:33c0:112::/45", "57395"}, - {"2001:518::/32", "8001"}, - {"2001:67c:13a0::/48", "57954"}, - {"2001:da8:8004::/44", "24364"}, - {"2001:4d88::/32", "31333"}, - {"2600:141c:5000::/48", "8151"}, - {"2620:37:e000::/48", "53535"}, - {"2804:5c68::/32", "268907"}, - {"2a02:26f7:c35c::/47", "36183"}, - {"2a0a:2c0:3::/48", "197481"}, - {"2001:250:7030::/48", "24370"}, - {"2401:4800:3021::/48", "38457"}, - {"240a:aef9::/32", "146483"}, - {"2804:3f38:9000::/36", "266646"}, - {"2001:1ab8::/31", "15440"}, - {"2401:b180::/33", "37963"}, - {"2404:bf40:ec01::/48", "7545"}, - {"2406:840:e14f::/48", "142164"}, - {"2804:14c:da87::/43", "28573"}, - {"2a01:a440::/48", "51297"}, - {"2a02:dd80::/29", "204896"}, - {"2406:e340::/32", "137274"}, - {"2409:8959:cc54::/39", "56040"}, - {"2605:6400:20::/48", "53667"}, - {"2804:5e48:ff02::/48", "269023"}, - {"2a02:ee80:4069::/46", "3573"}, - {"2a04:b906::/48", "211321"}, - {"2a02:26f7:d501::/46", "20940"}, - {"2a03:840::/32", "199405"}, - {"2a0d:8d00::/30", "47750"}, - {"2001:559:c1e6::/48", "33652"}, - {"2402:e280:210f::/43", "134674"}, - {"2409:8924:4b00::/37", "56046"}, - {"240a:ad24::/32", "146014"}, - {"2a0f:7400::/30", "213275"}, - {"2400:cb00:132::/48", "13335"}, - {"2804:158::/32", "53093"}, - {"2a04:6f02::/29", "3214"}, - {"2409:8c0c::/39", "56042"}, - {"2001:559:c1bf::/48", "33489"}, - {"2001:44c8:128::/47", "131445"}, - {"2402:800:3355::/42", "7552"}, - {"2404:8000:ae::/47", "17451"}, - {"2603:f810::/26", "397165"}, - {"2a02:26f7:44::/48", "36183"}, - {"2a02:26f7:b801::/46", "20940"}, - {"2a02:26f7:e341::/46", "20940"}, - {"2a05:d03a:a000::/40", "16509"}, - {"2a0f:e480::/29", "60262"}, - {"2605:dd40:8119::/38", "398549"}, - {"2620:25:a000::/48", "394470"}, - {"2804:5ad0:f000::/36", "268798"}, - {"2a00:ece1:1::/48", "61050"}, - {"2a02:26f7:cfc9::/46", "20940"}, - {"2a10:4580::/29", "399975"}, - {"240a:a3bb::/32", "143605"}, - {"2a02:3d0:622::/32", "22822"}, - {"2a0e:b107:df5::/48", "142055"}, - {"2a00:5400:1235::/32", "35753"}, - {"2a02:2998::/32", "13009"}, - {"2a03:be80::/47", "15510"}, - {"2001:250:c2e::/43", "23910"}, - {"2001:4940::/34", "21547"}, - {"240a:a3c1::/32", "143611"}, - {"2600:1402:3801::/37", "20940"}, - {"2804:1690:680::/36", "263292"}, - {"2a02:4840:1111::/48", "203339"}, - {"2001:559:8234::/48", "33656"}, - {"2408:84f3:4210::/42", "134543"}, - {"2605:f500:502::/38", "1828"}, - {"2806:2f0:3101::/46", "17072"}, - {"2a00:1838::/32", "43317"}, - {"2a01:1df::/32", "15744"}, - {"2404:7c00:2::/48", "141177"}, - {"240a:ae2d::/32", "146279"}, - {"2604:d600:156a::/45", "32098"}, - {"2a10:fa80:92::/48", "57050"}, - {"2001:67c:414::/48", "211073"}, - {"2402:800:39e0::/44", "7552"}, - {"2800:160:14c0::/43", "14259"}, - {"2a11:1c40::/29", "204790"}, - {"2605:3ac0::/36", "20029"}, - {"2a01:4a0:18::/45", "201011"}, - {"2a02:26f7:d180::/48", "36183"}, - {"2402:5300:4410::/39", "45903"}, - {"2620:d8:8000::/48", "2900"}, - {"2800:370:c000::/46", "28006"}, - {"2600:100f:a110::/36", "22394"}, - {"2620:88:6000::/48", "33600"}, - {"2a01:b6a0::/32", "197216"}, - {"2a02:26f7:cc81::/46", "20940"}, - {"2c0f:f280::/32", "37645"}, - {"2001:678:fbc::/48", "43183"}, - {"2001:b28:f23d::/48", "59930"}, - {"2607:2400::/32", "40335"}, - {"2a07:cb40::/29", "207237"}, - {"2a0e:b107:5a9::/48", "203943"}, - {"2001:ee0:ec00::/40", "45899"}, - {"2400:3840::/33", "23860"}, - {"240a:af61::/32", "146587"}, - {"2607:fca8::/37", "17139"}, - {"2a02:790::/32", "24679"}, - {"2a10:53c0::/29", "34907"}, - {"2a10:a480::/29", "6729"}, - {"2c0f:f7a8:9041::/48", "4809"}, - {"2001:559:5b7::/48", "33657"}, - {"2001:918:ff78::/40", "3303"}, - {"2404:f4c0:fff0::/48", "140219"}, - {"240e:388::/29", "4812"}, - {"2804:204:304::/47", "28186"}, - {"2a03:5344::/44", "34414"}, - {"2a07:8142::/36", "209677"}, - {"2a0a:340:200::/40", "48651"}, - {"2001:468:2601::/44", "11537"}, - {"240a:ab1f::/32", "145497"}, - {"2001:4878:8164::/48", "12222"}, - {"2409:8020:3063::/43", "56046"}, - {"240e:980:9600::/40", "58542"}, - {"2605:a401:8141::/45", "33363"}, - {"2a00:e6a0::/46", "12303"}, - {"2a02:7a00::/47", "39904"}, - {"2a0c:6c40:c840::/47", "20705"}, - {"2409:8958:cd54::/38", "56040"}, - {"2804:2b00::/32", "265130"}, - {"2001:500:14::/48", "42"}, - {"2001:559:858d::/46", "22909"}, - {"240a:ad0d::/32", "145991"}, - {"2a09:6280:3::/48", "203493"}, - {"2a11:5200::/29", "211344"}, - {"2001:1248:8849::/43", "11172"}, - {"2408:8957:c300::/40", "17816"}, - {"2600:1417:60::/48", "20940"}, - {"2605:1cc0::/32", "7029"}, - {"2620:a7:8000::/48", "54111"}, - {"2803:e600:4::/47", "18809"}, - {"2804:399c:fff1::/44", "266039"}, - {"2a03:2a60:dc::/48", "59871"}, - {"2a10:3e84::/30", "212144"}, - {"2600:1407:2801::/37", "20940"}, - {"2602:fed2:7708::/48", "208188"}, - {"2a0b:4340:9e::/48", "205610"}, - {"2a0e:aa07:f09b::/48", "208884"}, - {"2400:8500:3000::/48", "55907"}, - {"2409:875c::/33", "9808"}, - {"2804:3dc:f2::/36", "52967"}, - {"2001:559:7db::/48", "21508"}, - {"2a02:26f7:bec9::/46", "20940"}, - {"2a0b:bf80::/32", "60522"}, - {"240a:a205::/32", "143167"}, - {"2408:8956:4700::/40", "17816"}, - {"2801:80:1414::/48", "11097"}, - {"2a02:6380::/32", "56349"}, - {"2405:c0:60::/48", "138881"}, - {"240a:a52a::/32", "143972"}, - {"2800:160:2270::/40", "14259"}, - {"2800:bf0:2200::/45", "52257"}, - {"2a02:26f7:f8d1::/46", "20940"}, - {"2001:520:1012::/48", "8103"}, - {"2001:67c:24a4::/48", "204711"}, - {"2404:cf00:efb::/32", "38511"}, - {"240e:3b4:ac00::/35", "4134"}, - {"2803:bc40:a01c::/33", "52468"}, - {"2806:2f0:9241::/40", "17072"}, - {"2401:d800:d280::/42", "7552"}, - {"2605:8300:2::/48", "25645"}, - {"2402:800:7910::/42", "7552"}, - {"2402:8100:31da::/45", "55644"}, - {"2409:8054:50::/48", "9808"}, - {"2607:f098:6100::/32", "33363"}, - {"2620:79:8000::/48", "698"}, - {"2620:101:200d::/46", "30215"}, - {"2804:14c:da91::/44", "28573"}, - {"2804:4b24::/32", "267286"}, - {"2a0f:f400::/29", "40970"}, - {"2001:df2:df80::/48", "139904"}, - {"2400:ca08::/29", "23688"}, - {"2402:7500:4ce::/42", "24158"}, - {"240a:a714::/32", "144462"}, - {"240a:a9d8::/32", "145170"}, - {"240e:67c:1800::/32", "4134"}, - {"2605:3380:412c::/47", "12025"}, - {"2606:8f80:1::/48", "6327"}, - {"2a03:4c0::/32", "15405"}, - {"2a10:4080::/29", "399975"}, - {"2409:8c85:aa11::/46", "9808"}, - {"2605:a404:fd::/39", "33363"}, - {"2803:740::/32", "264719"}, - {"2804:129c::/32", "263487"}, - {"2a01:190:15ec::/48", "199216"}, - {"2a02:26f7:e4c1::/46", "20940"}, - {"2001:250:702f::/48", "24369"}, - {"2001:e60:a730::/40", "4766"}, - {"2409:8a53:f00::/35", "56047"}, - {"2804:7180:200::/32", "270793"}, - {"2a05:2240::/32", "59835"}, - {"2001:938:402f::/43", "8437"}, - {"240a:a6ee::/32", "144424"}, - {"2606:42c0:dd::/32", "399078"}, - {"2806:342:f600::/36", "265591"}, - {"2605:dd40:5ccd::/32", "398549"}, - {"2a0d:2587:3800::/33", "142553"}, - {"2401:d800:2140::/42", "7552"}, - {"240a:aa10::/32", "145226"}, - {"240a:aac7::/32", "145409"}, - {"2801:80:23f0::/48", "268293"}, - {"2a02:7e60::/32", "200925"}, - {"2400:cb00:397::/44", "13335"}, - {"2607:f740:e060::/43", "398748"}, - {"2800:200:b4f0::/36", "12252"}, - {"2804:b54::/32", "52765"}, - {"2806:2f0:93a2::/41", "17072"}, - {"2a01:c50e:1900::/34", "12479"}, - {"2001:1248:5b75::/44", "11172"}, - {"2402:7480::/32", "18106"}, - {"240a:a032::/32", "142700"}, - {"240e:bf:b8e4::/46", "138641"}, - {"240e:67e:8800::/38", "140330"}, - {"240e:979:8500::/40", "131325"}, - {"2605:1240::/33", "55222"}, - {"2804:38fc::/32", "266516"}, - {"2a02:26f7:d589::/46", "20940"}, - {"2a03:9d40:5000::/40", "41095"}, - {"2a05:1500:ff00::/40", "48635"}, - {"2001:67c:2384::/48", "197942"}, - {"2001:4350:a001::/33", "2609"}, - {"2800:160:159a::/45", "14259"}, - {"2a10:4c40::/29", "212736"}, - {"2001:559:7da::/48", "33650"}, - {"2001:559:83fb::/48", "33667"}, - {"2001:67c:1c00::/40", "48144"}, - {"2001:1930:3c10::/48", "11985"}, - {"2406:8800:9041::/46", "17465"}, - {"2603:90fb::/44", "19115"}, - {"2606:3d40:10::/47", "400097"}, - {"2804:2f6c:dc00::/34", "264890"}, - {"2001:df0:312::/47", "135008"}, - {"2401:2200:1000::/37", "55420"}, - {"2407:5c40::/32", "142139"}, - {"2600:40ff:fcfe::/38", "701"}, - {"2605:dd40:8221::/46", "398549"}, - {"2610:e0:d000::/34", "2572"}, - {"2804:839c::/32", "272208"}, - {"2806:2f0:45a3::/41", "17072"}, - {"2a02:c78::/29", "5607"}, - {"2a04:e800:5407::/48", "57976"}, - {"2620:1ec:908::/47", "8068"}, - {"2804:138::/32", "11432"}, - {"2a00:ea8::/32", "9211"}, - {"2001:559:c156::/48", "33656"}, - {"2001:44b8:30c2::/48", "7545"}, - {"240e:3bc:6400::/35", "140312"}, - {"2a01:b600::/32", "43989"}, - {"2402:8100:26da::/39", "55644"}, - {"2600:6c10:f34e::/37", "20115"}, - {"2620:2f::/48", "32638"}, - {"2804:47b8::/32", "267073"}, - {"2a01:4400:1::/46", "1257"}, - {"2a02:26f7:e481::/46", "20940"}, - {"2a0d:5642:130::/48", "35487"}, - {"2401:f000:2:300::/45", "38477"}, - {"2405:e840::/32", "4049"}, - {"2a02:26f7:c288::/48", "36183"}, - {"2a04:2f00::/29", "60256"}, - {"2a0f:5e80::/29", "39287"}, - {"2001:470:c3::/48", "395466"}, - {"2409:8062:900::/35", "9808"}, - {"2804:7f54::/32", "271681"}, - {"2a02:26f7:eb8c::/48", "36183"}, - {"2a10:ed00::/29", "212297"}, - {"2001:559:19f::/48", "21508"}, - {"2408:8459:5e30::/41", "17622"}, - {"240a:a67c::/32", "144310"}, - {"2a02:ee80:42aa::/41", "3573"}, - {"240a:a427::/32", "143713"}, - {"2600:1004:b130::/44", "22394"}, - {"2800:410::/32", "10269"}, - {"2001:510:305::/32", "376"}, - {"2001:df7:9580::/48", "146867"}, - {"2401:d800:fa10::/42", "7552"}, - {"2402:800:b560::/40", "7552"}, - {"2806:2f0:24a1::/48", "22884"}, - {"2402:9800:4002::/48", "131119"}, - {"2602:ffc5:103::/48", "7489"}, - {"2409:8073:2a00::/46", "9808"}, - {"2600:1013:b030::/40", "6167"}, - {"2a02:88d:8230::/44", "48695"}, - {"2a11:e900::/29", "211199"}, - {"2001:550:9c00::/48", "400302"}, - {"2001:7fb:fe12::/45", "12654"}, - {"2607:f3a0:a004::/48", "399816"}, - {"2402:3a80:c050::/46", "38266"}, - {"2803:d6c0:2::/44", "265698"}, - {"2804:14d:9e00::/40", "28573"}, - {"2804:d3c::/32", "52613"}, - {"2804:df0:e00::/35", "262775"}, - {"2401:3cc0:401::/39", "137409"}, - {"2401:d800:dde0::/38", "7552"}, - {"2620:10c:e000::/40", "32629"}, - {"2804:2a0::/38", "28272"}, - {"2804:cb0:fac4::/44", "52742"}, - {"2001:4868:800::/40", "23148"}, - {"2406:3003:2030::/41", "55430"}, - {"240a:a537::/32", "143985"}, - {"2804:6554::/32", "269483"}, - {"2409:8e61::/27", "9808"}, - {"2600:6c21:486::/44", "20115"}, - {"2801:c4:26::/48", "265584"}, - {"2a02:2718::/29", "30873"}, - {"2001:559:c295::/48", "33491"}, - {"2001:678:900::/48", "39602"}, - {"2600:380:ac00::/41", "20057"}, - {"2804:fc8::/32", "263603"}, - {"2804:3e88::/32", "266603"}, - {"2a02:ac80:301::/37", "25145"}, - {"2001:559:c1d8::/48", "7015"}, - {"240a:a3e9::/32", "143651"}, - {"2610:b0:411a::/45", "3573"}, - {"2804:2a5c::/32", "264071"}, - {"2001:67c:2c24::/48", "15542"}, - {"2605:ca40:1::/48", "397011"}, - {"2a0c:a9c7:177::/48", "43832"}, - {"2401:d800:b0c0::/42", "7552"}, - {"2a0a:3140:2600::/46", "15532"}, - {"2600:1480:f001::/28", "20940"}, - {"2a00:e20:150::/46", "16509"}, - {"2a0c:1700::/47", "205112"}, - {"2001:67c:698::/48", "201820"}, - {"2804:26e8::/32", "262573"}, - {"2a00:4802:3000::/43", "13124"}, - {"2001:1938:2105::/48", "33438"}, - {"2804:158c::/32", "263394"}, - {"2a0d:77c7:de24::/34", "7489"}, - {"2001:559:28e::/48", "33652"}, - {"2804:8140::/35", "272442"}, - {"2806:2f0:71e3::/38", "17072"}, - {"2001:559:c3aa::/48", "33668"}, - {"2001:559:c49a::/48", "33662"}, - {"2001:67c:18c4::/48", "15576"}, - {"2600:1415:d801::/34", "20940"}, - {"2606:6680:2000::/33", "40676"}, - {"2804:3174::/36", "265016"}, - {"2604:880:6f::/48", "29802"}, - {"2a03:4a81::/32", "20473"}, - {"2a0b:c040::/31", "42237"}, - {"2001:67c:2274::/48", "197164"}, - {"2001:978:8900:1::/37", "174"}, - {"2402:af40::/32", "23779"}, - {"2409:8904:5c40::/42", "24547"}, - {"240a:a035::/32", "142703"}, - {"240e:45c:3c00::/33", "131285"}, - {"2620:9d:6000::/48", "16509"}, - {"2620:171:24::/48", "715"}, - {"2800:160:1489::/45", "14259"}, - {"240e:964:a800::/38", "58772"}, - {"2605:6f00:9000::/36", "10929"}, - {"2a02:2a50::/29", "49800"}, - {"2a03:32c0:a::/48", "29555"}, - {"2a0b:1306:c::/48", "198018"}, - {"240e:67f:e200::/39", "140329"}, - {"2606:6680:4::/48", "40676"}, - {"2607:f740::/47", "36236"}, - {"2803:ab00:90::/48", "23520"}, - {"2804:391c:7::/44", "262287"}, - {"2804:3bc8::/32", "266170"}, - {"2804:4c0c::/41", "267345"}, - {"2001:559:82be::/48", "33287"}, - {"2408:8456:4240::/37", "17816"}, - {"2804:45e8::/32", "52814"}, - {"2a00:17f0::/32", "33808"}, - {"2a00:19f8::/32", "49010"}, - {"2a01:7d20:1000::/40", "203645"}, - {"2a10:6b40::/29", "212640"}, - {"2401:d800:5240::/42", "7552"}, - {"2403:fd40:1001::/46", "132372"}, - {"2603:4:1200::/48", "44273"}, - {"2806:230:201c::/48", "265594"}, - {"2a0e:5700::/32", "58291"}, - {"2600:370f:73c5::/42", "32261"}, - {"2a0d:8a80::/32", "33353"}, - {"2607:fcd0:dac0::/34", "8100"}, - {"2a00:a8e0:1::/46", "202108"}, - {"2a05:7740::/29", "57532"}, - {"2406:9c40::/35", "55366"}, - {"2409:8a75::/28", "9808"}, - {"240a:a693::/32", "144333"}, - {"240a:ac65::/32", "145823"}, - {"2801:80:3720::/48", "269400"}, - {"2801:1b2::/44", "14080"}, - {"2804:7d70:2000::/32", "271561"}, - {"2001:250:80f::/48", "23910"}, - {"2001:67c:2978::/48", "211671"}, - {"2401:31c0:ffff::/48", "133429"}, - {"2804:8318:20::/38", "272176"}, - {"2a00:4800:1e0::/44", "13124"}, - {"2407:5200:301::/37", "55915"}, - {"2602:fbd5::/36", "400370"}, - {"2400:8400::/32", "18085"}, - {"2a00:1210::/32", "34700"}, - {"2400:e340::/46", "136450"}, - {"2a0c:b641:219::/48", "209661"}, - {"2001:559:270::/48", "33490"}, - {"2001:1388:2f10::/35", "6147"}, - {"2400:9700:101::/43", "24550"}, - {"240a:a324::/32", "143454"}, - {"2600:6c38:45b::/45", "20115"}, - {"2804:5d00:d000::/34", "268945"}, - {"2a0b:f940:3af3::/33", "205373"}, - {"2001:500:a7::/48", "55195"}, - {"2401:3cc0:901::/32", "137409"}, - {"2401:d800:d100::/42", "7552"}, - {"2606:cd80:1::/48", "29802"}, - {"2804:25f4::/32", "52800"}, - {"2a01:cf00::/42", "2278"}, - {"2804:6f0::/36", "53047"}, - {"2a03:5a00:16::/48", "42574"}, - {"2a03:db80:3411::/36", "680"}, - {"2001:678:318::/48", "51597"}, - {"2001:df7:b300::/48", "131111"}, - {"2402:800:37c5::/43", "7552"}, - {"2800:484:3200::/36", "14080"}, - {"2804:1784::/44", "263152"}, - {"2a02:26f7:c3c1::/46", "20940"}, - {"2a02:26f7:d905::/46", "20940"}, - {"2a06:c5c0:900::/48", "44709"}, - {"2a0c:a880::/29", "204754"}, - {"2a10:e580:1::/46", "399114"}, - {"2001:fd0:3201::/39", "10029"}, - {"2401:d800:c90::/42", "7552"}, - {"2001:67c:2948::/48", "210211"}, - {"2408:8026:530::/38", "17621"}, - {"2800:160:110e::/43", "14259"}, - {"2a02:2698:6800::/38", "34533"}, - {"2c0f:f7a8:815f::/48", "4134"}, - {"2a0c:b641:6c6::/47", "213236"}, - {"2001:550:1402::/47", "397601"}, - {"240a:ad0b::/32", "145989"}, - {"2600:3400::/30", "4181"}, - {"2804:1a0c::/32", "61833"}, - {"2804:2760::/32", "263897"}, - {"2001:468:2650::/48", "22742"}, - {"2001:67c:18bc::/48", "24840"}, - {"2400:a980:5100::/37", "133111"}, - {"2409:8002:2b00::/40", "38019"}, - {"2806:2f0:3261::/46", "17072"}, - {"2400:89c0:1091::/48", "23724"}, - {"240a:abbb::/32", "145653"}, - {"240a:aeb3::/32", "146413"}, - {"2607:ffc8:0:7::/47", "17356"}, - {"2800:160:12be::/41", "14259"}, - {"2409:8070:2100::/36", "9808"}, - {"2605:a404:8b::/42", "33363"}, - {"2804:5050::/32", "268381"}, - {"2804:63f4::/32", "269394"}, - {"2a02:5b20::/32", "47720"}, - {"2001:559:86af::/48", "33491"}, - {"2602:fc09:800::/45", "13780"}, - {"2800:68:37::/48", "27947"}, - {"2804:920:5200::/32", "263053"}, - {"2a02:6f00::/36", "197692"}, - {"2a0f:33c0::/29", "37286"}, - {"2408:8957:4700::/40", "17816"}, - {"2a02:26f7:f048::/48", "36183"}, - {"240e:974:e700::/40", "4134"}, - {"2a02:26f7:d148::/47", "36183"}, - {"2a07:f101::/36", "28885"}, - {"2803:9800:a8c5::/46", "11664"}, - {"2001:559:c263::/48", "33657"}, - {"240a:a7f4::/32", "144686"}, - {"2607:3400::/32", "26891"}, - {"2a03:5640:f507::/44", "16509"}, - {"2a07:22c1:38::/48", "210715"}, - {"2001:4457:ff0::/48", "20940"}, - {"2409:8070:30f8::/45", "140105"}, - {"240e:e1:d101::/30", "4812"}, - {"2a02:367:1187::/48", "42804"}, - {"2a07:9942:39d8::/47", "43350"}, - {"2a09:a440::/48", "205479"}, - {"2001:559:5e5::/48", "7922"}, - {"2402:3a80:c00b::/48", "38266"}, - {"2402:3a80:c034::/47", "38266"}, - {"2409:8700::/31", "56048"}, - {"2804:47f4::/32", "267088"}, - {"2a01:8840:7a::/45", "12041"}, - {"2a02:26f7:ee01::/46", "20940"}, - {"2c0f:e8e0:4010::/42", "327926"}, - {"2001:df0:59c0::/48", "149475"}, - {"2001:df5:4b80::/48", "141404"}, - {"2408:8957:3c00::/40", "17622"}, - {"2605:c640::/32", "62538"}, - {"2607:fb58:d202::/40", "53933"}, - {"2804:53c::/33", "53004"}, - {"2a02:7840::/32", "51088"}, - {"2001:5b8::/32", "13645"}, - {"2400:9380:8221::/48", "4134"}, - {"2602:fcf6:ffe::/48", "49780"}, - {"2804:7c40::/32", "271484"}, - {"2a00:1bd0::/32", "39704"}, - {"2a0f:e040:2::/48", "210662"}, - {"2001:67c:29e0::/48", "21131"}, - {"2a04:c900:3000::/36", "48096"}, - {"2a0e:fd45:b50::/47", "207722"}, - {"2604:6e00:800::/37", "13977"}, - {"2610:a1:1001::/48", "397228"}, - {"2804:1068::/32", "263634"}, - {"2001:559:c151::/48", "33654"}, - {"2404:7c00:50::/32", "45650"}, - {"2405:600:5001::/32", "55805"}, - {"2409:8c62:ff01::/40", "9808"}, - {"2600:140f:c401::/38", "20940"}, - {"2604:c880::/41", "46455"}, - {"2806:2f0:30e3::/39", "17072"}, - {"2a02:26f7:d150::/48", "36183"}, - {"2a02:838a:50::/29", "8412"}, - {"2a05:a884:10::/48", "51964"}, - {"2001:559:c0c0::/48", "7016"}, - {"2001:559:c191::/48", "13367"}, - {"2001:67c:2ad0::/48", "60053"}, - {"2409:893e::/25", "9808"}, - {"2600:6c10:ff23::/45", "20115"}, - {"2804:1f4c::/32", "269175"}, - {"2a06:8e01:1::/46", "44103"}, - {"2a0d:f47::/32", "39080"}, - {"2001:1a11:cc::/43", "42298"}, - {"2403:9800:b017::/48", "4648"}, - {"2409:4014:1000::/34", "55836"}, - {"2620:10a:a000::/47", "16920"}, - {"2620:149:1a10::/39", "714"}, - {"2804:cb0:8889::/34", "52742"}, - {"2804:47a8::/32", "267069"}, - {"2a05:9f04::/42", "210374"}, - {"2a0a:e5c0:22::/48", "213081"}, - {"2a0d:2683::/36", "207268"}, - {"2001:da8:3029::/48", "23910"}, - {"240a:a969::/32", "145059"}, - {"2606:a300:3::/45", "35847"}, - {"2a06:cd40:100::/48", "43927"}, - {"2001:678:15c::/48", "209616"}, - {"2804:7a64::/34", "271368"}, - {"2001:4878:a215::/46", "12222"}, - {"2a0a:7e80::/29", "203203"}, - {"2001:559:85c2::/48", "33491"}, - {"2801:80:3520::/48", "268844"}, - {"2a05:f080::/29", "38919"}, - {"2001:559:c36b::/48", "7922"}, - {"2001:5f8:7f0d::/48", "399693"}, - {"2001:c20:11::/44", "3758"}, - {"2408:8459:4a50::/37", "17816"}, - {"240a:a181::/32", "143035"}, - {"2a06:bcc0:9::/48", "203724"}, - {"2a09:a4c1::/32", "208861"}, - {"2a0a:4940:10::/48", "208972"}, - {"2408:8956:8c00::/40", "17622"}, - {"2a0a:e700::/32", "3292"}, - {"2001:1248:980f::/43", "11172"}, - {"2606:4700:81c0::/44", "13335"}, - {"2a0b:b600:3802::/47", "57758"}, - {"2001:253:135::/48", "142101"}, - {"2001:559:59a::/45", "33659"}, - {"2406:9b80::/32", "132585"}, - {"2a0b:680::/29", "43853"}, - {"2001:559:1ca::/48", "7922"}, - {"2620:110:7000::/44", "13880"}, - {"2804:6f1c::/32", "270639"}, - {"2a07:b8c3:5::/32", "14043"}, - {"2001:1a11:127::/44", "42298"}, - {"2804:18:840::/44", "10429"}, - {"2a07:7140::/29", "202907"}, - {"2a0c:9a40:1009::/48", "34927"}, - {"2001:559:c0eb::/48", "33287"}, - {"2407:c8c0::/32", "134026"}, - {"240a:a2ae::/32", "143336"}, - {"240a:a2b4::/32", "143342"}, - {"2607:f4b8::/32", "22438"}, - {"2804:14d:1885::/44", "28573"}, - {"2a00:1690::/32", "44123"}, - {"2607:f7c8:701::/32", "36221"}, - {"2a01:5041:400e::/48", "202196"}, - {"2a01:6d80:2000::/36", "15683"}, - {"2001:67c:2660::/48", "205016"}, - {"2a03:9700::/32", "20847"}, - {"2400:7fc0:4000::/40", "55960"}, - {"2401:d800:f980::/42", "7552"}, - {"2408:8256:399c::/48", "17816"}, - {"240a:a1bc::/32", "143094"}, - {"2800:5f0:806::/44", "22724"}, - {"2402:800:7c20::/41", "7552"}, - {"2404:63c0:20::/44", "131645"}, - {"2406:3003:2050::/44", "4657"}, - {"2408:840c:6800::/40", "17621"}, - {"2a0b:b82::/44", "7489"}, - {"2001:559:c0b7::/48", "7015"}, - {"2001:1b70:82b0::/46", "158"}, - {"2401:cf80:6109::/40", "55303"}, - {"240a:aba9::/32", "145635"}, - {"2801:80:3810::/48", "52885"}, - {"2a09:bac0:181::/48", "13335"}, - {"2001:3c8:130a::/48", "17827"}, - {"2001:678:2c8::/48", "47121"}, - {"2600:1409:5001::/36", "20940"}, - {"2001:559:c305::/48", "33657"}, - {"2404:f780:4::/47", "136557"}, - {"2408:8459:52c0::/37", "17816"}, - {"2600:6c3b:486::/43", "20115"}, - {"2603:f050::/26", "397165"}, - {"2804:30b8:bd::/32", "28154"}, - {"2001:559:8119::/48", "7922"}, - {"2001:559:8254::/48", "33651"}, - {"240e:980:2100::/40", "4811"}, - {"2804:10bc::/37", "263646"}, - {"2001:559:502::/47", "7016"}, - {"2001:dc9::/32", "24252"}, - {"2001:44b8:3a::/48", "7545"}, - {"240a:a01e::/32", "142680"}, - {"240e:3b9:1400::/38", "134773"}, - {"2600:3007:1400::/32", "13649"}, - {"2a02:26f7:d849::/46", "20940"}, - {"2001:4168::/32", "31424"}, - {"2408:8256:3d60::/44", "17623"}, - {"2001:250:20d::/46", "23910"}, - {"2001:43f8:790::/48", "6968"}, - {"2401:4900:22f0::/39", "45609"}, - {"2408:8956:4b00::/40", "17816"}, - {"2409:8c15:2000::/40", "9808"}, - {"2606:4dc0:4::/32", "399077"}, - {"2a02:26f7:c944::/48", "36183"}, - {"2001:4408:1090::/39", "4758"}, - {"2401:d1c0:8000::/33", "136994"}, - {"240a:a921::/32", "144987"}, - {"2620:4:c000::/48", "20126"}, - {"2804:320c::/32", "265053"}, - {"2a01:c9c0:801c::/48", "2285"}, - {"2a02:26f7:f685::/46", "20940"}, - {"2c0f:f010:8001::/33", "37236"}, - {"2405:ec0:2000::/36", "132768"}, - {"2409:8d1a::/32", "132525"}, - {"240a:a8eb::/32", "144933"}, - {"2a0a:eb00::/29", "212238"}, - {"2001:559:8236::/48", "7922"}, - {"240a:a509::/32", "143939"}, - {"2600:370f:3084::/46", "32261"}, - {"2600:8807:ab22::/40", "22773"}, - {"2607:f570::/32", "13326"}, - {"2a02:1758::/29", "39781"}, - {"240a:abde::/32", "145688"}, - {"2600::/47", "1239"}, - {"2a00:1700::/32", "15672"}, - {"2a07:9f00::/29", "204044"}, - {"2a0c:4280::/32", "20866"}, - {"2a12:d980::/32", "49490"}, - {"2408:84f3:9210::/42", "134543"}, - {"240e:698:2b00::/33", "4134"}, - {"2a02:e980:10c::/46", "19551"}, - {"2001:559:826e::/47", "7922"}, - {"2001:559:c440::/48", "20214"}, - {"2001:18b8:6::/44", "29789"}, - {"2a0a:700::/29", "49720"}, - {"2a0f:9400:7350::/48", "14570"}, - {"2001:559:c10a::/48", "21508"}, - {"2403:80::/32", "134623"}, - {"2405:6e00:22ef::/43", "133612"}, - {"2408:8459:cb10::/42", "17623"}, - {"2620:34:c000::/48", "32031"}, - {"2804:7794::/32", "271187"}, - {"2a0b:81c0::/29", "206893"}, - {"2001:4830:c0c0::/44", "3384"}, - {"2406:6e00:f048::/48", "10310"}, - {"240a:aecd::/32", "146439"}, - {"240e:438:7c20::/43", "140647"}, - {"2606:3000:e000::/35", "30295"}, - {"2607:f7a0:b::/43", "46562"}, - {"2804:7b08::/32", "271407"}, - {"2001:559:70f::/48", "33491"}, - {"240a:a6da::/32", "144404"}, - {"2606:f900:9002::/36", "812"}, - {"2804:2360::/32", "264158"}, - {"2001:67c:2b6c::/48", "3301"}, - {"2001:df3:7e00::/48", "135555"}, - {"2403:5f40:1::/48", "58869"}, - {"240a:a1cd::/32", "143111"}, - {"2607:fc48:808::/48", "40009"}, - {"2800:160:10cf::/43", "14259"}, - {"2001:1248:5ac5::/43", "11172"}, - {"2804:0:1c01::/33", "2716"}, - {"2804:984::/33", "263097"}, - {"2a02:26f7:ee8c::/48", "36183"}, - {"2401:d800:9fd0::/42", "7552"}, - {"2409:8074:30f2::/44", "9808"}, - {"2a01:c50f:f3c0::/37", "12479"}, - {"2a02:26f7:cd56::/42", "20940"}, - {"2a0e:fd45:40f2::/48", "41108"}, - {"2a10:5b00::/29", "208256"}, - {"2404:cc00:999a::/33", "24441"}, - {"240a:a06d::/32", "142759"}, - {"240a:ab38::/32", "145522"}, - {"2800:484:8a00::/40", "14080"}, - {"2806:2f0:40c3::/43", "17072"}, - {"2a10:c941:0:2::/43", "35277"}, - {"2001:559:1f8::/47", "33659"}, - {"2001:559:81ad::/46", "7922"}, - {"2806:370:8060::/40", "28403"}, - {"2001:559:80e6::/48", "33657"}, - {"2001:579:b984::/37", "22773"}, - {"2400:cd00:1044::/48", "138911"}, - {"2405:9800:d002::/48", "45430"}, - {"2800:3d0::/32", "2688"}, - {"2804:31d4::/32", "53139"}, - {"2806:2f0:9323::/41", "17072"}, - {"2a03:1ac0:2e92::/48", "12768"}, - {"2c0f:f7a8:8150::/48", "4134"}, - {"2600:1009:f010::/40", "22394"}, - {"2600:6c38:63e::/47", "20115"}, - {"2606:6080:2004::/46", "32489"}, - {"2a00:c5e0::/32", "198399"}, - {"2a02:26f7:d480::/48", "36183"}, - {"2a0a:7e40::/46", "206056"}, - {"2a0b:1306:6::/47", "198018"}, - {"2001:678:b48::/48", "208008"}, - {"2409:8752:1100::/31", "56047"}, - {"2804:2bf4::/32", "262785"}, - {"2804:4a78::/32", "267242"}, - {"2a0f:68c0::/29", "60781"}, - {"2a02:2870::/33", "25459"}, - {"2a0a:5580:1002::/47", "208687"}, - {"2a0a:6040:407f::/32", "61138"}, - {"2001:898::/29", "15879"}, - {"2001:9b8:3::/32", "6774"}, - {"2408:840c:ad00::/40", "17621"}, - {"2a02:26f7:e2c5::/46", "20940"}, - {"2a0f:607:1054::/48", "212360"}, - {"2c0f:f668::/32", "37519"}, - {"2401:4900:47d0::/44", "45609"}, - {"2401:d800:2402::/40", "7552"}, - {"2600:6000:f003::/48", "11351"}, - {"2606:73c0::/32", "15169"}, - {"2607:3500:f00::/40", "11228"}, - {"2804:6c20::/32", "270447"}, - {"2804:7944::/32", "271295"}, - {"2001:559:80b8::/48", "33659"}, - {"2602:fea5::/36", "35859"}, - {"2603:90f5:b::/48", "11426"}, - {"2804:a4::/32", "53089"}, - {"2a07:3404::/32", "396931"}, - {"2001:559:311::/48", "33491"}, - {"2a06:a000:160::/44", "208046"}, - {"2a0a:5340:ffff::/48", "3320"}, - {"2a0d:5040::/31", "8315"}, - {"2804:21f8:500::/32", "262272"}, - {"2806:2f0:81e0::/38", "17072"}, - {"2a0f:1300::/29", "57675"}, - {"240a:a02b::/32", "142693"}, - {"240a:a987::/32", "145089"}, - {"2600:809:424::/48", "397601"}, - {"2a00:60c0::/32", "34461"}, - {"2a03:ef42::/33", "57218"}, - {"2a0d:7c0::/29", "29262"}, - {"2403:4700::/47", "23728"}, - {"2406:a900:144::/47", "136409"}, - {"2408:8459:6e50::/35", "17816"}, - {"240a:a478::/32", "143794"}, - {"2400:cb00:302::/48", "395747"}, - {"2806:20d:3603::/40", "32098"}, - {"2a06:8380::/29", "212526"}, - {"2001:ac8:36::/44", "9009"}, - {"240a:ae68::/32", "146338"}, - {"2a02:26f7:de0d::/42", "20940"}, - {"2001:559:c3ac::/48", "33287"}, - {"2800:110::/44", "4270"}, - {"2a01:56c1:10::/44", "198864"}, - {"2a02:26f7:15::/48", "20940"}, - {"2a0e:1700::/31", "204135"}, - {"2a0f:b104::/48", "213110"}, - {"2001:e60:a330::/40", "4766"}, - {"2600:1407:5::/48", "18717"}, - {"2800:160:157a::/40", "14259"}, - {"2a0b:3c40:24::/48", "204402"}, - {"2804:c48:e300::/36", "52687"}, - {"2804:3f10::/33", "262566"}, - {"2a02:2e02:8c80::/43", "12479"}, - {"2804:508:ff20::/40", "52999"}, - {"2a07:3502:1040::/48", "38915"}, - {"2001:559:34b::/48", "7922"}, - {"240a:a38b::/32", "143557"}, - {"2600:300::/25", "7018"}, - {"2602:fde4::/36", "22058"}, - {"2800:bf0:2ac0::/46", "52257"}, - {"2a02:9a0::/32", "48514"}, - {"2a02:26f7:f08c::/48", "36183"}, - {"2001:559:83d1::/48", "7922"}, - {"2001:559:c2ef::/48", "7016"}, - {"2001:1a11:12::/44", "8781"}, - {"240e:438:1a40::/37", "4134"}, - {"2a02:26f7:9::/48", "20940"}, - {"2a02:26f7:74::/48", "36183"}, - {"2a02:5f83::/32", "39811"}, - {"2001:559:80b9::/46", "33287"}, - {"2806:2f0:71c1::/46", "17072"}, - {"2a05:a3c0::/29", "201127"}, - {"2a10:de40::/29", "34907"}, - {"2602:fcc2::/36", "399289"}, - {"2804:5cbc:fa00::/42", "52795"}, - {"2a02:e00:ffe8::/48", "43289"}, - {"2001:579:91b0::/41", "22773"}, - {"2401:4900:3670::/40", "45609"}, - {"2401:ec00::/32", "24349"}, - {"2600:9000:f110::/48", "16509"}, - {"2620:135:f000::/44", "393468"}, - {"2803:3040::/32", "27660"}, - {"2a0d:5600:66::/44", "9009"}, - {"2408:8956:b100::/40", "17816"}, - {"2604:2d80:c02c::/46", "30036"}, - {"2a12:4946:1600::/48", "211398"}, - {"2001:250:6413::/45", "24367"}, - {"2001:1998:4000::/32", "7843"}, - {"2404:f4c0:8867::/44", "210384"}, - {"2407:500:502::/47", "58940"}, - {"240a:afd4::/32", "146702"}, - {"2610:1d0::/32", "40068"}, - {"2a02:9b0:8005::/33", "35819"}, - {"2a05:abc0::/29", "43260"}, - {"2a0f:9c40::/29", "206983"}, - {"2001:559:8429::/48", "7015"}, - {"2001:918:ff5d::/48", "15398"}, - {"2804:2058::/32", "264487"}, - {"2806:370:7150::/40", "28403"}, - {"2001:550:220c::/46", "174"}, - {"2001:4878:8356::/48", "12222"}, - {"2409:8062:3900::/28", "9808"}, - {"2a00:d260::/29", "15600"}, - {"2a0f:2c80:1::/48", "25369"}, - {"2001:67c:16d0::/47", "44574"}, - {"2401:d800:d1f0::/38", "7552"}, - {"2404:7500::/32", "58655"}, - {"240a:a5bd::/32", "144119"}, - {"2620:78:8000::/48", "53280"}, - {"2804:45d8::/32", "266953"}, - {"2401:fbc0::/32", "134922"}, - {"2409:8c54:1040::/43", "9808"}, - {"240a:adf0::/32", "146218"}, - {"2a07:1a80::/48", "48767"}, - {"2a0e:aa07:f041::/46", "208993"}, - {"2001:559:8162::/48", "33491"}, - {"2804:2f30:fd00::/38", "53096"}, - {"2806:20d:1631::/45", "32098"}, - {"2a02:26f7:eb08::/48", "36183"}, - {"2a06:9681::/32", "203954"}, - {"2402:800::/35", "7552"}, - {"2606:7d80:1000::/33", "16399"}, - {"2806:2f0:2140::/48", "17072"}, - {"2a09:900:100::/38", "15576"}, - {"240a:add2::/32", "146188"}, - {"2801:80:300::/48", "53039"}, - {"2a00:cb60:1::/48", "47488"}, - {"2a02:2208:2::/29", "6697"}, - {"2a02:2d20::/32", "202096"}, - {"2a0d:c0c0:4e1::/48", "59439"}, - {"2604:af80:1c48::/34", "18859"}, - {"2a00:af60::/32", "199364"}, - {"2a02:26f7:96::/48", "36183"}, - {"2a11:f100::/29", "400522"}, - {"2001:559:8221::/48", "7922"}, - {"240a:a242::/32", "143228"}, - {"2602:fc33::/36", "40281"}, - {"2804:7f6:8000::/33", "18881"}, - {"2804:2e80::/32", "265349"}, - {"2a01:430::/43", "24971"}, - {"2a10:2c80::/32", "58010"}, - {"2001:250:6c44::/38", "23910"}, - {"2001:559:c3ee::/48", "33287"}, - {"2001:42a0::/32", "6083"}, - {"2400:7400:38::/48", "38044"}, - {"2400:a040::/44", "136237"}, - {"240e:109:8042::/48", "58466"}, - {"2600:1900:4000::/39", "396982"}, - {"2602:fcb5::/36", "51999"}, - {"2603:f8f8::/23", "397165"}, - {"2a00:1288:81::/46", "10310"}, - {"2408:8956:9900::/40", "17816"}, - {"2402:800:531d::/42", "7552"}, - {"2407:4940::/48", "140770"}, - {"240a:a041::/32", "142715"}, - {"2804:3b74::/32", "266150"}, - {"2804:5abc::/32", "268792"}, - {"2402:aa40::/32", "137330"}, - {"2603:fb50::/26", "397165"}, - {"2a02:ba8::/32", "15894"}, - {"2400:fc00:4110::/38", "45773"}, - {"2a02:26f7:c144::/48", "36183"}, - {"2a0e:97c0:1b0::/46", "211840"}, - {"2001:559:779::/48", "22909"}, - {"2001:918:ff75::/48", "3303"}, - {"2401:d800:9720::/41", "7552"}, - {"2408:8956:5500::/40", "17816"}, - {"2409:e:e3::/31", "55824"}, - {"240e:e:c000::/37", "58540"}, - {"2a02:26f7:10e::/48", "36183"}, - {"240a:a167::/32", "143009"}, - {"240a:ae59::/32", "146323"}, - {"2610:160:12::/32", "27325"}, - {"2605:9080::/32", "54858"}, - {"2a02:26f7:bd89::/46", "20940"}, - {"2a0e:b107:b8f::/48", "212995"}, - {"2001:4818:3000::/36", "40341"}, - {"2804:2d2c:fc00::/38", "52971"}, - {"2804:4458::/32", "267627"}, - {"2804:55c4::/32", "267955"}, - {"2a02:26f7:ef84::/48", "36183"}, - {"2001:559:47e::/48", "7725"}, - {"2001:1260:10::/39", "13591"}, - {"2001:b000:594::/48", "131660"}, - {"240a:a071::/32", "142763"}, - {"2801:1f0:404a::/45", "3573"}, - {"2a02:26f7:ec8c::/48", "36183"}, - {"2405:6e00:620::/43", "18291"}, - {"2408:8456:cf00::/42", "17622"}, - {"2606:ae00:cc31::/41", "7287"}, - {"2620:1e8:3::/45", "29802"}, - {"2a02:2e02:13c0::/37", "12479"}, - {"2a07:4a40::/29", "57795"}, - {"2600:1014:a000::/43", "6167"}, - {"2600:140b:201::/37", "20940"}, - {"2620:5e:e000::/48", "396088"}, - {"2804:2f8c::/32", "264898"}, - {"2806:2f0:61e1::/46", "17072"}, - {"2001:df6:1300::/48", "138117"}, - {"2400:b200:4104::/32", "37963"}, - {"2409:8c34:1000::/33", "9808"}, - {"240e:108:11e2::/48", "4816"}, - {"2001:16b8:db00::/34", "8881"}, - {"2409:804f:3100::/36", "9808"}, - {"240a:a199::/32", "143059"}, - {"2607:b400:a03::/32", "40220"}, - {"2620:0:b60::/48", "17204"}, - {"2804:69b0:50::/42", "270285"}, - {"2a09:6280:1::/48", "56603"}, - {"2620:11c:f004::/48", "393667"}, - {"2800:340::/32", "5692"}, - {"2802::/43", "18747"}, - {"2803:6600::/31", "28075"}, - {"2804:9d4:3001::/33", "262996"}, - {"2a0e:b107:120f::/48", "142130"}, - {"2001:559:7e0::/48", "7922"}, - {"2001:67c:1850::/48", "16086"}, - {"2405:1c0:6231::/45", "55303"}, - {"2407:9800::/30", "10139"}, - {"2605:ac80::/32", "33481"}, - {"2001:1978:801::/48", "21775"}, - {"2803:8d80:5002::/32", "11664"}, - {"2a05:15c0::/29", "201600"}, - {"2402:800:33d3::/44", "7552"}, - {"2804:58f0::/32", "268159"}, - {"2804:7818::/32", "271220"}, - {"2a02:26f7:f388::/48", "36183"}, - {"2a07:ad80::/29", "46261"}, - {"2001:250:101f::/48", "24364"}, - {"2408:80ea:7600::/41", "17816"}, - {"2408:8459:de50::/34", "17816"}, - {"240a:a1b6::/32", "143088"}, - {"240e:44d:6980::/41", "4134"}, - {"2804:3018::/32", "263020"}, - {"2a02:26f7:bf44::/48", "36183"}, - {"2001:49f0:d0ff::/48", "174"}, - {"2401:d800:d1b2::/41", "7552"}, - {"2402:800:613a::/41", "7552"}, - {"2408:8957:7000::/40", "17622"}, - {"2409:8a53:1100::/32", "56047"}, - {"240e:7b2::/36", "140313"}, - {"2804:3f64::/32", "265890"}, - {"2a0e:97c3:7fc::/48", "20473"}, - {"2001:559:80f6::/48", "7015"}, - {"2001:559:86dc::/47", "33651"}, - {"240a:a440::/32", "143738"}, - {"2600:1fa0:1020::/44", "16509"}, - {"2804:ae0:2b00::/37", "28352"}, - {"2804:184c::/39", "61928"}, - {"2800:1e0:c02::/39", "7195"}, - {"2a07:cb84::/32", "28878"}, - {"2a0e:97c7:d9::/45", "20473"}, - {"2001:7fb:fd02::/47", "12654"}, - {"2400:e2::/31", "4766"}, - {"240a:afeb::/32", "146725"}, - {"2806:230:2018::/48", "265594"}, - {"2400:1360:c000::/34", "147051"}, - {"2408:8459:ea30::/41", "17622"}, - {"2408:84f3:e040::/38", "17816"}, - {"2408:8957:5200::/40", "17622"}, - {"2409:8020:2902::/35", "56046"}, - {"2605:a401:80b8::/47", "33363"}, - {"2803:f080:8900::/43", "64120"}, - {"2a00:79e0:502::/47", "45566"}, - {"2a0e:afc0::/29", "207902"}, - {"2a0e:b107:b15::/48", "212580"}, - {"2400:9940:1003::/34", "136224"}, - {"2407:f700::/36", "132215"}, - {"2a02:26f0:1e00::/48", "34164"}, - {"2405:9f80::/32", "134743"}, - {"2804:3264::/32", "265075"}, - {"2a0c:e000::/31", "31054"}, - {"2001:b08:1a::/45", "3267"}, - {"2409:4052:1000::/34", "55836"}, - {"2804:5518::/32", "268689"}, - {"2806:213::/32", "33182"}, - {"2a02:26f7:c549::/42", "20940"}, - {"240e:3ba:1200::/39", "4134"}, - {"2a02:2698:402a::/47", "56377"}, - {"2001:559:393::/48", "33490"}, - {"2001:67c:644::/48", "58343"}, - {"2001:67c:708::/48", "50629"}, - {"240e:44d:7300::/42", "140345"}, - {"2a0c:e840::/29", "202701"}, - {"240a:a0f6::/32", "142896"}, - {"240a:ac97::/32", "145873"}, - {"2a02:2e0:3ff::/37", "12306"}, - {"2a03:a7a0:3::/32", "203316"}, - {"2401:df40:1::/48", "23734"}, - {"240a:acd2::/32", "145932"}, - {"2a02:26f7:cbc8::/48", "36183"}, - {"2a02:26f7:f608::/48", "36183"}, - {"2600:1000:b100::/41", "6167"}, - {"2a00:16f8:e::/48", "397942"}, - {"2a01:a7e0:1000::/36", "29422"}, - {"2001:1248:56da::/47", "11172"}, - {"240a:a159::/32", "142995"}, - {"240a:ab22::/32", "145500"}, - {"2607:b600::/46", "10397"}, - {"2a00:b5c0::/32", "57910"}, - {"2a02:af8::/32", "29550"}, - {"2a0d:b600::/29", "48642"}, - {"2001:470:2c::/46", "6939"}, - {"2600:1404:801::/35", "20940"}, - {"2a00:97c0::/32", "13243"}, - {"2a02:26f7:ec84::/48", "36183"}, - {"2a04:4e40:8210::/44", "54113"}, - {"2408:8459:f500::/40", "17623"}, - {"2800:ba0:26::/48", "263812"}, - {"2a01:b700::/32", "45011"}, - {"2607:fb58:d200::/47", "53933"}, - {"2800:530::/32", "52233"}, - {"2804:3f14::/32", "266638"}, - {"2a02:2e02:f60::/40", "12479"}, - {"240a:a1b4::/32", "143086"}, - {"2600:370f:7262::/45", "32261"}, - {"2a02:2ab8:130::/38", "702"}, - {"2600:1f1f::/36", "16509"}, - {"2a02:26f7:bac1::/46", "20940"}, - {"2001:579:e360::/40", "22773"}, - {"2408:400e:24::/32", "37963"}, - {"2605:3a00::/47", "22768"}, - {"2605:a900:4806::/47", "46887"}, - {"2001:468:365::/37", "11537"}, - {"240e:87c:c0::/38", "137692"}, - {"2804:5350::/45", "268576"}, - {"2a02:26f7:d101::/46", "20940"}, - {"2a06:5484::/30", "43754"}, - {"2001:1248:9932::/44", "11172"}, - {"2401:4900:4d20::/44", "45609"}, - {"2406:3001:22:a::/59", "4657"}, - {"2605:a404:105::/41", "33363"}, - {"2806:3aa::/32", "265627"}, - {"2001:559:c4a0::/48", "33287"}, - {"2804:3280::/32", "265082"}, - {"2a04:a147::/32", "198507"}, - {"2001:550:2800:101::/48", "174"}, - {"2a04:a8c0::/29", "33438"}, - {"2a04:ce00::/29", "21412"}, - {"2a05:6280:dead::/48", "201349"}, - {"2001:4d0:6318::/48", "10343"}, - {"2001:57a:8202::/35", "22773"}, - {"2803:cae0::/48", "270046"}, - {"2a00:1197::/32", "206364"}, - {"2a01:2e1:ffff:7::/28", "8374"}, - {"2a02:7340::/32", "44838"}, - {"2001:559:c31e::/48", "33287"}, - {"2a00:79e1:f0f::/43", "36384"}, - {"2a07:7800:3::/45", "48254"}, - {"2600:6c38:8ca::/45", "20115"}, - {"2800:160:1c71::/45", "14259"}, - {"2803:8960:105::/32", "269736"}, - {"2a04:4e42:401::/38", "54113"}, - {"2a10:1e00::/32", "208245"}, - {"2001:559:76c::/48", "7922"}, - {"2001:5a0:3904::/38", "6453"}, - {"2001:7b8:407::/29", "12859"}, - {"2409:8020:3052::/42", "56046"}, - {"2600:140f:200::/48", "9498"}, - {"2806:2f0:1063::/43", "17072"}, - {"2620:3f:a000::/48", "18696"}, - {"2806:2f0:71a3::/41", "17072"}, - {"2a02:cb80:2910::/48", "43766"}, - {"2a07:1fc0::/29", "42970"}, - {"2001:1248:5a91::/44", "11172"}, - {"2409:8714:8a00::/31", "56044"}, - {"240a:a647::/32", "144257"}, - {"2602:feda:d51::/48", "141712"}, - {"2804:822c::/32", "272503"}, - {"2a02:26f7:ec80::/48", "36183"}, - {"2001:250:7005::/48", "24370"}, - {"2001:1248:88b2::/41", "11172"}, - {"2408:8256:398::/37", "17622"}, - {"2603:f8f0::/29", "40676"}, - {"2607:fc28:7000::/32", "22911"}, - {"2800:bf0:2426::/43", "27947"}, - {"2a02:26f7:d158::/47", "36183"}, - {"2a0b:6300::/29", "33983"}, - {"2a0c:a480::/29", "47777"}, - {"2001:67c:1bec::/48", "59624"}, - {"2600:100a:b000::/42", "6167"}, - {"2600:370f:4060::/43", "32261"}, - {"2600:6c10:613::/41", "20115"}, - {"2a10:5c40::/29", "59441"}, - {"2001:c20:c824::/46", "9255"}, - {"2400:addc::/39", "9541"}, - {"2607:fd28:a010::/47", "3725"}, - {"2a00:f10:141::/48", "29290"}, - {"2a0a:d6c0:2035::/48", "203564"}, - {"2a00:7b00:1a::/32", "12338"}, - {"2a02:2280::/29", "12924"}, - {"2a0d:5600:70::/46", "9009"}, - {"2400:8500:d29d::/48", "7506"}, - {"2606:2800:6070::/46", "15133"}, - {"2607:fb10:2025::/43", "2906"}, - {"2806:2f0:71c3::/42", "17072"}, - {"2a01:81e0:3::/32", "174"}, - {"2a03:522::/32", "201419"}, - {"2a03:2887:ff35::/48", "63293"}, - {"240e:16:c801::/31", "4134"}, - {"240e:ff:c006::/48", "140308"}, - {"2606:a240::/32", "400354"}, - {"2806:1018:cbff:100::/48", "8151"}, - {"2402:f700::/34", "23907"}, - {"2607:d400::/46", "22364"}, - {"2803:6900:520::/48", "52423"}, - {"2806:2f0:60e3::/39", "17072"}, - {"240a:a0c6::/32", "142848"}, - {"2604:85c0:a::/32", "16524"}, - {"2620:11b:1000::/40", "32274"}, - {"2804:6f28::/32", "270642"}, - {"2a07:a343:94d0::/44", "9009"}, - {"2402:d600::/32", "17948"}, - {"2404:4e00:104::/47", "32787"}, - {"240a:a6c1::/32", "144379"}, - {"2607:fdf8:300::/40", "20284"}, - {"2804:145c:c410::/39", "263327"}, - {"2001:559:439::/48", "33287"}, - {"2001:df0:a300::/48", "17990"}, - {"2605:3380:4309::/48", "12025"}, - {"2607:fd60:c938::/48", "6188"}, - {"2a00:4802:5000::/44", "13124"}, - {"2a02:26f7:c3e0::/48", "36183"}, - {"2a07:4300:1609::/48", "209622"}, - {"2a0d:5600:20::/44", "9009"}, - {"2a10:e800:3::/48", "204170"}, - {"2405:6e00:2f2::/44", "133612"}, - {"2a02:26f7:d24c::/48", "36183"}, - {"2a04:a240::/32", "61351"}, - {"2a0a:90c0:1002::/43", "205080"}, - {"2402:1b40:1002::/48", "7628"}, - {"240a:a00c::/32", "142662"}, - {"240e:a7:7fd8::/46", "140516"}, - {"2804:32b8::/32", "265095"}, - {"2a0a:eac2::/48", "60330"}, - {"240a:a9cf::/32", "145161"}, - {"240a:aae3::/32", "145437"}, - {"2804:520::/47", "262496"}, - {"2a02:750:9::/43", "42708"}, - {"2001:500:13f::/48", "396574"}, - {"2001:559:7a7::/48", "21508"}, - {"2402:800:99b7::/41", "7552"}, - {"2404:3d00:40f2::/45", "3573"}, - {"2a0f:85c1:80::/48", "209735"}, - {"2001:559:710::/48", "33657"}, - {"2400:cb00:445::/44", "13335"}, - {"2404:e680:1121::/41", "18409"}, - {"2405:7f00:9d00::/38", "133414"}, - {"2402:fbc0::/44", "134014"}, - {"2801:80:f80::/44", "264261"}, - {"2804:6248::/32", "269288"}, - {"2607:f358:c::/43", "18779"}, - {"2a06:f901:8000::/36", "8849"}, - {"2001:4b98:abcc::/33", "29169"}, - {"2401:3bc0:7::/44", "137409"}, - {"2602:fff6:1::/46", "8100"}, - {"2607:6b80:36::/48", "9009"}, - {"2610:b0:4032::/45", "3573"}, - {"2a02:6f80::/29", "8851"}, - {"2408:8957:8600::/40", "17622"}, - {"240e:980:9700::/40", "4134"}, - {"2607:8a00::/32", "7212"}, - {"2800:160:142a::/45", "14259"}, - {"2806:2f0:6161::/46", "17072"}, - {"2a04:1b00:6::/47", "61007"}, - {"2a04:4e40:9e00::/48", "54113"}, - {"240a:a5c0::/32", "144122"}, - {"2602:fcf7::/36", "398942"}, - {"2806:327::/32", "265573"}, - {"2a02:ff0:3300::/40", "12735"}, - {"2a06:4480::/29", "200430"}, - {"2a0d:b700::/48", "210984"}, - {"2a0e:fa40::/47", "56970"}, - {"2001:678:f64::/48", "16509"}, - {"2403:b080::/32", "17964"}, - {"240a:a8c8::/32", "144898"}, - {"2603:c001:2c10::/38", "31898"}, - {"2a0f:ab40::/32", "207797"}, - {"2001:470:e6::/48", "47787"}, - {"240a:a20a::/32", "143172"}, - {"240e:44d:6200::/41", "140345"}, - {"2600:6c38:70c::/46", "20115"}, - {"2602:800::/44", "397614"}, - {"2a01:5043:2003::/48", "202196"}, - {"240e:983:1807::/44", "4134"}, - {"2600:6c10:11::/44", "20115"}, - {"2605:6440:1000::/44", "396356"}, - {"2a02:16d0::/32", "49855"}, - {"2a03:2880:f144::/47", "32934"}, - {"2401:d800:f230::/41", "7552"}, - {"2408:8456:2240::/39", "17816"}, - {"2804:5268:200::/32", "268516"}, - {"2804:6688::/32", "269566"}, - {"2a02:f406:ff50::/48", "328778"}, - {"2a0b:e42:1::/48", "205809"}, - {"240a:ad18::/32", "146002"}, - {"2604:6d00:2300::/48", "36223"}, - {"2400:5280:2800::/38", "63199"}, - {"2404:bf40:a581::/46", "139084"}, - {"2a02:26f7:d18d::/46", "20940"}, - {"2a02:888:47::/48", "47794"}, - {"2a02:26f7:e911::/46", "20940"}, - {"2a05:b304::/30", "60781"}, - {"2a09:7c46::/32", "200019"}, - {"2a0b:f380:3e8::/48", "49544"}, - {"2402:4440:a001::/36", "24423"}, - {"2406:e000:301::/42", "23655"}, - {"240a:ae8e::/32", "146376"}, - {"2620:13::/48", "11647"}, - {"2a05:b2c2::/31", "12414"}, - {"2a10:4d40::/29", "49409"}, - {"2001:3c8:2708::/36", "4621"}, - {"2001:67c:2f70::/48", "3303"}, - {"2001:4878:a356::/48", "12222"}, - {"2403:dc00::/32", "45926"}, - {"2607:fb10:7036::/44", "2906"}, - {"2a03:567::/32", "48314"}, - {"2a03:a920::/32", "211417"}, - {"240d:c010:50::/48", "132591"}, - {"2a00:5ee0::/34", "44925"}, - {"2a0b:c080::/29", "197659"}, - {"2a10:ccc2:12::/44", "35619"}, - {"2001:559:772::/48", "7016"}, - {"2001:df3:6500::/48", "55379"}, - {"2405:7f00:9320::/37", "133414"}, - {"240a:af77::/32", "146609"}, - {"2604:280::/32", "6653"}, - {"2605:9fc0::/32", "396238"}, - {"2a0e:aa07:f088::/48", "211323"}, - {"2801:80:150::/48", "28261"}, - {"2806:2f0:3823::/33", "17072"}, - {"2001:67c:187c::/48", "41496"}, - {"2404:bf40:8380::/48", "7545"}, - {"2600:2c00::/34", "7349"}, - {"2620:153:81::/36", "6498"}, - {"2a02:2ca7::/42", "210662"}, - {"2001:da8:700f::/48", "23910"}, - {"2620:111:1001::/48", "18469"}, - {"2a0e:b107:bb0::/44", "212934"}, - {"240a:a35a::/32", "143508"}, - {"2804:164c:abcc::/33", "263280"}, - {"2804:6e90::/32", "270605"}, - {"2a12:3fc7:8000::/48", "39753"}, - {"2a07:3506:4c::/48", "29311"}, - {"2001:4070:8000::/33", "12831"}, - {"2804:1ae0:3::/32", "61696"}, - {"2a03:2500::/32", "59752"}, - {"2a0f:3e01::/32", "210625"}, - {"2a11:f780::/29", "204790"}, - {"2001:44b8:4068::/48", "7545"}, - {"2a0d:aa80::/29", "60380"}, - {"2c0f:faf0::/32", "11259"}, - {"2001:500:a9::/48", "394018"}, - {"2404:bf40:81c2::/38", "139084"}, - {"2409:8a55:2c00::/35", "9808"}, - {"240e:3b0:1200::/39", "4134"}, - {"2606:2800:4a24::/46", "15133"}, - {"2a00:4802:4e10::/44", "8717"}, - {"2a02:970:1029::/41", "44002"}, - {"2603:c0e8::/39", "1218"}, - {"2605:5c0:c100::/45", "28885"}, - {"2620:c1:8000::/48", "22931"}, - {"2a00:1d48::/32", "12571"}, - {"2a0b:11c0:4074::/47", "198682"}, - {"2001:480:35::/48", "668"}, - {"2001:559:b6::/47", "33287"}, - {"2001:559:47f::/48", "33489"}, - {"240a:ab96::/32", "145616"}, - {"2804:1d90::/32", "264378"}, - {"2804:4454::/32", "267625"}, - {"2804:47d4::/32", "267079"}, - {"2804:7340::/32", "270904"}, - {"2a00:55a0:ea00::/40", "9009"}, - {"2a02:26f7:cf81::/46", "20940"}, - {"2a02:2891:15::/48", "51185"}, - {"2001:559:c31c::/48", "33287"}, - {"2409:896a:4000::/39", "9808"}, - {"2600:6c38:e05::/44", "20115"}, - {"2a00:4960::/32", "42525"}, - {"2a02:26f7:6a::/48", "36183"}, - {"2a02:26f7:bd49::/46", "20940"}, - {"2a0d:4c40::/29", "61317"}, - {"2001:559:2e5::/46", "33651"}, - {"2401:2a80::/47", "58793"}, - {"2406:bb00::/29", "10010"}, - {"2804:2078::/32", "264492"}, - {"2a02:730:2::/35", "29278"}, - {"2a04:e00:104::/48", "39855"}, - {"2001:579:6240::/40", "22773"}, - {"2402:800:9347::/43", "7552"}, - {"2804:2634:2110::/32", "264332"}, - {"2804:2c88:8100::/33", "265225"}, - {"2a0f:b6c0::/29", "207788"}, - {"2001:559:99::/48", "33659"}, - {"240e:3b9:ac00::/35", "4134"}, - {"2620:134:6000::/46", "30031"}, - {"2a0d:3c46::/32", "62240"}, - {"2804:9f4::/32", "262530"}, - {"2804:1874::/32", "61934"}, - {"240a:a02d::/32", "142695"}, - {"2804:35fc::/32", "266319"}, - {"2a04:4e40:6020::/44", "54113"}, - {"2a0f:85c1:25::/48", "209507"}, - {"2001:1218:6038::/41", "278"}, - {"2409:8904:2ca0::/39", "24547"}, - {"2800:160:12eb::/39", "14259"}, - {"2804:18fc::/32", "61767"}, - {"2a02:9f8:9000::/44", "6900"}, - {"2a05:a882:10::/48", "51964"}, - {"2a0f:5140::/29", "209372"}, - {"2001:2000:3080:2345::/126", "29632"}, - {"2620:2a:c000::/48", "13977"}, - {"2a01:8840:b6::/44", "12041"}, - {"2a02:c647::/32", "61998"}, - {"2a04:4e40:f630::/44", "54113"}, - {"2a06:5040:20::/45", "6134"}, - {"2800:484:ec00::/40", "10620"}, - {"2806:263:a300::/37", "13999"}, - {"2400:9800:16::/44", "24203"}, - {"2606:b580::/32", "18897"}, - {"2610:e0:a040::/44", "3390"}, - {"2620:74:4::/48", "11840"}, - {"2804:4050::/32", "262856"}, - {"2a02:2738::/32", "51088"}, - {"2405:9000:204::/46", "7474"}, - {"240a:a34f::/32", "143497"}, - {"2806:105e:4::/44", "8151"}, - {"2001:559:c1b9::/48", "33652"}, - {"2600:1001:9110::/36", "22394"}, - {"2604:b300:ad04::/48", "174"}, - {"2605:6f40::/32", "207976"}, - {"2a02:26f7:e04d::/42", "20940"}, - {"2a03:2887:ff13::/48", "35819"}, - {"2c0f:f010::/32", "37236"}, - {"2c0f:fa90::/32", "37271"}, - {"2409:8958:c944::/43", "9808"}, - {"2a02:26f7:d4c8::/47", "36183"}, - {"2a04:e802::/43", "57976"}, - {"2a06:c180::/29", "44549"}, - {"2a11:fe80:fac0::/37", "209209"}, - {"2001:1260:10e::/43", "13591"}, - {"2402:800:6502::/36", "7552"}, - {"2408:8459:9050::/38", "17816"}, - {"2408:8459:a850::/38", "17816"}, - {"2600:1408:1a::/47", "20940"}, - {"2602:fe90:500::/40", "35913"}, - {"2804:151:61::/46", "10954"}, - {"2a00:1ec0:4000::/32", "8544"}, - {"2a02:2308:20::/48", "198485"}, - {"240a:a0c2::/32", "142844"}, - {"2a00:5940::/32", "207693"}, - {"2a07:7e00::/29", "34549"}, - {"2001:559:58c::/48", "33660"}, - {"2600:380:f1d4::/42", "20057"}, - {"2a03:9560::/29", "2590"}, - {"2a03:9c40:400::/48", "34655"}, - {"2001:da8:300f::/48", "23910"}, - {"2408:8956:9b00::/40", "17816"}, - {"240a:aa4e::/32", "145288"}, - {"240a:aa9f::/32", "145369"}, - {"2600:1002:9010::/40", "22394"}, - {"2409:8924:5b00::/37", "56046"}, - {"2409:894c::/30", "9808"}, - {"2605:edc0::/32", "398639"}, - {"2804:b18:8900::/37", "52941"}, - {"2001:48f8:f320::/44", "11055"}, - {"2804:744:102::/35", "262632"}, - {"2804:5578::/32", "262328"}, - {"2804:66e0:8000::/33", "269588"}, - {"2a02:2e02:21d0::/38", "12479"}, - {"2a04:eb00::/29", "21412"}, - {"2001:678:fc0::/48", "196944"}, - {"2803:9800:b4c1::/46", "11664"}, - {"2804:14b8::/32", "263346"}, - {"2001:559:5e9::/48", "33650"}, - {"2001:67c:2318::/48", "57057"}, - {"2406:9dc0:10::/44", "207268"}, - {"2804:4b88::/32", "267312"}, - {"2a00:4e00::/33", "15368"}, - {"2a02:26f7:c411::/45", "20940"}, - {"2001:559:c3d3::/48", "33660"}, - {"240a:a5d2::/32", "144140"}, - {"2a01:8d0::/32", "30722"}, - {"2a05:4200:7::/48", "21534"}, - {"2001:559:1e4::/48", "33651"}, - {"2402:d2c0::/46", "136897"}, - {"2408:8456:8240::/39", "17816"}, - {"2603:c001:1c10::/34", "31898"}, - {"2804:4eac::/32", "268276"}, - {"2001:67c:20b0::/48", "49342"}, - {"2a07:22c1:36::/48", "211244"}, - {"2001:1b70:82c0::/48", "158"}, - {"2401:f8c0::/32", "58895"}, - {"2402:8100:3929::/43", "55644"}, - {"2804:5894::/32", "268137"}, - {"2a02:26f7:d681::/46", "20940"}, - {"2001:559:820f::/48", "33659"}, - {"2402:800:63ff::/48", "7552"}, - {"2409:804c:2a::/43", "9808"}, - {"240a:ac68::/32", "145826"}, - {"2606:5b80::/34", "22612"}, - {"2804:63a0::/32", "269373"}, - {"2806:2f0:10a2::/48", "22884"}, - {"2001:1998:3101::/36", "3456"}, - {"2803:1a00:4113::/35", "262186"}, - {"2600:1406:dc01::/38", "20940"}, - {"2a02:cb81:1000::/45", "43766"}, - {"2a09:407:b000::/36", "210625"}, - {"2001:da8:24c::/48", "24348"}, - {"2001:1a68:2f::/43", "15694"}, - {"2404:8d01::/32", "10089"}, - {"2409:8c44:1b01::/28", "24445"}, - {"2600:1408:4000::/48", "35994"}, - {"2600:1fa0:c040::/44", "16509"}, - {"2600:6c38:245::/43", "20115"}, - {"2409:8069:2b06::/47", "9808"}, - {"240a:a147::/32", "142977"}, - {"2603:90f5:9::/46", "20115"}, - {"2605:9d80:9071::/48", "4809"}, - {"2804:49c:4205::/48", "7162"}, - {"2804:10f8::/32", "52783"}, - {"2804:2cc8::/32", "265243"}, - {"2a02:ee80:424f::/48", "3573"}, - {"2001:df6:6480::/48", "142037"}, - {"2408:8256:3086::/48", "17816"}, - {"2605:9100::/32", "20295"}, - {"2803:6de0::/32", "64126"}, - {"2804:2484:8001::/45", "28258"}, - {"2c0f:fed8::/32", "37277"}, - {"240e:108::/43", "58519"}, - {"2400:4a60::/32", "149248"}, - {"2405:b000:600::/36", "6262"}, - {"2603:c0fa:8000::/35", "20054"}, - {"2606:4700:80f0::/44", "13335"}, - {"2803:af80::/35", "263732"}, - {"2804:1510::/32", "262327"}, - {"2a02:26f7:c109::/42", "20940"}, - {"2001:559:83e7::/48", "33659"}, - {"2401:e280:1000::/36", "133114"}, - {"240a:aa0d::/32", "145223"}, - {"240a:ab73::/32", "145581"}, - {"240e:44d:1c00::/41", "140345"}, - {"2804:145c:8030::/41", "263327"}, - {"2804:5da4::/32", "268984"}, - {"2a05:7e84::/30", "50009"}, - {"2600:1f01:4860::/47", "16509"}, - {"2804:62d0::/32", "269320"}, - {"2001:1248:9a3b::/45", "11172"}, - {"2405:a000:13::/48", "55844"}, - {"2804:2bd4::/32", "265178"}, - {"2a0a:340::/40", "48043"}, - {"240a:a85b::/32", "144789"}, - {"2607:fcd0:bbc0::/33", "8100"}, - {"2804:4a88::/32", "267246"}, - {"2806:230:2027::/48", "11888"}, - {"2a02:db80::/29", "48720"}, - {"2001:559:5d8::/48", "33660"}, - {"2400:7400:39::/48", "23736"}, - {"240e:18:50::/48", "4811"}, - {"2804:13d0::/35", "263297"}, - {"2001:559:850b::/48", "7015"}, - {"2a02:26f7:9b::/48", "20940"}, - {"2a03:2880:f26e::/47", "32934"}, - {"2a05:fb44::/32", "59504"}, - {"2001:67c:21f0::/48", "52191"}, - {"2402:b7c0::/32", "63774"}, - {"2404:b0:6000::/32", "4750"}, - {"2610:a1:1074::/48", "397226"}, - {"2402:6880:2000::/48", "63989"}, - {"2409:802f:2c07::/32", "56041"}, - {"2607:f5d8::/46", "11096"}, - {"2804:e0c:180::/48", "28176"}, - {"2404:bf40:ea00::/48", "2764"}, - {"2a0a:d180::/36", "206652"}, - {"2801:16:1000::/48", "264618"}, - {"2001:978:1f00::/48", "43858"}, - {"2402:800:5763::/43", "7552"}, - {"2804:5828::/32", "268110"}, - {"2a00:11c0:66::/44", "42473"}, - {"2a09:ca00::/48", "34534"}, - {"2a0e:b107:770::/48", "213105"}, - {"2001:559:240::/48", "33659"}, - {"2001:fd8:2213::/44", "132199"}, - {"2606:2800:400b::/48", "14153"}, - {"2804:498c::/32", "267190"}, - {"2a02:26f7:c104::/48", "36183"}, - {"2404:b300:11::/46", "131207"}, - {"2804:2e74::/32", "265347"}, - {"2405:cdc0::/32", "131642"}, - {"2406:1840::/32", "140641"}, - {"240a:ab2e::/32", "145512"}, - {"2607:5800::/32", "10320"}, - {"2a01:c9c0:8014::/48", "2285"}, - {"2a02:26f7:b995::/46", "20940"}, - {"2a05:ccc0::/29", "209288"}, - {"2001:579:9104::/40", "22773"}, - {"2401:d800:fb60::/40", "7552"}, - {"2402:800:32d3::/44", "7552"}, - {"2404:ba00:8::/46", "17665"}, - {"2408:8459:5e50::/34", "17816"}, - {"2620:0:2840::/48", "16813"}, - {"2a01:8a40::/32", "8823"}, - {"240e:1:7100::/40", "137698"}, - {"2600:1419:1801::/38", "20940"}, - {"2804:359c:6000::/35", "266296"}, - {"2806:2f0:33c3::/42", "17072"}, - {"2001:44b8:1069::/34", "4739"}, - {"2401:7641::/32", "63778"}, - {"2409:8904:5e70::/40", "24547"}, - {"2620:11:60::/47", "3486"}, - {"2804:4e50::/32", "268253"}, - {"2804:7064::/32", "270724"}, - {"2a05:2a80:2::/29", "200567"}, - {"2001:678:e8c::/48", "212518"}, - {"2001:df0:dc::/48", "38590"}, - {"2407:3e00:4000::/48", "9255"}, - {"2800:550::/45", "7004"}, - {"2a02:2e02:f30::/41", "12479"}, - {"2a06:57c0::/29", "8888"}, - {"2001:388:3049::/43", "7575"}, - {"2001:559:8326::/48", "7725"}, - {"2600:1405:801::/35", "20940"}, - {"2604:6b80::/32", "47020"}, - {"2620:13:a000::/48", "395651"}, - {"2804:14c:7d00::/40", "28573"}, - {"240e:250:300::/40", "141157"}, - {"2804:5d24::/32", "268953"}, - {"2a02:26f7:e401::/46", "20940"}, - {"2001:520:1022::/48", "8103"}, - {"2001:559:248::/48", "33668"}, - {"2001:559:857d::/48", "33651"}, - {"2001:579:110c::/42", "22773"}, - {"2001:1230:103::/32", "13579"}, - {"2604:d600:1526::/44", "32098"}, - {"2620:1d5:c03::/40", "14773"}, - {"2a0c:f7c0::/29", "200374"}, - {"2400:fc00:8040::/39", "45773"}, - {"2408:8459:5c10::/42", "17623"}, - {"240a:ad47::/32", "146049"}, - {"2a01:620:4::/44", "12389"}, - {"2a03:d500::/32", "35754"}, - {"2401:ccc0::/32", "137236"}, - {"2408:8620::/31", "4837"}, - {"2a0b:cb00::/29", "200561"}, - {"2001:559:c3ef::/48", "7922"}, - {"2403:a200::/32", "17428"}, - {"2600:1008:b0f0::/44", "22394"}, - {"2606:4540::/32", "399571"}, - {"2620:122:a000::/40", "394485"}, - {"2605:8900:1000::/36", "3800"}, - {"2a02:26f7:c0c0::/48", "36183"}, - {"2a02:26f7:d804::/48", "36183"}, - {"2a0f:9400:772f::/48", "53356"}, - {"2401:580::/32", "38200"}, - {"2602:fef4:200::/48", "54721"}, - {"2800:160:13a3::/41", "14259"}, - {"2a00:fd8::/32", "22351"}, - {"2a00:d700::/32", "56438"}, - {"2a02:a98::/32", "42017"}, - {"2a0e:8f02:20f7::/44", "212008"}, - {"2001:408:c001::/34", "14793"}, - {"2a01:5b0:31::/32", "8391"}, - {"2a02:2af8:405::/44", "702"}, - {"2001:559:713::/48", "7015"}, - {"2407:d40:10::/32", "139009"}, - {"240e:a7:7fc9::/46", "140511"}, - {"2804:3dac:200::/32", "266546"}, - {"2c0f:e810::/32", "328624"}, - {"2001:1b90::/32", "6908"}, - {"2001:4878:2141::/48", "12222"}, - {"2402:800:5b8d::/43", "7552"}, - {"2606:2800:4a28::/46", "15133"}, - {"2a01:a820::/32", "61042"}, - {"2a02:26f7:73::/48", "20940"}, - {"2a0a:f880::/29", "60111"}, - {"2406:8600:f83f::/41", "10310"}, - {"2804:70c::/32", "262668"}, - {"2a03:b020::/29", "41327"}, - {"2408:8957:ec00::/39", "17622"}, - {"240a:a6dc::/32", "144406"}, - {"2800:160:1ce0::/44", "14259"}, - {"2a02:2d8:1:7808::/64", "35277"}, - {"2a02:26f0:8801::/39", "20940"}, - {"2806:2f0:93c1::/46", "17072"}, - {"240a:a556::/32", "144016"}, - {"2602:fcd3:500::/48", "212934"}, - {"2607:f390:1440::/44", "2055"}, - {"2800:bf0:8150::/44", "27947"}, - {"2001:ee0:8240::/40", "45899"}, - {"2600:6c58::/32", "20115"}, - {"2804:4f8:a005::/44", "28263"}, - {"2a02:26f0:62::/45", "20940"}, - {"2001:559:c425::/46", "7015"}, - {"2607:fb10:503a::/45", "2906"}, - {"2804:51e0::/32", "268482"}, - {"2a02:2e02:9450::/39", "12479"}, - {"2a05:7c00::/29", "201236"}, - {"2001:da8:b800::/47", "24372"}, - {"2402:800:352b::/41", "7552"}, - {"2409:8924:7d00::/38", "56046"}, - {"2600:6c20:59::/42", "20115"}, - {"2804:1b40:2000::/32", "28255"}, - {"2a0e:b107:d00::/44", "212746"}, - {"2001:550:3203::/45", "174"}, - {"2400:cb00:109::/48", "13335"}, - {"2408:8459:c410::/42", "17623"}, - {"240e:438:7840::/38", "4134"}, - {"2604:d600:164b::/45", "32098"}, - {"2804:626c::/32", "269296"}, - {"2806:2f0:2102::/48", "17072"}, - {"2a00:1fd0:ecc0::/46", "29033"}, - {"2a01:448:72::/48", "20559"}, - {"2a02:26f7:ccc1::/46", "20940"}, - {"2a02:2e02:2590::/38", "12479"}, - {"2406:3000:3:2::/61", "4657"}, - {"2409:8050:3000::/47", "56047"}, - {"240e:11:8800::/37", "137695"}, - {"2a00:86c0:101::/38", "2906"}, - {"2a0a:d880::/44", "207306"}, - {"2001:648:2811::/38", "5408"}, - {"240a:a6e5::/32", "144415"}, - {"2804:32b0::/32", "265093"}, - {"2a04:c442:9000::/33", "10725"}, - {"2803:f7e0:2040::/48", "271773"}, - {"2804:1bf0::/45", "61758"}, - {"2a03:67c0::/32", "12703"}, - {"2a0c:b641:16a::/48", "211139"}, - {"2001:678:a84::/48", "208713"}, - {"2409:8057:303d::/48", "56040"}, - {"240e:30c:5600::/31", "4134"}, - {"2600:6c38:742::/45", "20115"}, - {"2803:f240::/32", "61508"}, - {"2a01:110f:5000::/40", "29535"}, - {"2a02:2f0c:8002:4::4/33", "8708"}, - {"2a03:f80:373::/48", "43289"}, - {"240b:400e:fffe::/48", "45102"}, - {"2603:4:1600::/48", "44273"}, - {"2804:337c::/32", "265399"}, - {"2a02:26f7:ded1::/42", "20940"}, - {"2a0a:4c0::/32", "206303"}, - {"2001:468:c80::/48", "1312"}, - {"2001:41c7::/32", "31459"}, - {"240a:a292::/32", "143308"}, - {"2600:1fa0:5040::/44", "16509"}, - {"2a03:cf80::/32", "31484"}, - {"2001:559:3f::/48", "7015"}, - {"2001:559:c190::/48", "33489"}, - {"2401:1040:2::/48", "59239"}, - {"2402:800:577f::/40", "7552"}, - {"240e:1a:170::/35", "23650"}, - {"2804:2a6c::/32", "264072"}, - {"2a06:c000::/31", "45027"}, - {"2a0b:b86::/45", "3280"}, - {"2001:559:84::/48", "7016"}, - {"2403:8a00::/32", "17686"}, - {"240a:ae6b::/32", "146341"}, - {"2804:1168::/35", "52904"}, - {"2804:145c:c310::/37", "263327"}, - {"2806:20d:3300::/37", "32098"}, - {"2404:6300:1001::/33", "131310"}, - {"2607:f9f1:3::/32", "22205"}, - {"2a01:9520::/29", "62241"}, - {"2a02:ed8::/32", "44898"}, - {"2a02:26f7:d549::/46", "20940"}, - {"2408:8656:2efe::/47", "17623"}, - {"2607:ff68::/44", "46475"}, - {"2806:2f0:8181::/46", "17072"}, - {"2a02:2b60:c::/41", "42947"}, - {"2401:8ac0:120::/48", "4671"}, - {"2408:8956:3a00::/40", "17622"}, - {"240c:cb22::/21", "23910"}, - {"2600:140f:2200::/48", "9829"}, - {"2a02:26f7:fa09::/42", "20940"}, - {"2a11:ba80::/29", "210792"}, - {"2001:d00::/32", "17678"}, - {"2405:e000::/35", "37963"}, - {"2406::/32", "9732"}, - {"2409:8c85:aa19::/42", "9808"}, - {"2606:57c0::/48", "6461"}, - {"2620:10a:8004::/48", "27299"}, - {"2a04:9040::/29", "58138"}, - {"2001:500:121::/48", "396566"}, - {"2001:559:105::/48", "33652"}, - {"2404:5200::/32", "4686"}, - {"240a:a817::/32", "144721"}, - {"2800:ba0:6a::/48", "263812"}, - {"2804:43a0:3003::/33", "267580"}, - {"2a0e:b107:470::/45", "138006"}, - {"2402:d000:1075::/33", "9329"}, - {"240c:c411::/22", "23910"}, - {"2600:1001:b1e0::/33", "22394"}, - {"2607:f8f0:210::/41", "271"}, - {"2001:388:6031::/41", "7575"}, - {"2a02:b60::/35", "44217"}, - {"2a02:26f7:f189::/46", "20940"}, - {"2a04:3100::/29", "196976"}, - {"2001:559:82c1::/48", "33657"}, - {"2001:67c:514::/48", "2116"}, - {"2402:800:3ac5::/43", "7552"}, - {"240a:a515::/32", "143951"}, - {"240a:ac7b::/32", "145845"}, - {"2607:f110:43::/45", "21889"}, - {"2804:2e0c::/34", "263019"}, - {"2804:4f54::/32", "268320"}, - {"2804:56f8::/33", "268035"}, - {"2a02:7880::/32", "28745"}, - {"2001:1260:8::/46", "13591"}, - {"2401:d800:f472::/40", "7552"}, - {"2403:6c40::/32", "131478"}, - {"2a0f:2880:400::/40", "208164"}, - {"2401:d800:b770::/40", "7552"}, - {"2406:3000:8:4040::/46", "4657"}, - {"2804:14d:4031::/40", "28573"}, - {"2a06:a001:a080::/44", "207466"}, - {"2a0b:5f40::/29", "42926"}, - {"2001:559:83b6::/48", "7922"}, - {"2806:230::/36", "11888"}, - {"2a02:26f7:fa80::/48", "36183"}, - {"2001:13d2:2816::/35", "7303"}, - {"2001:16a2:8016::/42", "39386"}, - {"2001:4df0::/29", "1680"}, - {"2401:5c00::/32", "9889"}, - {"2401:d800:bd92::/41", "7552"}, - {"2406:84c0::/32", "138225"}, - {"2602:fc23:15::/39", "8095"}, - {"2600:1417:6b::/45", "20940"}, - {"2a02:26f7:c741::/46", "20940"}, - {"2a02:26f7:c984::/48", "36183"}, - {"240a:adb0::/32", "146154"}, - {"2804:14c:d4a0::/47", "28573"}, - {"2804:a64::/32", "52893"}, - {"2804:8428::/32", "272243"}, - {"2a01:7ea0::/32", "13012"}, - {"2a0b:67c0::/29", "28920"}, - {"2001:fb0::/36", "7470"}, - {"2401:c240:1100::/34", "132847"}, - {"2409:8914:7e00::/39", "56044"}, - {"240a:ac62::/32", "145820"}, - {"2804:4728::/32", "267035"}, - {"2804:636c:2000::/35", "269360"}, - {"2001:4b20:1000:1::/50", "34288"}, - {"240a:a8bf::/32", "144889"}, - {"2606:8e40:200::/37", "46513"}, - {"2804:3c0::/46", "28605"}, - {"2806:20d:5037::/44", "32098"}, - {"2806:2f0:7161::/46", "17072"}, - {"2a02:26f7:ed41::/46", "20940"}, - {"2a0b:6b86:b10::/48", "206699"}, - {"2409:8f05::/27", "9808"}, - {"2804:1b0:1a80::/47", "18881"}, - {"2806:230:4002::/48", "265594"}, - {"2a03:da00::/35", "24991"}, - {"2a0e:1b00::/31", "49436"}, - {"2001:67c:2620::/48", "55002"}, - {"2400:cb00:ab90::/46", "13335"}, - {"2602:fda8::/36", "397925"}, - {"2801:80:37f0::/48", "269607"}, - {"2001:67c:40c::/48", "62116"}, - {"2001:cb0:20e::/47", "4637"}, - {"2600:1403:a401::/36", "20940"}, - {"2620:171:d6::/44", "715"}, - {"2804:14d:ba47::/43", "28573"}, - {"2804:2ef8::/32", "52692"}, - {"240e:3be:8200::/35", "140316"}, - {"2600:1017:f810::/37", "6167"}, - {"2602:fd9e::/36", "397666"}, - {"2602:ff1b::/36", "49981"}, - {"2804:7fc4::/32", "271708"}, - {"2a02:214d:8000::/33", "1241"}, - {"2001:559:82e4::/48", "7015"}, - {"2001:f20:f000::/46", "38154"}, - {"240a:a53c::/32", "143990"}, - {"240a:ace6::/32", "145952"}, - {"240e:640:ce00::/40", "136197"}, - {"2804:204:21c::/47", "28186"}, - {"2804:4c1c::/32", "267350"}, - {"2a09:4bc7:d022::/44", "140096"}, - {"2a0a:90c0::/44", "198912"}, - {"2001:df0:400::/48", "56172"}, - {"2400:ddc0::/35", "4785"}, - {"2620:12d:1000::/47", "26889"}, - {"2a01:5042:200e::/48", "202196"}, - {"2a0c:5700::/34", "30893"}, - {"2a0e:fd87::/46", "13238"}, - {"240a:a771::/32", "144555"}, - {"2a02:26f7:d210::/48", "36183"}, - {"2a02:ee80:4246::/47", "3573"}, - {"2a0f:5707:abf6::/48", "212895"}, - {"2a10:641::/32", "6697"}, - {"240e:103:8b10::/44", "4134"}, - {"240e:438:6640::/36", "4134"}, - {"2603:c021:4000::/35", "31898"}, - {"2806:28f::/32", "28419"}, - {"2a04:2d00::/48", "56647"}, - {"2a0a:3140:1600::/46", "15532"}, - {"2001:67c:39c::/48", "15894"}, - {"2620:131:1065::/48", "14618"}, - {"2804:7b30::/32", "271416"}, - {"2600:1419:d::/43", "20940"}, - {"2604:cc00:a3::/48", "53292"}, - {"2a02:26f7:da0c::/48", "36183"}, - {"2c0f:fee0::/32", "33785"}, - {"2001:559:87ef::/48", "7922"}, - {"2001:fd8:60::/48", "132199"}, - {"2001:42c8::/32", "6453"}, - {"2403:c000:1001::/37", "4741"}, - {"2620:13b:d001::/46", "3549"}, - {"2c0e:2710::/20", "5713"}, - {"2401:d800:d990::/42", "7552"}, - {"2403:1cc0:1201::/48", "45352"}, - {"2604:4e00:6000::/32", "25764"}, - {"2604:8380::/35", "29802"}, - {"2001:559:1d7::/48", "7922"}, - {"2001:67c:29d4::/48", "58247"}, - {"2606:9700::/32", "237"}, - {"2a06:44c0::/29", "200434"}, - {"2001:559:c173::/48", "33660"}, - {"2001:678:928::/48", "60149"}, - {"2406:daa0:c060::/44", "16509"}, - {"2408:840d:8200::/42", "17621"}, - {"2409:8043:2901::/46", "24444"}, - {"2409:896a:8600::/39", "9808"}, - {"2605:72c0:a000::/36", "396865"}, - {"2606:ae00:cc41::/35", "7287"}, - {"2804:1134::/32", "263665"}, - {"2804:12c0::/32", "263496"}, - {"2804:635c::/32", "269356"}, - {"2804:7fec::/32", "271718"}, - {"2001:559:c1b1::/48", "33652"}, - {"2001:67c:195c::/48", "29117"}, - {"2001:67c:2bc0::/48", "3301"}, - {"2804:378::/32", "28283"}, - {"2001:559:80af::/48", "33491"}, - {"2001:559:c30d::/48", "33652"}, - {"2403:ad80:60::/45", "134835"}, - {"2408:8656:a59::/37", "17622"}, - {"2620:135:7002::/48", "3356"}, - {"2804:277c::/32", "263904"}, - {"2402:800:532b::/41", "7552"}, - {"2806:260:1012::/47", "28481"}, - {"2a0e:3f00::/29", "197706"}, - {"2001:250:7020::/48", "24369"}, - {"240b:c000::/24", "138384"}, - {"2a02:26f7:b709::/42", "20940"}, - {"2001:4488:f862::/39", "7713"}, - {"2406:7300::/46", "17559"}, - {"2408:84f3:e010::/42", "134543"}, - {"2620:0:28a8::/48", "33522"}, - {"2a02:26f7:f241::/46", "20940"}, - {"2402:800:970f::/43", "7552"}, - {"2a00:4940:2::/32", "198279"}, - {"2a0f:f6c0::/29", "57191"}, - {"2001:67c:2630::/48", "42044"}, - {"2408:8000:a000::/43", "4837"}, - {"240a:a8b6::/32", "144880"}, - {"2803:3440:9000::/46", "64112"}, - {"2803:5500::/32", "52431"}, - {"2001:500:6b::/48", "27321"}, - {"2001:57a:9208::/47", "22773"}, - {"2408:8001:3080::/39", "17816"}, - {"2620:74:20::/48", "396566"}, - {"2804:4830::/32", "267103"}, - {"2a00:c00:f063::/48", "15769"}, - {"2a06:ed40::/29", "203450"}, - {"2001:67c:13cc::/48", "199330"}, - {"2402:800:614a::/45", "7552"}, - {"240e:3b8:4c00::/35", "136200"}, - {"2607:fa08:2:f::/32", "23404"}, - {"2800:160:13f7::/44", "14259"}, - {"2a02:2010:2290::/45", "20978"}, - {"2a04:b902::/32", "16509"}, - {"2001:df5:1280::/48", "45325"}, - {"2409:804c:1900::/34", "9808"}, - {"2a02:2e02:8950::/40", "12479"}, - {"2a04:4e40:4e10::/42", "54113"}, - {"2a0a:6800::/29", "207202"}, - {"2404:24c0::/32", "138520"}, - {"2404:7800::/32", "17893"}, - {"2407:c280:ffff::/48", "134409"}, - {"2408:8957:400::/40", "17622"}, - {"240e:60c:dc00::/34", "4134"}, - {"2607:ff78::/32", "20161"}, - {"2804:11c0::/32", "263436"}, - {"2602:806:7008::/45", "14618"}, - {"2804:7b40::/32", "271420"}, - {"2a04:efc0::/29", "201847"}, - {"2406:2000:98::/48", "38032"}, - {"2408:8656:2cfe::/47", "17623"}, - {"240a:a7de::/32", "144664"}, - {"240e:67a:e200::/39", "140329"}, - {"2600:c12::/32", "12179"}, - {"2804:63c4::/32", "269382"}, - {"2806:230:5001::/48", "11888"}, - {"2001:559:8768::/47", "7015"}, - {"2001:4500:1200::/32", "18183"}, - {"240a:a72e::/32", "144488"}, - {"2804:70c8::/32", "270748"}, - {"2a00:4b00:20e::/42", "41935"}, - {"2a01:bda0::/32", "61981"}, - {"2a04:f580:9280::/48", "4809"}, - {"2a10:4646:3::/48", "42101"}, - {"2001:559:c40f::/48", "33287"}, - {"2001:14d0::/29", "15516"}, - {"240c:c0a8:9c01::/48", "138440"}, - {"2605:3380:4702::/40", "12025"}, - {"2804:7d38::/32", "271547"}, - {"2a03:fc40::/32", "41937"}, - {"2405:cc00::/34", "55943"}, - {"2600:1419:3a01::/37", "20940"}, - {"2600:5c01:1ffe::/48", "11351"}, - {"2001:500:15::/48", "715"}, - {"2001:559:c0e6::/48", "7922"}, - {"2404:fc00:192::/45", "45910"}, - {"240a:a16d::/32", "143015"}, - {"240a:a37d::/32", "143543"}, - {"240a:a5ef::/32", "144169"}, - {"2606:9880::/32", "394380"}, - {"2804:a58::/32", "262274"}, - {"240a:a18c::/32", "143046"}, - {"2a02:26f7:cd8c::/48", "36183"}, - {"2a03:db80:4421::/46", "680"}, - {"2602:fe13:802::/48", "53356"}, - {"2606:2800:4014::/48", "15133"}, - {"2800:160:2022::/43", "14259"}, - {"2a0c:b080::/29", "204751"}, - {"2001:559:c097::/48", "33651"}, - {"2405:7f00:8b00::/35", "133414"}, - {"2620:52:c000::/48", "54538"}, - {"2804:44ac::/32", "267646"}, - {"2001:df4:ce80::/48", "141166"}, - {"2001:df7:f600::/48", "135214"}, - {"2409:8751:f00::/35", "56047"}, - {"2604:dac0::/32", "36504"}, - {"2a02:26f7:d84e::/47", "20940"}, - {"2001:13d1:2c04::/35", "7303"}, - {"240a:ac63::/32", "145821"}, - {"2a01:73e0:a000::/33", "47872"}, - {"2a0c:9a40:1092::/48", "34927"}, - {"2001:559:3d2::/48", "33657"}, - {"2409:8729::/27", "9808"}, - {"2409:8c14:2e00::/35", "9808"}, - {"2409:8d1e::/31", "24400"}, - {"2450:1740:1::/48", "140079"}, - {"2605:6a40::/32", "398081"}, - {"2800:440:144::/48", "27738"}, - {"2801:11c:c0::/44", "269888"}, - {"2a09:dc0::/32", "47485"}, - {"2600:140b:6400::/48", "31109"}, - {"2607:f6f0:201::/48", "54588"}, - {"2804:5604::/32", "267971"}, - {"2a10:9ec0::/29", "211785"}, - {"2a11:1d41::/46", "210937"}, - {"2001:df0:9580::/48", "134868"}, - {"2804:5890::/32", "268136"}, - {"2803:9300::/32", "265760"}, - {"2a07:4e40::/29", "54058"}, - {"2001:4c8:109c::/46", "15290"}, - {"2605:a401:8c9b::/42", "33363"}, - {"2606:2800:424e::/48", "14153"}, - {"2001:4878:102::/47", "12222"}, - {"2401:b200::/45", "24186"}, - {"2406:52c0::/32", "139141"}, - {"2408:8459:1910::/42", "17623"}, - {"240a:ad2d::/32", "146023"}, - {"2a02:26f7:d889::/42", "20940"}, - {"2a03:5f00:108::/46", "207044"}, - {"2001:67c:1bc4::/48", "5588"}, - {"2001:df5:c680::/48", "141529"}, - {"2400:1760::/32", "7590"}, - {"2402:800:5c8d::/42", "7552"}, - {"2a01:8980::/32", "57124"}, - {"2a04:c240::/29", "62009"}, - {"2001:559:8493::/48", "7015"}, - {"2408:84f3:9c40::/38", "17816"}, - {"2620:13e:9007::/48", "17218"}, - {"2a05:1a00:4000::/27", "43754"}, - {"2a0c:5a00::/29", "50304"}, - {"2001:559:712::/48", "7922"}, - {"2001:978:6715::/35", "174"}, - {"2408:8456:4040::/38", "17816"}, - {"240a:a500::/32", "143930"}, - {"2804:1404::/32", "263309"}, - {"2804:53f0::/32", "268617"}, - {"2a0e:fd45:b00::/48", "213249"}, - {"2001:559:87d3::/48", "33657"}, - {"2400:a980:4900::/35", "133111"}, - {"2409:8914:a00::/39", "56044"}, - {"2801:10:b000::/48", "264635"}, - {"240e:967:e600::/36", "4134"}, - {"2001:ee0:9f40::/34", "45899"}, - {"2600:1007:9100::/44", "6167"}, - {"2606:a000:708::/36", "11426"}, - {"2409:8028:8f3::/45", "9808"}, - {"2a02:dd0::/32", "15735"}, - {"2a03:4b40:5281::/37", "50710"}, - {"2408:840d:4e00::/42", "17621"}, - {"240d:c010:56::/48", "139341"}, - {"2a02:c880::/48", "24642"}, - {"2001:df2:1400::/48", "133923"}, - {"240e:3b0:dc00::/34", "4134"}, - {"2a01:8840:2d::/48", "207266"}, - {"2a02:88d:822f::/48", "47794"}, - {"240c:ce81::/32", "138393"}, - {"2a05:d03a:4000::/40", "16509"}, - {"2a05:d03a:c000::/40", "16509"}, - {"2001:e30:1c1e::/48", "2697"}, - {"2001:4de0:4300::/40", "33438"}, - {"2605:a40e:6::/44", "33363"}, - {"2a03:6540::/32", "61316"}, - {"2a0b:2900:6100::/38", "48582"}, - {"2406:d00:bbbb::/48", "132165"}, - {"240a:aacb::/32", "145413"}, - {"2001:559:45d::/48", "33659"}, - {"240e:f7:c000::/35", "134771"}, - {"2804:14c:5d00::/42", "28573"}, - {"2804:4410::/32", "267619"}, - {"2a0a:1fc0::/29", "41960"}, - {"2408:8456:4a40::/39", "17816"}, - {"240a:ab91::/32", "145611"}, - {"2a02:26f7:f7c8::/48", "36183"}, - {"2001:678:344::/48", "47939"}, - {"2001:67c:17bc::/48", "1257"}, - {"2400:cb00:a620::/46", "13335"}, - {"2804:8424::/33", "272242"}, - {"2a01:90:200::/40", "29668"}, - {"2a02:c70::/32", "47841"}, - {"2001:559:3c4::/48", "33660"}, - {"2001:648:3400::/40", "8248"}, - {"2804:19d0::/32", "61820"}, - {"2804:526c::/36", "268517"}, - {"2001:49f0:2920::/48", "174"}, - {"2001:4de0:6000::/40", "33438"}, - {"240e:3bb:3e00::/33", "140308"}, - {"2a00:c827::/45", "60330"}, - {"2a02:6980::/32", "12935"}, - {"2a02:ee80:40ac::/43", "3573"}, - {"2a0a:e200:1510::/48", "199156"}, - {"2402:1b40:2009::/33", "7628"}, - {"2403:ba00:202f::/48", "132651"}, - {"240a:a726::/32", "144480"}, - {"2607:fe28:11::/38", "53347"}, - {"2804:2d6c::/32", "265281"}, - {"2806:230:2029::/48", "11888"}, - {"2a02:26f7:ba44::/48", "36183"}, - {"2a0e:1c80:1::/48", "42675"}, - {"2a00:1851:bf04::/40", "29357"}, - {"2402:e280:3d00::/41", "134674"}, - {"240a:abd4::/32", "145678"}, - {"2604:4000:8000::/48", "12915"}, - {"2801:11:f000::/48", "266896"}, - {"2801:1f:4800::/48", "269848"}, - {"2a00:c587:fd00::/40", "51331"}, - {"2a0f:7ec0:100::/48", "12303"}, - {"2c0f:4b00::/32", "328939"}, - {"2404:f4c0:f9cd::/48", "142281"}, - {"240a:a595::/32", "144079"}, - {"2804:14c:8500::/40", "28573"}, - {"2a00:1d10::/32", "49909"}, - {"2607:fcd0:108::/47", "8100"}, - {"2800:200:2001::/44", "12252"}, - {"2806:3cf::/32", "270126"}, - {"2a00:1728:1c::/48", "44017"}, - {"2620:11a:c000::/43", "54113"}, - {"2a00:6901:c002::/47", "20926"}, - {"2a02:fa8:8800::/40", "41041"}, - {"2a04:4e40:8230::/44", "54113"}, - {"2001:740::/32", "5400"}, - {"2001:448a:6010::/42", "7713"}, - {"240e:108:8e::/47", "4134"}, - {"2801:1fc:3c::/48", "27951"}, - {"2803:2a80:821::/48", "262928"}, - {"2804:80b8:a000::/36", "271769"}, - {"2a02:26f7:c184::/48", "36183"}, - {"2606:2800:6023::/44", "15133"}, - {"2610:80:3000::/29", "6079"}, - {"2803:e40::/40", "27797"}, - {"2001:559:836d::/48", "33652"}, - {"2804:2e8:8::/47", "262847"}, - {"2804:4e00::/32", "268233"}, - {"2a00:1dd8::/29", "31042"}, - {"2a0c:e040:1235::/39", "200629"}, - {"2001:ce0:6::/48", "4605"}, - {"2407:6c00:18::/48", "45839"}, - {"2801:1c1::/40", "19429"}, - {"2804:16b0:2000::/36", "61910"}, - {"2804:7d88::/32", "271567"}, - {"2a00:17f1::/32", "50533"}, - {"2a0d:4d00::/46", "44794"}, - {"2404:8d06:7100::/36", "10089"}, - {"2405:7600::/47", "23956"}, - {"2407:d40::/44", "139009"}, - {"240a:a6f0::/32", "144426"}, - {"2604:d600:15be::/41", "32098"}, - {"2804:2408:8400::/33", "52705"}, - {"2c0f:5f00::/32", "328974"}, - {"2408:84f3:d840::/37", "17816"}, - {"2600:1419:7001::/38", "20940"}, - {"2620:103:2008::/46", "30539"}, - {"2620:11c:c001::/48", "13768"}, - {"2a11:1200::/29", "204790"}, - {"2001:506:39::/48", "20055"}, - {"2400:1a00:b1c1::/42", "17501"}, - {"2602:fd3a:22a::/48", "16509"}, - {"2c0f:2f00::/32", "328987"}, - {"2600:1407:18::/46", "20940"}, - {"2606:f300:20::/43", "4544"}, - {"2607:f3c8:4000::/34", "33724"}, - {"2a04:4e40:2a10::/41", "54113"}, - {"2a05:b0c2::/35", "210842"}, - {"2a0f:9400:fa0::/43", "53356"}, - {"2a10:7280::/29", "204790"}, - {"2001:4408:101::/38", "4758"}, - {"2401:1d40:3f03::/40", "59019"}, - {"2404:e6:910::/32", "703"}, - {"2600:6c34:13::/48", "33588"}, - {"2602:807:5010::/42", "55136"}, - {"2605:2800:1200::/48", "10812"}, - {"2801:80:1a50::/48", "265450"}, - {"2a00:8380::/32", "15557"}, - {"2a01:5040:1001::/42", "43996"}, - {"240a:a8e2::/32", "144924"}, - {"2a02:1b8::/31", "47692"}, - {"2001:559:c3af::/48", "7016"}, - {"2804:1814::/32", "263263"}, - {"2806:230:2058::/48", "265594"}, - {"2001:559:3fe::/48", "7922"}, - {"2001:df0:22b::/48", "38574"}, - {"2400:9380:9080::/47", "4809"}, - {"2404:2280:1cb::/45", "24429"}, - {"2607:fcc8:afc0::/48", "11955"}, - {"2800:160:1d0a::/45", "14259"}, - {"2804:44e8:101::/38", "267660"}, - {"2a02:26f7:f108::/48", "36183"}, - {"2001:559:c32e::/48", "33657"}, - {"2806:20d:5c00::/34", "32098"}, - {"2806:2f0:2461::/48", "22884"}, - {"2a02:26f7:c94a::/47", "20940"}, - {"2a04:2f81:6::/29", "61157"}, - {"2401:1900:8030::/44", "45245"}, - {"2407:14c0::/39", "138077"}, - {"2602:fcf4::/36", "398738"}, - {"2804:1690:880::/32", "263292"}, - {"2a02:2ab8:8210::/33", "702"}, - {"2403:9800:2f::/48", "2570"}, - {"240e:983:1b00::/48", "58461"}, - {"2a09:3b00::/29", "208861"}, - {"2a0c:e642:80::/32", "211323"}, - {"2405:fa80::/32", "132894"}, - {"2801:16:1800::/48", "271995"}, - {"2a0e:ee80::/29", "328486"}, - {"2001:559:82d1::/48", "7015"}, - {"2401:d800:7db0::/41", "7552"}, - {"2602:104:f::/48", "33588"}, - {"2a06:6400::/29", "15576"}, - {"2001:559:877a::/48", "7922"}, - {"2408:8459:6410::/42", "17623"}, - {"2409:8051:2000::/47", "56047"}, - {"240e:3b0:8200::/35", "140316"}, - {"2a01:448:73::/32", "42585"}, - {"2a02:6723::/32", "208668"}, - {"2001:1248:a530::/46", "11172"}, - {"2001:4479:4000::/35", "7545"}, - {"2401:4900:3050::/44", "45609"}, - {"2409:8907:7120::/38", "24547"}, - {"2600:1008:f000::/44", "6167"}, - {"2803:5e00:120::/32", "267765"}, - {"2a01:8840:3a::/45", "12041"}, - {"2a0d:f780::/29", "202921"}, - {"2404:3d00:500::/33", "3573"}, - {"2406:e940:1001::/32", "9449"}, - {"2602:fd92:c30::/44", "400298"}, - {"2605:a380:2002::/32", "53828"}, - {"2804:1e20:13::/48", "264409"}, - {"2804:2d08::/32", "265258"}, - {"2a02:ee80:422e::/41", "3573"}, - {"2a0b:1300:81dc::/48", "209915"}, - {"240a:a812::/32", "144716"}, - {"2605:5940::/32", "14235"}, - {"2800:160:14e9::/43", "14259"}, - {"2804:6930:3000::/32", "270254"}, - {"2001:1a68:2::/48", "198430"}, - {"2404:e5:212::/30", "703"}, - {"2409:805c:1900::/34", "9808"}, - {"240a:a35f::/32", "143513"}, - {"2620:31:8000::/48", "11540"}, - {"2804:14c:3ba7::/44", "28573"}, - {"2a02:ab40::/29", "196810"}, - {"2a06:2602::/32", "51088"}, - {"2001:559:70b::/48", "33287"}, - {"240e:6b2:2000::/32", "4134"}, - {"2605:9d00::/32", "53767"}, - {"2801:c4:1e::/48", "265553"}, - {"2001:579:124::/43", "22773"}, - {"2604:3380::/28", "46437"}, - {"2607:ffb0::/34", "6327"}, - {"2804:178::/32", "28591"}, - {"2001:678:d94::/48", "49183"}, - {"2001:7fa:5::/48", "23911"}, - {"2001:470:7a::/40", "6939"}, - {"2001:559:5ff::/48", "7016"}, - {"2001:67c:2ee8::/48", "49787"}, - {"2001:df3:2680::/48", "134351"}, - {"2604:1380:4200::/44", "54825"}, - {"2a00:bac0::/32", "58323"}, - {"2a0d:e940:b000::/36", "35507"}, - {"2001:559:7e5::/46", "33657"}, - {"2001:559:8506::/48", "33659"}, - {"2001:448a:6110::/35", "7713"}, - {"2001:4d70::/32", "201210"}, - {"240e:44d:7500::/42", "140345"}, - {"2408:8256:3d96::/44", "17623"}, - {"2600:140f:d001::/37", "20940"}, - {"2620:1bc::/35", "7726"}, - {"2a02:2aa0:111::/44", "702"}, - {"2a0b:b200::/32", "64439"}, - {"2001:678:a0::/48", "43558"}, - {"2001:1248:8461::/44", "11172"}, - {"240a:a683::/32", "144317"}, - {"2602:fc23:111::/48", "57429"}, - {"2804:1168:1819::/37", "52904"}, - {"2a02:26f0:81::/46", "20940"}, - {"2a02:53c0::/32", "210306"}, - {"2402:9d80:103::/48", "131429"}, - {"2402:a1c0:101::/32", "137526"}, - {"240e:44d:1740::/42", "140360"}, - {"2606:240:2::/48", "812"}, - {"2408:840d:8600::/42", "17621"}, - {"2a02:26f7:e2::/48", "36183"}, - {"2a02:26f7:f78c::/48", "36183"}, - {"2403:5000:172::/40", "9304"}, - {"2408:8409:9c00::/40", "4808"}, - {"2804:4a90:1001::/34", "267249"}, - {"2a01:7e0:30::/39", "44066"}, - {"2a07:aa00:81::/44", "3549"}, - {"2001:41a8:605::/32", "6762"}, - {"2606:440::/32", "399060"}, - {"2804:394::/34", "262895"}, - {"2a00:46e0::/32", "50265"}, - {"2a00:4f40::/32", "29104"}, - {"2a01:180::/29", "12709"}, - {"2a01:280:368::/48", "12552"}, - {"2a02:2e02:8480::/41", "12479"}, - {"2001:559:8014::/48", "33491"}, - {"2804:1844::/32", "53065"}, - {"2804:769c::/32", "271123"}, - {"2a05:3040::/29", "42910"}, - {"2a12:1100::/29", "204790"}, - {"240e:438:7420::/43", "140647"}, - {"2a00:9560::/29", "58003"}, - {"2a02:1310:353::/48", "21130"}, - {"2401:4900:1280::/41", "45609"}, - {"240a:aaf6::/32", "145456"}, - {"240e:3be:ec00::/35", "140314"}, - {"240e:44d:1880::/41", "4134"}, - {"2600:3508:f000::/29", "396998"}, - {"2804:18bc::/32", "61950"}, - {"2804:6de8:b000::/33", "270563"}, - {"2a0b:69c0::/29", "205619"}, - {"240e:9b:f009::/46", "140248"}, - {"2a02:26f7:d281::/46", "20940"}, - {"2a02:26f7:dac5::/46", "20940"}, - {"2a03:7380:1f40::/40", "13188"}, - {"2a10:ab00::/29", "47285"}, - {"2001:579:e120::/43", "22773"}, - {"2408:8957:df00::/40", "17816"}, - {"240a:a7cc::/32", "144646"}, - {"2001:579:b814::/41", "22773"}, - {"2409:8c06::/28", "9808"}, - {"2600:1407:3800::/48", "35994"}, - {"2804:389c::/32", "266489"}, - {"2001:af8::/46", "5385"}, - {"2401:85c0::/32", "131605"}, - {"2402:9dc0::/32", "131183"}, - {"2a00:1148:6::/29", "47764"}, - {"2a01:7080:27::/32", "42848"}, - {"2a02:6ea0:ce00::/35", "60068"}, - {"2a03:49c0::/32", "58081"}, - {"2a10:2307:ffff::/48", "16509"}, - {"2001:559:32a::/48", "7016"}, - {"2406:840:c20::/48", "139317"}, - {"2408:8459:5a10::/42", "17623"}, - {"2409:8d03::/29", "9808"}, - {"2600:6c20:e0b::/45", "20115"}, - {"2806:260:4200::/39", "13999"}, - {"2a02:26f7:d50d::/42", "20940"}, - {"2402:ef21:2000::/36", "7633"}, - {"240a:afbb::/32", "146677"}, - {"2a0b:f4c1::/48", "60729"}, - {"2a0c:28c0::/32", "206429"}, - {"2001:678:2c4::/48", "12731"}, - {"2001:1af0:9001::/43", "13046"}, - {"2402:9500:c01::/39", "55720"}, - {"2600:1003:9100::/44", "6167"}, - {"2620:109:c006::/48", "55163"}, - {"2804:50b0::/32", "268404"}, - {"2001:67c:21e4::/48", "51634"}, - {"2401:d800:5e60::/40", "7552"}, - {"2408:8456:6200::/42", "17622"}, - {"2409:8904:9690::/34", "24547"}, - {"2804:1004::/32", "263614"}, - {"2a05:b680:9::/48", "57136"}, - {"2a0d:4340::/29", "8888"}, - {"2a0e:b107:fe0::/44", "138435"}, - {"2402:800:3971::/44", "7552"}, - {"2405:1800::/32", "9999"}, - {"2600:6c39:233::/45", "20115"}, - {"2800:bf0:8240::/44", "52257"}, - {"2803:2180:19::/46", "27941"}, - {"2a02:bc8::/42", "8641"}, - {"2001:678:eb0::/48", "212351"}, - {"2001:4038::/32", "31383"}, - {"240a:a466::/32", "143776"}, - {"240a:a7e1::/32", "144667"}, - {"2605:8cc0::/32", "398203"}, - {"2804:13b0:5c30::/44", "263546"}, - {"2a00:1d58:f015::/44", "47524"}, - {"240e:983::/48", "23724"}, - {"2620:149:a22::/48", "6185"}, - {"2405:dc0:8008::/46", "22604"}, - {"240e:3b3:2800::/38", "4134"}, - {"2620:e4:4000::/48", "394725"}, - {"2800:160:1164::/44", "14259"}, - {"2804:4924::/44", "267167"}, - {"2a04:ac01::/30", "56534"}, - {"2001:250:214::/48", "24351"}, - {"2401:d800:23e0::/37", "7552"}, - {"2600:380:8400::/36", "20057"}, - {"2a01:86e0::/32", "62136"}, - {"2a02:5320:d00::/40", "12189"}, - {"2a03:6b00:2::/44", "48832"}, - {"2607:f7a8:c00::/35", "46887"}, - {"2a05:e181::/32", "200941"}, - {"2001:678:b70::/48", "207886"}, - {"2001:67c:564::/48", "62121"}, - {"2404:7000::/32", "17557"}, - {"2605:9780:1400::/40", "36180"}, - {"2804:81bc::/32", "272473"}, - {"2a11:d82::/29", "208861"}, - {"2001:559:78e::/48", "7922"}, - {"2001:67c:23d4::/48", "57201"}, - {"2001:4190::/32", "12912"}, - {"2404:ce00::/33", "38634"}, - {"2607:fd48:302:100::/37", "13536"}, - {"2803:e600:facf::/37", "18809"}, - {"2a03:4680::/29", "25184"}, - {"2a10:d000:15::/44", "35506"}, - {"2001:559:181::/48", "33490"}, - {"240a:abe9::/32", "145699"}, - {"2603:f550::/24", "397165"}, - {"2a10:cc42:1a00::/40", "20473"}, - {"2408:8956:5a00::/40", "17622"}, - {"240e:3bb:f700::/36", "4134"}, - {"2a00:1538::/32", "44356"}, - {"2a02:26f7:ee05::/46", "20940"}, - {"2804:14d:e669::/40", "28573"}, - {"2804:6c0:300::/43", "262418"}, - {"2804:76a0::/32", "271124"}, - {"2a01:367:abce::/33", "30823"}, - {"2a12:6bc0::/32", "208869"}, - {"2a01:9900::/32", "21171"}, - {"2001:978:b701::/33", "174"}, - {"2001:16a6:c200::/31", "39386"}, - {"2409:8052:3100::/37", "9808"}, - {"2600:6c38:b54::/46", "20115"}, - {"2607:fb10:7092::/42", "2906"}, - {"2804:719c::/32", "270800"}, - {"2001:678:a9c::/48", "39702"}, - {"2001:44b8:30d7::/48", "4739"}, - {"2400:3e80::/32", "2514"}, - {"2607:a800:917::/48", "15695"}, - {"2620:119:50c0::/48", "14413"}, - {"2a03:8f80::/31", "34714"}, - {"2a04:40::/29", "39878"}, - {"2001:df2:4e80::/48", "139849"}, - {"240e:44d:5800::/42", "140345"}, - {"2804:5274::/32", "268519"}, - {"2001:559:c1af::/48", "33489"}, - {"2001:918:ff65::/43", "3303"}, - {"2401:d800:f2c0::/42", "7552"}, - {"2403:e200:1e::/37", "45543"}, - {"2409:8c20:5200::/42", "56046"}, - {"2a02:e00:ffea::/43", "29141"}, - {"2a0b:bb80::/32", "201787"}, - {"2001:df0:a8::/48", "46052"}, - {"2001:4888:8050::/46", "22394"}, - {"240a:ae3d::/32", "146295"}, - {"2806:2f0:9321::/46", "17072"}, - {"2a00:f180::/32", "13173"}, - {"2a03:80::/32", "57154"}, - {"2a0b:80::/29", "34261"}, - {"240a:a8e0::/32", "144922"}, - {"2607:f208:8::/48", "398107"}, - {"2a04:1ac0:fff3::/45", "211960"}, - {"2001:df5:7b00::/48", "137368"}, - {"2400:1160::/32", "9818"}, - {"2a00:8a40::/32", "28978"}, - {"2a02:7900:ff02::/40", "16154"}, - {"2a0c:b641:2b0::/46", "212625"}, - {"2a01:7d80:2400::/40", "62214"}, - {"2a0c:94c0::/29", "21032"}, - {"2001:388:608c::/48", "56132"}, - {"2409:805e:3100::/36", "9808"}, - {"2620:10d:900f::/48", "25993"}, - {"2a01:8180:2000::/36", "20594"}, - {"2c0f:f698:f00b::/36", "37693"}, - {"2001:559:8559::/46", "7015"}, - {"2001:678:b58::/48", "29560"}, - {"2408:8256:3291::/48", "17816"}, - {"2408:8957:b800::/40", "17622"}, - {"240a:a41c::/32", "143702"}, - {"2800:350::/29", "11556"}, - {"2804:5af0::/32", "268808"}, - {"2a00:1988::/32", "5392"}, - {"2a00:4802:1f00::/34", "8717"}, - {"2a10:39c0::/29", "204790"}, - {"2407:1e40:201::/39", "141732"}, - {"2600:14c0:9::/48", "20940"}, - {"2607:fcf0:6::/39", "13445"}, - {"2804:161c:d80::/45", "263268"}, - {"2001:49f0:d103::/45", "3216"}, - {"2401:e7c0::/32", "132298"}, - {"2408:8812::/28", "4837"}, - {"2804:776c::/32", "271177"}, - {"2a01:110::/32", "6584"}, - {"2a01:832::/29", "3209"}, - {"240a:a1c2::/32", "143100"}, - {"240a:a45c::/32", "143766"}, - {"2803:6900:581::/48", "52423"}, - {"2400:c640::/40", "136406"}, - {"240a:a6b5::/32", "144367"}, - {"2801:174:1::/48", "18747"}, - {"2a02:26f7:f504::/48", "36183"}, - {"2001:4878:347::/48", "12222"}, - {"2408:893a::/32", "4837"}, - {"240e:5e:4007::/32", "4134"}, - {"2602:ffe4:c38::/48", "21859"}, - {"2620:149:bc::/41", "714"}, - {"2803:2a60::/32", "267881"}, - {"2a02:16d8:108::/32", "5518"}, - {"2a02:40c0:1000::/48", "50673"}, - {"2a05:1540::/29", "47755"}, - {"2a06:ef40::/32", "50495"}, - {"2001:559:819b::/48", "7922"}, - {"2405:1c0:6121::/46", "55303"}, - {"2804:814::/32", "262777"}, - {"2804:2050:2abd::/35", "264485"}, - {"2a02:e980:a6::/44", "19551"}, - {"2a0f:e6c0:123::/48", "60781"}, - {"2001:559:c257::/48", "33662"}, - {"2001:67c:174::/48", "48345"}, - {"2001:1388:8a40::/45", "264684"}, - {"2409:8087:5100::/37", "9808"}, - {"240a:a7c5::/32", "144639"}, - {"2804:1658:100f::/32", "263283"}, - {"2001:559:85c9::/48", "7922"}, - {"2001:4c08:2025::/48", "3356"}, - {"240a:a341::/32", "143483"}, - {"2620:123:9002::/45", "394976"}, - {"2001:250:6811::/45", "138373"}, - {"2602:fce7::/32", "399065"}, - {"2804:4824::/32", "267100"}, - {"2a02:26f7:d4c5::/46", "20940"}, - {"2a02:d247:1000::/32", "44087"}, - {"2001:559:c04e::/47", "7922"}, - {"2001:67c::/48", "47490"}, - {"2401:1d40:2101::/36", "59019"}, - {"2408:8256:c68::/39", "17622"}, - {"2606:6b80::/32", "16788"}, - {"2605:a404:b97::/42", "33363"}, - {"2804:2d38::/32", "265267"}, - {"2804:3874:a::/48", "266478"}, - {"2806:20d:5a20::/46", "32098"}, - {"2001:550:90b::/45", "174"}, - {"2001:67c:1708::/48", "38974"}, - {"240e:870:40::/44", "140486"}, - {"2604:880:5c::/48", "29802"}, - {"2604:2680::/48", "2386"}, - {"2800:160:1634::/41", "14259"}, - {"2001:df6:5a00::/48", "64302"}, - {"2401:4900:4bb0::/41", "45609"}, - {"2a00:139d::/30", "34878"}, - {"2a0a:3500::/32", "21485"}, - {"2a0f:85c1:200::/44", "209188"}, - {"2001:559:8317::/44", "33650"}, - {"2001:678:c7c::/48", "44416"}, - {"2400:7400:56::/48", "23736"}, - {"2607:700:1100::/38", "22343"}, - {"2803:5440:4059::/48", "264738"}, - {"2804:1290::/32", "263484"}, - {"2804:5294::/32", "268527"}, - {"2806:370:2010::/41", "28403"}, - {"2a03:2380:6::/32", "198818"}, - {"2a05:3580:fa00::/39", "35807"}, - {"2a0e:69c0::/48", "39862"}, - {"2001:df6:8f00::/48", "135817"}, - {"2409:8027:2c06::/44", "9808"}, - {"2600:6c39:223::/45", "20115"}, - {"2804:e94:160::/40", "262468"}, - {"2804:6380::/32", "269365"}, - {"2a01:9460::/32", "44644"}, - {"2a01:bb24:102::/48", "16509"}, - {"2a02:26f7:f509::/42", "20940"}, - {"2a07:a8c1::/33", "34939"}, - {"2001:559:8249::/48", "33657"}, - {"240a:ab80::/32", "145594"}, - {"2406:4440:f010::/44", "46997"}, - {"2408:805d:9::/40", "17623"}, - {"240e:108:23::/48", "58519"}, - {"2602:107:3010::/48", "33588"}, - {"2a02:ad8:4a00::/35", "12389"}, - {"2a02:26f7:e9cc::/48", "36183"}, - {"2001:559:84a3::/48", "33651"}, - {"2803:1f60::/32", "269838"}, - {"2a02:26f7:c605::/46", "20940"}, - {"2a06:5040:3::/48", "6134"}, - {"2001:fd8:2a4::/46", "132199"}, - {"2401:a400::/38", "7477"}, - {"2604:b180:440::/44", "18444"}, - {"2804:3034:181::/38", "264936"}, - {"2804:8118::/32", "272431"}, - {"2402:800:3563::/43", "7552"}, - {"2408:8459:9c10::/42", "17623"}, - {"2408:8957:7d00::/40", "17816"}, - {"2602:feda:106::/41", "38008"}, - {"2620:171:73::/40", "715"}, - {"2804:6a00::/32", "270305"}, - {"2806:21a:1::/39", "262913"}, - {"2a07:ad40::/29", "206772"}, - {"2001:559:c058::/48", "33651"}, - {"2001:67c:2f00::/48", "197763"}, - {"2406:d00:2222::/48", "132165"}, - {"2620:116:800b::/48", "14618"}, - {"2804:b7c::/32", "52762"}, - {"2a01:839::/25", "3209"}, - {"2a0f:b300:2222::/48", "42072"}, - {"2001:1608::/32", "44066"}, - {"2001:4878:4215::/46", "12222"}, - {"2803:ba00:600::/36", "52286"}, - {"2804:1694:8000::/33", "263294"}, - {"2804:4bc8:b00::/32", "267329"}, - {"2400:a980:4100::/37", "133111"}, - {"2403:2c00:d000::/34", "4058"}, - {"2408:8956:f8c0::/37", "17816"}, - {"2804:8cc::/39", "262394"}, - {"2804:2140:100d::/43", "53059"}, - {"2804:2a3c::/32", "264066"}, - {"2a02:2638::/46", "44788"}, - {"2a03:6947:300::/37", "61266"}, - {"2001:4c0:6001::/46", "855"}, - {"2001:67c:205c::/48", "51147"}, - {"2620:132:7000::/42", "19537"}, - {"2a00:dd60::/32", "60171"}, - {"2402:800:9263::/43", "7552"}, - {"240a:a099::/32", "142803"}, - {"2803:1a00:410d::/43", "262186"}, - {"2a07:22c1:ffe1::/48", "40916"}, - {"2001:1248:975d::/42", "11172"}, - {"2401:d800:a000::/35", "7552"}, - {"240e:978:1100::/37", "4134"}, - {"2a04:f580:9090::/48", "4809"}, - {"2001:67c:2a98::/48", "3301"}, - {"2409:8704::/38", "24547"}, - {"240a:aac8::/32", "145410"}, - {"2600:140b:1400::/48", "31109"}, - {"2a07:6cc0:30::/47", "61098"}, - {"2a0f:d780::/32", "44213"}, - {"2001:4878:8007::/44", "12222"}, - {"2402:800:5501::/44", "7552"}, - {"2806:2f0:9c61::/46", "17072"}, - {"2a07:3500:19e8::/48", "38915"}, - {"2001:40e0::/32", "15879"}, - {"2620:171:200::/40", "715"}, - {"2001:550:b001::/37", "174"}, - {"2001:559:8738::/48", "33659"}, - {"2402:c940::/32", "59217"}, - {"240e:3b2:8200::/35", "140316"}, - {"2804:19ec::/35", "61827"}, - {"2804:6a40::/32", "270322"}, - {"2a00:65a0::/32", "15930"}, - {"2a05:9281::/32", "61385"}, - {"2a0e:1c80:b::/48", "47869"}, - {"2001:250:400b::/48", "23910"}, - {"2001:559:e0::/47", "7922"}, - {"2001:559:31c::/48", "7015"}, - {"2001:559:810a::/48", "33287"}, - {"2404:f4c0:ff1f::/48", "149506"}, - {"2408:870c:4000::/44", "140979"}, - {"240e:438:b020::/43", "140647"}, - {"2600:6c38:8b1::/44", "20115"}, - {"2800:bf0:94::/48", "52257"}, - {"2804:878:1c1::/32", "262374"}, - {"2804:c58::/32", "52694"}, - {"2804:3e70:c008::/35", "266596"}, - {"2a0c:2f07:4896::/48", "206924"}, - {"2a0e:4007:fffe::/48", "208226"}, - {"2001:1a11:10d::/46", "42298"}, - {"2402:1880::/30", "20546"}, - {"2403:b4c0:f000::/36", "138398"}, - {"2405:4000:801:6::/38", "38082"}, - {"2408:8957:af00::/40", "17816"}, - {"240e:d:8800::/35", "58563"}, - {"2600:141b:2001::/37", "20940"}, - {"2804:792c::/32", "271289"}, - {"2a02:2498:4::/46", "13213"}, - {"2a02:26f7:db::/48", "20940"}, - {"2a06:3040:10::/48", "203020"}, - {"2a0b:f080::/32", "213319"}, - {"2a10:d900::/32", "34953"}, - {"2401:d800:7900::/42", "7552"}, - {"2408:8459:de30::/41", "17622"}, - {"2804:5700::/32", "268037"}, - {"2a0f:6480::/32", "205112"}, - {"2001:250:7013::/48", "24370"}, - {"2001:67c:179c::/48", "64465"}, - {"240a:a9f2::/32", "145196"}, - {"2607:1880:ec16::/48", "13499"}, - {"2804:3740::/32", "266399"}, - {"2804:5208::/32", "28594"}, - {"2a02:26f7:f404::/48", "36183"}, - {"2a03:a500::/32", "60087"}, - {"240a:a8b2::/32", "144876"}, - {"240a:af33::/32", "146541"}, - {"2605:5a80:c0a0::/48", "701"}, - {"2a04:a802::/39", "3549"}, - {"2a0c:2f07:f::/48", "206924"}, - {"240e:3be:c000::/37", "140315"}, - {"2620:0:1a70::/48", "23294"}, - {"2001:559:17c::/47", "7016"}, - {"2405:1c0:6731::/45", "55303"}, - {"240a:afef::/32", "146729"}, - {"2600:c02:1020::/48", "27385"}, - {"2600:1006:a100::/43", "6167"}, - {"2600:140f:a::/48", "20940"}, - {"2804:3484::/32", "265463"}, - {"2400:a980:68fe::/47", "133111"}, - {"2401:d800:b850::/40", "7552"}, - {"2001:ce0:2::/48", "4528"}, - {"2606:8d00::/32", "36327"}, - {"2804:1564:3000::/32", "52570"}, - {"2804:3a20::/32", "266072"}, - {"2a01:807::/32", "12430"}, - {"2a01:5041::/48", "202196"}, - {"2a0d:3dc0::/29", "210312"}, - {"2001:559:8031::/48", "33491"}, - {"2804:7d30::/32", "271545"}, - {"2a07:22c0:c100::/40", "64473"}, - {"2001:559:c26b::/48", "33659"}, - {"2001:6d0:4006::/48", "50776"}, - {"2001:43f8:780::/48", "37555"}, - {"2001:4860:4805::/48", "43515"}, - {"2402:8100:21c0::/45", "45271"}, - {"2409:8c28:2909::/35", "56041"}, - {"2600:1404:7401::/32", "20940"}, - {"2606:2800:4032::/47", "14210"}, - {"2404:1c80::/32", "4847"}, - {"2800:4f0:3::/48", "28006"}, - {"2801:96:fff9::/45", "28586"}, - {"2a0a:1800:4::/43", "49915"}, - {"2001:559:c3c6::/48", "33287"}, - {"2607:f088::/32", "1706"}, - {"2804:14c:471::/45", "28573"}, - {"2a02:26f0:16::/44", "20940"}, - {"2a03:e581::/48", "201057"}, - {"2a02:26f7:cf44::/48", "36183"}, - {"2a0c:9a40:1024::/48", "34927"}, - {"2409:8c20:5600::/42", "56046"}, - {"2600:100f:b050::/42", "6167"}, - {"2a02:888:44::/46", "48695"}, - {"2a02:26f7:b786::/47", "20940"}, - {"2a09:f040::/29", "29390"}, - {"2a0b:4d07:4::/48", "44239"}, - {"2a0f:b300:1111::/48", "208200"}, - {"2001:250:3012::/47", "24357"}, - {"2001:559:c194::/48", "33287"}, - {"2001:16a2:3e00::/39", "25019"}, - {"2607:a800:647::/48", "15695"}, - {"2804:ef4:5800::/34", "28642"}, - {"2a0a:54c1:2a::/43", "62240"}, - {"2001:978:2304::/48", "174"}, - {"2400:6280:6280::/48", "132280"}, - {"240a:a415::/32", "143695"}, - {"240a:a844::/32", "144766"}, - {"2a03:6100:6101::/32", "34594"}, - {"2401:d800:9c0::/38", "7552"}, - {"240e:90d:d800::/34", "4134"}, - {"2603:c0e0:2910::/40", "54253"}, - {"2604:d600:1016::/44", "32098"}, - {"2804:1788::/32", "263153"}, - {"2401:32c0::/32", "136176"}, - {"2804:e38::/32", "262942"}, - {"2400:5800::/45", "38712"}, - {"2401:be00:1::/45", "55641"}, - {"2409:896a:6500::/38", "9808"}, - {"2409:8c1e:a930::/33", "9808"}, - {"2804:e30:3c00::/38", "11338"}, - {"2a00:6901:a003::/48", "20926"}, - {"2a0e:b107:df1::/48", "141237"}, - {"2402:800:331d::/42", "7552"}, - {"2407:8000::/31", "9381"}, - {"240a:acf1::/32", "145963"}, - {"2606:2800:5088::/48", "15133"}, - {"2607:f6f0:1001::/48", "394749"}, - {"2a00:b160::/32", "47586"}, - {"2a01:540:7000::/32", "12389"}, - {"2a0a:aa80::/32", "57198"}, - {"2001:559:82ff::/48", "7922"}, - {"2001:67c:2ef0::/48", "15542"}, - {"2001:559:76::/48", "33491"}, - {"2400:6280:139::/48", "132280"}, - {"2409:8043:2c05::/32", "9808"}, - {"2a02:26f0:1a00::/48", "34164"}, - {"2a02:4660::/32", "201975"}, - {"2001:4878:b259::/48", "12222"}, - {"240a:a1bd::/32", "143095"}, - {"2806:2f0:3821::/46", "17072"}, - {"2a01:8fc0::/32", "8913"}, - {"2a02:26f7:f289::/42", "20940"}, - {"2a03:3d60::/29", "35394"}, - {"2001:579:6028::/40", "22773"}, - {"2401:4900:22a0::/41", "45609"}, - {"2409:8c44:b00::/48", "9808"}, - {"240a:acf6::/32", "145968"}, - {"240e:438:4e20::/43", "140647"}, - {"2600:6c10:ffaa::/43", "20115"}, - {"2605:3f80::/32", "393238"}, - {"2620:132:f0fb::/39", "394977"}, - {"2a03:f80:70::/48", "56630"}, - {"2001:3c8:1307::/44", "4621"}, - {"2001:559:83ac::/47", "7922"}, - {"2600:1806:111::/48", "16552"}, - {"2a01:620::/46", "12389"}, - {"2a07:a343:ce30::/44", "9009"}, - {"2001:559:82cc::/48", "33287"}, - {"2408:8956:4e00::/40", "17622"}, - {"240e:cf:9000::/36", "139201"}, - {"2804:3b10::/32", "266127"}, - {"2a00:c740::/32", "48803"}, - {"2a0e:acc0:ac04::/48", "208414"}, - {"2001:559:51f::/48", "33652"}, - {"2401:4900:5d60::/44", "45609"}, - {"2408:8956:efc0::/35", "17622"}, - {"2606:9200:9000::/33", "6428"}, - {"2a03:2880:f15d::/46", "32934"}, - {"2001:250:3445::/48", "138393"}, - {"2001:df2:bc00::/48", "45734"}, - {"240e:44d:4780::/41", "4134"}, - {"2a10:9903:101::/48", "15510"}, - {"2405:8a00:20f4::/39", "55824"}, - {"2800:160:1392::/45", "14259"}, - {"2a00:78c0::/29", "30781"}, - {"2a0a:de80::/32", "206605"}, - {"2804:1ef8::/32", "264457"}, - {"2a02:26f7:ca00::/48", "36183"}, - {"2402:1b40:5000::/37", "7628"}, - {"2402:d000:1061::/45", "9329"}, - {"2408:8345:1200::/32", "4837"}, - {"2607:fb90:4500::/35", "21928"}, - {"2804:4f8:e000::/36", "28263"}, - {"2804:41f8:f008::/38", "267469"}, - {"2806:230:4020::/48", "265594"}, - {"2001:559:8725::/48", "33287"}, - {"2001:fd8:a8::/41", "4775"}, - {"240e:966:a800::/38", "58772"}, - {"2602:80a:7000::/48", "399798"}, - {"2607:8480:8000::/33", "22639"}, - {"2620:132:6000::/48", "21701"}, - {"2804:53b0:4001::/43", "268600"}, - {"2001:559:87de::/48", "13367"}, - {"2604:3200::/32", "21623"}, - {"2606:7100::/35", "21581"}, - {"2a05:f180::/29", "200836"}, - {"2a0e:bf00::/39", "202539"}, - {"2001:448a:50f0::/39", "7713"}, - {"2406:8800:40::/43", "17465"}, - {"2409:806b:1100::/36", "9808"}, - {"2605:f080:700::/40", "62756"}, - {"2a03:77a0::/32", "201085"}, - {"2c0f:fe78::/33", "37239"}, - {"2001:559:246::/48", "33657"}, - {"2001:da8:6033::/37", "23910"}, - {"240a:a7a2::/32", "144604"}, - {"240a:a7ea::/32", "144676"}, - {"2600:1419:4c00::/48", "4230"}, - {"2602:ffc5:164::/48", "212032"}, - {"2a0b:6780::/29", "29262"}, - {"2c0f:f888:8000::/33", "37119"}, - {"2401:d800:b490::/42", "7552"}, - {"240a:a124::/32", "142942"}, - {"240a:a4d2::/32", "143884"}, - {"2605:f440:5602::/41", "21957"}, - {"240a:a4a0::/32", "143834"}, - {"240e:964:f400::/39", "58772"}, - {"2804:5b9c::/32", "268858"}, - {"2a0f:3240::/29", "37200"}, - {"2001:1260:103::/45", "13591"}, - {"2001:1a40:c::/41", "5416"}, - {"240a:aab7::/32", "145393"}, - {"2801:94::/32", "52958"}, - {"2401:3600::/32", "131934"}, - {"2401:fb40::/32", "397086"}, - {"2804:157c::/32", "263390"}, - {"2804:4c6c::/32", "52542"}, - {"2a02:e980:206::/44", "19551"}, - {"2001:559:45f::/48", "7015"}, - {"2001:1248:a46e::/43", "11172"}, - {"2001:1868::/32", "11404"}, - {"2408:8957:5600::/40", "17622"}, - {"2600:6c10:92::/45", "20115"}, - {"2604:4d40:3c00::/39", "213073"}, - {"2804:4044:1160::/32", "265948"}, - {"2806:2f0:320::/47", "22884"}, - {"2a03:b540::/32", "31287"}, - {"2a09:4c0:1e1::/38", "58057"}, - {"2a0a:e202:800b::/48", "33438"}, - {"2001:16a2:3800::/38", "25019"}, - {"2602:fc39:1::/48", "174"}, - {"2806:230:3001::/48", "11888"}, - {"2a02:2878:c000::/34", "42699"}, - {"2001:1248:574b::/42", "11172"}, - {"2001:1560::/32", "34171"}, - {"2806:2a0:200::/40", "28548"}, - {"2a01:56c0::/32", "198864"}, - {"2a02:b20::/32", "29321"}, - {"2401:d800:2d2::/39", "7552"}, - {"240e:44d:6900::/42", "140345"}, - {"2409:8750:300::/37", "56047"}, - {"240a:ab06::/32", "145472"}, - {"240e:438:6220::/43", "140647"}, - {"2603:1000::/25", "8075"}, - {"2402:800:3e01::/43", "7552"}, - {"2409:801e:3008::/48", "24400"}, - {"2a0d:9340:626::/35", "35761"}, - {"2001:67c:13a4::/48", "209579"}, - {"240e:981:b200::/33", "4134"}, - {"2600:1fa0:1080::/44", "16509"}, - {"2801:80:510::/48", "52652"}, - {"2a02:26f7:fb85::/46", "20940"}, - {"2a09:b080::/29", "49191"}, - {"2001:470:2a::/48", "54816"}, - {"2408:8459:cb50::/37", "17816"}, - {"2800:160:1ea8::/45", "14259"}, - {"2804:214:13::/45", "26615"}, - {"2001:579:c640::/39", "22773"}, - {"240a:afb4::/32", "146670"}, - {"2600:141b:c801::/35", "20940"}, - {"2600:370f:3701::/45", "32261"}, - {"2804:3a70::/32", "266089"}, - {"2a02:c6c1:1::/48", "10929"}, - {"2001:4878:158::/48", "12222"}, - {"2409:8904:5f40::/42", "24547"}, - {"2620:0:440::/48", "10146"}, - {"2803:9040::/32", "264821"}, - {"2a00:d98::/32", "30833"}, - {"2a02:26f7:da10::/48", "36183"}, - {"2607:f220:400::/47", "3527"}, - {"2a01:b740:1e00::/32", "714"}, - {"2001:559:861c::/48", "33650"}, - {"2a0f:c640::/48", "34798"}, - {"2402:e280:1100::/48", "134674"}, - {"240e:982:9400::/40", "63838"}, - {"2804:2b04::/32", "265131"}, - {"2a02:26f7:5b::/48", "20940"}, - {"2001:da8:c80c::/48", "23910"}, - {"2408:8956:f240::/40", "17622"}, - {"240a:a1c4::/32", "143102"}, - {"2600:6c38:a9f::/42", "20115"}, - {"2620:0:2b0::/48", "21617"}, - {"2803:d100:9080::/38", "52362"}, - {"2a02:a30:f096::/36", "8926"}, - {"2a0f:25c0:1990::/48", "207077"}, - {"2001:be0::/32", "13005"}, - {"2603:c0f1:2000::/36", "6142"}, - {"2604:2d80:880b::/40", "30036"}, - {"2800:bf0:2a40::/46", "52257"}, - {"2804:34c0::/32", "265477"}, - {"2a06:9d40::/29", "31543"}, - {"240a:a8e7::/32", "144929"}, - {"240e:790::/26", "4134"}, - {"240a:a284::/32", "143294"}, - {"240a:a31d::/32", "143447"}, - {"2600:1404:b000::/48", "35994"}, - {"2804:4c34::/32", "61592"}, - {"2a03:d606::/31", "42487"}, - {"2001:43f8:700::/44", "2018"}, - {"240e:86:8000::/36", "17799"}, - {"2804:1918::/39", "52862"}, - {"2001:500:71::/48", "33071"}, - {"2406:3002:21::/43", "4657"}, - {"2804:1d80:4000::/35", "264374"}, - {"2a01:4200::/30", "21453"}, - {"2a02:26f7:b9c4::/47", "36183"}, - {"2001:559:c4b1::/48", "33491"}, - {"2404:4600:fcf::/32", "10158"}, - {"2406:56c0::/32", "18229"}, - {"240a:aa04::/32", "145214"}, - {"2a01:198::/32", "34225"}, - {"2407:1140::/32", "136336"}, - {"240e:1a:30::/44", "138950"}, - {"2604:d600:1622::/45", "32098"}, - {"2800:bf0:3501::/40", "27947"}, - {"2a01:8a80::/32", "25496"}, - {"2a02:6000::/33", "35130"}, - {"2001:559:c316::/48", "7922"}, - {"2001:1248:57f0::/47", "11172"}, - {"2403:8600:60e0::/47", "45820"}, - {"2620:119:50be::/48", "202745"}, - {"2806:230:401e::/48", "265594"}, - {"2001:468:1f12::/34", "11537"}, - {"2001:5f8:7d03::/48", "30325"}, - {"2600:6c10:c23::/45", "20115"}, - {"2804:14c:8700::/40", "28573"}, - {"2a00:1c78::/48", "25408"}, - {"2a04:8080::/29", "61207"}, - {"2a0f:7480::/29", "212807"}, - {"2001:90c::/30", "12618"}, - {"240a:a362::/32", "143516"}, - {"2a02:aa0::/29", "44034"}, - {"2a02:1390:9000::/40", "21351"}, - {"2001:559:77b::/48", "20214"}, - {"2001:da8:a401::/38", "23910"}, - {"2405:5300::/32", "24255"}, - {"2800:40:29::/46", "16814"}, - {"2a01:4262:1ab::/48", "205235"}, - {"2a0c:95c0::/29", "207509"}, - {"2407:9540::/32", "142435"}, - {"240a:a7a9::/32", "144611"}, - {"2800:bf0:68::/48", "27947"}, - {"2001:559:559::/48", "7922"}, - {"2603:c002:9210::/39", "31898"}, - {"2800:160:1b11::/46", "14259"}, - {"2804:1948::/32", "61784"}, - {"2a06:f4c0::/29", "29596"}, - {"240c:c983::/32", "24355"}, - {"240e:109:8020::/48", "4134"}, - {"2804:34::/34", "28306"}, - {"2a02:26f7:f104::/48", "36183"}, - {"2a04:f580:8090::/48", "4134"}, - {"2c0f:6c00::/40", "51110"}, - {"2001:559:243::/48", "21508"}, - {"2001:1248:56e3::/44", "11172"}, - {"2404:3d80:200::/40", "147297"}, - {"2600:1417:30::/46", "24319"}, - {"2a00:e400::/29", "35258"}, - {"2a03:b8c0:10::/48", "202276"}, - {"2a0a:e5c0:16::/48", "213081"}, - {"2001:559:80ee::/47", "33287"}, - {"2401:d800:7062::/40", "7552"}, - {"240e:978:6000::/40", "137702"}, - {"2602:fb95::/36", "400587"}, - {"2804:2144:3::/39", "52795"}, - {"2c0f:ff28::/32", "33788"}, - {"2409:8a55::/34", "9808"}, - {"2604:55c0:100::/48", "4138"}, - {"2a02:d40:3::/48", "197071"}, - {"2001:67c:1348::/48", "2485"}, - {"2001:ee0:f000::/39", "45899"}, - {"240e:379:1a00::/34", "140330"}, - {"2600:1000:be00::/44", "6167"}, - {"2804:3fc4::/32", "265913"}, - {"2804:7ab4::/39", "271387"}, - {"2a07:3502:10c0::/48", "33915"}, - {"2c0e:4020:a000::/36", "36994"}, - {"2001:559:1ce::/48", "7016"}, - {"2001:df6:4400::/48", "133301"}, - {"2407:bc40::/32", "55899"}, - {"2600:370f:5263::/45", "32261"}, - {"2606:49c0::/32", "399679"}, - {"2804:2da8::/32", "265295"}, - {"2a04:4e40:7430::/41", "54113"}, - {"2001:579:5a5c::/42", "22773"}, - {"2001:718::/29", "2852"}, - {"2001:43a0::/32", "36965"}, - {"2804:5678::/32", "268002"}, - {"2a00:4120:8006::/33", "20804"}, - {"2a03:5ac0::/32", "199587"}, - {"2408:8459:b430::/41", "17622"}, - {"2804:2890::/32", "52731"}, - {"2001:559:c01c::/48", "33657"}, - {"2001:559:c286::/48", "33657"}, - {"2404:bf40:f103::/40", "139084"}, - {"2800:bf0:8164::/48", "27947"}, - {"2a0b:a5c0::/29", "205807"}, - {"2001:16a2:82c0::/42", "25019"}, - {"2404:bf40:a241::/48", "7545"}, - {"2800:3a0:5::/46", "23201"}, - {"2806:370:82b0::/41", "28403"}, - {"2a02:26f7:f489::/42", "20940"}, - {"2001:1a11:b7::/44", "42298"}, - {"2001:4878:27::/48", "12222"}, - {"2a01:a0a0::/48", "35501"}, - {"2001:4408:5900::/38", "4758"}, - {"2408:8256:3776::/44", "17623"}, - {"2620:c6::/48", "63056"}, - {"2a02:38:1111::/48", "59747"}, - {"2a02:2958::/32", "20849"}, - {"2a0c:29c1::/32", "56465"}, - {"2405:a540:1004::/44", "38156"}, - {"2406:f400:80::/44", "38001"}, - {"2a04:9a00:1200::/48", "1136"}, - {"2a0e:8ac0::/29", "203744"}, - {"2001:559:af::/48", "7016"}, - {"2001:559:c4c0::/46", "7922"}, - {"2620:122:8002::/48", "399730"}, - {"2800:160:12d3::/44", "14259"}, - {"2804:5b84:8000::/36", "28329"}, - {"2804:673c:c000::/38", "269615"}, - {"2a06:d180::/29", "51184"}, - {"2804:7c6c::/32", "271495"}, - {"240e:40:8::/48", "58519"}, - {"2604:d600:1650::/44", "32098"}, - {"2620:8f:8000::/48", "396012"}, - {"2a0f:d600:154::/32", "208236"}, - {"2c0f:f390::/32", "37356"}, - {"2001:67c:13dc::/48", "210577"}, - {"2001:4998:15d::/46", "10310"}, - {"2804:d98::/32", "52642"}, - {"240a:ab0e::/32", "145480"}, - {"2a00:dd80:10::/48", "36236"}, - {"2a01:ae20::/32", "47381"}, - {"2a02:c6c1:2::/48", "58061"}, - {"2a02:e340::/29", "50304"}, - {"2c0f:ff40::/26", "10474"}, - {"2402:e280:2232::/45", "134674"}, - {"2602:ff23:1::/36", "63252"}, - {"2605:a404:af2::/45", "33363"}, - {"2606:6680:21::/45", "40676"}, - {"2a02:26f7:e349::/42", "20940"}, - {"2001:1248:965a::/42", "11172"}, - {"240a:aef6::/32", "146480"}, - {"2804:498::/32", "52988"}, - {"2804:2438:2000::/32", "264209"}, - {"2a02:e00:ffe7::/48", "61272"}, - {"2a02:efc0::/29", "56689"}, - {"2a0a:1180::/31", "206746"}, - {"2600:6c54::/30", "20115"}, - {"2602:feb4:60::/44", "25961"}, - {"2a00:c10::/32", "12387"}, - {"2a02:26f7:42::/48", "36183"}, - {"2a05:b680:6::/48", "31017"}, - {"2a0f:91c0::/47", "207843"}, - {"2a10:4646:150::/47", "48732"}, - {"2409:873c::/32", "24444"}, - {"240a:a91a::/32", "144980"}, - {"240a:afcf::/32", "146697"}, - {"2801:0:1c0::/45", "21578"}, - {"2a02:70c0::/32", "29467"}, - {"2a0c:9880::/29", "50763"}, - {"2001:550:2f01::/35", "174"}, - {"2804:3394::/32", "265405"}, - {"2001:559:8206::/48", "7016"}, - {"2801:1c8:234::/40", "19429"}, - {"2804:7bf0::/32", "271464"}, - {"2a01:b740:a04::/48", "6185"}, - {"2a03:720:9::/43", "57073"}, - {"2001:559:12a::/48", "7015"}, - {"2404:bf40:a640::/48", "7545"}, - {"2804:2e9c::/32", "265355"}, - {"2402:e280:1200::/39", "134674"}, - {"2806:230:1033::/48", "11888"}, - {"2a02:20::/32", "9026"}, - {"2001:1b76::/32", "158"}, - {"2400:cb00:170::/48", "13335"}, - {"2a02:26f7:e444::/48", "36183"}, - {"2a0f:9400:72ff::/48", "213163"}, - {"2405:1c0:6451::/46", "55303"}, - {"240e:848:10::/42", "4134"}, - {"2001:1248:5741::/44", "11172"}, - {"2402:c400::/32", "18097"}, - {"2806:230:203d::/48", "11888"}, - {"2a01:8840:d9::/48", "207266"}, - {"2a04:4e40:de00::/48", "54113"}, - {"2001:559:825d::/48", "22909"}, - {"2001:579:a0d4::/39", "22773"}, - {"2402:f180:1::/48", "9293"}, - {"2409:896a:aa00::/39", "9808"}, - {"2409:8a50:d00::/38", "56047"}, - {"240a:a22c::/32", "143206"}, - {"240a:aa5f::/32", "145305"}, - {"2a02:26f7:f6e5::/46", "20940"}, - {"2600:1415:5801::/32", "20940"}, - {"2604:ca00:224::/46", "36492"}, - {"2620:100:9008::/47", "13916"}, - {"2804:55d4::/32", "267959"}, - {"2a01:6ca0::/32", "12703"}, - {"2a0c:b641:457::/48", "208471"}, - {"2001:250:6c3e::/48", "23910"}, - {"2401:d800:b180::/42", "7552"}, - {"2409:8060:2100::/35", "9808"}, - {"2a01:b540::/29", "15600"}, - {"2001:380::/32", "4713"}, - {"2001:df3:d700::/48", "137297"}, - {"240a:ae1b::/32", "146261"}, - {"2a0a:c4c0::/48", "47952"}, - {"2a0b:d440::/29", "204586"}, - {"2001:250:1800::/43", "138441"}, - {"2001:df0:8500::/48", "59128"}, - {"240e:3b2:1200::/39", "4134"}, - {"2603:c0f0:2110::/40", "6142"}, - {"2605:49c0:2::/47", "15094"}, - {"2607:ca80::/32", "395475"}, - {"2804:14d:5800::/42", "28573"}, - {"2a0a:ea80::/29", "206589"}, - {"2001:559:c4d8::/48", "33651"}, - {"2600:1007:a000::/44", "6167"}, - {"2604:a00:102::/35", "19318"}, - {"2a0e:800:ff7f::/48", "208266"}, - {"2001:559:8196::/48", "20214"}, - {"2001:678:29c::/48", "51143"}, - {"2001:1810:40::/35", "14116"}, - {"240e:bf:b8d8::/46", "138387"}, - {"2620:22:c000::/48", "55196"}, - {"2001:67c:2824::/48", "12722"}, - {"2403:6b80:ffff::/48", "2635"}, - {"2409:806c:1100::/34", "9808"}, - {"240a:aaea::/32", "145444"}, - {"2600:c05::/34", "11855"}, - {"2605:7100::/32", "11238"}, - {"2804:6e40::/34", "270584"}, - {"2a07:9480::/29", "9083"}, - {"2a0c:ca80::/30", "34915"}, - {"2804:3084::/32", "264956"}, - {"2a01:41e0::/31", "62336"}, - {"2a04:e800:5019::/48", "57976"}, - {"2001:df3:a480::/48", "137549"}, - {"2603:c0e0:2000::/39", "54253"}, - {"2606:2800:6a08::/46", "15133"}, - {"2606:b700::/32", "26809"}, - {"2620:105:c000::/48", "7767"}, - {"2804:1098::/32", "52766"}, - {"2a00:1d58:c980::/38", "47524"}, - {"2a0f:5701:3507::/44", "206499"}, - {"2401:1c00:3100::/33", "38809"}, - {"2406:2000:1d1::/32", "10310"}, - {"2804:5afc:7000::/36", "268811"}, - {"2604:4cc0:11::/48", "20150"}, - {"2001:559:c33a::/48", "33287"}, - {"2400:2000:d::/46", "17676"}, - {"2400:fc00:8550::/40", "45773"}, - {"2402:e280:2139::/45", "134674"}, - {"2405:f080:e06::/44", "136907"}, - {"2409:8003:2900::/40", "38019"}, - {"2a02:26f7:c30c::/48", "36183"}, - {"2a0a:bb80::/29", "206620"}, - {"2001:559:c204::/48", "7922"}, - {"2405:57c0::/48", "137799"}, - {"2408:8456:240::/39", "17816"}, - {"2803:f00:700::/42", "262182"}, - {"2001:fb0:1000::/46", "9287"}, - {"2001:44b8:604e::/48", "7545"}, - {"2403:9800:6200::/37", "4771"}, - {"2409:8c10::/30", "9808"}, - {"2a01:8840:76::/44", "12041"}, - {"2001:6d0:4001::/46", "52016"}, - {"2409:8080:2ad0::/44", "9808"}, - {"2001:500:88::/48", "16876"}, - {"2001:559:38c::/48", "7922"}, - {"2001:df4:d080::/47", "133145"}, - {"2401:d800:d7c0::/42", "7552"}, - {"240a:a12b::/32", "142949"}, - {"2605:1800::/32", "16863"}, - {"2800:4d0::/34", "7004"}, - {"2804:6d1c::/32", "270513"}, - {"2a0c:2f07:29::/48", "206924"}, - {"2001:12f0:440::/39", "1916"}, - {"240a:a039::/32", "142707"}, - {"2806:10c0:ffff::/48", "8151"}, - {"2a02:26f8::/32", "29551"}, - {"2001:559:180::/48", "33659"}, - {"2400:a980:2400::/40", "133518"}, - {"2a01:acc0::/32", "41083"}, - {"2a07:ce40::/29", "201463"}, - {"2800:300:9060::/40", "27986"}, - {"2a02:26f7:b99d::/46", "20940"}, - {"2400:7400:4b::/43", "38044"}, - {"2405:7f00:9900::/38", "133414"}, - {"2804:3e8:103::/35", "28663"}, - {"2a03:8800:1::/48", "200826"}, - {"2001:559:4da::/48", "33491"}, - {"2001:df5:c100::/48", "137950"}, - {"2001:49f0:d03f::/41", "174"}, - {"2600:6c10:f230::/41", "20115"}, - {"2803:9800:a099::/42", "11664"}, - {"2a00:5d00::/32", "39153"}, - {"2a0a:8380::/29", "33943"}, - {"2407:b700::/32", "58708"}, - {"2607:fdf0:5e67::/44", "8008"}, - {"2a00:7fc0:8000::/48", "49130"}, - {"2a06:7d40::/29", "34428"}, - {"2a10:4cc0::/40", "12843"}, - {"2001:559:874a::/47", "13367"}, - {"240e:108:9c::/35", "4134"}, - {"2605:bb00:1004::/34", "4213"}, - {"2a04:6380::/29", "61231"}, - {"2a0c:9a40:82f0::/44", "148971"}, - {"2400:7400:23::/48", "23736"}, - {"2401:4900:5d6c::/48", "45609"}, - {"2600:4c00:200::/37", "63410"}, - {"2804:18:5010::/42", "26599"}, - {"2a10:cc40:150::/46", "209669"}, - {"2001:559:57f::/48", "33660"}, - {"240a:ae05::/32", "146239"}, - {"2804:41e0::/32", "267462"}, - {"2a00:4802:3210::/39", "8717"}, - {"2a01:abc0::/32", "12709"}, - {"2001:559:843e::/48", "7922"}, - {"2001:4b3a::/32", "25220"}, - {"240e:44d:3180::/41", "4134"}, - {"2804:4028::/32", "265938"}, - {"2a03:3740::/32", "43350"}, - {"2405:dc00:8000::/33", "4804"}, - {"2406:4300::/32", "133398"}, - {"2620:125:9070::/48", "397415"}, - {"2800:160:204e::/42", "14259"}, - {"2804:2818:b::/32", "263940"}, - {"2804:4100::/32", "265997"}, - {"2804:858c:8000::/33", "272586"}, - {"2a02:23f0::/32", "20771"}, - {"2a0b:de02:48::/48", "207486"}, - {"2001:a60::/29", "8767"}, - {"2001:43f8:1140::/47", "10310"}, - {"2400:89c0:6100::/48", "37936"}, - {"2402:5300:440::/39", "45903"}, - {"2a00:d80::/29", "35518"}, - {"2a00:1ca8:9d::/41", "50673"}, - {"2a02:26f0:34::/47", "20940"}, - {"2001:559:8421::/48", "33659"}, - {"2403:680::/32", "134723"}, - {"240a:a059::/32", "142739"}, - {"2620:22::/48", "53355"}, - {"2a00:1a58::/32", "20904"}, - {"2a04:8140::/48", "60781"}, - {"2001:da8:2023::/48", "23910"}, - {"2001:44b8:24::/48", "7545"}, - {"240a:a8c1::/32", "144891"}, - {"2804:98c::/32", "263099"}, - {"2001:4878:b102::/48", "12222"}, - {"2408:8459:ec10::/42", "17623"}, - {"2600:380:e400::/44", "20057"}, - {"2600:9000:108e::/47", "16509"}, - {"2804:610::/32", "262565"}, - {"2804:7444::/32", "270970"}, - {"2a02:878:a801::/48", "42632"}, - {"2001:678:5c4::/48", "48534"}, - {"2408:8256:3d95::/48", "17816"}, - {"2620:0:2be0::/48", "19106"}, - {"2620:104:2031::/46", "40185"}, - {"2a00:86c0:1043::/43", "2906"}, - {"2a07:4a80::/29", "212238"}, - {"2001:678:6a0::/48", "207647"}, - {"2401:b780:5012::/32", "45410"}, - {"240a:a2cc::/32", "143366"}, - {"240e:44d:3740::/42", "140353"}, - {"2804:4a0::/32", "52989"}, - {"2a04:4fe0::/30", "200187"}, - {"2a07:b300::/29", "213101"}, - {"2402:6800::/50", "22822"}, - {"2405:6400:2000::/35", "23678"}, - {"2409:804e:2100::/35", "9808"}, - {"2600:d07:4000::/28", "20161"}, - {"2605:dd40:8270::/37", "398549"}, - {"2a02:598:4445::/32", "43037"}, - {"2a04:bb40::/29", "62031"}, - {"2001:13b0:800f::/43", "3549"}, - {"2804:14c:c684::/43", "28573"}, - {"2a02:26f7:eb4d::/46", "20940"}, - {"2a02:a200::/27", "33915"}, - {"2407:4e40::/48", "142040"}, - {"2607:f830::/32", "1998"}, - {"2a0f:7cc0::/29", "34591"}, - {"2a0f:a900::/29", "15391"}, - {"2803:9800:94c1::/46", "11664"}, - {"2a00:13b8::/32", "34279"}, - {"2001:67c:297c::/48", "3209"}, - {"2600:e000:400::/40", "22995"}, - {"2607:1900::/32", "14140"}, - {"2806:2f0:83e3::/37", "17072"}, - {"2a0f:9400:735f::/48", "14570"}, - {"2001:67c:20e0::/48", "34225"}, - {"2406:daa0:2020::/44", "16509"}, - {"2c0f:f578::/42", "24691"}, - {"2402:3b80::/32", "134128"}, - {"2409:8728::/33", "56041"}, - {"2607:c200:1106::/48", "6461"}, - {"2804:fa8::/32", "53050"}, - {"2804:19e0::/32", "61824"}, - {"2804:3588::/32", "266292"}, - {"2a07:8740::/29", "34549"}, - {"2c0f:fff0::/32", "37125"}, - {"2001:559:86d6::/44", "7922"}, - {"2001:1208::/32", "3905"}, - {"2404:3d00:412e::/43", "3573"}, - {"240e:980:8300::/40", "4811"}, - {"2804:5034::/32", "268375"}, - {"2001:13f8::/32", "27817"}, - {"2800:bf0:103::/48", "27947"}, - {"2804:14c:87cb::/42", "28573"}, - {"2a02:26f7:ec55::/44", "20940"}, - {"240a:a652::/32", "144268"}, - {"2604:4580:202::/47", "26375"}, - {"2804:4164::/32", "267430"}, - {"2a11:f400::/48", "197116"}, - {"2001:579:4139::/41", "22773"}, - {"240a:a4e2::/32", "143900"}, - {"2804:49b0::/32", "267197"}, - {"2a0c:9a40:82b0::/48", "1239"}, - {"2001:df2:5a80::/48", "139866"}, - {"2001:fd8:18c0::/39", "4775"}, - {"2806:20d:163b::/45", "32098"}, - {"2001:550:2605::/48", "396509"}, - {"2402:800:99d3::/44", "7552"}, - {"2604:880:38f::/43", "29802"}, - {"2605:9b00::/32", "32220"}, - {"2607:f170::/43", "6364"}, - {"2a09:f780:1::/48", "41864"}, - {"2620:cb:6::/47", "3549"}, - {"2401:d800:c30::/41", "7552"}, - {"2604:6600:ea00::/35", "40676"}, - {"2806:2f0:5161::/46", "17072"}, - {"2a02:587:8500::/33", "6799"}, - {"2a02:2e02:9570::/40", "12479"}, - {"2a0c:5247:7000::/36", "59504"}, - {"2800:b70:400::/48", "262191"}, - {"2801:1fc:28::/48", "27951"}, - {"240e:44d:4600::/41", "140345"}, - {"2804:7dcc::/32", "271583"}, - {"2a01:280:370::/48", "3301"}, - {"2a07:78c0::/29", "211769"}, - {"2001:559:4a3::/48", "33657"}, - {"240a:acc0::/32", "145914"}, - {"2001:c20:48bb::/41", "3758"}, - {"2001:df4:d500::/48", "135905"}, - {"2600:6c38:74e::/42", "20115"}, - {"2804:1818::/32", "262657"}, - {"2806:2f0:4221::/46", "17072"}, - {"2602:feb4:100::/44", "25961"}, - {"2606:fc00::/32", "12097"}, - {"2a02:f48:2100::/40", "44515"}, - {"2a02:16f0::/32", "34928"}, - {"2001:67c:2c14::/48", "31424"}, - {"2001:67c:2d8c::/48", "33965"}, - {"2001:df0:54c0::/48", "149347"}, - {"2404:160::/32", "10030"}, - {"2602:fe12:11::/48", "62707"}, - {"2606:2800:c::/48", "15133"}, - {"2804:75e4::/32", "271076"}, - {"2a00:1ed8::/29", "41073"}, - {"2a00:dd00:7::/32", "212573"}, - {"2a03:47c0:2481::/32", "21277"}, - {"240a:a86a::/32", "144804"}, - {"2804:4200::/32", "267471"}, - {"2001:dc8:2001::/48", "131131"}, - {"2604:1d40:2000::/36", "30612"}, - {"2a0e:8f00:f103::/45", "49933"}, - {"2800:160:1616::/42", "14259"}, - {"2c0f:f3a8::/32", "37308"}, - {"2001:468:280a::/45", "11537"}, - {"2001:559:c1f5::/48", "20214"}, - {"2001:67c:2570::/48", "13030"}, - {"2001:4878:2007::/44", "12222"}, - {"2408:8957:da40::/40", "17622"}, - {"240e:357:5c00::/34", "134419"}, - {"2804:14d:2a2d::/41", "28573"}, - {"2804:1e90:a180::/33", "264436"}, - {"2605:2800:200::/35", "6922"}, - {"2620:132:f000::/40", "394977"}, - {"2804:14c:878e::/43", "28573"}, - {"2804:2cd4:b0::/41", "265246"}, - {"2804:2e44::/32", "265335"}, - {"2806:2f0:8021::/46", "17072"}, - {"2a07:5201::/47", "213208"}, - {"2401:8800:11::/40", "17439"}, - {"2406:f680::/47", "132298"}, - {"240a:ac31::/32", "145771"}, - {"2804:164c:cc::/42", "263280"}, - {"2a0d:7a40:2::/48", "60254"}, - {"2001:df5:fc00::/48", "134249"}, - {"2409:8c54:5100::/37", "9808"}, - {"2600:370f:73c1::/45", "32261"}, - {"2a04:dc80::/29", "49788"}, - {"2602:fd31::/36", "398568"}, - {"2602:fe20::/36", "32444"}, - {"2603:c0fa::/35", "20054"}, - {"2800:bf0:2c7::/44", "52257"}, - {"2804:70f0::/32", "270757"}, - {"2a01:8560::/32", "25376"}, - {"2001:559:c44c::/48", "7922"}, - {"2401:d800:f950::/42", "7552"}, - {"2409:8904:59b0::/38", "24547"}, - {"240c:cd22:cd23::/24", "23910"}, - {"240e:67f:8400::/38", "140329"}, - {"2604:77c0::/32", "19156"}, - {"2605:6840::/39", "398041"}, - {"2804:3090::/32", "264961"}, - {"2a03:68c0:2b00::/32", "61327"}, - {"2a07:8080::/32", "62296"}, - {"2a0a:8d40::/29", "60987"}, - {"2001:67c:5f8::/48", "198089"}, - {"2001:16d8:c014::/36", "16150"}, - {"2402:4440:9c81::/46", "24423"}, - {"240a:a2ee::/32", "143400"}, - {"2600:bc02::/24", "54600"}, - {"2a02:5740:24::/48", "58065"}, - {"2001:559:10a::/48", "7725"}, - {"240a:a87d::/32", "144823"}, - {"2607:fc48:1018::/48", "40009"}, - {"2a02:88d:8301::/30", "47794"}, - {"2a07:a343:7870::/44", "9009"}, - {"2001:559:c1f2::/48", "33650"}, - {"2400:7400:e02d::/48", "23736"}, - {"2620:116:8084::/48", "27281"}, - {"2804:1280::/32", "263480"}, - {"2001:559:81ce::/48", "7016"}, - {"2400:9380:9240::/47", "4809"}, - {"2406:8600:efae::/48", "24236"}, - {"2804:3ab4:7100::/32", "266104"}, - {"2a01:5ec0:5000::/36", "44244"}, - {"2a06:f7c0::/29", "202505"}, - {"2001:559:308::/47", "33491"}, - {"2001:559:c08f::/48", "33656"}, - {"2001:67c:28d0::/48", "212415"}, - {"2001:4b60:101::/32", "28857"}, - {"2406:a040:ff01::/48", "55688"}, - {"240e:45c:9400::/40", "131285"}, - {"2804:32dc::/32", "262322"}, - {"2a02:7a0::/36", "12586"}, - {"2a0c:d980::/29", "35684"}, - {"2409:896a:a000::/39", "9808"}, - {"240a:a483::/32", "143805"}, - {"2804:2c20::/32", "265197"}, - {"240a:a024::/32", "142686"}, - {"2804:6954::/32", "270263"}, - {"2804:73e8::/32", "270945"}, - {"2a00:cb20:2200::/35", "60266"}, - {"2a01:8460::/32", "199770"}, - {"2001:400:a000:12::/33", "293"}, - {"240e:438:5020::/43", "140647"}, - {"2804:908::/36", "263047"}, - {"2a00:a040:400::/29", "12849"}, - {"2001:559:83ed::/48", "33652"}, - {"2600:1900:4120::/44", "396982"}, - {"2a01:ac::/32", "39122"}, - {"2a03:bbc0::/32", "61212"}, - {"2a11:fe80:fab7::/44", "209209"}, - {"2c0f:fc88:3f::/31", "36992"}, - {"2405:201:f400::/36", "55836"}, - {"2602:fed3:1::/45", "19969"}, - {"2606:a840::/32", "55091"}, - {"2402:800:35ee::/38", "7552"}, - {"2600:5400:e101::/36", "19108"}, - {"2804:5450::/32", "268642"}, - {"2001:480:ac::/46", "668"}, - {"2403:300:a11::/46", "714"}, - {"2602:fd38::/36", "394037"}, - {"2a07:6f44::/40", "39083"}, - {"2600:6c38:b78::/37", "20115"}, - {"2603:c0f9:4000::/36", "20054"}, - {"2604:db00::/32", "32233"}, - {"2804:172c::/32", "263129"}, - {"2a02:21a8::/47", "61323"}, - {"2001:480:162::/38", "668"}, - {"2001:559:8039::/48", "7922"}, - {"2001:7f8:10::/48", "24796"}, - {"240a:a5a9::/32", "144099"}, - {"2a02:4c80::/32", "41421"}, - {"2a03:8c80::/29", "31319"}, - {"2a05:a640::/29", "12859"}, - {"2001:559:8046::/47", "7922"}, - {"2605:3380:446d::/43", "12025"}, - {"2620:98:2000::/48", "398894"}, - {"2a02:c800::/41", "43930"}, - {"2a0a:f540::/29", "210759"}, - {"2001:559:8688::/48", "7015"}, - {"2401:d800:d4b0::/41", "7552"}, - {"240a:a12e::/32", "142952"}, - {"240a:a19b::/32", "143061"}, - {"2604:d600:2801::/32", "32098"}, - {"2804:1c98::/32", "61664"}, - {"2a00:4802:1a00::/40", "13124"}, - {"2a02:26f7:ed49::/42", "20940"}, - {"2403:6380:40::/46", "212237"}, - {"2407:9240:4000::/39", "62853"}, - {"2409:8c4c:25::/36", "9808"}, - {"2a0b:7e00:400::/35", "198622"}, - {"2001:4878:4220::/48", "12222"}, - {"2402:800:3d55::/42", "7552"}, - {"2801:19:6800::/48", "19429"}, - {"2001:4c00:893b::/48", "197835"}, - {"2409:8751:500::/38", "56047"}, - {"2803:a360::/32", "269783"}, - {"2a02:26f7:117::/44", "20940"}, - {"2001:250:6810::/48", "24368"}, - {"2001:559:83bd::/48", "7015"}, - {"2001:c38:3001::/46", "9335"}, - {"2804:1684:9100::/33", "53169"}, - {"2804:3268::/32", "265076"}, - {"2804:40a4::/32", "265972"}, - {"2806:2f0:9f83::/33", "17072"}, - {"2a00:cb8:353::/48", "15695"}, - {"2602:fed2:7109::/48", "53356"}, - {"2801:80:1260::/44", "263857"}, - {"2804:4384::/32", "267575"}, - {"2804:6c78::/32", "270470"}, - {"2001:500:e0::/47", "207266"}, - {"2408:840c:7b00::/40", "17621"}, - {"2620:53:e000::/48", "394626"}, - {"2803:6760::/32", "269866"}, - {"2804:7d6c::/32", "271560"}, - {"2001:4878:1e0::/44", "35994"}, - {"2405:9800:b12a::/37", "45430"}, - {"2600:1402:e001::/35", "20940"}, - {"2806:230:600e::/48", "265594"}, - {"2806:250:17::/44", "28509"}, - {"2a00:79e0:102::/37", "45566"}, - {"240a:a9db::/32", "145173"}, - {"2a02:aec0:5::/44", "57363"}, - {"2a02:cb80:1040::/48", "43766"}, - {"2806:267:1501::/48", "13999"}, - {"2a00:e58::/32", "9022"}, - {"2a05:1844::/30", "59866"}, - {"2402:a0c0:3::/45", "137922"}, - {"2800:482:400a::/48", "14080"}, - {"2803:1800::/32", "27831"}, - {"2804:330c::/32", "265113"}, - {"2a01:802::/29", "3209"}, - {"2a05:b0c4:1::/48", "198412"}, - {"2001:250:5804::/48", "23910"}, - {"2408:8756:e90::/44", "136958"}, - {"2a02:26f7:d604::/48", "36183"}, - {"2a06:8e40::/29", "15083"}, - {"2a0c:5247:2000::/36", "208861"}, - {"2c0f:ea68::/32", "37697"}, - {"2405:8180::/36", "135478"}, - {"2408:872f::/27", "4837"}, - {"2602:fd92:f0c::/48", "210348"}, - {"2804:70e8::/32", "270755"}, - {"2a02:2878::/33", "42699"}, - {"2a09:7ac0::/32", "39679"}, - {"2a0d:8400::/32", "56630"}, - {"2001:df3::/48", "132688"}, - {"2402:800:51d3::/44", "7552"}, - {"2404:8000:102d::/43", "17451"}, - {"2606:2800:4213::/48", "14153"}, - {"2620:0:a12::/47", "71"}, - {"2001:250:282f::/38", "23910"}, - {"2804:6980::/32", "270274"}, - {"2806:2f0:4601::/46", "17072"}, - {"2a00:9540::/32", "49974"}, - {"2001:559:c1b6::/47", "7922"}, - {"2404:75c0::/32", "35280"}, - {"2404:b000::/36", "9822"}, - {"2606:fe80:10::/44", "13354"}, - {"2607:f4e8:5::/48", "55429"}, - {"2800:5f0::/45", "22724"}, - {"2804:1598::/32", "263397"}, - {"2806:2f0:9d21::/46", "17072"}, - {"2a03:280::/32", "21211"}, - {"2001:410:a01d::/40", "8111"}, - {"2605:a404:c7::/42", "33363"}, - {"2a01:300:6a::/43", "9009"}, - {"2804:1cf8::/32", "61686"}, - {"2a01:5b0:4::/48", "8561"}, - {"2a09:9fc0::/29", "209318"}, - {"240e:982:d700::/40", "4134"}, - {"2604:1f80::/32", "54412"}, - {"2604:4d40:7cb9::/48", "399196"}, - {"2a04:13c1::/32", "61049"}, - {"2001:67c:28dc::/48", "28674"}, - {"2402:4700::/32", "17931"}, - {"2401:d800:5360::/40", "7552"}, - {"2409:8914:4400::/39", "56044"}, - {"240a:a113::/32", "142925"}, - {"240a:a162::/32", "143004"}, - {"2600:380:d010::/38", "7018"}, - {"2a04:92c0::/31", "62240"}, - {"2a0d:3c47::/32", "25369"}, - {"2001:559:c37c::/48", "22317"}, - {"2405:2700::/32", "24270"}, - {"2405:f740::/32", "59253"}, - {"2408:8956:3800::/40", "17622"}, - {"240e:980:2300::/40", "58519"}, - {"2602:ffc5:145::/48", "203027"}, - {"2607:f250:c020::/47", "7046"}, - {"2804:7200::/32", "270826"}, - {"2a0a:b680::/29", "51815"}, - {"2a0f:dc40::/29", "205185"}, - {"240e:965:5800::/32", "4134"}, - {"2801:80:3840::/48", "269675"}, - {"2804:5508::/32", "268685"}, - {"2804:614c::/32", "269223"}, - {"2406:840:10::/45", "139317"}, - {"240a:a403::/32", "143677"}, - {"2607:ff28:6000::/32", "62904"}, - {"2804:5784::/32", "268069"}, - {"2a01:6240:1a::/29", "58273"}, - {"2a02:26f0:ce01::/40", "20940"}, - {"2a04:2dc0:4::/48", "39216"}, - {"2a05:1500:100::/46", "48635"}, - {"2404:3d00:4060::/46", "3573"}, - {"2409:40f4:2000::/22", "55836"}, - {"2a00:13f8:fffc::/48", "13055"}, - {"2001:250:5863::/48", "24363"}, - {"2001:1998:600::/44", "16787"}, - {"2402:800:3a55::/42", "7552"}, - {"2600:1480:3::/37", "20940"}, - {"2a0f:b80::/29", "34549"}, - {"2001:418:1401:8::/59", "2914"}, - {"2001:559:8364::/48", "7015"}, - {"2400:3000::/32", "7527"}, - {"2401:7500:1111::/48", "33480"}, - {"240a:a564::/32", "144030"}, - {"2604:5500:f800::/38", "19165"}, - {"2001:550:1604::/48", "395730"}, - {"2405:1a00::/32", "24492"}, - {"240a:a8b7::/32", "144881"}, - {"2804:61c8::/32", "269256"}, - {"2a00:5540:5015::/32", "50763"}, - {"2a01:667:500::/32", "48951"}, - {"2804:661c::/32", "269534"}, - {"240a:a42a::/32", "143716"}, - {"2600:9000:21ae::/41", "16509"}, - {"2804:5e98::/32", "269043"}, - {"2a0d:ed40::/32", "209985"}, - {"2801:11:6800::/48", "3816"}, - {"2804:dc8::/32", "28636"}, - {"2001:559:c22c::/48", "13367"}, - {"2401:4640::/32", "18259"}, - {"2610:a0::/47", "7786"}, - {"2a02:26f7:cd54::/47", "36183"}, - {"2001:559:475::/48", "33659"}, - {"2405:1c0:6a71::/48", "55303"}, - {"2c0f:fe40::/32", "30844"}, - {"2401:d800:d960::/40", "7552"}, - {"2409:8a54:c800::/34", "56040"}, - {"2606:40c0::/29", "7018"}, - {"2806:261::/48", "13999"}, - {"2a00:b700::/47", "51659"}, - {"2a02:26f7:f88c::/48", "36183"}, - {"240e:3b5:c000::/37", "140315"}, - {"2803:ae40::/32", "27928"}, - {"2806:2f0:83a3::/41", "17072"}, - {"2001:559:d0::/48", "33651"}, - {"2001:67c:2700::/48", "43382"}, - {"2a12:c380::/29", "201709"}, - {"2405:9d80::/32", "45538"}, - {"2a00:7a80::/32", "34767"}, - {"2a04:2c00::/29", "6876"}, - {"2a0e:b107:1480::/48", "57401"}, - {"2001:44b8:30cd::/48", "4739"}, - {"2806:230:4033::/48", "11888"}, - {"2a02:26f7:e348::/48", "36183"}, - {"2401:401::/32", "132873"}, - {"240e:a7:7fdb::/45", "140517"}, - {"2604:b900::/33", "11042"}, - {"2804:e94:4c0::/39", "262468"}, - {"2001:559:c16b::/48", "33491"}, - {"2001:678:cf4::/48", "213400"}, - {"2405:6800:2000::/37", "18207"}, - {"2602:fdac:10::/48", "397665"}, - {"2804:c30::/32", "28284"}, - {"2a01:aea0:df2::/48", "42473"}, - {"2001:559:849c::/48", "7725"}, - {"2400:fc00:87c0::/43", "45773"}, - {"2607:fb91:7a00::/32", "21928"}, - {"2803:5c80:5591::/48", "64114"}, - {"2804:5460::/32", "268646"}, - {"2a02:26f7:e8c8::/48", "36183"}, - {"2001:559:47::/48", "33659"}, - {"240e:438:6440::/38", "4134"}, - {"2603:f950::/26", "397165"}, - {"2605:9780:1e00::/39", "393544"}, - {"2804:680:c01::/38", "262589"}, - {"2a06:ac80::/48", "205427"}, - {"2a0b:1940::/47", "42411"}, - {"2a0f:c300::/29", "202543"}, - {"2001:67c:1fc::/48", "43462"}, - {"2001:df1:be00::/48", "24541"}, - {"2001:df6:ed00::/48", "134078"}, - {"2408:8459:e030::/41", "17622"}, - {"2409:8704:9b00::/33", "24547"}, - {"2804:3f10:8101::/38", "262566"}, - {"2a07:6fc0:10::/44", "200462"}, - {"2401:9700:2000::/40", "45498"}, - {"240a:ae63::/32", "146333"}, - {"2a05:f507:5::/41", "13443"}, - {"240e:45:8000::/28", "4134"}, - {"2a01:c50e:9c00::/34", "12479"}, - {"2a02:4840:1000::/48", "52048"}, - {"2a0e:a440::/29", "208429"}, - {"2001:559:80ab::/48", "33652"}, - {"2804:2998::/32", "264024"}, - {"2a02:ec00::/29", "25540"}, - {"2001:4198::/32", "25525"}, - {"2600:2108::/34", "54858"}, - {"2803:cc60::/32", "267846"}, - {"2804:591c::/42", "28370"}, - {"2a0a:d840::/29", "42383"}, - {"2a0b:4340:90::/48", "205610"}, - {"240e:27f::/46", "134773"}, - {"2606:2800:4a64::/46", "15133"}, - {"2604:180::/46", "3842"}, - {"2804:14d:ba00::/41", "28573"}, - {"2a0b:cdc7::/32", "35790"}, - {"2a0d:fec0:179::/48", "47481"}, - {"2a0e:97c0:40e::/48", "59936"}, - {"2a0e:b107:f65::/48", "207466"}, - {"2409:805b:2905::/48", "9808"}, - {"2409:8904:2a40::/39", "24547"}, - {"240a:ac49::/32", "145795"}, - {"2a0e:2e80::/29", "60255"}, - {"2400:ca07:f036::/36", "23688"}, - {"2607:f590::/48", "46558"}, - {"2a02:26f7:d7c1::/46", "20940"}, - {"2001:678:b4c::/48", "50643"}, - {"2001:df5:2c00::/48", "59115"}, - {"2402:800:5ab7::/41", "7552"}, - {"240a:a586::/32", "144064"}, - {"2803:c240:1100::/36", "41095"}, - {"2804:82bc::/32", "272537"}, - {"2a0e:dc40::/29", "208315"}, - {"2a11:fb00::/29", "400177"}, - {"2001:559:c22f::/43", "7922"}, - {"2001:43f8:b20::/48", "327974"}, - {"2408:8956:7a00::/40", "17622"}, - {"2804:2e78::/35", "28213"}, - {"2806:230:6014::/48", "265594"}, - {"2a10:db00::/32", "42609"}, - {"2001:559:8190::/48", "7015"}, - {"240e:1:a800::/33", "4134"}, - {"240e:983:1e06::/48", "4816"}, - {"2604:d600:152e::/43", "32098"}, - {"2804:6884::/32", "269698"}, - {"2806:3a4::/32", "265623"}, - {"2a00:dcc7:2200::/40", "48611"}, - {"2001:559:c462::/48", "13367"}, - {"2803:9be0:ff::/48", "174"}, - {"2a02:26f7:d780::/48", "36183"}, - {"2a03:da0::/32", "201782"}, - {"2001:559:c20e::/48", "33650"}, - {"2001:1388:70c2::/45", "6147"}, - {"2401:4900:4700::/42", "45609"}, - {"2407:cdc0:e004::/48", "38136"}, - {"2804:14d:2ca1::/41", "28573"}, - {"2804:16d8:1d00::/46", "262729"}, - {"2a00:4800:e0::/44", "13124"}, - {"2a00:4802:4e30::/39", "8717"}, - {"2001:4830:c211::/39", "27552"}, - {"2a03:b8c0::/44", "202276"}, - {"2001:440:1878::/47", "1878"}, - {"2001:559:8697::/48", "33650"}, - {"2406:9a00::/32", "17649"}, - {"2407:3e00:a000::/48", "9911"}, - {"2a02:21d0::/32", "49677"}, - {"2a02:26f7:c6c6::/47", "20940"}, - {"2a07:58c0::/29", "203018"}, - {"2001:559:7b1::/48", "33651"}, - {"2404:6ac0::/32", "138619"}, - {"2404:8000:8c::/43", "17451"}, - {"240a:a55e::/32", "144024"}, - {"2804:20b4::/32", "264509"}, - {"2a0b:7e80::/55", "43372"}, - {"2a0c:af00:be52::/48", "205321"}, - {"2403:8080::/32", "17964"}, - {"2408:8256:3b80::/44", "17623"}, - {"2408:8456:6e00::/42", "17622"}, - {"2408:8752::/32", "4837"}, - {"2600:6c7f:9310::/44", "20115"}, - {"2804:56a4::/32", "28276"}, - {"2a02:26f7:de88::/48", "36183"}, - {"2a0d:8600::/29", "205185"}, - {"2001:559:8671::/46", "7922"}, - {"2001:4878:c259::/48", "2856"}, - {"2402:800:9b55::/42", "7552"}, - {"2404:160:a440::/33", "10030"}, - {"240e:44d:2980::/41", "4134"}, - {"2600:c09::/32", "12178"}, - {"2604:4580::/38", "26375"}, - {"2804:4140::/33", "267423"}, - {"2804:5f10:9000::/33", "269074"}, - {"2a02:2270::/34", "43939"}, - {"2a09:9540::/48", "60328"}, - {"2804:b4:d000::/34", "28294"}, - {"2804:734c::/32", "270906"}, - {"2a04:2f81:4::/47", "16509"}, - {"2401:4900:33a0::/41", "45609"}, - {"2607:f038:4020::/34", "21527"}, - {"2607:f3f8:5000::/34", "17378"}, - {"2607:f6f0:5000::/48", "27224"}, - {"2620:52:4::/47", "22360"}, - {"2620:109:c003::/48", "40793"}, - {"2804:ae8::/48", "262990"}, - {"2a04:88c6::/31", "205544"}, - {"2a0b:31c0:1::/45", "205726"}, - {"2001:250:6418::/48", "24367"}, - {"2600:1017:b800::/42", "22394"}, - {"2801:162::/48", "13489"}, - {"2804:25ec::/32", "264309"}, - {"2804:53e0:8010::/39", "28258"}, - {"2a02:26f7:f3::/45", "36183"}, - {"2a02:26f7:ec40::/48", "36183"}, - {"2803:cae0:8010::/48", "27951"}, - {"2804:14d:da00::/40", "28573"}, - {"2a00:1c3e:96::/44", "48519"}, - {"2001:559:754::/48", "7016"}, - {"2a01:42c0::/32", "208966"}, - {"2408:8459:ba50::/37", "17816"}, - {"2408:8956:c100::/40", "17816"}, - {"2604:d600:1589::/43", "32098"}, - {"2800:160:2ce6::/38", "14259"}, - {"2a02:26f7:efc4::/48", "36183"}, - {"2001:559:8440::/48", "7015"}, - {"2800:4f0:b::/48", "28006"}, - {"2804:4bc::/33", "262462"}, - {"2804:b2c::/32", "52946"}, - {"2a07:22c1:10::/47", "212856"}, - {"2c0f:fbf8:210::/29", "32653"}, - {"2400:a980:60ff::/48", "133512"}, - {"2001:c38:9069::/40", "9931"}, - {"2001:4878:8000::/48", "12222"}, - {"2409:8904:caa0::/39", "24547"}, - {"2409:8c28:7de1::/32", "56041"}, - {"2620:8e:e000::/48", "398838"}, - {"2804:3d8c::/32", "266538"}, - {"2001:559:82e7::/48", "33650"}, - {"2804:35f0::/33", "266316"}, - {"2804:3820::/32", "266458"}, - {"2a0e:97c0:371::/48", "139989"}, - {"2409:8028:100::/37", "9808"}, - {"2804:56c8::/32", "268023"}, - {"2a00:f4a0::/29", "20910"}, - {"240e:3bd:3e00::/33", "140308"}, - {"2801:c0:3::/48", "16596"}, - {"2a07:f980:2::/47", "26338"}, - {"2a0b:e181::/40", "198605"}, - {"2001:67c:2a10::/48", "200924"}, - {"240e:45c:9600::/34", "131285"}, - {"2602:fc74::/48", "13768"}, - {"2804:314:4034::/32", "61568"}, - {"2001:67c:2a00::/48", "57381"}, - {"2401:4900:900::/41", "45609"}, - {"2a02:2498:257b::/48", "13213"}, - {"2001:4878:8225::/48", "12222"}, - {"2400:eb40:1::/48", "14821"}, - {"2a00:1728:a::/48", "60230"}, - {"2a02:2430:40::/42", "59491"}, - {"2a02:26f7:bb04::/47", "36183"}, - {"2a0b:b86:fd::/48", "3280"}, - {"2001:559:8746::/48", "33650"}, - {"2001:1218:6034::/47", "278"}, - {"2803:c1a0::/32", "267693"}, - {"2804:79f8::/32", "271339"}, - {"2a01:8840:f8::/48", "12041"}, - {"2a02:888:150::/48", "48695"}, - {"2a0e:8f02:f004::/48", "213031"}, - {"2001:470:51::/45", "6939"}, - {"2400:6280:147::/44", "132280"}, - {"2607:c000::/32", "5645"}, - {"2804:2c58:1210::/39", "265211"}, - {"2a01:6480:b::/45", "29049"}, - {"2a09:2900:8::/48", "212710"}, - {"2400:cb00:291::/46", "13335"}, - {"2407:7900:1000::/40", "58955"}, - {"240c:ca1c::/26", "23910"}, - {"2600:1415:400::/48", "24319"}, - {"2604:a840::/46", "6233"}, - {"2607:fbd0::/32", "19872"}, - {"2607:fdc8:c::/47", "30036"}, - {"2a00:f980::/32", "21293"}, - {"2a03:db80:4425::/36", "680"}, - {"2a0d:fec0:177::/48", "47481"}, - {"2001:559:53c::/48", "21508"}, - {"2001:67c:2b04::/48", "28771"}, - {"2600:1407:1d::/48", "20940"}, - {"2605:dd40:8cc0::/38", "398549"}, - {"2804:16f0:8000::/33", "263109"}, - {"2806:2b0::/32", "22566"}, - {"2a07:2c00::/29", "44103"}, - {"2a11:2bc0::/29", "56485"}, - {"240a:a14a::/32", "142980"}, - {"2620:1ec:2a::/43", "8075"}, - {"2804:2fd8::/32", "264915"}, - {"2804:5f78::/32", "269102"}, - {"2001:678:3b4::/48", "49855"}, - {"2408:8456:c440::/39", "17816"}, - {"2409:8c85:aa39::/41", "9808"}, - {"2001:1900:235c::/46", "10753"}, - {"2602:801:300a::/45", "6556"}, - {"2607:b00::/32", "53834"}, - {"2a02:2e02:6d0::/36", "12479"}, - {"2a0e:b101:301::/48", "49459"}, - {"2001:559:8f::/48", "7015"}, - {"2001:559:133::/48", "33287"}, - {"2403:300:a0f::/43", "714"}, - {"2405:9800:ba81::/39", "45430"}, - {"240e:950:5000::/36", "134419"}, - {"2804:2ac0::/32", "264092"}, - {"2804:6a18::/32", "270312"}, - {"2a00:72e0::/32", "201635"}, - {"2a05:4500::/29", "207605"}, - {"2a07:6040::/29", "37468"}, - {"2401:d800:d840::/42", "7552"}, - {"2406:b400:10::/46", "18209"}, - {"2600:8808:3a00::/37", "22773"}, - {"2a00:114f:8::/32", "47764"}, - {"240a:a93b::/32", "145013"}, - {"2804:31bc::/32", "265034"}, - {"2a02:26f7:de84::/48", "36183"}, - {"2a0c:7a00::/29", "57910"}, - {"2405:84c0:ff13::/48", "9886"}, - {"2a02:250::/47", "39570"}, - {"2001:418:1401:7e::/56", "2914"}, - {"2600:6c38:11c::/42", "20115"}, - {"2a02:b48:8104::/47", "39572"}, - {"2001:678:c70::/48", "47937"}, - {"240a:ae96::/32", "146384"}, - {"2604:c80:ffff::/48", "30164"}, - {"2803:d100:3000::/33", "52362"}, - {"2402:6800:741::/43", "22822"}, - {"240e:6ba:1000::/32", "4134"}, - {"2001:559:8681::/48", "7922"}, - {"2404:600::/32", "4833"}, - {"2804:1408:7100::/32", "28635"}, - {"2405:1e00:20::/48", "17771"}, - {"2600:380:5380::/34", "20057"}, - {"2a02:26f7:c00d::/46", "20940"}, - {"2001:578:15::/46", "22773"}, - {"2001:fb1:3009::/48", "7470"}, - {"2401:4900:45b0::/41", "45609"}, - {"2408:8459:2c10::/41", "17623"}, - {"240a:acc8::/32", "145922"}, - {"2600:8807:982::/38", "22773"}, - {"2603:c002:1b10::/37", "31898"}, - {"2801:80:38f0::/48", "270461"}, - {"2804:20b8:2000::/32", "264510"}, - {"2a03:a7a0::/46", "203316"}, - {"2001:1248:a422::/45", "11172"}, - {"2001:fd8:b3c0::/42", "132199"}, - {"2001:4888:a601::/44", "22394"}, - {"2600:1f01:4890::/47", "16509"}, - {"2001:559:4cc::/47", "7015"}, - {"2001:1388:a000::/33", "6147"}, - {"2001:1898:2400::/40", "26914"}, - {"2602:801:f005::/44", "32590"}, - {"2603:c0ec::/40", "54253"}, - {"2804:29e4::/32", "264042"}, - {"2a01:8840:95::/48", "207266"}, - {"2a03:10e0::/48", "62571"}, - {"2a0b:9280::/29", "206438"}, - {"2a0e:fd45:1338::/34", "44103"}, - {"2400:cb00:140::/44", "13335"}, - {"2402:8100:27fa::/45", "55644"}, - {"2409:8057:800::/48", "9808"}, - {"2600:1007:b058::/40", "22394"}, - {"2607:f3c0::/32", "16805"}, - {"2a07:9942:39d6::/47", "58305"}, - {"2001:fe8:4100::/47", "24435"}, - {"2001:1868:a10b::/48", "63366"}, - {"2408:8256:2ea0::/39", "17816"}, - {"2408:84f3:a810::/42", "134543"}, - {"2a00:7940::/32", "20847"}, - {"2a02:80c0::/30", "49562"}, - {"2a09:a4c7:c000::/35", "208861"}, - {"2001:559:87f6::/48", "20214"}, - {"2001:4a00::/27", "13285"}, - {"2403:8940:201::/37", "135817"}, - {"240a:ae1e::/32", "146264"}, - {"2602:feda:3f0::/44", "63279"}, - {"2602:ff23::/48", "398019"}, - {"2604:9b00::/38", "14230"}, - {"2607:6000:b00::/40", "12189"}, - {"2803:d010::/44", "271806"}, - {"2804:73c8::/32", "270937"}, - {"2a0f:ba80::/29", "50629"}, - {"2001:559:3d8::/48", "7015"}, - {"2001:6b0:4::/48", "2832"}, - {"2001:9d8::/32", "25577"}, - {"2806:230:402c::/48", "265594"}, - {"2a03:d000:3000::/36", "31208"}, - {"2a09:407:4000::/32", "208861"}, - {"2a0f:f200::/29", "208257"}, - {"2401:e380:2102::/47", "131091"}, - {"240a:a332::/32", "143468"}, - {"240a:aaac::/32", "145382"}, - {"2a11:ab00::/32", "209164"}, - {"2403:c00:e00::/45", "17488"}, - {"2409:8055:3022::/45", "56040"}, - {"240a:ae31::/32", "146283"}, - {"240e:45c:2700::/40", "137402"}, - {"2602:fd37:fff::/48", "398493"}, - {"2620:130:3050::/48", "62861"}, - {"2001:559:8368::/47", "33651"}, - {"2401:d800:2ca0::/41", "7552"}, - {"2407:d840:2::/48", "51847"}, - {"2605:b100:500::/41", "577"}, - {"2001:559:c224::/48", "7016"}, - {"2402:cd00::/32", "45942"}, - {"2405:1c0:6411::/45", "55303"}, - {"2409:806a:2c00::/35", "9808"}, - {"2602:ffba::/36", "40761"}, - {"2804:12f4::/32", "263506"}, - {"2a04:4e40:1410::/44", "54113"}, - {"2001:559:8076::/48", "7922"}, - {"2801:15:d000::/48", "28116"}, - {"2a00:19b8::/32", "49503"}, - {"2a02:858::/39", "3329"}, - {"2a10:440::/29", "207289"}, - {"2402:800:f450::/42", "7552"}, - {"2409:8904:5f70::/40", "24547"}, - {"2606:2d40::/32", "1239"}, - {"2607:d400:3::/32", "22364"}, - {"2806:230:2056::/48", "265594"}, - {"2806:230:4000::/48", "265594"}, - {"2a02:26f7:bd88::/48", "36183"}, - {"2a12:6741::/32", "8485"}, - {"2001:559:c49d::/48", "21508"}, - {"2403:8940:601::/32", "135817"}, - {"2406:2000:efa7::/43", "10310"}, - {"2600:1415:1401::/36", "20940"}, - {"2606:7000::/32", "46435"}, - {"2801:1e8::/40", "264607"}, - {"2a01:568::/33", "43950"}, - {"2a01:7d80:a000::/35", "8990"}, - {"2a02:2a38::/42", "58073"}, - {"2a0a:f6c0::/29", "42218"}, - {"2402:800:3763::/43", "7552"}, - {"240e:d0:8000::/31", "4134"}, - {"2a0b:b880::/29", "206610"}, - {"2400:f880::/32", "42960"}, - {"2001:559:824e::/48", "33661"}, - {"2001:559:8264::/48", "33651"}, - {"2603:fd50::/24", "397165"}, - {"240a:a940::/32", "145018"}, - {"2607:fca8:598b::/32", "17139"}, - {"2804:7050::/32", "270719"}, - {"2001:678:8b4::/48", "9009"}, - {"2001:da8:c0::/48", "138376"}, - {"2401:a880::/32", "133661"}, - {"240a:afd0::/32", "146698"}, - {"240e:965:a800::/38", "58772"}, - {"2606:7140::/48", "50069"}, - {"2001:67c:2938::/48", "1880"}, - {"2602:103:8000::/36", "33588"}, - {"2804:348c::/32", "265464"}, - {"2804:3530::/32", "266273"}, - {"2804:36f0::/34", "266381"}, - {"2a00:1288:ef98::/48", "34010"}, - {"2a01:280:328::/48", "34628"}, - {"2a02:ac80:71::/40", "25145"}, - {"240a:a462::/32", "143772"}, - {"240a:ab52::/32", "145548"}, - {"2606:7a40:2::/48", "394298"}, - {"2800:160:1357::/42", "14259"}, - {"2001:559:321::/48", "33652"}, - {"2001:559:c06a::/48", "33657"}, - {"2001:67c:1390::/48", "49251"}, - {"240e:874:c0::/39", "4134"}, - {"2620:171:d00::/44", "187"}, - {"2804:1110:8201::/34", "262901"}, - {"2404:8d04:2642::/48", "138915"}, - {"2a02:26f7:f485::/46", "20940"}, - {"2a12:66c0::/32", "208976"}, - {"2406:e780:eb3::/32", "63679"}, - {"240e:473:ff02::/40", "140485"}, - {"2600:387::/44", "20057"}, - {"2804:3674::/32", "37468"}, - {"2a00:1d36:1340::/32", "9121"}, - {"2001:559:1d5::/48", "7015"}, - {"2001:559:80bf::/48", "33652"}, - {"2408:8956:1dc0::/38", "17622"}, - {"240a:ae7f::/32", "146361"}, - {"240a:afec::/32", "146726"}, - {"2804:5e08:180::/38", "269007"}, - {"2a11:f900::/29", "400177"}, - {"2402:8100:20c1::/46", "55644"}, - {"2405:9800:b::/48", "20940"}, - {"2600:1010:b130::/44", "22394"}, - {"2a07:8900::/29", "15516"}, - {"2a12:7540::/29", "400522"}, - {"2001:250:5813::/45", "24363"}, - {"2600:1004:b200::/42", "6167"}, - {"2605:3780::/32", "62622"}, - {"2620:120:1000::/40", "2575"}, - {"2800:160:1a0e::/43", "14259"}, - {"2a02:26f7:f240::/48", "36183"}, - {"2a10:3244::/30", "398481"}, - {"2804:154c:8002::/34", "263382"}, - {"2804:391c:d::/46", "262287"}, - {"2a0a:7d40::/32", "49127"}, - {"2001:250:5867::/44", "24363"}, - {"2606:b0c0:b00c::/33", "8095"}, - {"2804:1c88::/32", "61660"}, - {"2a02:17e8:d00::/32", "13002"}, - {"2a04:2b00:100::/48", "42044"}, - {"2a0c:8fc2::/32", "202401"}, - {"2001:df0:2bf::/48", "198723"}, - {"2001:1248:5668::/47", "11172"}, - {"2600:1003:9840::/44", "6167"}, - {"2600:1406:f801::/38", "20940"}, - {"2606:a000:c07::/48", "11955"}, - {"2a0c:2c00::/29", "205266"}, - {"2401:d800:d340::/42", "7552"}, - {"2403:2500:9000::/41", "36236"}, - {"2408:8417::/28", "4837"}, - {"2602:feb4:140::/42", "25961"}, - {"2405:9800:c881::/39", "45430"}, - {"2408:8956:f2c0::/37", "17816"}, - {"2604:86c0::/32", "63023"}, - {"2608:4121:2::/48", "27065"}, - {"2a02:26f7:b788::/48", "36183"}, - {"2a06:e880:1::/48", "48550"}, - {"2a06:e881:4300::/42", "204307"}, - {"2a0a:5e80::/48", "48715"}, - {"2403:300:a21::/45", "714"}, - {"240e:44d:1800::/42", "140345"}, - {"2620:13f:5000::/48", "397592"}, - {"240e:3bb:4c00::/35", "136200"}, - {"2620:74:a1::/48", "11840"}, - {"2806:230:5002::/48", "265594"}, - {"240a:a7ce::/32", "144648"}, - {"2600:6c38:734::/44", "20115"}, - {"2607:7c80::/41", "64260"}, - {"2a00:a900:6aff::/35", "60819"}, - {"2001:67c:15a2::/48", "61317"}, - {"2804:1d9c:2000::/32", "264381"}, - {"2a02:88d:4000::/44", "48695"}, - {"2403:df00::/46", "9292"}, - {"240a:a81d::/32", "144727"}, - {"240a:a9e4::/32", "145182"}, - {"2a00:e200:105::/32", "41313"}, - {"2001:559:8222::/48", "33652"}, - {"240e:353:6400::/29", "4134"}, - {"2600:370f:73e5::/46", "32261"}, - {"2a02:f040:4::/47", "59605"}, - {"2a0c:4dc0::/48", "47893"}, - {"2001:67c:12f4::/48", "205969"}, - {"2402:ef38::/32", "38536"}, - {"2404:8000:b4b2::/36", "17451"}, - {"2408:8456:a810::/42", "134543"}, - {"240a:ac22::/32", "145756"}, - {"2600:370f:73e3::/45", "32261"}, - {"2804:2a80::/42", "53094"}, - {"2804:31e4::/32", "265043"}, - {"2a02:26f7:c64d::/42", "20940"}, - {"240e:983:700::/40", "140061"}, - {"2600:1417:e001::/36", "20940"}, - {"2620:82:6000::/48", "11048"}, - {"2804:551c::/32", "268690"}, - {"2804:5af8::/32", "268810"}, - {"2a04:d200::/31", "61438"}, - {"2a0f:6f80::/29", "47196"}, - {"2001:678:114::/48", "57436"}, - {"2001:1a40:81::/39", "5416"}, - {"2600:1417:71::/48", "9829"}, - {"2a01:7e27::/32", "199805"}, - {"2a02:26f7:1::/48", "20940"}, - {"2a02:26f7:de05::/46", "20940"}, - {"2a06:7a40:1::/46", "204050"}, - {"2a0e:b107:1786::/48", "58057"}, - {"2a0f:b00::/29", "43414"}, - {"2001:67c:17a8::/48", "24660"}, - {"2001:1548:206::/48", "206804"}, - {"2400:f280:2000::/40", "55766"}, - {"2408:8957:3300::/40", "17816"}, - {"2604:4c00::/32", "40383"}, - {"2a0a:2842:8651::/48", "136796"}, - {"2a0b:e182:100::/38", "198605"}, - {"2001:503:f189::/48", "7342"}, - {"2001:559:85b1::/48", "7015"}, - {"240a:a266::/32", "143264"}, - {"2620:107:6000:1126::/57", "6462"}, - {"2804:1d74::/32", "264369"}, - {"2804:46fc::/32", "267024"}, - {"2a03:b2c0::/29", "40676"}, - {"2a05:1500:500::/40", "43345"}, - {"2a05:d000:c000::/40", "16509"}, - {"2a06:3580::/29", "62183"}, - {"2001:5a0:4605::/36", "6453"}, - {"2001:678:28::/48", "42"}, - {"2001:6a0::/34", "8664"}, - {"2001:978:5d04::/34", "174"}, - {"2405:8a00:21b2::/45", "55824"}, - {"240a:a4db::/32", "143893"}, - {"2a02:26f7:e581::/46", "20940"}, - {"2001:49f0:d0f2::/47", "30058"}, - {"2400:8800:502::/35", "3491"}, - {"2403:a280:8000::/36", "36351"}, - {"240a:ae8a::/32", "146372"}, - {"2607:9b80:a20::/40", "46558"}, - {"2620:130:30c4::/48", "62861"}, - {"2a01:a280:7::/48", "205717"}, - {"2a09:4e05::/32", "210625"}, - {"2a0d:a440::/29", "197915"}, - {"2001:559:4ce::/48", "7016"}, - {"2804:8104::/32", "272426"}, - {"2a02:26f0:2501::/36", "20940"}, - {"2a04:9e00::/29", "62183"}, - {"240e:44d:4400::/42", "140345"}, - {"2607:fad0:4000::/36", "53824"}, - {"2a11:e80::/29", "210625"}, - {"2600:6c7f:9180::/42", "19115"}, - {"2806:2f0:5261::/46", "17072"}, - {"2407:d1c0::/32", "24162"}, - {"2602:107:2a10::/48", "20115"}, - {"2a02:4b0::/38", "43751"}, - {"2a02:26f7:e280::/48", "36183"}, - {"2a02:26f7:e9c4::/48", "36183"}, - {"2606:25c0::/32", "399331"}, - {"2a07:bc0::/29", "197393"}, - {"2001:559:74d::/48", "7015"}, - {"2408:840c:9500::/40", "17621"}, - {"2a02:26f7:f740::/48", "36183"}, - {"2a0b:b86:100::/40", "34641"}, - {"2402:3180::/48", "141706"}, - {"2800:bf0:81ee::/38", "27947"}, - {"2001:559:c0fd::/48", "33287"}, - {"2001:c20:b006::/33", "3758"}, - {"240e:13:7800::/37", "4134"}, - {"2600:1480:4800::/48", "21342"}, - {"2800:440:8180::/48", "27738"}, - {"2804:14c:cca2::/41", "28573"}, - {"2001:678:518::/48", "205423"}, - {"2409:8904:4a60::/39", "24547"}, - {"2604:ca00:d000::/48", "36492"}, - {"2a06:e881:2604::/48", "49745"}, - {"2a09:1500:20::/48", "208175"}, - {"2401:d800:5b20::/41", "7552"}, - {"2408:8856:400::/32", "17816"}, - {"240e:3bb:ec00::/35", "140314"}, - {"2804:e30:418::/38", "11338"}, - {"2a11:9700::/32", "210939"}, - {"2001:559:8749::/48", "7016"}, - {"2001:67c:21b8::/48", "29682"}, - {"2403:1940:30::/48", "137935"}, - {"2409:8904:d1b0::/38", "24547"}, - {"2409:8a28::/33", "56041"}, - {"2620:11a:4081::/48", "26197"}, - {"2804:6f8::/32", "52848"}, - {"2804:15ec:900::/32", "28599"}, - {"2804:2d8c::/32", "265289"}, - {"2804:313c::/32", "265001"}, - {"2001:1a68:2c::/48", "24723"}, - {"2a01:a420::/29", "208425"}, - {"2001:253:123::/48", "142089"}, - {"2001:13c7:7004::/48", "263779"}, - {"2404:c400:dc06::/34", "9328"}, - {"2409:8a18::/31", "134810"}, - {"2604:2a40::/32", "62943"}, - {"2a02:410::/32", "12347"}, - {"2001:44c8:4800::/41", "131445"}, - {"2001:4878:7::/44", "12222"}, - {"2600:1007:c01::/46", "22394"}, - {"2001:559:c074::/44", "7922"}, - {"240e:108:1060::/48", "134761"}, - {"2606:2800:5020::/48", "15133"}, - {"2620:74:2a::/48", "396559"}, - {"2a0c:e040::/39", "200629"}, - {"2001:67c:14::/48", "15960"}, - {"2401:4900:5020::/41", "45609"}, - {"2405:a700:14::/47", "9498"}, - {"2606:2800:6a40::/46", "15133"}, - {"2804:310c::/32", "264989"}, - {"2a01:9dc0:bef0::/33", "48684"}, - {"2a05:c6c0::/29", "49605"}, - {"2600:6c09:2::/30", "20115"}, - {"2602:fb9e::/40", "400550"}, - {"2604:bc40:6111::/32", "22188"}, - {"2a0b:8b40::/29", "60721"}, - {"240a:a224::/32", "143198"}, - {"240e:108:4c::/48", "58519"}, - {"240e:67f:800::/37", "140329"}, - {"2a0a:4e83:f24::/48", "206074"}, - {"2a0e:c40::/29", "57112"}, - {"2409:4043:3000::/27", "55836"}, - {"2607:f800::/32", "26480"}, - {"2409:851e::/31", "24400"}, - {"2a00:b8c0::/32", "198549"}, - {"2a02:888:51::/48", "47794"}, - {"2400:8dc0::/32", "136171"}, - {"240e:3b0:ac00::/35", "4134"}, - {"2600:1404:a800::/48", "35994"}, - {"2604:6840:ac20::/48", "20446"}, - {"2400:3dc0:401::/39", "134371"}, - {"2806:230:2020::/48", "265594"}, - {"2a07:6680::/29", "202954"}, - {"2c0f:ff20::/32", "37286"}, - {"240a:a5b1::/32", "144107"}, - {"2804:3060::/32", "264947"}, - {"2804:4248::/32", "267490"}, - {"2a01:190:15e9::/48", "28848"}, - {"2a06:9140::/29", "31486"}, - {"2001:559:5ca::/48", "33491"}, - {"2402:800:5c39::/41", "7552"}, - {"2408:8957:cfc0::/35", "17622"}, - {"2804:4a8::/32", "262457"}, - {"2a0c:5cc0::/29", "197648"}, - {"2600:1003:a110::/38", "22394"}, - {"2606:4900::/32", "13765"}, - {"2801:a4:fc00::/38", "262742"}, - {"2804:652c::/32", "269473"}, - {"2806:230:5006::/48", "265594"}, - {"2a02:45c0:7::/43", "59675"}, - {"2a0a:5640::/32", "207242"}, - {"2001:559:8484::/47", "33660"}, - {"240e:44d:580::/41", "4134"}, - {"2620:149:13c2::/36", "714"}, - {"2804:4d7c::/32", "268199"}, - {"2a02:88d:2f::/48", "47794"}, - {"2a0c:8680::/29", "59865"}, - {"2a10:4646:170::/44", "399486"}, - {"2402:28c0:ffaf::/41", "136620"}, - {"2606:b400:800c::/48", "792"}, - {"2a02:c540::/29", "12874"}, - {"2400:f800::/32", "24246"}, - {"2405:9800:9::/46", "45458"}, - {"240e:964:ca00::/40", "133776"}, - {"2600:1fa0:6060::/44", "16509"}, - {"2600:370f:31c1::/46", "32261"}, - {"2409:8c85:aa31::/45", "9808"}, - {"2600:140f:601::/39", "20940"}, - {"2620:13f:8000::/47", "27547"}, - {"2800:bf0:2302::/40", "27947"}, - {"2801:80:680::/48", "22819"}, - {"2803:a900:6000::/48", "52420"}, - {"2804:7744::/32", "271166"}, - {"2806:2f0:9cc3::/39", "17072"}, - {"2a02:26f7:cd4c::/48", "36183"}, - {"2001:49f0:a050::/44", "174"}, - {"2405:9800:d008::/39", "45430"}, - {"240a:a1b9::/32", "143091"}, - {"2604:d600:92a::/37", "32098"}, - {"2800:bf0:8310::/47", "52257"}, - {"2804:2dec::/32", "265312"}, - {"240e:473:fffe::/48", "140486"}, - {"2600:1010:a120::/36", "22394"}, - {"2600:9000:1e32::/45", "16509"}, - {"2804:584::/32", "53072"}, - {"2804:766c::/32", "271111"}, - {"2a02:5d0::/29", "21032"}, - {"2a0e:3bc0:fa00::/42", "204982"}, - {"2606:2e00:8020::/48", "36351"}, - {"2804:58c0::/32", "268147"}, - {"2a02:26f7:91::/48", "20940"}, - {"2a0b:8fc1::/35", "49825"}, - {"2c0f:f000:f00::/32", "36891"}, - {"2602:fbf6:100::/48", "9267"}, - {"2607:f8f0:800::/48", "271"}, - {"2804:11b0::/32", "263432"}, - {"2806:370:9700::/36", "28403"}, - {"2001:7f8:6b::/48", "58307"}, - {"2001:1248:9840::/44", "11172"}, - {"2400:da00:405::/33", "38365"}, - {"2001:559:83af::/48", "7922"}, - {"2402:9d80:920::/43", "131429"}, - {"2804:14f4::/32", "263361"}, - {"2a07:6780::/29", "209320"}, - {"2001:ee0:9a40::/39", "45899"}, - {"2800:440:1200::/42", "27738"}, - {"2800:650:4::/48", "262589"}, - {"2604:7c0::/39", "395841"}, - {"2604:d600:51d::/42", "32098"}, - {"2001:559:c28a::/48", "33660"}, - {"2001:1248:5ba2::/44", "11172"}, - {"2600:140f:2e01::/35", "20940"}, - {"2804:30dc::/32", "264977"}, - {"2600:1419:1201::/37", "20940"}, - {"2a04:9ac1::/32", "35616"}, - {"2001:4220::/48", "36935"}, - {"2408:8645::/35", "140726"}, - {"240e:44d:c00::/41", "140345"}, - {"2604:fc00::/32", "10508"}, - {"2620:149:22c::/43", "714"}, - {"2401:4900:1c5a::/42", "24560"}, - {"240a:aad1::/32", "145419"}, - {"2800:490:8500::/36", "27951"}, - {"2803:b860::/32", "267828"}, - {"2804:2654::/32", "264327"}, - {"2a00:c200::/32", "39512"}, - {"2a04:a080::/29", "35205"}, - {"2a0f:8442::/32", "49981"}, - {"2001:559:c087::/44", "7922"}, - {"2600:1480:7801::/37", "20940"}, - {"2600:6c20:211::/44", "20115"}, - {"240a:ac1a::/32", "145748"}, - {"2a02:98:d51::/48", "8468"}, - {"2a02:26f7:f141::/45", "20940"}, - {"2001:559:1d4::/48", "7922"}, - {"2001:559:c33b::/48", "7922"}, - {"240a:ac2a::/32", "145764"}, - {"2a07:3080::/29", "41639"}, - {"2600:1005:9110::/36", "22394"}, - {"2a00:e200::/40", "41313"}, - {"2001:520:1018::/46", "8103"}, - {"2001:678:2d4::/48", "198284"}, - {"2001:1248:84d1::/46", "11172"}, - {"2401:2a80:4::/32", "58793"}, - {"2a02:e0:3006::/39", "34984"}, - {"2a04:88c0:2::/44", "60781"}, - {"2409:896a:1700::/36", "9808"}, - {"2620:130:3080::/48", "62861"}, - {"2804:2c30::/32", "265201"}, - {"2001:559:c44a::/47", "33657"}, - {"2001:67c:14c::/48", "33988"}, - {"2603:c0ea:4000::/35", "1218"}, - {"2606:6680:19::/48", "27323"}, - {"2620:100:3002::/48", "23286"}, - {"2804:45c8::/47", "266949"}, - {"2a0b:6bc0::/47", "43197"}, - {"2401:d800:9b90::/42", "7552"}, - {"240a:aec5::/32", "146431"}, - {"2a03:3800::/32", "31229"}, - {"2a10:83c0::/29", "43440"}, - {"2001:67c:2fc8::/48", "213156"}, - {"2001:2001:5000::/36", "1299"}, - {"2403:400:400::/39", "23820"}, - {"2600:141b:a::/45", "35994"}, - {"2a00:7b01::/29", "12338"}, - {"2001:1248:a020::/46", "11172"}, - {"2600:1006:9040::/44", "6167"}, - {"2a02:26f7:bf08::/48", "36183"}, - {"2a02:26f7:bf40::/48", "36183"}, - {"2001:fd8:32b0::/44", "4775"}, - {"2001:1248:5aa7::/43", "11172"}, - {"2405:1c0:6381::/46", "55303"}, - {"240a:aaf3::/32", "145453"}, - {"2804:4474::/32", "267633"}, - {"2a0c:a640:20::/48", "42298"}, - {"2408:8456:aa40::/37", "17816"}, - {"2804:62b8::/32", "269314"}, - {"2406:e400::/47", "7642"}, - {"2600:1417:f000::/48", "24319"}, - {"2607:ff30:1110::/48", "237"}, - {"2804:ac0::/32", "28134"}, - {"2804:19c4::/32", "61817"}, - {"2a00:b340:30::/48", "196745"}, - {"2a0d:1380::/29", "59959"}, - {"2c0f:fce0::/32", "37027"}, - {"2001:57a:c00::/35", "22773"}, - {"2408:8956:be00::/40", "17622"}, - {"240a:a430::/32", "143722"}, - {"2804:1f0e::/35", "262366"}, - {"2001:fd8:3b1::/41", "4775"}, - {"240e:44d:3e80::/41", "4134"}, - {"2801:80:36b0::/48", "269191"}, - {"2804:4c0:fffa::/45", "3549"}, - {"2804:1840::/32", "262711"}, - {"2a03:db80:5465::/32", "680"}, - {"2001:418:4005::/48", "1412"}, - {"2400:1a00:bd21::/40", "17501"}, - {"2606:b400:882b::/48", "7160"}, - {"2806:268:1501::/48", "13999"}, - {"2a00:cb8:144::/48", "15695"}, - {"2a01:52c0::/32", "15644"}, - {"2a02:26f7:e108::/48", "36183"}, - {"2a11:bb44::/32", "28753"}, - {"2605:dd40:8209::/43", "398549"}, - {"2803:7a00:810d::/33", "52468"}, - {"2a02:1006:c0f0::/48", "3320"}, - {"2001:67c:19c::/48", "196967"}, - {"2001:1388:8470::/36", "6147"}, - {"2001:44b8:30c1::/48", "4739"}, - {"240a:a763::/32", "144541"}, - {"2804:14c:3bb5::/41", "28573"}, - {"2c0f:ed58::/32", "328471"}, - {"2a04:d280::/29", "60164"}, - {"2a10:7707:f216::/42", "399975"}, - {"2001:1440::/38", "8469"}, - {"2a0e:a40::/29", "59645"}, - {"2804:2ebc::/34", "265363"}, - {"2001:559:841f::/48", "33651"}, - {"2803:2a80::/48", "262928"}, - {"2a02:26f7:4::/48", "36183"}, - {"2a05:e800:7::/48", "50881"}, - {"2001:418:4006::/32", "2914"}, - {"2402:e280:2235::/44", "134674"}, - {"240a:a26c::/32", "143270"}, - {"2a00:1c80::/29", "44647"}, - {"2001:67c:10d0::/48", "43101"}, - {"2408:8256:1596::/38", "17622"}, - {"2a03:c980:5fb7::/48", "210079"}, - {"2404:4100::/48", "38185"}, - {"2409:8a04::/34", "24547"}, - {"2620:11d:9002:200::/56", "14805"}, - {"2a07:e03::/46", "210083"}, - {"2408:8956:8300::/40", "17816"}, - {"2a01:650::/32", "30795"}, - {"2001:559:85bd::/48", "33491"}, - {"2401:d800:d6b0::/41", "7552"}, - {"2409:804c:5d00::/31", "9808"}, - {"2409:8924:a100::/38", "56046"}, - {"2602:feb4:1c0::/44", "25961"}, - {"2804:6280::/45", "269301"}, - {"2a03:7840::/29", "207790"}, - {"2a06:1d80::/29", "30786"}, - {"2001:da8:9007::/48", "24370"}, - {"2409:8057:380e::/48", "9808"}, - {"2804:718::/32", "262620"}, - {"2a03:4980::/32", "24904"}, - {"2001:559:771::/48", "13367"}, - {"2001:559:c465::/48", "33490"}, - {"2001:1a68:a::/48", "20555"}, - {"2600:380:a00::/35", "20057"}, - {"2a00:5140::/32", "42707"}, - {"2001:fe8::/46", "24435"}, - {"2001:4c08:202f::/43", "3356"}, - {"240e:67b:c600::/34", "4134"}, - {"2606:2800:424a::/47", "15133"}, - {"2a03:f80:386::/48", "48894"}, - {"2a06:9e00::/29", "57795"}, - {"2a00:d103::/34", "15704"}, - {"2a0a:5b80::/29", "49367"}, - {"2001:dc7:8889::/35", "24151"}, - {"2804:51d0::/32", "268479"}, - {"2a04:9640::/30", "59939"}, - {"2001:559:5c7::/48", "33657"}, - {"2001:4878:b216::/48", "12222"}, - {"2402:9d80:10c::/48", "131429"}, - {"2a02:26f7:f8c5::/46", "20940"}, - {"2a05:9a80::/29", "29691"}, - {"240e:3bc:1200::/39", "4134"}, - {"2600:6c2e:125::/38", "20115"}, - {"2a0a:1900::/29", "43242"}, - {"2a11:efc0::/29", "204790"}, - {"2400:1c00:70::/40", "45143"}, - {"2403:ec00:124::/47", "17806"}, - {"240a:a11a::/32", "142932"}, - {"2a00:1fa2:8000::/40", "28884"}, - {"2a04:9b40::/32", "21305"}, - {"2403:ffc0:1100::/38", "137758"}, - {"240a:a88b::/32", "144837"}, - {"240e:fe:c000::/35", "134775"}, - {"2620:114:3000::/48", "54391"}, - {"2a0f:3e80::/29", "30633"}, - {"2a0b:afc0::/32", "62126"}, - {"2001:df6:3180::/48", "141988"}, - {"2408:84f3:b040::/38", "17816"}, - {"240e:3b9:3e00::/33", "140308"}, - {"240e:920::/30", "140061"}, - {"2400:9380:82c0::/44", "136167"}, - {"2406:e300::/46", "45250"}, - {"2600:6c10:3::/43", "20115"}, - {"2804:49c:3106::/48", "15201"}, - {"2804:ce4::/32", "52573"}, - {"2a06:afc0:1::/48", "58286"}, - {"2001:4ce9::/29", "59716"}, - {"240e:979:4f00::/35", "4134"}, - {"2804:438c::/32", "262911"}, - {"2406:840:f380::/44", "133555"}, - {"2606:5200:9000::/34", "32477"}, - {"2001:4878:8259::/48", "12222"}, - {"2800:160:1bdc::/42", "14259"}, - {"2a02:26f7:ec01::/46", "20940"}, - {"2403:ad80:92::/48", "135309"}, - {"2600:1407:25::/37", "20940"}, - {"2804:1f0a::/34", "10938"}, - {"2001:4388::/45", "8452"}, - {"2a02:26f7:b885::/46", "20940"}, - {"2a12:4946:a000::/47", "211088"}, - {"2001:559:517::/48", "7016"}, - {"2001:7f0:101::/48", "51906"}, - {"2404:c040::/32", "136174"}, - {"240a:af92::/32", "146636"}, - {"2620:0:1000::/40", "45566"}, - {"2a02:2698:5800::/38", "42683"}, - {"2a0d:2800::/29", "25003"}, - {"2001:559:2fd::/48", "7015"}, - {"2001:df4:db00::/48", "134884"}, - {"2605:e2c0::/32", "49434"}, - {"2a03:8641::/32", "39143"}, - {"2001:559:302::/48", "7016"}, - {"2001:67c:1420::/48", "207101"}, - {"2001:df7:4f80::/48", "138754"}, - {"2804:2fe4::/32", "264919"}, - {"2804:6340::/32", "269349"}, - {"2a00:43e0::/32", "60975"}, - {"2001:468:301::/41", "11537"}, - {"2001:559:83eb::/48", "33657"}, - {"2408:8957:b700::/40", "17816"}, - {"2409:8904:5240::/42", "24547"}, - {"240a:af8b::/32", "146629"}, - {"2800:e03:c000::/28", "27665"}, - {"2a05:6900::/29", "47551"}, - {"2a11:3240::/29", "204790"}, - {"2405:4800:18c3::/32", "18403"}, - {"2409:8907:7c20::/39", "24547"}, - {"2620:11e:30c7::/48", "393828"}, - {"2803:c4e0:8000::/35", "269809"}, - {"2001:678:778::/48", "210814"}, - {"2001:6f8:400::/35", "3257"}, - {"2607:f220:403::/43", "3527"}, - {"2800:650::/46", "28032"}, - {"2804:2178:4006::/35", "264556"}, - {"2804:8154::/32", "272447"}, - {"2a02:26f7:bf01::/46", "20940"}, - {"2400:dc00:ea::/48", "23947"}, - {"240a:aeb5::/32", "146415"}, - {"2a00:5fc1::/32", "48324"}, - {"2a03:5900:c::/29", "31126"}, - {"2001:678:880::/48", "35332"}, - {"2401:d800:ded0::/42", "7552"}, - {"2404:73c0:1102::/48", "48024"}, - {"2405:4802:14d0::/34", "18403"}, - {"2a01:667:100::/37", "48951"}, - {"2a0b:1880::/48", "203217"}, - {"2600:9000:2384::/48", "16509"}, - {"2800:160:1894::/44", "14259"}, - {"2803:6fa0:6::/48", "267790"}, - {"2804:1b3:6f42::/32", "18881"}, - {"2a02:6680:e000::/47", "16116"}, - {"2408:8256:357d::/46", "17623"}, - {"240a:aca6::/32", "145888"}, - {"240e:320::/30", "140061"}, - {"2804:1164::/32", "263674"}, - {"2404:bf40:c581::/34", "139084"}, - {"240a:a8c0::/32", "144890"}, - {"2804:4920::/32", "267166"}, - {"2a09:19c0::/48", "35691"}, - {"2a0e:78c0::/29", "174"}, - {"2001:4408:6f00::/35", "4758"}, - {"2406:daa0:c020::/44", "16509"}, - {"2806:2f0:2063::/43", "22884"}, - {"2402:800:baa0::/41", "7552"}, - {"240a:ab6d::/32", "145575"}, - {"2607:fb10:7162::/40", "2906"}, - {"2a00:1480:5::/48", "39737"}, - {"2001:cf8:acf::/32", "9619"}, - {"2406:840:4100::/47", "139317"}, - {"240e:183:8214::/46", "140653"}, - {"2801:80:38d0::/46", "270420"}, - {"2803:dac0:a::/43", "265634"}, - {"2a0d:e6c0::/32", "41114"}, - {"2001:278::/32", "4725"}, - {"2402:f740:2000::/36", "140096"}, - {"2603:c002:1a30::/39", "31898"}, - {"2408:8957:8c00::/40", "17622"}, - {"240a:a956::/32", "145040"}, - {"240e:44d:4b40::/42", "140357"}, - {"2804:145c:f710::/36", "263327"}, - {"2804:81cc::/32", "272477"}, - {"2a0c:7e46:8a7::/48", "20473"}, - {"2a05:1083:fd00::/44", "209870"}, - {"2001:ee0:7b40::/37", "45899"}, - {"2001:1248:990b::/43", "11172"}, - {"2a01:758:ffe9::/43", "3326"}, - {"2001:559:408::/48", "33491"}, - {"240a:a9ff::/32", "145209"}, - {"2a02:26f7:ef08::/48", "36183"}, - {"2001:6d0:ffc4::/48", "21416"}, - {"2401:4900:5a30::/41", "45609"}, - {"2404:7240::/34", "59074"}, - {"240e:ea::/27", "4134"}, - {"2605:efc0::/32", "1970"}, - {"2001:559:77::/44", "33651"}, - {"2001:df3:fd80::/48", "140442"}, - {"2804:3a54::/32", "266083"}, - {"2a02:26f0:11a::/48", "20940"}, - {"2a02:26f7:e1::/48", "20940"}, - {"2a03:6947:200::/40", "49800"}, - {"2a10:f46::/31", "207459"}, - {"2001:250:6001::/48", "24365"}, - {"2001:4490:dad0::/46", "9829"}, - {"2404:fa00:5000::/36", "45780"}, - {"2409:8904:7c40::/39", "24547"}, - {"240e:3b7:4c00::/35", "136200"}, - {"2801:0:60::/48", "52274"}, - {"2801:1c8:5f0::/48", "19429"}, - {"2804:145c:8110::/40", "263327"}, - {"2804:7058::/32", "270721"}, - {"2001:559:8320::/48", "33661"}, - {"2400:8500:1000::/36", "7506"}, - {"2400:adc2:300::/37", "9541"}, - {"2600:1405:3801::/33", "20940"}, - {"2804:3fc0::/32", "265912"}, - {"2a02:b48:8022::/39", "39572"}, - {"2001:678:8ac::/48", "20570"}, - {"2408:8957:b00::/40", "17816"}, - {"2604:1280:4::/46", "11696"}, - {"2800:8a0:a000::/36", "5722"}, - {"2804:1870::/32", "61932"}, - {"2804:5e08:380::/32", "269007"}, - {"2a0e:5540::/48", "208258"}, - {"2a11:1d42::/48", "210937"}, - {"2001:250:342c::/48", "138438"}, - {"2610:a1:3008::/48", "12008"}, - {"2a05:6680::/29", "43648"}, - {"2600:6c34:d0::/48", "33588"}, - {"2001:1b70:82cb::/48", "158"}, - {"2408:8956:7100::/40", "17816"}, - {"2804:8240::/32", "272508"}, - {"2a02:b88::/32", "47927"}, - {"2804:2dc0::/32", "265301"}, - {"2806:262:501::/48", "13999"}, - {"2001:67c:289c::/48", "198093"}, - {"2001:1a88::/29", "15600"}, - {"2001:43e8::/32", "37105"}, - {"240e:978:5000::/40", "137702"}, - {"2a00:db60:2000::/48", "15224"}, - {"2a02:26f7:bd50::/48", "36183"}, - {"2001:448a:60f0::/39", "7713"}, - {"240a:acb7::/32", "145905"}, - {"2c0f:4200::/35", "328790"}, - {"2001:18b8:119::/42", "29789"}, - {"2401:d800:ec2::/42", "7552"}, - {"240a:a21b::/32", "143189"}, - {"240a:a2e9::/32", "143395"}, - {"2605:2080::/33", "33182"}, - {"2804:4efc:4000::/32", "268296"}, - {"2a02:458::/32", "25182"}, - {"2401:b400:20::/47", "58811"}, - {"240e:f7:8000::/35", "58461"}, - {"2607:f098::/35", "33363"}, - {"2804:41a8::/32", "267448"}, - {"2806:250:600::/40", "28512"}, - {"2a00:e7a0::/47", "204167"}, - {"2a01:5a8::/47", "8866"}, - {"2a05:fb00::/29", "1257"}, - {"2405:9800:c::/43", "45430"}, - {"2607:fae0:2000::/35", "8038"}, - {"2402:8100:2510::/41", "45271"}, - {"2a01:c50e:c00::/35", "12479"}, - {"2a02:2698:8800::/38", "51035"}, - {"2a0d:7ac0::/29", "210206"}, - {"2c0f:f7b0::/32", "327819"}, - {"2001:550:301::/48", "26988"}, - {"2800:320:402::/48", "27882"}, - {"2804:5cf4::/32", "268942"}, - {"2a07:3501:1080::/47", "13127"}, - {"2001:4878:4347::/48", "12222"}, - {"2400:1700:303::/32", "4628"}, - {"2804:3e50:12f::/34", "266587"}, - {"2806:2f0:21c3::/43", "22884"}, - {"2a02:f560::/40", "44267"}, - {"2a03:9900:101::/32", "8990"}, - {"2a0b:d380::/29", "206339"}, - {"2408:840c:6c00::/40", "17621"}, - {"2602:fcd8::/48", "14618"}, - {"2a04:2e80:9::/48", "59860"}, - {"2a0c:29c0::/32", "35614"}, - {"2c0e:100:501::/20", "24863"}, - {"2a0e:8f02:1080::/41", "204446"}, - {"2001:fd8:b200::/42", "132199"}, - {"2408:84f3:de10::/42", "134543"}, - {"2804:63a8:818::/35", "269375"}, - {"2a00:ccc1:4::/48", "57433"}, - {"2a02:578:2c00::/35", "9031"}, - {"2a02:26f7:e908::/48", "36183"}, - {"2a03:e140:3::/48", "48409"}, - {"2c0f:f6d0:2b::/40", "327687"}, - {"2001:da8:3011::/48", "23910"}, - {"2400:dcc0:a804::/39", "38631"}, - {"2806:2f0:5081::/46", "17072"}, - {"2a02:26f7:c1c1::/46", "20940"}, - {"2001:67c:2324::/48", "47904"}, - {"2001:67c:2da8::/48", "41040"}, - {"2001:b08:5::/46", "3267"}, - {"2a01:108::/32", "31127"}, - {"2001:559:c506::/44", "7922"}, - {"2400:9380:86c0::/44", "136167"}, - {"2404:170::/32", "38525"}, - {"2404:b740::/48", "18403"}, - {"2600:6c10:ff83::/45", "20115"}, - {"2801:c4:19::/48", "22122"}, - {"2803:9800:b997::/38", "11664"}, - {"2804:6f4::/32", "262539"}, - {"2a02:26f7:eb88::/48", "36183"}, - {"2a0c:36c0:2::/48", "202301"}, - {"2001:559:879e::/48", "33659"}, - {"2401:d800:55a0::/41", "7552"}, - {"240a:a1c1::/32", "143099"}, - {"2804:d20:e000::/35", "262700"}, - {"2804:1f46::/33", "268989"}, - {"2804:30e4::/32", "262772"}, - {"2804:3e90:4254::/42", "266606"}, - {"2804:7e64::/32", "271621"}, - {"2a0e:d487:f000::/48", "59462"}, - {"2408:8456:9240::/37", "17816"}, - {"2801:1e:9800::/48", "272079"}, - {"2a01:c50f:31c0::/38", "12479"}, - {"2a04:8640::/29", "62275"}, - {"2a09:4e07:2000::/35", "210625"}, - {"2a0a:1ac7::/48", "2116"}, - {"2a0c:4a01:c30::/41", "147183"}, - {"2a0e:f40::/32", "208585"}, - {"2001:67c:28a0::/48", "202592"}, - {"2001:b28:9999::/48", "31500"}, - {"2001:da8:21d::/48", "138375"}, - {"2001:da8:25a::/45", "23910"}, - {"2401:9d00:102::/35", "9835"}, - {"2409:8904:e2b0::/31", "24547"}, - {"2605:3b40::/32", "54904"}, - {"2804:1c8:180::/32", "53184"}, - {"2a03:4ba0::/48", "15669"}, - {"2001:559:c2cc::/48", "7016"}, - {"2001:678:ff0::/48", "3320"}, - {"240a:aea4::/32", "146398"}, - {"2a00:fa40:5000::/32", "45031"}, - {"2001:470:143::/44", "6939"}, - {"2409:8054:303d::/48", "56040"}, - {"2607:3f00:3::/48", "26636"}, - {"2804:385c::/39", "262687"}, - {"2804:5aa8::/32", "268787"}, - {"2a0d:2581:10::/48", "209261"}, - {"2001:df0:251::/48", "18055"}, - {"2405:6e00:800::/40", "133612"}, - {"2405:7f00:c900::/34", "133414"}, - {"240a:aa3a::/32", "145268"}, - {"240e:44d:1180::/41", "4134"}, - {"2a0e:b107:a0::/44", "209218"}, - {"2001:559:432::/48", "33287"}, - {"2a00:1288:7d::/46", "10310"}, - {"2a02:26f7:c356::/47", "20940"}, - {"2001:4430:5210::/39", "17853"}, - {"2806:2f0:1280::/48", "22884"}, - {"2001:19b0::/32", "7029"}, - {"2404:5c80:2::/32", "59261"}, - {"2800:160:1b25::/46", "14259"}, - {"2806:230:401f::/48", "11888"}, - {"2a01:b740::/47", "714"}, - {"2a03:a300:1140::/48", "35104"}, - {"2001:4888:a60e::/41", "22394"}, - {"2406:8c00::/32", "24282"}, - {"2409:8b44::/28", "24445"}, - {"2804:84b8::/32", "272277"}, - {"2a0d:4040::/29", "35070"}, - {"2403:300:543::/38", "714"}, - {"240e:108:1002::/48", "23724"}, - {"2607:f8f0:690::/48", "271"}, - {"2a04:a900:5::/48", "48619"}, - {"2602:802:d000::/44", "53506"}, - {"2605:46c0:9000::/33", "395658"}, - {"2001:1900:220b::/45", "3356"}, - {"2804:74f4:4::/33", "271014"}, - {"2a00:d640::/31", "213192"}, - {"2c0f:e818::/32", "328475"}, - {"2001:559:810b::/48", "7015"}, - {"2804:2308:5000::/32", "264138"}, - {"2a00:e860:180::/46", "200129"}, - {"2a05:3950:8001::/37", "201503"}, - {"2a0f:efc0::/32", "49544"}, - {"2001:559:c3d7::/48", "22909"}, - {"2405:b8c0::/36", "131677"}, - {"2605:c00:1000::/40", "46920"}, - {"2001:748::/32", "5430"}, - {"2600:6c38:8a8::/43", "20115"}, - {"2620:d4::/48", "6377"}, - {"2a02:26f7:c6c9::/42", "20940"}, - {"2404:8d06:9100::/36", "10089"}, - {"2a01:5f80::/32", "47408"}, - {"2a02:cb80:2740::/48", "43766"}, - {"2001:250:2c00::/45", "138381"}, - {"2001:df3:c700::/48", "137394"}, - {"2404:2a00::/32", "56089"}, - {"240a:a48b::/32", "143813"}, - {"240a:a94f::/32", "145033"}, - {"2620:0:2b17::/48", "20381"}, - {"2803:7800::/32", "263703"}, - {"2a00:1178:4::/32", "35415"}, - {"2a09:0:1::/44", "3214"}, - {"2a0e:b107:1200::/46", "142130"}, - {"2001:1579::/47", "12657"}, - {"2406:840:f620::/47", "140506"}, - {"240a:a5df::/32", "144153"}, - {"2a02:2010:2400::/45", "20978"}, - {"2a02:26f7:ef05::/46", "20940"}, - {"2a0e:97c0:5a0::/47", "210617"}, - {"2a0f:9400:700e::/47", "211144"}, - {"2800:bf0:3040::/46", "52257"}, - {"2600:806:301::/28", "701"}, - {"2600:370f:1065::/40", "32261"}, - {"2803:ca80:2::/32", "263249"}, - {"2a0d:fd40::/41", "14630"}, - {"2001:579:804::/40", "22773"}, - {"2001:bf7:540::/48", "3624"}, - {"2408:8459:c950::/38", "17816"}, - {"2a02:2668:5500::/34", "16345"}, - {"2a04:4e40:a200::/48", "54113"}, - {"2a10:7180::/29", "25459"}, - {"2001:67c:295c::/48", "8365"}, - {"2402:6640:1a::/42", "134995"}, - {"2600:9000:20ac::/43", "16509"}, - {"2803:600::/32", "18809"}, - {"2a06:a001:a020::/44", "48024"}, - {"2603:4007::/28", "3"}, - {"2604:6080::/32", "13739"}, - {"2001:559:2a9::/48", "33491"}, - {"2406:840:e180::/44", "134478"}, - {"240e:438:a40::/37", "4134"}, - {"2a02:970:1289::/39", "44002"}, - {"2001:b28:7b0d::/32", "42065"}, - {"2405:6b00::/48", "132447"}, - {"2603:c025:8000::/35", "31898"}, - {"2801:80:3560::/44", "28614"}, - {"2804:1110::/32", "262901"}, - {"2804:3c80::/35", "266216"}, - {"2a01:ce89:2000::/32", "51964"}, - {"2001:678:f74::/48", "213027"}, - {"2001:67c:790::/48", "207042"}, - {"2804:2f3c:b030::/33", "264879"}, - {"2804:5f00::/47", "269070"}, - {"2a03:8500::/32", "44291"}, - {"2a04:6c00::/29", "62412"}, - {"2a06:1301:4110::/48", "64492"}, - {"240e:3bc:8200::/35", "140316"}, - {"2620:1d0:5c::/48", "397228"}, - {"2800:160:14fe::/39", "14259"}, - {"2a00:1cf8:6000::/35", "44944"}, - {"2a02:26f7:be90::/48", "36183"}, - {"2a09:cd40::/30", "202448"}, - {"2a0f:8880::/29", "42184"}, - {"2001:559:c2f0::/48", "33490"}, - {"2001:df0:bc::/48", "45731"}, - {"2001:1248:7230::/48", "11172"}, - {"2001:1248:a4bf::/41", "11172"}, - {"2607:fd00:7::/48", "32922"}, - {"2804:7a78::/32", "271373"}, - {"2a02:26f0:fa::/47", "20940"}, - {"2604:d600:1c17::/42", "32098"}, - {"2607:fc58:2000:4000::/56", "13536"}, - {"2a02:bc0::/32", "60781"}, - {"240e:3b3::/35", "134773"}, - {"2600:1015:b070::/40", "6167"}, - {"2804:750c::/32", "271020"}, - {"2a07:22c0:8002::/47", "213034"}, - {"2a0e:46c4:2c10::/44", "142289"}, - {"2a10:2980::/29", "209591"}, - {"2803:6000::/32", "52228"}, - {"2a10:64c0::/29", "204007"}, - {"2a11:ad80::/47", "210829"}, - {"240e:438:9620::/43", "140647"}, - {"2600:1001:a010::/40", "22394"}, - {"2605:f500::/39", "1828"}, - {"2804:6fb8::/36", "270679"}, - {"2a00:1b78::/29", "39087"}, - {"2401:3c00:40::/43", "38322"}, - {"2606:2800:5a10::/47", "15133"}, - {"2804:49c:c0f1::/48", "7162"}, - {"2a00:1ec8:62::/47", "2854"}, - {"2a02:26f7:c80d::/42", "20940"}, - {"2001:67c:6c::/48", "1850"}, - {"2001:67c:2ba4::/48", "212864"}, - {"2400:db80::/32", "56293"}, - {"2401:d800:7ae0::/39", "7552"}, - {"2a0d:77c7:d795::/36", "7489"}, - {"2001:44b8:2034::/48", "4739"}, - {"240a:aaab::/32", "145381"}, - {"2a02:cb80:4070::/40", "43766"}, - {"2408:820c:9c10::/34", "17621"}, - {"240e:4c:7800::/31", "4134"}, - {"2a00:11e8::/32", "50399"}, - {"2001:978:8f00:1::/35", "174"}, - {"240e:108:1181::/48", "133775"}, - {"2804:21f8:180::/37", "262272"}, - {"2001:559:86bc::/48", "33287"}, - {"240a:a184::/32", "143038"}, - {"2a0e:b107:800::/44", "213383"}, - {"2404:f780:a::/48", "136557"}, - {"2a00:dfc0::/29", "198551"}, - {"2a0a:6680:1000::/36", "203500"}, - {"2603:f350::/24", "397165"}, - {"2607:9b80:800::/43", "46558"}, - {"2804:6964::/32", "270267"}, - {"2a0a:1240:1100::/32", "12440"}, - {"2a0e:3840:242::/48", "40676"}, - {"2a0e:b107:c9f::/48", "140938"}, - {"2a0e:b107:df6::/48", "141237"}, - {"2602:fed2:731c::/48", "20473"}, - {"2804:338::/32", "262730"}, - {"2804:20fc:1c00::/34", "264525"}, - {"2a01:4ce0:162::/32", "19624"}, - {"2a0e:b107:ea4::/48", "212085"}, - {"2001:559:e2::/47", "33490"}, - {"2001:67c:26ac::/48", "204635"}, - {"2001:df6:8000::/48", "10014"}, - {"240e:67d:8c00::/33", "4134"}, - {"2607:380::/32", "27195"}, - {"2a02:1720::/32", "197219"}, - {"2a02:26f7:cc08::/48", "36183"}, - {"2a02:26f7:e5c1::/46", "20940"}, - {"2a04:5b80:100::/48", "16509"}, - {"240e:5f:600d::/48", "140315"}, - {"2600:370f:74a5::/41", "32261"}, - {"2602:fc37::/36", "399920"}, - {"2801:1a2::/48", "269845"}, - {"2409:8948:9100::/40", "24445"}, - {"2607:ff18:8000::/35", "40630"}, - {"2a02:26f7:34::/48", "36183"}, - {"2001:250:3014::/48", "23910"}, - {"240a:a392::/32", "143564"}, - {"2a02:26f7:bdc1::/46", "20940"}, - {"2402:b800::/32", "7718"}, - {"2600:1405:5401::/36", "20940"}, - {"2a01:53c0:ffeb::/48", "54994"}, - {"2a01:6560::/32", "62248"}, - {"2001:559:275::/48", "33650"}, - {"2001:67c:2ca6::/47", "50838"}, - {"2606:8c00::/48", "22995"}, - {"2607:f3c8::/34", "33724"}, - {"2a01:8640:c::/48", "61102"}, - {"2a02:ddc3:1::/29", "47165"}, - {"2a0b:fe00::/29", "207026"}, - {"2001:1248:97bc::/41", "11172"}, - {"2404:4f00::/34", "17819"}, - {"2404:8d06:7000::/40", "133543"}, - {"2a02:26f7:c40d::/46", "20940"}, - {"2406:2000:efa6::/48", "56173"}, - {"2a0d:3585::/32", "200303"}, - {"2403:ec00:126::/32", "17806"}, - {"240e:67b:e200::/39", "140329"}, - {"2c0f:ea58::/32", "328537"}, - {"2600:1480:9800::/48", "21342"}, - {"2800:160:1f00::/45", "14259"}, - {"2800:370:4::/48", "26613"}, - {"2800:af0::/32", "27984"}, - {"2804:2384::/32", "264167"}, - {"2a00:4800:b0::/41", "8717"}, - {"2001:550:a500:1::/36", "174"}, - {"2804:298c::/32", "264021"}, - {"2a02:26f7:c3::/48", "20940"}, - {"2a02:26f7:bc01::/46", "20940"}, - {"2c0f:f9e0:ffff::/48", "37148"}, - {"2001:559:399::/48", "13367"}, - {"2001:559:84db::/48", "7922"}, - {"2a04:4e40:2610::/44", "54113"}, - {"2001:559:7be::/48", "33657"}, - {"2400:8b00:2100::/42", "45727"}, - {"2604:2880::/48", "46562"}, - {"2803:e5e0::/32", "270035"}, - {"2a06:4180:1::/48", "43595"}, - {"2001:67c:848::/48", "210775"}, - {"2409:8b14::/30", "56044"}, - {"2606:b340::/32", "549"}, - {"2804:5e4c::/32", "269024"}, - {"2804:673c:2000::/40", "264598"}, - {"2a01:a880::/29", "29600"}, - {"2a02:ac87:5901::/40", "25145"}, - {"2a03:380::/32", "13250"}, - {"2a04:3a60:8000::/30", "56467"}, - {"2a0f:e380::/29", "60262"}, - {"2c0f:ecc0::/46", "328523"}, - {"2804:7520::/32", "271025"}, - {"2a0c:ff00::/47", "204975"}, - {"2a0d:ac41::/32", "208861"}, - {"2408:877c::/32", "137539"}, - {"2804:f80::/32", "61893"}, - {"2001:4830:3100::/48", "25623"}, - {"2600:6c7f:9130::/44", "20115"}, - {"2408:8001:3160::/44", "136958"}, - {"240e:980:9300::/40", "134768"}, - {"2602:fd3a:22c::/46", "16509"}, - {"2804:3390::/34", "265404"}, - {"2a0b:2900:7f::/48", "48582"}, - {"2a0e:1000::/29", "60989"}, - {"2001:559:f8::/48", "7922"}, - {"240a:af82::/32", "146620"}, - {"2804:82e4::/32", "272163"}, - {"2a03:7380:2000::/40", "13188"}, - {"2a11:adc0::/29", "49655"}, - {"2a01:c50e:df00::/34", "12479"}, - {"2a11:29c0:b00b::/48", "212149"}, - {"2001:678:bb0::/48", "207687"}, - {"2001:1900:2215::/44", "3356"}, - {"240a:aa72::/32", "145324"}, - {"2404:ec:340::/37", "703"}, - {"2409:8087:6a23::/43", "9808"}, - {"2600:1403:a::/48", "21342"}, - {"2801:15:8001::/44", "263683"}, - {"2a00:a1a0::/32", "41885"}, - {"2a02:26f7:ea44::/48", "36183"}, - {"2001:1a68:15::/48", "35491"}, - {"2606:9c00::/32", "23314"}, - {"2a04:88c0:a::/30", "60781"}, - {"2001:67c:2280::/48", "39399"}, - {"2408:8957:8200::/40", "17622"}, - {"2a00:8a02:10::/42", "200656"}, - {"2a03:5f00:1001::/32", "29644"}, - {"2001:67c:2870::/48", "198743"}, - {"2402:c300::/32", "55653"}, - {"240a:af30::/32", "146538"}, - {"240e:4c:7000::/37", "136197"}, - {"2610:a1:1080::/48", "397226"}, - {"2804:5424::/32", "268631"}, - {"2806:230:3023::/48", "11888"}, - {"2a00:8860:d00::/40", "208136"}, - {"2a05:8700::/29", "43513"}, - {"2a09:7c44::/32", "43624"}, - {"2401:b800::/32", "38248"}, - {"2409:8904:e170::/40", "24547"}, - {"2600:1017:a810::/35", "6167"}, - {"2603:c0fc:1000::/39", "54253"}, - {"2806:230:6021::/48", "11888"}, - {"2001:3c8:c302::/45", "4621"}, - {"2001:503:7bbf::/48", "7342"}, - {"2001:df2:100::/48", "133968"}, - {"2409:8052:1002::/40", "56047"}, - {"2606:4700:3131::/48", "395747"}, - {"2804:62ac::/32", "269311"}, - {"2804:671c::/32", "269604"}, - {"2001:978:5203::/48", "209312"}, - {"2401:d800:9920::/41", "7552"}, - {"2804:20fc:1b01::/40", "264525"}, - {"2804:7394:8000::/33", "270924"}, - {"2a02:26f7:c509::/42", "20940"}, - {"2a05:5e40:f00f::/48", "49681"}, - {"2001:559:c18e::/48", "7922"}, - {"2409:804c:3002::/43", "9808"}, - {"2806:10a6::/46", "8151"}, - {"2a00:1f58::/29", "44385"}, - {"2a00:6240::/32", "198354"}, - {"2402:800:35e0::/44", "7552"}, - {"2a00:17b0::/32", "204896"}, - {"2a02:26f7:f7d1::/42", "20940"}, - {"2a02:cb81:1100::/45", "43766"}, - {"2402:800:5ae0::/44", "7552"}, - {"2607:f428:9180::/42", "19115"}, - {"2804:3d78::/32", "266533"}, - {"2a11:dbc0::/29", "204790"}, - {"2001:568:800::/40", "7861"}, - {"2600:6c20:885::/46", "20115"}, - {"2602:fccf::/36", "398355"}, - {"2a02:26f7:f8d0::/48", "36183"}, - {"2a0b:fa00::/32", "28674"}, - {"2001:559:8235::/48", "7015"}, - {"2001:e60:1070::/33", "4766"}, - {"2408:84f3:ae40::/35", "17816"}, - {"240e:5a:4240::/40", "140293"}, - {"240e:d9:b000::/36", "4134"}, - {"2806:2f0:2081::/48", "22884"}, - {"2a02:26f7:be09::/46", "20940"}, - {"2001:559:534::/48", "33659"}, - {"240a:aa82::/32", "145340"}, - {"2604:d600:66f::/43", "32098"}, - {"2a00:5881:4000::/40", "51083"}, - {"2001:559:178::/48", "33489"}, - {"2001:df5:5d00::/48", "4770"}, - {"2001:2000:4100::/35", "1299"}, - {"2400:fc00:4030::/41", "45773"}, - {"2405:9200:4100::/41", "131596"}, - {"2409:841e::/31", "24400"}, - {"2604:9140:ffff::/48", "265721"}, - {"2804:5e78::/32", "269035"}, - {"2804:8318::/43", "272176"}, - {"2a0a:2b40::/29", "35278"}, - {"2001:559:7e3::/48", "7725"}, - {"2408:8459:cd50::/38", "17816"}, - {"2409:8714:7000::/32", "56044"}, - {"240a:ab8f::/32", "145609"}, - {"2a11:8880::/29", "211344"}, - {"2408:8957:6200::/40", "17622"}, - {"2600:140b:2a01::/39", "20940"}, - {"2a10:740::/29", "62240"}, - {"2a10:2f01:290::/44", "212996"}, - {"2001:550:3b02::/37", "174"}, - {"2607:fa88::/32", "6582"}, - {"2001:4de0:400::/38", "33438"}, - {"2401:c5c0:51::/38", "55492"}, - {"2604:880:59::/46", "29802"}, - {"2604:5740::/32", "19006"}, - {"2620:137:a::/48", "396253"}, - {"2804:2a98::/32", "264082"}, - {"2001:520:1007::/48", "8103"}, - {"2001:559:49c::/48", "33491"}, - {"2001:df7:6880::/48", "133296"}, - {"2404:e100:3006::/47", "133840"}, - {"2408:8456:ec00::/42", "17622"}, - {"2a05:d050:a080::/44", "16509"}, - {"2407:a800:3e11:111a::/64", "4713"}, - {"2600:1404:24::/46", "35994"}, - {"2804:4b0c::/32", "267280"}, - {"2804:7a18::/32", "271347"}, - {"2a11:4900::/29", "42375"}, - {"2001:559:8740::/48", "33657"}, - {"2402:800:9c39::/41", "7552"}, - {"2403:0:117::/44", "4755"}, - {"2409:8008:dc::/48", "9808"}, - {"2804:76d4::/32", "271137"}, - {"2806:230:1013::/48", "11888"}, - {"2001:559:370::/48", "7015"}, - {"2400:2c1:3000::/48", "4766"}, - {"240a:a8ee::/32", "144936"}, - {"2a05:9f44:2a05::/48", "42831"}, - {"2a0e:a800::/29", "212144"}, - {"2001:559:c3c4::/48", "33657"}, - {"2604:ffc0::/47", "36232"}, - {"2620:11f:9009::/48", "14746"}, - {"2804:6bcc::/32", "270426"}, - {"2a0f:8445::/32", "51659"}, - {"2001:489a:2000::/33", "8070"}, - {"2401:4900:5440::/42", "45609"}, - {"2620:105:b000::/40", "2055"}, - {"2803:e600:1d::/32", "18809"}, - {"2804:7cd8::/32", "271522"}, - {"2a02:26f7:e98d::/42", "20940"}, - {"2a0c:b641:212::/48", "209661"}, - {"2c0f:f290::/32", "37492"}, - {"2001:559:80dd::/48", "7015"}, - {"2405:8080::/33", "23664"}, - {"2804:3970::/32", "266030"}, - {"2001:410:102::/48", "53904"}, - {"2400:c700:1302::/34", "55644"}, - {"2a02:26f7:e50d::/46", "20940"}, - {"2001:500:200::/47", "394353"}, - {"2001:559:8000::/48", "33651"}, - {"240e:e9:7000::/37", "134769"}, - {"2605:7b80::/32", "2728"}, - {"2804:ca4::/32", "262336"}, - {"2a0d:140:2000::/29", "209014"}, - {"2a02:24f8::/32", "34385"}, - {"2a10:9100:a::/48", "47890"}, - {"2001:559:8548::/48", "7725"}, - {"2001:4490:33fc::/37", "9829"}, - {"240a:a016::/32", "142672"}, - {"2a00:dc00::/32", "47288"}, - {"2a05:5504:10::/47", "8218"}, - {"2001:253:124::/48", "142090"}, - {"2600:1406:6001::/38", "20940"}, - {"2602:fc48::/36", "63339"}, - {"2606:2800:7100::/48", "15133"}, - {"2001:4c08:2031::/32", "3356"}, - {"2604:d600:1c04::/44", "32098"}, - {"2804:2c58:1110::/38", "265211"}, - {"2400:adc0:110::/47", "9541"}, - {"2600:140b:3400::/48", "31109"}, - {"2a02:b4c::/32", "39572"}, - {"2a0e:1bc7::/35", "208621"}, - {"2001:fd8:68::/40", "4775"}, - {"2401:0:201::/48", "23966"}, - {"2408:8256:3570::/44", "17623"}, - {"2603:c021:8000::/35", "31898"}, - {"2804:60c0::/32", "269188"}, - {"2a02:26f7:f7c1::/46", "20940"}, - {"2001:559:c05e::/48", "7016"}, - {"2600:6c39:236::/44", "20115"}, - {"2001:250:862::/38", "23910"}, - {"240a:2:dcc::/48", "9605"}, - {"2001:67c:208::/48", "30962"}, - {"2001:67c:19f4::/48", "198877"}, - {"2804:14d:1296::/42", "28573"}, - {"2804:f8c::/34", "263591"}, - {"2a01:8840:36::/44", "12041"}, - {"2a0c:f780::/29", "210321"}, - {"2a0d:c2c0::/29", "44592"}, - {"2a0f:2980::/29", "39587"}, - {"2001:678:6::/48", "44358"}, - {"240a:aa1d::/32", "145239"}, - {"240e:397:2100::/38", "140496"}, - {"2606:e000::/32", "26531"}, - {"2a02:26f0:d600::/48", "34164"}, - {"2001:559:830f::/48", "7922"}, - {"2405:6600:704::/44", "45845"}, - {"240a:a064::/32", "142750"}, - {"240a:ad42::/32", "146044"}, - {"2620:11f:e000::/40", "12243"}, - {"2a00:11c0:38::/48", "203833"}, - {"2a0c:e040:1338::/29", "200629"}, - {"2408:8459:850::/38", "17816"}, - {"2800:937::/32", "264731"}, - {"2804:2480::/32", "264227"}, - {"2a01:6940::/32", "29605"}, - {"2001:559:838a::/48", "7015"}, - {"2001:a98:601::/33", "8517"}, - {"2408:8956:1b40::/40", "17816"}, - {"240a:a513::/32", "143949"}, - {"2620:a8:4000::/48", "393900"}, - {"2a01:358:5013::/36", "9121"}, - {"2001:1248:59ef::/43", "11172"}, - {"2408:8956:7f00::/40", "17816"}, - {"240e:a67::/35", "140329"}, - {"2402:800:3ad3::/44", "7552"}, - {"240a:a052::/32", "142732"}, - {"2602:ff76::/36", "21722"}, - {"2a03:1c0::/32", "202207"}, - {"2a04:4e42:26::/47", "54113"}, - {"2401:d800:7c90::/42", "7552"}, - {"2403:5f40::/48", "9268"}, - {"240a:a506::/32", "143936"}, - {"240e:982:d400::/40", "131325"}, - {"2804:4b0:308::/43", "262459"}, - {"2804:4098:f0db::/39", "265969"}, - {"2804:6a20::/32", "270311"}, - {"2001:559:c4aa::/48", "7922"}, - {"2402:600:2::/35", "38515"}, - {"2405:58c0:3c00::/40", "133101"}, - {"2409:8914:a800::/39", "56044"}, - {"2607:a680::/44", "395092"}, - {"2607:f740:e045::/44", "63911"}, - {"2610:178::/32", "16668"}, - {"2804:3838:31::/32", "53170"}, - {"2a00:11c0:4a::/48", "42473"}, - {"2a02:26f7:f3cd::/42", "20940"}, - {"2a04:f080::/29", "34636"}, - {"2a0c:cac0::/29", "202373"}, - {"2a0e:4680::/32", "24961"}, - {"2401:d800:b660::/40", "7552"}, - {"240c:ca0b::/32", "24363"}, - {"2604:5500::/42", "19165"}, - {"2607:ffb0:5003::/45", "6327"}, - {"2a07:e740:dc01::/43", "43299"}, - {"240e:44d:7540::/42", "140356"}, - {"2405:2040:2302::/48", "48024"}, - {"2409:8054::/45", "56040"}, - {"2600:1004:b100::/42", "6167"}, - {"2a01:780::/32", "25415"}, - {"2a02:26f0:8301::/37", "20940"}, - {"2a0e:b107:19f::/48", "209506"}, - {"2a00:d200::/29", "56329"}, - {"2a02:26f7:e1c0::/48", "36183"}, - {"2a0b:f380::/48", "49544"}, - {"2a0f:540::/29", "7018"}, - {"2001:559:4f7::/48", "7922"}, - {"2001:df2:eb00::/48", "9930"}, - {"2001:44c8:4740::/44", "131445"}, - {"2402:e280:2253::/39", "134674"}, - {"2409:8080:2a90::/44", "9808"}, - {"2602:fbf6:800::/37", "62853"}, - {"2602:fed2:7106::/48", "23470"}, - {"2606:69c0:9000::/36", "11039"}, - {"2001:4f8:b::/48", "16509"}, - {"2408:840d:400::/42", "17621"}, - {"2001:df7:7800::/48", "17523"}, - {"240a:adef::/32", "146217"}, - {"240e:980:4500::/40", "58461"}, - {"2620:14a::/36", "13684"}, - {"2a00:4bc0:2101::/44", "16509"}, - {"2a0e:8f02:f01d::/48", "211747"}, - {"2a0f:cf80::/29", "208861"}, - {"2001:559:24a::/48", "33652"}, - {"2001:579:cec0::/39", "22773"}, - {"2001:4b88::/32", "20640"}, - {"2600:6:ff06::/44", "10507"}, - {"2806:2f0:9801::/46", "17072"}, - {"2001:559:818d::/46", "7922"}, - {"2404:f800::/32", "8075"}, - {"240a:aad0::/32", "145418"}, - {"2a03:d000:2000::/36", "31133"}, - {"2a0e:b107:f08::/45", "9886"}, - {"2402:6e80::/32", "139100"}, - {"2600:1f00:6000::/40", "16509"}, - {"2603:f048::/29", "63023"}, - {"2a03:5500::/31", "8315"}, - {"2a06:900:1849::/29", "34373"}, - {"2402:800:bc30::/41", "7552"}, - {"2602:fd13::/36", "397787"}, - {"2a02:ee80:40a8::/46", "3573"}, - {"2a04:c440::/34", "2047"}, - {"2001:579:717c::/40", "22773"}, - {"2610:1a0::/41", "40193"}, - {"2804:160c:4000::/36", "263264"}, - {"2804:2238::/36", "264598"}, - {"2804:70b0::/32", "270742"}, - {"2a00:fc0::/32", "3212"}, - {"2a0a:a0c0::/29", "50973"}, - {"2400:4ec0:d746::/34", "64300"}, - {"2402:800:5455::/42", "7552"}, - {"2a00:7580:60::/48", "8414"}, - {"2a01:94c0::/32", "31370"}, - {"2a0b:6340::/32", "29423"}, - {"2c0f:ee78:8001::/46", "61317"}, - {"2409:8c34:ac00::/33", "9808"}, - {"2606:2e00:8024::/46", "36351"}, - {"2607:f330:6000::/36", "15130"}, - {"2a05:71c0::/29", "34993"}, - {"2001:1a11:118::/48", "8781"}, - {"240a:ad10::/32", "145994"}, - {"2620:12a:2000::/44", "395421"}, - {"2804:6028::/32", "269149"}, - {"2a0e:a180::/29", "208591"}, - {"2a11:e87:6000::/32", "208861"}, - {"2409:8c85:420::/44", "24547"}, - {"2604:5f00::/32", "10755"}, - {"2a00:1c10::/42", "50300"}, - {"2a02:888:8251::/48", "47794"}, - {"2a10:3300::/29", "207459"}, - {"240a:a74e::/32", "144520"}, - {"2620:10a:6000::/44", "33651"}, - {"2804:1374::/32", "263534"}, - {"2804:1dc8::/32", "264393"}, - {"2804:46e4::/32", "267018"}, - {"2806:2f0:7121::/46", "17072"}, - {"2a02:26f7:b6cd::/42", "20940"}, - {"2a0b:b87:ffc0::/44", "50867"}, - {"2606:1a40:200c::/47", "394256"}, - {"2804:6d28::/48", "270516"}, - {"2409:8915:9600::/30", "56044"}, - {"240e:37d:aa00::/39", "140330"}, - {"2806:20d:5502::/38", "32098"}, - {"2408:8256:377c::/46", "17623"}, - {"2a0e:8f02:f027::/48", "212519"}, - {"2402:5680:2000::/36", "133798"}, - {"2404:f4c0:886e::/48", "210384"}, - {"240e:83:800::/32", "4134"}, - {"240e:109:802b::/41", "4134"}, - {"2804:5244::/32", "268506"}, - {"2001:1248:57fe::/47", "11172"}, - {"2407:2880:c001::/46", "24314"}, - {"2407:c000::/32", "9270"}, - {"2605:3c80:fc::/46", "32787"}, - {"2804:68ec::/32", "270237"}, - {"2401:d800:92e2::/39", "7552"}, - {"2606:4a00::/35", "33154"}, - {"2a11:bc0::/48", "208085"}, - {"2001:559:276::/48", "33651"}, - {"2620:28:c000::/48", "55219"}, - {"2402:800:97b7::/41", "7552"}, - {"2408:8456:4440::/38", "17816"}, - {"2409:8904:34a0::/39", "24547"}, - {"2804:13b0:bc00::/45", "263546"}, - {"2a07:59c1:2010::/48", "210770"}, - {"2001:4938::/32", "33554"}, - {"2408:8956:ad00::/40", "17816"}, - {"2605:a401:815e::/42", "33363"}, - {"2a02:26f7:f548::/48", "36183"}, - {"2001:559:8614::/47", "33651"}, - {"2001:4408:5221::/45", "4758"}, - {"240a:acc7::/32", "145921"}, - {"2600:1016:a110::/35", "6167"}, - {"2800:bf0:2001::/39", "27947"}, - {"2a03:2be0::/32", "59859"}, - {"2404:3d00:40e8::/47", "21433"}, - {"2600:1000:d000::/42", "6167"}, - {"2a01:540:9000::/34", "12389"}, - {"2a01:c9c0:cf::/48", "8891"}, - {"2001:559:c1c7::/44", "7922"}, - {"2001:4878:2031::/48", "12222"}, - {"2402:7400:3000::/33", "38883"}, - {"2403:9e00::/32", "9443"}, - {"2404:160:8080::/34", "10030"}, - {"2600:1012::/32", "22394"}, - {"2001:253:108::/48", "142074"}, - {"2408:8957:bc00::/40", "17622"}, - {"240a:a874::/32", "144814"}, - {"240a:ac98::/32", "145874"}, - {"2620:73:e000::/48", "396970"}, - {"2804:1cd8:4::/32", "262691"}, - {"2804:4ae8::/32", "267271"}, - {"2a02:450::/36", "34372"}, - {"2001:67c:2330::/48", "56963"}, - {"2409:8050:800::/47", "56047"}, - {"2607:f3c8:8000::/33", "33724"}, - {"2a02:26f7:e0c5::/46", "20940"}, - {"2a06:94c0::/29", "51918"}, - {"2001:250:7004::/48", "24369"}, - {"2404:1f00::/33", "55947"}, - {"2806:370:12a0::/41", "28403"}, - {"2a02:2500::/32", "5390"}, - {"2401:d800:7250::/42", "7552"}, - {"240a:a1a2::/32", "143068"}, - {"2607:f770::/32", "22958"}, - {"2a02:288::/32", "16300"}, - {"2a06:4c0::/32", "60447"}, - {"2a0a:61c0::/29", "206119"}, - {"2c0f:f3d8::/32", "327741"}, - {"2620:0:d60::/46", "46"}, - {"2800:3a0:2::/45", "23201"}, - {"2a03:8600:1::/48", "38945"}, - {"2a10:cc42:1b1b::/45", "20473"}, - {"2001:559:1bb::/48", "7922"}, - {"2400:fe00::/32", "17968"}, - {"2404:3d80:300::/40", "210542"}, - {"2409:8935::/28", "9808"}, - {"240e:946:2::/34", "58540"}, - {"2a0c:5440:80::/44", "209650"}, - {"2001:559:84df::/48", "33659"}, - {"2409:250::/28", "55392"}, - {"2804:2978::/32", "264017"}, - {"2001:2010::/30", "3308"}, - {"2404:f4c0:fc80::/44", "139888"}, - {"2600:40ff:fffa::/47", "701"}, - {"2804:4ac4::/32", "267262"}, - {"2a00:5560::/32", "205411"}, - {"2a01:648::/29", "57809"}, - {"2a02:26f7:c049::/46", "20940"}, - {"2a0e:b107:12a0::/44", "211851"}, - {"240a:ad38::/32", "146034"}, - {"2a07:e03:30::/39", "210083"}, - {"2001:559:81e5::/48", "33650"}, - {"2409:896a:5400::/39", "9808"}, - {"2409:897f::/24", "9808"}, - {"2a02:e740::/48", "61157"}, - {"2a05:d050:e040::/44", "16509"}, - {"2a06:e881:1200::/44", "202928"}, - {"2001:1578:100::/40", "29317"}, - {"2406:2000:a5::/46", "10310"}, - {"2408:8a00:c000::/35", "9929"}, - {"240a:a069::/32", "142755"}, - {"240a:af36::/32", "146544"}, - {"2607:fdf0:5e31::/45", "8008"}, - {"2610:58:3:aaab::/32", "111"}, - {"2a00:e20:143::/48", "16509"}, - {"2a0a:c0c0::/29", "52031"}, - {"2804:824c::/35", "272511"}, - {"2a0e:aa07:e02e::/48", "210320"}, - {"2001:fd8:64::/46", "132199"}, - {"2606:2800:4aa4::/46", "15133"}, - {"2a02:10:100::/48", "5418"}, - {"2a02:26f7:5d::/48", "20940"}, - {"2605:a401:80ed::/39", "33363"}, - {"2001:503:eea3::/48", "397197"}, - {"2001:1248:a61e::/41", "11172"}, - {"2400:5a20:2::/48", "139006"}, - {"240e:9b:f00c::/46", "140249"}, - {"240a:a3f7::/32", "143665"}, - {"2607:f6f0:206::/48", "27566"}, - {"2806:20d:1d38::/41", "32098"}, - {"2a02:26f7:f64d::/42", "20940"}, - {"2a04:f000::/29", "60016"}, - {"2602:feda:c10::/44", "212359"}, - {"2803:6a60:4::/32", "262186"}, - {"2804:5b04::/32", "268813"}, - {"2001:559:85fe::/48", "7015"}, - {"2409:8070:100::/36", "9808"}, - {"2804:5bd8::/32", "268872"}, - {"2401:4900:4f10::/44", "45609"}, - {"2409:8914:4200::/39", "56044"}, - {"2804:31e8::/32", "265044"}, - {"2806:2f0:9943::/42", "17072"}, - {"2a01:8e80::/29", "8362"}, - {"2a02:348:4::/43", "35470"}, - {"2a03:85c0::/39", "20561"}, - {"2001:1248:873f::/41", "11172"}, - {"2a0a:1400::/30", "400177"}, - {"2a0a:56c4:8600::/47", "42649"}, - {"2001:678:c2c::/48", "212746"}, - {"2400:5080::/48", "38379"}, - {"2600:1405:7001::/37", "20940"}, - {"2800:160:1566::/44", "14259"}, - {"2804:124c::/37", "263468"}, - {"2806:264:300::/41", "13999"}, - {"2806:1070:cfff:8::/64", "8151"}, - {"2a02:888:8248::/47", "48695"}, - {"2a0e:6540:a0::/48", "208364"}, - {"2408:8256:466::/39", "17622"}, - {"2600:9000:1113::/42", "16509"}, - {"2620:0:2b80::/44", "10702"}, - {"2804:1440::/32", "263321"}, - {"2806:100f::/27", "8151"}, - {"2a00:1d88::/32", "13249"}, - {"2a0d:fec0:121::/45", "47481"}, - {"2409:8c28:30b1::/39", "56041"}, - {"240a:a4e0::/32", "143898"}, - {"2804:264c::/32", "264338"}, - {"2a00:86c0:208a::/45", "2906"}, - {"2a01:9260::/32", "28753"}, - {"2a02:26f7:bf84::/48", "36183"}, - {"2001:67c:293c::/48", "211742"}, - {"2001:1a11:116::/47", "42298"}, - {"2402:8bc0::/32", "59012"}, - {"2409:8003:2c00::/32", "9808"}, - {"2605:b100:100::/41", "577"}, - {"2803:9a40::/33", "263824"}, - {"2806:21a:8000::/48", "262913"}, - {"2a02:ff0:14f4::/44", "12735"}, - {"2001:ab8::/29", "34177"}, - {"2001:1248:8864::/43", "11172"}, - {"2001:1878:500::/40", "127"}, - {"2408:8456:4a10::/42", "134543"}, - {"240e:44d:3100::/41", "140345"}, - {"2001:7f8:f::/48", "6895"}, - {"2604:e000::/32", "27553"}, - {"2605:f880::/32", "32281"}, - {"2804:8304::/32", "272171"}, - {"2a04:ff00:500::/48", "23470"}, - {"2405:34c0:1::/45", "134316"}, - {"2408:8872::/32", "4837"}, - {"2001:579:8d9::/42", "22773"}, - {"240e:967:5800::/32", "4134"}, - {"2600:1fa0:6040::/44", "16509"}, - {"2803:c180:2310::/37", "52341"}, - {"2804:44bc::/32", "267650"}, - {"2804:7c14::/33", "271474"}, - {"2a00:1a98::/32", "21107"}, - {"2a04:4e40:7400::/48", "54113"}, - {"2602:fbee::/40", "7247"}, - {"2803:b4c0:4::/32", "264668"}, - {"2401:c500:fd01::/48", "13658"}, - {"2a05:3950:8661::/33", "201503"}, - {"2a0d:3584:1111::/48", "200303"}, - {"2402:5680:6000::/36", "133798"}, - {"2620:119:e021::/43", "30337"}, - {"2620:12d:e004::/46", "397635"}, - {"2001:470:4a::/48", "6379"}, - {"2605:f740::/32", "25892"}, - {"2803:a410:9191::/48", "64114"}, - {"2001:da8:3006::/48", "23910"}, - {"2620:135:600b::/41", "22697"}, - {"2a01:71e0::/32", "199811"}, - {"2403:a640:200::/39", "63786"}, - {"2408:8956:2d00::/40", "17816"}, - {"240a:a050::/32", "142730"}, - {"2600:1f01:4820::/47", "16509"}, - {"2803:c240::/35", "41095"}, - {"2804:13b0:fc00::/38", "263546"}, - {"2a04:53c0:85::/48", "47784"}, - {"2001:df6:4080::/48", "141999"}, - {"2409:8b10:2400::/30", "9808"}, - {"2604:980:1::/48", "40676"}, - {"2a00:cc0:fffd::/46", "13237"}, - {"240a:a2ef::/32", "143401"}, - {"2604:f740:100::/38", "397041"}, - {"2800:160:17bb::/41", "14259"}, - {"2a03:50a0::/32", "39699"}, - {"2a07:1980:20::/46", "48851"}, - {"2a0c:ef40::/29", "49223"}, - {"2402:3c80::/32", "64098"}, - {"2605:3380:4147::/44", "12025"}, - {"2a03:3380::/46", "47169"}, - {"2001:678:2c::/48", "48283"}, - {"240e:3bf:8200::/35", "140316"}, - {"2604:d600:c32::/45", "32098"}, - {"2a02:501::/32", "29345"}, - {"2a07:7180::/29", "42148"}, - {"2a09:fb86::/32", "35913"}, - {"2001:1248:9a0b::/45", "11172"}, - {"2001:44b8:4000::/48", "7545"}, - {"2405:8a00:8001::/43", "55824"}, - {"2607:faf8::/32", "7029"}, - {"2804:3720:1000::/34", "266391"}, - {"2a02:26f7:c900::/48", "36183"}, - {"2a10:7100::/29", "399975"}, - {"2001:df1:4300::/48", "9746"}, - {"2a02:26f7:d909::/46", "20940"}, - {"2a02:ac80:3001::/33", "25145"}, - {"2a03:2e4::/30", "197451"}, - {"2a04:4e40:7200::/48", "54113"}, - {"2001:1248:9c38::/41", "11172"}, - {"2401:d800:fbc0::/42", "7552"}, - {"2804:69b4:7800::/38", "270286"}, - {"2401:cb80::/32", "63581"}, - {"2402:800:360f::/43", "7552"}, - {"2402:800:3dc5::/43", "7552"}, - {"2405:e5c0::/32", "58971"}, - {"2409:8924:ad00::/38", "56046"}, - {"2a00:1358:c101::/35", "6866"}, - {"2001:ce0:2300::/37", "3662"}, - {"2001:43f8:6b0::/47", "8094"}, - {"2408:8456:7240::/39", "17816"}, - {"2602:fed3:11::/48", "21769"}, - {"2804:5d10::/34", "268948"}, - {"2a06:e881:4001::/46", "204604"}, - {"2a07:c840::/29", "62183"}, - {"2a10:2f00:123::/48", "58133"}, - {"2001:559:42::/48", "7922"}, - {"2001:559:c43d::/48", "7015"}, - {"2402:800:7880::/42", "7552"}, - {"2402:3a80:1730::/48", "38266"}, - {"2408:80ea:6680::/41", "17622"}, - {"2409:4060:3000::/31", "55836"}, - {"240e:63::/34", "140313"}, - {"2606:bc00:8001::/36", "19419"}, - {"2800:4b0:4100::/38", "12252"}, - {"2a02:26f7:f888::/48", "36183"}, - {"2a11:9480::/29", "204790"}, - {"2001:559:c39e::/48", "7015"}, - {"240a:abe7::/32", "145697"}, - {"2606:9e00::/32", "16413"}, - {"2620:122::/46", "394186"}, - {"2800:bf0:28::/45", "27947"}, - {"2806:2f0:42c1::/42", "17072"}, - {"2001:67c:c::/48", "48136"}, - {"2001:b10:c000::/35", "8501"}, - {"2402:800:56ee::/39", "7552"}, - {"2607:3700::/32", "16851"}, - {"2804:76c::/32", "262648"}, - {"2804:1638:fac4::/44", "263276"}, - {"2806:2f0:9b63::/40", "17072"}, - {"2a02:4dc0::/32", "25374"}, - {"2a0a:a800::/29", "207198"}, - {"2402:8400:900::/40", "17820"}, - {"2403:2700:4001::/48", "38500"}, - {"2600:1004:d100::/41", "6167"}, - {"2804:5dcc::/32", "268993"}, - {"2806:2f0:1081::/48", "17072"}, - {"2a02:26f7:d184::/48", "36183"}, - {"2602:fdc2:100::/44", "397720"}, - {"2605:7940:face::/48", "30456"}, - {"2607:f6f0:5002::/47", "27224"}, - {"2620:16e:87::/48", "3147"}, - {"2804:cb0:dc01::/34", "52742"}, - {"2804:19c8:3100::/32", "61818"}, - {"2a00:f80:257::/32", "25542"}, - {"2a02:2698:1800::/38", "51604"}, - {"2804:4ac::/32", "262458"}, - {"2804:4c5c::/32", "267366"}, - {"2a00:ac40::/46", "49694"}, - {"2001:559:743::/48", "33287"}, - {"2404:2280:147::/48", "24429"}, - {"2607:f740:e005::/44", "63911"}, - {"2804:13dc:ffff::/48", "262428"}, - {"2a02:2e02:8530::/41", "12479"}, - {"2a02:6900:8208::/48", "4184"}, - {"2a0a:edc0::/32", "209379"}, - {"2001:559:c19c::/46", "33491"}, - {"2401:d800:2bc0::/42", "7552"}, - {"240a:a853::/32", "144781"}, - {"240e:b7:8000::/28", "4134"}, - {"2a00:fa8::/32", "5605"}, - {"2001:ee0:d840::/40", "45899"}, - {"2800:bf0:814a::/48", "27947"}, - {"2a02:26f0:bc01::/40", "20940"}, - {"2a02:26f0:c101::/40", "20940"}, - {"2001:4988::/32", "7029"}, - {"2400:56a0:100::/38", "149485"}, - {"2605:b100:400::/40", "577"}, - {"2804:14c:6185::/41", "28573"}, - {"2a09:400:3000::/36", "208861"}, - {"2a0f:9400:7730::/44", "211767"}, - {"2001:559:2bc::/48", "7922"}, - {"2001:559:3d6::/48", "33652"}, - {"240a:a64a::/32", "144260"}, - {"240b:4000::/30", "45102"}, - {"2607:ff80::/36", "33509"}, - {"2620:4:4000::/48", "53819"}, - {"2803:fbe0:8000::/46", "270092"}, - {"2a05:1000::/47", "201675"}, - {"2401:d800:9440::/42", "7552"}, - {"2403:f000:1::/48", "38220"}, - {"2604:ca00:e000::/48", "36492"}, - {"2a01:8840:e5::/48", "207266"}, - {"2a0a:7700::/29", "206984"}, - {"2406:840:feff::/48", "141445"}, - {"2607:6b80:3c::/48", "13213"}, - {"2804:d70:180::/37", "52626"}, - {"2a01:5ac0::/32", "25460"}, - {"2a02:26f7:7a::/48", "36183"}, - {"2001:559:c2a9::/48", "33287"}, - {"2402:e280:223b::/41", "134674"}, - {"2604:1940::/33", "47096"}, - {"2607:fb10:5073::/40", "2906"}, - {"2a01:cd01:8080::/48", "28708"}, - {"2a02:e982:32::/45", "19551"}, - {"2405:e180::/32", "134143"}, - {"2803:7d80::/33", "11664"}, - {"2a02:2ad0:247::/44", "702"}, - {"2a0a:d6c0:186::/48", "212981"}, - {"2001:1248:8418::/45", "11172"}, - {"2409:8a52:f00::/35", "56047"}, - {"2603:f508::/26", "397165"}, - {"2800:160:105c::/42", "14259"}, - {"2c0f:ff90::/32", "15808"}, - {"2001:67c:78::/48", "20847"}, - {"2405:b900:30::/44", "55701"}, - {"2600:9000:11d1::/44", "16509"}, - {"2602:807:50f8::/47", "55136"}, - {"2607:9800:c114::/46", "15085"}, - {"2804:6e4:9000::/36", "262612"}, - {"2a02:26f7:c840::/48", "36183"}, - {"2001:250:584b::/42", "24363"}, - {"2001:559:8043::/45", "7015"}, - {"2001:559:8300::/48", "33651"}, - {"2001:44b8:3088::/48", "7545"}, - {"2001:67c:18d4::/48", "62075"}, - {"2801:1f:2800::/48", "19429"}, - {"2804:4eb0::/32", "268278"}, - {"2804:6594::/32", "269501"}, - {"2a0e:b107:861::/48", "211840"}, - {"2001:559:85e1::/48", "13367"}, - {"2001:df0:18::/48", "45344"}, - {"2001:df1:bb80::/48", "18207"}, - {"2804:1a58::/32", "61855"}, - {"2804:4000::/32", "265927"}, - {"2001:1248:9976::/44", "11172"}, - {"2602:800:900f::/48", "16876"}, - {"2602:fd16::/32", "62611"}, - {"2801:1b4::/46", "14080"}, - {"2804:31dc::/32", "265041"}, - {"2a02:26f7:b888::/48", "36183"}, - {"2001:559:84b2::/48", "7922"}, - {"2404:48c0::/32", "138134"}, - {"2001:559:82ef::/43", "33651"}, - {"2001:559:8542::/47", "33651"}, - {"2001:1a11:14d::/43", "42298"}, - {"2401:4800:feed::/48", "38457"}, - {"2402:6780::/32", "45213"}, - {"2604:d600:91e::/42", "32098"}, - {"2804:1b2::/35", "18881"}, - {"2804:80ec::/36", "272421"}, - {"2600:6:ff0b::/42", "1239"}, - {"2001:df4:1f80::/48", "18131"}, - {"2001:1b70:4280::/48", "8147"}, - {"2408:8409:3000::/40", "4808"}, - {"2a00:18d8:2::/48", "328126"}, - {"2001:559:26f::/48", "33652"}, - {"2400:c800::/39", "4515"}, - {"2401:8340::/32", "136168"}, - {"240e:d2::/33", "140330"}, - {"240e:f7:a000::/35", "136188"}, - {"2a02:bf8::/35", "1239"}, - {"2a02:6280::/32", "3257"}, - {"2a09:bac0:270::/48", "13335"}, - {"2a0b:47c0::/29", "204805"}, - {"2a0e:1c80:9::/48", "41281"}, - {"2a10:cc40:100::/43", "211659"}, - {"2a11:c880::/29", "52000"}, - {"2404:f801:802d::/33", "3598"}, - {"2620:78:a000::/48", "397990"}, - {"2a02:2a58::/39", "702"}, - {"2001:559:192::/48", "20214"}, - {"2001:df3:9c00::/48", "55536"}, - {"2001:4998:eff5::/48", "36647"}, - {"2804:24e4:f000::/36", "264247"}, - {"2a02:26f7:d105::/46", "20940"}, - {"240e:965:2800::/37", "133776"}, - {"2600:1408:9400::/48", "35994"}, - {"2604:2e80:2::/36", "30036"}, - {"2800:bf0:16f::/43", "52257"}, - {"2804:2e84:ab::/32", "265350"}, - {"2402:e380:316::/48", "140733"}, - {"2406:4500::/32", "38342"}, - {"2001:559:8019::/48", "33491"}, - {"2401:4900:1f20::/47", "24560"}, - {"2409:8057:3806::/48", "9808"}, - {"240e:640:f00::/32", "4134"}, - {"2602:fcce:b2::/41", "399200"}, - {"2605:b000::/32", "33361"}, - {"2806:230:400b::/48", "11888"}, - {"2a02:2430:3::/48", "59491"}, - {"2a02:26f7:83::/48", "20940"}, - {"2a06:3200::/29", "204989"}, - {"2a0e:9bc0::/29", "204790"}, - {"2408:8756:1000::/37", "17622"}, - {"2a04:5980::/29", "201587"}, - {"2a07:dc0::/29", "25231"}, - {"2001:44b8:3081::/48", "4739"}, - {"2600:100b:a110::/35", "6167"}, - {"2001:559:815a::/48", "7015"}, - {"2001:559:8608::/48", "7922"}, - {"2001:1248:5611::/44", "11172"}, - {"2607:f160:25::/48", "22394"}, - {"2803:3240:1::/48", "36351"}, - {"2804:62cc::/32", "269319"}, - {"2a00:1638::/32", "49322"}, - {"2001:67c:3c0::/48", "197495"}, - {"2001:1250:b000::/44", "22894"}, - {"240a:af6f::/32", "146601"}, - {"2607:faa0::/32", "11924"}, - {"2804:9d4:216::/35", "262996"}, - {"2405:f600:11::/44", "45117"}, - {"240e:3b0:9200::/36", "140317"}, - {"2620:134:c003::/45", "394887"}, - {"2001:253:103::/48", "142069"}, - {"2402:dfc0::/44", "4808"}, - {"2406:7340::/32", "132566"}, - {"2804:5a4::/32", "262531"}, - {"2804:7900::/32", "271279"}, - {"2a02:26f7:e7c8::/48", "36183"}, - {"240a:a980::/32", "145082"}, - {"2620:0:1a80::/48", "46964"}, - {"2800:160:132e::/43", "14259"}, - {"2804:6328::/32", "269342"}, - {"2001:559:272::/47", "33287"}, - {"2402:800:37e0::/44", "7552"}, - {"2607:f750:b000::/40", "23473"}, - {"2602:fde1:bb8::/48", "397546"}, - {"2604:d600:620::/45", "32098"}, - {"2604:f980:2600::/40", "19957"}, - {"2401:d800:b520::/41", "7552"}, - {"2001:1388:1454::/40", "6147"}, - {"2402:800:541d::/42", "7552"}, - {"2404:e740:4::/32", "139195"}, - {"2405:8a00:2003::/44", "55824"}, - {"240a:a3c6::/32", "143616"}, - {"240e:978:3100::/36", "4134"}, - {"2a10:c140::/29", "211572"}, - {"2001:559:335::/48", "33657"}, - {"2001:67c:2400::/48", "57146"}, - {"2001:1998:200::/39", "16787"}, - {"240a:a5ce::/32", "144136"}, - {"2a01:7e80:117::/38", "197990"}, - {"2401:1d40:2100::/48", "4811"}, - {"2401:7000:c100::/35", "45177"}, - {"2408:840c:a000::/40", "17621"}, - {"240e:95:8002::/33", "17638"}, - {"2604:7ac0:f00::/40", "12213"}, - {"2804:14c:489::/42", "28573"}, - {"2804:204::/38", "28186"}, - {"2804:3b1c::/32", "266130"}, - {"2a02:26f7:99::/48", "20940"}, - {"2001:1650::/32", "24776"}, - {"240a:41cc::/31", "58834"}, - {"2600:1480:a000::/40", "33905"}, - {"2620:6e:a000::/46", "397444"}, - {"2a0e:fd45:7::/36", "44103"}, - {"2001:1248:9895::/46", "11172"}, - {"2001:1878:810::/38", "226"}, - {"2a0d:e4c4:b000::/36", "210625"}, - {"2409:8054:4c::/48", "9808"}, - {"2804:5624::/32", "267979"}, - {"2a02:598:3::/34", "43037"}, - {"2a02:26f7:c7c4::/48", "36183"}, - {"2a11:d80::/31", "210625"}, - {"2402:800:317f::/40", "7552"}, - {"240a:afaa::/32", "146660"}, - {"2602:feda:b8a::/48", "140889"}, - {"2a02:26f7:f4c5::/46", "20940"}, - {"2a0d:4d40:1a::/48", "50630"}, - {"2a0f:8980::/32", "39351"}, - {"2001:559:5bc::/48", "7016"}, - {"2001:57a:200::/37", "33438"}, - {"2a00:1768::/33", "43350"}, - {"2a02:88d:30::/44", "48695"}, - {"2a06:8804:1::/30", "12517"}, - {"2600:1003:b1e0::/37", "22394"}, - {"2600:5c01:1fff::/34", "10796"}, - {"2404:8d02:49c6::/37", "9587"}, - {"2407:bc00::/32", "37963"}, - {"2804:4d8::/32", "52995"}, - {"2001:559:859d::/46", "7922"}, - {"2001:4bd8:53::/29", "15725"}, - {"2603:c026:8000::/35", "31898"}, - {"2a04:4e40:5e00::/48", "54113"}, - {"240e:3b7:6400::/35", "140312"}, - {"2600:1017:b1e0::/38", "6167"}, - {"2600:141b:a001::/35", "20940"}, - {"2a09:47c0::/48", "44364"}, - {"2001:480::/44", "668"}, - {"2001:559:519::/48", "33651"}, - {"2400:cc00:8900::/38", "17477"}, - {"2402:8100:3880::/42", "55644"}, - {"240a:ab71::/32", "145579"}, - {"240e:a7:7fe7::/44", "140521"}, - {"2604:4d40:2000::/36", "53667"}, - {"2a0b:9e40::/29", "61138"}, - {"2001:57a:f303::/31", "22773"}, - {"2402:c100::/36", "23673"}, - {"240a:a722::/32", "144476"}, - {"2602:805::/44", "53809"}, - {"2606:1a40:1000::/44", "398962"}, - {"2620:13f:d000::/44", "398767"}, - {"2804:14c4::/32", "263349"}, - {"2a02:26f7:bc81::/46", "20940"}, - {"2403:0:e::/39", "4755"}, - {"2c0f:ec48::/32", "327991"}, - {"2401:d800:5af0::/39", "7552"}, - {"2404:9d80::/32", "59249"}, - {"2600:1419:4401::/38", "20940"}, - {"2804:14d:7e8a::/45", "28573"}, - {"2a01:288:4009::/32", "8717"}, - {"2001:470:e5::/48", "6939"}, - {"2001:559:c3c3::/48", "7015"}, - {"2001:4402::/31", "9500"}, - {"2407:8b00::/35", "64073"}, - {"2804:d24::/32", "52603"}, - {"2a00:1de0::/32", "38915"}, - {"2001:559:3a5::/48", "7922"}, - {"2001:67c:27e4::/48", "198644"}, - {"2603:40ff:6000::/36", "10578"}, - {"2806:2f0:2481::/48", "22884"}, - {"2a00:cba0::/32", "21476"}, - {"2a02:220e:270::/40", "6697"}, - {"2a0b:4340:97::/48", "205610"}, - {"240a:abe1::/32", "145691"}, - {"2a05:1700::/48", "56577"}, - {"2a09:95c0::/48", "209562"}, - {"2803:ecc0:deae::/34", "264814"}, - {"2a02:26f7:f74c::/48", "36183"}, - {"2a06:bf40::/30", "400177"}, - {"2401:d800:9020::/41", "7552"}, - {"2401:ee00:1082::/34", "23951"}, - {"2404:e6:110::/40", "703"}, - {"2602:feb4:2a0::/44", "25961"}, - {"2804:111c::/47", "52818"}, - {"2804:6824::/32", "269671"}, - {"2a02:7520::/32", "207234"}, - {"2a04:4e40:5a40::/44", "54113"}, - {"2a0e:6b40:20::/48", "8495"}, - {"2a0e:97c0:250::/47", "211685"}, - {"2409:8004:3051::/39", "24547"}, - {"2408:873d:1000::/36", "140717"}, - {"240a:aafc::/32", "145462"}, - {"240e:3b8:2c00::/35", "134774"}, - {"2804:35b4::/32", "266301"}, - {"2600:141b:7001::/37", "20940"}, - {"2606:ae04:8020::/48", "17224"}, - {"2a0b:24c1::/33", "205961"}, - {"240a:ae48::/32", "146306"}, - {"2605:b080::/32", "11708"}, - {"2a01:9f00::/32", "42187"}, - {"2001:250:2429::/43", "24356"}, - {"2001:250:2800::/45", "138378"}, - {"2001:559:c525::/48", "7016"}, - {"2001:67c:178c::/48", "34907"}, - {"2404:ff80:101::/32", "64096"}, - {"2408:8256:359c::/48", "17816"}, - {"2804:5788::/32", "268070"}, - {"2806:2f0:20c0::/48", "17072"}, - {"2806:2f0:6043::/42", "17072"}, - {"2400:cb00:365::/44", "13335"}, - {"2404:ffc0::/47", "62707"}, - {"2405:b500::/32", "13335"}, - {"2409:8028:3000::/47", "56041"}, - {"2001:400:b15::/44", "293"}, - {"2401:fdc0::/44", "137074"}, - {"2600:803:614::/46", "701"}, - {"2600:1480:580a::/47", "20940"}, - {"2804:1efc::/36", "264458"}, - {"2405:1c0:6261::/45", "55303"}, - {"2408:8756:f00::/44", "136958"}, - {"2409:8904:7f40::/32", "24547"}, - {"2606:9500:5000::/36", "26004"}, - {"2800:bf0:80::/47", "52257"}, - {"2a03:6c80::/32", "15830"}, - {"2a03:d604::/31", "12727"}, - {"2001:559:7d5::/48", "7015"}, - {"2001:e60:a430::/40", "4766"}, - {"2620:109:6000::/44", "36667"}, - {"2a02:26f7:f2c1::/46", "20940"}, - {"2001:470:138::/48", "58110"}, - {"2001:559:c52b::/45", "7922"}, - {"2408:8956:d4c0::/38", "17816"}, - {"240a:ac6b::/32", "145829"}, - {"240a:ae7d::/32", "146359"}, - {"2a00:7300::/32", "47894"}, - {"2a01:8840:5d::/48", "207266"}, - {"2a02:26f7:fc04::/48", "36183"}, - {"240a:aa34::/32", "145262"}, - {"240a:aff8::/32", "146738"}, - {"2806:1040::/40", "8151"}, - {"2a01:2d8::/29", "8224"}, - {"2a02:d107:f002::/45", "197155"}, - {"2a06:a005:260::/40", "133555"}, - {"2001:648:2000::/48", "3323"}, - {"2001:dce:102::/33", "23869"}, - {"2408:8956:a000::/40", "17622"}, - {"2a01:9980:a::/45", "50837"}, - {"2401:4900:5270::/44", "45609"}, - {"240a:af89::/32", "146627"}, - {"2600:100d:a120::/36", "22394"}, - {"240a:a2b5::/32", "143343"}, - {"2600:140b:2c01::/35", "20940"}, - {"2804:18d4::/32", "262489"}, - {"2a02:348::/46", "35470"}, - {"2a04:f47::/32", "28854"}, - {"2a0f:ca87:8::/48", "208749"}, - {"2001:559:c4ac::/48", "13367"}, - {"2001:579:d1a4::/38", "22773"}, - {"2001:67c:75c::/48", "204254"}, - {"240a:a3c4::/32", "143614"}, - {"2804:14c:7585::/44", "28573"}, - {"2a03:ec00::/32", "12847"}, - {"2a0d:b500::/29", "51834"}, - {"2a0f:e140::/48", "60781"}, - {"2c0f:f860::/32", "36890"}, - {"2001:67c:330::/48", "35742"}, - {"2408:8140:2000::/48", "4808"}, - {"2409:8c28:5f91::/34", "56041"}, - {"240e:3bf:5600::/34", "4134"}, - {"2604:6300::/32", "19024"}, - {"2610:a1:1008::/47", "397228"}, - {"2a0e:97c7:130::/44", "212996"}, - {"2001:559:8437::/48", "7016"}, - {"2403:1cc0:2201::/48", "45352"}, - {"2600:6c38:d14::/44", "20115"}, - {"2606:2800:e006::/48", "14210"}, - {"2803:6604::/35", "28075"}, - {"2804:3a8::/32", "53195"}, - {"2a01:6d80:f000::/36", "6723"}, - {"2a0d:7bc0::/29", "40970"}, - {"2001:559:835d::/48", "33490"}, - {"240a:a1ed::/32", "143143"}, - {"240a:ae06::/32", "146240"}, - {"2a00:1a00::/32", "25593"}, - {"2a03:8fe0::/32", "200861"}, - {"2a10:b880::/32", "38965"}, - {"2001:df7:6980::/48", "138754"}, - {"2401:d800:5210::/42", "7552"}, - {"2409:8904:5370::/40", "24547"}, - {"2806:2f0:97a3::/36", "17072"}, - {"2a01:cb20:9000::/33", "3215"}, - {"2001:468:2600::/48", "396955"}, - {"2001:df4:3b00::/48", "55688"}, - {"2404:5c0::/34", "138466"}, - {"2602:fed2:7120::/48", "20473"}, - {"2607:3180:2::/32", "14877"}, - {"2001:559:c25e::/48", "33287"}, - {"2402:8100:2680::/46", "45271"}, - {"2605:6280::/32", "32338"}, - {"2607:7e80:2000::/33", "395354"}, - {"2a02:7e00::/29", "57630"}, - {"2405:e680::/32", "131292"}, - {"2600:370f:1061::/45", "32261"}, - {"2804:2478::/32", "264224"}, - {"2a01:9580::/32", "49544"}, - {"2a02:ff0:2ab::/41", "12735"}, - {"2001:978:6712::/48", "207866"}, - {"2001:4200:300::/44", "36982"}, - {"2600:4407:c034::/47", "55164"}, - {"2603:fb78::/29", "63023"}, - {"2600:1408:9801::/37", "20940"}, - {"2602:fc23:155::/48", "54625"}, - {"2604:a400::/32", "11320"}, - {"2607:f8b0:4017::/32", "15169"}, - {"2a02:970:1062::/44", "44002"}, - {"2403:4200:401::/48", "58534"}, - {"240e:3b3:7a00::/32", "140313"}, - {"2600:1014:b000::/42", "6167"}, - {"2a00:1598::/29", "29518"}, - {"2a07:1c80::/29", "43065"}, - {"2c0f:eca0::/32", "37415"}, - {"2001:7f8:1e::/48", "13004"}, - {"2405:8a00:6017::/44", "55824"}, - {"2804:e0c:140::/47", "28176"}, - {"2001:dc8:2002::/48", "131122"}, - {"2001:ec0:100::/40", "134166"}, - {"2001:4b18:d000::/34", "20746"}, - {"2401:d800:93b0::/41", "7552"}, - {"2408:8459:9010::/42", "17623"}, - {"2620:1e0:ffff::/48", "14145"}, - {"2801:1d:8800::/48", "262589"}, - {"2001:df3:cc00::/48", "134053"}, - {"2405:da00:20::/38", "38235"}, - {"2804:20b8::/35", "264510"}, - {"2401:3cc0:601::/39", "137409"}, - {"2408:8460::/29", "4837"}, - {"2804:588c::/32", "268135"}, - {"2a00:f720::/47", "24824"}, - {"2001:559:39d::/48", "21508"}, - {"2405:d300:800::/40", "17477"}, - {"2408:8256:3d7b::/48", "17816"}, - {"240a:a6ff::/32", "144441"}, - {"2600:100f:f110::/27", "22394"}, - {"2804:45d4::/32", "266952"}, - {"2804:82ec::/32", "272165"}, - {"2a00:a320::/32", "39605"}, - {"2a0d:380::/29", "200044"}, - {"2a0f:c586::/31", "208861"}, - {"2001:678:504::/48", "25070"}, - {"2409:804e:3900::/31", "9808"}, - {"2600:5c01:10de::/48", "11351"}, - {"2607:fc48:c38::/48", "40009"}, - {"2a09:9446::/32", "49981"}, - {"2402:800:5dee::/38", "7552"}, - {"2602:fd50:10::/48", "207609"}, - {"2a09:5440::/29", "199163"}, - {"2a0e:6540:a64::/48", "208364"}, - {"2a0e:b102:170::/45", "209105"}, - {"2a0f:c082::/32", "16262"}, - {"2001:4b20:100:580::/60", "65505"}, - {"2401:900::/32", "9351"}, - {"240a:a241::/32", "143227"}, - {"240e:4:e100::/35", "4134"}, - {"2001:1248:9aa6::/44", "11172"}, - {"2605:e000:70c::/36", "20001"}, - {"2606:cb00:ff17::/48", "6643"}, - {"2a02:db0::/32", "25500"}, - {"2a02:26f0:f701::/36", "20940"}, - {"2607:ff60:11::/33", "3900"}, - {"2a0a:4980::/29", "57112"}, - {"2001:df3:a700::/48", "58785"}, - {"2001:44b8:26::/48", "7545"}, - {"2401:7500:fff4::/47", "133296"}, - {"240e:3bb:1200::/39", "4134"}, - {"2806:230:4004::/48", "265594"}, - {"2a04:3bc0::/29", "34119"}, - {"2804:4d10::/32", "267410"}, - {"2a0c:5980::/29", "209372"}, - {"2602:fed2:fa0::/41", "53356"}, - {"2c0f:e8a8::/32", "328631"}, - {"2406:3c00::/32", "9650"}, - {"240e:44d:7840::/42", "140352"}, - {"2a0a:b900::/29", "31317"}, - {"2409:896a:a600::/39", "9808"}, - {"2600:9000:113b::/45", "16509"}, - {"2a00:1608::/32", "51275"}, - {"2a03:dfc0::/46", "203520"}, - {"2001:1260:300::/40", "13591"}, - {"2604:880:32::/48", "29802"}, - {"2803:26c0::/32", "267788"}, - {"2804:1cc0::/33", "61673"}, - {"2804:2f98::/34", "264901"}, - {"2001:da8:d834::/41", "24362"}, - {"2001:df2:4480::/48", "134319"}, - {"240a:a508::/32", "143938"}, - {"240a:a67d::/32", "144311"}, - {"2801:1fc:12::/48", "27951"}, - {"2804:3288:a200::/35", "52827"}, - {"2804:3744::/32", "266400"}, - {"2a02:2088:1000::/36", "57564"}, - {"2405:d440::/39", "58813"}, - {"2607:8300:1001::/48", "13876"}, - {"2a04:4e40:5e30::/41", "54113"}, - {"2401:d800:d3d0::/37", "7552"}, - {"2404:b1::/35", "9891"}, - {"2405:8a00:21a6::/43", "55824"}, - {"2405:9800:b860::/40", "45430"}, - {"2a01:230::/45", "29182"}, - {"2602:feb4::/44", "25961"}, - {"2604:880:a::/48", "29802"}, - {"2804:3dd0::/32", "266555"}, - {"2806:103e:b::/45", "8151"}, - {"2a02:26f7:c009::/46", "20940"}, - {"2a0d:b00:9201::/48", "205862"}, - {"2a0f:1200::/45", "60781"}, - {"2600:1014:9100::/44", "6167"}, - {"2806:2f0:2440::/48", "17072"}, - {"2a03:8f00::/29", "49621"}, - {"2001:559:4ef::/48", "20214"}, - {"2001:559:80fe::/47", "7015"}, - {"2600:140f:a801::/38", "20940"}, - {"2803:4dc0::/32", "265721"}, - {"2a02:c382::/32", "9108"}, - {"2001:14e8::/47", "6736"}, - {"2001:4410:1005::/40", "132040"}, - {"2604:b680::/32", "18683"}, - {"2001:559:168::/48", "20214"}, - {"2001:da8:27e::/48", "24349"}, - {"2001:da8:a804::/48", "23910"}, - {"2409:800b:2906::/44", "9808"}, - {"2804:1ed4::/32", "52775"}, - {"2a04:9a00:1030::/41", "212157"}, - {"2400:7400:62::/48", "38044"}, - {"2604:f700::/48", "14618"}, - {"2a01:47c0::/32", "5588"}, - {"2c0f:fc88::/42", "36992"}, - {"2804:2160:e00::/35", "264551"}, - {"2806:2f0:9721::/46", "17072"}, - {"2a05:fa00::/29", "30884"}, - {"2001:4868:200::/45", "701"}, - {"2001:4cb8:40b::/48", "49685"}, - {"2a11:29c4:b00b::/48", "212149"}, - {"2406:840:5880::/47", "139317"}, - {"2605:7c00::/32", "25668"}, - {"2620:107:3001::/48", "16509"}, - {"2a0e:fd45:dc0::/44", "212085"}, - {"2402:8100:2458::/45", "55644"}, - {"2407:5200:206::/39", "55915"}, - {"2602:fed2:7183::/48", "400307"}, - {"2605:a404:487::/41", "33363"}, - {"2607:fee0::/34", "3599"}, - {"2a03:ac40:1::/48", "212882"}, - {"2a05:1200::/30", "201654"}, - {"2a07:c40::/29", "2119"}, - {"2a11:9340::/29", "204790"}, - {"2804:3c38::/32", "266197"}, - {"2804:582c::/32", "268111"}, - {"2409:8c85:5411::/44", "9808"}, - {"2606:1a40:f000::/45", "398962"}, - {"2803:d460::/32", "3549"}, - {"2408:8431::/32", "4837"}, - {"2409:8914:1700::/36", "56044"}, - {"240e:3b2:dc00::/34", "4134"}, - {"2804:4f8:4000::/36", "28263"}, - {"2a01:8840:51::/48", "207266"}, - {"2a02:f3c0::/29", "49633"}, - {"2a0d:3841:1010::/48", "57629"}, - {"2001:559:1e6::/48", "7015"}, - {"2001:678:394::/48", "8995"}, - {"240a:af2f::/32", "146537"}, - {"2608:8105:1::/48", "1733"}, - {"2804:5198::/32", "268464"}, - {"2a02:6680:1100::/44", "16116"}, - {"2a03:afe1::/32", "198203"}, - {"240a:abe8::/32", "145698"}, - {"2600:1008:d020::/43", "6167"}, - {"2804:6b90::/32", "270408"}, - {"2a00:ab40::/34", "41798"}, - {"2001:559:8296::/48", "7922"}, - {"2001:df6:2380::/48", "141767"}, - {"2602:ffc5:60::/43", "7489"}, - {"2800:98:170d::/46", "14754"}, - {"2804:804c::/32", "271742"}, - {"2a0b:6900:2::/48", "206873"}, - {"2001:678:ab8::/48", "35814"}, - {"240e:bf:c800::/37", "4835"}, - {"2606:c900::/32", "22834"}, - {"2a02:26f7:c600::/48", "36183"}, - {"2400:cb00:430::/46", "13335"}, - {"2400:d400:ffff::/48", "45671"}, - {"2407:0:0:5::/58", "4761"}, - {"2407:c340::/48", "140822"}, - {"2804:3798::/44", "266423"}, - {"2001:559:c42f::/48", "33662"}, - {"2607:f6f0:d000::/40", "12085"}, - {"2620:0:1af0::/48", "36786"}, - {"2a01:788:4::/48", "34305"}, - {"2409:8c1e:9000::/34", "9808"}, - {"2806:2f0:6243::/42", "17072"}, - {"2001:1258::/32", "28499"}, - {"240a:a1e1::/32", "143131"}, - {"2605:5c0:c080::/45", "28885"}, - {"2a02:503:9::/29", "5538"}, - {"240a:ae07::/32", "146241"}, - {"2604:a100:100::/48", "6939"}, - {"2a04:4e40:cc10::/44", "54113"}, - {"2405:f800::/32", "17506"}, - {"240a:af01::/32", "146491"}, - {"2600:6c38:1bb::/45", "20115"}, - {"2804:87c::/32", "28202"}, - {"2a02:26f7:f640::/48", "36183"}, - {"2401:7500:100::/40", "33480"}, - {"2804:35c8::/32", "266306"}, - {"2a00:e60::/32", "62023"}, - {"2a01:9c80::/29", "35805"}, - {"2a02:26f7:d20d::/46", "20940"}, - {"2a0f:cd80::/32", "204805"}, - {"2408:840d:a000::/42", "17621"}, - {"2604:9e03::/32", "393710"}, - {"2408:8756:1800::/34", "17816"}, - {"2620:36:c000::/48", "1645"}, - {"2a00:1d58:d080::/39", "47524"}, - {"2001:559:42d::/48", "7015"}, - {"2001:559:c4ba::/48", "7015"}, - {"2401:7500:200::/40", "133296"}, - {"2402:1f00::/32", "16276"}, - {"2403:9800:c042::/44", "133124"}, - {"2405:7f00:3261::/36", "133414"}, - {"2408:84f3:a010::/42", "134543"}, - {"2600:100d:b140::/42", "6167"}, - {"2600:1408:1c01::/34", "20940"}, - {"2a00:1288:efc5::/35", "10310"}, - {"2a03:88c0::/32", "9150"}, - {"2406:57c0:136::/44", "134672"}, - {"2800:160:1353::/45", "14259"}, - {"2a01:6b20:8000::/34", "39218"}, - {"2a02:e900::/32", "16302"}, - {"2a0d:ac0::/29", "42689"}, - {"2001:559:266::/47", "7725"}, - {"2409:8052:1800::/47", "56047"}, - {"2600:140f:ac01::/38", "20940"}, - {"2804:1000::/32", "28208"}, - {"2804:154c:5011::/44", "263382"}, - {"2a0b:4080::/48", "16509"}, - {"2001:4888:8069::/34", "6167"}, - {"2800:484:1300::/37", "10620"}, - {"2803:c180:2410::/39", "52341"}, - {"2a02:26f7:c0c4::/48", "36183"}, - {"2a03:2880:f222::/43", "32934"}, - {"2a09:1240::/48", "44364"}, - {"2001:3c8:5008::/37", "4621"}, - {"2405:1700::/32", "132395"}, - {"2409:8c28::/38", "56041"}, - {"240a:a69d::/32", "144343"}, - {"2605:dd40:8203::/45", "398549"}, - {"2404:7180:b001::/46", "23848"}, - {"240a:a684::/32", "144318"}, - {"240e:947:1004::/36", "137690"}, - {"2605:8bc0::/44", "26695"}, - {"2a0b:3c40:11::/46", "208258"}, - {"2001:13d2:816::/34", "7303"}, - {"240a:a83c::/32", "144758"}, - {"240e:698:2400::/40", "134768"}, - {"2a03:b500:2080::/35", "41135"}, - {"2a05:f440:e::/29", "35280"}, - {"2a10:dc40::/29", "34907"}, - {"2001:559:301::/48", "33652"}, - {"2001:67c:19ec::/48", "47208"}, - {"2001:4878:246::/48", "12222"}, - {"2402:e380:31b::/48", "141706"}, - {"2803:de60::/32", "267924"}, - {"2803:e610::/32", "271945"}, - {"2804:526c:e000::/35", "268517"}, - {"2804:7670::/32", "271112"}, - {"2a02:1388:5000::/29", "29247"}, - {"2a0d:2900:a::/45", "50069"}, - {"2001:2020::/31", "12929"}, - {"2600:140f:f::/39", "20940"}, - {"2620:9c:6000::/48", "174"}, - {"2803:6560::/32", "269755"}, - {"2804:368c::/32", "266355"}, - {"240a:a6a8::/32", "144354"}, - {"2a01:288:4006::/47", "8717"}, - {"2a07:7300::/29", "202877"}, - {"2001:c60::/32", "17828"}, - {"240e:f7:5000::/36", "4134"}, - {"2605:a401:81e1::/43", "33363"}, - {"2001:254:8000::/33", "24490"}, - {"2001:67c:114::/48", "9150"}, - {"2600:1408:7401::/36", "20940"}, - {"2a02:26f7:d880::/48", "36183"}, - {"2a06:2d40:2::/48", "62240"}, - {"2a0e:aa07:f004::/47", "139742"}, - {"2001:502:4612::/48", "397226"}, - {"2001:559:83f4::/48", "33650"}, - {"2001:dc8:1000::/48", "38736"}, - {"2001:1248:84df::/42", "11172"}, - {"240a:a306::/32", "143424"}, - {"2600:380:dc10::/38", "7018"}, - {"2001:fd0:1301::/34", "10029"}, - {"240a:a217::/32", "143185"}, - {"240e:108:1195::/48", "63838"}, - {"2804:4988::/32", "267189"}, - {"2804:6780::/32", "269632"}, - {"2001:da8:d826::/43", "24362"}, - {"2401:d800:78d0::/42", "7552"}, - {"2604:d600:c0a::/43", "32098"}, - {"2800:3c0::/35", "19863"}, - {"2a03:3a60::/32", "49544"}, - {"2001:559:83e9::/46", "7015"}, - {"2001:4490:d930::/46", "9829"}, - {"2804:4b0:1200::/32", "262459"}, - {"2804:289c::/32", "263970"}, - {"2406:840:fbb6::/47", "139058"}, - {"2407:5740::/48", "140799"}, - {"240a:ae5f::/32", "146329"}, - {"2800:bf0:2c0::/45", "52257"}, - {"2a00:c40:8096::/33", "34315"}, - {"2a02:26f7:f38d::/42", "20940"}, - {"2a04:e00::/48", "54103"}, - {"2a0b:4342:1a80::/43", "57695"}, - {"2602:fed3:b::/48", "21769"}, - {"2a00:d820::/32", "8769"}, - {"2a05:7400:c000::/34", "60980"}, - {"2001:1284::/32", "14868"}, - {"240a:ac72::/32", "145836"}, - {"240e:3bc:1400::/38", "134773"}, - {"2a00:e00::/32", "8304"}, - {"2a00:bc00::/32", "31272"}, - {"2a01:170::/35", "8820"}, - {"2a09:6e80::/29", "48585"}, - {"2001:67c:608::/48", "200020"}, - {"2001:44c8:4690::/42", "45430"}, - {"2406:1400:c109::/48", "24342"}, - {"2801:1b8:8::/45", "28000"}, - {"2804:2fdc:4000::/36", "264917"}, - {"2001:559:8272::/48", "33651"}, - {"2409:8904:58b0::/39", "24547"}, - {"240a:a5f2::/32", "144172"}, - {"240e:67f:8800::/38", "140330"}, - {"2804:317c::/32", "265018"}, - {"2804:7d9c::/32", "271572"}, - {"2a01:280:340::/48", "201317"}, - {"2a02:26f7:f6db::/48", "20940"}, - {"2a02:2890::/48", "51185"}, - {"2a0b:4340:1304::/48", "205152"}, - {"2001:5b0:300::/40", "6621"}, - {"2402:800:5dd3::/44", "7552"}, - {"2405:204:f000::/31", "55836"}, - {"2600:1405:7800::/48", "21342"}, - {"2620:6:2000::/46", "395460"}, - {"2804:1810:f000::/38", "263262"}, - {"2804:7560::/32", "271042"}, - {"2a00:e080::/32", "15557"}, - {"2a02:26f7:8b::/48", "20940"}, - {"2a09:f440::/32", "29462"}, - {"2001:559:8597::/48", "7015"}, - {"2400:6680:f000::/36", "13414"}, - {"2803:9760::/32", "265684"}, - {"2a02:6b8:7::/44", "208722"}, - {"2a04:bc40:1dc3::/45", "35277"}, - {"2001:559:833d::/48", "33659"}, - {"240a:a347::/32", "143489"}, - {"2600:250e:f000::/36", "1246"}, - {"2606:6c00:102::/48", "32787"}, - {"2803:2480::/32", "263185"}, - {"2800:400:1c::/48", "27668"}, - {"2a00:4802:1c10::/39", "8717"}, - {"2a01:74c0:20::/32", "15540"}, - {"240e:147::/24", "4134"}, - {"2a01:e04::/28", "12322"}, - {"2a0a:7d80:1000::/36", "56740"}, - {"2001:550:9f03::/34", "174"}, - {"2001:559:83df::/48", "22909"}, - {"2001:a70::/32", "8426"}, - {"2401:d800:f290::/42", "7552"}, - {"2602:800:c400::/38", "398577"}, - {"2001:559:c3b5::/44", "33287"}, - {"2001:7f9:4::/48", "42409"}, - {"2a0a:4587:2000::/44", "213341"}, - {"2a10:17c0::/29", "397651"}, - {"2001:253:106::/48", "142072"}, - {"2001:253:114::/48", "142080"}, - {"2001:16f8:4001::/32", "25525"}, - {"2400:d400:6::/48", "45671"}, - {"240a:a35b::/32", "143509"}, - {"2a0a:19c0::/29", "206231"}, - {"2a10:cdc0:f000::/37", "213100"}, - {"2001:559:c355::/48", "7725"}, - {"2001:49f0:d0a0::/44", "174"}, - {"2406:8800:903b::/41", "17465"}, - {"2408:840d:de00::/42", "17621"}, - {"2803:2180:1f::/48", "27941"}, - {"2a05:2701:f30::/44", "62371"}, - {"2a07:a5c0::/36", "58293"}, - {"2001:44b8:603c::/47", "7545"}, - {"240a:a1bf::/32", "143097"}, - {"240e:b1:f000::/37", "136197"}, - {"2800:cc0::/32", "262210"}, - {"2001:559:c2e6::/48", "33660"}, - {"2001:fa8::/32", "4697"}, - {"2404:a600::/32", "23816"}, - {"2408:80fa:75c0::/32", "17816"}, - {"2604:d600:121c::/42", "32098"}, - {"2a04:18c0::/29", "60941"}, - {"2a06:e881:1700::/48", "206813"}, - {"2a10:cc40:15e::/48", "206895"}, - {"2a02:26f7:f989::/42", "20940"}, - {"2001:250:240f::/43", "24356"}, - {"2001:1388:8411::/41", "6147"}, - {"2407:3b40::/32", "149058"}, - {"2409:8c5b:ffff::/26", "9808"}, - {"2607:fd48:d04:2::/34", "13536"}, - {"2804:7cf0::/32", "271528"}, - {"2a0d:1a40:7553::/48", "213185"}, - {"2001:559:20e::/48", "33651"}, - {"2001:1508::/32", "29208"}, - {"2401:3c0:10f::/43", "45528"}, - {"2606:4700:303d::/46", "13335"}, - {"2804:6bf4::/32", "270436"}, - {"2a03:cf00::/32", "3313"}, - {"2a12:9ec0::/29", "400522"}, - {"2001:559:7b2::/48", "33491"}, - {"2402:3a80:16e0::/39", "38266"}, - {"2804:24bc::/32", "52695"}, - {"2a03:1e84:abf::/48", "1136"}, - {"2a07:e345:103::/40", "212477"}, - {"2a09:4c2:2e::/48", "205947"}, - {"2001:559:82f4::/48", "33668"}, - {"2001:559:c35f::/48", "13367"}, - {"2604:ca00:1f6::/44", "36492"}, - {"2a02:2e02:cf0::/39", "12479"}, - {"2a04:7040:1471::/48", "212012"}, - {"2a0f:9400:7300::/44", "207890"}, - {"2a10:5e80::/29", "328486"}, - {"2806:289::/32", "28418"}, - {"2001:559:8606::/48", "33651"}, - {"2001:67c:277c::/48", "208818"}, - {"2a09:5f80::/48", "48038"}, - {"2a0c:5840::/32", "197226"}, - {"2402:f80::/32", "134004"}, - {"2603:c0ea::/35", "1218"}, - {"2804:1b0:1000::/36", "18881"}, - {"2804:86c::/32", "262369"}, - {"2a0c:9a40:811b::/45", "204438"}, - {"2001:cf0::/32", "9848"}, - {"2401:4900:58a0::/41", "45609"}, - {"2407:e8c0::/46", "147049"}, - {"2600:1006:b040::/42", "6167"}, - {"2606:4700:4000::/43", "13335"}, - {"2801:12e::/48", "271858"}, - {"2803:f2c0::/32", "52468"}, - {"2a00:86c0:2078::/47", "2906"}, - {"2001:559:c187::/48", "7922"}, - {"240a:abb2::/32", "145644"}, - {"240e:45c:6700::/40", "140530"}, - {"2604:e00::/32", "13370"}, - {"2620:160:e340::/44", "4196"}, - {"2a01:88c0::/32", "198807"}, - {"2a0e:b107:382::/48", "208753"}, - {"2a0f:ea42::/32", "7018"}, - {"2001:559:1f7::/48", "33650"}, - {"2001:da8:800c::/47", "24365"}, - {"2404:ba00:ffff::/48", "17665"}, - {"2408:8406:1800::/39", "4808"}, - {"240e:965:d600::/34", "4134"}, - {"2600:1488:a101::/40", "20940"}, - {"2804:774:400::/32", "52858"}, - {"2806:20d:1d1b::/42", "32098"}, - {"2001:678:dc4::/48", "213032"}, - {"2001:df1:6002::/48", "10021"}, - {"2408:8459:c850::/39", "17816"}, - {"240e:44d:1840::/42", "140360"}, - {"2a02:26f7:f049::/42", "20940"}, - {"2001:67c:17ac::/48", "42251"}, - {"2a00:8720::/32", "41937"}, - {"2a05:d000:a000::/40", "16509"}, - {"2a0e:d604::/48", "62410"}, - {"2a11:ec40::/29", "49655"}, - {"2406:2000:ef6a::/40", "10310"}, - {"2600:370f:3423::/45", "32261"}, - {"2600:6c10:10f::/43", "20115"}, - {"2602:fe6b:1000::/43", "398646"}, - {"2001:44b8:404d::/48", "4739"}, - {"2409:8751:1100::/30", "56047"}, - {"2800:440:84::/48", "27738"}, - {"2401:d800:9342::/42", "7552"}, - {"2602:fe27:70::/48", "6473"}, - {"2800:484:1600::/34", "10620"}, - {"2804:101c::/32", "53043"}, - {"240e:698:4200::/40", "58466"}, - {"240e:982:8300::/37", "133775"}, - {"2408:8456:ea10::/42", "134543"}, - {"2409:8904:3f60::/33", "24547"}, - {"240a:a7b2::/32", "144620"}, - {"240a:aef1::/32", "146475"}, - {"2803:1060::/32", "267809"}, - {"2a0f:efc1::/32", "42160"}, - {"2001:678:d54::/48", "213187"}, - {"2405:6680::/32", "135425"}, - {"2600:140a:2000::/48", "35994"}, - {"2600:140f:9801::/38", "20940"}, - {"2605:a404:55a::/40", "33363"}, - {"2607:f128::/48", "46440"}, - {"2803:9800:b024::/43", "11664"}, - {"2804:6288:f400::/36", "269302"}, - {"2a02:26f7:13::/48", "20940"}, - {"2c0f:eab8::/32", "328564"}, - {"2401:d800:f170::/40", "7552"}, - {"2402:5300:510::/38", "45903"}, - {"2409:8a52:300::/37", "56047"}, - {"2803:5440:ca::/48", "264738"}, - {"2804:27c::/32", "25933"}, - {"2001:559:75e::/48", "33657"}, - {"240a:ad6b::/32", "146085"}, - {"240e:db:9800::/48", "38283"}, - {"2a03:21c0::/32", "41722"}, - {"2a0e:aa07:f000::/48", "139742"}, - {"2001:559:1bd::/48", "7016"}, - {"2001:678:1bc::/48", "48149"}, - {"2402:800:f350::/42", "7552"}, - {"2a0c:2f07:d::/48", "206924"}, - {"2a10:a700::/46", "212329"}, - {"2401:7400:6801::/32", "4773"}, - {"2402:800:b212::/41", "7552"}, - {"2408:873d:2000::/36", "140716"}, - {"2409:803c:1000::/40", "24444"}, - {"2a02:f20::/32", "197695"}, - {"2001:559:b::/48", "33657"}, - {"2600:1406:600::/48", "35994"}, - {"2001:678:5d4::/48", "3320"}, - {"2600:1480:1800::/48", "21342"}, - {"2602:feda:bd0::/48", "140946"}, - {"2a04:1540::/29", "199348"}, - {"2a06:dac0:200::/44", "212661"}, - {"2001:559:586::/48", "7922"}, - {"2001:559:849a::/48", "33651"}, - {"2404:f4c0:f600::/45", "139328"}, - {"2a0d:bd80::/30", "47724"}, - {"2001:559:c135::/48", "33651"}, - {"2001:16a2:c240::/40", "39891"}, - {"2600:1006:f040::/44", "6167"}, - {"2a01:6e00:11::/32", "43142"}, - {"2001:678:420::/48", "44233"}, - {"240a:ade1::/32", "146203"}, - {"2800:150:6::/48", "20940"}, - {"2804:18:6020::/43", "26599"}, - {"2620:149:22a::/47", "714"}, - {"2803:abe0::/32", "270082"}, - {"2a01:9820::/32", "62086"}, - {"2001:67c:2964::/48", "57330"}, - {"2620:133:6000::/44", "22084"}, - {"2a01:cd01:8020::/48", "28708"}, - {"2404:1a0:1003::/34", "24334"}, - {"2405:201:4800::/35", "55836"}, - {"2407:c080:7000::/47", "55990"}, - {"2409:408d:9000::/25", "55836"}, - {"2600:140f:b801::/38", "20940"}, - {"2a00:de40::/32", "29119"}, - {"2001:559:38f::/48", "33654"}, - {"2408:8459:6c10::/42", "17623"}, - {"2605:f500:202::/37", "1828"}, - {"2804:7ca8::/32", "271510"}, - {"2408:8459:6230::/41", "17622"}, - {"2408:866a::/32", "4837"}, - {"2409:f:f1::/48", "142501"}, - {"240a:ab92::/32", "145612"}, - {"2001:559:c154::/48", "33660"}, - {"2400:b000:200::/48", "45209"}, - {"2405:6cc0::/32", "131958"}, - {"2409:8914:400::/39", "56044"}, - {"2409:8c28:7ce1::/39", "56041"}, - {"2409:8c34:800::/37", "9808"}, - {"2801:80:1660::/48", "52623"}, - {"2a02:26f7:eb05::/46", "20940"}, - {"2a0b:2a40::/32", "29423"}, - {"2001:43f8:3e0::/48", "37599"}, - {"2408:8456:1000::/42", "17622"}, - {"2806:370:5460::/40", "28403"}, - {"2a0e:3700::/29", "210874"}, - {"2600:9000:225e::/42", "16509"}, - {"2604:3cc0:2012::/44", "396298"}, - {"2001:67c:1990::/48", "207077"}, - {"2001:67c:2208::/48", "21079"}, - {"2402:e280:217c::/38", "134674"}, - {"2a00:1ee0::/32", "41357"}, - {"2a01:53c0:ffe0::/45", "54994"}, - {"2a02:26f7:e048::/48", "36183"}, - {"2a0b:a540::/29", "1267"}, - {"2a0f:b506::/48", "206313"}, - {"2001:b18:1012::/48", "47787"}, - {"2402:800:59d3::/44", "7552"}, - {"2408:80ea:74e0::/43", "17623"}, - {"2409:8c04::/35", "24547"}, - {"2607:e880:501::/48", "12220"}, - {"2804:1ef0::/32", "52650"}, - {"2a02:1388::/34", "29247"}, - {"2606:700::/32", "54054"}, - {"2804:2728:e00::/32", "263880"}, - {"2804:818c::/32", "272461"}, - {"2a02:26f7:d289::/46", "20940"}, - {"2409:8087:7d00::/38", "9808"}, - {"240a:a42e::/32", "143720"}, - {"2a00:7900::/32", "21000"}, - {"2a03:d9c0:2000::/48", "3214"}, - {"2a09:2e80::/29", "199486"}, - {"2408:8459:22c0::/37", "17816"}, - {"2604:6600:4c::/42", "40676"}, - {"2806:230:602a::/48", "265594"}, - {"2a02:26f7:94::/48", "36183"}, - {"2a0b:b600:3c04::/48", "43350"}, - {"2001:559:8710::/47", "33491"}, - {"2804:49c:3403::/48", "7162"}, - {"2804:7a8c::/32", "271378"}, - {"2a0e:8f02:2133::/44", "211722"}, - {"2001:67c:2e7c::/48", "199165"}, - {"2804:5c1c::/32", "268888"}, - {"2a03:420::/32", "28994"}, - {"2a0d:2a00:1::/46", "205157"}, - {"2a0f:5707:abb1::/48", "211620"}, - {"2001:67c:2c8::/48", "47829"}, - {"2402:3cc0::/32", "137257"}, - {"2408:8957:1700::/40", "17816"}, - {"2607:f7c8::/37", "36221"}, - {"2804:8294::/32", "272527"}, - {"2a0b:26c0::/29", "56800"}, - {"2001:3c8:a703::/33", "4621"}, - {"2409:8c44:1b00::/48", "9808"}, - {"2603:90b3::/32", "11426"}, - {"2806:1030::/32", "8151"}, - {"2a05:a880:10::/48", "51964"}, - {"2a0b:3c40:15::/46", "208258"}, - {"2001:559:7cb::/48", "33667"}, - {"2607:3180:b001::/33", "14877"}, - {"2620:171:dc::/46", "42"}, - {"2a02:968::/32", "12859"}, - {"2a0f:c40::/29", "60262"}, - {"2408:856c::/31", "4837"}, - {"2600:1402:19::/48", "20940"}, - {"2804:676c:c00::/32", "269627"}, - {"2a05:7e40::/29", "203854"}, - {"2a0f:ae80::/32", "48131"}, - {"2001:579:b054::/40", "22773"}, - {"2620:ce:8000::/48", "14738"}, - {"2a00:b0e0::/32", "34282"}, - {"2a0c:b440::/29", "48438"}, - {"2408:8957:fd00::/40", "17622"}, - {"2610:a1:3010::/48", "12008"}, - {"2804:4b14::/32", "267282"}, - {"2a11:8480::/32", "47596"}, - {"2402:fd00::/32", "38264"}, - {"2a03:1e00::/32", "34219"}, - {"2a0e:6580::/29", "57112"}, - {"240a:a994::/32", "145102"}, - {"240a:ab17::/32", "145489"}, - {"2a00:fc00:e001::/46", "3255"}, - {"2a0b:e40:1::/46", "205809"}, - {"2602:ff84:e::/48", "36351"}, - {"2610:98::/32", "11478"}, - {"2801:80:3710::/47", "269346"}, - {"2804:7490::/32", "270989"}, - {"2a07:e100::/32", "200925"}, - {"2a0b:dc0::/47", "58049"}, - {"2001:559:24d::/48", "33654"}, - {"2001:41c0::/31", "2818"}, - {"2401:d800:5c50::/42", "7552"}, - {"2600:6c38:f16::/47", "20115"}, - {"2605:3bc0::/32", "7850"}, - {"2607:f6f0:7000::/48", "27330"}, - {"2a10:cc44:201::/48", "211522"}, - {"2001:559:c4f5::/48", "33659"}, - {"2400:3240::/32", "63996"}, - {"2401:d800:7f82::/42", "7552"}, - {"2408:8856::/40", "17816"}, - {"2408:8957:6800::/40", "17622"}, - {"240e:108:1100::/47", "136195"}, - {"2600:141b:4801::/35", "20940"}, - {"2804:f30::/32", "263569"}, - {"2a02:26f0:ec01::/38", "20940"}, - {"2a02:26f7:f1c1::/46", "20940"}, - {"2001:559:c319::/48", "7725"}, - {"2001:678:e::/48", "31529"}, - {"2a01:a280:4::/48", "206357"}, - {"2404:bf40:f102::/48", "2764"}, - {"2600:1408:9401::/36", "20940"}, - {"2600:6c38:114::/44", "20115"}, - {"2605:6600::/32", "21766"}, - {"2001:559:808e::/43", "33657"}, - {"2a01:b747:6f1::/39", "714"}, - {"2a0f:9cc0::/29", "212144"}, - {"2001:559:52a::/48", "33491"}, - {"2001:df0:248::/48", "23883"}, - {"2409:8078:2c00::/30", "9808"}, - {"2a07:f6c0::/29", "49191"}, - {"2a0e:aa06:460::/44", "209215"}, - {"2001:ee0:3120::/38", "45899"}, - {"2001:1228::/32", "18592"}, - {"2401:d800:f500::/42", "7552"}, - {"2408:8459:b630::/41", "17622"}, - {"2600:1417:9801::/34", "20940"}, - {"2605:c00:1800::/39", "46920"}, - {"2620:13a:c011::/46", "53356"}, - {"2620:149:a0c::/43", "6185"}, - {"2a02:7b8::/32", "45011"}, - {"2a0f:2900::/29", "208245"}, - {"2001:559:8545::/48", "7016"}, - {"2001:678:e94::/48", "212695"}, - {"2600:1002:a010::/40", "22394"}, - {"2800:160:184c::/43", "14259"}, - {"2804:204:327::/44", "28186"}, - {"2001:67c:20b8::/47", "25303"}, - {"2402:800:9e60::/40", "7552"}, - {"240e:14:9000::/36", "140330"}, - {"2605:2cc0::/32", "395494"}, - {"2606:f280:4000::/34", "46261"}, - {"2804:26c::/32", "262813"}, - {"2804:1b8c::/32", "61734"}, - {"2001:1900:2350::/47", "10753"}, - {"2407:b001:3100::/32", "24121"}, - {"2800:160:228c::/39", "14259"}, - {"2804:41d0:3200::/37", "267458"}, - {"2804:81ec::/32", "272486"}, - {"2a01:7c00:20::/29", "52075"}, - {"2001:510:109::/42", "376"}, - {"2403:a200:a101::/40", "17428"}, - {"2600:1402:d801::/34", "20940"}, - {"2605:3380:480d::/48", "12025"}, - {"2806:105e:14::/44", "8151"}, - {"2400:8500:3fff::/48", "55907"}, - {"2600:370f:71e4::/38", "32261"}, - {"2a0b:11c0:1010::/48", "198682"}, - {"2001:67c:2c84::/48", "50838"}, - {"2001:4190:8024::/48", "8938"}, - {"2401:b140::/46", "54415"}, - {"2404:3d00:40ca::/43", "3573"}, - {"2804:61c0::/33", "269254"}, - {"2001:559:c18f::/48", "7725"}, - {"240e:974:e800::/39", "38283"}, - {"2600:141b:5001::/36", "20940"}, - {"2804:607c::/32", "269170"}, - {"2a02:2498:e005::/35", "13213"}, - {"2a04:4340::/31", "61349"}, - {"2a0e:2240::/47", "30633"}, - {"2a0e:97c0:233::/48", "211704"}, - {"2001:da8:24d::/46", "23910"}, - {"2001:df6:6d80::/48", "142044"}, - {"2620:0:dc0:4820::/48", "683"}, - {"2804:88:8000::/47", "28135"}, - {"2804:3a00::/32", "266064"}, - {"2806:20d:5016::/42", "32098"}, - {"2001:388:3030::/48", "137188"}, - {"2401:3bc0::/45", "137409"}, - {"2600:1fa0:5080::/44", "16509"}, - {"2804:1070:100::/40", "28209"}, - {"2001:559:c195::/48", "33491"}, - {"2001:4c80::/32", "2857"}, - {"2406:5800:400::/38", "132064"}, - {"240a:a03b::/32", "142709"}, - {"2a04:dbc0::/30", "8395"}, - {"2c0f:f4c0:10a0::/37", "37611"}, - {"2600:100d:a020::/40", "22394"}, - {"2804:8474:20::/32", "272261"}, - {"2a03:ef42:c000::/34", "57218"}, - {"2a0a:1ac0::/29", "206897"}, - {"2001:559:83f2::/47", "33651"}, - {"2409:8904:6640::/42", "24547"}, - {"2600:1401:2001::/33", "20940"}, - {"2600:8804:2400::/35", "22773"}, - {"2604:d600:153b::/41", "32098"}, - {"2a02:9010:74::/48", "13195"}, - {"2607:f110:13::/45", "21889"}, - {"2804:5364:2000::/33", "268581"}, - {"2a02:26f7:b9d0::/48", "36183"}, - {"2001:559:82a7::/48", "7922"}, - {"2600:370f:5042::/42", "32261"}, - {"2803:11e0::/32", "269997"}, - {"2409:8915:3600::/39", "56044"}, - {"2607:f7a0:5::/46", "46562"}, - {"2804:3160:8000::/33", "265010"}, - {"2804:5a30:9000::/33", "268754"}, - {"2a02:2380:ff00::/48", "51941"}, - {"2a0a:1b80::/30", "34773"}, - {"2001:df1:ba00::/48", "45259"}, - {"2001:1a11:f7::/48", "8781"}, - {"240a:a09a::/32", "142804"}, - {"2605:c3c0:e000::/35", "393954"}, - {"2a03:2887:ff0c::/48", "8966"}, - {"2a0a:3140:2610::/44", "15532"}, - {"2001:c20:486c::/46", "9255"}, - {"2001:c20:4874::/48", "9255"}, - {"2401:b200:62::/40", "24186"}, - {"2a03:5640:f140::/46", "2906"}, - {"2a0e:c7c1::/45", "210977"}, - {"2a0e:fb80::/29", "208551"}, - {"2a11:b480::/29", "204790"}, - {"2001:559:4fb::/45", "7922"}, - {"2405:4803:f2f0::/36", "18403"}, - {"2600:140b:9400::/48", "31109"}, - {"2a01:8640:e::/48", "202015"}, - {"2001:559:c377::/48", "20214"}, - {"2001:678:570::/48", "205107"}, - {"2602:ffc5:35::/41", "7489"}, - {"2c0f:7c00::/32", "328809"}, - {"2001:da8:8::/40", "23910"}, - {"240e:44d:7b00::/42", "140345"}, - {"2605:bc00::/32", "46309"}, - {"2a00:1c88:101::/48", "208685"}, - {"2001:67c:2eec::/48", "60531"}, - {"2408:840c:4e00::/40", "17621"}, - {"240a:a77f::/32", "144569"}, - {"240e:bf:c000::/37", "4134"}, - {"2620:102:4020::/43", "4130"}, - {"2a02:2578:130d::/36", "51375"}, - {"2a02:26f7:ded0::/48", "36183"}, - {"2600:1406:37::/44", "35994"}, - {"2800:160:1f24::/44", "14259"}, - {"2a09:d7c0::/29", "28771"}, - {"2001:4998:ef9a::/41", "10310"}, - {"2804:1afc::/32", "61702"}, - {"2a0c:15c0::/29", "59965"}, - {"2401:d800:b5d0::/42", "7552"}, - {"2409:8753:500::/38", "56047"}, - {"2801:1e:800::/48", "3816"}, - {"2804:104c:2000::/40", "263629"}, - {"2a0c:7e42:f776::/48", "20473"}, - {"2001:559:811a::/48", "33489"}, - {"2001:da8:402d::/48", "23910"}, - {"2405:cb00::/48", "55309"}, - {"2600:6c10:168::/40", "20115"}, - {"2602:feda:df0::/47", "147071"}, - {"2607:f5b8::/32", "46208"}, - {"2a03:bec0::/32", "202016"}, - {"2402:800:3901::/44", "7552"}, - {"2600:1402:401::/36", "20940"}, - {"2600:1404:e801::/37", "20940"}, - {"2804:4a38::/33", "267225"}, - {"2a0e:97c3:685::/48", "20473"}, - {"2405:b40::/47", "55674"}, - {"2405:ec00:1101::/32", "23955"}, - {"2620:4a::/48", "25739"}, - {"2806:2f0:2423::/43", "22884"}, - {"2a00:d560::/29", "15600"}, - {"2a02:26f7:f0c9::/42", "20940"}, - {"2a11:3540::/29", "204790"}, - {"2001:559:c445::/48", "7922"}, - {"2606:4f00::/48", "19324"}, - {"2607:fc48:1008::/48", "40009"}, - {"2801:b0::/40", "52888"}, - {"2806:2f0:8023::/41", "17072"}, - {"2a01:68::/32", "13193"}, - {"2a02:26f7:d685::/46", "20940"}, - {"2402:1d40:4008::/35", "58826"}, - {"240a:af4b::/32", "146565"}, - {"2604:4840::/32", "17252"}, - {"2804:5ffc::/32", "269138"}, - {"2a00:dd80:9::/48", "36236"}, - {"2001:468:2811::/32", "11537"}, - {"2405:201:5600::/36", "55836"}, - {"2407:f800:501::/40", "38182"}, - {"2600:370f:5205::/46", "32261"}, - {"2604:7c40::/40", "395649"}, - {"2804:14d:4083::/41", "28573"}, - {"2804:55d0::/37", "267958"}, - {"2804:6de4::/32", "270562"}, - {"2a00:75e0::/32", "206897"}, - {"2a04:2b00:14aa::/48", "203961"}, - {"2001:559:702::/47", "7016"}, - {"2001:559:775::/48", "33650"}, - {"2403:7c00::/32", "10001"}, - {"2408:8459:e630::/41", "17622"}, - {"240a:a285::/32", "143295"}, - {"2604:2400::/32", "14107"}, - {"2620:4f:8000::/48", "112"}, - {"2804:145c:d000::/34", "263327"}, - {"2a09:88c0::/29", "62336"}, - {"2a0e:d080::/29", "15623"}, - {"2a0f:8a00::/29", "43402"}, - {"2800:160:14e1::/46", "14259"}, - {"2804:18:5008::/45", "26599"}, - {"2a02:26f7:ea45::/46", "20940"}, - {"2001:559:5d9::/48", "33491"}, - {"2a00:86c0:2096::/32", "2906"}, - {"2001:250:85b::/48", "23910"}, - {"2001:559:8157::/48", "33491"}, - {"2001:44b8:404b::/48", "4739"}, - {"2804:7a88::/32", "271377"}, - {"2806:2f0:72a3::/41", "17072"}, - {"2001:559:c39b::/48", "33287"}, - {"240a:a560::/32", "144026"}, - {"2607:f160:3e::/48", "22394"}, - {"2a0a:3bc0::/32", "206201"}, - {"2409:8d5a:5c8::/42", "56040"}, - {"2600:1000:b0c0::/42", "6167"}, - {"2620:171:19::/48", "715"}, - {"2a01:9c00::/32", "44567"}, - {"2a0a:8500::/29", "206936"}, - {"2001:559:151::/48", "7015"}, - {"2600:1413:b001::/36", "20940"}, - {"2804:14c:f2::/37", "28573"}, - {"2804:10a0::/40", "28173"}, - {"2804:1e20:9940::/48", "264409"}, - {"2a0e:b107:15b0::/48", "211169"}, - {"2603:c001:1630::/36", "31898"}, - {"2607:2f00:1f::/32", "12025"}, - {"2804:8090::/32", "271759"}, - {"2001:dcd:3::/48", "397232"}, - {"2405:7f00:90a0::/39", "133414"}, - {"2600:100a:a010::/40", "22394"}, - {"2600:1010:ff00::/44", "6167"}, - {"2804:4ca0:2::/39", "267381"}, - {"2a03:e340:1::/48", "60781"}, - {"2a0f:9240:2001::/32", "49434"}, - {"2402:800:5b63::/43", "7552"}, - {"240a:a3c3::/32", "143613"}, - {"240a:a6ae::/32", "144360"}, - {"2606:2800:404a::/45", "14210"}, - {"2804:490:8800::/38", "265705"}, - {"2804:4460::/32", "267629"}, - {"2404:e801:201f::/48", "45938"}, - {"2408:8459:8a50::/37", "17816"}, - {"2620:8b:a000::/48", "399196"}, - {"2804:5534:1800::/34", "268696"}, - {"2a03:5a00:14::/48", "59679"}, - {"2a06:dbc0::/29", "5578"}, - {"2001:559:8718::/48", "33652"}, - {"2400:cb00:a4f0::/46", "13335"}, - {"2600:2600::/31", "33362"}, - {"2803:f580::/32", "61470"}, - {"2a04:2dc0:1d::/48", "212460"}, - {"240a:aba7::/32", "145633"}, - {"2401:b800:f001::/36", "38248"}, - {"240e:438:240::/37", "4134"}, - {"2606:2800:4ad4::/46", "15133"}, - {"2607:f4f8::/32", "23127"}, - {"2804:7b5c::/44", "271427"}, - {"2806:2f0:3002::/42", "17072"}, - {"2a09:1180::/29", "59441"}, - {"240a:ab88::/32", "145602"}, - {"2001:579:cb00::/37", "22773"}, - {"2001:4488:f962::/38", "7713"}, - {"2804:10b4:11::/39", "263645"}, - {"2804:4574::/32", "266927"}, - {"2804:4590::/32", "266935"}, - {"2a03:ec80::/48", "211220"}, - {"2a0c:7100::/29", "40970"}, - {"2a12:e580::/29", "60135"}, - {"2408:8956:7000::/40", "17622"}, - {"2600:2000:2100::/42", "31898"}, - {"2001:da8:6002::/43", "24355"}, - {"2404:1f00:7000::/32", "55947"}, - {"2620:1ec:e::/43", "8075"}, - {"2a00:b300::/32", "8613"}, - {"2001:67c:22b8::/48", "49770"}, - {"2400:cb00:2049::/48", "13335"}, - {"2600:140b:3001::/38", "20940"}, - {"2804:24ec::/32", "264248"}, - {"2a0e:b107:6e3::/48", "213215"}, - {"240a:a2a9::/32", "143331"}, - {"240a:a68f::/32", "144329"}, - {"240e:974:e100::/40", "4134"}, - {"2600:1480:d800::/48", "21342"}, - {"2801:80:1aa0::/48", "28248"}, - {"240a:af90::/32", "146634"}, - {"2804:6da0::/32", "270545"}, - {"2603:6000::/32", "10796"}, - {"2804:364c::/32", "266340"}, - {"2804:612c:4000::/32", "269218"}, - {"2a02:888:8051::/48", "47794"}, - {"2a02:25ad:1a:d2::/30", "12824"}, - {"2a06:a000:190::/44", "212200"}, - {"2001:559:458::/47", "7015"}, - {"2001:df2:a300::/48", "6336"}, - {"2600:1419:1000::/48", "4230"}, - {"2804:954:88::/38", "263073"}, - {"2a10:2f01:350::/46", "212793"}, - {"2001:559:827b::/45", "7922"}, - {"2001:dd8:6::/48", "18368"}, - {"2408:8459:a210::/42", "17623"}, - {"240e:fc:f000::/31", "4134"}, - {"2804:5c08::/32", "52548"}, - {"2409:8904:4860::/39", "24547"}, - {"2600:1403:9c01::/34", "20940"}, - {"2600:6c33:719::/32", "20115"}, - {"2606:8e80:1800::/34", "32133"}, - {"2620:10c:2000::/48", "40931"}, - {"2408:840d:7500::/42", "17621"}, - {"240a:a4c7::/32", "143873"}, - {"2c0f:f4b8::/32", "327889"}, - {"2001:44c8:4620::/43", "45430"}, - {"2400:1880::/32", "17670"}, - {"2405:8540::/32", "138296"}, - {"2a09:2885::/48", "202316"}, - {"2001:c20:c84f::/43", "3758"}, - {"2600:380:7980::/38", "20057"}, - {"2600:6c7f:9080::/48", "20115"}, - {"2804:6184::/32", "269239"}, - {"2a0f:ca81:1330::/44", "212085"}, - {"2405:c9c0:5::/42", "138823"}, - {"2605:6400:100::/48", "53667"}, - {"2a03:28e0::/32", "48093"}, - {"2001:df1:e500::/48", "63773"}, - {"2400:ffc0::/47", "17439"}, - {"2620:0:5090::/48", "22796"}, - {"2a02:2360::/32", "51034"}, - {"2801:1a2:4::/48", "269845"}, - {"2400:9780::/46", "136557"}, - {"2401:d800:ffc2::/42", "7552"}, - {"2407:3e00:400a::/48", "9255"}, - {"240a:aa32::/32", "145260"}, - {"2001:ee0:1081::/34", "45899"}, - {"2400:ac40:c90::/42", "136255"}, - {"2408:8459:dc10::/42", "17623"}, - {"2610:a1:30fc::/48", "397228"}, - {"2a00:d120::/43", "29990"}, - {"2001:470:33::/48", "14613"}, - {"2001:7f8:1d::/48", "29432"}, - {"2409:8080:2a50::/44", "9808"}, - {"240a:ad49::/32", "146051"}, - {"240e:44d:6100::/41", "140345"}, - {"2804:d70:120::/41", "52626"}, - {"2a01:bd40::/29", "12586"}, - {"2a02:26f7:d259::/42", "20940"}, - {"2a07:c000::/29", "202551"}, - {"2a02:26f7:ba05::/46", "20940"}, - {"2a06:1e00:50::/48", "60695"}, - {"2409:8904:66b0::/39", "24547"}, - {"2604:9540::/32", "33125"}, - {"2a02:2f0c:8002::4/62", "8708"}, - {"2001:df0:413::/48", "132423"}, - {"2409:805c:4900::/35", "9808"}, - {"2409:8904:4660::/39", "24547"}, - {"240a:ad6e::/32", "146088"}, - {"2600:6c10:f04e::/43", "20115"}, - {"2800:160:1e9b::/42", "14259"}, - {"2801:80:1920::/48", "264971"}, - {"2804:314:4027::/44", "61568"}, - {"240e:95d::/37", "136193"}, - {"2604:640::/48", "393562"}, - {"2a00:c6c0:1::/48", "133752"}, - {"2001:559:c2e4::/48", "33287"}, - {"2001:559:c4cf::/43", "33650"}, - {"2001:559:c4e8::/48", "7922"}, - {"240e:44d:7200::/42", "140345"}, - {"240e:690::/29", "4134"}, - {"2806:230:1207::/40", "11888"}, - {"2a01:b740:a21::/48", "714"}, - {"2001:559:4bc::/47", "33287"}, - {"2001:559:c183::/48", "7015"}, - {"240a:ae1a::/32", "146260"}, - {"2a02:26f7:e449::/42", "20940"}, - {"2001:559:8048::/48", "7016"}, - {"2001:678:d3c::/48", "206628"}, - {"2001:c20:a006::/35", "3758"}, - {"2001:fd8:b340::/42", "132199"}, - {"2404:7d80::/32", "9268"}, - {"2600:1488:a461::/40", "20940"}, - {"2600:40f0:1120::/44", "7046"}, - {"2a01:7220::/32", "62179"}, - {"2806:2f0:4561::/46", "17072"}, - {"2001:468:cc0::/48", "3140"}, - {"240a:a0ef::/32", "142889"}, - {"240e:45c:ca00::/40", "131285"}, - {"2602:fdd4::/36", "396855"}, - {"2401:d800:7450::/42", "7552"}, - {"2600:1408:5001::/37", "20940"}, - {"2600:140f:e001::/38", "20940"}, - {"2a03:43a0::/32", "44500"}, - {"2a0f:d601::/29", "208236"}, - {"2001:550:2304::/40", "174"}, - {"2402:800:39ee::/38", "7552"}, - {"240e:964:d600::/34", "4134"}, - {"2607:f928:12::/48", "16905"}, - {"2800:160:1121::/44", "14259"}, - {"2804:6648::/32", "269546"}, - {"2806:230:602e::/48", "265594"}, - {"2001:250:5862::/48", "138371"}, - {"2001:559:c466::/48", "20381"}, - {"2401:d800:f450::/42", "7552"}, - {"2604:3400:abcc::/48", "209453"}, - {"2a00:d18::/32", "12714"}, - {"2a0a:68c0:ff00::/40", "134835"}, - {"2a0c:3b80::/32", "58057"}, - {"2001:559:8356::/48", "33651"}, - {"2401:d800:52d0::/42", "7552"}, - {"2408:876a::/32", "4837"}, - {"2602:fc3b:301::/37", "399970"}, - {"2804:14c:65c7::/44", "28573"}, - {"2001:3c8::/38", "4621"}, - {"2001:450:2015::/48", "3356"}, - {"2a02:26f7:cc01::/45", "20940"}, - {"2001:67c:2e28::/48", "3320"}, - {"2604:f400:11::/48", "32654"}, - {"2a0f:5707:af0b::/48", "211358"}, - {"2001:6c8::/29", "3292"}, - {"2409:8907:8020::/39", "24547"}, - {"2800:160:1ceb::/43", "14259"}, - {"2001:67c:1498::/48", "43455"}, - {"2001:dce:5101::/40", "23869"}, - {"2402:800:3d8d::/43", "7552"}, - {"2403:9800:7f0c::/48", "4648"}, - {"2804:7044::/32", "270716"}, - {"2a01:410:3::/32", "30844"}, - {"2403:4280::/48", "23724"}, - {"2404:bc0:4400::/44", "137735"}, - {"2404:4a00:8a00:1::/33", "45629"}, - {"240e:3b3:2c00::/35", "134774"}, - {"2804:4be8::/33", "267336"}, - {"2a02:9b0:403c::/41", "35819"}, - {"2a07:e02:41::/48", "16509"}, - {"2a09:9680::/29", "51546"}, - {"2a0b:dd80::/29", "8298"}, - {"2001:67c:418::/48", "8981"}, - {"2605:a401:8dd2::/42", "33363"}, - {"2804:7990::/32", "271313"}, - {"2804:82cc::/32", "272157"}, - {"2a00:1b98::/32", "25376"}, - {"2a0b:6b83:2001::/33", "202562"}, - {"2400:8905::/32", "48337"}, - {"240a:a81b::/32", "144725"}, - {"2606:2800:4254::/46", "15133"}, - {"2a02:7760::/32", "48166"}, - {"2001:4490:3000::/42", "9829"}, - {"2406:d00:ddff::/48", "132165"}, - {"2409:8004:802::/45", "24547"}, - {"240a:a97a::/32", "145076"}, - {"2a00:f38::/29", "12297"}, - {"2607:3f00::/46", "46261"}, - {"2607:f500:1800::/32", "6181"}, - {"2800:ba0:8::/48", "263812"}, - {"2a02:26f7:c788::/48", "36183"}, - {"2a05:e740:160::/48", "29108"}, - {"2001:5e0:20::/48", "20224"}, - {"2001:1900:2236::/41", "3356"}, - {"2408:8459:b650::/36", "17816"}, - {"2605:5800::/32", "15305"}, - {"2606:7c80:102::/48", "40300"}, - {"2a00:1228:2::/45", "31148"}, - {"2001:fe8:8100::/47", "24435"}, - {"2402:ef15::/32", "9430"}, - {"2804:49c:3101::/46", "15201"}, - {"2400:a980:5d00::/38", "133111"}, - {"2409:8d06::/28", "9808"}, - {"2c0f:eb00:f00::/35", "328962"}, - {"2606:a440:5::/48", "16509"}, - {"2806:230:5012::/48", "265594"}, - {"2404:4dc0::/32", "63570"}, - {"240e:980:3000::/33", "4134"}, - {"2620:131:1049::/46", "26450"}, - {"2804:6024::/32", "269148"}, - {"2a02:ed04:4410::/39", "50304"}, - {"2001:559:5b8::/46", "7922"}, - {"2001:67c:4a0::/48", "43623"}, - {"2409:8008:da::/48", "9808"}, - {"2602:fc23:113::/48", "8095"}, - {"2001:468:d01::/48", "3582"}, - {"2a0e:b107:9fe::/48", "208699"}, - {"2405:c140::/32", "139567"}, - {"2409:8750:1100::/32", "56047"}, - {"2804:3684::/32", "266353"}, - {"2804:3df8:4::/33", "266566"}, - {"2804:7df0::/32", "271592"}, - {"2a0c:3040::/29", "13054"}, - {"2001:1248:8809::/42", "11172"}, - {"2404:4a00:8000:1::/37", "45629"}, - {"2407:3e40::/32", "137165"}, - {"240a:af3d::/32", "146551"}, - {"240e:967:800::/37", "133774"}, - {"2600:100a:b1e0::/33", "22394"}, - {"2605:a404:a1::/44", "33363"}, - {"2606:7700::/48", "399830"}, - {"2804:1768::/32", "263144"}, - {"2a07:a341::/32", "20473"}, - {"2605:f440:bef0::/33", "54874"}, - {"2620:137:4000::/40", "22601"}, - {"2801:1f:8800::/48", "18747"}, - {"2a00:9520::/48", "56641"}, - {"2a09:8680::/29", "38946"}, - {"2405:ba00:8808::/48", "7160"}, - {"2400:a980:3900::/37", "133111"}, - {"240a:a441::/32", "143739"}, - {"2600:6c21:40a::/47", "20115"}, - {"2804:3294::/32", "265086"}, - {"2a05:b040::/29", "8453"}, - {"2400:cb00:aa23::/45", "13335"}, - {"2409:8904:e070::/40", "24547"}, - {"2600:6000:f5d6::/36", "12271"}, - {"2804:5440::/32", "268637"}, - {"2a02:26f7:c60c::/48", "36183"}, - {"2a0c:b642:1a0b::/48", "3280"}, - {"2a0e:7900::/29", "207902"}, - {"2402:8cc0::/40", "131137"}, - {"2402:a300:c000::/45", "55427"}, - {"2409:8904:e270::/40", "24547"}, - {"2a0d:9a40::/29", "47832"}, - {"2600:1404:7001::/38", "20940"}, - {"2801:15:4800::/48", "19429"}, - {"2001:559:80dc::/48", "7922"}, - {"2001:559:c0e7::/48", "33287"}, - {"2409:8028:900::/37", "9808"}, - {"2804:35d4::/32", "266309"}, - {"240a:ac86::/32", "145856"}, - {"2604:e880::/32", "40156"}, - {"2804:1080:8004::/33", "28287"}, - {"2804:3e68::/32", "266594"}, - {"2a00:11c0:25::/43", "42473"}, - {"2a09:11c0:200::/44", "207613"}, - {"2a09:e240:1::/46", "35133"}, - {"2a10:1c40::/48", "206222"}, - {"2800:bf0:80fc::/46", "27947"}, - {"2a09:4e00::/32", "208861"}, - {"240a:ab86::/32", "145600"}, - {"240e:438:2840::/38", "4134"}, - {"2804:14d:12aa::/41", "28573"}, - {"2804:1368::/36", "262808"}, - {"2804:7a54:bebe::/48", "271365"}, - {"2a00:1f10::/32", "198682"}, - {"2a0c:75c0:4::/29", "44486"}, - {"2001:559:87f3::/48", "7922"}, - {"2401:7000:d900::/47", "45177"}, - {"2406:9dc0:60::/44", "18250"}, - {"2620:7f:a000::/48", "62827"}, - {"2a0c:a040::/32", "48918"}, - {"2c0f:edb0::/32", "36236"}, - {"2001:559:87f9::/45", "7015"}, - {"2401:d800:b202::/42", "7552"}, - {"2600:1017:f010::/39", "6167"}, - {"2600:140f:7401::/38", "20940"}, - {"2602:feb4:170::/44", "25961"}, - {"2610:a1:3044::/48", "12008"}, - {"2804:e8::/39", "28280"}, - {"2a0f:cb00::/48", "213274"}, - {"2001:df7:6780::/48", "146944"}, - {"2408:8956:6d00::/40", "17816"}, - {"240e:45c:b400::/40", "131285"}, - {"2603:c0f8::/38", "20054"}, - {"2801:16:4800::/48", "269791"}, - {"2a03:e700::/32", "8922"}, - {"2a0a:9c80::/32", "200665"}, - {"2a00:7180:8018::/33", "15557"}, - {"2a02:acc1::/30", "198726"}, - {"2001:480:a2::/44", "668"}, - {"2402:79c0:1127::/48", "26415"}, - {"240e:3b7:1400::/38", "134773"}, - {"2a0c:63c0::/48", "39642"}, - {"2402:3a80:30::/46", "38266"}, - {"2804:14c:3baa::/43", "28573"}, - {"2804:17e0::/32", "263256"}, - {"2a10:3400::/29", "210054"}, - {"2408:8256:3d89::/48", "17816"}, - {"2804:4148::/32", "267425"}, - {"2806:2f0:10c0::/43", "22884"}, - {"2a00:16f8:1::/44", "6461"}, - {"2a07:aa00:8::/41", "3549"}, - {"2a12:4940:1966::/32", "211398"}, - {"2001:559:c2bd::/46", "7015"}, - {"240a:a6bf::/32", "144377"}, - {"2603:fbd0::/21", "397165"}, - {"2606:4700:90c0::/43", "13335"}, - {"2620:1ec:90d::/46", "8075"}, - {"2804:6104::/32", "269206"}, - {"2a01:a640::/32", "15966"}, - {"2a10:2f00:17e::/48", "209225"}, - {"2804:38f8::/32", "266515"}, - {"2a05:3180::/32", "34580"}, - {"2c0f:ec80:d000::/34", "37315"}, - {"2a00:4680::/32", "56672"}, - {"2001:559:5eb::/48", "22909"}, - {"2402:8100:27f0::/47", "45271"}, - {"240a:ae2f::/32", "146281"}, - {"2605:f100::/32", "14265"}, - {"2620:13f:6000::/44", "237"}, - {"2801:80:550::/48", "28215"}, - {"2804:16d8:1000::/38", "262729"}, - {"2a02:26f7:c3dc::/48", "36183"}, - {"2a10:2c0::/29", "60636"}, - {"2408:84f3:9810::/42", "134543"}, - {"240a:a8de::/32", "144920"}, - {"2a02:26f7:ed04::/48", "36183"}, - {"2a0b:b87:ffe2::/48", "205036"}, - {"2001:930:149::/48", "8386"}, - {"2400:6480::/32", "55507"}, - {"2404:a800:3003::/39", "9498"}, - {"2408:8256:3c81::/43", "17623"}, - {"240a:a48e::/32", "143816"}, - {"2804:2fe0::/32", "264918"}, - {"2a10:5a80::/29", "328663"}, - {"2001:1690::/32", "20847"}, - {"2400:9380:9040::/47", "4809"}, - {"2402:800:7520::/41", "7552"}, - {"240e:96::/28", "4134"}, - {"240e:44d:5280::/41", "4134"}, - {"2804:3114::/32", "264991"}, - {"2607:f7a8:607::/36", "46887"}, - {"2804:41f8:f502::/36", "267469"}, - {"2a02:2339::/36", "207199"}, - {"2a03:60e0::/32", "60768"}, - {"2c0f:f028::/32", "37317"}, - {"2404:a800:3002::/48", "137670"}, - {"2406:2000:f0::/44", "10310"}, - {"2600:140f:2800::/48", "9498"}, - {"2001:559:db::/48", "33657"}, - {"2408:80ea:6700::/41", "17816"}, - {"240e:85c:10::/42", "4134"}, - {"2806:2f0:2420::/48", "17072"}, - {"2a02:26f7:b851::/42", "20940"}, - {"2001:559:86f8::/48", "33659"}, - {"2001:67c:1220::/46", "197451"}, - {"2600:100e::/32", "6167"}, - {"2800:190:1::/48", "19037"}, - {"2804:f90::/32", "263592"}, - {"2001:5e0::/43", "16713"}, - {"2400:ee80:2001::/32", "45177"}, - {"2604:9980::/48", "17216"}, - {"2607:9e80:1101::/40", "397068"}, - {"2804:34fc::/32", "265493"}, - {"2804:3cc4::/32", "266233"}, - {"2804:709c::/32", "270737"}, - {"2806:230:2001::/48", "11888"}, - {"2001:559:3ea::/48", "33656"}, - {"2001:df6:c00::/48", "55451"}, - {"2409:8050:1800::/47", "56047"}, - {"2a01:298:f001::/48", "30893"}, - {"2a06:3b80:25::/46", "206614"}, - {"2a07:4580:b0e::/29", "46261"}, - {"2400:adc4:800::/39", "9541"}, - {"2404:bf40:a586::/42", "139084"}, - {"240a:a5a2::/32", "144092"}, - {"2602:fc5a::/36", "398491"}, - {"2606:7fc0::/32", "400087"}, - {"2a0b:9b00::/37", "62240"}, - {"2001:b30::/33", "2614"}, - {"2409:8057:300a::/43", "56040"}, - {"240a:ac8a::/32", "145860"}, - {"2a0c:ad40::/29", "51184"}, - {"2a0d:6e00::/29", "201290"}, - {"2401:9480::/32", "56304"}, - {"2804:c60::/32", "52696"}, - {"2804:3154::/32", "265007"}, - {"2a04:4e40:6a00::/48", "54113"}, - {"2a07:aa40::/29", "59469"}, - {"2408:8256:3270::/48", "17816"}, - {"2800:c70:20::/37", "23201"}, - {"2804:7370::/32", "270915"}, - {"2806:1000:cfff:2::/34", "8151"}, - {"2a0f:7980::/44", "141694"}, - {"2001:559:84c8::/48", "22909"}, - {"2400:dc40::/32", "136440"}, - {"2605:b100:e000::/41", "577"}, - {"2804:4f80:5000::/48", "268330"}, - {"2804:7e30::/32", "271608"}, - {"2a01:4b00::/32", "56478"}, - {"2c0f:fb98::/32", "37480"}, - {"2001:559:c250::/48", "7922"}, - {"2404:e100:3004::/48", "133840"}, - {"2804:e10::/32", "52540"}, - {"2001:559:88::/48", "7015"}, - {"2804:a78::/32", "262478"}, - {"2a02:2e02:a180::/42", "12479"}, - {"2001:559:800a::/48", "33657"}, - {"2401:d800:5e30::/41", "7552"}, - {"2804:779c::/32", "271189"}, - {"2408:8459:a10::/41", "17622"}, - {"2604:d600:c2d::/43", "32098"}, - {"2a02:26f7:89::/48", "20940"}, - {"2406:9400::/32", "9253"}, - {"2603:c0ec:2800::/40", "54253"}, - {"2a03:dd40::/32", "61025"}, - {"2001:67c:21a4::/48", "5420"}, - {"2001:67c:2430::/46", "57517"}, - {"2409:8057:3811::/46", "56040"}, - {"2600:1001:a100::/44", "6167"}, - {"2804:55cc::/32", "267957"}, - {"2001:559:c1e4::/48", "22909"}, - {"2001:1388:1b8e::/34", "6147"}, - {"240e:108:11d7::/48", "4134"}, - {"2804:4ec:2::/35", "28668"}, - {"2a02:26f7:c800::/48", "36183"}, - {"2a11:d100::/29", "202505"}, - {"2001:678:ef0::/48", "202592"}, - {"240a:a9ef::/32", "145193"}, - {"2804:1588::/33", "263393"}, - {"2a02:26f0:1201::/39", "20940"}, - {"2a02:26f7:bcc5::/46", "20940"}, - {"2a06:e881:5608::/48", "208340"}, - {"2001:da8:e820::/48", "24368"}, - {"2001:12f0:b18::/42", "1916"}, - {"2400:6700::/32", "16509"}, - {"240a:a2aa::/32", "143332"}, - {"2600:1402:6801::/35", "20940"}, - {"2a0d:d480::/29", "35916"}, - {"2400:cb00:241::/46", "13335"}, - {"2409:8e14::/34", "56044"}, - {"2804:45b0::/32", "266943"}, - {"2a04:c740::/29", "202131"}, - {"2001:a98:8000::/48", "9095"}, - {"2604:d600:122d::/43", "32098"}, - {"2607:a500:df11::/34", "12025"}, - {"2a02:6ea0:babe::/48", "60068"}, - {"2001:559:86fb::/45", "7015"}, - {"2001:678:3::/48", "42"}, - {"2001:df5:b900::/48", "131418"}, - {"2406:2400:cdef::/48", "45287"}, - {"240e:db:b000::/37", "4134"}, - {"2804:bdc::/32", "52866"}, - {"2804:79c0::/32", "271325"}, - {"2a03:a960:30::/32", "61317"}, - {"2001:250:7820::/32", "23910"}, - {"2401:4900:5d80::/38", "45609"}, - {"2600:6c10:fff8::/47", "20115"}, - {"2606:2800:233::/45", "15133"}, - {"2620:149:af1::/37", "714"}, - {"2a0e:46c4:2269::/48", "136918"}, - {"2400:cb00:a740::/48", "13335"}, - {"2403:fcc0::/32", "138453"}, - {"2408:8459:8e50::/35", "17816"}, - {"2400:7400:e014::/44", "38044"}, - {"2804:5a80::/32", "268777"}, - {"2001:250:3428::/47", "138393"}, - {"2400:fc00:8110::/42", "45773"}, - {"2600:6c10:5f::/42", "20115"}, - {"2606:bc00:8ef0::/39", "19419"}, - {"2001:550:4a01:1::/46", "174"}, - {"2604:2bc0::/32", "396141"}, - {"2804:4c14:bb01::/33", "267348"}, - {"2804:4e04::/32", "268234"}, - {"2001:550:300:1::/48", "174"}, - {"2001:2001:6100::/32", "1299"}, - {"2804:2f2c::/32", "264876"}, - {"2001:678:ca8::/48", "12897"}, - {"2001:67c:2e60::/48", "12348"}, - {"2800:160:603::/35", "14259"}, - {"2804:3cb8:d000::/34", "53221"}, - {"2600:1012:f110::/36", "22394"}, - {"2607:f358:4::/46", "18779"}, - {"2a07:3500:19f8::/48", "38915"}, - {"2001:559:85d5::/48", "33650"}, - {"2405:6940::/48", "139178"}, - {"2605:7900:10::/47", "19133"}, - {"2806:2f0:31a1::/46", "17072"}, - {"2001:559:c1e7::/48", "20214"}, - {"2607:f108:1900::/33", "29838"}, - {"2804:5d8::/32", "262546"}, - {"2804:3244:4::/43", "265066"}, - {"2a02:27c8::/32", "48645"}, - {"2001:4c28:212::/48", "39832"}, - {"2600:1007:b100::/41", "6167"}, - {"2800:160:1a84::/46", "14259"}, - {"2804:163c:17a::/38", "263277"}, - {"2804:31fc::/32", "53022"}, - {"2a03:a780::/32", "198031"}, - {"2001:579:c01c::/40", "22773"}, - {"2001:579:c17d::/40", "22773"}, - {"2408:8456:a410::/42", "134543"}, - {"240a:a178::/32", "143026"}, - {"240e:44d:1a40::/42", "140360"}, - {"2804:673c:1000::/40", "264598"}, - {"2806:20d:1d43::/45", "32098"}, - {"2806:2f0:12a0::/41", "17072"}, - {"2a09:bd00:1fe::/47", "42385"}, - {"2401:d800:362::/40", "7552"}, - {"2408:8256:397d::/46", "17623"}, - {"240a:aac4::/32", "145406"}, - {"240a:abda::/32", "145684"}, - {"2607:fd90::/32", "14717"}, - {"2a02:2430:5::/46", "59491"}, - {"2001:559:1c6::/48", "7922"}, - {"240a:ab12::/32", "145484"}, - {"2607:f128:800::/32", "32748"}, - {"2620:0:210::/48", "43"}, - {"2001:df2:c300::/48", "131924"}, - {"2402:800:9939::/41", "7552"}, - {"2607:f1e0::/33", "19092"}, - {"2803:e60::/32", "267913"}, - {"2a0e:8f02:f017::/48", "212112"}, - {"2804:2320::/32", "264144"}, - {"2a0e:97c0:510::/44", "61978"}, - {"2001:da8:e01f::/42", "23910"}, - {"2001:f20:2000::/47", "9875"}, - {"2600:1003:b0e0::/43", "22394"}, - {"2806:2f0:4663::/40", "17072"}, - {"2001:502:100e::/48", "397226"}, - {"2001:559:8611::/46", "7922"}, - {"2620:0:22f0::/48", "6406"}, - {"2001:df0:2b4::/48", "2526"}, - {"2401:f000:18::/48", "23838"}, - {"2600:370f:3783::/41", "32261"}, - {"2606:3c40::/32", "399493"}, - {"2804:a00:8e0::/37", "262838"}, - {"2804:c48:e000::/38", "52687"}, - {"2804:37f0:5100::/36", "266445"}, - {"240e:45c:1c00::/40", "131285"}, - {"2a10:c080::/29", "209288"}, - {"2a12:23c0::/29", "62177"}, - {"2001:1a11:110::/47", "42298"}, - {"2406:4a00:1700::/48", "56038"}, - {"2620:132:c000::/40", "11478"}, - {"2804:18:7200::/37", "10429"}, - {"2804:93c:31::/40", "52878"}, - {"2806:106e:2::/48", "8151"}, - {"2001:f90::/32", "4609"}, - {"2400:fc00:8130::/41", "45773"}, - {"2600:9000:110b::/43", "16509"}, - {"2a07:95c0::/30", "400177"}, - {"2a0a:e9c0::/29", "56986"}, - {"2409:800b:2806::/39", "9808"}, - {"240a:a42b::/32", "143717"}, - {"240e:438:a820::/43", "140647"}, - {"240e:978:1000::/40", "137702"}, - {"2605:a401:893f::/41", "33363"}, - {"2405:4200:f002::/36", "24482"}, - {"2409:8c54:2000::/43", "9808"}, - {"2600:1007:f110::/36", "22394"}, - {"2600:1407:4801::/35", "20940"}, - {"2a00:7180:800c::/46", "15557"}, - {"2a01:ab20::/32", "47302"}, - {"2001:559:c259::/48", "7922"}, - {"2602:fe13:fa0::/44", "53356"}, - {"2800:bf0:824d::/46", "52257"}, - {"2806:320:380::/32", "28438"}, - {"2a00:1560:e::/43", "29684"}, - {"2a00:1818::/32", "3285"}, - {"2a02:6900:8804::/48", "43898"}, - {"2a07:59c6:eed9::/42", "56382"}, - {"2001:67c:235c::/48", "54990"}, - {"2406:3003:107c::/36", "4657"}, - {"2604:2d80:7200::/36", "30036"}, - {"2620:e4::/48", "17365"}, - {"2803:9810::/39", "36492"}, - {"2a00:f380::/32", "39551"}, - {"2a02:26f7:bbc1::/46", "20940"}, - {"2a02:26f7:ed84::/48", "36183"}, - {"2a02:26f7:fa08::/48", "36183"}, - {"2a03:ac60::/32", "199758"}, - {"2a0e:6c00::/29", "63023"}, - {"2001:49f0:a01c::/46", "174"}, - {"2405:3240::/36", "132434"}, - {"2409:8754:c800::/34", "9808"}, - {"240a:a049::/32", "142723"}, - {"240a:a9bb::/32", "145141"}, - {"2600:380:ea00::/39", "7018"}, - {"2803:d080:a135::/33", "27960"}, - {"2001:250:1c0b::/45", "138376"}, - {"2804:53e0::/32", "28258"}, - {"2001:918:ff5e::/42", "3303"}, - {"2401:4900:54c0::/39", "45609"}, - {"2401:8a00:f601::/40", "10099"}, - {"2610:28:5030::/48", "13371"}, - {"2a02:26f7:c34c::/48", "36183"}, - {"2001:df0:2f5::/48", "55912"}, - {"2620:171:39::/46", "715"}, - {"2a0d:1600::/32", "57354"}, - {"2001:559:858b::/48", "33491"}, - {"2400:bb40:2010::/47", "141039"}, - {"2400:cb00:422::/45", "13335"}, - {"2606:1a40:2012::/47", "42473"}, - {"2607:ffa0::/47", "19355"}, - {"2001:da8:256::/48", "23910"}, - {"2405:9800:b419::/45", "45430"}, - {"2607:f428:93c0::/42", "19115"}, - {"2001:579:cf04::/46", "22773"}, - {"2402:800:571d::/42", "7552"}, - {"2605:5c0:c045::/44", "28885"}, - {"2a05:dfc7:100::/43", "200897"}, - {"2a0c:7ac0::/29", "203215"}, - {"2a04:4e40:1000::/48", "54113"}, - {"2a09:2200::/29", "29655"}, - {"2400:cb00:a1c0::/45", "13335"}, - {"240a:a5cb::/32", "144133"}, - {"2a02:26f7:bc44::/48", "36183"}, - {"2a0f:c087:c3ae::/48", "212521"}, - {"2001:200:f00::/32", "2500"}, - {"2001:250:6032::/38", "23910"}, - {"2001:67c:3a8::/48", "51839"}, - {"2001:da8:21a::/48", "24348"}, - {"2605:3a00:7::/48", "22768"}, - {"2610:f0:6b5::/36", "22925"}, - {"2a09:54c0::/29", "61138"}, - {"2001:253:105::/48", "142071"}, - {"2a01:b940::/30", "48635"}, - {"2a05:b0c6:200a::/48", "208753"}, - {"2001:678:58c::/48", "204926"}, - {"2402:b780::/41", "64047"}, - {"2a0f:2ac0::/29", "60262"}, - {"240e:473::/32", "140485"}, - {"2804:1c2c:2000::/32", "262869"}, - {"2a02:26f7:e6c1::/46", "20940"}, - {"2402:4440::/32", "24423"}, - {"2607:6000:300::/40", "12189"}, - {"2a07:a80::/29", "34766"}, - {"2001:4490:3fbc::/46", "9829"}, - {"240a:a8c6::/32", "144896"}, - {"2600:100a:9110::/36", "22394"}, - {"2606:2800:8::/47", "15133"}, - {"2804:5f38::/32", "269084"}, - {"2804:8564:2180::/32", "262313"}, - {"2a02:26f7:d705::/46", "20940"}, - {"2a0a:2842:aa00::/46", "136796"}, - {"240a:aaa0::/32", "145370"}, - {"2600:9000:1197::/48", "16509"}, - {"2803:9800:a505::/46", "11664"}, - {"2001:4878:8048::/48", "12222"}, - {"240a:a444::/32", "143742"}, - {"240a:aa9d::/32", "145367"}, - {"2607:fd48::/62", "13536"}, - {"2806:20d:161e::/47", "32098"}, - {"2806:261:1300::/41", "13999"}, - {"2a00:6901:a103::/48", "20926"}, - {"2001:418:2401:1::/64", "20940"}, - {"2001:678:bbc::/48", "207671"}, - {"2402:800:5e40::/43", "7552"}, - {"2408:84f3:3250::/44", "17816"}, - {"2604:f500:2::/32", "16698"}, - {"2a09:a443::/32", "205479"}, - {"2a0e:57c0:800::/38", "12731"}, - {"240e:379:ac00::/33", "4134"}, - {"240e:44d:3700::/42", "140345"}, - {"2606:70c0::/32", "399951"}, - {"2402:800:997f::/40", "7552"}, - {"2600:1415:401::/36", "20940"}, - {"2800:160:1e3c::/41", "14259"}, - {"2405:8a00:c024::/46", "55824"}, - {"2408:8956:8800::/40", "17622"}, - {"240a:a942::/32", "145020"}, - {"2600:6c39:9::/45", "20115"}, - {"2607:b400:a02::/48", "1312"}, - {"2804:41b4:5000::/32", "267451"}, - {"2806:2f0:322::/47", "22884"}, - {"2a02:2668:6700::/35", "16345"}, - {"2a06:e881:170f::/48", "206813"}, - {"2401:4900:4abb::/48", "45609"}, - {"2804:14d4::/32", "263353"}, - {"2001:559:78f::/48", "7015"}, - {"2001:67c:2328::/48", "31473"}, - {"2606:e780::/32", "394868"}, - {"2804:14c:4387::/43", "28573"}, - {"2804:2038::/32", "264478"}, - {"2a01:4260::/32", "205938"}, - {"2a01:6920::/32", "54876"}, - {"2001:559:c039::/48", "33650"}, - {"2409:896a:4a00::/39", "9808"}, - {"2607:6100:1000::/48", "54380"}, - {"2a06:e2c0::/29", "56697"}, - {"2001:fd8:3340::/42", "132199"}, - {"2606:1fc0::/40", "21529"}, - {"2620:15e:7001::/48", "30383"}, - {"2800:160:1af8::/46", "14259"}, - {"2a0d:e4c4:4000::/36", "210625"}, - {"2001:559:8094::/47", "33490"}, - {"2402:800:949b::/42", "7552"}, - {"2402:9800:4003::/48", "38508"}, - {"240a:a910::/32", "144970"}, - {"2401:d800:90b0::/41", "7552"}, - {"2402:800:3463::/43", "7552"}, - {"2607:f740:e051::/44", "63911"}, - {"2a01:b747:3003::/32", "714"}, - {"2600:6c10:409::/46", "20115"}, - {"2a00:fd0::/32", "30914"}, - {"2a0e:97c0:4df::/48", "211024"}, - {"2803:24c0::/37", "264796"}, - {"2a01:9a80::/30", "39120"}, - {"2a05:b740::/29", "210026"}, - {"2001:559:15a::/48", "7725"}, - {"2409:8073:801::/34", "9808"}, - {"240a:ae69::/32", "146339"}, - {"2602:feda:af3::/48", "131477"}, - {"2607:fd78:102::/37", "26677"}, - {"2804:4d3c:a10::/42", "267420"}, - {"2a01:6a40:1::/48", "30720"}, - {"2001:559:8703::/48", "33651"}, - {"2001:c38:9010::/47", "9931"}, - {"2001:4430:5310::/34", "17853"}, - {"2604:bc0::/48", "8100"}, - {"2607:5100::/28", "36734"}, - {"2405:9800:b811::/44", "45430"}, - {"2804:1558::/32", "263385"}, - {"2a01:5043:2efd::/48", "202196"}, - {"2a01:9dc0:beef::/48", "30361"}, - {"2a02:26f7:eb49::/46", "20940"}, - {"2001:250:23e::/48", "133111"}, - {"240a:a826::/32", "144736"}, - {"2605:de40::/35", "397553"}, - {"2a0b:8e40::/29", "51571"}, - {"2a02:970:1354::/40", "44002"}, - {"2a06:600::/29", "200742"}, - {"2001:250:fe02::/39", "23910"}, - {"2a0f:5707:aac0::/44", "48646"}, - {"2001:44b8:405d::/48", "4739"}, - {"2804:14c:b100::/40", "28573"}, - {"2a0c:67c0::/29", "29262"}, - {"2001:559:526::/48", "7016"}, - {"2001:67c:2904::/48", "212125"}, - {"2404:bf40:a681::/48", "2764"}, - {"2001:7fb:fe0a::/45", "12654"}, - {"2800:bf0:8284::/46", "27947"}, - {"2804:27b8::/32", "263918"}, - {"2806:310:22::/45", "16960"}, - {"2a0f:9400:7398::/48", "210815"}, - {"2804:41b8::/32", "267452"}, - {"2a03:3d80::/29", "13113"}, - {"2a0a:a042::/29", "12552"}, - {"2001:df1:b080::/48", "131373"}, - {"240e:44d:680::/41", "4134"}, - {"240e:473:ff01::/48", "140486"}, - {"240e:67d:8800::/38", "140330"}, - {"2600:2700::/28", "81"}, - {"2804:71ac::/32", "270804"}, - {"2a00:4800:1f0::/38", "8717"}, - {"2a03:5640:f000::/41", "16509"}, - {"2001:388:5071::/34", "7575"}, - {"2001:559:c099::/46", "7015"}, - {"2001:1248:56f6::/44", "11172"}, - {"2001:4200::/41", "2018"}, - {"240a:ae0f::/32", "146249"}, - {"2800:bf0:814b::/48", "52257"}, - {"2a04:4e40:6e00::/48", "54113"}, - {"2001:559:838b::/48", "33651"}, - {"2001:1248:55e6::/43", "11172"}, - {"2600:80d:a::/43", "6984"}, - {"2600:100a:f110::/36", "22394"}, - {"2620:13c:8000::/44", "27360"}, - {"2804:81c::/32", "262346"}, - {"2001:559:449::/48", "7016"}, - {"2001:41f0::/32", "33915"}, - {"2a00:1fa8::/32", "8818"}, - {"2a03:db80:4411::/46", "680"}, - {"2001:1248:55da::/42", "11172"}, - {"240e:3be:c800::/37", "4134"}, - {"2602:fcf8::/36", "7018"}, - {"2607:ffb0:3004::/44", "6327"}, - {"240e:950::/36", "137693"}, - {"2605:6400:300::/48", "53667"}, - {"2804:35b8::/32", "266302"}, - {"2a01:9f60::/32", "34139"}, - {"2a02:26f7:df84::/48", "36183"}, - {"2c0f:ed98::/32", "328483"}, - {"2001:559:729::/46", "33659"}, - {"2001:b28:a70d::/64", "42765"}, - {"2001:1b50::/29", "1836"}, - {"2402:1b80:9000::/33", "63956"}, - {"240e:44d:7a00::/42", "140345"}, - {"2604:f940::/45", "397134"}, - {"2606:2800:506b::/48", "14153"}, - {"2607:4580::/32", "395173"}, - {"2806:2f0:2042::/48", "17072"}, - {"2409:8904:8e90::/39", "24547"}, - {"2409:8959:cf54::/30", "56040"}, - {"2606:4700:7000::/48", "13335"}, - {"2a01:5b8::/29", "16333"}, - {"2a02:26f7:e885::/46", "20940"}, - {"240a:a325::/32", "143455"}, - {"2806:230:1015::/48", "11888"}, - {"2a02:26f7:d040::/48", "36183"}, - {"2800:484:3b00::/33", "14080"}, - {"2a00:f70::/32", "30962"}, - {"2a02:214d:f000::/36", "1241"}, - {"2001:559:3f1::/48", "33657"}, - {"2001:4408:4d09::/35", "4758"}, - {"2400:0:860::/44", "4766"}, - {"240e:90d:a000::/36", "137688"}, - {"2a07:1440::/29", "203293"}, - {"2a09:19c0:8000::/48", "56335"}, - {"2a09:5080::/48", "42652"}, - {"2001:559:c2ee::/48", "33287"}, - {"2001:1248:964f::/43", "11172"}, - {"2a0d:2580::/47", "213262"}, - {"2409:8a50:f00::/35", "56047"}, - {"2804:785c::/32", "271237"}, - {"2a0f:b140::/29", "50067"}, - {"2a10:dac0:100::/48", "50399"}, - {"2001:1a11:83::/48", "8781"}, - {"2402:e280:2000::/39", "134674"}, - {"2804:11d4::/37", "263442"}, - {"2804:189c::/32", "61943"}, - {"2806:2ee::/32", "265539"}, - {"2a00:d30:16::/48", "202024"}, - {"2a00:a600::/32", "56595"}, - {"2001:438:fffd:6c::/64", "7181"}, - {"2001:df6:fd80::/48", "137531"}, - {"2001:250:1827::/38", "23910"}, - {"2400:5460:8::/46", "135177"}, - {"2408:8256:2d6a::/48", "17816"}, - {"2604:d600:1277::/40", "32098"}, - {"2620:11f:d00c::/46", "393941"}, - {"2804:532c::/32", "268568"}, - {"2804:77f0::/32", "271209"}, - {"2a00:1188:11::/44", "8455"}, - {"2804:14c:3b00::/40", "28573"}, - {"2804:5b2c::/32", "268823"}, - {"2c0f:ef78:9::/48", "63293"}, - {"2001:fb0:109f:8011::/62", "7470"}, - {"2603:8080::/26", "11427"}, - {"2a0a:3840::/29", "39287"}, - {"2a0f:72c0::/29", "52031"}, - {"2402:e380:311::/48", "139058"}, - {"240a:adad::/32", "146151"}, - {"2803:7e00::/33", "28026"}, - {"2803:9810:2000::/48", "14593"}, - {"2804:1534::/32", "263377"}, - {"2001:559:27::/44", "7922"}, - {"2001:4408:6d00::/44", "55824"}, - {"2401:a480::/48", "1221"}, - {"2404:3d00:400a::/45", "21433"}, - {"240e:108:1102::/44", "4134"}, - {"2803:9800:9485::/41", "11664"}, - {"2a0e:d9c0::/29", "39287"}, - {"240a:ab79::/32", "145587"}, - {"2800:370:48::/48", "28006"}, - {"2800:8a0:b000::/36", "5722"}, - {"2804:7a60:200::/32", "271367"}, - {"2a02:26f7:db0c::/48", "36183"}, - {"2a02:6900:8808::/47", "43894"}, - {"2a0a:90c0:1055::/44", "205080"}, - {"2409:8055:306c::/48", "141425"}, - {"240a:acfb::/32", "145973"}, - {"2a02:26f7:d38a::/42", "20940"}, - {"2001:559:8145::/46", "7922"}, - {"2600:9000:2091::/44", "16509"}, - {"2620:74:a5::/46", "7342"}, - {"2800:484:100::/38", "14080"}, - {"2804:3adc::/32", "266114"}, - {"2a06:1287:330d::/48", "208753"}, - {"2408:8956:3700::/40", "17816"}, - {"2409:802e:2902::/48", "9808"}, - {"240e:96b:6015::/46", "140371"}, - {"2a00:d70::/32", "29097"}, - {"2001:df0:270::/48", "9836"}, - {"2401:c240:2100::/33", "132847"}, - {"2405:a900::/32", "55992"}, - {"2600:1408:21::/46", "20940"}, - {"2605:a7c0:100::/48", "14618"}, - {"2620:4d:4020::/48", "62597"}, - {"2804:82e0::/32", "272162"}, - {"2a04:de80::/29", "201952"}, - {"2001:559:847a::/48", "33657"}, - {"2602:ffc5:500::/40", "26548"}, - {"2a02:26f7:cd88::/48", "36183"}, - {"2a02:2698:a002::/48", "31483"}, - {"2a02:26f7:dbc5::/46", "20940"}, - {"2a02:45c0:18::/32", "59675"}, - {"2a0a:6040:ac96::/48", "211954"}, - {"2a0b:4880::/46", "48614"}, - {"2001:1248:4400::/42", "11172"}, - {"2804:4c14:fa01::/39", "267348"}, - {"2408:80ea:4000::/34", "17816"}, - {"2a02:26f7:f3c8::/48", "36183"}, - {"2403:6b00:2000::/48", "58562"}, - {"2602:80b:5000::/47", "18792"}, - {"2a09:bac0:34::/47", "13335"}, - {"2a0c:b641:1d0::/48", "211227"}, - {"2001:678:6e0::/46", "202329"}, - {"2001:67c:638::/48", "60059"}, - {"2408:8456:de10::/42", "134543"}, - {"2a04:4e40:1640::/44", "54113"}, - {"2a07:c9c0::/29", "59659"}, - {"2a0f:fb80::/29", "60262"}, - {"240e:45c:3900::/40", "140528"}, - {"2620:171:f2::/47", "715"}, - {"2405:9000:80::/48", "17719"}, - {"2406:840:ece0::/44", "213215"}, - {"2406:3000:11:101b::/50", "4657"}, - {"2406:57c0:244::/46", "134672"}, - {"2409:8c20:5224::/37", "56046"}, - {"240a:ad55::/32", "146063"}, - {"2600:140f:2401::/39", "20940"}, - {"2603:9033::/32", "33363"}, - {"2605:a401:8039::/41", "33363"}, - {"2a02:928::/43", "34108"}, - {"2a09:bd00:ffc9::/48", "204582"}, - {"2403:6c0:137::/48", "137366"}, - {"2804:2084::/32", "264496"}, - {"2a02:26f7:d509::/46", "20940"}, - {"2001:250:641a::/42", "24367"}, - {"2402:540::/47", "132996"}, - {"240a:a6c2::/32", "144380"}, - {"2602:fd50:200::/40", "207609"}, - {"2801:1d:e800::/48", "271918"}, - {"2a02:2e02:2060::/39", "12479"}, - {"2400:c180:20::/47", "132513"}, - {"2a02:26f7:e9c8::/48", "36183"}, - {"2a02:2ca0::/32", "43350"}, - {"2a06:c8c0::/30", "203623"}, - {"2406:4580::/32", "59123"}, - {"2600:d400::/31", "1403"}, - {"2803:efc0:1::/32", "266664"}, - {"2001:dc8:2003::/48", "131123"}, - {"2600:1012:b0f0::/44", "22394"}, - {"2600:1408:4400::/48", "35994"}, - {"2800:160:1185::/44", "14259"}, - {"2804:1d04::/45", "61689"}, - {"2804:38b0::/38", "266494"}, - {"2804:7c90::/32", "271504"}, - {"2a0e:dd40::/32", "397735"}, - {"2a10:38c0::/29", "204790"}, - {"240c:f:2::/32", "45275"}, - {"240e:438:a440::/38", "4134"}, - {"2605:a900:3005::/48", "55088"}, - {"2a03:b100::/32", "15991"}, - {"2001:559:c28c::/47", "33491"}, - {"2001:4288:8008::/48", "36903"}, - {"240a:aaa4::/32", "145374"}, - {"2a0e:b107:9c0::/44", "213171"}, - {"2001:4488:2001::/45", "7713"}, - {"240a:ab64::/32", "145566"}, - {"240e:966:d600::/34", "4134"}, - {"2803:9800:a0a2::/37", "11664"}, - {"2804:a14:8400::/33", "262342"}, - {"2a11:2307::/37", "209209"}, - {"2001:559:492::/47", "7922"}, - {"2a03:c780::/32", "29672"}, - {"2001:559:482::/48", "33650"}, - {"2001:67c:2c0::/48", "49014"}, - {"2405:9800:bc81::/38", "45430"}, - {"2607:f00::/32", "5704"}, - {"2a02:26f7:dd45::/46", "20940"}, - {"2a04:a140::/32", "62217"}, - {"2001:67c:2724::/48", "211696"}, - {"240a:ae7b::/32", "146357"}, - {"2804:db0:184::/32", "52862"}, - {"2a06:e881:6209::/48", "7489"}, - {"2a0a:e5c0:303::/45", "207996"}, - {"2001:559:8360::/47", "7922"}, - {"2408:8456:1e00::/42", "17622"}, - {"2408:8459:4ec0::/35", "17816"}, - {"2600:6c38:b0c::/47", "20115"}, - {"2804:e30:1c00::/38", "11338"}, - {"2a02:27f8::/32", "42755"}, - {"2001:579:b1c4::/38", "22773"}, - {"2402:8100:3100::/40", "55644"}, - {"2409:8070:30ee::/48", "140105"}, - {"240a:a4b9::/32", "143859"}, - {"2605:9000::/32", "10929"}, - {"2a02:26f7:e005::/46", "20940"}, - {"240a:a37b::/32", "143541"}, - {"2a0a:23c0::/29", "39730"}, - {"2001:67c:580::/48", "12703"}, - {"2001:67c:1388::/48", "13030"}, - {"2602:807:6000::/46", "53978"}, - {"2606:a600:5::/46", "23005"}, - {"2804:1cd0::/32", "61677"}, - {"2001:559:c3fe::/48", "33659"}, - {"2605:de00::/40", "30083"}, - {"2001:559:8487::/48", "33287"}, - {"2409:8055:11::/45", "56040"}, - {"2804:2050:6a8c::/35", "264485"}, - {"2001:67c:2f74::/48", "198992"}, - {"2607:ff28:b017::/42", "62904"}, - {"2806:2f0:4243::/42", "17072"}, - {"2c0f:f6d0:b::/43", "327687"}, - {"2001:559:c0f3::/45", "7922"}, - {"2001:1990::/32", "5693"}, - {"2605:640f:e511::/46", "53667"}, - {"2800:484:700::/36", "14080"}, - {"2606:6680:29::/48", "12129"}, - {"2a00:ab40:4001::/35", "41798"}, - {"2a03:e581:5::/29", "49282"}, - {"2409:8055:45::/44", "56040"}, - {"2600:9000:2381::/48", "16509"}, - {"2804:4a30::/32", "267223"}, - {"2804:52dc::/32", "268546"}, - {"2a00:8647::/32", "31056"}, - {"2a02:26f7:f40d::/42", "20940"}, - {"2402:800:9955::/42", "7552"}, - {"240a:a111::/32", "142923"}, - {"2605:2800:c301::/34", "6922"}, - {"2804:619c::/32", "269245"}, - {"2a00:ea0::/29", "202204"}, - {"2a02:26f7:cb49::/42", "20940"}, - {"2a02:26f7:f6fd::/46", "20940"}, - {"2a06:6540:2002::/48", "3356"}, - {"2001:4878:b027::/48", "12222"}, - {"2403:580:400::/36", "134715"}, - {"2600:1411:2::/34", "20940"}, - {"2602:fed2:7126::/48", "398325"}, - {"2804:3a8c::/32", "266095"}, - {"2804:7104::/32", "270762"}, - {"2a02:26f7:c940::/48", "36183"}, - {"2a02:26f7:d15c::/47", "36183"}, - {"2404:5e40:a::/32", "137703"}, - {"240a:acc6::/32", "145920"}, - {"2600:1003:b440::/42", "6167"}, - {"2600:6c38:640::/39", "20115"}, - {"2804:b18:9000::/33", "52941"}, - {"2a02:26f7:e0c4::/48", "36183"}, - {"2a02:6300:30::/48", "57801"}, - {"2001:fb0:1072::/45", "7470"}, - {"2402:4840::/32", "137329"}, - {"2600:1407:c00::/48", "35994"}, - {"2804:1304::/32", "263510"}, - {"2a0b:8f00::/29", "33988"}, - {"2001:559:8120::/48", "19231"}, - {"240e:5e:10b0::/44", "140318"}, - {"2600:6c38:266::/43", "20115"}, - {"2602:fe19:4003::/45", "26073"}, - {"2610:88:223::/32", "14037"}, - {"2a02:26f7:bc08::/48", "36183"}, - {"2a07:af00::/29", "202625"}, - {"2001:559:8658::/48", "7015"}, - {"2001:da8:241::/46", "24350"}, - {"2409:8753:100::/38", "56047"}, - {"2409:8d5a:608::/32", "56040"}, - {"2804:37c4::/32", "266435"}, - {"2806:2f0:9543::/42", "17072"}, - {"2406:3003:1016::/42", "55430"}, - {"2602:fc5d:10::/44", "399866"}, - {"2001:1938:3000::/45", "33438"}, - {"2402:4000:b281::/36", "18001"}, - {"2606:a000:1800::/34", "11426"}, - {"2610:20:8800::/46", "3477"}, - {"2a00:4cc0::/32", "57664"}, - {"2a02:4b00::/29", "50168"}, - {"2a0c:2540::/29", "34820"}, - {"2001:559:852d::/48", "33662"}, - {"2001:67c:2c28::/48", "57118"}, - {"2409:8924:3d00::/33", "56046"}, - {"2806:2a0:11::/45", "28548"}, - {"2001:559:7f2::/48", "33489"}, - {"2001:1a11:1f::/42", "8781"}, - {"2409:8c21::/29", "9808"}, - {"2a0f:8640::/32", "25682"}, - {"2001:559:242::/48", "7016"}, - {"240a:a270::/32", "143274"}, - {"240e:44d:6b00::/42", "140345"}, - {"2620:1d5:200::/37", "14773"}, - {"2a01:760::/32", "41622"}, - {"2a02:26f7:eacd::/42", "20940"}, - {"2a0f:7280::/48", "60781"}, - {"2402:f840::/47", "137883"}, - {"2a07:4b00::/29", "48813"}, - {"2a01:4f8::/31", "24940"}, - {"2a02:ff0:3a00::/40", "12735"}, - {"2001:1248:59c7::/43", "11172"}, - {"2001:4490:3fe4::/33", "9829"}, - {"2801:0:3b0::/48", "19429"}, - {"2804:1658::/35", "263283"}, - {"2a11:7c0::/29", "211084"}, - {"2001:13d2:5804::/34", "7303"}, - {"2001:44b8:405b::/48", "4739"}, - {"2409:8d15:a00::/35", "56044"}, - {"2a07:4ac0:2400::/40", "205881"}, - {"2001:559:c358::/48", "7016"}, - {"2408:8756:d000::/40", "134543"}, - {"2804:5364:6000::/35", "268581"}, - {"2806:106e:10::/48", "8151"}, - {"2a02:26f7:b6c0::/48", "36183"}, - {"2400:7400:70::/48", "23736"}, - {"2600:1406:7c01::/38", "20940"}, - {"2620:101:2005::/46", "16417"}, - {"2804:28e4:e815::/46", "28260"}, - {"2806:230:3013::/48", "11888"}, - {"2a0a:c380::/29", "50308"}, - {"2a0f:cc86::/31", "208861"}, - {"2406:3001:22:2::/60", "4657"}, - {"2409:8904:6240::/42", "24547"}, - {"240a:a729::/32", "144483"}, - {"2606:c00:32::/48", "10126"}, - {"2804:7894::/32", "271252"}, - {"2a02:26f7:e4c5::/46", "20940"}, - {"2409:8914:ba00::/37", "56044"}, - {"2804:1d04:402::/36", "61689"}, - {"2a11:5d40::/29", "204790"}, - {"2405:f080:820::/40", "136907"}, - {"240e:44d:d00::/41", "140345"}, - {"2604:6400:4520::/38", "29974"}, - {"2605:52c0:1::/46", "54574"}, - {"2a01:a280:6::/48", "35000"}, - {"2a0d:8800::/29", "205624"}, - {"2001:dc7:fff2::/44", "24151"}, - {"2404:6980:32::/48", "58431"}, - {"2409:8c85:7c01::/32", "9808"}, - {"2800:bf0:82d0::/46", "52257"}, - {"2804:7898:5000::/48", "271253"}, - {"2a09:a080::/48", "44364"}, - {"2001:559:8486::/48", "33657"}, - {"2001:938:400c::/42", "8437"}, - {"2a01:e09::/32", "29447"}, - {"2400:8000:5::/46", "4800"}, - {"2404:b300:23::/48", "59318"}, - {"2803:4040::/32", "10834"}, - {"2804:236c::/32", "264161"}, - {"2a03:a480::/32", "59469"}, - {"2405:c840::/32", "140072"}, - {"2804:14d:1686::/44", "28573"}, - {"2804:1f0a:8000::/34", "10938"}, - {"2a00:1e08::/32", "196997"}, - {"2a00:4802:e00::/42", "13124"}, - {"2407:3780::/32", "132960"}, - {"2408:8957:9200::/40", "17622"}, - {"2409:804e:900::/35", "9808"}, - {"240a:ae79::/32", "146355"}, - {"240e:947:1000::/46", "137690"}, - {"2a02:2e02:8ab0::/41", "12479"}, - {"2a0b:6b86:f30::/40", "211387"}, - {"2401:5300::/32", "45680"}, - {"240e:67c:8800::/38", "140330"}, - {"240e:97a:2d00::/48", "23650"}, - {"2606:1680::/32", "63414"}, - {"2620:149:551::/42", "714"}, - {"2804:c84::/47", "52720"}, - {"2a01:450::/32", "6908"}, - {"2a02:2399:101::/48", "9166"}, - {"2a03:f80:ad15::/48", "57169"}, - {"2409:8904:9590::/38", "24547"}, - {"2804:2a54::/32", "264069"}, - {"2001:250:2e00::/48", "138442"}, - {"2001:559:72d::/48", "33659"}, - {"2407:a300::/32", "132497"}, - {"2a00:1ca8:56::/48", "211623"}, - {"2a0b:4340:70::/48", "205618"}, - {"2001:559:8245::/48", "33657"}, - {"2001:19e8:8ab0::/48", "4046"}, - {"2800:200:f181::/41", "12252"}, - {"2a04:4e40:8e00::/48", "54113"}, - {"2600:1408:c00::/48", "35994"}, - {"2604:f400:51::/48", "29930"}, - {"2a03:5640::/32", "2906"}, - {"2001:4d0:241b::/48", "22767"}, - {"2001:500:85::/48", "53459"}, - {"2001:559:31d::/46", "7016"}, - {"2001:df2:7700::/48", "45240"}, - {"2605:b380::/32", "13333"}, - {"2a03:6947:1100::/37", "61266"}, - {"2a0f:5c47:3e8::/48", "206499"}, - {"2400:1700::/39", "4628"}, - {"2403:1140::/32", "135719"}, - {"240a:ae09::/32", "146243"}, - {"2607:9e00::/35", "30536"}, - {"2a00:1840::/32", "12333"}, - {"2a0f:9441:42::/47", "62240"}, - {"2a10:80c0::/48", "211331"}, - {"2001:678:848::/48", "8873"}, - {"2801:1fc:20::/48", "27951"}, - {"2804:67e8::/32", "269658"}, - {"2a00:db20::/32", "62429"}, - {"2001:559:c0a4::/48", "33491"}, - {"2001:67c:2a84::/48", "204847"}, - {"2a02:26f7:ca85::/46", "20940"}, - {"2a02:26f7:e0c1::/46", "20940"}, - {"2a10:8400::/29", "203206"}, - {"2001:67c:530::/48", "42295"}, - {"2001:df4:6c00::/48", "133802"}, - {"2409:8080:2a70::/40", "9808"}, - {"2604:edc0::/32", "40764"}, - {"2607:f358:25::/48", "398826"}, - {"2804:74d4::/32", "271006"}, - {"240e:804:400::/30", "4134"}, - {"2804:19c8:1010::/34", "61818"}, - {"2a09:bac0:40::/48", "13335"}, - {"2401:d800:2600::/42", "7552"}, - {"240a:aacc::/32", "145414"}, - {"240e:6b9:2000::/36", "140312"}, - {"2804:cb0:d308::/36", "52742"}, - {"2a0c:90c0::/29", "197637"}, - {"2a02:26f0:4b00::/48", "35994"}, - {"2a04:940:1601::/29", "51407"}, - {"2a10:14c0::/29", "1239"}, - {"2001:468:509::/40", "14041"}, - {"2803:d080::/32", "27960"}, - {"2804:20c0::/32", "264512"}, - {"2a10:68c0::/29", "30633"}, - {"2001:1218::/33", "278"}, - {"2602:fba1:a00::/40", "60438"}, - {"2605:72c0:a::/48", "40401"}, - {"2806:2f0:4363::/40", "17072"}, - {"2a03:9d40:2000::/37", "41095"}, - {"2a10:6840::/29", "60781"}, - {"2610:48::/32", "557"}, - {"2620:171:66::/44", "42"}, - {"2803:2800::/33", "52368"}, - {"2804:2610::/32", "264321"}, - {"2a01:c50e:b900::/37", "12479"}, - {"2a02:878:a80e::/48", "42632"}, - {"2404:8d06:8000::/40", "133543"}, - {"2408:8957:ab00::/40", "17816"}, - {"2409:8924:5100::/38", "56046"}, - {"2600:100e:9f20::/34", "6167"}, - {"2804:7ac8::/32", "271392"}, - {"2a01:cb20:d000::/34", "3215"}, - {"2a06:a005:2d0::/42", "210542"}, - {"2602:fd7d::/39", "16925"}, - {"2a02:2668:7900::/32", "16345"}, - {"2a03:f8c0::/32", "201973"}, - {"2001:cf8:6::/36", "9619"}, - {"2001:1248:9601::/43", "11172"}, - {"240a:a4bc::/32", "143862"}, - {"2602:fcd3:300::/48", "212934"}, - {"2a03:4400::/29", "28999"}, - {"2a0a:dc05::/30", "51262"}, - {"2001:559:527::/44", "7015"}, - {"2401:d800:dd12::/40", "7552"}, - {"2402:800:9dfe::/38", "7552"}, - {"2405:ba00:8000::/48", "23885"}, - {"2600:1004:f100::/44", "6167"}, - {"2600:1401:6002::/32", "20940"}, - {"2a01:7640:400::/48", "60708"}, - {"2a06:d9c0::/29", "60059"}, - {"2001:df7:480c::/48", "131893"}, - {"2001:4200:ab10::/33", "2018"}, - {"2604:880:4f::/43", "29802"}, - {"2800:120::/45", "27843"}, - {"2a02:2230:1200::/39", "25467"}, - {"2a02:26f7:f185::/46", "20940"}, - {"240e:b6::/36", "58563"}, - {"2607:f808::/32", "3464"}, - {"2620:123:f000::/48", "20127"}, - {"2620:138:7000::/44", "14747"}, - {"2801:126::/44", "262589"}, - {"2a00:ab60::/29", "60522"}, - {"2001:4c8:1008::/48", "25864"}, - {"2403:8c0::/32", "137406"}, - {"2405:204:9000::/33", "55836"}, - {"2620:b4::/48", "1341"}, - {"2a02:100e:6b80::/48", "212587"}, - {"2a02:26f7:cb40::/48", "36183"}, - {"2001:559:8712::/47", "7725"}, - {"2001:559:c0c5::/48", "33491"}, - {"2408:8957:9400::/40", "17622"}, - {"240a:aa5d::/32", "145303"}, - {"2610::/32", "11084"}, - {"2620:12e:4001::/48", "36741"}, - {"2804:30f8:c00::/32", "264984"}, - {"2001:840::/29", "2116"}, - {"2402:4000::/35", "18001"}, - {"240e:3b9:7800::/39", "4134"}, - {"2804:14d:148a::/45", "28573"}, - {"2804:5cdc::/32", "268935"}, - {"2c0e::/37", "24863"}, - {"2001:44b8:4044::/48", "7545"}, - {"2620:0:860::/46", "14907"}, - {"2a09:ccc0::/29", "209222"}, - {"240a:ab9a::/32", "145620"}, - {"2a00:1a40::/32", "33923"}, - {"2a09:0:12::/48", "60144"}, - {"2a0b:f240::/29", "202509"}, - {"2001:da8:239::/48", "23910"}, - {"2402:800:5b55::/42", "7552"}, - {"2408:8456:c640::/39", "17816"}, - {"2804:2a7c::/32", "264075"}, - {"2806:109f:7::/44", "8151"}, - {"2001:559:c045::/46", "7015"}, - {"2403:8300:e04::/44", "204527"}, - {"2406:2000:1a0::/46", "10229"}, - {"240a:a1c0::/32", "143098"}, - {"240a:ad4e::/32", "146056"}, - {"2602:fcda::/36", "54142"}, - {"2a02:26f7:bdc9::/46", "20940"}, - {"2c0f:fdf0::/32", "37150"}, - {"2001:67c:1213::/48", "47445"}, - {"2402:800:fbd0::/37", "7552"}, - {"2407:8800::/32", "7545"}, - {"2407:cdc0:e006::/48", "38136"}, - {"2409:8050:3900::/32", "9808"}, - {"2607:f738:700::/41", "17184"}, - {"2804:84d0::/32", "272542"}, - {"2a0a:4a40:2270::/46", "200280"}, - {"240e:3b1:3e00::/33", "140308"}, - {"2600:1417:801::/38", "20940"}, - {"2a03:2887:ff0d::/48", "35819"}, - {"2a06:eb00::/46", "203462"}, - {"2001:44b8:4069::/48", "4739"}, - {"240a:a55b::/32", "144021"}, - {"2600:805:148::/48", "12234"}, - {"2602:febe::/38", "30405"}, - {"2a0c:a9c7:247::/48", "45018"}, - {"2001:67c:2b50::/48", "44865"}, - {"2401:4900:948::/40", "45609"}, - {"2401:d800:e62::/40", "7552"}, - {"2620:124:6040::/43", "22918"}, - {"2804:8424:4100::/32", "272242"}, - {"2a05:5244::/30", "198722"}, - {"2804:4594::/32", "266936"}, - {"2a00:1288:efc4::/48", "14778"}, - {"2001:559:7dd::/46", "7922"}, - {"2001:78d::/30", "6893"}, - {"240e:944:3000::/36", "58541"}, - {"2600:1806:320::/48", "16552"}, - {"2606:7c00::/32", "46103"}, - {"2001:df7:5080::/48", "137655"}, - {"2403:9800:7700::/40", "4648"}, - {"2604:d600:162d::/46", "32098"}, - {"2620:2d:a000::/48", "27282"}, - {"2800:160:1630::/46", "14259"}, - {"2804:4f98::/32", "268337"}, - {"2804:7248::/32", "270844"}, - {"2001:67c:434::/48", "8422"}, - {"2001:67c:2e8c::/48", "8881"}, - {"2406:daa0:f040::/44", "16509"}, - {"240a:ad63::/32", "146077"}, - {"2600:3000::/35", "13649"}, - {"2001:559:c15c::/48", "7015"}, - {"2001:67c:2464::/48", "39022"}, - {"2400:36a0:3d::/46", "63991"}, - {"2400:ac40:ab0::/39", "136255"}, - {"240e:3b2:9200::/36", "140317"}, - {"2a02:2098::/29", "47314"}, - {"240a:a588::/32", "144066"}, - {"2a0c:8dc7::/32", "43260"}, - {"2600:1480:2800::/48", "21342"}, - {"2a0b:11c0:30::/45", "198682"}, - {"2001:559:529::/48", "7922"}, - {"2001:559:c4e7::/48", "33491"}, - {"2001:df0:1400::/48", "64010"}, - {"2402:800:b980::/42", "7552"}, - {"240a:a458::/32", "143762"}, - {"2804:7094::/33", "270735"}, - {"2404:c140:2596::/48", "131668"}, - {"2804:72b0::/32", "270869"}, - {"2001:559:809b::/48", "33491"}, - {"240e:3b5:8200::/35", "140316"}, - {"2607:fef8:ffe0::/46", "13750"}, - {"2a01:4f00:2234::/32", "35047"}, - {"2a03:4d22::/32", "59397"}, - {"2a07:7800::/47", "48254"}, - {"2403:0:206::/47", "4755"}, - {"240a:a7fc::/32", "144694"}, - {"240a:adea::/32", "146212"}, - {"2600:140b:9401::/38", "20940"}, - {"2001:559:837e::/48", "33491"}, - {"2401:2900:3f00::/40", "23679"}, - {"2800:160:1df9::/38", "14259"}, - {"2804:4c94::/32", "267379"}, - {"2a10:1900::/29", "208669"}, - {"2402:3280::/32", "134116"}, - {"2406:69c0:2000::/36", "132420"}, - {"2804:8050::/32", "271743"}, - {"2401:a400:c500::/34", "7477"}, - {"2409:8c14:a000::/36", "9808"}, - {"2804:3124::/32", "264996"}, - {"2a02:2f0c:d000:15::/58", "8708"}, - {"2a06:f980::/29", "174"}, - {"2604:8f00::/32", "17223"}, - {"2001:678:18::/48", "42385"}, - {"2600:1400::/45", "20940"}, - {"2001:fd0:2201::/39", "10029"}, - {"2001:4490:e000::/46", "9829"}, - {"2600:1003:f010::/40", "22394"}, - {"2620:32::/48", "4468"}, - {"2803:800::/45", "25607"}, - {"2803:4180:b00::/32", "263238"}, - {"2a03:5640:f144::/40", "2906"}, - {"2001:1248:883c::/46", "11172"}, - {"2402:9d80:a51::/42", "131429"}, - {"2403:9800:7f1f::/32", "4648"}, - {"2801:80:36c0::/48", "269209"}, - {"2001:470:150::/45", "6939"}, - {"2408:8459:4850::/38", "17816"}, - {"2620:144::/36", "53692"}, - {"2a00:9460::/31", "47631"}, - {"2a02:26f7:ee8d::/42", "20940"}, - {"2406:c500:ffd8::/48", "135421"}, - {"2409:8d15:1800::/39", "56044"}, - {"2a01:cb20:5000::/32", "3215"}, - {"2a02:bf0:2000::/33", "25106"}, - {"2a02:2698:8400::/38", "39028"}, - {"2a03:ce80::/32", "47562"}, - {"2a09:c2c0::/29", "31736"}, - {"2408:8459:a650::/36", "17816"}, - {"240c:ca0d::/27", "24363"}, - {"2804:480:1000::/40", "23002"}, - {"2a01:8840:1bd::/48", "13810"}, - {"2001:13c7:6007::/48", "52294"}, - {"2001:4878:c1e0::/44", "35994"}, - {"2604:eb00::/38", "19212"}, - {"2803:80::/35", "61317"}, - {"2804:6f4c:4000::/34", "270651"}, - {"2804:7b4c::/33", "271423"}, - {"2a07:e343::/32", "5511"}, - {"2001:67c:1798::/48", "51744"}, - {"2607:ffc8:1:2::/33", "17356"}, - {"2804:f50::/32", "263579"}, - {"2a0c:7e43:43be::/48", "20473"}, - {"2a0e:8440::/29", "47373"}, - {"2a0e:b107:272::/48", "210041"}, - {"2001:559:82ce::/48", "7922"}, - {"2408:8956:4f00::/40", "17816"}, - {"240a:a261::/32", "143259"}, - {"240a:ada5::/32", "146143"}, - {"2604:61c0:9001::/33", "29831"}, - {"2607:f250:d004::/48", "7046"}, - {"2620:0:930::/48", "1734"}, - {"2a02:26f7:b808::/48", "36183"}, - {"2a03:5e80::/32", "3233"}, - {"240a:409a:c000::/35", "58834"}, - {"2804:8688::/32", "272650"}, - {"2a00:4802:5100::/44", "13124"}, - {"2a02:7c40::/33", "5539"}, - {"2c0f:eea8:8000::/35", "39356"}, - {"2001:502:be98::/48", "7342"}, - {"2001:559:11f::/48", "7922"}, - {"2409:8959:c944::/43", "9808"}, - {"2a03:c800::/32", "56993"}, - {"2a0a:e140::/29", "16181"}, - {"2a0c:b641:140::/44", "211448"}, - {"2c0f:f2a8::/32", "327960"}, - {"2001:18f0::/32", "12059"}, - {"2800:5f0:2044::/35", "22724"}, - {"2a02:26f7:eac5::/46", "20940"}, - {"2001:67c:1870::/48", "15830"}, - {"2001:1568::/32", "39790"}, - {"2001:67c:10b0::/48", "31317"}, - {"2404:63c0:30::/44", "131645"}, - {"2a01:308::/32", "42009"}, - {"2a01:a280:100::/48", "58191"}, - {"240e:44d:8080::/27", "4134"}, - {"2a02:26f7:e849::/46", "20940"}, - {"2001:1900:2284::/48", "16491"}, - {"2401:4900:5550::/44", "45609"}, - {"2406:9c40:2002::/32", "55366"}, - {"2408:8456:e00::/42", "17622"}, - {"240a:aac6::/32", "145408"}, - {"2801:80:d90::/48", "264471"}, - {"2001:ee0:9e40::/39", "45899"}, - {"2001:4130:50f2::/48", "24725"}, - {"2403:1940:200::/48", "137935"}, - {"2600:5800:f78a::/48", "11955"}, - {"2800:ba0:2::/48", "263812"}, - {"2a0b:1ec0::/32", "205769"}, - {"2001:559:52d::/48", "7725"}, - {"2600:6c38:ea::/39", "20115"}, - {"2803:a0a0:901::/48", "269799"}, - {"2001:559:176::/47", "7015"}, - {"2804:1a24::/32", "61839"}, - {"2a02:1798::/29", "24637"}, - {"2a02:54c0::/29", "20811"}, - {"2001:250:586c::/43", "24363"}, - {"240a:a572::/32", "144044"}, - {"2605:73c0:2000::/32", "10583"}, - {"2a02:26f0:4901::/40", "20940"}, - {"2a05:19c0::/47", "59800"}, - {"2a0e:97c0:4d0::/48", "211024"}, - {"2a10:4d80::/29", "203447"}, - {"2001:694::/48", "207969"}, - {"2001:6b0::/46", "1653"}, - {"240a:a943::/32", "145021"}, - {"2804:38:1000::/39", "19089"}, - {"2a0e:97c3:74c::/48", "20473"}, - {"2001:da8:e80c::/48", "138373"}, - {"2001:1248:a53f::/41", "11172"}, - {"2620:171:2a::/45", "42"}, - {"2a00:7b00::/43", "12338"}, - {"2606:8700::/32", "7050"}, - {"2620:171:f7::/44", "42"}, - {"2a00:adc0:1b00::/32", "41655"}, - {"2a02:cb44::/32", "20546"}, - {"2a0c:47c0::/29", "18779"}, - {"2402:f800:cf01::/40", "7602"}, - {"240a:a480::/32", "143802"}, - {"240a:a553::/32", "144013"}, - {"2804:e94:740::/40", "262468"}, - {"2804:7210:100::/48", "270830"}, - {"2a02:26f7:edc4::/48", "36183"}, - {"2600:370f:7320::/41", "32261"}, - {"2607:fc58:1:64::/64", "13536"}, - {"2803:dba0::/32", "267767"}, - {"2001:de8:1::/48", "9498"}, - {"240a:aead::/32", "146407"}, - {"2602:ffa4::/36", "46886"}, - {"2a0a:3140:610::/44", "15532"}, - {"2a0a:7bc7::/32", "44066"}, - {"2a0b:6f80:200::/37", "211196"}, - {"2a0c:f280::/29", "204703"}, - {"2406:5ec0::/32", "141014"}, - {"2001:1398:276::/48", "52305"}, - {"2404:f780:8::/48", "136557"}, - {"240a:abf2::/32", "145708"}, - {"2604:cc00::/48", "53292"}, - {"2803:1b40::/32", "27843"}, - {"2804:6174::/32", "269235"}, - {"2001:16a2:c100::/43", "39891"}, - {"2401:b000::/32", "17971"}, - {"2600:1017:b830::/40", "6167"}, - {"2602:fe69:200::/39", "36369"}, - {"2a02:26f7:ce84::/48", "36183"}, - {"2a03:2880:f23b::/45", "32934"}, - {"2a0b:9700::/32", "8943"}, - {"2001:67c:24d0::/48", "51316"}, - {"2404:3d00:413f::/41", "21433"}, - {"2800:160:1426::/44", "14259"}, - {"2804:4660::/32", "266986"}, - {"2a00:1788::/32", "31167"}, - {"2a0d:f100::/32", "208449"}, - {"2001:559:814e::/48", "33652"}, - {"2401:1d40:f25::/35", "59019"}, - {"2408:8956:b300::/40", "17816"}, - {"2408:8a00:e000::/31", "9929"}, - {"2600:8807:89aa::/41", "22773"}, - {"2604:3700:1000::/34", "10973"}, - {"2804:3a34::/32", "262616"}, - {"2a01:6e80::/32", "47223"}, - {"240a:a416::/32", "143696"}, - {"2602:feb2::/41", "62492"}, - {"2804:67a0::/32", "269640"}, - {"2806:270::/32", "19373"}, - {"2a00:d2a0::/29", "15600"}, - {"2001:250:181b::/42", "138441"}, - {"2001:559:1ae::/48", "7015"}, - {"2606:7100:3101::/32", "21581"}, - {"2607:ff50::/32", "53264"}, - {"2403:1240::/32", "24279"}, - {"2604:8b80:a::/48", "55106"}, - {"2a02:26f7:d0c4::/48", "36183"}, - {"2001:559:123::/48", "33667"}, - {"2001:67c:2250::/48", "33895"}, - {"2409:8087:1a00::/40", "132525"}, - {"2804:14c:6587::/44", "28573"}, - {"2a02:5820::/32", "201939"}, - {"2a05:2180::/29", "20661"}, - {"2a0c:8a80::/29", "13113"}, - {"2001:550:2302::/47", "174"}, - {"240a:aba3::/32", "145629"}, - {"2804:3b0:830d::/35", "53062"}, - {"2804:2b14::/32", "265133"}, - {"2001:40a8::/32", "12400"}, - {"240a:a5e8::/32", "144162"}, - {"2804:c00:a300::/33", "52655"}, - {"2804:6c94::/32", "270478"}, - {"2a00:42c0::/32", "29608"}, - {"2a0b:3180::/29", "198333"}, - {"2409:8904:c9a0::/38", "24547"}, - {"240e:964:eb00::/40", "133776"}, - {"2606:2800:700a::/45", "15133"}, - {"2a03:9d40:2600::/36", "41095"}, - {"2001:44b8:30e1::/45", "4739"}, - {"2404:2440:beef::/48", "138521"}, - {"2600:40f0:140::/44", "3369"}, - {"2804:37f0:4900::/35", "266445"}, - {"2a0f:5300::/48", "208230"}, - {"2001:418:1c01:2::/34", "2914"}, - {"2001:df2:ca00::/48", "135905"}, - {"2001:13b0:800d::/46", "267790"}, - {"2408:8459:ac30::/41", "17622"}, - {"2606:a2c0:1::/46", "396362"}, - {"2a07:a240::/29", "6786"}, - {"2408:8956:9700::/40", "17816"}, - {"2409:896a:4400::/39", "9808"}, - {"2603:c023:8000::/35", "31898"}, - {"2a06:5600:28f8::/48", "50297"}, - {"2001:678:44::/48", "25354"}, - {"2001:1838:6005::/32", "23352"}, - {"2400:af80::/32", "4693"}, - {"2604:cc00:1a::/48", "53292"}, - {"2a02:188:5109::/37", "31027"}, - {"2401:4900:51c0::/42", "45609"}, - {"2804:6ad0::/32", "270360"}, - {"2806:2f0:61a1::/46", "17072"}, - {"2402:e380:127::/44", "139073"}, - {"2404:c2c0:280::/44", "135629"}, - {"2404:3500::/32", "58627"}, - {"2605:2400::/38", "3361"}, - {"2804:2c64::/32", "265215"}, - {"2804:2f94::/32", "264900"}, - {"2a0a:2f80::/32", "174"}, - {"240a:a746::/32", "144512"}, - {"2605:a401:8354::/42", "33363"}, - {"2804:2014::/32", "264463"}, - {"2804:7350::/32", "270907"}, - {"2a03:ada0::/32", "44404"}, - {"2a07:fc0::/29", "203322"}, - {"2a10:d780:cccd::/34", "211997"}, - {"2600:8807:c800::/35", "22773"}, - {"2607:fad0:1000::/34", "32244"}, - {"2a00:1528:101::/32", "6696"}, - {"2a02:730::/48", "29278"}, - {"2001:418:1401:98::/64", "3949"}, - {"240e:e9:6000::/37", "134756"}, - {"2800:300:9000::/41", "27651"}, - {"2a00:ad87:c00::/48", "31027"}, - {"2a01:9640::/32", "47727"}, - {"2a02:26f7:da48::/48", "36183"}, - {"2001:67c:28f4::/48", "198827"}, - {"240a:ae23::/32", "146269"}, - {"2600:6c21:608::/47", "20115"}, - {"2604:4440::/32", "396139"}, - {"2a03:d000:4000::/36", "25159"}, - {"240e:3b7:1800::/34", "4134"}, - {"2a02:888:8054::/39", "47794"}, - {"2001:550:2606::/48", "174"}, - {"2001:dc7:ffc7::/43", "24151"}, - {"2001:4888:801f::/42", "22394"}, - {"2404:2c00::/32", "45170"}, - {"2a00:81a0::/29", "60804"}, - {"2a09:be47::/32", "209968"}, - {"2402:9500:b01::/37", "55720"}, - {"2a04:f500::/29", "33988"}, - {"2a0e:1bc4::/35", "208621"}, - {"2404:4a00:6000::/64", "55423"}, - {"2600:1007:d0d0::/34", "22394"}, - {"2604:9cc0:1::/48", "50131"}, - {"2a0e:b4c0::/29", "208420"}, - {"2001:579:cf08::/35", "22773"}, - {"2402:800:327f::/40", "7552"}, - {"240a:a878::/32", "144818"}, - {"2803:b4c0::/46", "264668"}, - {"2a01:5b0:20::/45", "8561"}, - {"2a02:26f7:88::/48", "36183"}, - {"2a02:26f7:ebc5::/46", "20940"}, - {"2a10:6480::/29", "204790"}, - {"240a:a849::/32", "144771"}, - {"240e:966:ca00::/39", "133776"}, - {"2600:80c:1200::/40", "23148"}, - {"2606:6200:1c00::/48", "54351"}, - {"2607:ffb0:4005::/46", "6327"}, - {"2a02:26f7:c904::/48", "36183"}, - {"2001:559:84cb::/45", "33657"}, - {"2001:13b0:d002::/48", "23031"}, - {"2605:36c0:1::/48", "29944"}, - {"2804:699c::/32", "270280"}, - {"240a:a5f3::/32", "144173"}, - {"2600:1006:b0f0::/44", "22394"}, - {"2605:de40:1005::/34", "397553"}, - {"2800:bf0:1a0::/45", "52257"}, - {"2803:d100:9280::/37", "52362"}, - {"2804:c48::/36", "52687"}, - {"2a00:6000::/32", "35012"}, - {"2a02:26f7:f308::/48", "36183"}, - {"2402:8100:39b0::/44", "55644"}, - {"2620:160:e740::/44", "4196"}, - {"2804:41b0:3d8::/32", "267450"}, - {"2804:6e3c::/32", "28572"}, - {"2a07:abc0::/29", "62000"}, - {"2a07:e480:100::/47", "202261"}, - {"2a0c:6080::/29", "200000"}, - {"2a0e:b500::/29", "208974"}, - {"2a0f:b1c0::/30", "35732"}, - {"2001:678:468::/48", "39431"}, - {"2001:da8:da8::/48", "24358"}, - {"2600:1404:c800::/48", "35994"}, - {"2607:6300::/32", "29804"}, - {"2804:2814::/32", "263939"}, - {"2806:230:1032::/48", "265594"}, - {"2a0f:2040::/29", "60262"}, - {"2001:df7:2080::/48", "142600"}, - {"2800:160:2453::/40", "14259"}, - {"2804:72e4:3001::/33", "270882"}, - {"2001:559:c37b::/48", "33667"}, - {"2001:b10::/35", "8256"}, - {"2404:ec:420::/39", "703"}, - {"2405:800:bfff::/48", "4817"}, - {"2620:11:70::/47", "3486"}, - {"2620:11b:e020::/44", "3549"}, - {"2806:230:1100::/46", "265594"}, - {"2a02:a50::/32", "20742"}, - {"2001:678:4b4::/48", "48395"}, - {"2001:44b8:2047::/48", "4739"}, - {"2404:bf40:e402::/47", "2764"}, - {"2800:68:34::/47", "61468"}, - {"2801:80:3e40::/48", "271396"}, - {"2a06:6200::/29", "21500"}, - {"2804:13c4::/32", "262825"}, - {"2a09:4c0:ae01::/40", "58057"}, - {"2a0c:e480::/29", "15623"}, - {"2a0d:c7c1::/32", "43959"}, - {"2a12:7280::/29", "16509"}, - {"2800:160:21e4::/38", "14259"}, - {"2804:341c::/32", "265436"}, - {"2804:41b4::/33", "267451"}, - {"2a02:ee80:4123::/44", "3573"}, - {"2a03:1600::/32", "34093"}, - {"2001:550:2b02::/37", "174"}, - {"2602:808:a001::/48", "16509"}, - {"2407:3880::/39", "133012"}, - {"2409:8028:3006::/41", "56041"}, - {"240a:a2d6::/32", "143376"}, - {"240e:1a:120::/44", "134756"}, - {"2804:14d:5cbd::/41", "28573"}, - {"2804:77d8::/32", "271203"}, - {"2804:75b4::/32", "271064"}, - {"2a00:6700::/48", "202753"}, - {"240a:a38c::/32", "143558"}, - {"2803:c860::/32", "267819"}, - {"2806:230:4018::/48", "265594"}, - {"2a04:4e40:1e10::/41", "54113"}, - {"2001:df1:c080::/48", "139739"}, - {"2405:2840::/48", "135951"}, - {"2600:1403:5c01::/34", "20940"}, - {"2800:160:1bc0::/44", "14259"}, - {"2001:e90::/32", "9622"}, - {"2602:feda:2a9::/46", "204185"}, - {"2804:6c34::/32", "270452"}, - {"2a02:26f0:c501::/38", "20940"}, - {"2a0c:9a40:8118::/46", "204438"}, - {"2001:250:817::/48", "138182"}, - {"2001:42d8:1001::/48", "29571"}, - {"2804:5100:3100::/32", "268424"}, - {"2a0e:fb41::/32", "206766"}, - {"2a0f:305::/30", "398559"}, - {"240a:a798::/32", "144594"}, - {"240e:44d:780::/41", "4134"}, - {"2a04:4e41:4::/43", "54113"}, - {"2001:559:8451::/48", "7015"}, - {"2408:840d:3600::/42", "17621"}, - {"2800:240::/32", "12956"}, - {"2403:9800:7f02::/45", "4771"}, - {"2408:8459:e230::/41", "17622"}, - {"2a02:26f0:1a01::/39", "20940"}, - {"2408:80f1::/44", "138421"}, - {"240a:a406::/32", "143680"}, - {"240e:3bc:7600::/39", "140313"}, - {"2603:c011:e000::/36", "31898"}, - {"2804:e30:2c00::/38", "11338"}, - {"2806:2f0:9be1::/46", "17072"}, - {"2a02:26f7:db8d::/42", "20940"}, - {"2a0f:5707:ab29::/48", "398646"}, - {"2600:1016:b1e0::/33", "6167"}, - {"2804:545c:9400::/33", "268645"}, - {"2a01:4020:31::/45", "25369"}, - {"2a0f:f240::/32", "13282"}, - {"2407:7400::/48", "9498"}, - {"2600:9000:107f::/40", "16509"}, - {"2605:ed40::/32", "31998"}, - {"2803:6ce0:b000::/33", "269909"}, - {"2804:e24:fff1::/44", "262417"}, - {"2806:2f0:32a3::/41", "17072"}, - {"2a00:8a03::/43", "28723"}, - {"2a0d:2d40::/32", "62075"}, - {"2001:559:149::/46", "33287"}, - {"2001:559:c111::/48", "20214"}, - {"2001:4288:302::/32", "6713"}, - {"2001:4490:d4c0::/46", "9829"}, - {"2408:8256:2d96::/48", "17816"}, - {"2620:133:d000::/40", "395746"}, - {"2804:1b50:c840::/34", "61719"}, - {"2a02:708::/32", "8741"}, - {"2a06:5e40:1::/48", "204101"}, - {"2a0c:b641:20a::/48", "209710"}, - {"240a:a3d2::/32", "143628"}, - {"2605:ec0::/48", "26272"}, - {"2001:559:845e::/48", "7016"}, - {"2001:559:c21e::/48", "7922"}, - {"2402:e240::/32", "55699"}, - {"2600:6c38:c2b::/45", "20115"}, - {"2604:abc0::/32", "64236"}, - {"2607:f8f8:1f00::/47", "50131"}, - {"2803:500::/32", "262168"}, - {"2804:2e8::/46", "262847"}, - {"2a04:e9c0::/29", "34768"}, - {"2a12:2000::/29", "204790"}, - {"2402:ef03:6001::/40", "7633"}, - {"2408:8662::/29", "4837"}, - {"2606:2080::/32", "11672"}, - {"2804:4c14::/32", "267348"}, - {"2001:559:c443::/45", "7015"}, - {"2402:e280:221f::/42", "134674"}, - {"2408:8957:f00::/40", "17816"}, - {"240e:978:500::/40", "131325"}, - {"2600:6c10:8a::/45", "20115"}, - {"2a02:26f7:ee88::/48", "36183"}, - {"2a02:de80::/29", "8595"}, - {"2001:ba0::/32", "8560"}, - {"2406:daa0:c0a0::/44", "16509"}, - {"2001:559:8533::/48", "7922"}, - {"2400:adc0:210::/47", "9541"}, - {"2804:4b0:3a0::/37", "262459"}, - {"2409:8924:100::/38", "56046"}, - {"240a:a0cb::/32", "142853"}, - {"2801:168:2::/48", "61554"}, - {"2c0f:3000::/32", "327903"}, - {"2001:559:85b4::/47", "33651"}, - {"2409:896a:2200::/39", "9808"}, - {"240e:95a:3000::/36", "140083"}, - {"2a00:45c0::/32", "42707"}, - {"2a02:4f40::/32", "51464"}, - {"2a05:2701:f00::/43", "62371"}, - {"2001:579:888::/43", "22773"}, - {"2407:ba40::/32", "398465"}, - {"2a05:6d40::/29", "202128"}, - {"2a0a:ff80::/32", "206566"}, - {"2600:380:b280::/39", "20057"}, - {"2600:5c00:3fca::/32", "20001"}, - {"2a03:8180:1000::/37", "36351"}, - {"2001:4888::/43", "6167"}, - {"2400:5fa0::/32", "139870"}, - {"2800:484:dc00::/40", "10620"}, - {"2806:2f0:2022::/48", "17072"}, - {"2a00:d940::/32", "43542"}, - {"2001:19e8:f1::/44", "2576"}, - {"2409:8c15:3c00::/33", "56044"}, - {"2600:6c10:5a::/45", "20115"}, - {"2602:fbda:666::/48", "7721"}, - {"2804:25a8::/32", "264293"}, - {"2a04:4e42:fe6::/43", "54113"}, - {"2a06:82c2::/48", "136620"}, - {"2001:df0:8580::/48", "139197"}, - {"2402:8780::/32", "63859"}, - {"2806:266:380::/41", "13999"}, - {"2a02:26f0:a101::/40", "20940"}, - {"2a03:5e20::/32", "15576"}, - {"2a03:7900:600::/32", "197731"}, - {"2620:ff:4000::/48", "394566"}, - {"2800:160:1375::/46", "14259"}, - {"2803:7da0:1::/46", "64114"}, - {"2a0a:df80:26::/48", "39212"}, - {"2a0d:ac00:1006::/47", "205202"}, - {"2001:1248:5a2d::/46", "11172"}, - {"240e:698:2700::/40", "133774"}, - {"2804:14d:4600::/40", "28573"}, - {"2a04:9680::/29", "20830"}, - {"240a:a4ef::/32", "143913"}, - {"2606:f180::/48", "64286"}, - {"2620:fc::/48", "40119"}, - {"2001:559:206::/48", "7922"}, - {"240a:aecb::/32", "146437"}, - {"2a02:26f7:ddc8::/48", "36183"}, - {"2a0e:8f02:f02b::/45", "206477"}, - {"2001:67c:1914::/48", "20708"}, - {"2401:4900:1f80::/44", "45609"}, - {"2407:52c0::/32", "139484"}, - {"2408:80f1:240::/44", "138421"}, - {"2a02:26f7:be10::/48", "36183"}, - {"2c0f:f8b8::/32", "37356"}, - {"2001:559:81b3::/45", "7922"}, - {"2407:7000::/32", "9500"}, - {"2605:f440:5654::/40", "21957"}, - {"2804:5f8c::/32", "269108"}, - {"2a02:430::/32", "12941"}, - {"2a02:2488::/32", "29413"}, - {"2a02:26f7:ca01::/46", "20940"}, - {"240a:a689::/32", "144323"}, - {"240e:84c:50::/27", "4134"}, - {"240e:980:2e00::/40", "4134"}, - {"2a00:79e1:f21::/48", "395973"}, - {"2a02:26f7:bb88::/48", "36183"}, - {"2a0e:aa07:e00a::/48", "207454"}, - {"240a:a0d5::/32", "142863"}, - {"2604:640:105::/46", "393562"}, - {"2804:794::/32", "262303"}, - {"2001:67c:107c::/48", "8473"}, - {"2602:fc0f::/40", "400148"}, - {"2804:19dc::/32", "61823"}, - {"2a01:430:12::/32", "24971"}, - {"2a11:36c0::/29", "58243"}, - {"2001:559:2d4::/46", "7015"}, - {"2405:a480::/32", "63981"}, - {"2409:806c:3100::/36", "9808"}, - {"240e:a7:7fde::/42", "140518"}, - {"2606:a600:4::/48", "397933"}, - {"2a02:2408::/32", "197064"}, - {"2a03:4020::/32", "201506"}, - {"2001:1248:96d9::/42", "11172"}, - {"2600:100d:9f00::/44", "6167"}, - {"2600:5c00:386d::/38", "20001"}, - {"2800:300:8a00::/37", "27986"}, - {"2a06:e881:260f::/48", "206740"}, - {"2001:559:7d0::/48", "33657"}, - {"2401:1f80:10::/44", "29990"}, - {"240a:a3f0::/32", "143658"}, - {"240e:982:9000::/38", "63835"}, - {"2602:80a:200c::/48", "16509"}, - {"2804:6e94::/32", "270606"}, - {"2a02:922::/35", "49292"}, - {"2a0f:55c7:ffff::/48", "48749"}, - {"2c0f:f6f8::/32", "37589"}, - {"2001:678:fb0::/48", "211041"}, - {"2605:4400::/47", "40715"}, - {"2606:62c0:187::/44", "399686"}, - {"2804:8328::/32", "272180"}, - {"2804:6a80::/34", "270340"}, - {"2a06:4cc0::/29", "24633"}, - {"2001:559:c3fb::/48", "33659"}, - {"2804:14c:6521::/41", "28573"}, - {"2a01:8100:1::/48", "203461"}, - {"2a02:26f7:40::/48", "36183"}, - {"2001:559:8215::/48", "33657"}, - {"2605:9500:212::/47", "14244"}, - {"2804:2fdc:1000::/36", "264917"}, - {"2806:203:f002::/36", "13999"}, - {"2806:230:3006::/48", "265594"}, - {"2001:559:e4::/47", "33651"}, - {"2001:559:c1d1::/48", "395676"}, - {"2607:9480::/43", "14338"}, - {"2804:7a9c::/32", "53141"}, - {"2a06:1287:2902::/37", "61138"}, - {"2001:559:8312::/47", "7015"}, - {"2409:8052:1000::/47", "56047"}, - {"2409:8a14:8a00::/31", "56044"}, - {"2804:3b8:1fe::/32", "52965"}, - {"2001:559:c351::/48", "33657"}, - {"2001:67c:140::/48", "48344"}, - {"2402:800:3a0f::/43", "7552"}, - {"240a:ae13::/32", "146253"}, - {"2620:158:c1::/48", "13996"}, - {"2804:259c:bb00::/37", "52772"}, - {"2804:39f8::/32", "266062"}, - {"2806:2f0:3323::/41", "17072"}, - {"2a01:58c0::/32", "42487"}, - {"2a04:8340::/29", "43260"}, - {"2620:148:f00::/44", "4983"}, - {"2800:160:1fe3::/44", "14259"}, - {"2a05:45c7:f000::/36", "28910"}, - {"240e:928:1500::/32", "58542"}, - {"2600:6c20:e24::/47", "20115"}, - {"2a04:ff00:101::/48", "207616"}, - {"2001:7f0:4021::/29", "13237"}, - {"2803:6604:6801::/39", "28075"}, - {"2804:18e4::/32", "61761"}, - {"2804:3e7c::/32", "266599"}, - {"2001:559:85a4::/48", "7015"}, - {"2620:10e:d000::/41", "21538"}, - {"2001:579:703d::/40", "22773"}, - {"2407:e740:12c::/32", "59239"}, - {"240a:a301::/32", "143419"}, - {"2600:1300::/32", "20021"}, - {"2602:809:b000::/48", "399242"}, - {"2605:9b80::/32", "14828"}, - {"2804:3a30::/32", "266076"}, - {"2804:851c::/32", "272558"}, - {"2a02:820::/32", "29061"}, - {"2a02:2a30::/29", "9158"}, - {"2001:1900:2371::/48", "3356"}, - {"2406:b100::/32", "132730"}, - {"2409:807b::/29", "9808"}, - {"240a:ad8a::/32", "146116"}, - {"2001:da8:255::/48", "24350"}, - {"2806:2f0:20c3::/43", "22884"}, - {"2409:804b:2909::/48", "9808"}, - {"2600:1012:b1d0::/42", "6167"}, - {"2804:7a40::/32", "271358"}, - {"2a02:26f7:c8c1::/46", "20940"}, - {"2001:1248:9c8f::/43", "11172"}, - {"240e:e0::/31", "4812"}, - {"2600:141c:801::/35", "20940"}, - {"2a00:8d00::/32", "3257"}, - {"2a04:8740::/29", "44212"}, - {"2001:559:5d4::/48", "7015"}, - {"240a:ab83::/32", "145597"}, - {"2607:fc58:1:1b::/64", "13536"}, - {"2803:7ca0::/32", "262213"}, - {"2804:3cc0::/32", "266232"}, - {"2804:45fc::/39", "266959"}, - {"2a0f:54c0::/29", "207906"}, - {"2a12:62c0::/29", "210619"}, - {"2404:4e00:101::/46", "32787"}, - {"240a:acc4::/32", "145918"}, - {"2606:2800:31f::/42", "15133"}, - {"2a04:4e40:da00::/47", "54113"}, - {"2001:559:5a5::/48", "33659"}, - {"240e:67d:c200::/39", "140329"}, - {"2600:a000::/30", "394092"}, - {"2a05:8240::/29", "57353"}, - {"2402:8100::/44", "55644"}, - {"240a:ace7::/32", "145953"}, - {"2600:8807:ac00::/35", "22773"}, - {"2607:6000:100::/40", "12189"}, - {"2a00:8b20::/32", "48407"}, - {"2a03:4b40::/33", "50710"}, - {"2408:8459:cd10::/42", "17623"}, - {"240a:aa06::/32", "145216"}, - {"2804:7e78::/32", "271626"}, - {"2001:67c:3fc::/48", "51776"}, - {"2402:28c0:fff9::/48", "137411"}, - {"2602:fdeb:1::/48", "14618"}, - {"2804:3e90:4204::/41", "266606"}, - {"2602:806:f000::/47", "27217"}, - {"2804:59a0:c000::/36", "268714"}, - {"2804:70f8::/32", "270759"}, - {"2001:4888:805f::/48", "22394"}, - {"2401:d800:feb0::/41", "7552"}, - {"240a:a146::/32", "142976"}, - {"2804:14d:e200::/40", "28573"}, - {"2a03:60c0::/32", "20473"}, - {"2a0e:2980:2::/48", "34568"}, - {"2602:fd23:9::/48", "19168"}, - {"2804:2570::/32", "264281"}, - {"2804:5028::/32", "268372"}, - {"2804:5db8::/32", "268988"}, - {"2001:559:8290::/48", "7016"}, - {"2409:8a53:700::/36", "56047"}, - {"2a0b:1200::/29", "559"}, - {"2a0d:80c0::/29", "15848"}, - {"2a10:4647::/46", "50046"}, - {"2408:8000:a020::/48", "140720"}, - {"2600:100f:9010::/40", "22394"}, - {"2804:1644:f760::/36", "262903"}, - {"2a04:c440:2b00::/33", "2047"}, - {"2404:5f40::/48", "38447"}, - {"2602:ff62:205::/46", "61317"}, - {"2610:a1:3064::/48", "12008"}, - {"2a00:d2e0::/29", "15600"}, - {"2a01:8880::/32", "8745"}, - {"2a0a:2e82::/32", "47596"}, - {"2a0f:e240::/29", "60781"}, - {"2001:67c:1bcc::/48", "41009"}, - {"2001:ddc::/48", "133874"}, - {"2409:896a:9c00::/39", "9808"}, - {"2600:1010:9010::/40", "22394"}, - {"2804:6358::/32", "269355"}, - {"2a02:26f7:bccc::/48", "36183"}, - {"2a0e:fd45:b00c::/30", "44103"}, - {"240a:a944::/32", "145022"}, - {"2600:1000:f110::/36", "22394"}, - {"2001:550:1200:4::/45", "174"}, - {"240a:af5b::/32", "146581"}, - {"2a02:2e02:96a0::/39", "12479"}, - {"2a0c:9780::/29", "65560"}, - {"240e:96b:6021::/46", "140375"}, - {"2804:301:1000::/36", "53237"}, - {"2a02:26f7:ca0d::/42", "20940"}, - {"2001:4340::/32", "3208"}, - {"2400:adc0:30::/46", "9541"}, - {"2408:84f3:e810::/42", "134543"}, - {"240a:a622::/32", "144220"}, - {"2600:400:8500::/36", "15147"}, - {"2804:7824::/32", "271223"}, - {"2a02:8000::/32", "50472"}, - {"240a:abc8::/32", "145666"}, - {"240e:95c:5000::/36", "138982"}, - {"2600:6c20:110::/45", "20115"}, - {"2804:2748::/32", "263891"}, - {"2804:8318:400::/32", "272176"}, - {"2a07:3ac0::/29", "58243"}, - {"2409:806a:3900::/33", "9808"}, - {"2806:2f0:5281::/46", "17072"}, - {"2001:67c:740::/48", "44655"}, - {"2400:8500:6800::/48", "58786"}, - {"2405:8180:b00::/37", "135478"}, - {"2405:9800:b128::/47", "133481"}, - {"240e:3b4:3e00::/33", "140308"}, - {"2605:2a00::/32", "16532"}, - {"2804:5574::/32", "267936"}, - {"2806:2eb::/32", "265524"}, - {"2001:559:50a::/48", "33287"}, - {"2401:9cc0:300::/48", "59256"}, - {"2804:3378::/32", "265398"}, - {"2001:559:2e0::/48", "33490"}, - {"2409:8904:2640::/39", "24547"}, - {"2804:56e0:40::/32", "268029"}, - {"2001:da8:4008::/48", "23910"}, - {"2a00:f440:c::/48", "57712"}, - {"2402:e380:304::/48", "134997"}, - {"2404:4a00:5542::/62", "55423"}, - {"2804:14c:41a3::/41", "28573"}, - {"2a0e:f200:184::/48", "30633"}, - {"2001:df6:7f80::/48", "134021"}, - {"240e:9b:f000::/46", "140245"}, - {"2606:6ac0::/32", "15176"}, - {"2804:8224::/32", "272501"}, - {"2a0c:b641:451::/48", "209389"}, - {"2001:67c:440::/48", "57944"}, - {"240a:ad93::/32", "146125"}, - {"2a01:b960:2307::/48", "210266"}, - {"2001:ce0:2200::/40", "4528"}, - {"2402:5300:710::/36", "45903"}, - {"2a03:39a0::/32", "15733"}, - {"2600:1001:a000::/44", "6167"}, - {"2804:13d8::/40", "262669"}, - {"2a01:110:9008::/48", "35106"}, - {"2a02:208::/32", "5495"}, - {"2a0b:4340:93::/48", "205610"}, - {"2001:df1:ad80::/47", "56093"}, - {"240a:abee::/32", "145704"}, - {"2600:3001:22::/45", "13649"}, - {"2804:10b4:2::/43", "263645"}, - {"2c0f:1b00::/32", "21271"}, - {"2001:579:b850::/40", "22773"}, - {"2800:200:2009::/32", "12252"}, - {"2804:3ab4:f800::/37", "266104"}, - {"2001:470:f1::/45", "6939"}, - {"240a:adbf::/32", "146169"}, - {"2620:38:c000::/48", "25656"}, - {"2a00:8740:1a::/42", "49037"}, - {"2a02:26f7:e204::/48", "36183"}, - {"2001:b08::/46", "3267"}, - {"2404:bf40:ea04::/37", "139084"}, - {"2408:8957:6f00::/40", "17816"}, - {"2604:880:217::/42", "29802"}, - {"2606:2980:2000::/40", "26344"}, - {"2803:760:181a::/40", "269816"}, - {"2a02:7920::/48", "201868"}, - {"2a07:7940:fffd::/48", "211691"}, - {"2001:1248:5770::/44", "11172"}, - {"2400:cb00:a170::/47", "13335"}, - {"2408:8957:3600::/40", "17622"}, - {"2801:80:600::/48", "52622"}, - {"2803:b220:b003::/33", "265844"}, - {"2804:4b0:4ec::/43", "262459"}, - {"2a00:4c00:3::/48", "15632"}, - {"2a02:26f7:ca49::/42", "20940"}, - {"2a09:be80::/32", "44901"}, - {"2a0a:ec02:501::/48", "42692"}, - {"2606:2000::/43", "1616"}, - {"2607:fc58:1:71::/64", "13536"}, - {"2804:3d68::/32", "266529"}, - {"2804:6134::/32", "269220"}, - {"2c0f:ef78:f::/48", "63293"}, - {"2001:4b08::/32", "29452"}, - {"2400:d400:11::/46", "45671"}, - {"240a:a563::/32", "144029"}, - {"2803:780::/32", "8053"}, - {"2a02:17f8::/32", "44700"}, - {"2001:559:c3f4::/48", "7015"}, - {"2401:2200::/48", "55420"}, - {"2402:2a80:4300::/32", "46489"}, - {"2804:10c4::/32", "263648"}, - {"2600:1f01:48b0::/47", "16509"}, - {"2600:1600::/24", "40788"}, - {"2804:29a4:500::/35", "264026"}, - {"2c0f:eb00:a00::/40", "328962"}, - {"2c0f:f598::/47", "327813"}, - {"240a:a295::/32", "143311"}, - {"2620:df:4002::/44", "16509"}, - {"2a03:9b40::/32", "9063"}, - {"2a09:f907::/32", "62200"}, - {"2a0e:dc80::/29", "202346"}, - {"2001:4490:de18::/46", "9829"}, - {"2400:b080::/33", "45296"}, - {"2409:8051:2802::/38", "56047"}, - {"2600:6c38::/45", "20115"}, - {"2607:fdc8:fff0::/44", "30036"}, - {"2804:43f4:c0::/32", "267601"}, - {"2a01:bb20:2000::/36", "206834"}, - {"2a09:ee00::/29", "200272"}, - {"2001:b18:a::/47", "47787"}, - {"240a:a99f::/32", "145113"}, - {"2804:3d70::/32", "266531"}, - {"2a09:480::/29", "212449"}, - {"2409:805e:2c00::/35", "9808"}, - {"240e:e1:9f00::/33", "4811"}, - {"2620:149:1070::/40", "714"}, - {"2a00:1f78:f008::/36", "8893"}, - {"2a01:120::/29", "12348"}, - {"2a02:ac80:101::/38", "25145"}, - {"2001:468:2630::/48", "396955"}, - {"2001:df0:3040::/48", "141592"}, - {"2404:c900:d::/48", "58682"}, - {"2602:fcd9::/36", "36326"}, - {"2606:2800:4104::/44", "15133"}, - {"2a01:9ba0::/32", "30742"}, - {"2a02:26f0:1901::/40", "20940"}, - {"2a06:1040::/29", "200648"}, - {"2001:c20:4890::/48", "3758"}, - {"2001:43f8:1460::/48", "328601"}, - {"2405:205:d000::/34", "55836"}, - {"2001:559:c0d3::/48", "7016"}, - {"2001:67c:1488::/48", "1257"}, - {"240e:67c:c400::/39", "140330"}, - {"2800:160:146a::/43", "14259"}, - {"2a0e:97c0:520::/44", "57351"}, - {"2400:8500:5700::/48", "58651"}, - {"240e:473:eeef::/35", "140485"}, - {"2600:8807:d060::/36", "22773"}, - {"2001:559:c376::/48", "33660"}, - {"2403:cd40::/32", "10075"}, - {"2409:8070:2c00::/35", "9808"}, - {"2600:1014:f000::/44", "6167"}, - {"2800:bf0:2af::/43", "27947"}, - {"2804:2050:5a6f::/43", "264485"}, - {"2a06:7b80::/29", "204052"}, - {"240a:a794::/32", "144590"}, - {"2804:33e8::/32", "265424"}, - {"2804:3df8::/46", "266566"}, - {"2a02:26f7:ccc0::/48", "36183"}, - {"2600:140b:a01::/39", "20940"}, - {"2804:7f3:e000::/29", "18881"}, - {"2001:4de0:ac10::/46", "20446"}, - {"2405:8a00:400e::/43", "55824"}, - {"2408:8459:3650::/36", "17816"}, - {"2408:8459:f030::/41", "17622"}, - {"2606:2800:6060::/48", "15133"}, - {"2a00:86c0::/39", "2906"}, - {"2a00:8920::/32", "25415"}, - {"2402:800:5bc5::/43", "7552"}, - {"2600:1415:f800::/48", "24319"}, - {"2600:370f:3080::/47", "32261"}, - {"2600:8807:3a20::/39", "22773"}, - {"2605:72c0:1::/48", "32354"}, - {"2a02:610:ffff::/48", "42979"}, - {"2a02:4440::/32", "60185"}, - {"2a07:ae00::/31", "51299"}, - {"2a0b:35c0::/29", "200005"}, - {"2a0e:b880::/31", "208789"}, - {"2a0f:9400:6105::/48", "210337"}, - {"2a12:1680::/29", "60144"}, - {"2001:559:c2f7::/44", "7015"}, - {"2401:d800:fee0::/39", "7552"}, - {"240a:a349::/32", "143491"}, - {"240a:a6a0::/32", "144346"}, - {"2620:65:c000::/48", "15053"}, - {"2804:4a24:116::/47", "267221"}, - {"2600:1012:b074::/44", "22394"}, - {"2803:de10::/32", "271978"}, - {"240e:3b1:7a00::/32", "140313"}, - {"2602:800:e000::/44", "33201"}, - {"2a03:b500:81::/41", "41135"}, - {"2a0f:cc0::/29", "60262"}, - {"2600:6:ffc0::/45", "10507"}, - {"2600:1417:13::/45", "20940"}, - {"2600:370f:72e4::/48", "32261"}, - {"2a01:c50e:5a00::/37", "12479"}, - {"2a0e:b107:6d0::/44", "134478"}, - {"240a:af31::/32", "146539"}, - {"240c:c0a8:5c26::/48", "24364"}, - {"2001:253:113::/48", "142079"}, - {"2408:8000:9000::/36", "17621"}, - {"2600:6c38:f14::/47", "20115"}, - {"2600:9000:2356::/47", "16509"}, - {"2806:230:5011::/48", "11888"}, - {"2a0e:d606::/48", "210644"}, - {"2401:bc40:a300::/40", "136899"}, - {"2402:9d80:300::/40", "131429"}, - {"2408:8256:396b::/48", "17816"}, - {"2409:801f:3008::/48", "24400"}, - {"2a02:26f7:dd40::/48", "36183"}, - {"2001:378::/32", "9318"}, - {"2001:6a8:be01::/33", "2611"}, - {"2001:dce:5300::/48", "45285"}, - {"2001:4310::/40", "30983"}, - {"2607:9000:3000::/36", "46844"}, - {"2620:1f:8000::/48", "10908"}, - {"2804:5f8::/32", "262551"}, - {"2a02:26f0:ae01::/40", "20940"}, - {"2a02:26f7:c78c::/48", "36183"}, - {"2a02:26f7:c948::/47", "36183"}, - {"2a03:8600:6::/48", "44394"}, - {"2402:800:59a9::/41", "7552"}, - {"2408:8000:1200::/36", "4808"}, - {"2a09:e240::/48", "57706"}, - {"2001:559:585::/48", "33650"}, - {"240a:a9f8::/32", "145202"}, - {"2a02:d40:4::/47", "44592"}, - {"2a03:db80:4415::/44", "680"}, - {"2a11:4800::/29", "204790"}, - {"2001:559:c3c1::/48", "33659"}, - {"240a:ae3c::/32", "146294"}, - {"2600:1417:1001::/36", "20940"}, - {"2605:66c0::/32", "398559"}, - {"2606:3a80:200::/48", "54913"}, - {"2800:b30::/31", "27740"}, - {"2801:80:3e80::/48", "271640"}, - {"2804:bf8::/33", "52653"}, - {"2804:4934::/32", "267170"}, - {"2806:230:4013::/48", "11888"}, - {"2a01:838::/32", "33874"}, - {"2001:678:59c::/48", "44973"}, - {"240a:acaa::/32", "145892"}, - {"2602:fd71::/36", "396325"}, - {"2607:fb10:7083::/43", "2906"}, - {"2a00:1d40::/32", "25180"}, - {"2a01:6500::/46", "42925"}, - {"2a0b:de00::/48", "207486"}, - {"2a0f:e40::/29", "60262"}, - {"2001:559:8515::/48", "33287"}, - {"2001:67c:2fbc::/48", "212467"}, - {"2605:c00:1400::/38", "46920"}, - {"2605:f080:500::/40", "23535"}, - {"2a06:7a05::/48", "207682"}, - {"2620:121:5071::/48", "16509"}, - {"2806:230:500d::/48", "11888"}, - {"2a02:26f7:f795::/46", "20940"}, - {"2001:559:23b::/48", "33491"}, - {"2001:df1:6000::/48", "131217"}, - {"2804:4040::/32", "265947"}, - {"2001:16a2:d700::/34", "25019"}, - {"2001:b400:d210::/37", "3462"}, - {"2620:4a:c000::/48", "32703"}, - {"2804:2dcc::/48", "265304"}, - {"2a0a:e202:8013::/45", "33438"}, - {"2401:d800:1c0::/42", "7552"}, - {"2409:8087:c00::/38", "56042"}, - {"240a:a8bd::/32", "144887"}, - {"2a01:c0::/32", "31708"}, - {"2a10:d181::/32", "197444"}, - {"2406:3e00::/32", "56030"}, - {"240e:438:3820::/43", "140647"}, - {"2a04:3b40::/29", "60664"}, - {"2001:1248:55f6::/44", "11172"}, - {"2402:5680:a000::/36", "133798"}, - {"2409:8c7d::/30", "9808"}, - {"240a:aaad::/32", "145383"}, - {"2600:1010:b000::/42", "6167"}, - {"2a02:2578:1305::/44", "51375"}, - {"2c0f:eab0::/32", "328111"}, - {"2001:67c:2c58::/48", "29551"}, - {"2001:8a8::/32", "15623"}, - {"2402:800:351d::/42", "7552"}, - {"2404:1f00:d000::/34", "55947"}, - {"240e:3be:2800::/38", "4134"}, - {"2a00:1ec8:39::/41", "2854"}, - {"2a03:b8c0:15::/48", "396253"}, - {"2001:1860::/32", "101"}, - {"2620:82:e000::/48", "33014"}, - {"2620:116:8087::/48", "27281"}, - {"2803:9810:140::/35", "36492"}, - {"2804:5e44:8000::/33", "269022"}, - {"2a02:26f7:e540::/48", "36183"}, - {"2a05:bc0::/32", "8495"}, - {"2a09:bd00::/48", "42385"}, - {"2a0d:59c7::/32", "202766"}, - {"240e:965:ea00::/39", "133776"}, - {"2620:12e:9000::/44", "395423"}, - {"2a00:67e0::/29", "203986"}, - {"2001:da8:264::/47", "24350"}, - {"2001:49f0:a05e::/47", "174"}, - {"2408:8956:5700::/40", "17816"}, - {"2a03:3140:fffe::/47", "61345"}, - {"2001:550:5c08::/34", "174"}, - {"2803:1400::/32", "27887"}, - {"2a02:6180::/32", "31510"}, - {"2001:438:fffd:14::/57", "6461"}, - {"2001:559:f5::/46", "7922"}, - {"2401:7500:ff5::/48", "133296"}, - {"2620:0:1a50::/48", "32360"}, - {"2806:108e:8::/43", "8151"}, - {"2a0f:5946::/31", "209372"}, - {"2607:5d00:5::/46", "53587"}, - {"2607:9a00::/32", "35916"}, - {"2001:400:8824::/34", "293"}, - {"2401:d800:3d0::/37", "7552"}, - {"2600:6c38:8f2::/38", "20115"}, - {"2620:f6::/48", "26806"}, - {"2a04:2dc0:1e::/48", "39216"}, - {"2a0e:b101::/38", "60474"}, - {"2001:559:c53a::/29", "7922"}, - {"2402:800:f8a0::/41", "7552"}, - {"240e:983:1b03::/37", "4134"}, - {"2803:5c80:6051::/46", "64114"}, - {"2804:db4::/32", "28257"}, - {"2804:7c1c::/32", "271476"}, - {"2a05:d050:6040::/44", "16509"}, - {"2a07:f280::/29", "206163"}, - {"240a:a25d::/32", "143255"}, - {"2602:feb4:190::/44", "25961"}, - {"2800:310:901::/32", "18678"}, - {"2800:8e0::/47", "18822"}, - {"2804:494::/32", "52987"}, - {"2a00:e70::/32", "43655"}, - {"2406:f0c0:105::/46", "138654"}, - {"240a:a400::/32", "143674"}, - {"240e:250:2800::/40", "138991"}, - {"2600:1012:b040::/42", "6167"}, - {"2620:1d5::/44", "14773"}, - {"2a01:73e0::/36", "47872"}, - {"2a10:a800::/30", "213013"}, - {"2001:67c:21bc::/48", "200533"}, - {"240e:3b6:7600::/39", "140313"}, - {"2600:370f:35a5::/44", "32261"}, - {"2804:710:2::/44", "17222"}, - {"2403:300:13c5::/43", "714"}, - {"2606:af80::/32", "25710"}, - {"2804:49f0::/32", "267210"}, - {"2a02:26f7:eec8::/48", "36183"}, - {"2a05:3182::/29", "34580"}, - {"2400:6a80::/32", "55821"}, - {"2405:1c0:6781::/46", "55303"}, - {"2600:9000:1175::/44", "16509"}, - {"2803:2d60:2000::/32", "14754"}, - {"2001:1b70:86c0::/48", "8147"}, - {"2402:800:7720::/41", "7552"}, - {"240e:3b1:dc00::/34", "4134"}, - {"2602:fc9d::/36", "20220"}, - {"2804:357c::/32", "266289"}, - {"2a0f:9400:7814::/44", "147028"}, - {"2c0f:f278::/32", "328036"}, - {"2402:3a80:10::/46", "38266"}, - {"2a03:6f01:1::/48", "9123"}, - {"2a07:afc0::/29", "205435"}, - {"2001:da8:4033::/36", "23910"}, - {"240e:720::/32", "140061"}, - {"2001:16a2::/43", "25019"}, - {"2400:a980:cd::/43", "133111"}, - {"2600:370f:74c8::/47", "32261"}, - {"2a00:1908:e000::/48", "199491"}, - {"2a01:8840:71::/48", "207266"}, - {"2a07:9944:40::/48", "58305"}, - {"2001:559:327::/48", "33650"}, - {"2408:8957:3700::/40", "17816"}, - {"2804:f24:f201::/36", "263567"}, - {"2804:470c::/32", "267028"}, - {"2a02:2d8::/47", "9002"}, - {"2a02:26f7:be04::/48", "36183"}, - {"2400:300:9::/48", "4766"}, - {"240a:a2bb::/32", "143349"}, - {"2804:4dc0::/32", "268217"}, - {"2a0b:fd80::/48", "49419"}, - {"2a0c:b641:80::/47", "209861"}, - {"2001:978:909::/48", "61083"}, - {"2406:e00:100::/47", "55740"}, - {"2600:1402:9801::/34", "20940"}, - {"2600:140f:ec00::/48", "9498"}, - {"240a:a828::/32", "144738"}, - {"2604:1040::/32", "18918"}, - {"2408:8957:9f00::/40", "17816"}, - {"2803:5810::/32", "271837"}, - {"2806:2f0:4541::/46", "17072"}, - {"2a00:1298:8016::/48", "206055"}, - {"2a01:3f1:c400::/34", "8674"}, - {"2a07:22c1:35::/48", "211777"}, - {"2c0f:5d00::/48", "328677"}, - {"2408:8956:bc00::/40", "17622"}, - {"2408:8957:ae00::/40", "17622"}, - {"240e:980:4b00::/40", "133774"}, - {"2610:f0:30d7::/32", "22925"}, - {"2001:798::/32", "20965"}, - {"2001:48a8:68fe::/32", "237"}, - {"240e:1e:2000::/36", "136200"}, - {"240e:108:10f3::/44", "4134"}, - {"2620:0:2820::/48", "91"}, - {"2001:44b8:4061::/48", "4739"}, - {"2001:4850::/32", "27446"}, - {"240e:44d:7740::/42", "140352"}, - {"2a03:2880:f165::/46", "32934"}, - {"2a03:5a00:17::/48", "61335"}, - {"2a0a:54c1:2::/45", "62240"}, - {"2a12:e100:1::/46", "149502"}, - {"2001:559:433::/45", "33490"}, - {"2001:da8:e021::/41", "24367"}, - {"240a:a193::/32", "143053"}, - {"2a06:6540:1440::/48", "8220"}, - {"2001:1248:5bfa::/45", "11172"}, - {"2402:ef03:5::/44", "7633"}, - {"2403:ce00::/32", "9984"}, - {"2404:bf40:c182::/41", "139084"}, - {"2408:8256:3283::/44", "17623"}, - {"2602:ff58::/36", "40713"}, - {"2408:8020::/29", "4808"}, - {"240a:a2ad::/32", "143335"}, - {"2620:13d:c004::/48", "395360"}, - {"2804:458c::/32", "266934"}, - {"2a03:d840::/32", "198668"}, - {"2a0d:42c0::/29", "197706"}, - {"2403:9800:7f10::/48", "4648"}, - {"2404:1c0::/32", "138454"}, - {"2409:8904:6940::/42", "24547"}, - {"240e:878:c0::/39", "4134"}, - {"2610:18:8802::/33", "2828"}, - {"2001:550:2806::/39", "174"}, - {"2801:80:16e0::/48", "265362"}, - {"2804:ecc::/32", "52722"}, - {"2001:559:c0f2::/48", "7015"}, - {"2401:8000:221::/26", "9919"}, - {"2408:8957:e500::/40", "17816"}, - {"2a0f:9280::/29", "41407"}, - {"2a10:8800::/31", "31743"}, - {"2001:559:8447::/48", "33491"}, - {"2001:4408:4508::/45", "55824"}, - {"2408:840d:3400::/42", "17621"}, - {"240a:a77a::/32", "144564"}, - {"240a:a7cb::/32", "144645"}, - {"2602:fc10::/36", "400129"}, - {"2804:31c:6500::/40", "52962"}, - {"2806:230:403d::/48", "11888"}, - {"2a02:2e02:9180::/38", "12479"}, - {"2001:67c:1223::/48", "201263"}, - {"2001:19f0:9000::/37", "20473"}, - {"2001:44b8:2051::/48", "4739"}, - {"2408:8744::/28", "4837"}, - {"2600:1012:b180::/43", "22394"}, - {"2a00:4802:330::/41", "8717"}, - {"2a02:26f7:ea88::/48", "36183"}, - {"2a02:e183::/36", "33517"}, - {"2001:678:cdc::/48", "210660"}, - {"2402:800:3201::/44", "7552"}, - {"2409:8087:6a6f::/37", "9808"}, - {"2a00:eb8::/32", "200044"}, - {"2a02:26f0:8e01::/39", "20940"}, - {"2a02:26f7:ec49::/46", "20940"}, - {"2a0a:e202:800e::/43", "33438"}, - {"2409:8d5d::/26", "9808"}, - {"240e:44d:7100::/41", "140345"}, - {"2804:52c4::/32", "268540"}, - {"2a02:2278:fffd::/46", "59613"}, - {"240e:438:9e20::/43", "140647"}, - {"2600:1009:9010::/40", "22394"}, - {"2605:3380:46ff::/39", "12025"}, - {"2801:1a:9000::/48", "262247"}, - {"2804:250c::/32", "264255"}, - {"2806:2f0:4163::/40", "17072"}, - {"2a01:c50f:1a40::/39", "12479"}, - {"2a07:1840::/32", "48430"}, - {"2a0d:c400::/31", "48314"}, - {"2a0f:7880::/48", "47384"}, - {"2001:559:81c2::/48", "33651"}, - {"2606:7540:a::/47", "213073"}, - {"2607:fb08::/45", "32703"}, - {"2800:5f0:83a::/45", "22724"}, - {"2001:67c:2f7c::/48", "24605"}, - {"2407:500:1000::/48", "58940"}, - {"2600:100e:b050::/42", "6167"}, - {"2600:b405::/28", "18254"}, - {"2603:c0f2::/35", "6142"}, - {"2804:7938::/32", "271292"}, - {"2401:1d40:2001::/40", "59019"}, - {"240a:a1e2::/32", "143132"}, - {"2620:13:2000::/48", "29807"}, - {"2a0e:fd40:201::/32", "44103"}, - {"2409:8057:3813::/28", "56040"}, - {"2600:140b:1601::/39", "20940"}, - {"2604:5500:f000::/38", "19165"}, - {"2620:9a:8000::/48", "174"}, - {"2801:1c:e800::/48", "18747"}, - {"2803:f840::/32", "269980"}, - {"2804:391c::/45", "262287"}, - {"2a07:7780::/29", "49191"}, - {"2001:470:158::/48", "398922"}, - {"2409:8028:2a00::/40", "9808"}, - {"2604:6040:20::/48", "53698"}, - {"2804:7590::/32", "271055"}, - {"2a00:fac0::/32", "20677"}, - {"2a02:26f0:d2::/42", "20940"}, - {"2606:7e80::/36", "33695"}, - {"2607:fa20::/32", "26259"}, - {"2804:14d:fc40::/44", "28573"}, - {"2804:3d60::/32", "266527"}, - {"2a01:4a60::/32", "6768"}, - {"2a07:d940::/29", "42375"}, - {"240e:44d:1e80::/41", "4134"}, - {"2001:678:7b8::/48", "197600"}, - {"2400:adc0:4210::/47", "9541"}, - {"2804:40ac::/32", "265974"}, - {"2a01:270::/32", "41075"}, - {"2a01:6300::/32", "42303"}, - {"2a01:6600::/32", "39405"}, - {"2a10:4dc0::/32", "62240"}, - {"2400:8b00:800::/42", "45727"}, - {"2610:a1:1015::/46", "397228"}, - {"2a06:6540:4181::/48", "8220"}, - {"2001:b08:27::/32", "3267"}, - {"240a:a19c::/32", "143062"}, - {"2a00:1288:efc1::/48", "14778"}, - {"2a02:4620::/32", "3303"}, - {"2a03:4000::/31", "197540"}, - {"2a04:f580:9260::/48", "4809"}, - {"2a0d:3b40::/29", "8808"}, - {"2a0e:2400::/29", "212865"}, - {"2001:559:8195::/48", "7015"}, - {"240e:938:f900::/48", "139462"}, - {"2603:90fc:20::/41", "19115"}, - {"2804:4ed4::/32", "268285"}, - {"2a05:b00::/29", "196645"}, - {"2a0e:b107:178a::/48", "208529"}, - {"2401:d800:2282::/41", "7552"}, - {"2402:800:3a1d::/42", "7552"}, - {"2404:b1:5000::/32", "9891"}, - {"2801:14:d000::/44", "264843"}, - {"2a01:b740:a25::/48", "714"}, - {"2a0f:a0c0:ffff::/48", "209635"}, - {"2400:1ba0::/32", "148992"}, - {"2408:8957:3200::/40", "17622"}, - {"240a:a7cd::/32", "144647"}, - {"240e:965:cc00::/35", "4134"}, - {"2602:ff96:17::/48", "35913"}, - {"2a00:1d34:8180::/30", "9121"}, - {"2a02:26f7:f985::/46", "20940"}, - {"2a07:76c0:1::/48", "42352"}, - {"2400:bc80::/32", "38726"}, - {"2405:c00:64::/48", "17787"}, - {"240a:a758::/32", "144530"}, - {"240e:7b3:1000::/28", "4134"}, - {"2607:fdc8:400::/48", "30036"}, - {"2806:370:80b0::/44", "28403"}, - {"2a0a:880::/48", "41524"}, - {"2401:c740::/32", "23734"}, - {"2a03:8d20:1182::/44", "200849"}, - {"2001:559:3bb::/48", "22909"}, - {"2001:678:360::/48", "206506"}, - {"2620:10d:9000::/48", "25993"}, - {"2001:da8:da9::/38", "23910"}, - {"2405:9800:b002::/45", "133481"}, - {"2001:da8:c805::/46", "23910"}, - {"2403:6a40:1::/48", "135905"}, - {"240e:e1:8000::/36", "4811"}, - {"2804:495c::/32", "267180"}, - {"2804:4bc8:ab::/36", "267329"}, - {"2001:559:3c1::/48", "33287"}, - {"2409:8038:3900::/30", "9808"}, - {"2001:678:a90::/48", "20473"}, - {"240a:a086::/32", "142784"}, - {"2001:1900:2246::/44", "3356"}, - {"2406:3400:7d::/40", "10143"}, - {"2409:8009::/30", "9808"}, - {"2600:370f:71a3::/45", "32261"}, - {"2a09:6280:2::/48", "51628"}, - {"2a10:2f00:157::/48", "212425"}, - {"2001:948:80::/32", "2603"}, - {"2607:fe10::/34", "11796"}, - {"2a0b:3540:6::/47", "208176"}, - {"2001:678:370::/48", "202584"}, - {"2804:7b4:8300::/40", "262314"}, - {"240a:aedf::/32", "146457"}, - {"2605:9240::/32", "22792"}, - {"2803:3c20::/32", "266672"}, - {"2803:5b80::/32", "263699"}, - {"2804:288c::/32", "263968"}, - {"2a02:26f7:de8d::/46", "20940"}, - {"2a07:a107::/32", "202701"}, - {"2400:5280:3800::/38", "63199"}, - {"2400:df00::/32", "18260"}, - {"2402:c780::/32", "134232"}, - {"2402:e380:30b::/48", "138219"}, - {"2409:8c75::/28", "9808"}, - {"2804:7414::/32", "270957"}, - {"2001:468:914::/38", "11537"}, - {"2806:2f0:4643::/42", "17072"}, - {"2001:250:c1e::/42", "138374"}, - {"2800:23::/46", "11271"}, - {"2a0d:6c40::/29", "40970"}, - {"2804:74dc::/32", "271008"}, - {"2804:80d8::/32", "272416"}, - {"2806:2f0:45c1::/46", "17072"}, - {"2a01:ab40::/29", "62275"}, - {"2a02:26f7:2d::/48", "20940"}, - {"2a04:b700:185d::/48", "201403"}, - {"240a:af69::/32", "146595"}, - {"2604:f640::/32", "19584"}, - {"2605:a404:606::/40", "33363"}, - {"2001:559:c3fa::/48", "7016"}, - {"2409:8d14:1100::/38", "56044"}, - {"2607:f020::/40", "40289"}, - {"2a0b:2980::/48", "206520"}, - {"2001:559:3b1::/48", "33659"}, - {"2001:1248:5638::/45", "11172"}, - {"2408:8956:4600::/40", "17622"}, - {"2408:8962::/29", "4837"}, - {"2804:46f0::/42", "267021"}, - {"2804:5c38::/32", "268895"}, - {"2a0b:6b86:404::/48", "207080"}, - {"2c0f:eb78::/32", "328331"}, - {"2001:16d8:60::/45", "16150"}, - {"2001:4c08:201d::/48", "10753"}, - {"2600:1419:e01::/39", "20940"}, - {"2607:fdb8:33::/35", "30496"}, - {"2a00:4802:3e00::/40", "13124"}, - {"2a06:d440::/29", "57329"}, - {"2402:800:9763::/43", "7552"}, - {"2600:3402:1405::/29", "4181"}, - {"2607:da00:801::/48", "26793"}, - {"2607:f948::/32", "6597"}, - {"2804:5594:4000::/32", "267943"}, - {"2402:2940::/32", "24390"}, - {"2803:db00::/36", "262234"}, - {"2a02:df80::/29", "31655"}, - {"2c0f:fd48::/32", "37329"}, - {"2404:1f00:ffa8::/43", "55947"}, - {"2804:2468::/32", "264221"}, - {"2a0e:97c3:40d::/48", "20473"}, - {"2407:56c0::/32", "142116"}, - {"2804:6fb4::/32", "270678"}, - {"2a00:f50::/32", "21497"}, - {"2001:1248:8447::/44", "11172"}, - {"2402:e280:213f::/41", "134674"}, - {"240e:13:1000::/33", "4134"}, - {"2a01:8de0::/32", "47169"}, - {"2a02:26f0:b101::/38", "20940"}, - {"2001:418:1401:300::/53", "20940"}, - {"2001:fd8:34f0::/32", "4775"}, - {"2406:46c0::/32", "140933"}, - {"2602:803:c001::/45", "26667"}, - {"2607:b400:801::/39", "40220"}, - {"2804:4fc8::/32", "268349"}, - {"2a03:4780::/29", "47589"}, - {"2001:4de0:5010::/48", "33438"}, - {"240a:a213::/32", "143181"}, - {"2804:5498::/32", "268660"}, - {"2a02:bf0:8000::/33", "25106"}, - {"2a0e:8f02:2190::/47", "211153"}, - {"2001:559:7d3::/48", "33650"}, - {"2001:559:c43f::/48", "7922"}, - {"2600:140b:7401::/38", "20940"}, - {"2600:1417:39::/46", "20940"}, - {"2606:ba80::/32", "35975"}, - {"2607:fc48:430::/48", "40009"}, - {"2803:9800:9501::/45", "11664"}, - {"2804:4228::/32", "267481"}, - {"2a02:ee80:406b::/45", "3573"}, - {"2a06:c580::/29", "62297"}, - {"2001:aa8::/32", "61157"}, - {"2401:d800:d040::/42", "7552"}, - {"2404:5780:3::/48", "9558"}, - {"2405:f280:15::/42", "131464"}, - {"2602:800:1000::/45", "16970"}, - {"2401:7400:1001::/33", "4773"}, - {"2407:57c0::/48", "140799"}, - {"240e:44d:5f80::/41", "4134"}, - {"240e:980:4a00::/40", "4811"}, - {"2605:7900:8::/47", "19133"}, - {"2804:18:80::/44", "10429"}, - {"2804:3ab0::/32", "266103"}, - {"2804:5290::/32", "268526"}, - {"2a00:11c0::/44", "42473"}, - {"2a00:1e18::/31", "8896"}, - {"2a04:880::/32", "43623"}, - {"2a0e:5e84::/32", "44176"}, - {"2001:559:c14b::/48", "20214"}, - {"2402:800:33c5::/43", "7552"}, - {"2408:8456:8c00::/42", "17622"}, - {"2a0a:8d80::/48", "44094"}, - {"2001:559:c36f::/48", "7922"}, - {"2001:1248:9a5c::/46", "11172"}, - {"2400:cb00:102::/45", "13335"}, - {"2402:800:9ba9::/43", "7552"}, - {"2804:2144:104::/38", "52795"}, - {"2806:1010:cbff:100::/37", "8151"}, - {"2a01:8d1::/26", "3209"}, - {"2400:cb00:a980::/46", "13335"}, - {"2404:7600::/39", "23853"}, - {"2409:8000:800::/40", "56048"}, - {"2801:0:190::/48", "264630"}, - {"2409:8057:3035::/44", "56040"}, - {"2800:bf0:b423::/48", "52257"}, - {"2a02:26f7:f385::/46", "20940"}, - {"2a02:26f7:e88c::/48", "36183"}, - {"2602:feda:103::/45", "38008"}, - {"2804:51c8::/32", "268477"}, - {"2001:870::/29", "8447"}, - {"2001:dcd:4::/46", "397226"}, - {"2a00:df00::/29", "34790"}, - {"2a0e:3c0::/29", "553"}, - {"2001:559:86de::/42", "33659"}, - {"2a00:6020::/32", "60294"}, - {"2a04:f580:9012::/47", "4809"}, - {"2001:678:3f4::/48", "211509"}, - {"2001:938:403b::/41", "8437"}, - {"2404:6740:1000::/48", "138608"}, - {"240a:a3ae::/32", "143592"}, - {"2600:1406:3c01::/38", "20940"}, - {"2a02:26f7:e8c5::/46", "20940"}, - {"2a03:4c60::/32", "199909"}, - {"2a09:bf80::/40", "12213"}, - {"2804:2a4:c000::/34", "262828"}, - {"2804:4884::/32", "267126"}, - {"2a03:ae60::/45", "202847"}, - {"2001:559:28d::/48", "7725"}, - {"2001:559:85a0::/48", "33659"}, - {"2001:1248:8445::/46", "11172"}, - {"2804:7184::/32", "270794"}, - {"2a0e:b107:b88::/46", "212995"}, - {"2a0f:eb80:2::/44", "47267"}, - {"2001:559:803b::/48", "26419"}, - {"2001:67c:5cc::/48", "3320"}, - {"2001:df0:8fc0::/48", "7387"}, - {"2804:298:2013::/32", "53087"}, - {"2a02:587:6800::/32", "6799"}, - {"2a0d:c7c0::/32", "6233"}, - {"2001:550:5c07::/48", "15235"}, - {"2401:d800:2d00::/42", "7552"}, - {"2409:8050:3100::/37", "9808"}, - {"2804:4038::/32", "265945"}, - {"2a05:dfc7:5354::/32", "61138"}, - {"2408:8726::/32", "4837"}, - {"2602:fed2:730f::/48", "53356"}, - {"2a01:4580::/29", "8426"}, - {"2a05:6747::/48", "1759"}, - {"2a09:4740::/48", "44364"}, - {"2c0f:ee18::/32", "37110"}, - {"2402:e380:113::/45", "139073"}, - {"2600:1413:4001::/34", "20940"}, - {"2804:28a8::/32", "263973"}, - {"2a00:c780::/32", "15557"}, - {"2408:8459:dc50::/38", "17816"}, - {"2620:149:1030::/41", "714"}, - {"2804:2f84::/32", "264896"}, - {"2a00:1850:2ea::/48", "29357"}, - {"240a:ac3b::/32", "145781"}, - {"2801:80:2400::/48", "268302"}, - {"2804:170:5000::/32", "28131"}, - {"2a01:9f40::/29", "199101"}, - {"2a0f:ca87:c::/48", "210348"}, - {"2001:da8:8034::/36", "23910"}, - {"2405:8a00:20e4::/43", "55824"}, - {"2409:4025:1000::/25", "55836"}, - {"2409:8924:d00::/38", "56046"}, - {"240a:ae33::/32", "146285"}, - {"2a03:52a0:173::/32", "12557"}, - {"2804:8624::/32", "272624"}, - {"2a02:4e80::/32", "204645"}, - {"2001:df7:4100::/48", "137621"}, - {"240a:af6b::/32", "146597"}, - {"240e:90::/34", "140061"}, - {"2800:160:1ff2::/45", "14259"}, - {"2a04:4e40:5a00::/48", "54113"}, - {"2a09:4200::/29", "47602"}, - {"2a0e:2b80::/39", "28875"}, - {"2600:100a:b1c0::/43", "6167"}, - {"2804:84c4::/32", "272280"}, - {"2806:2f0:20a2::/48", "17072"}, - {"2402:800:9d01::/44", "7552"}, - {"2600:1003:9000::/44", "6167"}, - {"2804:21a0::/32", "264565"}, - {"2a00:a780:900::/32", "44229"}, - {"2a02:2010:2420::/45", "20978"}, - {"2001:1900:222f::/43", "3356"}, - {"2804:8::/45", "14840"}, - {"2a12:b500::/32", "210477"}, - {"2610:b0:c200::/34", "3573"}, - {"2804:1e2c:1000::/40", "264412"}, - {"2a01:3f1:5400::/32", "8674"}, - {"2a03:4bc0:2000::/48", "30893"}, - {"2001:500:2e::/47", "3557"}, - {"2001:559:c3ae::/48", "7922"}, - {"2406:840:e800::/48", "134488"}, - {"240a:aad2::/32", "145420"}, - {"2a00:d180::/32", "15457"}, - {"2a03:77e0:5301::/48", "48305"}, - {"2401:d800:b9a0::/41", "7552"}, - {"2408:8456:ce40::/40", "17816"}, - {"2409:801f:3010::/32", "24400"}, - {"2607:2a00:2::/48", "3584"}, - {"2800:440:8143::/48", "27738"}, - {"2001:4be8::/32", "31595"}, - {"2407:54c0::/32", "142065"}, - {"2001:559:c41a::/45", "7015"}, - {"2400:35a0::/32", "137645"}, - {"2400:dd01:301c::/30", "7497"}, - {"2409:8959:c854::/39", "56040"}, - {"2600:380:f1c0::/43", "20057"}, - {"2a01:5b40:d::/36", "12996"}, - {"2a02:26f7:f751::/42", "20940"}, - {"2a0b:6b86:d18::/40", "212232"}, - {"2001:559:832f::/43", "33659"}, - {"2804:238c::/35", "264169"}, - {"2804:6484::/32", "269432"}, - {"2604:d600:1d0c::/34", "32098"}, - {"2604:e5c0::/32", "31950"}, - {"2804:4c14:ca01::/39", "267348"}, - {"2804:5968::/36", "268188"}, - {"2a02:2e02:2ea0::/39", "12479"}, - {"2a0b:3c40:20::/48", "208258"}, - {"2001:559:83c1::/48", "7922"}, - {"2001:67c:1494::/48", "61431"}, - {"2001:1248:c233::/48", "11172"}, - {"2408:862a:9200::/34", "139007"}, - {"240a:a0f4::/32", "142894"}, - {"2a0b:8340::/29", "50304"}, - {"2001:12c4:5aff::/32", "28262"}, - {"2600:c04:1023::/48", "12180"}, - {"2800:160:2311::/42", "14259"}, - {"2a00:1728:18::/48", "34368"}, - {"2a09:e0c0::/29", "64421"}, - {"2a0e:fd45:40f5::/48", "43927"}, - {"2a12:4340::/29", "60135"}, - {"2001:559:386::/48", "20214"}, - {"2001:559:86d5::/48", "7725"}, - {"2001:579:1044::/40", "22773"}, - {"2001:c38:9126::/48", "38228"}, - {"2406:840:880::/48", "139317"}, - {"2620:171:f6::/48", "715"}, - {"2806:230:3016::/48", "265594"}, - {"2a01:7b00::/32", "41589"}, - {"2a03:3a40:2000::/48", "20712"}, - {"2a0f:6fc5:a4ae::/48", "43694"}, - {"2001:44b8:105e::/48", "7545"}, - {"2001:44c8:130::/47", "131445"}, - {"2620:149:a1e::/48", "6185"}, - {"2a02:26f7:dbcc::/48", "36183"}, - {"2a0c:b641:780::/44", "207301"}, - {"2402:2200:8000::/35", "4788"}, - {"2804:14d:8099::/41", "28573"}, - {"2a0a:5ac0::/32", "212696"}, - {"2001:559:2af::/43", "7016"}, - {"2a04:2800::/29", "206114"}, - {"2403:a880::/32", "17964"}, - {"2403:d200::/32", "45230"}, - {"2801:114:7::/48", "26506"}, - {"2804:6ac8::/39", "270358"}, - {"2a07:9340::/32", "56911"}, - {"2401:d800:960::/40", "7552"}, - {"2404:bf40:a4c1::/39", "139084"}, - {"2408:8a24:4000::/34", "4837"}, - {"2804:2f30:6d00::/32", "53096"}, - {"2804:0:1801::/37", "2716"}, - {"2a01:b460::/32", "6830"}, - {"2a0e:97c0:39b::/45", "211437"}, - {"2001:4888:803f::/48", "22394"}, - {"2402:8100:2460::/44", "45271"}, - {"240a:a6a1::/32", "144347"}, - {"240e:4:e000::/40", "132147"}, - {"2801:11:2000::/48", "61486"}, - {"2801:96:fff3::/45", "28586"}, - {"2a02:26f7:e518::/48", "36183"}, - {"2001:df5:4f80::/48", "141411"}, - {"240a:a01c::/32", "142678"}, - {"240a:a93a::/32", "145012"}, - {"2804:446c:c001::/34", "28369"}, - {"2001:df0:318::/47", "136601"}, - {"2404:7180:c011::/46", "23848"}, - {"2800:68:23::/45", "61468"}, - {"2a05:9f47::/32", "58305"}, - {"2403:18c0:1000::/47", "54574"}, - {"2404:138:134::/33", "38022"}, - {"2602:fdad::/40", "397438"}, - {"2604:d600:c6f::/43", "32098"}, - {"2800:160:1590::/44", "14259"}, - {"2a04:8ec0::/48", "1712"}, - {"240c:c727::/24", "23910"}, - {"2620:171:da::/48", "42"}, - {"2804:31c8::/32", "265037"}, - {"2a01:9b60::/32", "30742"}, - {"2a02:4180::/32", "42334"}, - {"2402:800:b5c0::/42", "7552"}, - {"2605:a404:ba3::/41", "33363"}, - {"2804:5f6c::/35", "262287"}, - {"2a0d:f103::/32", "208449"}, - {"2408:8456:9840::/38", "17816"}, - {"2605:9cc0:40c::/48", "8987"}, - {"2804:40c8::/32", "265981"}, - {"2a06:c700:3000::/31", "6810"}, - {"2001:67c:2818::/48", "20647"}, - {"240e:981:200::/40", "23724"}, - {"2600:1014:9000::/44", "6167"}, - {"2804:b94::/32", "52796"}, - {"2a03:f80:972::/48", "61102"}, - {"2a04:57c0::/29", "62183"}, - {"2a04:9700::/29", "62227"}, - {"2a0e:8f02:f00e::/48", "212359"}, - {"2404:af80:3::/48", "38026"}, - {"2600:6c10:19::/45", "20115"}, - {"2804:2250::/33", "262756"}, - {"2a00:4520::/44", "42961"}, - {"2a05:91c3:1::/48", "39511"}, - {"2001:250:5011::/48", "23910"}, - {"2001:559:719::/48", "395680"}, - {"2604:ca00:454::/42", "36492"}, - {"2803:19a0::/32", "267714"}, - {"2803:c800:40e0::/32", "23243"}, - {"2a00:11c0:1010::/48", "42388"}, - {"2a06:e80:3000::/36", "211720"}, - {"240e:983:1801::/48", "133774"}, - {"2a02:26f7:8a::/48", "36183"}, - {"2a04:9a04::/32", "29311"}, - {"2001:19f0:1000::/37", "20473"}, - {"2606:2800:410e::/48", "14153"}, - {"2620:9:a005::/48", "395515"}, - {"2800:440:9600::/42", "27738"}, - {"2804:8564:1160::/43", "262313"}, - {"2a00:c58::/32", "41887"}, - {"2405:1c0:6281::/46", "55303"}, - {"240a:a543::/32", "143997"}, - {"240a:acf4::/32", "145966"}, - {"240e:965:c600::/36", "4134"}, - {"2804:7250::/32", "270846"}, - {"2a02:26f7:e6::/48", "36183"}, - {"2a02:26f7:bc00::/48", "36183"}, - {"2607:ff38:4::/32", "22937"}, - {"2800:bf0:8090::/45", "52257"}, - {"2a02:26f7:e109::/46", "20940"}, - {"2600:370f:33ca::/45", "32261"}, - {"2620:24:8080::/48", "23389"}, - {"2a0e:92c0::/29", "58061"}, - {"2001:559:83b1::/48", "33287"}, - {"2402:800:3c1d::/41", "7552"}, - {"2a02:50e0::/32", "198203"}, - {"2a0f:5944::/32", "9009"}, - {"2402:dc40::/48", "134331"}, - {"2404:7180:b010::/48", "23848"}, - {"2001:579:f130::/45", "22773"}, - {"2001:1248:5a2f::/43", "11172"}, - {"2408:8956:2400::/40", "17622"}, - {"2a02:7b02::/36", "48328"}, - {"2a04:7e80::/29", "50794"}, - {"2001:500:b::/45", "12041"}, - {"2600:1415:e801::/35", "20940"}, - {"2804:3f30::/32", "266645"}, - {"2a02:23a8::/32", "16164"}, - {"2a02:26f7:bd40::/48", "36183"}, - {"2001:579:f084::/42", "22773"}, - {"2001:67c:5ec::/48", "34172"}, - {"2001:1248:5767::/44", "11172"}, - {"240a:a83d::/32", "144759"}, - {"240e:108:8a::/48", "134238"}, - {"2804:7ce0::/32", "271524"}, - {"2a03:920::/32", "203536"}, - {"2409:8c30:1010::/39", "9808"}, - {"240a:af45::/32", "146559"}, - {"2620:0:28a4::/48", "33522"}, - {"2800:160:189b::/42", "14259"}, - {"2804:37a8:121f::/32", "266428"}, - {"2a02:26f7:b649::/42", "20940"}, - {"2001:559:80a0::/48", "7016"}, - {"2001:559:c055::/46", "7015"}, - {"2402:800:f2c0::/42", "7552"}, - {"2409:8915:5600::/39", "56044"}, - {"2620:da::/48", "23177"}, - {"2801:104:8::/47", "27828"}, - {"2804:2178:5001::/32", "264556"}, - {"2a02:2430:8::/42", "39869"}, - {"2a0f:607:1008::/48", "7480"}, - {"2409:8a4c::/32", "9808"}, - {"2607:f4e8:15::/46", "22822"}, - {"2804:1390::/32", "263538"}, - {"2804:7440::/32", "270969"}, - {"2a01:190:15ea::/47", "1764"}, - {"2001:4b20:20::/63", "65505"}, - {"2401:4300:a::/48", "45184"}, - {"2409:8038:1100::/36", "9808"}, - {"2620:185:50::/36", "11396"}, - {"2804:16d8::/38", "262729"}, - {"2804:3c48::/32", "266201"}, - {"2a09:55c0::/32", "209451"}, - {"2a0f:e3c7::/40", "210542"}, - {"2001:559:8731::/46", "7015"}, - {"2604:d600:159a::/42", "32098"}, - {"2a02:26f7:d58d::/42", "20940"}, - {"2001:559:8618::/48", "33651"}, - {"2001:678:4b8::/48", "41985"}, - {"2001:678:584::/48", "5409"}, - {"2402:8100:30e0::/44", "55644"}, - {"240e:3b6:4c00::/35", "136200"}, - {"240e:67b:e600::/29", "4134"}, - {"2804:2d90::/34", "52682"}, - {"2409:8904:d590::/34", "24547"}, - {"2a00:d320::/29", "15600"}, - {"2404:d0::/44", "6648"}, - {"2606:f280:8000::/33", "46261"}, - {"2804:5f80::/32", "269104"}, - {"2804:8388::/32", "268843"}, - {"2a04:6640::/29", "3257"}, - {"2402:e000:5380::/41", "24499"}, - {"240a:aa28::/32", "145250"}, - {"2803:c0::/32", "264756"}, - {"2a12:df00::/35", "210462"}, - {"2c0f:f5c0:231::/39", "29465"}, - {"2001:678:118::/48", "57436"}, - {"2404:ed::/30", "703"}, - {"240a:a399::/32", "143571"}, - {"2a01:73c0::/39", "21450"}, - {"2a0d:c440::/29", "39305"}, - {"2001:559:71b::/48", "33491"}, - {"2804:290c::/32", "263994"}, - {"2a06:d00::/29", "200689"}, - {"2402:c840::/32", "37892"}, - {"2803:ecc0:600::/36", "264814"}, - {"2a06:e881:6900::/48", "208434"}, - {"240e:438:a240::/37", "4134"}, - {"2800:484:da00::/40", "14080"}, - {"2a02:26f7:eec1::/46", "20940"}, - {"2a02:26f7:f7cc::/48", "36183"}, - {"2c0f:f348::/44", "24757"}, - {"2402:4480:301::/46", "174"}, - {"2402:d000:106d::/43", "9329"}, - {"2600:1010:b140::/42", "6167"}, - {"2607:fb90:2100::/35", "21928"}, - {"2a02:26f7:c444::/48", "36183"}, - {"2404:8d06:4100::/35", "10089"}, - {"2409:8d14:400::/38", "56044"}, - {"240e:ff:c005::/48", "136200"}, - {"2800:6f0:9800::/40", "20207"}, - {"2804:4d48::/33", "53115"}, - {"2a02:26f7:110::/48", "36183"}, - {"2804:14d:72a3::/45", "28573"}, - {"2a01:9800::/35", "52070"}, - {"2a0a:2840:20::/43", "42962"}, - {"2a10:cc42:1400::/40", "20473"}, - {"2409:896a:3800::/39", "9808"}, - {"2602:feda:ae2::/47", "138181"}, - {"2620:12c:9006::/47", "395359"}, - {"2804:828::/40", "262354"}, - {"2804:308c::/32", "264960"}, - {"2a04:92c1:7::/30", "62240"}, - {"2001:559:548::/48", "33657"}, - {"240e:980:2000::/40", "4134"}, - {"2607:a400:8::/32", "21859"}, - {"2a02:ad8:5900::/32", "12389"}, - {"2001:559:c169::/48", "7725"}, - {"2600:1417:52::/48", "24319"}, - {"2800:160:1496::/42", "14259"}, - {"2804:7ff0::/32", "271719"}, - {"2a0e:b107:110::/47", "209294"}, - {"2c0f:ecf8::/32", "328441"}, - {"2607:de00:300::/32", "23498"}, - {"2406:4440:20::/41", "38008"}, - {"240a:aeee::/32", "146472"}, - {"2001:1248:9abf::/41", "11172"}, - {"2804:4cdc::/32", "267397"}, - {"2a0a:4540:220::/48", "16509"}, - {"240a:ad3c::/32", "146038"}, - {"2604:d600:c85::/43", "32098"}, - {"2800:160:1b53::/44", "14259"}, - {"2800:300:90a0::/41", "27651"}, - {"2804:71c4::/32", "270810"}, - {"2407:7700::/32", "132354"}, - {"240e:3bf:f100::/37", "134775"}, - {"2600:100f:a000::/44", "6167"}, - {"2600:1409:8::/46", "20940"}, - {"2600:6c20:e1f::/42", "20115"}, - {"2806:2a0:16::/44", "28548"}, - {"2a02:2e02:2cf0::/38", "12479"}, - {"2001:8b0:5000::/32", "20712"}, - {"2607:1280:1260::/44", "394972"}, - {"2610:8::/32", "3999"}, - {"2804:f60::/32", "263582"}, - {"2804:69e0::/32", "270297"}, - {"2001:559:3a2::/48", "7016"}, - {"2a02:26f7:d5c1::/46", "20940"}, - {"2a02:26f7:f801::/46", "20940"}, - {"2a09:e440::/46", "209185"}, - {"2806:2f0:3183::/42", "17072"}, - {"2400:fc00:8d50::/35", "45773"}, - {"2408:8456:1b40::/40", "17816"}, - {"240e:109:8027::/48", "133774"}, - {"240e:982:1000::/39", "137695"}, - {"2a02:728::/32", "25542"}, - {"2a04:4345:10::/44", "38965"}, - {"2001:67c:754::/48", "204254"}, - {"2001:67c:1314::/48", "15935"}, - {"240a:accb::/32", "145925"}, - {"240a:af8f::/32", "146633"}, - {"2804:1830::/32", "61922"}, - {"2a03:5640:f502::/45", "16509"}, - {"2001:250:83c::/48", "23910"}, - {"2001:559:8166::/48", "33657"}, - {"2607:8200:8000::/36", "46691"}, - {"2407:a600:2000::/36", "18004"}, - {"240e:108:1112::/42", "4134"}, - {"2620:cd:c000::/48", "32932"}, - {"2800:160:131d::/42", "14259"}, - {"2804:190::/38", "53165"}, - {"2804:55b4::/32", "267951"}, - {"2a03:b8c0:29::/46", "396253"}, - {"2a0e:b107:50::/44", "212267"}, - {"240a:ae70::/32", "146346"}, - {"240a:aeb6::/32", "146416"}, - {"2602:fe6a:100::/40", "397131"}, - {"2806:288:4010::/48", "28469"}, - {"2a06:c00::/30", "59414"}, - {"2001:559:c4b9::/48", "33661"}, - {"2001:67c:28a4::/48", "198794"}, - {"2402:8100:210e::/47", "55644"}, - {"2402:8100:2693::/44", "55644"}, - {"2607:ffd0:700::/46", "26994"}, - {"2a09:1500:13::/48", "208175"}, - {"2a10:6280::/29", "400177"}, - {"2401:d800:e40::/42", "7552"}, - {"240a:a675::/32", "144303"}, - {"2602:ffe2:10::/48", "53334"}, - {"2001:ee0:c840::/39", "45899"}, - {"2401:d800:2f40::/42", "7552"}, - {"2405:8740::/32", "46019"}, - {"2409:805e:1900::/34", "9808"}, - {"2804:28dc::/32", "263985"}, - {"2804:439c::/32", "267579"}, - {"2806:2f0:3143::/42", "17072"}, - {"2a00:9d20:101::/48", "30633"}, - {"2001:d70::/30", "7671"}, - {"2408:80f5:4000::/34", "4837"}, - {"240a:abf7::/32", "145713"}, - {"240e:100:30::/41", "137689"}, - {"2801:80:d0::/48", "28301"}, - {"2408:8456:5a40::/39", "17816"}, - {"2a02:26f7:d258::/48", "36183"}, - {"2804:2bb0::/32", "265169"}, - {"2408:8742::/32", "4837"}, - {"2600:2000:2200::/41", "31898"}, - {"2604:180:f1::/45", "3842"}, - {"2605:b100:300::/41", "577"}, - {"2607:c280::/32", "397168"}, - {"2804:20fc:603::/40", "264525"}, - {"2804:7718::/32", "271154"}, - {"2408:8459:ed10::/42", "17623"}, - {"2603:f500::/29", "396356"}, - {"2806:230:1501::/40", "265594"}, - {"2a01:8740:6::/32", "57344"}, - {"2a02:7c0::/32", "34816"}, - {"2a02:26f7:dc49::/46", "20940"}, - {"2a02:5be0::/47", "42427"}, - {"2402:5680::/36", "133798"}, - {"2801:80:6c0::/48", "262963"}, - {"2001:1838:9100::/34", "23352"}, - {"2402:8100:26d2::/45", "55644"}, - {"2408:8957:6100::/40", "17816"}, - {"2600:370f:3620::/47", "32261"}, - {"2801:18:6000::/48", "61496"}, - {"2804:694::/34", "262596"}, - {"2804:1210::/32", "263454"}, - {"2806:2f0:1160::/40", "17072"}, - {"2a09:d940::/29", "209202"}, - {"2001:218:2003::/39", "2914"}, - {"2001:559:8167::/48", "33667"}, - {"240e:61:4000::/35", "136198"}, - {"2a0b:dac0::/29", "205424"}, - {"2404:0:4000::/36", "9311"}, - {"2409:8c1e:c340::/31", "9808"}, - {"2606:5200::/32", "32477"}, - {"2804:28e4:50::/37", "28260"}, - {"2405:fc00::/32", "37989"}, - {"240e:964:8c00::/35", "4134"}, - {"2600:1009:b070::/40", "22394"}, - {"2607:f3a0:a008::/48", "399812"}, - {"2804:5f08::/32", "269072"}, - {"2a07:6cc0:50::/48", "61098"}, - {"240a:3:bfe::/48", "9605"}, - {"2a01:8840:f4::/48", "12041"}, - {"240e:108:2e::/48", "4134"}, - {"2804:77c0::/32", "271197"}, - {"2408:840d:ad00::/42", "17621"}, - {"240a:a830::/32", "144746"}, - {"2605:a40e::/47", "33363"}, - {"2606:4700:53::/45", "13335"}, - {"2607:f790:fff6::/48", "398351"}, - {"2800:68:41::/43", "61468"}, - {"2804:d0::/32", "28145"}, - {"2a0e:b107:1577::/48", "141011"}, - {"2001:503:ba3e::/48", "396574"}, - {"2001:559:c157::/48", "33662"}, - {"2402:d000:143::/35", "9329"}, - {"2a0b:1c0::/29", "51088"}, - {"2c0f:ee08::/48", "328249"}, - {"2001:67c:2ca0::/46", "50838"}, - {"2803:c600:10::/44", "27901"}, - {"2405:ec01::/35", "137412"}, - {"240a:a6d8::/32", "144402"}, - {"2600:140f:dc01::/34", "20940"}, - {"2620:cc::/48", "40816"}, - {"2804:1e90:1300::/32", "264436"}, - {"2a04:bc40:1dc1::/48", "35277"}, - {"2402:e280:215c::/46", "134674"}, - {"2600:1007:b1d0::/44", "6167"}, - {"2602:801:c000::/47", "2639"}, - {"2607:4000::/38", "73"}, - {"2804:14d:badf::/42", "28573"}, - {"2a0f:15c0::/29", "60262"}, - {"240a:acdf::/32", "145945"}, - {"240e:c2:1800::/37", "63835"}, - {"240e:37c:ac00::/33", "4134"}, - {"2001:218:8400::/33", "2914"}, - {"2001:500:104::/44", "21775"}, - {"2804:560::/32", "53009"}, - {"2a02:26f7:c359::/46", "20940"}, - {"2001:559:80a5::/48", "7922"}, - {"2001:df0:2c8::/48", "56178"}, - {"2604:cc80::/32", "62488"}, - {"2a00:1cd0:1::/46", "43408"}, - {"2a0c:8fc3:6400::/40", "23470"}, - {"2c0f:e8e0:40a0::/41", "327926"}, - {"2604:0:c2::/32", "7397"}, - {"2a00:79e1:f1a::/47", "395973"}, - {"2a04:1a80::/29", "207606"}, - {"2a0f:ac00::/29", "60781"}, - {"2600:1f01:4830::/47", "16509"}, - {"2605:7280::/45", "54600"}, - {"2605:b100:b80::/37", "577"}, - {"2804:1040:facf::/42", "263626"}, - {"2a02:130::/32", "42841"}, - {"2804:4ec::/47", "28668"}, - {"2a02:2e02:2530::/41", "12479"}, - {"240a:a01f::/32", "142681"}, - {"240e:974:1200::/48", "38283"}, - {"2600:d00::/31", "20161"}, - {"2804:3244:1c::/42", "265066"}, - {"2a03:2320::/32", "201648"}, - {"2605:4a80::/32", "11232"}, - {"2607:fd68::/32", "7029"}, - {"2a02:21a0::/29", "49743"}, - {"2001:253:117::/48", "142083"}, - {"2001:df0:e680::/48", "136369"}, - {"2001:4020::/32", "13110"}, - {"2402:800:6277::/44", "7552"}, - {"2403:8c00::/32", "24371"}, - {"2a02:26f7:c4c9::/42", "20940"}, - {"2a11:ed40::/29", "1239"}, - {"2001:559:8567::/48", "33668"}, - {"2620:e9:4000::/48", "394662"}, - {"2a07:59c6:eed4::/46", "56382"}, - {"2001:559:8072::/47", "22909"}, - {"240a:ad85::/32", "146111"}, - {"2a0f:3cc6::/32", "60735"}, - {"2409:896a:a400::/39", "9808"}, - {"2600:1417:5000::/48", "23693"}, - {"2a0c:1c80::/29", "203119"}, - {"2403:cb00:a000::/36", "58621"}, - {"2a02:26f7:e488::/48", "36183"}, - {"2a03:e480::/32", "15640"}, - {"240a:a836::/32", "144752"}, - {"2804:7700::/32", "271148"}, - {"2a02:26f7:ccc9::/46", "20940"}, - {"2a02:5400:808::/48", "33353"}, - {"2a0b:f8c0::/29", "44297"}, - {"2001:559:8239::/48", "7725"}, - {"2001:df5:fb80::/48", "141727"}, - {"2001:559:7bd::/48", "7922"}, - {"2001:c20:4865::/48", "9255"}, - {"2001:df0:4e80::/48", "139035"}, - {"2001:4130:18::/48", "24725"}, - {"2604:6d00:2100::/48", "36223"}, - {"2620:128:e008::/48", "22317"}, - {"2806:20d:1121::/38", "32098"}, - {"2a00:4800:a0::/44", "13124"}, - {"2a01:8be0::/29", "61956"}, - {"2a02:ac8::/32", "34594"}, - {"2a02:67e0:4000::/32", "203148"}, - {"2001:559:c24c::/48", "33652"}, - {"2001:7fb:ff12::/44", "12654"}, - {"2001:df0:95::/48", "7667"}, - {"2402:800:390f::/43", "7552"}, - {"2406:f680:7101::/32", "132298"}, - {"2804:1af8::/32", "61701"}, - {"2804:1cc4:4003::/36", "61674"}, - {"2804:7f3c::/32", "271675"}, - {"2a0d:a6c0::/29", "39724"}, - {"2a0e:66c0::/29", "44486"}, - {"2607:8200:4000::/36", "33561"}, - {"2a03:e140:1::/48", "12722"}, - {"2a10:6380::/29", "204790"}, - {"2804:845c::/32", "272256"}, - {"2804:85fc::/32", "272612"}, - {"2a0f:5707:aa40::/44", "48126"}, - {"2001:67c:11a8::/48", "50695"}, - {"2001:67c:2600::/48", "15655"}, - {"2409:8958:ce44::/43", "9808"}, - {"2620:1d6:ff0::/46", "2571"}, - {"2a02:26f7:d948::/48", "36183"}, - {"2a0b:ddc0::/29", "59970"}, - {"2c0f:f0c0::/31", "37035"}, - {"2001:559:816a::/47", "33657"}, - {"2402:800:551d::/42", "7552"}, - {"2409:8050:1802::/40", "56047"}, - {"2800:370:36::/48", "28006"}, - {"2804:14c:bbae::/47", "28573"}, - {"2a02:358::/32", "12822"}, - {"2408:8956:1400::/40", "17622"}, - {"240a:ab3b::/32", "145525"}, - {"2600:380:f1d1::/48", "20057"}, - {"2801:80:4b0::/48", "52798"}, - {"2a02:26f7:c681::/46", "20940"}, - {"2402:1440:31::/39", "63689"}, - {"2405:f080::/38", "136907"}, - {"2a00:1288:112::/47", "34010"}, - {"2a0b:f00::/29", "49191"}, - {"2001:559:c057::/48", "7922"}, - {"2001:b28:5::/33", "42065"}, - {"2804:f00::/32", "263562"}, - {"2804:7f38::/32", "271674"}, - {"2806:250:400::/40", "28545"}, - {"2a09:ff40::/32", "209146"}, - {"2001:559:c3e7::/44", "7922"}, - {"2402:e380:31e::/48", "142030"}, - {"2a0e:97c0:141::/45", "211946"}, - {"2401:d800:f320::/41", "7552"}, - {"2a00:b260::/32", "51417"}, - {"2a02:26f7:cd50::/48", "36183"}, - {"2405:3f00::/31", "38719"}, - {"2604:a840:8::/48", "6233"}, - {"2806:20d:520b::/45", "32098"}, - {"2806:230:6007::/48", "11888"}, - {"2806:370:7340::/40", "28403"}, - {"2a0f:340::/29", "16509"}, - {"2001:468:26e2::/36", "11537"}, - {"240a:aeca::/32", "146436"}, - {"240e:1:800::/37", "137691"}, - {"2620:11c::/46", "27647"}, - {"2a00:9b40::/48", "44684"}, - {"2a02:2e02:3000::/40", "12479"}, - {"2001:559:869e::/48", "7922"}, - {"2402:a040::/32", "137522"}, - {"2600:6c3b:31::/37", "20115"}, - {"2606:ae00:6000::/41", "7287"}, - {"2620:13e:500f::/48", "206885"}, - {"2a02:2010:2320::/45", "20978"}, - {"2a05:f340::/29", "41827"}, - {"2001:678:e30::/48", "48108"}, - {"2402:800:6901::/35", "7552"}, - {"2600:1014:a100::/44", "6167"}, - {"2001:4410:1100::/34", "132040"}, - {"2603:f660::/24", "397165"}, - {"2604:200:14::/32", "33132"}, - {"2a02:2348::/32", "3301"}, - {"2a02:cbf0::/29", "61157"}, - {"2a0c:a980::/29", "210198"}, - {"240a:a990::/32", "145098"}, - {"2606:1980:4::/48", "54994"}, - {"2804:2390::/32", "264170"}, - {"2409:8a56:2800::/32", "56040"}, - {"240a:a457::/32", "143761"}, - {"2600:6c38:130::/41", "20115"}, - {"2a03:db80:4c84::/48", "5501"}, - {"2c0f:ed40::/32", "328461"}, - {"2406:7400:b7::/44", "24309"}, - {"240e:a7:7fc6::/44", "140510"}, - {"2804:7258::/32", "270848"}, - {"2001:df4:5a80::/48", "59185"}, - {"2400:c540::/46", "59238"}, - {"2604:72c0::/32", "26095"}, - {"2409:8704:c500::/34", "24547"}, - {"2610:b0:2030::/41", "3573"}, - {"2a05:35c0:3::/29", "60781"}, - {"240a:a26d::/32", "143271"}, - {"2804:7f74:8001::/33", "271689"}, - {"2a00:f826:4::/46", "34549"}, - {"2a02:26f7:c989::/42", "20940"}, - {"2400:5280:fc00::/38", "63199"}, - {"2401:d800:73c2::/42", "7552"}, - {"2408:840c:2900::/40", "17621"}, - {"240a:a548::/32", "144002"}, - {"2001:559:362::/48", "7725"}, - {"2402:800:5e60::/43", "7552"}, - {"2407:500:4111::/34", "58940"}, - {"2409:8904:2940::/38", "24547"}, - {"2605:9d80:a021::/48", "36678"}, - {"2a01:111:5000::/32", "8075"}, - {"2a02:888:8150::/48", "48695"}, - {"2a03:db80:4811::/46", "680"}, - {"2607:f8e8::/32", "46208"}, - {"2804:5ea8::/32", "269048"}, - {"2a0c:a6c0:1::/48", "21473"}, - {"2402:800:5bd3::/44", "7552"}, - {"2408:840d:b600::/42", "17621"}, - {"240a:a4fc::/32", "143926"}, - {"2600:1000:d040::/34", "22394"}, - {"2804:e8c:a000::/33", "52561"}, - {"2804:4338::/32", "267556"}, - {"2001:df6:180:200::/48", "141731"}, - {"2401:d800:b0f0::/39", "7552"}, - {"2403:300:a09::/48", "714"}, - {"240e:3b5:2200::/37", "136198"}, - {"2600:1417:7801::/32", "20940"}, - {"2804:67bc::/32", "269647"}, - {"2a02:26f7:dbc4::/48", "36183"}, - {"2a02:2e02:2420::/41", "12479"}, - {"2a05:a282::/32", "31586"}, - {"2a09:9e40::/48", "44364"}, - {"2001:559:837a::/48", "33651"}, - {"2001:df2:c680::/48", "139980"}, - {"2408:8459:2130::/41", "17622"}, - {"240e:1e:1000::/36", "134772"}, - {"2602:fd47::/36", "398461"}, - {"2804:37f0:c100::/35", "266445"}, - {"2a07:ad00::/30", "200544"}, - {"2a0e:59c0::/29", "207187"}, - {"2001:559:442::/48", "22258"}, - {"2001:559:c302::/47", "7015"}, - {"2001:12f0:b0a::/43", "1916"}, - {"2001:1a10:200::/36", "8781"}, - {"2602:feda:3::/45", "46997"}, - {"2804:4f8:6001::/39", "28263"}, - {"2804:6b08::/32", "270373"}, - {"2001:df7:2f00::/48", "138114"}, - {"2600:6c38:e3b::/39", "20115"}, - {"2605:540::/32", "62640"}, - {"2804:4544:b000::/40", "266915"}, - {"2a00:ec8:407::/32", "38930"}, - {"2a06:d680::/29", "203593"}, - {"2401:1c00:6100::/32", "38809"}, - {"2401:d800:b4f0::/39", "7552"}, - {"2606:2b00::/32", "5723"}, - {"2a0e:97c0:500::/46", "210969"}, - {"240a:a8d3::/32", "144909"}, - {"2607:fcf8:bbbc::/33", "26788"}, - {"2a02:2e02:5f0::/38", "12479"}, - {"2409:8014:1010::/34", "56044"}, - {"2605:a401:89fa::/38", "33363"}, - {"2a02:26f0:3101::/38", "20940"}, - {"2a0f:36c0::/29", "60262"}, - {"2001:559:c2a2::/48", "33651"}, - {"2001:67c:7d8::/48", "31676"}, - {"2406:3000:43::/44", "4657"}, - {"2600:1419:6::/44", "20940"}, - {"2a01:8840:ba::/45", "12041"}, - {"2a04:340::/29", "200828"}, - {"2a04:4d40::/29", "16019"}, - {"2a04:8f80:2000::/36", "15466"}, - {"2a11:7e40::/32", "208626"}, - {"2001:df3:fa80::/48", "9498"}, - {"2405:7f00:b1a0::/33", "133414"}, - {"2620:13f:7007::/48", "55706"}, - {"2804:8490::/32", "272268"}, - {"2001:df1:780::/48", "136644"}, - {"2804:2214:800c::/33", "28177"}, - {"2001:559:822d::/48", "33652"}, - {"2001:579:b004::/41", "22773"}, - {"2405:1e00::/44", "17771"}, - {"2804:3130::/32", "264999"}, - {"2804:57bc::/33", "268083"}, - {"2a06:9f80::/29", "61138"}, - {"2001:df0:62::/48", "38040"}, - {"2001:df5:c300::/48", "133876"}, - {"240e:108:1167::/48", "58563"}, - {"2605:6c00:9::/48", "10255"}, - {"2804:63f0::/32", "269393"}, - {"2a02:2ba8::/32", "14717"}, - {"2001:df0:fe::/48", "56098"}, - {"2408:8957:6600::/40", "17622"}, - {"240a:a594::/32", "144078"}, - {"240a:ad4c::/32", "146054"}, - {"240e:3b1:4c00::/35", "136200"}, - {"240a:a89f::/32", "144857"}, - {"2804:2630::/32", "264331"}, - {"2a00:d340:ffe0::/48", "41321"}, - {"2a0d:2407::/32", "62068"}, - {"2001:559:7bb::/48", "33287"}, - {"2409:8051:3802::/40", "56047"}, - {"2600:6c34:298::/48", "33588"}, - {"2804:4558::/32", "266920"}, - {"2a02:26f7:f4c0::/48", "36183"}, - {"2a03:2880:f04d::/43", "32934"}, - {"2a0c:f100::/29", "212880"}, - {"2a12:a240::/29", "400522"}, - {"2c0f:ee00::/47", "37721"}, - {"2a02:26f7:e0::/48", "36183"}, - {"2a0a:9fc0::/29", "31673"}, - {"2001:a08::/32", "39326"}, - {"2402:800:4400::/35", "7552"}, - {"2600:40ff:fc10::/45", "1321"}, - {"2001:250:6809::/46", "24368"}, - {"2405:f280:35::/32", "131464"}, - {"2600:140b:8801::/38", "20940"}, - {"2605:4a00:121::/44", "14361"}, - {"2607:da80::/32", "13760"}, - {"2804:fe0:24b0::/32", "263049"}, - {"2a01:158::/32", "3249"}, - {"2a02:d08::/32", "34762"}, - {"240a:a56d::/32", "144039"}, - {"240e:1a:2000::/29", "4134"}, - {"2408:8459:1d30::/41", "17622"}, - {"240a:abbd::/32", "145655"}, - {"2607:fc38::/32", "17378"}, - {"2a10:6900::/29", "399975"}, - {"2404:c400:a000::/33", "9328"}, - {"2409:8a51:500::/38", "56047"}, - {"240a:ab6e::/32", "145576"}, - {"2600:1419:3601::/36", "20940"}, - {"2801:80:a00::/48", "263279"}, - {"2a04:2e80:5::/48", "208407"}, - {"2a04:f580:9040::/48", "4809"}, - {"2a06:6540:1201::/48", "8220"}, - {"2c0f:ed28::/32", "328453"}, - {"2001:559:82f2::/48", "33659"}, - {"240a:ad17::/32", "146001"}, - {"2a02:26f7:b685::/46", "20940"}, - {"2a06:d340::/29", "25109"}, - {"2001:559:38e::/48", "33652"}, - {"2001:559:871d::/48", "33657"}, - {"2400:cb00:130::/48", "13335"}, - {"2603:c0fe::/35", "54253"}, - {"2804:2c08::/32", "265189"}, - {"2a0b:4340:80::/48", "134176"}, - {"2001:559:1f3::/48", "33652"}, - {"2402:e280:3db4::/33", "134674"}, - {"240a:a344::/32", "143486"}, - {"2804:5a90::/32", "268781"}, - {"2403:b900::/32", "4382"}, - {"2406:840:fd00::/45", "134993"}, - {"2602:fe78::/36", "33360"}, - {"2804:796c::/32", "271304"}, - {"2a02:26f7:bcc8::/48", "36183"}, - {"2a02:26f7:ca45::/46", "20940"}, - {"2a05:bd40:cd13::/48", "29264"}, - {"2404:7c00:30::/41", "45650"}, - {"240e:44d:2a80::/41", "4134"}, - {"2607:9e00:3002::/33", "30536"}, - {"2a0e:6540:53a::/48", "208364"}, - {"2001:559:c041::/48", "7922"}, - {"2409:8750::/38", "56047"}, - {"2409:896a:ae00::/39", "9808"}, - {"240a:a6f5::/32", "144431"}, - {"240a:abc6::/32", "145664"}, - {"2604:65c0:101::/32", "14585"}, - {"2804:761c::/32", "271090"}, - {"2804:7b5c:a::/32", "271427"}, - {"2a00:8a04:8000::/44", "34414"}, - {"2a11:5700:b00b::/48", "212149"}, - {"2001:3c8:d10a::/34", "4621"}, - {"2001:4d0:6119::/38", "297"}, - {"2001:978:1e02::/47", "174"}, - {"2804:4c08::/32", "267344"}, - {"2a06:ba80::/29", "50042"}, - {"2404:efc0:1300::/47", "10122"}, - {"2408:8459:1d50::/38", "17816"}, - {"240e:45c:a600::/40", "131285"}, - {"2620:103:e019::/48", "13893"}, - {"2804:78bc::/32", "271262"}, - {"2a0b:6b86:f00::/42", "211387"}, - {"2001:559:c031::/48", "33659"}, - {"2400:cb00:443::/48", "13335"}, - {"2405:4340::/48", "135987"}, - {"240e:967:3000::/33", "4134"}, - {"2001:559:c46c::/48", "7922"}, - {"240e:267:4000::/38", "140332"}, - {"2409:804b:290a::/48", "24445"}, - {"2001:559:4de::/48", "7922"}, - {"2804:14c:475::/46", "28573"}, - {"2a0e:b107:1204::/48", "142130"}, - {"2001:4de0:4000::/39", "33438"}, - {"2409:800c:3003::/30", "56042"}, - {"2620:128:7000::/48", "32030"}, - {"2804:680::/43", "262589"}, - {"2a01:aa20::/32", "3178"}, - {"2001:da8:b813::/48", "24372"}, - {"2402:7d80:6666::/48", "63583"}, - {"2406:3400:201::/37", "10143"}, - {"2409:8904:3ba0::/37", "24547"}, - {"240a:ad60::/32", "146074"}, - {"2600:1419:3e01::/33", "20940"}, - {"2a02:26f7:b789::/46", "20940"}, - {"2a02:26f7:f8d4::/48", "36183"}, - {"240a:af75::/32", "146607"}, - {"2804:2af0:5::/32", "265126"}, - {"2a00:ad00:2020::/30", "41897"}, - {"2a12:8640::/29", "49581"}, - {"2001:559:8169::/48", "7015"}, - {"2001:13c7:6013::/48", "52404"}, - {"2401:4900:3ee0::/44", "45609"}, - {"2408:8956:2600::/40", "17622"}, - {"2409:8087:560::/36", "24547"}, - {"2602:feda:dc0::/44", "142427"}, - {"2606:18c0:c::/47", "61317"}, - {"2801:14:f000::/48", "266869"}, - {"2a02:26f7:ec4d::/46", "20940"}, - {"2a09:2600::/29", "197036"}, - {"2001:559:80c9::/46", "7725"}, - {"2001:1248:55b3::/44", "11172"}, - {"2402:8100:27f2::/45", "55644"}, - {"240a:aeff::/32", "146489"}, - {"2607:f910::/32", "31753"}, - {"2001:559:3ad::/48", "20214"}, - {"2001:559:c098::/48", "33657"}, - {"2402:8100:2500::/44", "55644"}, - {"2402:a800:c000::/34", "9601"}, - {"240e:3b4::/35", "134773"}, - {"2a0e:aa07:e00e::/48", "206843"}, - {"240a:add5::/32", "146191"}, - {"2806:2f0:4343::/42", "17072"}, - {"2a01:c50e:bf00::/33", "12479"}, - {"2a06:e8c0::/29", "8285"}, - {"2001:579:8f8::/38", "22773"}, - {"240a:ae27::/32", "146273"}, - {"2804:2e84::/44", "265350"}, - {"2a04:4e40:6000::/48", "54113"}, - {"2400:cb00:267::/44", "13335"}, - {"240a:a0e2::/32", "142876"}, - {"240a:a806::/32", "144704"}, - {"2401:91c0::/32", "136815"}, - {"240e:3bc:5600::/34", "4134"}, - {"2606:2cc0::/46", "54113"}, - {"2607:d500:600::/47", "13768"}, - {"2620:ac:c000::/48", "21630"}, - {"2800:484:cf00::/40", "14080"}, - {"2a01:488:bb0c::/48", "20773"}, - {"2a01:5043::/48", "202196"}, - {"2a12:7c05::/30", "210625"}, - {"2001:559:283::/48", "33662"}, - {"2400:6700:ff01::/40", "16509"}, - {"2604:6840:2000::/38", "33438"}, - {"2804:6610::/32", "269531"}, - {"2001:468:f001::/40", "11537"}, - {"2001:67c:54::/48", "47207"}, - {"2600:6c38:f42::/44", "20115"}, - {"2804:6d90::/32", "270541"}, - {"2a01:e0a:600::/29", "12322"}, - {"2001:559:c1d0::/48", "33287"}, - {"2001:590:3c02::/32", "3257"}, - {"240a:aeed::/32", "146471"}, - {"240e:108:1091::/42", "4134"}, - {"2a0f:5707:ab2c::/48", "60404"}, - {"2a0f:8644:b00b::/48", "212149"}, - {"2001:3a0::/32", "7521"}, - {"2001:559:86a5::/46", "33651"}, - {"2620:137:5090::/42", "10851"}, - {"2804:12dc::/32", "263501"}, - {"2804:7320::/32", "270897"}, - {"2806:260:1000::/44", "13999"}, - {"2806:2f0:4741::/46", "17072"}, - {"2a0e:b107:1030::/48", "213045"}, - {"2406:20c0:c001::/34", "140423"}, - {"2607:f220:200::/46", "19050"}, - {"2800:160:1729::/45", "14259"}, - {"2a03:f003:2002::/38", "25472"}, - {"2404:bf40:a142::/40", "139084"}, - {"2600:5400:e001::/39", "19108"}, - {"2a02:26f0:11c::/46", "20940"}, - {"2001:559:346::/44", "33491"}, - {"2401:7f40::/32", "136908"}, - {"2406:6940::/41", "141047"}, - {"2804:f70::/32", "270814"}, - {"2804:1878::/39", "61935"}, - {"2804:450c::/32", "267669"}, - {"2a02:120::/47", "29396"}, - {"2804:1e0c::/32", "264141"}, - {"2a04:4a00::/29", "47440"}, - {"2001:678:82c::/48", "59776"}, - {"2409:8055:5d::/46", "56040"}, - {"240a:a8e4::/32", "144926"}, - {"2a03:3380:3::/32", "47169"}, - {"2001:da8:d825::/48", "23910"}, - {"2a02:26f7:c646::/47", "20940"}, - {"2001:fd8:3430::/44", "4775"}, - {"2605:fb40::/33", "40050"}, - {"2620:13a:6001::/48", "33491"}, - {"2804:14d:7e34::/44", "28573"}, - {"2a02:2e02:83b0::/41", "12479"}, - {"2a03:2980::/32", "49641"}, - {"2404:8d06:a100::/36", "10089"}, - {"2a00:4940::/47", "198279"}, - {"2a03:5680::/32", "15495"}, - {"2406:9dc0:70::/44", "212705"}, - {"240e:5a:4840::/40", "140301"}, - {"2600:1419:7c00::/48", "35204"}, - {"2620:91:c004::/47", "54900"}, - {"2a00:1178::/46", "35415"}, - {"2001:559:c1e1::/48", "7922"}, - {"2001:4b30::/29", "9036"}, - {"2a02:26f0:f901::/38", "20940"}, - {"2001:250:5828::/48", "138371"}, - {"2001:678:814::/48", "64404"}, - {"2400:fc00:4a02::/44", "45773"}, - {"2607:f220:411::/48", "70"}, - {"2804:2c74::/32", "265220"}, - {"2a00:1fa1:8000::/30", "8359"}, - {"2001:913:5000::/36", "209090"}, - {"2408:840c:d000::/40", "17621"}, - {"2409:8904:56b0::/39", "24547"}, - {"2607:f750:d00::/40", "23473"}, - {"2803:a480::/32", "262192"}, - {"2804:b:c009::/46", "14840"}, - {"2804:1bf0:b::/45", "61758"}, - {"2806:230:400a::/48", "265594"}, - {"2a02:26f7:e941::/46", "20940"}, - {"2a0f:b7c0::/29", "49688"}, - {"2406:5d40:2::/32", "141009"}, - {"240e:3b9:2c00::/35", "134774"}, - {"2600:1010:9e00::/44", "6167"}, - {"2a01:6d80::/36", "13307"}, - {"2a02:6680:210c::/42", "16116"}, - {"2a04:edc0::/29", "200437"}, - {"2001:250:23f::/48", "24357"}, - {"2001:559:568::/48", "7015"}, - {"2001:559:c115::/48", "33489"}, - {"2600:1017:b4a0::/44", "22394"}, - {"2a02:23c8::/40", "24592"}, - {"2a02:26f7:bb48::/48", "36183"}, - {"2409:8052:100::/37", "9808"}, - {"240a:aa2a::/32", "145252"}, - {"2a02:26f7:f285::/46", "20940"}, - {"2001:4ba2::/32", "39519"}, - {"2400:6300:1f::/48", "38746"}, - {"240e:438:3440::/38", "4134"}, - {"2605:7c0:1000::/48", "19382"}, - {"2620:123:2003::/45", "30103"}, - {"2804:28e4:6::/44", "28260"}, - {"2804:3604::/32", "266321"}, - {"2a0f:3400::/29", "203698"}, - {"2407:b9c0::/36", "142616"}, - {"2606:7380::/32", "11763"}, - {"2607:f110:e130::/41", "21889"}, - {"2620:4d:4000::/48", "62597"}, - {"2001:250:5065::/43", "24361"}, - {"2001:559:82b8::/48", "7922"}, - {"240e:108:11e1::/48", "134764"}, - {"2804:cdc::/34", "52565"}, - {"2804:8618::/32", "272620"}, - {"2400:63a0::/45", "139590"}, - {"2408:8456:1800::/42", "17622"}, - {"2804:1c6c::/32", "61655"}, - {"2a02:ee80:4219::/42", "3573"}, - {"2a0a:c740:4::/47", "204170"}, - {"2001:559:c0db::/45", "33657"}, - {"2600:6c39:605::/46", "20115"}, - {"2a07:22c1:ffe5::/48", "207740"}, - {"2a0e:8f02:213f::/48", "211722"}, - {"2403:cd80::/32", "135025"}, - {"2408:8459:2110::/42", "17623"}, - {"2600:6c3a:821::/46", "20115"}, - {"2a02:2f0::/29", "42965"}, - {"2a04:bc40:1dc0::/48", "44750"}, - {"2a0a:ed80::/29", "49127"}, - {"2a0c:2f40::/30", "59829"}, - {"2403:71c0:1000::/48", "43959"}, - {"2406:a4c0::/32", "141120"}, - {"2408:8456:b640::/36", "17816"}, - {"240e:982:6200::/37", "4134"}, - {"2600:100b:b130::/40", "6167"}, - {"2620:9b:4000::/48", "26569"}, - {"2804:2264::/32", "264096"}, - {"2a02:2f80::/29", "200064"}, - {"2a10:2f00:124::/48", "205635"}, - {"2404:4600::/46", "10158"}, - {"2409:8053:2800::/47", "56047"}, - {"2a02:21b0::/31", "57370"}, - {"2001:559:8670::/48", "33660"}, - {"2001:1248:9613::/44", "11172"}, - {"2001:1520:100::/47", "34011"}, - {"2001:b033::/23", "3462"}, - {"2402:a00:10f::/41", "45916"}, - {"2402:b801:2900::/38", "18371"}, - {"2603:f000::/27", "397165"}, - {"2a0e:aa07:f050::/48", "138632"}, - {"2001:67c:748::/48", "202188"}, - {"2001:1900:2283::/48", "3356"}, - {"240e:9:6000::/36", "134419"}, - {"2600:e001::/32", "22995"}, - {"2804:4c24::/32", "263103"}, - {"2001:67c:670::/48", "201824"}, - {"2001:12d8:81::/32", "1251"}, - {"2401:d800:21d0::/42", "7552"}, - {"2408:8459:1810::/42", "17623"}, - {"2a05:ff00::/31", "202592"}, - {"2a06:300::/29", "51093"}, - {"2001:250:3c03::/48", "23910"}, - {"2001:ab0::/36", "15594"}, - {"2001:1248:9855::/42", "11172"}, - {"2404:130::/32", "24226"}, - {"2804:419c::/32", "267444"}, - {"240a:a966::/32", "145056"}, - {"2a0a:600::/29", "64431"}, - {"2a0a:2380::/48", "39845"}, - {"2001:1a11:b6::/48", "8781"}, - {"2804:5ca4::/32", "268921"}, - {"2804:7e90::/37", "271632"}, - {"2607:8b00::/48", "36454"}, - {"2804:7c8:f000::/36", "262323"}, - {"2605:2b00::/32", "19881"}, - {"2804:725c::/32", "262506"}, - {"2a01:63c0::/32", "31319"}, - {"2402:e280:2126::/44", "134674"}, - {"2602:fd92:400::/40", "210842"}, - {"2602:ff62::/40", "61317"}, - {"2a00:ebc0::/32", "3190"}, - {"2a04:7a00::/32", "6786"}, - {"2a05:f280::/29", "30884"}, - {"2001:4b20:20:2::/39", "34288"}, - {"240a:accf::/32", "145929"}, - {"2804:6d34::/32", "53114"}, - {"2a01:cb22:8000::/34", "3215"}, - {"2a02:26f7:d0c9::/42", "20940"}, - {"2a02:7080:3000::/36", "48024"}, - {"2001:559:8540::/48", "33652"}, - {"2401:d800:71c0::/42", "7552"}, - {"240a:ac8b::/32", "145861"}, - {"2a00:fd40:8::/47", "204402"}, - {"2a06:a0c0::/29", "43016"}, - {"2a0b:4340:99::/48", "205610"}, - {"2001:579:407f::/40", "22773"}, - {"2001:448a:1090::/42", "7713"}, - {"2600:6c7f:9070::/48", "20115"}, - {"2a02:26f7:fb01::/46", "20940"}, - {"2a02:26f7:fb04::/48", "36183"}, - {"2c0f:4000::/32", "1828"}, - {"2001:559:840b::/48", "7016"}, - {"2001:df0:230::/48", "56237"}, - {"2408:873d:3000::/32", "4837"}, - {"2804:214:8300::/37", "26615"}, - {"2a01:8280::/34", "44735"}, - {"2a0a:10c0::/29", "206270"}, - {"2001:2d8::/32", "9644"}, - {"2001:559:7ae::/48", "7016"}, - {"2001:df6:6100::/48", "134934"}, - {"2407:1240:1::/48", "141197"}, - {"240a:a380::/32", "143546"}, - {"2603:90f5:1800::/40", "33363"}, - {"2804:4488:8010::/44", "262480"}, - {"2804:78f4::/32", "271276"}, - {"240e:3bd::/35", "134773"}, - {"2607:fc68::/42", "2711"}, - {"2a02:26f7:f8c0::/48", "36183"}, - {"2a0b:ad40::/29", "205493"}, - {"2a0c:ac0::/29", "60843"}, - {"2001:4408:7c01::/40", "4758"}, - {"240e:108:1070::/48", "140061"}, - {"240e:958:1200::/40", "142608"}, - {"2600:1488:6302::/41", "20940"}, - {"2804:12d8::/32", "263500"}, - {"2800:160:17a0::/45", "14259"}, - {"2a00:bdc0:e006::/48", "60476"}, - {"2a01:8b40:2000::/32", "203165"}, - {"2a02:26f0:3601::/39", "20940"}, - {"2a03:db80:4414::/48", "5501"}, - {"2403:5740::/32", "135872"}, - {"240a:af37::/32", "146545"}, - {"2a02:26f0:7e01::/39", "20940"}, - {"2a04:f580:9060::/48", "4809"}, - {"240e:a8:e400::/27", "4134"}, - {"2604:d600:1506::/43", "32098"}, - {"2001:559:20f::/48", "7016"}, - {"2001:67c:286c::/48", "58148"}, - {"2408:840c:f00::/40", "17621"}, - {"240e:44d:5080::/41", "4134"}, - {"2800:2a0:9501::/33", "27947"}, - {"2a01:b380::/32", "196735"}, - {"2c0f:f810::/32", "36907"}, - {"2001:559:8724::/48", "33650"}, - {"2001:4998:58::/45", "26101"}, - {"2400:9840::/32", "136217"}, - {"240e:185::/30", "4134"}, - {"2604:1cc0::/32", "21559"}, - {"2804:1268::/32", "263475"}, - {"2001:b000:59c::/48", "131660"}, - {"2401:b0c0:1000::/43", "136941"}, - {"2620:109:c00e::/48", "14413"}, - {"2a00:1f60::/32", "8218"}, - {"2a00:ad40:10::/44", "57052"}, - {"2a01:3f7::/48", "57021"}, - {"2c0f:ec68::/32", "37675"}, - {"2001:df3:d500::/48", "137399"}, - {"2a00:afc0::/32", "48339"}, - {"2409:e:e2::/48", "142501"}, - {"240a:a388::/32", "143554"}, - {"240e:424::/30", "4134"}, - {"2600:141c:2801::/35", "20940"}, - {"2600:2000:f010::/48", "33517"}, - {"2a02:2010:2610::/45", "20978"}, - {"2408:8459:7e50::/32", "17816"}, - {"2800:381::/33", "10834"}, - {"2804:1ca4:8041::/40", "263010"}, - {"2a01:ce8c::/32", "51964"}, - {"2a03:c140::/29", "13101"}, - {"2a03:cac0:2::/48", "61149"}, - {"2001:579:92a8::/43", "22773"}, - {"2600:1017:b4b0::/41", "6167"}, - {"2800:bf0:285::/46", "52257"}, - {"2804:25fc::/32", "264316"}, - {"2407:b380::/32", "45062"}, - {"240e:3bd:ec00::/35", "140314"}, - {"2401:d980:1100::/40", "10138"}, - {"2001:df3:804::/44", "22787"}, - {"2001:4878:a259::/48", "12222"}, - {"2403:2c00:c002::/36", "4058"}, - {"240a:a106::/32", "142912"}, - {"240a:afbc::/32", "146678"}, - {"2600:100a:d000::/43", "6167"}, - {"2001:559:288::/48", "33657"}, - {"2406:f480::/32", "136969"}, - {"240a:a624::/32", "144222"}, - {"240e:629::/25", "4134"}, - {"2600:1411:8001::/30", "20940"}, - {"2001:da8:e000::/45", "24367"}, - {"2001:da8:e80e::/48", "23910"}, - {"2405:f140::/32", "138754"}, - {"2409:8751:700::/36", "56047"}, - {"2409:8a6b:200::/29", "9808"}, - {"240a:ac34::/32", "145774"}, - {"2604:880:212::/45", "29802"}, - {"2a01:8840:32::/45", "12041"}, - {"2a02:578:3c00::/33", "9031"}, - {"2001:67c:1720::/48", "60918"}, - {"2001:1900:221e::/48", "14627"}, - {"240a:ad5a::/32", "146068"}, - {"2605:a404:3ee::/37", "33363"}, - {"2804:14c:7d89::/43", "28573"}, - {"2a02:26f7:d8c8::/48", "36183"}, - {"2a0a:8fc0::/29", "60783"}, - {"2a10:f45::/32", "210107"}, - {"2001:480:a0::/47", "5132"}, - {"2001:43b8::/32", "30844"}, - {"2406:1a40::/48", "55320"}, - {"2a0e:b107:b20::/44", "63279"}, - {"2001:67c:13c4::/48", "196978"}, - {"240e:3b3:9c00::/34", "140310"}, - {"2c0f:eb00:1200::/40", "327941"}, - {"2408:8956:3200::/40", "17622"}, - {"2605:f500:404::/39", "1828"}, - {"2606:7f00:100::/40", "32307"}, - {"2804:67a4:121::/46", "269641"}, - {"2a00:4120:8000:3::/61", "20804"}, - {"2a02:26f0:a2::/45", "20940"}, - {"2a02:26f7:d381::/46", "20940"}, - {"2001:559:80f8::/48", "33652"}, - {"240e:12:800::/37", "134765"}, - {"2803:7200:8016::/44", "27696"}, - {"2804:5404::/32", "268623"}, - {"2804:5bc8::/32", "268869"}, - {"2a0f:85c1:230::/47", "207831"}, - {"2001:67c:11c0::/48", "206082"}, - {"2406:4b00::/44", "132602"}, - {"2604:23c0::/32", "36792"}, - {"2a00:1eb8:c004::/48", "43811"}, - {"2a11:1400::/29", "211344"}, - {"2406:840:f90b::/48", "139833"}, - {"2409:8c54:b000::/44", "141425"}, - {"240e:45c:5100::/40", "140529"}, - {"2801:1bc::/44", "27951"}, - {"2804:314:3001::/33", "61568"}, - {"2a02:26f7:f649::/46", "20940"}, - {"2a03:3f40:3::/40", "50673"}, - {"2a04:1b00:12::/47", "61007"}, - {"2409:8c85:5e01::/34", "9808"}, - {"2a0a:981::/32", "50113"}, - {"2001:1a11:7d::/40", "8781"}, - {"2402:800:5747::/43", "7552"}, - {"2408:8456:2600::/42", "17622"}, - {"2600:380:4600::/39", "20057"}, - {"2a06:5580::/39", "21145"}, - {"2a0c:2c40::/32", "58110"}, - {"2a11:3780::/29", "34734"}, - {"2001:67c:2594::/48", "57496"}, - {"2001:da8:b806::/48", "23910"}, - {"2404:e801:101f::/48", "45938"}, - {"2409:8d02::/32", "38019"}, - {"2800:bf0:a7::/44", "52257"}, - {"2c0f:ebd0:2200::/32", "328608"}, - {"2408:8756:e00::/40", "17622"}, - {"2600:370f:7441::/44", "32261"}, - {"2607:f2c8::/32", "23473"}, - {"2400:da00::/37", "38365"}, - {"2a04:ac00:9::/46", "203004"}, - {"2404:1c40:ce::/47", "24432"}, - {"2606:2800:600b::/48", "14153"}, - {"2803:4a80::/32", "27865"}, - {"2a0f:2d40::/29", "60262"}, - {"2001:250:5012::/41", "24361"}, - {"2401:4900:3e20::/41", "45609"}, - {"240a:ae84::/32", "146366"}, - {"2804:2cc0::/32", "265241"}, - {"2a02:26f7:c8c0::/48", "36183"}, - {"2404:bf40:a242::/40", "139084"}, - {"240a:a499::/32", "143827"}, - {"240a:ac20::/32", "145754"}, - {"2607:f740:56::/47", "36236"}, - {"2804:2064::/32", "262433"}, - {"2001:4cd8::/32", "8319"}, - {"2402:800:3b8d::/43", "7552"}, - {"2407:1200::/32", "7524"}, - {"2409:8000:5800::/40", "56048"}, - {"2409:8d15:2800::/39", "56044"}, - {"240e:67c:800::/37", "140329"}, - {"2803:3100::/32", "16973"}, - {"2a00:4980::/42", "33848"}, - {"2a0a:59c7:100d::/46", "204724"}, - {"2001:559:8465::/48", "33654"}, - {"2001:67c:2290::/48", "43407"}, - {"2602:801:5000::/40", "399477"}, - {"2620:0:a0f::/43", "71"}, - {"2804:15d4:8000::/33", "263413"}, - {"2a10:1380::/29", "207335"}, - {"2400:cb00:460::/48", "13335"}, - {"2408:8957:9000::/40", "17622"}, - {"2a01:9540::/32", "59597"}, - {"2a01:aec0::/32", "41549"}, - {"2a02:2370:4000::/48", "32787"}, - {"2408:8956:4200::/40", "17622"}, - {"240a:af21::/32", "146523"}, - {"2607:bb80::/32", "395774"}, - {"2a0b:6900::/48", "206873"}, - {"2a0d:5940::/29", "58212"}, - {"2001:559:c015::/44", "7922"}, - {"2408:840c:bc00::/40", "17621"}, - {"2a06:e881:1407::/44", "202540"}, - {"2400:7400:41::/48", "23736"}, - {"2401:d800:c000::/35", "7552"}, - {"2602:feb6::/36", "7001"}, - {"2804:2f0::/32", "53236"}, - {"2804:724c::/32", "270845"}, - {"2001:250:6c41::/48", "23910"}, - {"2001:da8:d025::/48", "24359"}, - {"2001:df2:f000::/48", "55319"}, - {"240a:ace2::/32", "145948"}, - {"2a01:178::/32", "8607"}, - {"2a06:9300::/29", "35684"}, - {"2620:a4:2051::/48", "399120"}, - {"2620:1d0:5e::/47", "397228"}, - {"2804:2b60::/32", "262587"}, - {"2804:7148::/32", "270779"}, - {"2a02:20c8:1241::/48", "44511"}, - {"2a02:26f7:bfc0::/48", "36183"}, - {"2a02:26f7:dbcd::/42", "20940"}, - {"2a0e:46c4:109::/48", "142598"}, - {"240a:a395::/32", "143567"}, - {"2001:df2:a980::/48", "131203"}, - {"2401:4900:4e40::/42", "45609"}, - {"2405:7800::/32", "17689"}, - {"2803:7c60::/32", "27951"}, - {"2a02:26f7:d0::/48", "36183"}, - {"2a02:e840::/30", "15974"}, - {"2a06:6a40::/29", "203924"}, - {"2a07:8980::/39", "198651"}, - {"2001:578:18::/42", "22773"}, - {"2604:ca00:136::/41", "36492"}, - {"2606:2a00::/32", "53292"}, - {"2806:230:4037::/48", "11888"}, - {"2a02:26f7:db11::/42", "20940"}, - {"2600:40fc:1003::/48", "14210"}, - {"2804:64b0:4000::/36", "269442"}, - {"2804:7b70::/32", "271432"}, - {"2a02:8c0::/32", "39257"}, - {"240e:980:8000::/40", "23724"}, - {"2600:40ff:fc01::/44", "701"}, - {"2804:14c:4a3::/45", "28573"}, - {"2a01:d8:9::/32", "5537"}, - {"2400:a980:e4::/47", "133111"}, - {"2409:8b50::/30", "9808"}, - {"2a01:51a0::/32", "21348"}, - {"2a03:51e0::/32", "43776"}, - {"2a0f:e040:1::/48", "60781"}, - {"2001:559:c0a9::/48", "33490"}, - {"2602:ff96:6::/48", "26548"}, - {"2a01:620:10::/32", "12389"}, - {"2a01:c50f:5180::/32", "12479"}, - {"2a02:26f7:dfc8::/48", "36183"}, - {"2a04:e802:1d::/32", "57976"}, - {"2402:800:3a2b::/41", "7552"}, - {"240a:a84c::/32", "144774"}, - {"2600:141b:f001::/29", "20940"}, - {"2607:f038:400c::/46", "21527"}, - {"2620:171:62::/45", "42"}, - {"2804:27cc::/32", "53125"}, - {"2806:310:9::/48", "28523"}, - {"2a01:b780::/32", "43612"}, - {"2a02:26f7:dd85::/46", "20940"}, - {"2001:67c:1360::/48", "41231"}, - {"2402:5cc0:1::/46", "27381"}, - {"2409:4086:a000::/28", "55836"}, - {"2409:8a39::/30", "9808"}, - {"240a:a3fd::/32", "143671"}, - {"240a:a804::/32", "144702"}, - {"2a02:26f7:bf89::/46", "20940"}, - {"240e:bf:b8ec::/46", "138597"}, - {"2a07:a343:cd10::/44", "9009"}, - {"2001:7f0:102::/34", "13237"}, - {"2402:800:7f50::/42", "7552"}, - {"2600:1014:b070::/40", "22394"}, - {"2806:20d:1912::/44", "32098"}, - {"2402:800:95ee::/38", "7552"}, - {"2a09:3340::/29", "209509"}, - {"2a0f:c00::/29", "48627"}, - {"2404:c400:9000::/36", "133321"}, - {"2604:d600:c79::/46", "32098"}, - {"2804:3dac::/39", "266546"}, - {"2a02:2328::/32", "8426"}, - {"2404:afc0::/32", "138829"}, - {"2408:8456:1d40::/40", "17816"}, - {"2804:4f8:8000::/38", "28263"}, - {"2a09:2941::/32", "207996"}, - {"2001:67c:22c0::/48", "3301"}, - {"2604:6940:980::/32", "11006"}, - {"2804:5e8::/32", "262549"}, - {"2806:2f0:6001::/46", "17072"}, - {"2806:310:2b::/45", "16960"}, - {"2a04:c900:1000::/36", "48096"}, - {"2606:a600:7000::/32", "23005"}, - {"2607:700:1300::/37", "22343"}, - {"2804:b40::/32", "52760"}, - {"2806:230:2023::/48", "11888"}, - {"2a0d:d40::/32", "200318"}, - {"2c0f:ee20::/32", "328251"}, - {"2001:559:45a::/47", "33657"}, - {"2001:559:4ff::/48", "33491"}, - {"2408:8956:a400::/40", "17622"}, - {"240e:3b6:ac00::/35", "4134"}, - {"2a02:26f7:f500::/48", "36183"}, - {"2a04:bd40::/29", "62038"}, - {"2a0c:7e45:1f8e::/48", "20473"}, - {"2001:1420::/30", "8676"}, - {"2402:7940::/32", "134090"}, - {"240a:ab62::/32", "145564"}, - {"2604:7c0:200::/36", "395841"}, - {"2610:b0:4062::/43", "3573"}, - {"2804:20e4::/32", "264519"}, - {"2a00:1780::/32", "8194"}, - {"2a02:26f0:7e00::/48", "34164"}, - {"2409:8c14:100::/36", "56044"}, - {"2804:138b:c041::/40", "53037"}, - {"2a0e:c500::/29", "57878"}, - {"2400:3a60:1ff0::/32", "149051"}, - {"2401:b900::/32", "17894"}, - {"2402:ef03:3::/45", "7633"}, - {"2403:6600::/32", "55329"}, - {"2404:4a00::/48", "45629"}, - {"2620:cc:4000::/48", "3356"}, - {"2a02:26f7:d841::/46", "20940"}, - {"2001:559:8081::/48", "7015"}, - {"2408:84f3:9610::/42", "134543"}, - {"2804:3048::/32", "264941"}, - {"2a02:e3c0::/29", "213402"}, - {"2402:800:57a9::/43", "7552"}, - {"2409:881e::/31", "24400"}, - {"2804:1ad4::/32", "52536"}, - {"2a04:4540::/29", "15943"}, - {"2a06:f901::/36", "56630"}, - {"2c0f:fec8:1001::/32", "37197"}, - {"2800:ba0:24::/48", "263812"}, - {"2a00:c98:2053::/32", "28753"}, - {"2a02:5340::/48", "12552"}, - {"2001:df2:c800::/48", "133394"}, - {"240a:acfe::/32", "145976"}, - {"2607:f8f8:1f05::/44", "50131"}, - {"2620:107:9058::/48", "22787"}, - {"2a00:4c20::/32", "6769"}, - {"2a02:26f0:e001::/38", "20940"}, - {"2001:559:c538::/48", "7922"}, - {"240a:aadf::/32", "145433"}, - {"240a:aafb::/32", "145461"}, - {"2620:10a:80e8::/46", "55195"}, - {"2806:288::/35", "28469"}, - {"2a10:4e00::/29", "399975"}, - {"2401:8c00::/32", "38858"}, - {"2804:2f50::/32", "264883"}, - {"2804:6a9c::/32", "270347"}, - {"2a10:c5c1:affe::/48", "211547"}, - {"2001:559:319::/48", "33657"}, - {"2803:aba0:2000::/38", "265554"}, - {"2a0f:300::/32", "397881"}, - {"2001:559:ad::/48", "33659"}, - {"2804:6918:4300::/36", "270248"}, - {"2a02:26f7:f790::/48", "36183"}, - {"2a11:7d80::/29", "61192"}, - {"2001:df4:e180::/48", "140751"}, - {"2408:8256:318a::/48", "17816"}, - {"240e:438:8040::/38", "4134"}, - {"240e:967:a800::/38", "58772"}, - {"2602:fc52:100::/40", "399888"}, - {"2803:4b80::/32", "27940"}, - {"2804:154c:101::/33", "263382"}, - {"2a0f:f580::/29", "60262"}, - {"2400:fc00:82f2::/37", "45773"}, - {"2804:75f8::/32", "271081"}, - {"2a02:26f7:bc06::/47", "20940"}, - {"2001:559:281::/48", "20214"}, - {"2001:678:a08::/48", "209395"}, - {"2400:adc7:1800::/39", "9541"}, - {"2408:80fa:6300::/35", "17816"}, - {"240a:a15c::/32", "142998"}, - {"2001:559:85f3::/45", "33651"}, - {"2600:140b:d000::/48", "7679"}, - {"2600:6c38:25b::/45", "20115"}, - {"2606:aec0::/36", "398646"}, - {"2804:7bd8::/32", "271458"}, - {"2a00:1c30::/32", "12659"}, - {"2a02:26f7:f6c1::/46", "20940"}, - {"2a05:2d07::/32", "198507"}, - {"2402:e280:3d9a::/42", "134674"}, - {"2404:f100::/37", "17483"}, - {"2800:160:1176::/44", "14259"}, - {"2800:381:cccd::/34", "10834"}, - {"2001:ddd::/48", "18369"}, - {"2804:5390::/32", "268592"}, - {"2a0f:5707:ab2b::/48", "7489"}, - {"2001:44b8:30f2::/48", "4739"}, - {"2606:8800::/32", "19940"}, - {"2804:6bb4::/35", "270418"}, - {"2c0e:220c::/30", "37457"}, - {"2001:1248:988b::/45", "11172"}, - {"2400:6900::/32", "56304"}, - {"240a:a78f::/32", "144585"}, - {"2a0c:ce80::/41", "197113"}, - {"2001:559:81c7::/44", "33652"}, - {"2400:7400:e01c::/46", "23736"}, - {"2620:129:100f::/48", "13536"}, - {"2801:0:210::/48", "19429"}, - {"2a04:9b80::/29", "57608"}, - {"2a06:4180:2::/29", "48293"}, - {"2001:559:737::/48", "33657"}, - {"2406:3000:2:10a::/47", "4657"}, - {"2407:ef00::/36", "12422"}, - {"240a:a5ff::/32", "144185"}, - {"2804:4cb4:9000::/33", "267386"}, - {"2a01:c50f:dd40::/38", "12479"}, - {"2001:1248:a543::/45", "11172"}, - {"2400:a980:3500::/36", "133111"}, - {"2804:145c:8050::/40", "263327"}, - {"2a06:3100::/29", "51588"}, - {"2001:559:b5::/48", "33657"}, - {"2001:da8:a6::/48", "24352"}, - {"2603:903e::/32", "33363"}, - {"2a02:280::/32", "12883"}, - {"240e:438:3620::/43", "140647"}, - {"2001:fe0:919::/32", "4775"}, - {"240a:a765::/32", "144543"}, - {"2803:b700::/32", "262262"}, - {"2a02:2e02:9530::/41", "12479"}, - {"2a03:c600::/32", "3262"}, - {"2001:559:8499::/48", "33650"}, - {"2409:8904:6540::/42", "24547"}, - {"2a10:1d00::/32", "16019"}, - {"2400:adc0:20::/47", "9541"}, - {"2409:8e54::/28", "9808"}, - {"2001:4878:220::/48", "12222"}, - {"2804:6cdc:8000::/33", "270497"}, - {"2a00:5c60::/46", "43329"}, - {"2a02:26f7:e6c5::/46", "20940"}, - {"2a04:f600::/29", "200435"}, - {"2001:67c:18a8::/48", "50438"}, - {"240a:a895::/32", "144847"}, - {"240a:aaa8::/32", "145378"}, - {"240e:44d:240::/42", "140346"}, - {"2602:fd50:b00b::/48", "212149"}, - {"2a06:efc0::/32", "34762"}, - {"2001:678:904::/48", "47453"}, - {"2800:9a3:100::/29", "14522"}, - {"2804:1da0::/32", "264382"}, - {"2a0d:2581:2333::/48", "209261"}, - {"2001:559:8257::/48", "7016"}, - {"2001:6c0::/32", "25286"}, - {"2403:8600:8000::/44", "45820"}, - {"240a:a998::/32", "145106"}, - {"2a11:4c0::/47", "211632"}, - {"2406:daa0:a080::/44", "16509"}, - {"2a01:c50e:4100::/35", "12479"}, - {"2a06:bdc0:191a::/38", "62240"}, - {"2a0b:1640:1::/48", "205787"}, - {"2001:559:5bf::/48", "33659"}, - {"2001:4b20:100:58a::/59", "34288"}, - {"240e:983:1802::/48", "4134"}, - {"2620:10f:b000::/48", "4185"}, - {"2a02:fe80:2010::/48", "30148"}, - {"2a04:2e80:4::/48", "207587"}, - {"2a10:2f01:244::/46", "213316"}, - {"2001:559:c39d::/48", "33657"}, - {"2001:13c8::/32", "11960"}, - {"2001:4c08:201f::/48", "10753"}, - {"2404:bf40:e604::/48", "7545"}, - {"2600:8807:b7ea::/33", "22773"}, - {"2605:bc0:1014::/47", "54201"}, - {"2804:df0:2000::/32", "262775"}, - {"2804:3eac::/32", "266614"}, - {"2a02:26f7:e884::/48", "36183"}, - {"2a0a:2300::/31", "212754"}, - {"2001:559:72f::/48", "7016"}, - {"2001:fc8::/32", "23624"}, - {"2402:b801:3900::/37", "18371"}, - {"2804:6abc::/32", "270356"}, - {"2a00:a500::/32", "49457"}, - {"2a06:eac0::/29", "48854"}, - {"2a0c:7e46:4f08::/48", "20473"}, - {"2001:559:df::/48", "33489"}, - {"2001:559:12e::/43", "7922"}, - {"240e:983:1b02::/48", "136188"}, - {"2604:4500:b00::/37", "29802"}, - {"2610:190:1c00::/38", "62"}, - {"2408:8256:2f60::/44", "17623"}, - {"2408:8256:399d::/46", "17623"}, - {"2800:160:1905::/44", "14259"}, - {"2804:4d80:801::/32", "268200"}, - {"2a02:1718::/32", "51182"}, - {"2a02:26f7:ab::/48", "20940"}, - {"2a11:da80::/29", "210806"}, - {"2403:3d80::/32", "48024"}, - {"2409:8904:53b0::/37", "24547"}, - {"2620:133:8000::/46", "19054"}, - {"2806:2f0:5123::/41", "17072"}, - {"2a0b:e3c0::/29", "205215"}, - {"2407:cdc0:b000::/36", "38136"}, - {"2600:1000:fe00::/44", "6167"}, - {"2602:fed2:ff4::/48", "53356"}, - {"2804:8ec::/32", "28235"}, - {"2a05:da00::/29", "200984"}, - {"2c0f:fd08::/32", "37309"}, - {"2001:67c:1680::/48", "212037"}, - {"2800:bf0:824c::/48", "27947"}, - {"2803:fd80:4::/43", "18747"}, - {"2804:4354::/32", "267563"}, - {"2a06:7780::/29", "204790"}, - {"2400:9340::/32", "136189"}, - {"2400:ea00:ffff::/48", "23884"}, - {"2407:2400::/32", "45641"}, - {"2804:7508::/32", "271019"}, - {"2a00:55a0:ff00::/40", "9009"}, - {"2a02:ee80:419f::/42", "3573"}, - {"2001:559:8163::/48", "7015"}, - {"2406:b580::/32", "132296"}, - {"2804:5ab8::/32", "268791"}, - {"240e:438:a040::/38", "4134"}, - {"2804:41d0:3600::/32", "267458"}, - {"2a02:2548::/32", "48822"}, - {"2a0b:2fc0::/29", "29632"}, - {"240e:5e:4004::/47", "58543"}, - {"2804:14d:6800::/40", "28573"}, - {"2804:da0::/32", "28587"}, - {"2804:4dbc::/32", "268216"}, - {"2001:918:ff3e::/48", "48038"}, - {"2400:cb00:19::/48", "13335"}, - {"2a02:26f7:e984::/48", "36183"}, - {"2a0e:97c0:700::/44", "48987"}, - {"2001:500:40::/45", "207266"}, - {"2406:3003:3000::/42", "55430"}, - {"2607:ee80:10::/48", "11403"}, - {"2a01:5043:eff::/48", "202196"}, - {"2605:f440::/41", "54874"}, - {"2620:128:e014::/48", "22317"}, - {"2a03:b0c0::/46", "14061"}, - {"2a07:cb80::/32", "49685"}, - {"2001:950::/32", "47381"}, - {"2404:bf40:8780::/46", "7545"}, - {"2804:3ec::/32", "61570"}, - {"2001:559:261::/48", "33668"}, - {"2001:559:8323::/48", "7015"}, - {"2409:801f:3000::/46", "9808"}, - {"2800:bf0:20::/45", "52257"}, - {"2804:e30:c00::/38", "11338"}, - {"2a0a:17c0::/29", "206894"}, - {"2a0c:b641:5c0::/44", "210466"}, - {"2804:c40::/32", "262809"}, - {"2804:276c:100::/37", "263900"}, - {"2001:559:81e4::/48", "33651"}, - {"2001:559:863f::/48", "33662"}, - {"240e:3b9:dc00::/34", "4134"}, - {"2804:7c24::/32", "271478"}, - {"2620:4d:400a::/48", "395403"}, - {"2804:33ec::/32", "265425"}, - {"2a07:c480::/29", "50017"}, - {"2001:df0:6880::/48", "138731"}, - {"2001:16f8:4000::/48", "199522"}, - {"2001:18b8:43::/45", "29789"}, - {"2404:c8:2::/48", "27435"}, - {"2406:7400:80::/46", "24309"}, - {"2600:1419:2201::/37", "20940"}, - {"2403:9800:b018::/48", "4771"}, - {"2606:ef80::/45", "7226"}, - {"2804:21a4:2800::/35", "53191"}, - {"2804:8434:b::/48", "272246"}, - {"2604:d600:677::/44", "32098"}, - {"2620:13a:4000::/40", "22686"}, - {"2a01:90a0::/32", "62105"}, - {"2a02:2010:2700::/43", "20978"}, - {"2a10:d780::/46", "211997"}, - {"2401:d800:9750::/42", "7552"}, - {"2408:8459:9830::/41", "17622"}, - {"2600:9000:1199::/46", "16509"}, - {"2620:138:3000::/46", "11251"}, - {"2a02:26f7:b0::/48", "36183"}, - {"2a09:be40:3441::/48", "57401"}, - {"240a:a84a::/32", "144772"}, - {"2607:f060:b004::/48", "53708"}, - {"2804:49b8::/32", "267199"}, - {"2a00:fd40:6::/48", "20473"}, - {"2a06:6740::/29", "20596"}, - {"2001:678:d10::/48", "20473"}, - {"2409:8d01::/32", "9808"}, - {"2804:5734::/32", "268051"}, - {"2a02:6a80:5301::/44", "3245"}, - {"2a0a:dc40::/29", "12843"}, - {"2a0d:3280::/29", "34907"}, - {"2001:cb0:2204::/46", "4637"}, - {"2620:149:a14::/48", "6185"}, - {"2804:1c4c::/39", "61648"}, - {"2a02:26f7:ce89::/42", "20940"}, - {"2a0b:4740::/29", "211274"}, - {"2001:559:8180::/48", "33659"}, - {"2001:12f0:b28::/43", "1916"}, - {"2404:8000:73::/44", "17451"}, - {"2600:6c21:4c1::/38", "20115"}, - {"2001:559:c004::/48", "7922"}, - {"240a:a303::/32", "143421"}, - {"2804:79d8::/32", "271331"}, - {"2a01:7b8::/32", "34920"}, - {"2a03:4900:5::/46", "197695"}, - {"2606:2800:5150::/48", "15133"}, - {"2a02:26f7:ef::/48", "20940"}, - {"2001:559:8433::/48", "22909"}, - {"2001:1248:a400::/47", "11172"}, - {"2a0e:46c4:2b00::/40", "212767"}, - {"2402:5b00:b0::/44", "18002"}, - {"240e:3b9:7600::/39", "140313"}, - {"2620:171:11::/46", "715"}, - {"2800:2f0:1c::/48", "27668"}, - {"2806:2f0:2403::/43", "22884"}, - {"2a03:a960:2::/42", "61317"}, - {"2001:250:3c13::/48", "23910"}, - {"2001:559:12c::/48", "7922"}, - {"2001:5b0:4eca::/43", "6621"}, - {"2406:20c0:2001::/33", "140423"}, - {"2406:4f40:4::/44", "40676"}, - {"2600:6c38:a59::/40", "20115"}, - {"2604:4780::/32", "6994"}, - {"2606:2400::/35", "36295"}, - {"2610:b0:4134::/41", "3573"}, - {"2620:10d:2080::/48", "29384"}, - {"2804:14c:4e1::/45", "28573"}, - {"2001:559:26a::/48", "7922"}, - {"2001:67c:1534::/48", "208281"}, - {"240e:e6:1000::/32", "4812"}, - {"2602:fed2:7111::/48", "36436"}, - {"2804:2d70::/32", "265282"}, - {"2a0b:e44:1::/48", "205809"}, - {"2001:4408:5b08::/37", "4758"}, - {"2800:160:1d59::/42", "14259"}, - {"2804:aa4::/32", "52902"}, - {"2804:45fc:c002::/34", "266959"}, - {"2a01:b740:a24::/48", "6185"}, - {"2a0d:a180::/32", "211494"}, - {"2001:559:8394::/47", "7922"}, - {"2001:4888:801a::/47", "6167"}, - {"2403:9800:b010::/46", "4771"}, - {"2408:8459:6210::/42", "17623"}, - {"2604:9c0::/32", "395777"}, - {"2804:1c::/32", "11844"}, - {"2804:1a8c::/32", "61865"}, - {"2804:7bb8::/32", "271450"}, - {"2a06:9240::/29", "47406"}, - {"2a07:3500:12d0::/48", "33915"}, - {"2409:8038:3100::/36", "9808"}, - {"2804:14d:5c00::/42", "28573"}, - {"2804:1628::/32", "263271"}, - {"2804:51e4::/32", "268483"}, - {"2804:6e50::/32", "270588"}, - {"2a06:c240::/42", "49222"}, - {"2001:559:c1ff::/48", "7922"}, - {"2605:8dc0::/32", "55081"}, - {"2605:a404:a36::/40", "33363"}, - {"2607:fb50:a00::/35", "22781"}, - {"2620:10a:f020::/40", "21869"}, - {"2803:8aa0::/32", "266865"}, - {"2804:562c::/32", "267981"}, - {"2402:800:3a9b::/41", "7552"}, - {"2408:8256:396c::/48", "17623"}, - {"2408:84f3:2e10::/44", "17623"}, - {"2804:16b0::/36", "61910"}, - {"2a0d:3842:1110::/48", "57629"}, - {"2001:da8:224::/48", "24350"}, - {"2408:8459:24c0::/38", "17816"}, - {"2620:a5:c000::/48", "27625"}, - {"2804:14c:6573::/40", "28573"}, - {"2a03:ddc0::/32", "199350"}, - {"2001:559:c148::/46", "33490"}, - {"240a:aa33::/32", "145261"}, - {"2a0b:6903:1ad::/48", "212461"}, - {"2001:559:8385::/48", "33651"}, - {"2806:230:3028::/48", "265594"}, - {"240e:438:3240::/37", "4134"}, - {"2600:3000:3102::/33", "13649"}, - {"2620:98:6000::/48", "7018"}, - {"2a00:c640::/32", "198612"}, - {"2a07:f880::/29", "52212"}, - {"2a0f:3040::/29", "37686"}, - {"2001:559:82cf::/48", "33659"}, - {"2001:579:c24::/35", "22773"}, - {"240a:ac88::/32", "145858"}, - {"2800:bf0:80a2::/43", "27947"}, - {"2804:6e14:4000::/34", "270574"}, - {"2408:8256:1800::/34", "17816"}, - {"2606:8600::/32", "33604"}, - {"2804:84d4::/32", "272282"}, - {"2a0e:5b40::/29", "41960"}, - {"2a0f:85c1:27::/48", "210532"}, - {"2406:3800::/32", "24245"}, - {"2605:a404:8b7::/41", "33363"}, - {"2804:1a98::/32", "61870"}, - {"2804:5cf8::/32", "268943"}, - {"2a02:26f7:b708::/48", "36183"}, - {"2a07:aa80::/29", "202657"}, - {"2a12:3580::/29", "204623"}, - {"2607:fb10:70e2::/47", "2906"}, - {"2803:7a00::/32", "52468"}, - {"2803:c300::/32", "22869"}, - {"240a:a329::/32", "143459"}, - {"240a:ab6b::/32", "145573"}, - {"2804:443c::/32", "267611"}, - {"2001:559:c082::/48", "33667"}, - {"2001:44b8:3086::/48", "7545"}, - {"2401:b200:a::/41", "24186"}, - {"2408:8256:36a0::/39", "17816"}, - {"2605:3380:4138::/41", "12025"}, - {"2804:668c::/32", "269567"}, - {"2a00:4820::/32", "24800"}, - {"2a01:8640:6::/48", "42708"}, - {"2001:559:80f5::/48", "33657"}, - {"2606:8f00::/32", "18712"}, - {"2806:101e:6::/44", "8151"}, - {"2001:559:c242::/48", "33651"}, - {"2a02:26f7:b744::/46", "36183"}, - {"240e:848:a0::/30", "4134"}, - {"2605:2800:102::/40", "3354"}, - {"2a00:adc0:1a00::/40", "13030"}, - {"2a02:2ad0:117::/44", "702"}, - {"2a03:2880:f270::/40", "32934"}, - {"2801:116:1::/48", "27951"}, - {"2a02:26f7:9d::/48", "20940"}, - {"2a06:b500:204f::/48", "211768"}, - {"2a09:7184::/30", "39614"}, - {"2a0e:aa01:bad2::/33", "206499"}, - {"2001:500:12::/48", "5927"}, - {"2804:4368:1450::/32", "267568"}, - {"2a02:26f7:d301::/46", "20940"}, - {"2a0e:b107:760::/44", "205977"}, - {"2001:48d0:c000::/34", "7377"}, - {"2804:214:8498::/39", "26615"}, - {"2804:1ed0:1003::/32", "262286"}, - {"2001:550:4701:201::/36", "174"}, - {"240a:a290::/32", "143306"}, - {"2a02:27b0:5400::/39", "9146"}, - {"2001:a38::/32", "20633"}, - {"2407:9240:3100::/44", "149423"}, - {"240a:a3b0::/32", "143594"}, - {"2a02:6680:21f0::/44", "16116"}, - {"2a0a:59c7:1007::/44", "204724"}, - {"2001:559:8793::/48", "33491"}, - {"2001:14e8:2::/32", "6736"}, - {"2001:1a11:7c::/48", "42298"}, - {"240a:a3fe::/32", "143672"}, - {"2605:6c80::/47", "397373"}, - {"2620:122:7000::/48", "16507"}, - {"2a00:59a0::/32", "42442"}, - {"2a03:97a0::/40", "197380"}, - {"2a04:5200:5978::/32", "50113"}, - {"2001:559:87ee::/48", "33659"}, - {"2600:1005:9010::/40", "22394"}, - {"2600:1419:ec01::/35", "20940"}, - {"2a05:9f80::/29", "211308"}, - {"2602:fbbc::/46", "400498"}, - {"2606:41c0::/45", "11448"}, - {"2800:160:12bb::/45", "14259"}, - {"2804:54::/35", "28220"}, - {"2a0d:9a80:100::/38", "49959"}, - {"2001:44b8:2a::/43", "7545"}, - {"2401:d800:2252::/40", "7552"}, - {"2620:13d:e000::/48", "397127"}, - {"2a02:2198::/32", "21161"}, - {"2a03:c980:b957::/48", "210079"}, - {"2a04:ed40::/29", "201864"}, - {"2a0d:a1c0::/29", "42695"}, - {"2001:4bf8::/32", "8271"}, - {"2804:1658:ffff::/48", "263283"}, - {"2a00:79e0::/39", "45566"}, - {"2a09:400:8000::/36", "208861"}, - {"2a07:39c0::/29", "60111"}, - {"2402:800:7ee2::/39", "7552"}, - {"2a07:1f40::/29", "28725"}, - {"2001:678:ccc::/48", "206477"}, - {"2001:90f::/32", "204873"}, - {"240e:965:d400::/39", "58772"}, - {"2620:74:8a::/48", "26134"}, - {"2a00:d980::/32", "12512"}, - {"2a06:a005:b8::/48", "207941"}, - {"2a12:280::/29", "204790"}, - {"2001:559:8539::/48", "33652"}, - {"2001:67c:4::/48", "51531"}, - {"2001:1248:8416::/47", "11172"}, - {"2607:fdf0:5eb8::/41", "8008"}, - {"2804:e48::/32", "262949"}, - {"2a0f:cc84::/31", "210625"}, - {"2404:1c40:f0::/45", "24432"}, - {"2408:8956:5000::/40", "17622"}, - {"2602:230::/32", "6128"}, - {"2a03:1fc0::/48", "35220"}, - {"2a0e:fd45:da5::/48", "60557"}, - {"2400:dcc0:a404::/39", "38631"}, - {"2401:d800:40::/42", "7552"}, - {"2403:6100::/32", "4621"}, - {"2409:8924:9900::/38", "56046"}, - {"240a:ad14::/32", "145998"}, - {"2604:3a80::/32", "33130"}, - {"2800:800:400::/39", "26611"}, - {"2a11:2800:3::/48", "61317"}, - {"2001:559:855c::/48", "7922"}, - {"2001:678:e40::/48", "205593"}, - {"2001:67c:29fc::/48", "30923"}, - {"2001:4830:c160::/44", "27552"}, - {"2405:d440:101::/32", "58813"}, - {"240e:390::/29", "4134"}, - {"2605:4c40:abd::/32", "30081"}, - {"2804:6584::/32", "269496"}, - {"2c0f:f6d0:a7::/41", "327687"}, - {"2406:f100::/32", "58923"}, - {"240a:a835::/32", "144751"}, - {"2620:12d:2000::/40", "33545"}, - {"2804:24d8::/32", "264244"}, - {"2804:38b0:ff00::/40", "266494"}, - {"2804:826c::/32", "272520"}, - {"2a03:1ae0:1::/48", "59944"}, - {"2c0f:f030:4000::/34", "328137"}, - {"2001:559:8154::/48", "33657"}, - {"2001:67c:1368::/48", "20932"}, - {"2607:fdf8:400::/32", "13649"}, - {"2804:836c::/32", "272197"}, - {"2a00:6a00::/32", "56588"}, - {"2a00:cee1:dcd::/30", "60268"}, - {"2001:9c0::/32", "12902"}, - {"240a:ade5::/32", "146207"}, - {"2600:141b:801::/37", "20940"}, - {"2a00:1160::/29", "5500"}, - {"2a02:26f7:e188::/48", "36183"}, - {"2600:1417:1f::/48", "20940"}, - {"2605:4300:5::/48", "53813"}, - {"2804:22f0::/32", "264133"}, - {"2001:470:11d::/46", "6939"}, - {"2001:67c:734::/48", "198656"}, - {"2001:c20:8800::/34", "3758"}, - {"2401:d800:5570::/40", "7552"}, - {"2401:d800:d010::/42", "7552"}, - {"2407:9e00::/48", "23888"}, - {"2a02:7900::/39", "16154"}, - {"2a03:4920::/32", "42652"}, - {"2a06:6180::/29", "34941"}, - {"2606:1b80::/32", "40864"}, - {"2804:13a8::/32", "263544"}, - {"2804:6534::/32", "269475"}, - {"2a0a:a1c0::/29", "205998"}, - {"2a10:7707:f224::/36", "399975"}, - {"2001:559:8303::/45", "7015"}, - {"2001:67c:225c::/48", "56736"}, - {"2408:8957:8800::/40", "17622"}, - {"2607:fdf8:db::/45", "13649"}, - {"2620:120:c000::/40", "395182"}, - {"2804:7f0::/30", "18881"}, - {"2a03:c9c0::/32", "51752"}, - {"2a05:ce40::/29", "201006"}, - {"2001:250:4018::/38", "23910"}, - {"2409:8a44::/31", "24445"}, - {"2602:808:6000::/40", "1798"}, - {"2620:57:4003::/48", "39122"}, - {"2620:132:b000::/40", "21951"}, - {"2804:664c::/34", "269547"}, - {"2a07:c5c0::/29", "202526"}, - {"2408:8456:e610::/42", "134543"}, - {"2600:1006:b1d0::/42", "6167"}, - {"2804:18b8::/32", "61949"}, - {"2402:b00::/32", "24554"}, - {"2603:c001:250::/37", "31898"}, - {"2620:74:21::/48", "396574"}, - {"2803:53e0::/48", "52468"}, - {"2a00:8620::/32", "200698"}, - {"2001:253:134::/48", "142100"}, - {"2404:e00:265::/48", "15695"}, - {"240a:aa09::/32", "145219"}, - {"240e:e:d800::/31", "4134"}, - {"2606:21c0::/32", "36698"}, - {"2a01:6b40::/32", "198403"}, - {"2a02:ee80:427a::/40", "3573"}, - {"2001:579:b8d4::/39", "22773"}, - {"2402:8200::/32", "9790"}, - {"2a00:1da0:4006::/32", "29591"}, - {"2a06:c3c0:3::/48", "42093"}, - {"2401:d800:79c0::/42", "7552"}, - {"2402:800:9b8d::/43", "7552"}, - {"2600:1015:a120::/35", "6167"}, - {"2801:80:660::/48", "52520"}, - {"2803:b780:22::/32", "27742"}, - {"2a02:26f7:c080::/48", "36183"}, - {"2a02:26f7:e705::/46", "20940"}, - {"2a02:e0c0:2c00::/38", "9100"}, - {"2001:559:86aa::/48", "33491"}, - {"2001:1248:a4d2::/47", "11172"}, - {"2001:4998:1d::/46", "10310"}, - {"2402:9800::/34", "38158"}, - {"240a:af18::/32", "146514"}, - {"240e:982:e400::/35", "4134"}, - {"2a02:26f7:d80d::/42", "20940"}, - {"2a07:ca07::/32", "35048"}, - {"2a0f:ca87:2::/48", "211944"}, - {"2408:8459:ec30::/41", "17622"}, - {"2604:9cc0::/48", "201106"}, - {"2604:ca00:f024::/46", "36492"}, - {"2804:7ef4::/32", "271657"}, - {"2a01:5042:b::/48", "202196"}, - {"2001:559:8657::/48", "7922"}, - {"2602:feb4:d0::/44", "25961"}, - {"2604:240:1::/48", "33724"}, - {"2606:bc00::/33", "19419"}, - {"2a0b:bd00::/29", "208861"}, - {"2400:7400:e036::/48", "23736"}, - {"2602:fed2:712e::/48", "206607"}, - {"2604:d600:123f::/41", "32098"}, - {"2605:ff40::/32", "13837"}, - {"2a02:df40::/48", "61347"}, - {"2001:559:c473::/45", "7015"}, - {"2001:df0:f800::/48", "58397"}, - {"2001:4878:c228::/48", "12222"}, - {"2804:3034:280::/32", "264936"}, - {"2804:6350::/32", "269353"}, - {"2a02:b8::/38", "25273"}, - {"2a0a:4dc0:1::/48", "206168"}, - {"2001:67c:b4::/48", "16509"}, - {"2402:3a80:c071::/46", "38266"}, - {"2602:fde5::/42", "393424"}, - {"2a02:26f7:11::/48", "20940"}, - {"2a02:26f7:e944::/48", "36183"}, - {"2a05:6300::/29", "201341"}, - {"2402:ef03:100::/34", "7633"}, - {"2409:8b29::/27", "9808"}, - {"2a02:26f7:cb45::/46", "20940"}, - {"2a04:6ec0::/29", "197637"}, - {"2a05:1700:2::/47", "56577"}, - {"2a0b:640::/46", "35236"}, - {"2a0d:b201:8000::/42", "206026"}, - {"240e:17:3800::/37", "139220"}, - {"240e:45c:b200::/40", "131285"}, - {"2600:1402:b801::/33", "20940"}, - {"2600:370f:33ce::/37", "32261"}, - {"2804:1c44::/36", "61645"}, - {"2a00:8b60::/32", "8440"}, - {"2c0f:7900::/32", "328935"}, - {"2001:1248:57bf::/41", "11172"}, - {"2001:4490:da70::/46", "9829"}, - {"240a:aa7d::/32", "145335"}, - {"2607:fe00::/35", "30689"}, - {"2804:c5c::/32", "262318"}, - {"2a0f:d9c0::/29", "205544"}, - {"2a0f:f4c0::/32", "43380"}, - {"2400:cb00:210::/46", "13335"}, - {"2404:d680::/32", "132111"}, - {"240a:a85f::/32", "144793"}, - {"240e:3bf:d000::/36", "134772"}, - {"2a02:5320:900::/40", "12189"}, - {"2804:6a2c::/32", "270317"}, - {"2806:2f0:5243::/42", "17072"}, - {"2a00:1851::/34", "29357"}, - {"2408:84f3:de40::/39", "17816"}, - {"240a:af34::/32", "146542"}, - {"2600:6c38:1eb::/43", "20115"}, - {"2806:2f0:4323::/41", "17072"}, - {"2600:1488:60c1::/46", "20940"}, - {"2804:b0::/32", "22431"}, - {"2a06:dd40::/46", "203416"}, - {"2001:1248:550c::/43", "11172"}, - {"2a00:8c60:a::/47", "60706"}, - {"2a02:228::/29", "25400"}, - {"2a03:2880:f15f::/42", "32934"}, - {"2001:678:490::/48", "12843"}, - {"240a:a215::/32", "143183"}, - {"2606:18c0:1::/48", "42831"}, - {"2a02:26f7:ee::/48", "36183"}, - {"2a0b:c1c0::/29", "42580"}, - {"2a0e:aa07:e035::/48", "208679"}, - {"2402:5300:407::/42", "45903"}, - {"2a04:5680::/29", "197790"}, - {"2406:da70:8000::/40", "16509"}, - {"240a:ae7e::/32", "146360"}, - {"2806:370:6110::/40", "28403"}, - {"2402:800:5663::/43", "7552"}, - {"2402:800:7c50::/42", "7552"}, - {"2606:45c0::/32", "26073"}, - {"2620:8c:4000::/48", "54054"}, - {"2804:fa0::/32", "263596"}, - {"2a02:26f7:cac0::/48", "36183"}, - {"2001:e30:1800::/40", "2697"}, - {"2408:8459:f050::/39", "17816"}, - {"2607:f0d0:2a00::/32", "36351"}, - {"2800:480:ff50::/48", "14080"}, - {"2a12:9080::/29", "210429"}, - {"2001:470:159::/32", "6939"}, - {"2001:559:30b::/48", "33491"}, - {"2001:559:801e::/48", "33650"}, - {"2001:ac8:d::/42", "9009"}, - {"2400:6880::/34", "9652"}, - {"2402:800:7690::/42", "7552"}, - {"2001:16a2:7200::/39", "39386"}, - {"2001:44c8:40ff::/39", "131445"}, - {"2400:5200:403::/45", "55410"}, - {"2403:b100:cd00::/34", "9989"}, - {"2804:2e84:10::/40", "265350"}, - {"2a01:6240::/43", "58273"}, - {"2a05:1083::/47", "147028"}, - {"2606:b400:8004::/48", "792"}, - {"2800:160:1a2f::/43", "14259"}, - {"2804:14d:8481::/44", "28573"}, - {"2a0a:bf40::/36", "205943"}, - {"2001:559:8087::/48", "33651"}, - {"2001:678:1::/48", "25192"}, - {"240a:a842::/32", "144764"}, - {"240e:6:d130::/44", "140083"}, - {"2a00:1288:ef85::/43", "10310"}, - {"2001:7a8::/37", "13193"}, - {"2001:c20:4849::/48", "9255"}, - {"2405:b900:5570::/48", "55701"}, - {"2409:8053:2::/40", "56047"}, - {"2607:fdf0:5ea2::/45", "8008"}, - {"2801:80:25b0::/48", "268014"}, - {"2a02:26f7:d904::/48", "36183"}, - {"2001:da8:b0::/48", "24355"}, - {"2404:bf40:c002::/45", "7545"}, - {"2801:132::/44", "19429"}, - {"2803:1740::/32", "36511"}, - {"2a02:26f7:d384::/48", "36183"}, - {"2a00:f30::/48", "12418"}, - {"2401:d800:7a80::/42", "7552"}, - {"240a:a847::/32", "144769"}, - {"240e:966:ea00::/39", "133776"}, - {"2604:d980::/32", "54235"}, - {"2a09:be40:1700::/40", "208029"}, - {"2a0e:c980::/32", "34393"}, - {"240a:a310::/32", "143434"}, - {"2a02:f8::/32", "28929"}, - {"2407:e400:b000::/33", "18390"}, - {"240e:3b3:c000::/37", "140315"}, - {"2804:37a8:1213::/48", "65004"}, - {"2001:501:b1f9::/48", "396566"}, - {"2001:559:5e6::/48", "22909"}, - {"2001:df4:9480::/48", "140748"}, - {"2604:8200:1::/48", "23089"}, - {"2620:12f:c000::/46", "395831"}, - {"2804:1b2:f100::/47", "18881"}, - {"2804:b10::/32", "52936"}, - {"2409:4000::/31", "55836"}, - {"2001:559:5ed::/46", "33287"}, - {"2806:230:4022::/48", "265594"}, - {"2401:b180:4101::/34", "37963"}, - {"2402:9d80:840::/43", "131429"}, - {"2406:e1c0:201::/39", "141459"}, - {"2408:84f3::/34", "17816"}, - {"2409:8904:4360::/37", "24547"}, - {"240a:a9df::/32", "145177"}, - {"240a:adcb::/32", "146181"}, - {"2a00:5760::/32", "61012"}, - {"2a0b:a4c0::/29", "212238"}, - {"2001:559:1f2::/48", "7922"}, - {"2603:c012:8000::/36", "31898"}, - {"2803:f00:49c::/41", "262182"}, - {"2a04:a142::/32", "20473"}, - {"2001:48b8::/32", "19517"}, - {"2403:d300:2800::/32", "15932"}, - {"240e:44d:2c80::/41", "4134"}, - {"2804:5e48:ff40::/46", "269023"}, - {"2a05:2200::/29", "54058"}, - {"2a0a:6040:ac97::/29", "61138"}, - {"2a10:2f00:17d::/48", "208893"}, - {"2001:559:11a::/47", "7016"}, - {"2a0d:d400::/29", "12748"}, - {"2001:559:8343::/48", "33652"}, - {"2001:678:18c::/48", "202928"}, - {"2001:df4:fc00::/48", "136557"}, - {"2402:3a80:19e0::/43", "38266"}, - {"2606:2800:e000::/45", "14210"}, - {"2800:160:2083::/41", "14259"}, - {"2a02:26f7:f680::/48", "36183"}, - {"2620:107:9031::/48", "22787"}, - {"2804:f8c:9000::/33", "263591"}, - {"2804:2b44:12::/42", "265144"}, - {"2804:34b8::/32", "265475"}, - {"2001:428:b27::/37", "209"}, - {"2605:ccc0::/32", "394209"}, - {"2803:f00:440::/40", "262182"}, - {"2804:7594::/32", "271056"}, - {"2a02:26f0:ed::/43", "20940"}, - {"2a02:ee80:429e::/42", "3573"}, - {"2400:cc00:8500::/36", "17477"}, - {"2600:1407:5801::/34", "20940"}, - {"2620:13c:e000::/48", "19382"}, - {"2a03:e2c0::/32", "205125"}, - {"2a0b:85c0::/32", "32338"}, - {"2001:dce:8000::/48", "45285"}, - {"2409:8054:9::/45", "56040"}, - {"2804:214:4018::/47", "26615"}, - {"2804:58a4::/32", "268141"}, - {"2a04:c442::/33", "10725"}, - {"2a06:1287:3000::/44", "34549"}, - {"2a0b:4940::/29", "205699"}, - {"2a0f:d980::/32", "1152"}, - {"2600:1002:a000::/44", "6167"}, - {"2806:2f0:47a1::/41", "17072"}, - {"2a0a:c080::/29", "51546"}, - {"2409:8075::/30", "9808"}, - {"240e:804:a0::/39", "4134"}, - {"2605:9480:1300::/40", "31775"}, - {"2804:3eb4::/32", "266616"}, - {"2a01:be60::/32", "31458"}, - {"2001:559:389::/48", "22258"}, - {"2001:c20:4875::/46", "3758"}, - {"2001:df6:a480::/48", "141815"}, - {"240e:a7:7fc3::/45", "140509"}, - {"2610:130:1900::/37", "6122"}, - {"2804:3478::/32", "262450"}, - {"2402:6940:407::/40", "7645"}, - {"240a:afdc::/32", "146710"}, - {"2801:80:1ce0::/44", "266604"}, - {"2a00:5f00::/32", "51055"}, - {"2a01:c50f:4040::/39", "12479"}, - {"2a01:c50f:fd80::/38", "12479"}, - {"2a02:530::/43", "21191"}, - {"2a02:e5c0::/29", "51219"}, - {"2001:da8:b7::/48", "24365"}, - {"2408:8256:3997::/44", "17623"}, - {"2a01:110:8068::/48", "3598"}, - {"2a02:fc0::/29", "42428"}, - {"2a02:26f7:cf89::/46", "20940"}, - {"2400:cb00:348::/47", "132892"}, - {"240a:a58c::/32", "144070"}, - {"2604:5b00::/32", "19024"}, - {"2a02:360::/32", "42804"}, - {"2001:559:4ea::/45", "7015"}, - {"2001:57a:a801::/38", "22773"}, - {"2806:2f0:4543::/42", "17072"}, - {"2a02:d480:280::/32", "680"}, - {"2a04:1500::/29", "61026"}, - {"2a0a:441:1::/48", "47692"}, - {"240a:a518::/32", "143954"}, - {"2600:8000::/26", "29992"}, - {"2001:4200:5001::/34", "2018"}, - {"2001:44b8:3090::/48", "7545"}, - {"2604:2680:8::/48", "2386"}, - {"2a00:1dd0::/29", "719"}, - {"2a02:26f7:3c::/48", "36183"}, - {"2a02:26f7:c405::/46", "20940"}, - {"2001:df0:2a00::/48", "63731"}, - {"2001:19e8:8900::/48", "4046"}, - {"240e:982:6100::/40", "138982"}, - {"2607:fdf0:5e2a::/43", "8008"}, - {"2804:10f0::/32", "17108"}, - {"2a02:367:4044::/48", "42804"}, - {"240a:a357::/32", "143505"}, - {"240a:aa6d::/32", "145319"}, - {"2605:a404:50e::/42", "33363"}, - {"2400:b000:eee::/48", "23862"}, - {"2403:8000:10::/48", "18007"}, - {"2a0c:c8c0::/47", "202315"}, - {"2804:1128::/32", "263661"}, - {"2a00:a7a0:2000::/48", "60212"}, - {"2a0a:6e00:49::/48", "207098"}, - {"2a0e:abc0::/29", "197706"}, - {"2001:559:26d::/48", "7015"}, - {"2a0a:9302::/32", "35196"}, - {"2001:559:81a6::/48", "33660"}, - {"2804:6948::/32", "270260"}, - {"2a02:26f7:14::/48", "36183"}, - {"2a11:38c0::/29", "1152"}, - {"2001:559:8314::/48", "7922"}, - {"2400:ebc0::/32", "59022"}, - {"2402:a300:4000::/36", "55427"}, - {"240e:982:8200::/40", "133776"}, - {"2604:880:241::/42", "29802"}, - {"2001:4c8:100e::/43", "15290"}, - {"2001:559:2ec::/48", "7016"}, - {"2001:559:c2d8::/48", "33287"}, - {"2001:678:528::/48", "25126"}, - {"2407:6bc0::/32", "63981"}, - {"2408:8459:6250::/37", "17816"}, - {"2a00:13b7::/48", "34762"}, - {"2a00:b9a0::/32", "198872"}, - {"2a0a:dc00::/30", "51262"}, - {"2001:550:3402::/48", "398355"}, - {"2402:800:36c5::/43", "7552"}, - {"2409:8924:a500::/38", "56046"}, - {"2602:fc9b::/36", "26795"}, - {"2606:2800:4a94::/46", "15133"}, - {"2a02:28:7::/48", "60490"}, - {"2a02:26f7:e519::/42", "20940"}, - {"2602:fd7d:420::/40", "16925"}, - {"2804:1790::/32", "53085"}, - {"2001:250:2428::/48", "23910"}, - {"2001:12f0:3e::/38", "1916"}, - {"2606:6780:6::/48", "20324"}, - {"2620:15:e000::/48", "396079"}, - {"2a11:200::/29", "208861"}, - {"2001:648:2330::/48", "9069"}, - {"2600:1411:2001::/33", "20940"}, - {"2803:7200:800a::/47", "27696"}, - {"2804:7adc::/33", "262674"}, - {"2001:559:5d5::/48", "33659"}, - {"240e:108:1153::/45", "149178"}, - {"2a0f:1e80::/31", "30633"}, - {"2a0f:9400:7100::/40", "53356"}, - {"2001:388:5070::/48", "7573"}, - {"2607:ad80::/32", "395558"}, - {"2804:431:a000::/35", "27699"}, - {"2a02:26f7:c641::/46", "20940"}, - {"2a02:26f7:c68b::/48", "20940"}, - {"2a02:26f7:dc01::/46", "20940"}, - {"2a11:8040::/29", "209551"}, - {"2001:c20:48b3::/45", "3758"}, - {"2406:840:c0a8::/48", "139317"}, - {"240e:3bb:1400::/38", "134773"}, - {"2801:14:e800::/48", "271877"}, - {"2804:4b58::/32", "267299"}, - {"2a00:16c8:10c::/48", "3257"}, - {"2a09:5f80:2::/47", "48038"}, - {"2001:559:506::/48", "7922"}, - {"2604:5140::/32", "396316"}, - {"2606:ed00:5::/46", "47869"}, - {"2a0e:97c0:661::/45", "56758"}, - {"2a0f:3100::/32", "47596"}, - {"2001:668:123::/40", "3257"}, - {"2607:fb10:5084::/42", "2906"}, - {"2804:14d:90b4::/41", "28573"}, - {"2c0f:eb00:1400::/39", "61266"}, - {"2804:40d8::/32", "265985"}, - {"2806:1018::/32", "8151"}, - {"2a07:a343:cc70::/44", "136620"}, - {"2406:2000:99::/46", "10310"}, - {"2408:8456:ca40::/40", "17816"}, - {"2804:145c:c610::/42", "263327"}, - {"2a00:1cb8:2:4::/60", "12713"}, - {"2a00:4802:2a00::/44", "13124"}, - {"2a05:bf81::/32", "50352"}, - {"2001:559:200::/48", "33659"}, - {"2600:a00::/31", "16904"}, - {"2804:b18:81::/45", "52941"}, - {"2a0d:5641:2100::/44", "57695"}, - {"2001:67c:15c::/48", "34387"}, - {"2001:dc7:2dff::/48", "24406"}, - {"2400:8000:7::/44", "4800"}, - {"2401:4900:1c06::/44", "24560"}, - {"2408:8720::/30", "4837"}, - {"2409:804e:100::/36", "9808"}, - {"2606:4f00:a::/48", "19324"}, - {"2620:119:5041::/46", "13443"}, - {"2800:190:110::/37", "11664"}, - {"2803:4700::/31", "28073"}, - {"2001:1248:987f::/40", "11172"}, - {"240e:438:4a40::/37", "4134"}, - {"2806:20d:5066::/43", "32098"}, - {"2806:2f0:32e3::/39", "17072"}, - {"2a06:98c1:3100::/44", "13335"}, - {"2c0f:7200::/32", "37219"}, - {"2001:559:806e::/47", "7922"}, - {"2001:da8:23b::/48", "24349"}, - {"240a:af48::/32", "146562"}, - {"2600:1001:f100::/44", "6167"}, - {"2602:fc1d::/47", "7720"}, - {"2001:500:30::/48", "7018"}, - {"2001:5002:300:2::/27", "1273"}, - {"2404:bf40:81c0::/47", "7545"}, - {"240a:a1a6::/32", "143072"}, - {"240e:44d:5d80::/41", "4134"}, - {"2600:1419:c01::/38", "20940"}, - {"2a02:2e02:9230::/40", "12479"}, - {"2a09:2942::/31", "209898"}, - {"2409:8904:6840::/42", "24547"}, - {"2602:ffb7:f00::/40", "62874"}, - {"2620:73:2000::/48", "33491"}, - {"2804:76f0::/32", "271144"}, - {"2806:230:1030::/48", "265594"}, - {"2402:ee40:60::/40", "17754"}, - {"2408:8256:3180::/44", "17623"}, - {"2620:74:49::/45", "7342"}, - {"2804:225c::/36", "264093"}, - {"2804:7be8:c000::/45", "271462"}, - {"2404:2d00::/32", "55900"}, - {"240e:44d:4e00::/41", "140345"}, - {"2801:13:b000::/48", "64109"}, - {"2a04:c1::/30", "47123"}, - {"2a05:8440::/29", "31708"}, - {"2001:7f8:46::/48", "51988"}, - {"2401:be00:6::/32", "55641"}, - {"240a:a00d::/32", "142663"}, - {"2600:6c10:f405::/44", "20115"}, - {"2a02:760::/29", "29468"}, - {"2001:da8:b011::/46", "24371"}, - {"2600:9000:2304::/44", "16509"}, - {"2602:ff50::/40", "63452"}, - {"2409:8008:900::/35", "24547"}, - {"2600:8807:89a6::/44", "22773"}, - {"2a02:26f7:93::/48", "20940"}, - {"240a:a185::/32", "143039"}, - {"2001:df0:2240::/48", "149053"}, - {"2401:5e40:2000::/32", "63770"}, - {"240a:a29e::/32", "143320"}, - {"240a:a63f::/32", "144249"}, - {"240e:108:13f0::/31", "4134"}, - {"2605:66c5::/30", "53820"}, - {"2607:f4a8::/34", "803"}, - {"2803:9a40:d000::/34", "263824"}, - {"2001:e60:87a8::/43", "4766"}, - {"240a:ad07::/32", "145985"}, - {"2605:3380:42f8::/48", "12025"}, - {"2803:29a0::/32", "267710"}, - {"2804:2f9c::/32", "264902"}, - {"2a02:d540::/29", "199659"}, - {"2400:54a0::/48", "149476"}, - {"2402:6a40::/46", "135718"}, - {"2604:4940::/32", "62516"}, - {"2001:43f8:c90::/48", "328374"}, - {"2804:4f80:1001::/48", "268330"}, - {"2a09:7:2009::/48", "208982"}, - {"2001:410:101::/48", "6509"}, - {"2001:559:8676::/48", "33287"}, - {"2402:800:3b63::/43", "7552"}, - {"2803:2180:1c::/47", "27941"}, - {"2804:a38::/32", "263035"}, - {"2a02:26f7:e915::/42", "20940"}, - {"2a05:fa82::/29", "202139"}, - {"2001:da8:7031::/44", "24363"}, - {"240e:30f:4a00::/35", "137688"}, - {"2600:802:101::/37", "701"}, - {"2800:bf0:1ca::/47", "27947"}, - {"2804:2f30:6c40::/40", "53096"}, - {"2a0f:e600::/47", "60781"}, - {"2001:b00::/32", "12874"}, - {"2402:800:7e00::/42", "7552"}, - {"240a:a27a::/32", "143284"}, - {"240e:bf:b8f8::/46", "138409"}, - {"240e:85c:40::/44", "131285"}, - {"2600:100a:a000::/44", "6167"}, - {"2600:1010:ff10::/40", "22394"}, - {"2620:1e8:1::/48", "29802"}, - {"2804:37f0:7900::/32", "266445"}, - {"2a01:7e80::/39", "197990"}, - {"2c0f:e00::/31", "36924"}, - {"2408:8256:339f::/37", "17816"}, - {"2800:160:1938::/41", "14259"}, - {"2a07:b8c3::/45", "14043"}, - {"2001:559:4e2::/48", "7922"}, - {"2600:1005:f010::/40", "22394"}, - {"2606:2800:4262::/44", "15133"}, - {"2a10:cc42:1000::/40", "20473"}, - {"2001:559:8012::/48", "33662"}, - {"240a:a208::/32", "143170"}, - {"2804:e00::/33", "11419"}, - {"2804:4cc0::/32", "267389"}, - {"2a0c:9a47:20::/48", "209533"}, - {"2607:f740:e00b::/48", "63911"}, - {"2a03:7380:7380::/42", "13188"}, - {"2a06:e881:3900::/44", "204624"}, - {"2a0b:f6c0::/48", "203339"}, - {"2a02:26f0:801::/38", "20940"}, - {"2a07:dc00:180::/44", "29997"}, - {"2a0e:97c0:1d0::/47", "211337"}, - {"2001:418:1401:6a::/64", "20940"}, - {"2404:bf40:8641::/45", "7545"}, - {"2405:cc40::/32", "135690"}, - {"240a:af67::/32", "146593"}, - {"2600:1010:d1d0::/36", "22394"}, - {"2608:4162:1::/48", "27065"}, - {"2001:559:87f5::/48", "33657"}, - {"2607:fc48:438::/48", "40009"}, - {"2a02:4c8::/40", "9070"}, - {"2001:559:37b::/48", "7922"}, - {"2406:f380::/32", "398109"}, - {"240a:a5b4::/32", "144110"}, - {"2001:559:c293::/48", "7015"}, - {"2001:648:2cef::/48", "199399"}, - {"2001:da8:a023::/44", "24352"}, - {"2600:6:ff00::/45", "10507"}, - {"2804:5878::/32", "268131"}, - {"2a0d:4a00:d000::/34", "29148"}, - {"2001:250:2826::/44", "138378"}, - {"2001:fd8:34c0::/42", "132199"}, - {"2a0e:b107:dd0::/44", "212508"}, - {"2001:559:81c9::/48", "33662"}, - {"2001:13c7:600b::/48", "52360"}, - {"2409:4056:3000::/26", "55836"}, - {"2604:7a00::/32", "11232"}, - {"2604:e440::/32", "19523"}, - {"2605:8d80:3368::/32", "812"}, - {"2605:a404:41::/44", "33363"}, - {"2620:f4:8000::/48", "54652"}, - {"2804:2270::/32", "264100"}, - {"2806:20d:1605::/46", "32098"}, - {"2a02:26f7:f94c::/48", "36183"}, - {"2a03:2260:4000::/30", "201701"}, - {"2a05:91c2::/48", "57640"}, - {"2001:559:87e9::/45", "7015"}, - {"2001:559:c304::/48", "33287"}, - {"2404:3d00:40ea::/47", "3573"}, - {"2800:bf0:2a43::/42", "27947"}, - {"2400:89c0:1010::/42", "4808"}, - {"2401:d800:d510::/42", "7552"}, - {"2405:f980::/48", "135905"}, - {"2600:1480:e801::/37", "20940"}, - {"2605:8480::/32", "11472"}, - {"2a0a:73c0::/29", "207006"}, - {"2a0b:21c0:1000::/34", "21859"}, - {"2600:6c10:c18::/42", "20115"}, - {"2806:230:500c::/48", "265594"}, - {"2806:2f0:2082::/48", "17072"}, - {"2a00:10c8::/32", "12835"}, - {"2001:4490:dc4c::/46", "9829"}, - {"2408:80f1:110::/42", "138421"}, - {"2001:559:3a7::/48", "33651"}, - {"2001:df5:fb00::/48", "135495"}, - {"2408:8256:3d76::/44", "17623"}, - {"2409:8c85:aa04::/48", "24547"}, - {"240a:a140::/32", "142970"}, - {"2a00:86c0:2088::/47", "2906"}, - {"2a02:26f7:c0c1::/46", "20940"}, - {"2600:370f:71c3::/42", "32261"}, - {"2801:1c0::/39", "52424"}, - {"2a02:d6c0::/29", "34524"}, - {"2a06:86c0::/29", "3213"}, - {"2402:800:2100::/35", "7552"}, - {"2402:4440:8f00::/35", "24423"}, - {"2a01:367::/32", "30823"}, - {"240a:a467::/32", "143777"}, - {"2804:20fc:1a00::/39", "264525"}, - {"2a02:5a0::/29", "9063"}, - {"2001:559:8216::/48", "33652"}, - {"2804:2e50::/32", "265338"}, - {"2804:5df8::/32", "269004"}, - {"2a00:f660::/32", "42442"}, - {"2a09:2dc1::/32", "43641"}, - {"2401:8d00:2::/48", "24149"}, - {"240a:a77c::/32", "144566"}, - {"2600:370f:7512::/44", "32261"}, - {"2a05:2500::/32", "31586"}, - {"2a0b:3d00::/30", "48152"}, - {"2001:ee0:9840::/39", "45899"}, - {"2603:603d::/32", "10796"}, - {"2604:dc00:7454::/32", "19752"}, - {"2605:9a00:10::/48", "160"}, - {"2a02:26f7:e909::/46", "20940"}, - {"2a11:f500::/29", "400522"}, - {"2406:300::/32", "3462"}, - {"2600:6c20:20d::/43", "20115"}, - {"2408:80c5::/33", "4837"}, - {"2604:50:8::/48", "393950"}, - {"2605:9cc0:378::/48", "16509"}, - {"2a00:e48:8000::/33", "39787"}, - {"2001:3c8:1010::/47", "4621"}, - {"2400:adc2:600::/39", "9541"}, - {"2607:7c80:c0ff::/34", "64260"}, - {"2804:4774::/32", "267055"}, - {"2804:61b8::/32", "269252"}, - {"2a02:26f7:21::/48", "20940"}, - {"2403:a3c0::/46", "131600"}, - {"2602:806:4002::/48", "14032"}, - {"2602:ff96:15::/46", "40676"}, - {"2a02:ee80:4275::/46", "3573"}, - {"2a04:3e00:1001::/29", "56910"}, - {"2a11:cd40::/48", "210483"}, - {"2001:250:742f::/36", "23910"}, - {"2400:ab80::/32", "133399"}, - {"2406:fd00:800::/40", "24459"}, - {"240a:a1db::/32", "143125"}, - {"2607:8700:109::/48", "25820"}, - {"2620:10c:f004::/48", "33459"}, - {"2804:1cb4::/32", "61670"}, - {"2a00:5a20:2::/34", "199289"}, - {"2a02:26f7:d7::/48", "20940"}, - {"2001:7a0::/32", "15782"}, - {"2001:1248:5b8d::/42", "11172"}, - {"2403:9800:7f1c::/48", "4648"}, - {"2408:840d:7700::/42", "17621"}, - {"2804:27a8::/32", "263915"}, - {"2804:7ae0::/32", "271397"}, - {"2a00:e8c0::/32", "34797"}, - {"2a02:fb00::/29", "44066"}, - {"2a03:f140::/32", "206617"}, - {"2605:4c40::/41", "30081"}, - {"2620:11f:b000::/46", "394514"}, - {"2402:800:57ee::/36", "7552"}, - {"2403:2d00::/46", "17516"}, - {"2403:9800:7d00::/38", "4771"}, - {"240e:5:4000::/34", "17638"}, - {"2a00:f41::/30", "43447"}, - {"2a0b:b86:f8::/48", "3280"}, - {"2408:4009:501::/29", "37963"}, - {"2804:4fa0::/32", "268339"}, - {"2a07:3502:1060::/48", "33915"}, - {"2001:e48:80:1011::/46", "9583"}, - {"2409:8057:3014::/46", "56040"}, - {"2001:559:241::/48", "7725"}, - {"240e:45c:2b00::/40", "137402"}, - {"2806:2f0:24c1::/48", "22884"}, - {"2a02:4d80::/32", "8968"}, - {"2001:559:167::/48", "33652"}, - {"240a:a3eb::/32", "143653"}, - {"2a02:26f7:fbc5::/46", "20940"}, - {"2a0c:8c80::/32", "201808"}, - {"2001:67c:28e4::/48", "15370"}, - {"2001:1b48::/32", "8218"}, - {"2604:2500::/32", "19323"}, - {"2620:11c:f008::/48", "393667"}, - {"2c0f:edf8::/32", "328512"}, - {"2400:cb00:a2b0::/47", "13335"}, - {"240a:a8a6::/32", "144864"}, - {"2a01:8840:22::/45", "12041"}, - {"2a02:26f7:be05::/46", "20940"}, - {"2a0d:f280::/29", "59953"}, - {"2001:559:c2ba::/48", "7725"}, - {"2001:67c:778::/48", "50607"}, - {"2401:c680:2::/44", "133854"}, - {"2606:9a80::/32", "21769"}, - {"2606:b400:8020::/48", "1219"}, - {"2a02:1788::/32", "35838"}, - {"2a03:10c0::/30", "61044"}, - {"2001:da8:a809::/48", "23910"}, - {"2001:4430:c028::/35", "17853"}, - {"2001:44b8:6065::/48", "4739"}, - {"2409:8087:3d00::/33", "9808"}, - {"240a:afab::/32", "146661"}, - {"2800:280:4001::/48", "20940"}, - {"240e:1e:5000::/36", "140315"}, - {"2a0e:4840::/32", "33823"}, - {"2400:3240:9000::/33", "63996"}, - {"2402:ee40:10a::/32", "17754"}, - {"240a:a91e::/32", "144984"}, - {"2804:23c0::/34", "26218"}, - {"2a05:93c0::/29", "7979"}, - {"2407:a600::/36", "18004"}, - {"2607:fe28::/47", "53347"}, - {"2804:41ac::/32", "267449"}, - {"2001:559:83b0::/48", "33659"}, - {"2001:56b:500d::/36", "852"}, - {"2001:1248:59b3::/44", "11172"}, - {"2402:5300:4610::/40", "45903"}, - {"2605:a404:4b::/45", "33363"}, - {"2a0b:ff80::/29", "207980"}, - {"240a:afa6::/32", "146656"}, - {"2a03:4b40:8000::/29", "50710"}, - {"2a03:b280::/36", "29134"}, - {"2001:df0:467::/48", "131893"}, - {"240e:108:11c2::/48", "139220"}, - {"2620:149:5b1::/45", "714"}, - {"2800:bf0:3b40::/47", "52257"}, - {"2a00:f580::/32", "35819"}, - {"2001:67c:258::/48", "29067"}, - {"2401:d800:2bf0::/37", "7552"}, - {"2620:13b:a000::/44", "393657"}, - {"2a04:4e40:bc00::/48", "54113"}, - {"2620:12f:100e::/48", "396279"}, - {"2001:579:cf02::/47", "22773"}, - {"2001:678:acc::/48", "60404"}, - {"2402:6640:24::/43", "134995"}, - {"2804:7f7:c000::/34", "18881"}, - {"2a0b:4d07:259::/48", "44239"}, - {"2a10:ca80::/29", "44592"}, - {"2c0f:f1c8::/32", "37037"}, - {"2001:559:47b::/48", "7015"}, - {"240a:a981::/32", "145083"}, - {"240e:64::/32", "4134"}, - {"2804:41c0::/32", "267454"}, - {"2806:3d5::/32", "270133"}, - {"2a0e:fd45:2ba1::/33", "44103"}, - {"2a10:3600::/32", "8422"}, - {"2001:559:829a::/48", "33657"}, - {"2001:16f8:15::/48", "30870"}, - {"2604:2d80::/40", "30036"}, - {"2803:9ba0::/32", "263750"}, - {"2a10:3980::/29", "397423"}, - {"2606:b400:8824::/46", "14506"}, - {"2607:f110:e060::/39", "21889"}, - {"2804:7708:e000::/35", "271150"}, - {"2a01:7d40::/32", "8620"}, - {"2a02:26f7:ccc8::/48", "36183"}, - {"2a05:45c0::/32", "8193"}, - {"2001:559:4e3::/48", "7016"}, - {"2405:acc0::/32", "139922"}, - {"2620:129:9002::/48", "64262"}, - {"2405:201:ae00::/33", "55836"}, - {"240a:adff::/32", "146233"}, - {"2600:1401:4001::/34", "20940"}, - {"2806:230:2028::/48", "265594"}, - {"2a0f:abc0::/29", "56485"}, - {"2402:800:9971::/44", "7552"}, - {"2608:140:c::/48", "5927"}, - {"2804:5a64::/32", "268770"}, - {"2a02:26f7:e684::/48", "36183"}, - {"2001:559:c059::/48", "7922"}, - {"2600:1002:b0e0::/43", "22394"}, - {"2001:559:53e::/48", "33651"}, - {"2402:3a80:1b68::/40", "38266"}, - {"2405:ecc0::/32", "138293"}, - {"2407:b000:4012::/45", "17819"}, - {"2605:7d80::/32", "16843"}, - {"2804:5920::/32", "268170"}, - {"2001:559:4bb::/48", "33657"}, - {"240a:a9cc::/32", "145158"}, - {"2803:ad80:16::/48", "42473"}, - {"2a0a:c740:2::/48", "204170"}, - {"2001:559:8075::/48", "20214"}, - {"2603:4:1504::/48", "44273"}, - {"2804:6a14::/39", "61601"}, - {"2a00:16e8::/32", "9051"}, - {"2001:559:8136::/48", "7016"}, - {"2401:2700:3::/48", "9286"}, - {"2001:470:14f::/48", "47061"}, - {"2001:559:1ac::/48", "20214"}, - {"240e:3be:9c00::/34", "140310"}, - {"2a0e:bc40::/29", "204860"}, - {"2a0f:1e00:123::/48", "30633"}, - {"2001:1a11:84::/48", "42298"}, - {"2400:1c00:1a::/45", "45143"}, - {"2620:74:a3::/45", "11840"}, - {"2a03:3180::/44", "44453"}, - {"2402:ef2c::/31", "7633"}, - {"2602:febc::/36", "398491"}, - {"2620:10a::/44", "43"}, - {"2800:484:bf00::/40", "10620"}, - {"2a02:26f7:f1c5::/46", "20940"}, - {"2a07:4a00::/29", "50113"}, - {"2a0f:ff00:1337::/44", "213281"}, - {"2c0f:f980:2000::/33", "33763"}, - {"2001:559:48c::/48", "22909"}, - {"2001:978:2401:1::/36", "174"}, - {"2001:448a:7070::/40", "7713"}, - {"2400:9380:98c0::/44", "136167"}, - {"2a00:cb60:2::/32", "49312"}, - {"2a04:a40::/29", "50324"}, - {"240a:a18f::/32", "143049"}, - {"2804:3764:ffff::/48", "266409"}, - {"2a07:f600:4010::/48", "60591"}, - {"2a0c:bc00::/29", "205344"}, - {"2001:559:3b8::/48", "7922"}, - {"2001:df6:a380::/48", "141966"}, - {"2405:70c0::/32", "55736"}, - {"2409:8002:1800::/40", "38019"}, - {"2806:2f0:60a1::/46", "17072"}, - {"2a03:5a00:35::/48", "201717"}, - {"2406:bd00:de00::/48", "55651"}, - {"2a02:2350::/32", "51468"}, - {"2001:504:2e::/48", "10578"}, - {"2001:559:5b1::/48", "22909"}, - {"2407:1e40:fcf::/32", "141732"}, - {"2604:6680::/32", "18853"}, - {"2804:3398::/32", "265406"}, - {"2a02:21c8::/32", "35625"}, - {"2a06:c002::/32", "206766"}, - {"2001:550:1:b::/61", "174"}, - {"2001:ba8::/32", "8943"}, - {"2001:df7:6800:1182::/52", "59194"}, - {"2401:4900:1100::/41", "45609"}, - {"2a02:9d0::/32", "12617"}, - {"2001:559:c46d::/46", "7016"}, - {"2804:57f4:800::/48", "264349"}, - {"2a01:c50f:b780::/36", "12479"}, - {"2001:559:c2da::/48", "33652"}, - {"2001:67c:1968::/48", "24989"}, - {"2603:f260::/24", "397165"}, - {"2605:a401:8385::/41", "33363"}, - {"2a0b:4342:4000::/36", "57578"}, - {"2a11:cb40::/29", "204790"}, - {"2001:67c:22f8::/48", "44770"}, - {"240e:45c:7300::/40", "140532"}, - {"2a00:6140::/32", "200062"}, - {"2a04:4e42:6000::/32", "54113"}, - {"2a0d:5800::/29", "34422"}, - {"240a:aaf9::/32", "145459"}, - {"240e:397:1800::/38", "140493"}, - {"2803:3360::/32", "269794"}, - {"2a05:acc0::/29", "3212"}, - {"2a0b:bbc0:1c00::/40", "58010"}, - {"2001:da8:a80d::/37", "23910"}, - {"240a:a41b::/32", "143701"}, - {"2606:7700:1::/46", "395461"}, - {"2804:67a4:fe01::/39", "269641"}, - {"2408:8459:ae50::/35", "17816"}, - {"2606:4700:5b::/45", "13335"}, - {"2620:125:9005::/46", "397415"}, - {"2801:1c8:200::/42", "19429"}, - {"2a00:e4a0:200:100::/56", "49952"}, - {"2a0f:8340::/29", "29608"}, - {"2001:7f8:e7::/48", "34800"}, - {"2405:eb80:8000::/33", "18351"}, - {"240a:affd::/32", "146743"}, - {"2409:806a:5b00::/37", "9808"}, - {"2409:8c20::/36", "56046"}, - {"240a:acdc::/32", "145942"}, - {"2804:214:15::/33", "26615"}, - {"2804:7f88::/32", "271694"}, - {"2a01:4b40:4802::/37", "21299"}, - {"2408:870c:2060::/36", "17621"}, - {"2600:1419:d001::/37", "20940"}, - {"2a00:4380::/29", "24751"}, - {"2405:1c0:6651::/46", "55303"}, - {"240e:45c:5400::/40", "131285"}, - {"2604:a00:13::/45", "19318"}, - {"2620:117:5000::/40", "14298"}, - {"2800:160:1051::/46", "14259"}, - {"2c0f:f188:8::/32", "28683"}, - {"2001:ee0:3d0::/42", "135905"}, - {"2804:26d4::/32", "263860"}, - {"2001:250:2403::/45", "23910"}, - {"2001:49f0:d0d0::/44", "174"}, - {"2406:2400:ccef::/48", "45287"}, - {"240e:728::/24", "4134"}, - {"2803:1600::/32", "52389"}, - {"240e:44d:1400::/41", "140345"}, - {"2800:370:42::/48", "28006"}, - {"2a05:2ec0::/29", "34580"}, - {"2001:450:2016::/32", "3549"}, - {"240a:af2c::/32", "146534"}, - {"2600:1f12::/36", "8987"}, - {"2a04:4e40:12f0::/48", "54113"}, - {"2408:8256::/41", "17622"}, - {"240e:92c::/30", "4134"}, - {"2804:14fc::/32", "263363"}, - {"2a02:26f7:c9::/48", "20940"}, - {"2400:3b00::/46", "18229"}, - {"2404:bf40:c281::/41", "139084"}, - {"2409:8d5b::/29", "9808"}, - {"2600:1006:b070::/40", "22394"}, - {"2800:160:1336::/44", "14259"}, - {"2804:5260::/32", "268514"}, - {"2806:370:9050::/40", "28403"}, - {"2c0f:ea20::/32", "328526"}, - {"2408:870c:10::/44", "17621"}, - {"2a02:26f7:d6::/48", "36183"}, - {"2a04:e00:14::/46", "54103"}, - {"2001:559:c1c4::/47", "7015"}, - {"2a01:8b20::/32", "42314"}, - {"2a03:85c0:140::/48", "24989"}, - {"2001:559:7b5::/48", "7922"}, - {"2001:559:8155::/48", "33287"}, - {"2402:800:377f::/40", "7552"}, - {"2604:ae00::/46", "7029"}, - {"2001:559:8579::/48", "33491"}, - {"2a03:5a00:7::/48", "61400"}, - {"2600:140b:fc01::/29", "20940"}, - {"2600:1802:3::/45", "16552"}, - {"2804:414::/32", "262760"}, - {"2804:2a64::/32", "262644"}, - {"2001:559:498::/48", "7922"}, - {"2001:19d0:700::/32", "2044"}, - {"2001:4888:803e::/48", "6167"}, - {"2620:1ec:8f8::/45", "8068"}, - {"2804:39d8::/32", "266054"}, - {"2a03:ad00::/29", "8208"}, - {"2a07:4900::/29", "50959"}, - {"2a0d:b201:c0c0::/42", "206026"}, - {"2001:67c:274::/48", "42307"}, - {"2406:57c0:9999::/48", "134672"}, - {"2407:cbc0::/48", "140824"}, - {"2409:805c:30f1::/44", "9808"}, - {"2602:feda:b99::/46", "212995"}, - {"2804:14d:baa3::/45", "28573"}, - {"2a0d:eb00::/31", "204880"}, - {"2001:1900:5:2:2:0:c:2284/34", "3356"}, - {"2404:bf40:a181::/48", "2764"}, - {"2600:6c10:f606::/47", "20115"}, - {"2801:c4:50::/48", "28519"}, - {"2a06:1b00:108::/32", "8302"}, - {"2001:559:47c::/48", "33287"}, - {"2400:3360::/48", "140766"}, - {"2401:c280::/32", "9752"}, - {"240a:aacd::/32", "145415"}, - {"240e:908:8200::/29", "4134"}, - {"2605:5640:3000::/36", "25635"}, - {"2804:5ea0::/32", "269046"}, - {"2001:559:844f::/48", "7016"}, - {"2001:fd0:201::/39", "10029"}, - {"2401:d800:22f0::/39", "7552"}, - {"2a01:6400::/32", "21430"}, - {"2a0b:8540::/29", "205572"}, - {"2001:978:501::/38", "174"}, - {"2401:4900:5930::/40", "45609"}, - {"2600:1003:b8d0::/44", "6167"}, - {"2804:1a14::/34", "28153"}, - {"2806:263:8300::/37", "13999"}, - {"2a10:a9c0::/29", "212144"}, - {"2409:8d39::/25", "9808"}, - {"2607:fb91:be00::/28", "21928"}, - {"2610:128:9600::/33", "11686"}, - {"2804:4508::/32", "267668"}, - {"2a02:5320:700::/40", "12189"}, - {"2a0a:90c0:1051::/45", "205080"}, - {"2403:7940:fcd0::/47", "33353"}, - {"2804:1398:8000::/33", "263541"}, - {"2804:69d0::/32", "270293"}, - {"2a02:26f7:e141::/46", "20940"}, - {"2a0e:fd45:1000::/48", "207852"}, - {"2a0f:9400:780d::/43", "147028"}, - {"2001:559:38a::/48", "33287"}, - {"2401:c3c0::/32", "136972"}, - {"2804:8110::/33", "272429"}, - {"2a02:26f7:e105::/46", "20940"}, - {"2400:cb00:a410::/45", "13335"}, - {"2408:8957:4a00::/40", "17622"}, - {"2607:f5f0::/32", "5739"}, - {"2a04:4e40:610::/44", "54113"}, - {"2a10:be40:1::/48", "20799"}, - {"2803:cb00::/32", "26619"}, - {"2001:67c:164::/48", "49866"}, - {"2408:840c:c700::/40", "17621"}, - {"2801:1b:2800::/48", "270074"}, - {"2804:6490::/32", "269435"}, - {"2a02:67e0::/34", "203148"}, - {"2a03:9480::/32", "42442"}, - {"2a0d:e841::/32", "35913"}, - {"2001:67c:4ac::/48", "198692"}, - {"2600:140f:7400::/48", "9498"}, - {"2602:fbac::/36", "400523"}, - {"2001:67c:2e74::/48", "60396"}, - {"2409:8d7f::/24", "9808"}, - {"240a:a432::/32", "143724"}, - {"240e:678:2600::/32", "4134"}, - {"2605:3b00::/36", "36146"}, - {"2407:9802:f000::/29", "10139"}, - {"2409:8750:f400::/31", "56047"}, - {"2a02:26f7:cbc4::/48", "36183"}, - {"2001:da8:900d::/48", "23910"}, - {"2001:4878:a204::/48", "12222"}, - {"2403:1cc0:1101::/46", "45352"}, - {"2001:67c:12f0::/48", "12843"}, - {"2001:df0:e400::/48", "133661"}, - {"240e:438:9220::/43", "140647"}, - {"2607:ff60:5003::/34", "3900"}, - {"2804:75c::/32", "262637"}, - {"2a0f:ca83:1337::/48", "208046"}, - {"2001:da8:8032::/47", "24364"}, - {"2001:48a8:68f8::/45", "237"}, - {"240a:af1c::/32", "146518"}, - {"240e:982:e200::/40", "4816"}, - {"2a02:b70::/32", "48972"}, - {"2a03:3cc0::/29", "50596"}, - {"2001:668:121::/46", "54040"}, - {"2804:6fc:c100::/36", "28158"}, - {"2804:2d80:b00d::/33", "262378"}, - {"2a06:1287:3::/48", "135103"}, - {"2a0f:c240::/29", "21488"}, - {"2a12:b580::/29", "60135"}, - {"2001:559:4ae::/43", "7922"}, - {"2001:559:54c::/47", "21508"}, - {"2402:800:950f::/43", "7552"}, - {"2402:3a80:500::/41", "38266"}, - {"2402:e280:300::/48", "134674"}, - {"2408:8000:a017::/48", "140717"}, - {"2605:e680::/32", "30500"}, - {"2804:3774::/34", "266416"}, - {"2409:800c::/34", "56042"}, - {"240a:aee9::/32", "146467"}, - {"2600:1012:b090::/41", "22394"}, - {"2804:2e0::/32", "28233"}, - {"2804:50c8::/32", "268410"}, - {"2001:559:c3d8::/48", "7016"}, - {"2406:6e00:f03a::/48", "55517"}, - {"240e:45c:2800::/40", "131285"}, - {"2604:d600:618::/45", "32098"}, - {"2804:214:8440::/43", "26615"}, - {"2a01:190:15ef::/48", "44753"}, - {"2402:800:920f::/43", "7552"}, - {"240a:a5f9::/32", "144179"}, - {"2600:140f:2c00::/48", "9498"}, - {"2804:4ae0::/47", "267269"}, - {"2a04:4e42:4058::/35", "54113"}, - {"2001:b08:8::/48", "59714"}, - {"2406:840:f893::/48", "212034"}, - {"2806:2a0:34::/40", "28548"}, - {"2a02:830::/32", "8426"}, - {"2a04:4e40:f400::/48", "54113"}, - {"2400:cb00:427::/48", "13335"}, - {"2406:57c0:128::/47", "134672"}, - {"240a:aa02::/32", "145212"}, - {"240a:ae4f::/32", "146313"}, - {"2804:3dc0::/32", "266551"}, - {"2a00:74c0::/32", "6659"}, - {"2001:1900:236b::/45", "3356"}, - {"2402:800:53ee::/37", "7552"}, - {"2405:be00::/32", "18148"}, - {"2a02:26f7:b9a5::/46", "20940"}, - {"2401:ee00:202::/37", "23951"}, - {"2606:c0:1::/48", "18450"}, - {"2804:11a4::/32", "53243"}, - {"2a00:1370:f201::/36", "25513"}, - {"2a03:5640:f303::/37", "2906"}, - {"2a0d:3842:1270::/48", "57629"}, - {"2001:1218:6047::/44", "278"}, - {"2a02:26f7:dcc5::/46", "20940"}, - {"240a:a593::/32", "144077"}, - {"2804:1444::/32", "263322"}, - {"2a03:ad40:110::/48", "199349"}, - {"2604:f80:5::/32", "22458"}, - {"2a0c:a340::/29", "50673"}, - {"2a0e:d800::/29", "209110"}, - {"2604:880:6e::/48", "394727"}, - {"2800:110:3805::/37", "4270"}, - {"2a00:1800::/32", "57728"}, - {"2a02:ed0::/34", "47956"}, - {"2a02:2640::/32", "2119"}, - {"2a09:9740::/48", "50007"}, - {"2408:8256:3d7f::/48", "17816"}, - {"2600:1012:b0d0::/42", "6167"}, - {"2a01:6340::/29", "60404"}, - {"2a06:6940::/29", "20559"}, - {"2607:f5c0:8041::/33", "10326"}, - {"2a07:5980::/29", "204601"}, - {"2400:dcc0:a504::/38", "38631"}, - {"2804:3320::/32", "265374"}, - {"2a02:26f7:c508::/48", "36183"}, - {"2a02:26f7:db09::/46", "20940"}, - {"2604:d600:15fe::/38", "32098"}, - {"2801:17:2800::/48", "13489"}, - {"2a05:4200::/47", "21534"}, - {"2001:559:172::/48", "33662"}, - {"2001:559:c3e3::/48", "7015"}, - {"240a:a0b8::/32", "142834"}, - {"240a:a80b::/32", "144709"}, - {"2600:1488:6461::/40", "20940"}, - {"2600:9000:1156::/44", "16509"}, - {"2400:a980:2900::/37", "133111"}, - {"2600:141c:d001::/34", "20940"}, - {"2804:137c::/32", "26609"}, - {"2001:da8:3050::/48", "24358"}, - {"240a:a06e::/32", "142760"}, - {"240a:a21d::/32", "143191"}, - {"2604:af80:2448::/36", "18859"}, - {"2800:b40:10::/48", "262220"}, - {"2806:230:200d::/48", "11888"}, - {"2405:4800:101::/35", "18403"}, - {"2604:1280:1::/46", "11696"}, - {"2800:320:840e::/47", "27882"}, - {"2a01:b747:12a::/41", "714"}, - {"2a09:3b40::/29", "57773"}, - {"2408:8957:9900::/40", "17816"}, - {"2409:8914:c400::/39", "56044"}, - {"2602:fed2:7709::/48", "23470"}, - {"2401:4900:3100::/41", "45609"}, - {"240a:ab2b::/32", "145509"}, - {"2a10:e140::/32", "12779"}, - {"2001:559:c1a7::/48", "7015"}, - {"2001:678:14::/47", "42385"}, - {"2606:a000:707::/48", "11955"}, - {"2001:1be0::/32", "2686"}, - {"2401:b80::/34", "133334"}, - {"2405:2d40:1a::/32", "55695"}, - {"2803:ea60::/32", "267883"}, - {"2804:14d:5c55::/44", "28573"}, - {"2804:3538::/32", "266275"}, - {"2a00:1d58:e000::/35", "47524"}, - {"2a0a:e5c2::/32", "209898"}, - {"2001:559:85e8::/48", "33287"}, - {"2001:678:c0::/48", "51058"}, - {"2804:5a4c::/32", "268763"}, - {"2404:b1:b000::/33", "9891"}, - {"2804:a14:300b::/43", "262342"}, - {"2804:23e4::/42", "264191"}, - {"2806:217:402::/38", "28394"}, - {"2806:310:100::/42", "16960"}, - {"2001:559:85bb::/48", "33287"}, - {"240a:ab51::/32", "145547"}, - {"2804:2d60::/32", "265278"}, - {"2a02:26f7:dd89::/42", "20940"}, - {"2001:500:84::/48", "394353"}, - {"2001:1248:a900::/40", "11172"}, - {"2001:44b8:2042::/48", "4739"}, - {"2409:8028:30e1::/43", "56041"}, - {"2604:65c0::/39", "14585"}, - {"2a02:a00:1034::/34", "15987"}, - {"2a02:26f7:ba89::/42", "20940"}, - {"2a03:cd00::/32", "10310"}, - {"2001:550:b801::/38", "174"}, - {"2401:4f00::/32", "38328"}, - {"240a:a39f::/32", "143577"}, - {"2a02:cfc0::/29", "60032"}, - {"2a09:bac0:87::/44", "13335"}, - {"240e:3bb:7800::/39", "4134"}, - {"240a:ad0a::/32", "145988"}, - {"2604:d600:1071::/46", "32098"}, - {"2804:23b0::/32", "262645"}, - {"2a0e:b107:1780::/46", "210623"}, - {"2405:6e00:420::/43", "18291"}, - {"2620:17a:a::/48", "29705"}, - {"2800:bf0:8272::/45", "52257"}, - {"2a06:1287:2600::/44", "62217"}, - {"2a09:aa80::/32", "50673"}, - {"2408:8459:6850::/38", "17816"}, - {"240e:bf:b8f0::/46", "138514"}, - {"2a05:45c7::/47", "202175"}, - {"2001:559:4a9::/48", "33660"}, - {"2400:7b80::/30", "133193"}, - {"2a03:2880:f070::/47", "32934"}, - {"2a04:4e42:fd8::/42", "54113"}, - {"2a04:d9c0::/32", "20495"}, - {"2001:250:6412::/48", "23910"}, - {"2408:8756:3af0::/46", "17623"}, - {"2600:140b:dc01::/34", "20940"}, - {"2605:c840::/32", "397303"}, - {"2806:230:4027::/48", "11888"}, - {"2a06:e881:53ff::/48", "209859"}, - {"2a0c:800::/29", "207439"}, - {"2001:67c:2ffc:2e00::/56", "15440"}, - {"2402:800:3755::/42", "7552"}, - {"2408:8956:2c00::/40", "17622"}, - {"2604:4640::/32", "32625"}, - {"2607:f1c8::/32", "32890"}, - {"2804:2088::/32", "53223"}, - {"2806:230:2004::/48", "265594"}, - {"2a02:26f7:e7d1::/46", "20940"}, - {"2a11:4c40::/29", "204790"}, - {"2001:559:c274::/48", "33651"}, - {"2600:6c3a:47::/42", "20115"}, - {"2602:feb4:260::/44", "25961"}, - {"2806:2f0:9601::/46", "17072"}, - {"2a01:5b0:27::/44", "50611"}, - {"2001:559:1d8::/48", "33287"}, - {"240e:438:5e40::/34", "4134"}, - {"2806:2f0:1281::/48", "17072"}, - {"2001:4de0:6102::/48", "33438"}, - {"240e:980:2900::/40", "4134"}, - {"2602:fc0e::/40", "22630"}, - {"2804:14d:4e00::/40", "28573"}, - {"2804:133c::/32", "263523"}, - {"2804:6bd8::/35", "270429"}, - {"2806:230:2009::/48", "11888"}, - {"2a02:26f7:4c::/48", "36183"}, - {"2a11:75c0::/29", "211501"}, - {"2001:250:851::/48", "23910"}, - {"2001:67c:2bb8::/48", "35731"}, - {"2001:43f8:280::/48", "23889"}, - {"2001:44c8:4060::/43", "45430"}, - {"2600:370f:6105::/43", "32261"}, - {"2604:2e80:c06::/38", "30036"}, - {"2606:9c40::/48", "14618"}, - {"2804:1710::/32", "263120"}, - {"2a00:d1e0::/32", "12843"}, - {"2a02:2c00::/29", "203424"}, - {"2606:8900:b::/32", "33044"}, - {"2607:cc80:2000::/32", "25664"}, - {"2803:2b00:1101::/46", "52468"}, - {"2001:49f0:d0fb::/45", "174"}, - {"2600:1009:b1f0::/33", "22394"}, - {"2804:2d24:d0::/39", "263032"}, - {"2804:7848::/32", "271232"}, - {"2a00:d680::/32", "31708"}, - {"2a0f:ca85:1::/48", "207616"}, - {"2001:dc7:5d0d::/41", "24151"}, - {"2401:b840::/32", "136956"}, - {"2607:fad8::/44", "22652"}, - {"2804:5bb8:c4::/44", "268865"}, - {"2a02:26f0:80::/48", "43639"}, - {"2001:ee0:9200::/37", "45899"}, - {"2600:6c3a:819::/42", "20115"}, - {"2604:7c80::/32", "18897"}, - {"2800:170::/32", "7908"}, - {"2801:104:40::/44", "27828"}, - {"2806:230:4039::/48", "11888"}, - {"2806:2f0:12e1::/48", "17072"}, - {"2a02:3d0:7::/48", "26506"}, - {"2a0b:7a80::/29", "34856"}, - {"2a0d:d7c0::/29", "210044"}, - {"2001:559:87f7::/48", "33491"}, - {"2407:880::/32", "4594"}, - {"2408:8956:e700::/40", "17816"}, - {"2600:9000:a500::/43", "16509"}, - {"2804:21d8::/32", "264577"}, - {"2001:1250:a000::/44", "22894"}, - {"2408:8956:1240::/40", "17622"}, - {"2804:804::/32", "262338"}, - {"2a00:cee2:dcd::/31", "60268"}, - {"2c0f:ef78:5::/46", "63293"}, - {"2400:8800:1e90::/33", "3491"}, - {"2400:cb00:59::/48", "13335"}, - {"2402:e280:400::/40", "134674"}, - {"2405:201:800::/34", "55836"}, - {"2408:8000:5005::/32", "4837"}, - {"2a02:26f7:c14c::/48", "36183"}, - {"2a03:b680::/29", "211197"}, - {"2a04:4e40:2405::/40", "54113"}, - {"2604:d600:661::/44", "32098"}, - {"2a00:cb8:39::/48", "15695"}, - {"2a02:26f0:8600::/48", "34164"}, - {"2a06:1281:6::/29", "61138"}, - {"2001:253:116::/48", "142082"}, - {"240a:a45f::/32", "143769"}, - {"2804:3138:d020::/34", "265000"}, - {"2a02:9b0:400f::/42", "35819"}, - {"2001:503:231d::/48", "26415"}, - {"2401:d800:5d70::/40", "7552"}, - {"2402:800:7b20::/41", "7552"}, - {"240a:ab7a::/32", "145588"}, - {"240e:44d:6800::/42", "140345"}, - {"2602:fbf6:101::/37", "8095"}, - {"2800:bf0:2809::/43", "27947"}, - {"2806:2f0:2120::/48", "17072"}, - {"2a02:26f7:b9a4::/48", "36183"}, - {"2a02:26f7:fbc8::/48", "36183"}, - {"2a03:1ac0::/48", "41002"}, - {"2a04:4300::/48", "12703"}, - {"2a07:3c00::/29", "42093"}, - {"2001:559:48d::/48", "7922"}, - {"2600:6c20:1c::/46", "20115"}, - {"2605:83c0::/32", "33556"}, - {"2400:9380:81c0::/44", "136167"}, - {"2800:bf0:828f::/48", "52257"}, - {"2804:4658::/32", "266984"}, - {"2a0f:9400:8015::/48", "213347"}, - {"2001:470:c4::/47", "6939"}, - {"2001:da8:4006::/47", "24353"}, - {"2a05:2941::/29", "61131"}, - {"240e:438:5640::/36", "4134"}, - {"2604:fc80::/32", "33438"}, - {"2806:2f0:1320::/41", "17072"}, - {"2001:67c:1768::/48", "209859"}, - {"2001:df0:7440::/48", "131112"}, - {"2001:44b8:30cf::/48", "4739"}, - {"2600:140f:1600::/48", "9498"}, - {"2804:6e4:4000::/32", "262612"}, - {"2804:4348::/32", "267560"}, - {"2001:ce0:5::/48", "4158"}, - {"2a0f:ec81::/32", "207893"}, - {"240a:a34c::/32", "143494"}, - {"240a:a64f::/32", "144265"}, - {"2804:2d24:200::/32", "263032"}, - {"2405:6e00:2f1::/48", "65442"}, - {"2607:fea8::/32", "812"}, - {"2804:10cc::/32", "263650"}, - {"2804:1f10::/32", "2715"}, - {"2804:4488:1010::/44", "262480"}, - {"2a0b:89c0::/31", "3214"}, - {"2402:3a80:1708::/47", "38266"}, - {"2804:6308::/32", "269334"}, - {"2806:2f0:83c3::/42", "17072"}, - {"2001:559:7b8::/48", "7016"}, - {"2001:559:c341::/48", "7015"}, - {"2001:978:2202:1::/47", "174"}, - {"2402:8100:3058::/42", "55644"}, - {"2a04:d500::/32", "48618"}, - {"2a12:4940:1235::/36", "211398"}, - {"2600:5c00:1000::/34", "20001"}, - {"2602:fc49::/36", "399905"}, - {"2607:f038:4016::/44", "21527"}, - {"2806:2f0:8161::/46", "17072"}, - {"2a02:26f7:c3c4::/48", "36183"}, - {"2a02:26f7:ec00::/48", "36183"}, - {"2804:76e0::/32", "271140"}, - {"2a00:e6a0:4::/32", "12303"}, - {"2001:559:8091::/48", "7922"}, - {"2001:67c:252c::/48", "39879"}, - {"2a01:ce91::/36", "51964"}, - {"240e:982:8000::/40", "133774"}, - {"2804:3f08::/32", "266635"}, - {"2a02:26f0:a501::/38", "20940"}, - {"2001:559:84b6::/48", "33656"}, - {"2403:c00:704::/36", "17488"}, - {"240a:a012::/32", "142668"}, - {"2606:4700:83b0::/44", "13335"}, - {"2001:6d0:fffc::/48", "42385"}, - {"2001:1878:b00::/44", "5726"}, - {"2606:1a40:201b::/48", "25369"}, - {"2a0d:3440::/29", "49223"}, - {"2c0f:ece8::/32", "328386"}, - {"2600:6c20:c28::/43", "20115"}, - {"2804:1d4c::/32", "264359"}, - {"2804:5284:1000::/33", "268523"}, - {"2a02:26f7:bf4c::/48", "36183"}, - {"2001:559:8620::/48", "33650"}, - {"2001:43f8:1030::/48", "3067"}, - {"2402:7800:203::/48", "45772"}, - {"240a:ae0e::/32", "146248"}, - {"240a:af3a::/32", "146548"}, - {"2600:370f:34d1::/42", "32261"}, - {"2a05:5840::/31", "28761"}, - {"2804:65f0::/32", "269524"}, - {"2a01:7440::/32", "12739"}, - {"2a0e:6540:a192::/48", "208364"}, - {"2800:bf0:104::/43", "52257"}, - {"2804:14c:7d85::/44", "28573"}, - {"2a0b:ae47:3::/45", "40676"}, - {"2620:84:c000::/48", "30242"}, - {"2800:160:1317::/44", "14259"}, - {"2804:675c::/32", "269623"}, - {"2a0b:a907::/32", "206468"}, - {"2a0d:2100::/29", "204947"}, - {"2001:df0:266::/48", "55901"}, - {"2400:cb00:60::/47", "13335"}, - {"2409:8054:3018::/48", "9808"}, - {"2803:a200::/32", "27775"}, - {"2a01:53c0:ff13::/48", "54994"}, - {"2a02:26f7:c988::/48", "36183"}, - {"2a03:78c0::/32", "198167"}, - {"2a07:c700::/29", "50178"}, - {"2001:da8:3049::/48", "23910"}, - {"2600:1408:cc00::/48", "32787"}, - {"2606:ae80:1c10::/44", "25751"}, - {"2804:1b80::/32", "262993"}, - {"2001:df0::/48", "9431"}, - {"2408:8459:9630::/41", "17622"}, - {"2804:14d:5ce4::/43", "28573"}, - {"2a0d:1a45:2002::/33", "57782"}, - {"2001:4888:8054::/47", "6167"}, - {"2402:7d80:999a::/33", "63582"}, - {"2409:8055:300a::/43", "56040"}, - {"2604:2e8e:2c00::/35", "30036"}, - {"2a00:1cc0::/32", "20521"}, - {"2a07:a1c0::/29", "206423"}, - {"2001:559:842d::/48", "13367"}, - {"2401:1d40:3100::/47", "58466"}, - {"2405:c0:80::/48", "138881"}, - {"2602:feda:d80::/48", "142048"}, - {"2804:4914::/32", "267163"}, - {"2a04:4e40:200::/48", "54113"}, - {"2a06:e881:1702::/48", "206813"}, - {"2a0e:8f02:f02a::/48", "212577"}, - {"2001:559:8108::/48", "33491"}, - {"2804:56b8::/32", "52633"}, - {"2001:559:254::/48", "7922"}, - {"2409:8d14::/43", "56044"}, - {"2600:141b:d801::/34", "20940"}, - {"2602:fcce::/40", "399200"}, - {"2804:2514:8100::/33", "264259"}, - {"2a0e:2980:1::/48", "33984"}, - {"2a06:2ec0::/32", "206281"}, - {"2a0a:8e40::/29", "203605"}, - {"2a0f:5680:4::/32", "60906"}, - {"2001:559:c477::/48", "7015"}, - {"2405:4800:ae01::/30", "18403"}, - {"2602:fe2e::/37", "21700"}, - {"2605:3380:4445::/44", "12025"}, - {"2800:29::/29", "7908"}, - {"2a01:7a8::/48", "207701"}, - {"2001:1a11:12d::/48", "42298"}, - {"2600:1400:b001::/33", "20940"}, - {"2800:160:19ca::/45", "14259"}, - {"2a03:220::/32", "61400"}, - {"2409:8904:2da0::/38", "24547"}, - {"2607:f3a0:a007::/48", "399813"}, - {"2800:550:2b::/32", "7004"}, - {"2001:1c00::/23", "33915"}, - {"2804:2898::/32", "28305"}, - {"2a02:26f7:bdc0::/48", "36183"}, - {"2a02:26f7:ea01::/46", "20940"}, - {"2a02:26f7:f6c4::/48", "36183"}, - {"2001:750::/29", "15589"}, - {"2001:da8:ce::/48", "138374"}, - {"2607:fa40:2::/48", "6649"}, - {"2403:c00::/45", "17488"}, - {"2403:a200:a200::/39", "17428"}, - {"2604:d6c0:5000::/36", "64271"}, - {"2a03:db80:4810::/48", "60824"}, - {"2a0e:1101::/47", "51255"}, - {"2001:559:570::/48", "7922"}, - {"2604:600::/33", "40260"}, - {"2804:62f0:d102::/34", "269329"}, - {"2a00:16a0::/32", "15830"}, - {"2600:1408:1c::/48", "21342"}, - {"2607:f4a8:200d::/48", "397894"}, - {"2402:6a40:6::/48", "135718"}, - {"2604:2940::/32", "395719"}, - {"2801:80:280::/48", "28631"}, - {"2a00:9380::/32", "15557"}, - {"2a07:3500:1998::/48", "38915"}, - {"2a0f:607:1060::/47", "43126"}, - {"2001:559:c360::/48", "7016"}, - {"2604:9cc0:9::/48", "201106"}, - {"2607:fdf0:5e07::/44", "8008"}, - {"2803:e3e0::/32", "270071"}, - {"2001:559:85e4::/48", "33657"}, - {"2001:67c:2294::/48", "9052"}, - {"2001:df0:20b::/48", "38549"}, - {"2600:1406:1b::/48", "21342"}, - {"2804:5180::/32", "268456"}, - {"2804:7bf8::/32", "271466"}, - {"2a0e:1c80:5::/48", "40028"}, - {"2001:559:2f4::/46", "33287"}, - {"2001:578:d00::/41", "22773"}, - {"240a:ab2a::/32", "145508"}, - {"2607:fd48:0:3::/39", "13536"}, - {"2804:1368:fb00::/37", "262808"}, - {"2804:61c0:9000::/36", "269254"}, - {"2001:400:6440:105::/47", "293"}, - {"2001:400:8823::/48", "291"}, - {"2001:43f8:70::/45", "36982"}, - {"2401:d800:5790::/42", "7552"}, - {"240a:a66c::/32", "144294"}, - {"240a:a6eb::/32", "144421"}, - {"2804:7ebc::/32", "271644"}, - {"2a01:41e3::/32", "62336"}, - {"2a0e:9900::/29", "56598"}, - {"2604:2d80:4000::/34", "30036"}, - {"2604:4340::/32", "32647"}, - {"2800:d302:18::/45", "11830"}, - {"2804:f24::/32", "263567"}, - {"2804:5f24::/32", "269079"}, - {"2a0e:fd45:1::/48", "61409"}, - {"2001:559:870d::/48", "33650"}, - {"2403:5340::/32", "137639"}, - {"2406:840:9992::/47", "210320"}, - {"2406:840:e509::/48", "211571"}, - {"2406:9a80:311::/48", "206704"}, - {"2408:8756:a00::/40", "136958"}, - {"240a:a386::/32", "143552"}, - {"240a:ab3a::/32", "145524"}, - {"2a02:26f7:c341::/45", "20940"}, - {"2406:840:fef7::/48", "132623"}, - {"240a:a0cd::/32", "142855"}, - {"2804:2140:1802::/32", "53059"}, - {"2a02:f18::/32", "15879"}, - {"2a04:6400::/35", "62240"}, - {"2001:4268:700::/35", "15964"}, - {"2001:4490:3a00::/42", "9829"}, - {"2400:b480::/32", "131589"}, - {"240a:a220::/32", "143194"}, - {"240e:fc::/33", "136200"}, - {"240e:108:11d9::/45", "4134"}, - {"2a0c:a9c7:241::/48", "42728"}, - {"2401:d800:56b0::/41", "7552"}, - {"2001:559:816d::/48", "33657"}, - {"2402:f280::/32", "4851"}, - {"2409:897d::/30", "9808"}, - {"2a02:ac80:5001::/34", "25145"}, - {"240a:a216::/32", "143184"}, - {"2600:6c7f:9030::/48", "20115"}, - {"2604:d2c0::/32", "12131"}, - {"2a02:26f7:b68c::/48", "36183"}, - {"2a05:9cc7::/32", "2116"}, - {"2001:9e8:2180::/35", "8881"}, - {"2804:46f8:8000::/34", "267023"}, - {"2a02:26f7:c391::/42", "20940"}, - {"2801:116::/48", "271827"}, - {"2a06:1e00:30::/48", "60695"}, - {"2a07:180::/32", "209242"}, - {"2001:1248:a9a1::/38", "11172"}, - {"2620:10a:a002::/40", "16920"}, - {"2a02:8388::/31", "8412"}, - {"2001:559:8346::/48", "33287"}, - {"2001:4490:d000::/46", "9829"}, - {"2620:100:5007::/48", "29889"}, - {"2a02:26f7:f6fa::/47", "20940"}, - {"2a02:27d0:101::/32", "49463"}, - {"2001:559:455::/48", "7016"}, - {"2001:559:80d4::/48", "7016"}, - {"2408:84f3:4440::/38", "17816"}, - {"240a:a65f::/32", "144281"}, - {"2600:1480:7001::/37", "20940"}, - {"2a00:14d0::/32", "8331"}, - {"2400:9bc0:4::/32", "55313"}, - {"2a02:26f7:e7c4::/48", "36183"}, - {"2408:8256:2d80::/44", "17623"}, - {"240a:ac61::/32", "145819"}, - {"2605:3380:4120::/45", "12025"}, - {"2803:4600:2000::/32", "14754"}, - {"2a0c:b642:1030::/44", "210020"}, - {"2001:470:ef::/48", "6939"}, - {"2600:140b:2801::/38", "20940"}, - {"2800:484:e700::/36", "10620"}, - {"2804:b14::/32", "52937"}, - {"2804:c48:8000::/36", "52687"}, - {"2a01:5041:6000::/48", "202196"}, - {"2a02:26f7:a2::/48", "36183"}, - {"2a02:ea80::/32", "52195"}, - {"2c0f:eae0::/32", "37521"}, - {"2400:6280:11b::/48", "135381"}, - {"2804:5338::/32", "268570"}, - {"2405:1c0:7a81::/48", "55303"}, - {"2a02:26f7:ef01::/46", "20940"}, - {"2a03:5640:f302::/48", "16509"}, - {"2a03:d1c0::/32", "41690"}, - {"2402:800:b100::/42", "7552"}, - {"2800:bf0:a415::/38", "27947"}, - {"2c0f:eb00:b00::/37", "61266"}, - {"2402:ef17::/33", "7633"}, - {"2604:4e00:4100::/35", "25764"}, - {"2806:2f0:4501::/46", "17072"}, - {"2a07:3502:1090::/48", "38915"}, - {"2a0f:9400:7382::/48", "53356"}, - {"2a06:e881:6602::/47", "208872"}, - {"2a0b:c480::/32", "206374"}, - {"2804:3e4::/32", "262404"}, - {"2a06:61c0::/29", "56329"}, - {"2a0f:4400::/29", "48305"}, - {"2001:559:59e::/48", "7725"}, - {"2406:5140::/32", "135404"}, - {"2408:8456:4210::/42", "134543"}, - {"2602:fcf6:ffa::/48", "212528"}, - {"2a01:c50f:4600::/41", "12479"}, - {"2405:ec00:facf::/37", "23955"}, - {"240a:a003::/32", "142653"}, - {"2801:1e:d000::/48", "265652"}, - {"2001:559:c49b::/48", "7922"}, - {"240a:a281::/32", "143291"}, - {"240e:3b2:9c00::/34", "140310"}, - {"240e:3b3:1200::/39", "4134"}, - {"2604:76c0::/32", "36103"}, - {"2804:4ad4::/32", "267266"}, - {"2806:230:500b::/48", "11888"}, - {"2a02:26f7:c38c::/48", "36183"}, - {"2a02:26f7:db80::/48", "36183"}, - {"2a06:3c80::/29", "197648"}, - {"240a:afad::/32", "146663"}, - {"2600:1413:e001::/29", "20940"}, - {"2a02:26f7:f7cd::/46", "20940"}, - {"2a03:1980:d0ff::/48", "48260"}, - {"2a0f:6500:3000::/32", "208183"}, - {"2c0f:fc89:4001::/32", "36992"}, - {"2602:808:2000::/47", "398946"}, - {"2804:6194::/32", "269243"}, - {"2804:81a0::/32", "272466"}, - {"2a06:d647::/32", "35048"}, - {"2c0f:f738:2005::/38", "61317"}, - {"2001:c20:c839::/48", "9255"}, - {"2402:e300:4::/32", "131706"}, - {"2600:1406:5401::/36", "20940"}, - {"2804:3a1c::/32", "266071"}, - {"2a04:5201:6::/47", "200740"}, - {"2a12:9fc0::/29", "400522"}, - {"2001:da8:223::/48", "23910"}, - {"2400:9380:90a0::/47", "4809"}, - {"2405:201:a600::/36", "55836"}, - {"2408:8459:4610::/42", "17623"}, - {"240a:aa3e::/32", "145272"}, - {"2a09:bac0:253::/48", "13335"}, - {"2409:8924:b300::/37", "56046"}, - {"240a:ae4b::/32", "146309"}, - {"2600:6c10:14b::/45", "20115"}, - {"2a02:26f7:c649::/46", "20940"}, - {"2001:da8:21f::/48", "24348"}, - {"240a:a51b::/32", "143957"}, - {"2600:6c26::/28", "20115"}, - {"2a02:26f7:bb06::/47", "20940"}, - {"2001:559:745::/48", "33287"}, - {"2402:d700::/32", "37906"}, - {"240a:a447::/32", "143745"}, - {"240e:95d:1800::/37", "136194"}, - {"2a0a:2845:d20::/46", "136796"}, - {"2001:559:8589::/46", "7922"}, - {"2400:1020:10::/32", "45276"}, - {"2408:8459:b450::/38", "17816"}, - {"2a02:2e0:3e0::/43", "12306"}, - {"2a03:ec00:b100::/40", "24921"}, - {"2a10:1800:1::/46", "207463"}, - {"2409:8914:1100::/38", "56044"}, - {"2409:8c3c:ffff::/48", "9808"}, - {"240a:afe1::/32", "146715"}, - {"2603:90fc:10::/44", "20115"}, - {"2806:2f0:2080::/48", "17072"}, - {"2001:250:20a::/48", "24351"}, - {"2400:e800:1000::/36", "17564"}, - {"2402:800:5ba9::/41", "7552"}, - {"240a:a88a::/32", "144836"}, - {"2602:ffb0:30::/48", "13213"}, - {"2605:dd40:8223::/41", "398549"}, - {"2607:6000:500::/40", "12189"}, - {"2408:8459:a230::/41", "17622"}, - {"2606:4a00:1200::/32", "33154"}, - {"2804:d7c::/39", "52634"}, - {"2804:1674:c::/42", "53231"}, - {"2a02:27b8:1::/48", "49278"}, - {"2001:820::/32", "16186"}, - {"2001:43f8:14d0::/48", "328700"}, - {"2408:8256:3d80::/44", "17623"}, - {"2605:a680::/32", "174"}, - {"2620:0:e00::/47", "38"}, - {"2803:1a00:501d::/38", "262186"}, - {"2a02:ee80:41ee::/47", "3573"}, - {"2001:250:6419::/48", "23910"}, - {"2001:ee0:de00::/40", "45899"}, - {"2600:380:f103::/48", "64011"}, - {"2604:b140::/32", "40918"}, - {"2804:c88::/32", "263466"}, - {"2001:559:36e::/48", "33489"}, - {"240c:ca07::/32", "138371"}, - {"2604:1f40::/32", "33038"}, - {"2a00:1310::/32", "25181"}, - {"2a02:26f7:f84d::/46", "20940"}, - {"2001:559:c4a5::/46", "7922"}, - {"2401:3c00:180::/42", "38322"}, - {"2401:d800:750::/42", "7552"}, - {"240a:af42::/32", "146556"}, - {"2a0f:5707:af01::/46", "211358"}, - {"2001:678:12::/48", "197440"}, - {"2401:d800:f380::/42", "7552"}, - {"2602:fddb:804::/37", "397460"}, - {"2606:6d00::/39", "1403"}, - {"2610:a1:1003::/45", "397228"}, - {"2620:78:200f::/48", "209242"}, - {"2801:1c6::/44", "19429"}, - {"2a00:6901:5::/48", "20926"}, - {"2a09:e100::/29", "209834"}, - {"2c0f:f920::/32", "37550"}, - {"2001:1848::/32", "6325"}, - {"2804:46f8::/34", "267023"}, - {"2402:e380:320::/48", "142165"}, - {"240a:aff5::/32", "146735"}, - {"2a10:4646:1a0::/44", "206569"}, - {"2a12:7240::/29", "400522"}, - {"2409:877f::/20", "9808"}, - {"2606:5200:d000::/34", "32477"}, - {"2a02:26f7:b6::/48", "36183"}, - {"2a0b:1306:b::/48", "133142"}, - {"2600:1406:8001::/37", "20940"}, - {"2a06:f700::/29", "208332"}, - {"2a09:a780::/29", "397270"}, - {"2409:8c70:3a90::/44", "140105"}, - {"2a02:a00:4000::/32", "15987"}, - {"2001:559:c1a9::/48", "7725"}, - {"2403:1cc0:1000::/47", "45352"}, - {"2605:a404:b1a::/42", "33363"}, - {"2804:10a0:21c::/42", "28173"}, - {"2804:84fc:1900::/32", "272550"}, - {"2a07:9b40:1aa5::/48", "39702"}, - {"2a0e:b107:468::/45", "57883"}, - {"2001:448a:4010::/42", "7713"}, - {"2406:f400:100::/44", "38001"}, - {"2408:8406:3c00::/39", "4808"}, - {"2804:1064::/32", "263633"}, - {"240e:870:10::/42", "4134"}, - {"2620:11f:100c::/48", "7385"}, - {"2a02:26f7:f6f5::/46", "20940"}, - {"2a02:7b03::/36", "48328"}, - {"2406:2000:1ac::/46", "56173"}, - {"240a:a6e1::/32", "144411"}, - {"2804:49d4::/32", "52631"}, - {"240a:ae8c::/32", "146374"}, - {"2605:b9c0:4000::/34", "398804"}, - {"2804:14c:5be4::/43", "28573"}, - {"2804:2160::/36", "264551"}, - {"2804:271c::/32", "263877"}, - {"2600:140b:4::/48", "20940"}, - {"2600:1419:7400::/48", "35204"}, - {"2804:496c::/32", "267183"}, - {"2600:380:f880::/39", "20057"}, - {"2803:760:1900::/33", "269816"}, - {"2806:2f0:8003::/42", "17072"}, - {"2a00:1fa1::/33", "29497"}, - {"2a02:26f7:85::/48", "20940"}, - {"2a06:8dc6::/44", "57878"}, - {"2001:438:3a::/41", "6461"}, - {"2001:1248:961f::/41", "11172"}, - {"2404:bf40:a682::/41", "139084"}, - {"2607:f738:a00::/39", "17184"}, - {"2a00:dd8:2::/32", "31012"}, - {"2404:4280::/32", "18106"}, - {"2404:a500::/48", "45854"}, - {"2406:840:feed::/48", "209306"}, - {"2409:8924:3900::/38", "56046"}, - {"2604:c140::/32", "394740"}, - {"2a02:3b8::/32", "16371"}, - {"240e:428::/27", "4134"}, - {"2600:6c2e:584::/38", "20115"}, - {"2602:ffc5:109::/48", "7489"}, - {"2a07:580::/29", "31263"}, - {"2a0f:9980:195::/48", "40676"}, - {"2001:559:4b5::/48", "33650"}, - {"2001:978:2300:202::/47", "174"}, - {"2404:bf40:8681::/48", "7545"}, - {"2409:8020:10c1::/43", "56046"}, - {"2a02:1698::/32", "51127"}, - {"240e:267:2000::/38", "140330"}, - {"2a02:26f7:d74c::/48", "36183"}, - {"2a02:26f7:db84::/48", "36183"}, - {"2a02:5080::/32", "51825"}, - {"2a06:e881:1708::/48", "49745"}, - {"2a0b:ccc0::/29", "41306"}, - {"2001:4328::/32", "30844"}, - {"240a:aadd::/32", "145431"}, - {"2620:b3::/48", "2914"}, - {"2a02:26f0:a901::/38", "20940"}, - {"2001:250:7025::/46", "23910"}, - {"2001:da8:200a::/43", "24357"}, - {"2600:6c10:e49::/45", "20115"}, - {"2406:e001:7800::/32", "23655"}, - {"240a:a8a2::/32", "144860"}, - {"240e:967:8800::/38", "133775"}, - {"2804:1748::/32", "263133"}, - {"2a0a:ec02:701::/48", "42692"}, - {"2001:250:236::/47", "24349"}, - {"2600:140b:2401::/38", "20940"}, - {"2a09:3d01::/30", "208861"}, - {"2402:9d80:a61::/43", "131429"}, - {"2600:1009:a020::/40", "22394"}, - {"2804:218:7003::/32", "27715"}, - {"2804:7f70::/32", "271688"}, - {"2806:230:1029::/48", "11888"}, - {"2806:30f::/48", "265561"}, - {"2a06:2300::/29", "29458"}, - {"240a:a198::/32", "143058"}, - {"2801:140:121::/45", "262249"}, - {"2803:3380:f000::/36", "27818"}, - {"2804:6638::/32", "269542"}, - {"2a04:45c0::/29", "60717"}, - {"2402:6880:1000::/48", "63989"}, - {"2405:e340::/32", "137067"}, - {"240a:a721::/32", "144475"}, - {"2604:d600:1533::/44", "32098"}, - {"2a11:3c01::/32", "43624"}, - {"2c0f:e8f8:2000::/40", "36868"}, - {"2600:1009:b000::/41", "6167"}, - {"2605:67c0::/32", "397911"}, - {"2605:93c0::/32", "19413"}, - {"2804:41a0::/34", "267446"}, - {"2a01:5043:3::/48", "202196"}, - {"2a01:9380::/32", "43638"}, - {"2400:ae00:1981::/48", "38367"}, - {"2404:6800::/33", "15169"}, - {"240a:a951::/32", "145035"}, - {"2804:3d88::/32", "266537"}, - {"2a05:fb46::/32", "59504"}, - {"2001:4998:ef5e::/48", "7233"}, - {"2408:8456:cd40::/40", "17816"}, - {"2a0c:9a40:8083::/48", "49367"}, - {"2603:9031::/40", "33363"}, - {"2804:51b4:7100::/32", "268471"}, - {"2001:559:457::/48", "33651"}, - {"2001:6d0:ffd1::/46", "21416"}, - {"2405:4803:c1c::/41", "18403"}, - {"2408:8026:4b0::/39", "17621"}, - {"2604:8880::/32", "8304"}, - {"2605:d8c0::/32", "3367"}, - {"2607:fe28:1040::/34", "53347"}, - {"2803:6900:507::/48", "52423"}, - {"2804:d0c:8040::/42", "53112"}, - {"2804:1918:380::/32", "52862"}, - {"2604:2d00::/36", "64236"}, - {"2604:6840:1200::/36", "33438"}, - {"2804:5284:d000::/48", "268523"}, - {"2a00:8740:2b::/45", "49037"}, - {"2a02:568:fe01::/48", "8763"}, - {"2a02:2378::/32", "15895"}, - {"2a0f:9980:598::/48", "40676"}, - {"2001:16a2:c400::/36", "25019"}, - {"2402:800:97d3::/44", "7552"}, - {"2405:1c0:6711::/45", "55303"}, - {"2405:ac80::/32", "135524"}, - {"240a:af5a::/32", "146580"}, - {"2600:1001:9000::/44", "6167"}, - {"2804:76f4::/32", "271145"}, - {"2a00:7100::/32", "8311"}, - {"2a0e:c147::/32", "16262"}, - {"2409:8018:4000::/32", "9808"}, - {"2800:160:16ac::/41", "14259"}, - {"2a05:d000:6000::/40", "16509"}, - {"2604:2b40::/32", "46262"}, - {"2a01:8840:89::/48", "207266"}, - {"2a07:dc00:2550::/44", "29997"}, - {"2001:559:56c::/48", "22909"}, - {"2400:65c0::/32", "132774"}, - {"2804:6dc::/32", "7048"}, - {"2804:7fa0::/32", "271699"}, - {"2a03:5840:10a::/48", "213073"}, - {"2404:6b00::/32", "58640"}, - {"2604:ee80::/32", "7276"}, - {"2606:a000:1700::/40", "11955"}, - {"2a0a:9b80::/32", "200665"}, - {"2a0d:aa00::/29", "49362"}, - {"2001:559:7ce::/48", "7016"}, - {"2001:559:86ab::/45", "7922"}, - {"240e:7b0::/36", "140310"}, - {"2800:160:1c02::/45", "14259"}, - {"2a01:e10::/30", "29447"}, - {"2a01:c50f:1200::/37", "12479"}, - {"2a03:93e0::/35", "203228"}, - {"2409:8754:c000::/37", "56040"}, - {"2607:f060::/36", "11404"}, - {"2804:17cc::/33", "263252"}, - {"2a02:2ad0:520::/38", "702"}, - {"2a10:2f00:13f::/48", "212996"}, - {"2001:559:8197::/48", "33656"}, - {"2401:d800:d0a0::/41", "7552"}, - {"2404:1a0::/35", "24334"}, - {"240a:a13e::/32", "142968"}, - {"2a01:238:500::/29", "6724"}, - {"2a09:3::/48", "3258"}, - {"2a0a:1182::/32", "39122"}, - {"2620:0:610::/48", "4185"}, - {"2001:67c:168::/48", "12350"}, - {"2001:4878:c246::/48", "12222"}, - {"240a:a0ad::/32", "142823"}, - {"240a:a50a::/32", "143940"}, - {"2607:fdf8::/40", "13649"}, - {"2804:358c::/32", "266293"}, - {"2a00:1e6a:78::/32", "49373"}, - {"2001:fd8:b2c0::/42", "132199"}, - {"2403:9800:c050::/42", "4648"}, - {"2600:6ce0::/29", "16787"}, - {"2602:80c:1000::/48", "400013"}, - {"2a03:2880:f25f::/42", "32934"}, - {"2001:503:5ae2::/48", "7342"}, - {"2001:559:750::/48", "7015"}, - {"240a:aaf4::/32", "145454"}, - {"240a:ab20::/32", "145498"}, - {"2600:370f:75a8::/47", "32261"}, - {"2a02:888:4043::/48", "47794"}, - {"2a02:26f7:f6dc::/48", "36183"}, - {"2402:800:5801::/44", "7552"}, - {"240a:a3b2::/32", "143596"}, - {"2600:6c20:803::/45", "20115"}, - {"2a00:4b00:22d::/48", "136772"}, - {"2a06:eb40::/29", "205115"}, - {"2a10:ccc0::/48", "56755"}, - {"2001:2c0::/32", "2514"}, - {"2001:550:103::/45", "174"}, - {"2407:cdc0:e011::/48", "38136"}, - {"2001:67c:2524::/48", "20626"}, - {"2001:1a68:2a::/48", "206838"}, - {"240a:ac56::/32", "145808"}, - {"240a:af70::/32", "146602"}, - {"2604:98c0::/32", "23379"}, - {"2804:3d80::/32", "266535"}, - {"2408:8456:cd00::/42", "17622"}, - {"2001:253:115::/48", "142081"}, - {"2405:9800:9801::/48", "45430"}, - {"2408:8459:5c30::/41", "17622"}, - {"240e:438:1040::/38", "4134"}, - {"2603:c0ed::/36", "54253"}, - {"2804:5e4::/32", "262548"}, - {"2400:8b00:e80::/42", "45727"}, - {"2400:d400:9897::/44", "45671"}, - {"240a:ad90::/32", "146122"}, - {"2804:182c::/32", "52845"}, - {"2a05:fb45::/32", "208861"}, - {"2001:559:2ac::/48", "33651"}, - {"2001:559:87d1::/48", "7015"}, - {"240e:640:8e00::/40", "136197"}, - {"2a06:5780::/29", "56457"}, - {"2001:559:c244::/48", "33652"}, - {"2001:df4:1700::/48", "137084"}, - {"2401:d800:f90::/42", "7552"}, - {"2402:5840:6::/32", "137403"}, - {"2403:a280:1000::/48", "64087"}, - {"2404:4a00:3::/64", "55423"}, - {"240e:438:8440::/38", "4134"}, - {"2806:230:2047::/48", "11888"}, - {"2001:67c:1490::/48", "3301"}, - {"2409:8087:5000::/43", "56047"}, - {"240e:983:1400::/47", "134768"}, - {"2804:f40::/32", "263573"}, - {"2804:1d80::/36", "264374"}, - {"2a01:8840:9a::/45", "12041"}, - {"2a02:2498:55::/48", "13213"}, - {"2001:559:56e::/48", "7015"}, - {"2001:559:83e6::/48", "7015"}, - {"2001:888::/29", "3265"}, - {"2605:a404:15f::/42", "33363"}, - {"2804:bd8::/33", "52838"}, - {"2804:1980::/32", "61798"}, - {"2a01:32::/29", "8875"}, - {"2a01:8840:ae::/43", "12041"}, - {"2001:b18:1018::/47", "47787"}, - {"2401:9800::/32", "23930"}, - {"2620:2:6000::/48", "395409"}, - {"2804:1ca0::/38", "61666"}, - {"2804:5aa4::/32", "268786"}, - {"2804:6de8::/32", "270563"}, - {"2804:8578::/32", "272581"}, - {"2001:550:7708::/48", "25829"}, - {"2001:559:1c0::/47", "33651"}, - {"2600:3404:500::/28", "4181"}, - {"2620:154:a08::/48", "16733"}, - {"2001:559:5cc::/48", "33491"}, - {"2600:6c4e::/32", "20115"}, - {"2620:52:3::/48", "17314"}, - {"2804:70dc::/32", "270752"}, - {"2a01:54e0:ec00::/35", "31483"}, - {"2a03:24e0::/48", "15623"}, - {"2a04:d480:3c00::/38", "25291"}, - {"2c0e:40:501::/23", "24863"}, - {"2001:250:835::/44", "138182"}, - {"2620:134:6008::/47", "30031"}, - {"2803:2180:15::/46", "27941"}, - {"2803:d700:d000::/34", "61461"}, - {"2804:d18::/32", "52599"}, - {"240e:104:7d00::/38", "4134"}, - {"2620:111:d005::/48", "32908"}, - {"2804:7fb8::/32", "271705"}, - {"2a02:26f7:f6ee::/47", "20940"}, - {"2a03:37e0::/32", "197898"}, - {"2409:8914:a200::/39", "56044"}, - {"2804:770::/32", "262649"}, - {"2a01:5040:2021::/36", "43996"}, - {"2a02:26f7:c801::/46", "20940"}, - {"2a0d:4a00::/32", "29148"}, - {"2a11:e600::/29", "42929"}, - {"2a02:730:5000::/48", "49857"}, - {"2001:678:88::/48", "44358"}, - {"2001:12f0:340::/37", "1916"}, - {"2001:1900:2364::/48", "202818"}, - {"2402:800:9771::/44", "7552"}, - {"240a:a18e::/32", "143048"}, - {"2606:2800:5a40::/47", "15133"}, - {"2a02:26f7:ea8d::/46", "20940"}, - {"240e:44d:2180::/41", "4134"}, - {"240e:967:9400::/38", "133776"}, - {"2606:ae00:6080::/39", "7287"}, - {"2a02:26f7:db8c::/48", "36183"}, - {"2a0f:80::/32", "24796"}, - {"2001:b10:a000::/44", "196844"}, - {"2001:5002:300:1::/64", "6461"}, - {"2402:5300:4040::/39", "45903"}, - {"2408:84f3:b240::/37", "17816"}, - {"2803:ba0::/46", "267756"}, - {"2a02:26f7:f9c8::/48", "36183"}, - {"2001:559:73b::/48", "7015"}, - {"2402:800:75b0::/41", "7552"}, - {"240a:ad46::/32", "146048"}, - {"240a:af71::/32", "146603"}, - {"2607:f4a0:501::/33", "11272"}, - {"2a04:3c0::/29", "57099"}, - {"2001:559:8279::/48", "7015"}, - {"2001:67c:2a34::/48", "58346"}, - {"2804:14c:bb8f::/43", "28573"}, - {"2a00:1ab8::/32", "29422"}, - {"2a03:7a00::/32", "42908"}, - {"240a:acc5::/32", "145919"}, - {"2804:d20::/32", "262700"}, - {"2804:145c:c040::/38", "263327"}, - {"2a00:5100::/32", "35046"}, - {"2001:df7:d980::/48", "148968"}, - {"2406:c940::/32", "58972"}, - {"2804:37a8:121e::/48", "263919"}, - {"2806:230:6029::/48", "11888"}, - {"2a01:b760::/32", "204281"}, - {"2a02:23b8::/32", "25003"}, - {"2a0e:b100:106::/44", "207556"}, - {"2001:559:8530::/48", "33650"}, - {"2001:678:b94::/48", "34601"}, - {"2a0f:4440:aaaa::/48", "50937"}, - {"2001:4d78:fe20::/46", "15830"}, - {"240a:a60b::/32", "144197"}, - {"2605:6340::/32", "40033"}, - {"2620:171:20::/46", "715"}, - {"2806:104e:13::/42", "8151"}, - {"2a02:600::/29", "31263"}, - {"2a02:26f7:ddc1::/46", "20940"}, - {"2001:1248:5fd4::/42", "11172"}, - {"240e:13:800::/48", "140852"}, - {"240e:44d:6640::/42", "140348"}, - {"2606:f40::/48", "14618"}, - {"2804:4328::/32", "267552"}, - {"2804:4350::/32", "267562"}, - {"2a04:b700:185a::/48", "201405"}, - {"2400:6080::/32", "56030"}, - {"2401:d800:ba00::/42", "7552"}, - {"2403:9800:c400::/34", "4648"}, - {"2405:1207::/32", "9824"}, - {"2604:cac0:112::/48", "11019"}, - {"2804:5f90::/32", "269109"}, - {"2a01:d0:1658::/32", "29632"}, - {"2a01:6280::/32", "30900"}, - {"2001:559:c211::/48", "33650"}, - {"2409:8a55:c800::/34", "9808"}, - {"2605:3380:4440::/46", "12025"}, - {"2806:2f0:1043::/42", "22884"}, - {"2a03:8600:7::/32", "3399"}, - {"2a05:df40::/29", "9186"}, - {"2001:559:46::/48", "7922"}, - {"2404:bc80:1::/48", "64072"}, - {"240a:a897::/32", "144849"}, - {"2800:2a0:3801::/33", "27947"}, - {"2404:bf40:e404::/38", "139084"}, - {"2604:6d00:1::/48", "36223"}, - {"2803:3660::/32", "267905"}, - {"2a0d:5480::/29", "49024"}, - {"2001:579:40fc::/46", "22773"}, - {"2600:1403:8401::/36", "20940"}, - {"2607:f9d0:700::/36", "11979"}, - {"2a0d:9f40::/29", "204326"}, - {"2a10:aac0::/29", "211666"}, - {"2001:678:3a8::/48", "34309"}, - {"240a:a0d1::/32", "142859"}, - {"2804:14d:1491::/41", "28573"}, - {"2a00:fc8::/32", "34863"}, - {"2a03:1f80::/32", "57188"}, - {"2a04:2600::/29", "60924"}, - {"2001:550:7704::/48", "394346"}, - {"240e:3be:f700::/36", "4134"}, - {"2600:1419:8000::/48", "4230"}, - {"2803:23c0::/32", "52444"}, - {"2a00:9801:e002::/35", "51178"}, - {"2a01:b3c0::/32", "59647"}, - {"2a03:90c0:420::/41", "199524"}, - {"2a0b:52c0:8000::/33", "205691"}, - {"2001:67c:281c::/48", "198692"}, - {"2600:1002:b1d0::/44", "6167"}, - {"2602:fe12:1::/44", "62707"}, - {"2804:1b40:9000::/33", "28255"}, - {"2a01:8b80::/29", "8821"}, - {"2a02:9000::/28", "3352"}, - {"2001:559:c2c2::/48", "13367"}, - {"2804:13d0:9ac0::/33", "263297"}, - {"2001:559:84c1::/48", "33489"}, - {"2408::/22", "9595"}, - {"2605:a401:80c1::/45", "33363"}, - {"2804:73bc:700::/40", "270934"}, - {"2a00:a7a0:1000::/48", "62243"}, - {"2409:801d:2906::/32", "132525"}, - {"2800:22::/32", "7908"}, - {"2600:6c38:e1::/46", "20115"}, - {"2001:559:c317::/48", "33652"}, - {"2409:805c:3::/45", "9808"}, - {"2600:100a:b0d0::/44", "6167"}, - {"2804:2fc4:ff1a::/45", "264911"}, - {"2a03:d280::/32", "197133"}, - {"2409:8052:2c00::/38", "9808"}, - {"240a:a42f::/32", "143721"}, - {"2620:72::/48", "10359"}, - {"2803:d100:e480::/38", "52362"}, - {"2a11:e487:42::/48", "212568"}, - {"2804:844c::/32", "272252"}, - {"2806:2f0:9c01::/46", "17072"}, - {"2a00:1158:2::/47", "34011"}, - {"2400:fc00:8160::/40", "45773"}, - {"240e:44d:1780::/41", "4134"}, - {"2804:2350::/32", "264155"}, - {"2a02:2370:200::/46", "32787"}, - {"2a02:26f7:e514::/48", "36183"}, - {"2a09:e201::/48", "208422"}, - {"2001:550:c06::/39", "174"}, - {"2407:3a80::/32", "133045"}, - {"2602:ffb8::/36", "14469"}, - {"2a03:8040::/32", "60551"}, - {"2a0f:9441:41::/48", "209808"}, - {"2001:da8:9011::/48", "23910"}, - {"2403:2140::/32", "9751"}, - {"240a:adba::/32", "146164"}, - {"2604:8dc0:100::/40", "40474"}, - {"2a00:cac0::/32", "39555"}, - {"2404:bf40:c005::/42", "139084"}, - {"2800:200:e801::/41", "12252"}, - {"2a02:26f7:e8cd::/46", "20940"}, - {"2408:8456:8440::/39", "17816"}, - {"2409:8924:bd00::/38", "56046"}, - {"2806:250:5f1::/44", "28509"}, - {"2a02:26f7:c688::/48", "36183"}, - {"2c0f:ec60::/32", "37282"}, - {"2001:559:c512::/48", "33659"}, - {"2804:2e18::/32", "265323"}, - {"2607:fe90::/33", "19237"}, - {"2800:484:bb00::/40", "10620"}, - {"2804:3fdc::/32", "265920"}, - {"2a0b:d100::/29", "206828"}, - {"2408:8956:b700::/40", "17816"}, - {"240a:a1f9::/32", "143155"}, - {"2604:ca00:100::/45", "36492"}, - {"2a01:53c0:fff4::/44", "54994"}, - {"2001:67c:2b28::/48", "39489"}, - {"2001:43d0::/32", "37061"}, - {"2404:f4c0:800::/40", "32167"}, - {"2a00:1ec0:2::/48", "5425"}, - {"2a0e:1c40:2000::/48", "208635"}, - {"2409:8b1a::/29", "132525"}, - {"2803:8d43::/32", "52262"}, - {"2804:296c::/32", "264014"}, - {"2001:253:131::/48", "142097"}, - {"2001:678:26c::/48", "41062"}, - {"2401:c400:1000::/48", "45785"}, - {"2603:fa90::/25", "397165"}, - {"2a00:f400::/32", "28931"}, - {"2a06:e6c0::/29", "203143"}, - {"2401:e80::/32", "38293"}, - {"240a:a9be::/32", "145144"}, - {"2804:14c:d482::/48", "28573"}, - {"2001:678:d90::/48", "213092"}, - {"2605:3380:4462::/44", "12025"}, - {"2806:230:6028::/48", "265594"}, - {"2001:4878:4136::/48", "12222"}, - {"2402:800:5363::/43", "7552"}, - {"2804:235c::/32", "52747"}, - {"2a02:38:1112::/32", "6881"}, - {"2a02:ee80:42ce::/43", "3573"}, - {"2401:d800:d20::/41", "7552"}, - {"2402:3a80:c00a::/48", "55410"}, - {"240a:a0ae::/32", "142824"}, - {"2803:b8c0::/32", "264790"}, - {"2804:6a44::/32", "270323"}, - {"2804:729c::/32", "270864"}, - {"2a02:26f7:bf8d::/46", "20940"}, - {"2001:df1:5680::/48", "139378"}, - {"2001:df6:e580::/48", "24565"}, - {"2001:1248:8714::/44", "11172"}, - {"2404:ba00:10::/41", "17665"}, - {"2409:8958:cb54::/37", "56040"}, - {"2600:370f:72aa::/43", "32261"}, - {"2607:f7a8:163e::/36", "46887"}, - {"2804:44fc::/32", "267665"}, - {"2804:7988::/32", "271311"}, - {"2a02:4e0:2500::/41", "16135"}, - {"2a02:2638:4::/44", "44788"}, - {"2a04:4e80::/47", "211400"}, - {"2001:678:f3c::/48", "211640"}, - {"2408:8256:2d8a::/48", "17816"}, - {"2607:c080::/32", "32767"}, - {"2a09:e980::/29", "62240"}, - {"2a11:e280::/29", "204790"}, - {"240a:a93d::/32", "145015"}, - {"2a0a:1e40::/32", "51300"}, - {"2001:6f0::/34", "1257"}, - {"2401:d800:5bb0::/41", "7552"}, - {"2a0b:15c0::/29", "42207"}, - {"2404:ff80::/39", "64096"}, - {"240e:2::/31", "4134"}, - {"2620:12f:d000::/48", "40342"}, - {"2804:1828::/32", "61921"}, - {"2804:29a4::/37", "264026"}, - {"2a00:1a80::/32", "33920"}, - {"2a0a:9a40::/29", "205801"}, - {"2a0d:b201:60b0::/41", "206026"}, - {"2604:dc00:7409::/41", "19752"}, - {"2606:f480::/32", "54328"}, - {"2804:664c:3e90::/32", "269547"}, - {"2a07:e700::/29", "43260"}, - {"2600:1406:801::/38", "20940"}, - {"2602:feb4:c0::/44", "25961"}, - {"2804:31cc::/32", "265038"}, - {"2804:7eb8::/32", "271643"}, - {"2a09:7:2003::/48", "35536"}, - {"2a0c:2340::/29", "44399"}, - {"2402:d000:100d::/41", "9329"}, - {"2408:8956:c700::/40", "17816"}, - {"2800:484:d600::/40", "10620"}, - {"2a02:2e02:8790::/36", "12479"}, - {"2001:df0:62:8896::/49", "38040"}, - {"2401:d800:8000::/35", "7552"}, - {"2604:9dc0::/32", "393626"}, - {"2a02:88d:8010::/44", "48695"}, - {"240a:a479::/32", "143795"}, - {"240e:44d:1480::/41", "4134"}, - {"2800:ba0::/48", "263812"}, - {"2806:2f0:9823::/41", "17072"}, - {"2a03:c500::/32", "51704"}, - {"2607:f7a8:826::/48", "395749"}, - {"2803:5c80:6598::/48", "64114"}, - {"2a0e:ffc0::/29", "57756"}, - {"2001:559:854f::/48", "7725"}, - {"2001:559:c166::/47", "33659"}, - {"2408:8456:2000::/42", "17622"}, - {"2607:f038:401c::/46", "21527"}, - {"2620:113:1000::/46", "15224"}, - {"2408:80ea:6780::/41", "17622"}, - {"2408:820c:a940::/30", "17621"}, - {"2804:bcc::/32", "52830"}, - {"2a02:26f7:97::/48", "20940"}, - {"2409:8914:8400::/39", "56044"}, - {"240e:108:10b2::/41", "4134"}, - {"2602:fed2:712d::/48", "53356"}, - {"2606:7740::/47", "16509"}, - {"2607:f250:d024::/48", "7046"}, - {"2001:559:85d8::/48", "33667"}, - {"2001:16a2:8000::/43", "25019"}, - {"2401:d800:d250::/42", "7552"}, - {"2404:e800:4::/39", "55430"}, - {"240a:408a:c000::/35", "58834"}, - {"2604:9500::/32", "13807"}, - {"2804:14c:bbb0::/41", "28573"}, - {"2804:28c8::/32", "263980"}, - {"2405:f080:9ff::/48", "141180"}, - {"2408:8459:e810::/42", "17623"}, - {"240a:a26a::/32", "143268"}, - {"240e:3ba:9200::/36", "140317"}, - {"2600:6c38:b2d::/43", "20115"}, - {"2600:6c38:c16::/42", "20115"}, - {"2607:fed8::/32", "36416"}, - {"2800:b20::/35", "14754"}, - {"2804:4234::/32", "26104"}, - {"2a01:8840:ed::/48", "207266"}, - {"2a04:4e40:6200::/48", "54113"}, - {"2a07:4700::/29", "2119"}, - {"2a0a:8a40::/32", "56859"}, - {"2001:da8:5007::/41", "24360"}, - {"2408:8206::/35", "4808"}, - {"240e:d9:c000::/36", "38283"}, - {"240e:983:1e07::/48", "58543"}, - {"2804:14d:7800::/40", "28573"}, - {"2804:4478::/32", "267634"}, - {"2a06:dac0::/44", "212661"}, - {"2a0e:e744::/30", "208283"}, - {"2402:800:9a2b::/41", "7552"}, - {"2408:400e:fe88::/22", "37963"}, - {"2a02:26f7:b589::/42", "20940"}, - {"2804:20::/41", "26615"}, - {"2a05:c680::/29", "39259"}, - {"2001:559:132::/48", "7922"}, - {"2409:802e:2901::/48", "56041"}, - {"240e:108:1150::/48", "140527"}, - {"2600:100d:b0d0::/42", "6167"}, - {"2a00:1f70::/32", "12722"}, - {"2001:559:573::/48", "33659"}, - {"2001:67c:2d6c::/48", "16302"}, - {"2409:8074:2100::/35", "9808"}, - {"240a:a2e2::/32", "143388"}, - {"2403:9800:c300::/40", "4771"}, - {"2a0f:20c0::/29", "60262"}, - {"2403:7a00::/32", "17676"}, - {"2408:8856:100::/38", "17622"}, - {"240a:a6d5::/32", "144399"}, - {"2600:2004:3000::/36", "33517"}, - {"2001:67c:132c::/48", "13189"}, - {"2001:c08::/32", "9264"}, - {"240a:aab3::/32", "145389"}, - {"240e:bf:b8e0::/46", "138679"}, - {"2605:c080::/32", "393682"}, - {"2001:388:3059::/40", "7575"}, - {"2406:9dc0:100::/44", "18250"}, - {"2409:8087:4c17::/38", "9808"}, - {"240a:a179::/32", "143027"}, - {"2804:4724::/32", "267034"}, - {"2804:7344::/32", "270905"}, - {"2a02:26f7:d084::/48", "36183"}, - {"2001:678:ec4::/48", "212378"}, - {"2407:6480::/32", "141153"}, - {"2408:8956:7d00::/40", "17816"}, - {"2408:8957:2300::/40", "17816"}, - {"240a:a5b3::/32", "144109"}, - {"2607:fca8:1531::/33", "17139"}, - {"2c0f:7d00::/32", "328942"}, - {"2001:559:8622::/48", "33287"}, - {"2409:8c54:5800::/34", "56040"}, - {"2a00:a8e0:101::/48", "8767"}, - {"2a0c:a400::/29", "34907"}, - {"2404:3d00:40dc::/47", "21433"}, - {"2804:2c8c::/32", "265226"}, - {"2804:3d74::/45", "262617"}, - {"2804:3df8:8000::/33", "266566"}, - {"2a02:26f7:f80d::/46", "20940"}, - {"2a02:ddc0::/30", "47165"}, - {"2a0f:63c0::/29", "212238"}, - {"2600:1402:1c01::/34", "20940"}, - {"2602:ff3c::/36", "395111"}, - {"2607:6780::/32", "395282"}, - {"2801:1b0::/40", "263719"}, - {"2804:32d8::/32", "28212"}, - {"2804:4d48:4040::/32", "53115"}, - {"2a02:970:1246::/44", "44002"}, - {"2a04:a180::/32", "199799"}, - {"2a09:b280::/48", "210025"}, - {"2408:840d:ba00::/42", "17621"}, - {"2804:4dd0::/32", "268221"}, - {"2001:ee0:320a::/41", "45899"}, - {"2800:3c0:1060::/40", "19863"}, - {"2c0f:f060::/32", "328154"}, - {"2402:3a80:c064::/48", "38266"}, - {"240a:a21a::/32", "143188"}, - {"2804:8534::/32", "272564"}, - {"2001:559:c34f::/48", "7015"}, - {"2001:678:84::/48", "51955"}, - {"2401:d800:9d00::/42", "7552"}, - {"2404:c300::/32", "4859"}, - {"2407:70c0::/48", "140833"}, - {"2408:8459:9c30::/41", "17622"}, - {"2804:2e5c::/32", "265341"}, - {"2a02:6c00:f000::/44", "44971"}, - {"2401:4900:4110::/38", "45609"}, - {"2408:8956:4100::/40", "17816"}, - {"240a:ad03::/32", "145981"}, - {"240e:a7:8800::/37", "134419"}, - {"2605:b800::/37", "23550"}, - {"2804:7010::/32", "270701"}, - {"2a01:7d20:7d20::/47", "203645"}, - {"2001:678:600::/48", "204600"}, - {"2602:ff32:3::/48", "55247"}, - {"2803:a410:9012::/48", "64114"}, - {"2804:1d28::/32", "264351"}, - {"2804:1f22::/32", "264957"}, - {"2001:6d0:d6::/48", "43832"}, - {"2409:8000:5a00::/40", "56048"}, - {"240e:45c:c800::/40", "131285"}, - {"2804:f28::/32", "262683"}, - {"2a02:29ab:1::/29", "60142"}, - {"2a0f:a440::/29", "212598"}, - {"2001:559:8344::/48", "7922"}, - {"2001:1980:200::/37", "29838"}, - {"2401:d800:7930::/41", "7552"}, - {"2602:feda:b70::/48", "212705"}, - {"2804:14c:9983::/41", "28573"}, - {"2804:14d:3e00::/40", "28573"}, - {"2409:8087:7100::/37", "9808"}, - {"2806:2f0:5181::/42", "17072"}, - {"2a07:600::/29", "13030"}, - {"2401:af00::/32", "45345"}, - {"2401:d800:b690::/42", "7552"}, - {"2600:1408:8::/46", "20940"}, - {"2804:51a4::/33", "268467"}, - {"2a0c:78c0::/29", "207133"}, - {"2001:67c:18d8::/48", "199973"}, - {"2804:cdc:9040::/34", "52565"}, - {"2a00:1908:fffa::/48", "205365"}, - {"2a00:7f20:e000::/35", "60791"}, - {"2a02:26f7:c848::/48", "36183"}, - {"2001:67c:4bc::/48", "204896"}, - {"2607:a800:305::/48", "15695"}, - {"2804:462c::/32", "266973"}, - {"2804:5298::/32", "268528"}, - {"2408:8956:2500::/40", "17816"}, - {"2409:8914:6e00::/39", "56044"}, - {"240e:678:e400::/31", "4134"}, - {"2a00:f6e0::/32", "49034"}, - {"2a02:26f0:ab::/45", "20940"}, - {"2a05:aa40::/29", "5500"}, - {"2001:bc8::/35", "12876"}, - {"2001:1248:5578::/46", "11172"}, - {"2620:16e:89::/48", "3147"}, - {"2a0d:77c7:88e3::/33", "7489"}, - {"2404:bf40:a641::/40", "139084"}, - {"2607:b800::/32", "1970"}, - {"2804:14d:4e81::/45", "28573"}, - {"2806:2f0:2040::/48", "17072"}, - {"2a05:1084:7500::/32", "59598"}, - {"2a0c:16c0::/31", "42532"}, - {"2a11:3e00::/29", "42375"}, - {"2401:d800:bb20::/41", "7552"}, - {"2605:da00:5222::/48", "14935"}, - {"2a06:2d40:3::/48", "20473"}, - {"2001:67c:2954::/48", "51973"}, - {"2402:3300:5000::/48", "56300"}, - {"2408:8256:316d::/43", "17623"}, - {"2602:fd60:12::/48", "396503"}, - {"2a02:ec40::/32", "39150"}, - {"2001:550:6a01::/46", "174"}, - {"2001:559:84d1::/48", "7922"}, - {"2001:da8:c6::/48", "138440"}, - {"2a02:ff0:4::/48", "12735"}, - {"2a0e:b107:ea7::/48", "212085"}, - {"2001:500:83::/48", "42"}, - {"240a:ae75::/32", "146351"}, - {"2600:1408:b000::/48", "35994"}, - {"2803:da00::/32", "52253"}, - {"2804:383c::/45", "52601"}, - {"2804:68ac::/33", "269708"}, - {"2001:250:5876::/47", "24363"}, - {"2001:da8:217::/48", "23910"}, - {"240e:698:4c00::/26", "4134"}, - {"2602:fbd2::/36", "400395"}, - {"2804:7ee0::/32", "271651"}, - {"2a00:17d8::/32", "12574"}, - {"2001:678:303::/48", "207996"}, - {"2600:1007:b1f1::/48", "6167"}, - {"2804:44e8::/39", "267660"}, - {"2804:51a8::/32", "268468"}, - {"2806:2f0:3383::/42", "17072"}, - {"2a04:4e40:a600::/48", "54113"}, - {"2001:559:366::/48", "33660"}, - {"240a:a82d::/32", "144743"}, - {"2600:140a:a001::/33", "20940"}, - {"2607:9e80:1301::/40", "397068"}, - {"2a02:a58::/32", "8953"}, - {"2404:bf40:8a02::/34", "139084"}, - {"240a:a258::/32", "143250"}, - {"2600:1900:4110::/44", "15169"}, - {"2606:7940::/32", "26073"}, - {"2620:83:8001::/48", "63331"}, - {"240e:978:2000::/40", "137702"}, - {"2604:d600:1082::/44", "32098"}, - {"2804:7b0:8000::/33", "262453"}, - {"2402:800:572b::/43", "7552"}, - {"2402:7d80:6667::/35", "63582"}, - {"240a:a8b3::/32", "144877"}, - {"2605:a404:4f::/43", "33363"}, - {"2a02:2ad8:4110::/32", "702"}, - {"2a03:2880:f14d::/43", "32934"}, - {"2a03:7620::/32", "198297"}, - {"240a:ae43::/32", "146301"}, - {"2604:b100::/32", "20394"}, - {"2803:b2c0:1102::/45", "264851"}, - {"2001:559:1ee::/48", "33287"}, - {"2001:67c:2e48::/48", "210140"}, - {"2001:4490:d800::/46", "9829"}, - {"2406:20c0:e001::/35", "140423"}, - {"240e:108:1140::/46", "134768"}, - {"240e:95a:5000::/31", "4134"}, - {"2a00:7c80::/30", "49981"}, - {"2401:9d00:1132::/32", "9835"}, - {"2402:1b40:2000::/44", "7628"}, - {"2604:fe00::/45", "30517"}, - {"2001:4270::/32", "30998"}, - {"2409:8020::/43", "56046"}, - {"2409:8754:2800::/38", "56040"}, - {"240a:a5d0::/32", "144138"}, - {"2604:5cc0::/35", "13351"}, - {"2a01:3f7:2::/45", "57021"}, - {"2a02:26f7:e500::/48", "36183"}, - {"2001:559:86fe::/47", "33654"}, - {"2401:4900:3f90::/41", "45609"}, - {"2409:8c01::/30", "9808"}, - {"240e:109:8049::/46", "4134"}, - {"2804:798::/32", "262304"}, - {"2a01:a280:5::/48", "50306"}, - {"2a11:5704:b00b::/48", "212149"}, - {"2001:df3:d000::/48", "133044"}, - {"2409:8028:3002::/47", "56041"}, - {"2800:160:1159::/42", "14259"}, - {"2a01:5043:2007::/48", "202196"}, - {"2a02:26f7:ca44::/48", "36183"}, - {"2a03:f003:2300::/29", "25472"}, - {"2a0a:6580::/32", "206548"}, - {"2001:da8:d00c::/48", "23910"}, - {"2001:4878:37::/44", "12222"}, - {"2404:3e00:a500::/38", "38758"}, - {"2405:1c0:6371::/46", "55303"}, - {"2407:14c0:200::/37", "138077"}, - {"2408:8740::/32", "4837"}, - {"2806:2f0:11::/48", "22884"}, - {"2001:67c:1bdc::/48", "29493"}, - {"2001:4878:4027::/48", "12222"}, - {"2604:4500:18::/48", "29802"}, - {"2804:e00:6000::/32", "11419"}, - {"2a02:26f7:c4c0::/48", "36183"}, - {"2a02:26f7:f880::/48", "36183"}, - {"2001:559:8391::/48", "33667"}, - {"2401:4900:808::/43", "45609"}, - {"2804:14d:7e41::/40", "28573"}, - {"2403:bc80::/32", "133882"}, - {"2408:8459:a630::/41", "17622"}, - {"240a:a704::/32", "144446"}, - {"2604:d600:1227::/44", "32098"}, - {"2804:391c:1c::/32", "262287"}, - {"2001:559:841a::/48", "33650"}, - {"2408:8606::/28", "4808"}, - {"2408:8656::/36", "17622"}, - {"2800:40:1f::/42", "16814"}, - {"2a02:ed0:4000::/29", "47956"}, - {"2001:67c:764::/48", "201530"}, - {"2608:146:4::/48", "27046"}, - {"2801:0:360::/48", "27951"}, - {"2a02:17d8::/32", "41489"}, - {"2a02:cb43:4009::/48", "20546"}, - {"2a03:2c0:e::/48", "31029"}, - {"2001:579:9d8c::/41", "22773"}, - {"2001:648:2c30::/48", "8522"}, - {"2401:d800:21f2::/38", "7552"}, - {"2403:1540::/48", "45671"}, - {"2404:bb41::/32", "139240"}, - {"2408:8256:3b9c::/46", "17623"}, - {"2804:6614::/32", "269532"}, - {"2a0a:2cc0::/29", "206355"}, - {"2a0d:7980:200::/32", "48635"}, - {"2a11:1880::/29", "204790"}, - {"2001:500:2d::/48", "10886"}, - {"2401:e900::/45", "23991"}, - {"2602:fc6a::/48", "399747"}, - {"2001:559:c2b5::/48", "7015"}, - {"2408:840d:9300::/42", "17621"}, - {"2606:9fc0:9000::/48", "14618"}, - {"2607:9800:e001::/35", "15085"}, - {"2a09:77c4::/30", "1239"}, - {"2001:559:4b2::/48", "33651"}, - {"2403:4f00::/36", "139580"}, - {"2a02:7b00::/36", "48328"}, - {"2a0b:f302:459::/31", "62240"}, - {"2409:806b:3900::/33", "9808"}, - {"2a02:26f7:108::/48", "36183"}, - {"2a02:26f7:f34c::/48", "36183"}, - {"2a0e:3400::/29", "209095"}, - {"2001:559:80e8::/48", "33651"}, - {"2402:8100:39cd::/46", "55644"}, - {"2605:59c1:2000::/32", "36492"}, - {"2620:0:360::/47", "14182"}, - {"2001:559:5ea::/48", "33651"}, - {"2001:661:4000::/35", "2472"}, - {"2606:6140::/34", "31764"}, - {"2a00:4bc0:210d::/46", "31004"}, - {"2405:a900:ffff::/48", "55992"}, - {"240e:3b8:c000::/37", "140315"}, - {"240e:3be:1200::/39", "4134"}, - {"2605:2fc0:1000::/39", "31984"}, - {"2a02:4500::/32", "200567"}, - {"2001:559:c370::/48", "33657"}, - {"2406:20c0:8001::/34", "140423"}, - {"2a01:53c0:fd00::/48", "13658"}, - {"2a03:2ba0::/32", "47944"}, - {"2a09:4c0:101::/40", "58057"}, - {"2400:8b00:f80::/42", "45727"}, - {"2403:9800:7f06::/44", "4771"}, - {"240a:a9f4::/32", "145198"}, - {"2804:4b0:500::/40", "262459"}, - {"2804:5798::/32", "268074"}, - {"2806:2f0:6263::/40", "17072"}, - {"2806:2f0:8101::/46", "17072"}, - {"2a11:dc0::/29", "211199"}, - {"2400:4be0:14::/48", "141898"}, - {"240a:a70d::/32", "144455"}, - {"2804:1574::/32", "263389"}, - {"2804:65a8::/32", "269506"}, - {"2a02:26f7:f2c5::/46", "20940"}, - {"2a0b:7dc0::/32", "205494"}, - {"2a0c:a0c0::/31", "202486"}, - {"2001:410:a000::/47", "8111"}, - {"2001:559:c223::/48", "7922"}, - {"240a:ae53::/32", "146317"}, - {"2804:1270:a1::/32", "262851"}, - {"2a03:be80:15::/41", "15510"}, - {"2a0e:97c0:1ba::/47", "211840"}, - {"2a12:b3c0::/29", "174"}, - {"2408:84f3:2e20::/43", "17816"}, - {"2001:df6:e400::/48", "132976"}, - {"2401:d800:d702::/41", "7552"}, - {"2402:800:9d9b::/42", "7552"}, - {"2800:bf0:a108::/47", "52257"}, - {"2a0c:f000::/48", "206976"}, - {"2001:559:c084::/48", "33651"}, - {"2604:d600:15b7::/44", "32098"}, - {"2806:230:1009::/48", "11888"}, - {"2a0c:480::/32", "50673"}, - {"2001:559:829b::/48", "33651"}, - {"2604:eb40::/48", "6233"}, - {"2804:3034::/39", "264936"}, - {"2a01:8840:91::/48", "207266"}, - {"2a05:d050:c080::/44", "16509"}, - {"2a0a:4785::/32", "59504"}, - {"2001:fd0:db::/38", "10029"}, - {"2402:800:3655::/42", "7552"}, - {"240e:980:9a00::/40", "58466"}, - {"2600:9000:22ff::/39", "16509"}, - {"2a0f:5707:ab2d::/48", "13830"}, - {"2400:9380:92c0::/44", "136167"}, - {"2620:d2::/48", "25631"}, - {"2803:6602::/33", "28075"}, - {"2a00:1eb8::/35", "8764"}, - {"2a02:26f7:c410::/48", "36183"}, - {"2001:df3:e480::/48", "140699"}, - {"2600:100a:b050::/40", "22394"}, - {"2600:1404:1801::/33", "20940"}, - {"2603:c012:6000::/36", "31898"}, - {"2804:1b3:6000::/36", "18881"}, - {"2a0e:46c4:22a3::/48", "136918"}, - {"2001:559:c10d::/48", "33662"}, - {"2001:579:52c4::/39", "22773"}, - {"2001:67c:1590::/48", "21430"}, - {"2001:67c:1b1c::/48", "43719"}, - {"2001:bf7:fc00::/44", "208942"}, - {"2404:1580::/32", "134854"}, - {"2405:5600::/32", "10135"}, - {"2a07:6cc1::/32", "61098"}, - {"2a11:89c0::/29", "204790"}, - {"240a:a779::/32", "144563"}, - {"2a02:79e0::/32", "60032"}, - {"240a:a9fa::/32", "145204"}, - {"2606:9840::/32", "400282"}, - {"2001:559:c117::/48", "33667"}, - {"2001:678:450::/48", "1257"}, - {"2001:1998:610::/41", "7843"}, - {"2001:4200:5000::/48", "37501"}, - {"2402:800:9a63::/43", "7552"}, - {"2404:3d80:2cb::/42", "147297"}, - {"240e:44d:7980::/41", "4134"}, - {"2605:4380::/32", "260"}, - {"2607:ffe0::/32", "33541"}, - {"2a01:cde0:100::/48", "16028"}, - {"2405:6e00:2ef::/43", "133612"}, - {"2620:87:a000::/44", "12186"}, - {"2a02:ad0::/29", "61157"}, - {"2c0f:ec18::/32", "328391"}, - {"2408:8956:e800::/40", "17622"}, - {"2620:101:b000::/41", "12079"}, - {"2a02:888:151::/48", "47794"}, - {"2a02:970:101a::/42", "44002"}, - {"2a02:26f7:c490::/48", "36183"}, - {"2a06:6880::/37", "209620"}, - {"2001:559:86a8::/47", "33651"}, - {"2001:df3:1e00::/48", "55824"}, - {"2001:16a2:6400::/35", "25019"}, - {"2610:1e0:1f01::/32", "3714"}, - {"2804:18:30::/44", "26599"}, - {"2400:9700:6::/39", "24550"}, - {"2403:6040::/32", "17665"}, - {"2600:1900:4130::/44", "15169"}, - {"2600:9000:231b::/45", "16509"}, - {"2800:370:4a::/48", "28006"}, - {"2804:7254::/32", "270847"}, - {"2a02:26f0:700::/48", "7545"}, - {"2a0a:fcc0::/32", "211752"}, - {"2001:df1:3200::/48", "131353"}, - {"2001:1248:a41e::/42", "11172"}, - {"2605:7900:1::/45", "19133"}, - {"2620:11f:4000::/40", "16478"}, - {"2804:eec:4001::/46", "25933"}, - {"2a0a:dd80::/29", "211199"}, - {"2602:fc64:a000::/47", "36829"}, - {"2803:b780::/48", "27742"}, - {"2804:37a8::/35", "266428"}, - {"2a0b:4340:41::/48", "41780"}, - {"2001:579:b158::/40", "22773"}, - {"2001:da8:a0::/48", "24348"}, - {"240a:a115::/32", "142927"}, - {"240a:aa52::/32", "145292"}, - {"2606:6800:3400::/40", "394895"}, - {"2804:7a4::/32", "52860"}, - {"2a01:4c80::/32", "21446"}, - {"2a02:26f7:c709::/46", "20940"}, - {"2001:918:ff3f::/41", "3303"}, - {"2602:fc8b::/48", "211544"}, - {"2001:559:8227::/44", "7922"}, - {"2001:559:c123::/48", "7725"}, - {"2600:6c10:bb::/45", "20115"}, - {"2804:6510:c000::/34", "269466"}, - {"2a03:8d20::/48", "200849"}, - {"2a0d:8480:3::/48", "207651"}, - {"2620:107:9098::/46", "22787"}, - {"2803:7200:801d::/33", "27696"}, - {"2806:3c2::/32", "270121"}, - {"2a0b:4e00::/46", "207059"}, - {"2001:559:4fa::/48", "33491"}, - {"2001:678:89c::/48", "57195"}, - {"2409:8907:7920::/38", "24547"}, - {"2409:8959:cc44::/43", "9808"}, - {"2804:2408::/32", "52705"}, - {"2a00:4cc4:a::/48", "60109"}, - {"2a05:d050:10c0::/44", "16509"}, - {"2001:678:d70::/48", "212535"}, - {"2600:6c10:e04::/41", "20115"}, - {"2603:c002:9010::/38", "31898"}, - {"2605:e000:c0c::/35", "20001"}, - {"2804:14d:72bd::/41", "28573"}, - {"2806:2f0:43e1::/46", "17072"}, - {"2a03:2880:f072::/45", "32934"}, - {"2a09:1480:200::/29", "35704"}, - {"2a0c:b642:1a0e::/48", "61138"}, - {"2400:fc00:8c60::/40", "45773"}, - {"2404:bf40:8401::/46", "7545"}, - {"2408:8459:6830::/41", "17622"}, - {"2800:160:1a8a::/45", "14259"}, - {"2001:b400:d410::/36", "3462"}, - {"2806:2f0:429f::/41", "17072"}, - {"2a09:f540::/31", "202376"}, - {"2a02:7d8::/36", "3302"}, - {"2001:508::/44", "32020"}, - {"2402:c800:fff7::/44", "38639"}, - {"2804:21b4::/32", "264568"}, - {"2804:6128::/33", "269217"}, - {"2a01:111:3000::/33", "8075"}, - {"2a01:5c40:4::/47", "12687"}, - {"2a02:f680:2::/29", "35196"}, - {"2a03:7680::/32", "20905"}, - {"2001:559:84ba::/48", "7015"}, - {"2001:559:c02a::/45", "7922"}, - {"2400:c000::/32", "38294"}, - {"2602:feda:f4::/48", "38023"}, - {"2607:ff00:100::/40", "20454"}, - {"2806:230:601a::/48", "265594"}, - {"2001:da8:700c::/48", "23910"}, - {"2001:4cb8:86::/41", "28878"}, - {"2408:8956:ec00::/39", "17622"}, - {"240a:a160::/32", "143002"}, - {"240a:ac57::/32", "145809"}, - {"2600:6c38:b5a::/47", "20115"}, - {"2607:f0d0:2000::/39", "36351"}, - {"2a02:26f0:9601::/40", "20940"}, - {"2a04:f580:9210::/48", "4809"}, - {"2c0f:fea8::/32", "37248"}, - {"2605:c400::/32", "19381"}, - {"2a02:26f7:eac1::/46", "20940"}, - {"2a0d:c940::/29", "212144"}, - {"2407:f6c0::/32", "147064"}, - {"2409:4043:1000::/34", "55836"}, - {"2600:1404:c801::/37", "20940"}, - {"2001:559:361::/48", "7922"}, - {"2401:8640::/32", "23884"}, - {"2400:6180:100::/40", "14061"}, - {"2401:7500:1000::/39", "133296"}, - {"2405:9800:c910::/48", "55488"}, - {"2409:804b:2b08::/48", "9808"}, - {"2a04:4e40:ca30::/41", "54113"}, - {"2a10:8a40::/29", "39405"}, - {"2607:f480:111::/48", "27435"}, - {"2a02:26f7:ef48::/48", "36183"}, - {"2001:4c0:2::/33", "855"}, - {"2403:e800::/37", "4637"}, - {"2604:8f80::/32", "22667"}, - {"2800:160:10b2::/41", "14259"}, - {"2804:5e18::/33", "269011"}, - {"2a02:26f0:9901::/40", "20940"}, - {"2a04:bdc7:100::/48", "63473"}, - {"2a0a:db00::/44", "51559"}, - {"2a11:3600::/48", "35592"}, - {"2401:4900:60d0::/42", "45609"}, - {"240a:affb::/32", "146741"}, - {"2605:3400::/32", "15267"}, - {"2607:6b80:6::/48", "55081"}, - {"2620:123:200b::/45", "30103"}, - {"2a01:7dc0::/32", "204274"}, - {"2a0e:bb00::/29", "680"}, - {"240a:ae38::/32", "146290"}, - {"2a00:6060:8001::/34", "60983"}, - {"2a02:6ea0:c000::/36", "60068"}, - {"2a09:b340::/29", "202591"}, - {"2407:4d00:2000::/36", "38841"}, - {"2602:fc6f::/36", "399568"}, - {"2801:14:6800::/48", "19429"}, - {"2a03:77e0:3301::/48", "48305"}, - {"2c0f:ff80::/32", "327698"}, - {"2408:80e0:4000::/32", "4808"}, - {"240a:a1cc::/32", "143110"}, - {"2606:12c0::/32", "55017"}, - {"2804:73a4::/32", "270928"}, - {"2a0a:60c1:2::/48", "212782"}, - {"2001:1388:602::/39", "6147"}, - {"2620:108:f006::/48", "8161"}, - {"2a00:5d20::/32", "28717"}, - {"2a01:468::/29", "5403"}, - {"2a0f:2a80::/29", "204860"}, - {"2001:400:8818:51::/42", "293"}, - {"2600:6c34:203::/45", "33588"}, - {"2602:fd92:802::/40", "211481"}, - {"2804:5534:2002::/37", "268696"}, - {"2a02:26f7:f08d::/42", "20940"}, - {"2600:1403:b401::/36", "20940"}, - {"2600:1406:1a01::/37", "20940"}, - {"2602:fdc8::/36", "397656"}, - {"2603:90f5:600::/40", "10796"}, - {"2620:6e:c000::/48", "393401"}, - {"2a02:b50:8000::/47", "48910"}, - {"2a09:a300::/32", "8896"}, - {"2402:800:52d3::/44", "7552"}, - {"240a:a176::/32", "143024"}, - {"240e:44d:7180::/41", "4134"}, - {"2001:559:8d::/46", "13367"}, - {"2001:49f0:d057::/40", "174"}, - {"240e:267:7400::/36", "4134"}, - {"2603:c026::/35", "31898"}, - {"2605:d880::/32", "40945"}, - {"2a00:c6c0::/48", "47172"}, - {"2a02:2ac0::/32", "702"}, - {"2a0e:4c80::/29", "328543"}, - {"240a:ae85::/32", "146367"}, - {"2a02:587:50f8::/46", "6799"}, - {"2a0a:4540::/48", "203420"}, - {"2001:559:522::/48", "7015"}, - {"2001:1838:a100::/33", "23352"}, - {"2001:1ad0:c4ff::/34", "24953"}, - {"2402:8100:ca0::/44", "45271"}, - {"2602:803:9000::/46", "17138"}, - {"2804:3d4:38::/45", "262401"}, - {"2a01:51c2::/29", "29422"}, - {"2001:550:2400::/48", "18531"}, - {"2001:559:85cb::/48", "7015"}, - {"2408:84f3:aa40::/37", "17816"}, - {"240e:1:f800::/37", "17799"}, - {"2607:fc00::/32", "13576"}, - {"2804:f54::/32", "263580"}, - {"2a03:a960::/47", "61317"}, - {"2400:3b00:50::/48", "18229"}, - {"240a:a8af::/32", "144873"}, - {"2600:6c7f:93c0::/42", "19115"}, - {"2605:5240:5000::/32", "397494"}, - {"2804:14d:2c81::/46", "28573"}, - {"2804:870::/32", "52871"}, - {"2806:2f0:4223::/41", "17072"}, - {"2a04:b00::/29", "199256"}, - {"2001:df1:a180::/48", "137655"}, - {"2001:fd8:b2b0::/44", "4775"}, - {"2804:2054::/32", "264486"}, - {"2804:5694::/32", "268010"}, - {"2806:370:91a0::/41", "28403"}, - {"2a02:6100::/32", "34572"}, - {"2001:470:8a::/48", "16871"}, - {"2409:8a1a:7600::/29", "132525"}, - {"2607:fa48:200::/32", "5769"}, - {"2a02:7a01::/32", "197895"}, - {"2405:6400::/35", "23678"}, - {"2804:18:1020::/40", "26599"}, - {"2804:44dc::/32", "267658"}, - {"2a02:26f7:b8::/48", "36183"}, - {"2400:ac40:bb0::/37", "136255"}, - {"240e:3b3:5600::/34", "136199"}, - {"240e:67e:c400::/39", "140330"}, - {"2620:9b:e000::/48", "399992"}, - {"2a12:a300::/31", "23959"}, - {"2c0f:fe18::/32", "37179"}, - {"2602:80d:1000::/48", "398722"}, - {"2a02:26f7:d200::/48", "36183"}, - {"2a06:d1c0::/32", "59645"}, - {"2a11:2280::/29", "204790"}, - {"2402:3a80:c056::/48", "38266"}, - {"2409:8904:8b90::/37", "24547"}, - {"240a:acbb::/32", "145909"}, - {"2606:4700:80c0::/44", "13335"}, - {"2804:4d98::/32", "268207"}, - {"2a00:16c8:10d::/32", "50173"}, - {"2a00:49c0::/32", "199213"}, - {"2a02:888:814a::/45", "47794"}, - {"2a0f:5f40::/29", "200019"}, - {"2001:418:1401:6b::/61", "2914"}, - {"2001:c38:90a5::/44", "135566"}, - {"2001:fb0:109f::/59", "7470"}, - {"240a:a91f::/32", "144985"}, - {"2804:17c0::/32", "263155"}, - {"2a02:26f0:3d::/48", "31108"}, - {"2001:559:8410::/48", "7015"}, - {"2001:67c:24c::/48", "49420"}, - {"2001:df1:c700::/47", "136786"}, - {"2402:3a80:f00::/35", "38266"}, - {"2605:1980:206::/37", "13951"}, - {"2606:2440::/36", "3838"}, - {"2620:16d:701::/34", "7862"}, - {"2a01:7a4::/32", "34289"}, - {"2001:678:4d4::/48", "24868"}, - {"2607:ffd8:802::/32", "33333"}, - {"2001:738:5::/32", "1955"}, - {"2001:1980:6900::/32", "29838"}, - {"2800:160:1104::/46", "14259"}, - {"2a02:b48:810e::/43", "39572"}, - {"2001:df0:4400::/48", "17670"}, - {"240a:a17a::/32", "143028"}, - {"2600:1405:5c01::/34", "20940"}, - {"2606:2800:400e::/47", "15133"}, - {"2804:4644::/32", "266979"}, - {"2403:1940:40::/48", "137935"}, - {"2403:cec0::/32", "137995"}, - {"2600:80c:e00::/40", "701"}, - {"2600:1004:a120::/36", "22394"}, - {"2607:f170:30::/39", "6364"}, - {"2a02:26f7:e78c::/48", "36183"}, - {"2a0c:9a40:c000::/47", "209022"}, - {"2403:8600:80a0::/41", "45820"}, - {"2602:809:3008::/47", "34553"}, - {"2804:4c14:fb01::/37", "267348"}, - {"2a00:43c0::/32", "3257"}, - {"2a09:1340::/29", "56430"}, - {"2603:8074::/32", "11351"}, - {"2607:f6f0:6001::/48", "394749"}, - {"2a02:26f7:bf41::/46", "20940"}, - {"2a04:8000::/29", "200000"}, - {"2a04:ac00:8::/48", "57010"}, - {"2001:559:385::/48", "33491"}, - {"2602:fdb8:130::/44", "394151"}, - {"2a0c:4c0::/29", "52080"}, - {"2001:559:c472::/48", "33287"}, - {"2409:8907:6e20::/35", "24547"}, - {"2607:7c80:59::/32", "64260"}, - {"2804:6bb8::/32", "270419"}, - {"2a0d:2587:8300::/48", "138517"}, - {"2001:559:73f::/48", "33491"}, - {"2001:67c:20f4::/48", "39732"}, - {"2001:1248:5fad::/41", "11172"}, - {"2804:18:4000::/36", "26599"}, - {"2001:559:6e::/48", "33651"}, - {"2001:559:8566::/48", "7015"}, - {"2408:8000:c040::/31", "4837"}, - {"2a02:26f7:e889::/46", "20940"}, - {"2001:c20:4883::/45", "9255"}, - {"2406:2000:a4::/48", "10230"}, - {"2604:b480::/32", "46841"}, - {"2a0d:2581:fffe::/47", "209261"}, - {"2a0d:91c0::/29", "40970"}, - {"2404:e4c0:1008::/48", "54201"}, - {"2606:3c80::/32", "33582"}, - {"2607:6b80:27::/43", "262287"}, - {"2804:82c::/32", "262355"}, - {"2404:5700::/32", "58666"}, - {"2408:8957:5900::/40", "17816"}, - {"2804:248:200::/33", "28598"}, - {"2a0d:9ec0::/48", "395092"}, - {"2001:18c8:300::/40", "19149"}, - {"2001:4dc8:f00:1::96:a/32", "16316"}, - {"2401:d800:d2e0::/39", "7552"}, - {"2001:df0:a1::/48", "55532"}, - {"2409:8924:9300::/37", "56046"}, - {"240a:ac84::/32", "145854"}, - {"2606:2800:4a10::/46", "15133"}, - {"2607:f368:3210::/44", "32982"}, - {"2804:595c::/32", "268185"}, - {"2c0f:ea08::/32", "37159"}, - {"2620:11f:b006::/44", "394514"}, - {"2804:5608::/32", "267972"}, - {"2403:a800::/32", "1239"}, - {"2406:3c80:5::/48", "17747"}, - {"2610:b0:c140::/40", "701"}, - {"2620:30:c000::/44", "32234"}, - {"2001:579:f0f4::/39", "22773"}, - {"2402:4000:b1b1::/41", "18001"}, - {"2a02:26f7:c1c9::/42", "20940"}, - {"2a0a:6a00::/32", "207097"}, - {"2001:559:8774::/48", "33668"}, - {"2001:67c:25e8::/48", "34958"}, - {"2401:d800:332::/41", "7552"}, - {"2402:8640::/47", "137491"}, - {"2001:559:c1ad::/48", "7015"}, - {"2a02:26f7:c200::/48", "36183"}, - {"2001:df0:12c0::/48", "149019"}, - {"2001:4220:8016::/33", "24835"}, - {"240a:a756::/32", "144528"}, - {"2605:c100::/32", "16567"}, - {"2804:7d7c:140::/32", "271564"}, - {"2001:250:702a::/48", "24370"}, - {"2404:63c0:50::/48", "131645"}, - {"2800:370:150::/42", "28006"}, - {"2001:418:3808::/33", "2914"}, - {"2001:559:12d::/48", "33491"}, - {"2001:df3:4a80::/48", "135902"}, - {"2001:1248:56dc::/42", "11172"}, - {"2401:d800:9290::/42", "7552"}, - {"2408:8957:5500::/40", "17816"}, - {"2606:2800:5a18::/47", "15133"}, - {"2a01:420::/32", "41695"}, - {"2a0e:1101:2::/44", "51255"}, - {"2001:559:8735::/48", "7922"}, - {"2406:840:100::/47", "139317"}, - {"2607:f148:100::/47", "11734"}, - {"2804:7dc4::/32", "271581"}, - {"2a00:1678:b00b::/48", "49453"}, - {"2a0c:d540::/35", "60159"}, - {"2a0e:fd45:d80::/44", "212948"}, - {"2c0f:fb90::/32", "42235"}, - {"2001:559:43::/48", "33491"}, - {"2401:1801::/40", "58683"}, - {"2404:c740::/47", "131655"}, - {"240c:c0a9::/36", "23910"}, - {"2a0d:9b80::/47", "43519"}, - {"2a0e:b580::/29", "59808"}, - {"2001:67c:1445::/46", "42385"}, - {"2001:b28:f240::/36", "42065"}, - {"2001:1a68:1b::/42", "15694"}, - {"2405:8c0::/47", "139301"}, - {"2800:160:1f52::/45", "14259"}, - {"2a02:26f7:fa04::/48", "36183"}, - {"2a06:8680::/29", "35175"}, - {"2a0e:97c3:551::/48", "20473"}, - {"2800:484:c400::/40", "10620"}, - {"2a01:4f0:4018::/32", "28717"}, - {"2a02:c200:2::/32", "51167"}, - {"2a06:5040:6::/48", "3214"}, - {"240e:9b:f018::/46", "140253"}, - {"2a0e:f180::/29", "63023"}, - {"2401:5500::/32", "9749"}, - {"2604:6600:fc7b::/39", "40676"}, - {"2804:5728::/32", "268048"}, - {"2a00:1560:6::/44", "29684"}, - {"2a01:5380::/32", "10474"}, - {"2a02:2308::/43", "29028"}, - {"2a07:de40:1000::/38", "29298"}, - {"2402:49c0::/32", "137385"}, - {"2a02:26f7:f7c4::/48", "36183"}, - {"2001:559:514::/48", "20214"}, - {"2401:1c00:2100::/35", "38809"}, - {"2604:8b80:2::/48", "55106"}, - {"2620:139:5002::/48", "32244"}, - {"2804:48d4::/32", "267147"}, - {"2403:4800:1100::/40", "9714"}, - {"2804:82d0::/32", "272158"}, - {"2400:7fc0:240::/44", "55960"}, - {"2401:d800:55c2::/38", "7552"}, - {"2402:b801:4000::/32", "18371"}, - {"2405:6280::/32", "132111"}, - {"2600:a800::/28", "27017"}, - {"2620:4d:4009::/48", "62597"}, - {"2804:14d:58a1::/41", "28573"}, - {"2804:80c0::/32", "271771"}, - {"2806:370:1090::/44", "28403"}, - {"2001:388:30::/48", "137188"}, - {"2400:6280:20::/48", "132876"}, - {"2408:843f:1600::/34", "140716"}, - {"2604:3545::/30", "399587"}, - {"2a0d:2a00:c0::/48", "205157"}, - {"2406:2000:a8::/48", "18293"}, - {"2607:3200:15::/32", "11240"}, - {"2804:1380:6::/39", "263536"}, - {"2804:29a4:1103::/32", "264026"}, - {"2001:678:974::/48", "49697"}, - {"2a06:2140::/29", "200600"}, - {"2a0b:6cc0::/31", "202984"}, - {"2a0b:ed80::/29", "206324"}, - {"2001:da8:220::/47", "23910"}, - {"2401:d800:2020::/41", "7552"}, - {"240a:a9b6::/32", "145136"}, - {"2605:a40e:521::/45", "33363"}, - {"2804:4880::/32", "267125"}, - {"2a0a:bf80::/29", "49223"}, - {"2804:117c:800f::/48", "53061"}, - {"2a02:7a00:3::/45", "39904"}, - {"2405:c9c0::/45", "138823"}, - {"240c:c0a9:1400::/22", "23910"}, - {"2a09:f7c0::/29", "49028"}, - {"2600:1003:b0b0::/41", "22394"}, - {"2606:b500::/32", "19751"}, - {"2803:41a0::/32", "262186"}, - {"2a03:860::/32", "59971"}, - {"2a03:4d25::/32", "59397"}, - {"2001:559:c3ad::/48", "7725"}, - {"2001:67c:2d0c::/48", "201222"}, - {"2a05:5c80::/29", "48846"}, - {"2a0c:9a40:821b::/45", "210445"}, - {"2001:559:44::/48", "7922"}, - {"2001:dc7:cd1a::/48", "38283"}, - {"2001:1248:a576::/44", "11172"}, - {"2401:d800:9890::/42", "7552"}, - {"2407:1400::/47", "23752"}, - {"2407:42c0::/32", "135188"}, - {"240c:c701::/32", "24365"}, - {"2606:7c00:d003::/34", "46103"}, - {"2803:7360::/32", "269800"}, - {"2a0a:dc07::/32", "39142"}, - {"2400:b180::/32", "59276"}, - {"2403:e200:403::/45", "45543"}, - {"2408:8456:6240::/39", "17816"}, - {"240a:acd8::/32", "145938"}, - {"2620:13e:1000::/44", "11917"}, - {"2804:75f0::/32", "271079"}, - {"2a0e:fd45:bee::/48", "139921"}, - {"2620:76:6000::/48", "54544"}, - {"2800:bf0:8064::/47", "52257"}, - {"2a02:26f0:8101::/40", "20940"}, - {"2400:9380:9000::/46", "4809"}, - {"2409:8a10:2400::/30", "9808"}, - {"2605:c00:500::/36", "46920"}, - {"2600:140b:1c00::/48", "31109"}, - {"2804:1568::/32", "263387"}, - {"2a0c:5247:f000::/36", "208861"}, - {"2400:c700:5001::/32", "55644"}, - {"2408:8406:c00::/39", "4808"}, - {"2620:a2:4000::/48", "701"}, - {"2a06:e40::/29", "31631"}, - {"2001:c10:ff19::/40", "7473"}, - {"240a:a013::/32", "142669"}, - {"2804:10fc::/32", "263656"}, - {"2a03:5f80::/46", "31500"}, - {"240e:44d:f40::/42", "140358"}, - {"2620:7b:b000::/48", "3713"}, - {"240a:ae81::/32", "146363"}, - {"240a:af7b::/32", "146613"}, - {"240e:44d:3300::/41", "140345"}, - {"2607:f358:8::/47", "60311"}, - {"2a03:2480:8025::/46", "200107"}, - {"2406:7400:48::/46", "131269"}, - {"240e:a6::/35", "134419"}, - {"2804:3380::/32", "265400"}, - {"2409:8087:8009::/33", "9808"}, - {"2409:8904:5670::/40", "24547"}, - {"2409:8c20:1833::/48", "9808"}, - {"2a02:17e8::/36", "13002"}, - {"2406:840:eb97::/44", "140731"}, - {"2602:fcd8:7::/48", "14618"}, - {"2804:214:4103::/32", "26615"}, - {"2804:18c8::/32", "53119"}, - {"2a01:378::/32", "39180"}, - {"2a01:4020:6::/48", "212914"}, - {"2001:250:ff17::/42", "23910"}, - {"2001:559:79d::/46", "21508"}, - {"2001:559:820e::/48", "22258"}, - {"240a:a180::/32", "143034"}, - {"2a01:b740:983::/41", "714"}, - {"2a02:26f7:c3cd::/46", "20940"}, - {"2001:503:ff39::/48", "7342"}, - {"2600:6c38:276::/39", "20115"}, - {"2606:bf00::/32", "35891"}, - {"2001:4878:c158::/48", "12222"}, - {"2406:3000:11:100c::/59", "4657"}, - {"2800:4f0:24::/41", "28006"}, - {"2804:22a0:3f1::/37", "264112"}, - {"2804:3fc8::/32", "265914"}, - {"2001:468:1f10::/47", "396955"}, - {"2001:579:5181::/38", "22773"}, - {"2400:6e80::/32", "132882"}, - {"2400:b100::/32", "55555"}, - {"240a:ae3a::/32", "146292"}, - {"2605:3c00:99::/48", "47"}, - {"2a02:ee80:4080::/46", "3573"}, - {"2c0e:2204::/30", "37457"}, - {"2001:468:1a09::/40", "4557"}, - {"2001:559:87e8::/48", "21508"}, - {"2001:4490:d340::/46", "9829"}, - {"2401:7b40:4200::/44", "38071"}, - {"240a:a815::/32", "144719"}, - {"240e:6b9:3000::/32", "4134"}, - {"2a03:2887:ff23::/48", "63293"}, - {"2a05:33c0::/48", "201522"}, - {"2001:559:c28e::/48", "33650"}, - {"2001:6d0:4009::/48", "57503"}, - {"2401:4900:5818::/42", "45609"}, - {"2407:b9c0:e000::/35", "57695"}, - {"2804:6274::/32", "269298"}, - {"2a01:280:108::/48", "199150"}, - {"2a0b:9b00:614::/32", "62240"}, - {"2a0d:5085:1::/30", "62240"}, - {"2a12:8140::/30", "49434"}, - {"2001:559:87b7::/48", "33659"}, - {"2001:67c:1e0::/48", "31554"}, - {"2406:840:f990::/44", "208618"}, - {"2408:8459:8410::/42", "17623"}, - {"2800:160:1b42::/43", "14259"}, - {"2804:5ac8::/32", "268796"}, - {"2400:4ec0:9800::/33", "64300"}, - {"2600:1417:4801::/37", "20940"}, - {"2804:5c78::/33", "53245"}, - {"2401:b200:5d::/42", "24186"}, - {"2408:80f1:80::/39", "17621"}, - {"2600:6c33:718::/48", "11351"}, - {"2a03:2880:f068::/46", "32934"}, - {"2001:559:20a::/48", "33660"}, - {"2001:559:c106::/48", "20214"}, - {"2001:678:d4c::/48", "3320"}, - {"2407:5d80::/32", "59362"}, - {"2408:840c:7500::/40", "17621"}, - {"2409:8c20:5625::/39", "56046"}, - {"2804:4444::/32", "267621"}, - {"2a00:8740:23::/44", "49037"}, - {"2001:67c:2e8::/48", "3333"}, - {"2001:df5:3180::/48", "135905"}, - {"240a:aa00::/32", "145210"}, - {"2620:1ec:be0::/37", "8075"}, - {"2a07:ab42::/48", "44358"}, - {"2405:4000:800:e::/48", "38082"}, - {"2408:80ea:78c0::/39", "17816"}, - {"2a10:2f00:160::/48", "212129"}, - {"2001:559:8473::/48", "33668"}, - {"2001:2013::/28", "1299"}, - {"2402:1200::/47", "24523"}, - {"2600:c05:3010::/48", "398019"}, - {"2604:8780::/32", "54972"}, - {"2a02:26f0:8501::/40", "20940"}, - {"2a0f:9400:772c::/48", "53356"}, - {"2a02:26f7:f815::/42", "20940"}, - {"2001:480:b0::/48", "5132"}, - {"2001:fd8:f0f0::/39", "4775"}, - {"2001:559:824a::/48", "33287"}, - {"2001:5e8::/32", "5050"}, - {"2408:840d:c700::/42", "17621"}, - {"2603:c0e0:2800::/39", "54253"}, - {"2610:130:3401::/48", "398119"}, - {"2804:14d:1c00::/40", "28573"}, - {"2001:df0:1d80::/48", "135726"}, - {"2001:16f8:16::/37", "25525"}, - {"240d:c010:14::/48", "132203"}, - {"2605:4a40::/36", "13786"}, - {"2605:dd40:89a0::/38", "398549"}, - {"2606:c00::/42", "9505"}, - {"2804:1e40::/32", "264417"}, - {"2403:f880:6300::/40", "33438"}, - {"2409:8020:10b1::/41", "56046"}, - {"2804:1894::/32", "61941"}, - {"2804:3080::/32", "264955"}, - {"2a00:5d60::/32", "62353"}, - {"2a0a:9b40::/29", "43139"}, - {"2001:57a:920a::/34", "22773"}, - {"2600:6c38:8a::/45", "20115"}, - {"2605:a40c:a::/42", "33363"}, - {"2806:310:1f::/42", "16960"}, - {"2a00:e2a0::/32", "51004"}, - {"2402:800:3b2b::/41", "7552"}, - {"2405:dc0:8000::/47", "11251"}, - {"2408:8957:edc0::/38", "17622"}, - {"2409:8c62:f20::/32", "9808"}, - {"2605:8e00::/32", "22772"}, - {"2804:3bfc:1100::/40", "52607"}, - {"2001:df6:e780::/48", "142334"}, - {"2405:203:988::/43", "55836"}, - {"2804:7f20:201::/32", "271668"}, - {"2a0b:fd40::/29", "12637"}, - {"2a10:c340::/29", "208861"}, - {"2001:559:34c::/47", "33651"}, - {"2001:ee0:d440::/39", "45899"}, - {"2001:1900:225e::/42", "3356"}, - {"2402:800:5c01::/43", "7552"}, - {"2405:da80::/32", "24225"}, - {"2a02:a60:8000::/33", "57739"}, - {"2409:8057:301b::/45", "56040"}, - {"2607:fcd0:105:701::/50", "8100"}, - {"2a00:1410::/32", "39264"}, - {"2803:c640::/32", "263834"}, - {"2804:1994::/32", "262905"}, - {"2a03:9e00::/37", "14537"}, - {"2a04:a1c0:17::/48", "43059"}, - {"2a0f:7ec0:1::/48", "210788"}, - {"2404:bf40:a540::/47", "7545"}, - {"2001:559:c200::/48", "33662"}, - {"2001:df2:4a00::/48", "135441"}, - {"2001:4408:6100::/38", "4758"}, - {"2001:4878:4102::/47", "12222"}, - {"2610:20:8040::/44", "20033"}, - {"2a03:5e40::/32", "47110"}, - {"2001:468:cff::/48", "40220"}, - {"2001:559:c21c::/48", "13367"}, - {"2407:8a40::/47", "139516"}, - {"2620:1b2:c60::/38", "26673"}, - {"2803:9ca0::/32", "266842"}, - {"2804:4f8:a300::/36", "28263"}, - {"2a05:a880:de52::/48", "20765"}, - {"2a0c:aac0::/29", "49890"}, - {"2001:468:503::/44", "14041"}, - {"2001:44b8::/45", "4739"}, - {"2400:c700:3002::/33", "55644"}, - {"2408:84f3:f810::/44", "17623"}, - {"2604:a5c0::/32", "54509"}, - {"2a0a:2280::/29", "44851"}, - {"2001:250:215::/46", "23910"}, - {"2001:250:740f::/48", "23910"}, - {"2001:559:82eb::/48", "7015"}, - {"2001:559:831c::/48", "33287"}, - {"2408:8956:7c00::/40", "17622"}, - {"2800:484:f00::/35", "14080"}, - {"2a0a:86c0:a::/39", "206163"}, - {"2001:dc8:9000::/48", "131415"}, - {"240a:a741::/32", "144507"}, - {"2607:f0d8::/29", "7385"}, - {"2804:2178::/33", "264556"}, - {"2001:67c:21f4::/48", "197579"}, - {"2600:6c38:6a::/47", "20115"}, - {"2804:5638::/32", "267984"}, - {"2a02:26f7:dc84::/48", "36183"}, - {"2a02:26f7:e880::/48", "36183"}, - {"2409:8904:d2b0::/37", "24547"}, - {"2606:2800:4140::/48", "15133"}, - {"2620:11d:9004::/44", "33186"}, - {"2804:14c:bfb0::/41", "28573"}, - {"2a0a:5cc0::/29", "60921"}, - {"2001:da8:ffe::/35", "23910"}, - {"2402:c000::/47", "9230"}, - {"2407:ddc0::/32", "135782"}, - {"2804:204:267::/40", "28186"}, - {"2804:19a0:3000::/48", "61808"}, - {"2a04:4a45:10::/32", "206067"}, - {"2a11:2c00::/29", "211054"}, - {"2001:438:39::/48", "17025"}, - {"2001:579:e1a4::/43", "22773"}, - {"2400:f780::/32", "3257"}, - {"2405:9200:3100::/41", "131596"}, - {"240a:a8a0::/32", "144858"}, - {"2600:1408:f001::/37", "20940"}, - {"2806:3d8::/32", "270140"}, - {"240e:16:b000::/38", "38283"}, - {"2604:8b00::/32", "19554"}, - {"2804:4b0:41c::/40", "262459"}, - {"2804:4d50::/35", "268189"}, - {"2a02:c10::/32", "12990"}, - {"2a02:26f7:e905::/46", "20940"}, - {"2a10:db40::/29", "48817"}, - {"2001:454d::/30", "9924"}, - {"2401:d800:bc80::/42", "7552"}, - {"2001:370:b::/32", "9607"}, - {"2001:43f8:1500::/44", "328560"}, - {"2405:4cc1:500::/36", "55891"}, - {"240a:a892::/32", "144844"}, - {"240e:96b:6006::/44", "140366"}, - {"2a04:f40::/32", "28854"}, - {"2001:559:c45d::/48", "7015"}, - {"2408:8459:810::/41", "17622"}, - {"240a:aa91::/32", "145355"}, - {"2600:6c7f:ffff::/48", "20115"}, - {"2607:f428:9310::/42", "20115"}, - {"2804:37d0:4::/33", "266437"}, - {"2804:6918::/35", "270248"}, - {"2a02:f980::/32", "213270"}, - {"2400:36a0:40::/32", "63991"}, - {"2404:4600:a::/36", "10158"}, - {"2406:f700::/32", "132837"}, - {"2408:8957:f840::/40", "17622"}, - {"2409:8718::/31", "134810"}, - {"240a:ae6d::/32", "146343"}, - {"2606:29c0:200::/39", "31775"}, - {"2c0f:600::/32", "328838"}, - {"2001:559:83c4::/48", "33660"}, - {"2001:df2:8400::/48", "133950"}, - {"2605:9a00::/48", "160"}, - {"2605:c800::/32", "393924"}, - {"2a06:c0c0:2::/29", "41018"}, - {"2a07:b240::/29", "202618"}, - {"2001:67c:5a0::/48", "21286"}, - {"2405:58c0:5e00::/40", "133101"}, - {"2405:fd80:f0::/38", "135391"}, - {"2a00:1d58:f81c::/46", "47524"}, - {"2a06:ca40::/29", "44749"}, - {"2001:4838::/32", "29748"}, - {"2406:e1c0:fcf::/32", "141459"}, - {"2001:559:41a::/48", "33660"}, - {"2402:8e40::/32", "137473"}, - {"2408:866c::/27", "4837"}, - {"2804:7c4c::/32", "271487"}, - {"2a0d:2581:5::/48", "209261"}, - {"240e:3b7:2800::/38", "4134"}, - {"2600:100a:9100::/44", "6167"}, - {"2604:d600:60d::/43", "32098"}, - {"2a00:1790::/29", "42000"}, - {"2a02:6680:110c::/46", "16116"}, - {"240c:c0a8::/33", "24348"}, - {"2001:fd8:3400::/42", "132199"}, - {"2606:4dc0::/46", "399077"}, - {"2803:2320::/32", "266721"}, - {"2a02:26f7:e910::/48", "36183"}, - {"2a03:5a00:43::/48", "51081"}, - {"2401:d800:2b00::/42", "7552"}, - {"240a:a6d7::/32", "144401"}, - {"2607:a800:202::/48", "15695"}, - {"2800:440:8040::/47", "27738"}, - {"2804:14c:7f00::/41", "28573"}, - {"2001:559:800b::/45", "7922"}, - {"2001:559:82e0::/48", "33662"}, - {"2001:18b0::/32", "12282"}, - {"2401:4900:6050::/40", "45609"}, - {"240e:44d:5940::/42", "140350"}, - {"2604:2d80:6d00::/38", "30036"}, - {"2620:5f:c000::/48", "39971"}, - {"2804:2450::/36", "264214"}, - {"2a00:4802:f00::/40", "8717"}, - {"2a03:ed00::/32", "35205"}, - {"2401:b8c0:a::/48", "141731"}, - {"240a:a30f::/32", "143433"}, - {"240e:108:11f0::/38", "4134"}, - {"2605:a940::/32", "15171"}, - {"2607:9080:5::/48", "701"}, - {"2a02:26f7:c4c1::/46", "20940"}, - {"2a07:45c2::/40", "31463"}, - {"2a07:f9c0::/29", "60144"}, - {"2402:800:5401::/44", "7552"}, - {"2600:380:f100::/46", "20057"}, - {"2a02:26f7:c448::/48", "36183"}, - {"2a0f:6580:100::/48", "213252"}, - {"2400:51c0::/32", "133073"}, - {"2405:9e40::/32", "139468"}, - {"2408:8956:9c00::/40", "17622"}, - {"2001:579:403f::/41", "22773"}, - {"2602:fc59::/40", "19625"}, - {"2607:f110:e280::/39", "21889"}, - {"2801:80:80::/48", "53150"}, - {"2001:df1:6b80::/48", "59045"}, - {"2001:b011:9400::/34", "3462"}, - {"2408:80fa:9000::/36", "136959"}, - {"2409:8061:3100::/36", "9808"}, - {"2602:fed2:7110::/48", "139677"}, - {"2804:6444:2000::/32", "269417"}, - {"2a07:ca40::/29", "207242"}, - {"2001:2042::/29", "3301"}, - {"240e:13:80a::/48", "140862"}, - {"2a00:1120::/32", "34574"}, - {"2a01:8d20::/32", "57795"}, - {"2a04:4e40:f420::/44", "54113"}, - {"2a06:e881:9008::/48", "210286"}, - {"2a0c:cbc0:1002::/29", "209620"}, - {"2409:8924:b100::/38", "56046"}, - {"2605:c0::/32", "397019"}, - {"2806:2f0:8163::/40", "17072"}, - {"2001:559:208::/48", "33659"}, - {"2001:559:c139::/46", "33652"}, - {"240e:3b4:5600::/34", "4134"}, - {"2a02:26f7:f348::/46", "36183"}, - {"2400:ff00::/45", "132045"}, - {"2a00:b980::/29", "41000"}, - {"2a03:f880::/32", "211700"}, - {"2a0e:aa07:f081::/48", "211323"}, - {"2a02:f406:fed0::/48", "328778"}, - {"2a0d:4b80::/29", "16245"}, - {"2001:67c:202c::/48", "1257"}, - {"2001:fd8:3002::/47", "132199"}, - {"2800:bf0:2c20::/47", "52257"}, - {"2001:630::/32", "786"}, - {"2001:678:258::/48", "58057"}, - {"2408:8456:2c00::/41", "17623"}, - {"2804:6c38::/32", "270453"}, - {"2a03:2880:f051::/45", "32934"}, - {"2408:8406:6000::/39", "4808"}, - {"2a02:26f7:bdcd::/46", "20940"}, - {"2a02:26f7:cdc0::/48", "36183"}, - {"2a0c:7140::/29", "39305"}, - {"2402:cac0::/32", "59217"}, - {"2606:50c0:8000::/46", "54113"}, - {"2a05:3580:2500::/36", "35807"}, - {"2a0e:9b40:1000::/48", "208431"}, - {"2001:250:2423::/48", "23910"}, - {"2607:f5b2::/32", "396190"}, - {"2a02:26f7:b905::/46", "20940"}, - {"2a0d:d6c7:258::/32", "200350"}, - {"2001:559:86b7::/48", "33668"}, - {"2602:fd98::/47", "14770"}, - {"2607:8b00:1::/48", "31463"}, - {"2607:fb10:70c0::/43", "2906"}, - {"2806:20d:503a::/41", "32098"}, - {"2a01:6ee0::/32", "62214"}, - {"2a06:a780::/29", "28022"}, - {"2402:8100:207f::/40", "45271"}, - {"240a:a8c9::/32", "144899"}, - {"2a02:2490::/32", "51815"}, - {"2001:559:3ab::/48", "7922"}, - {"2001:67c:1864::/48", "1853"}, - {"2001:ee0:9b40::/37", "45899"}, - {"2401:d800:7f30::/41", "7552"}, - {"2804:d80::/32", "52635"}, - {"2406:3000:3:9::/61", "4657"}, - {"2408:8000:2000::/33", "4837"}, - {"2405:9800:9d00::/34", "45430"}, - {"2408:8256:3d8c::/43", "17623"}, - {"2800:bf0:176::/48", "27947"}, - {"2806:102e:20::/46", "8151"}, - {"2804:7e0::/32", "262330"}, - {"2804:404c:12::/41", "265950"}, - {"2804:6c14::/32", "270444"}, - {"2a04:4e40:7810::/42", "54113"}, - {"2a07:7200:2::/32", "34197"}, - {"2a0b:2900:2300::/40", "48582"}, - {"2001:559:10f::/48", "7016"}, - {"2001:df0:426::/48", "38331"}, - {"2607:f208:d310::/44", "21499"}, - {"2a00:d0c0:201::/32", "58010"}, - {"2a02:dd8::/29", "8778"}, - {"2a0f:b580::/29", "51050"}, - {"2400:c800:109::/37", "4515"}, - {"2401:3bc0:9::/45", "137409"}, - {"2408:8001:3170::/44", "135061"}, - {"2602:fe54:23::/33", "16584"}, - {"2806:2f0:9961::/46", "17072"}, - {"2a02:fe80:1010::/48", "30148"}, - {"2406:ac40::/32", "141389"}, - {"2a00:1cf8:4000::/35", "44944"}, - {"2001:559:541::/48", "33651"}, - {"2001:67c:1274::/48", "208868"}, - {"2600:140b:b401::/36", "20940"}, - {"2a07:2900::/32", "33845"}, - {"2001:559:837d::/48", "33287"}, - {"240a:a011::/32", "142667"}, - {"2607:9280:a::/47", "395502"}, - {"2a02:d0::/32", "44096"}, - {"2a02:26f7:f4c8::/48", "36183"}, - {"2a02:ee80:4283::/45", "3573"}, - {"2a02:f842::/29", "199483"}, - {"2a03:680::/32", "197518"}, - {"2a0a:90c0:1068::/40", "205080"}, - {"2001:559:c175::/48", "33491"}, - {"2402:fc80::/32", "134695"}, - {"240e:108:26::/48", "4134"}, - {"2801:12:c800::/48", "10753"}, - {"2001:1bc7::/48", "29686"}, - {"2408:8957:2e00::/40", "17622"}, - {"240e:982:b400::/33", "4134"}, - {"2600:140f:fc01::/27", "20940"}, - {"2605:96c0::/32", "396841"}, - {"2804:2da0::/32", "265293"}, - {"2a01:7300::/32", "50031"}, - {"2a07:6d40::/29", "44592"}, - {"2a0c:780::/29", "200000"}, - {"2001:67c:81c::/48", "210905"}, - {"2001:67c:2344::/48", "200479"}, - {"2001:1260:f::/48", "28544"}, - {"240e:13:80c::/37", "134238"}, - {"2600:140a:1001::/36", "20940"}, - {"2602:fd01::/36", "23483"}, - {"2804:204:22d::/43", "28186"}, - {"2a00:c380::/32", "50629"}, - {"2804:23f4::/32", "264193"}, - {"2804:5534:9000::/34", "268696"}, - {"2a0a:4786::/31", "208861"}, - {"240e:900::/40", "141679"}, - {"2607:fc30::/39", "19740"}, - {"2a00:1cf8::/35", "44944"}, - {"2c0f:f888:500::/40", "37119"}, - {"2a02:26f7:11f::/32", "20940"}, - {"2001:559:101::/48", "33491"}, - {"2001:559:3b0::/48", "7015"}, - {"2001:559:81a0::/48", "7015"}, - {"2001:67c:2fc0::/48", "207424"}, - {"2602:fd09:1::/48", "212643"}, - {"2606:680::/42", "46429"}, - {"2800:160:1b05::/44", "14259"}, - {"2a0d:1c0::/29", "49095"}, - {"2600:806:101::/38", "701"}, - {"2605:b640:1530::/44", "53736"}, - {"2606:2800:4a98::/46", "15133"}, - {"2803:4a60::/32", "52468"}, - {"2804:26c8::/32", "263856"}, - {"2600:1008:f110::/31", "22394"}, - {"2a01:95a0::/32", "199711"}, - {"2a02:2e02:9680::/43", "12479"}, - {"2409:8904:cea0::/39", "24547"}, - {"2a01:b740:a07::/48", "714"}, - {"2a0e:20c0::/29", "208015"}, - {"2001:1288::/32", "28640"}, - {"2400:9380:88c0::/44", "136167"}, - {"2a01:8::/32", "2860"}, - {"2a01:6f80::/32", "56867"}, - {"2409:8017:2903::/48", "9808"}, - {"2a01:b960:230b::/48", "39239"}, - {"2a04:a380::/29", "62160"}, - {"2800:26f::/32", "19429"}, - {"2409:8c85:5420::/44", "56040"}, - {"2605:940:200::/40", "396919"}, - {"2803:b060::/36", "267815"}, - {"2a00:1e40::/32", "48689"}, - {"2a00:d7a0::/48", "8884"}, - {"2a02:26f7:cc8c::/48", "36183"}, - {"2a02:2a58:110::/38", "702"}, - {"2a04:4e40:3e10::/44", "54113"}, - {"2602:fe1a::/36", "55016"}, - {"2001:559:8126::/48", "33651"}, - {"2001:1a68:2b::/48", "29272"}, - {"2804:14d:7600::/40", "28573"}, - {"2a11:ef00::/29", "400522"}, - {"240e:45c:300::/40", "137266"}, - {"2605::/32", "29848"}, - {"2a0f:6580:101::/48", "48292"}, - {"2001:67c:2d90::/48", "41046"}, - {"2800:810:107::/28", "27747"}, - {"2804:2e1c:e505::/38", "265324"}, - {"2a01:280:300::/48", "3301"}, - {"2405:f600:50::/44", "45117"}, - {"2804:50dc::/32", "268415"}, - {"2804:64c0::/32", "269446"}, - {"2a00:c88::/32", "15474"}, - {"2a0e:46c4:1300::/44", "147224"}, - {"240a:a1ba::/32", "143092"}, - {"2606:ae00:9300::/37", "7287"}, - {"2804:6f58::/32", "270654"}, - {"2001:290::/32", "9318"}, - {"2001:16a2:c210::/42", "39386"}, - {"2405:f540::/48", "135905"}, - {"2408:8957:1940::/40", "17816"}, - {"2804:620c::/32", "28225"}, - {"2a01:100::/32", "39912"}, - {"2a0b:9940::/32", "29413"}, - {"2c0f:e8e0::/46", "327926"}, - {"2001:67c:12c::/48", "43692"}, - {"2001:938:2048::/33", "8437"}, - {"240e:d9:d800::/48", "38283"}, - {"2804:49a0::/32", "262498"}, - {"2a00:1c50:2002::/45", "30811"}, - {"2a02:26f7:cdc1::/46", "20940"}, - {"2a09:6::/47", "8888"}, - {"2001:559:c0e4::/47", "33651"}, - {"2001:44b8:6069::/48", "4739"}, - {"2602:feda:f070::/40", "38008"}, - {"2606:8900::/44", "33044"}, - {"2001:468:1600::/39", "11537"}, - {"2620:10d:2000::/41", "103"}, - {"2a02:cb80:2540::/48", "43766"}, - {"2001:918::/39", "3303"}, - {"2001:df6:7b80::/48", "142059"}, - {"2001:1a20::/32", "8607"}, - {"2402:800:6400::/39", "7552"}, - {"2600:6c38:f3c::/46", "20115"}, - {"2606:8240::/32", "399143"}, - {"2804:3848:2::/32", "266467"}, - {"2a02:29a8:900::/30", "60142"}, - {"2a02:29ea:1e::/48", "49604"}, - {"2405:1c0:6151::/46", "55303"}, - {"240e:966:f400::/39", "58772"}, - {"2602:fccd::/36", "397898"}, - {"2a01:4960::/32", "16267"}, - {"2400:cb00:437::/48", "13335"}, - {"2403:9800:6500::/40", "4648"}, - {"2405:6e00:6f0::/44", "133612"}, - {"2a02:f340::/29", "8767"}, - {"2c0f:f878::/32", "37109"}, - {"2001:4998:38::/46", "26085"}, - {"2404:4600:9::/48", "7625"}, - {"2409:8904:8140::/38", "24547"}, - {"240a:acd3::/32", "145933"}, - {"2804:96c::/32", "263085"}, - {"2a09:a640::/32", "203536"}, - {"2409:8087:6a4c::/42", "9808"}, - {"2001:18c8:400::/40", "54519"}, - {"240a:aa03::/32", "145213"}, - {"2620:101:8030::/47", "36856"}, - {"2804:5860::/32", "268125"}, - {"2409:8904:9390::/37", "24547"}, - {"240a:a7ed::/32", "144679"}, - {"2604:4d40:7000::/48", "399196"}, - {"2804:8290::/32", "272526"}, - {"2001:678:ff4::/48", "211033"}, - {"240a:a494::/32", "143822"}, - {"240a:ae87::/32", "146369"}, - {"2620:9:6000::/48", "22742"}, - {"2804:4948::/32", "267175"}, - {"2804:59fc:2000::/33", "268738"}, - {"2a05:e00::/29", "202793"}, - {"2a0c:9a40:8081::/48", "41108"}, - {"2001:4bc8::/29", "8412"}, - {"2404:1200:2::/47", "14636"}, - {"2404:8600:4800::/32", "17918"}, - {"2804:344c::/32", "262818"}, - {"2001:559:21b::/48", "7922"}, - {"240c:cec2::/23", "23910"}, - {"2001:678:718::/48", "786"}, - {"2001:16a2:6300::/40", "39386"}, - {"2001:4220:2::/48", "24835"}, - {"2407:8100:6::/48", "58436"}, - {"240e:11:9000::/30", "4134"}, - {"2a00:1d38:feee::/39", "50655"}, - {"2a02:26f7:d749::/46", "20940"}, - {"2a05:7780::/32", "39892"}, - {"2409:8904:3ca0::/39", "24547"}, - {"2801:0:270::/48", "262212"}, - {"2a0a:de00::/32", "8758"}, - {"2408:815f:e000::/35", "4837"}, - {"2606:2800:5110::/48", "15133"}, - {"2001:48d0:a000::/35", "75"}, - {"2404:8000:1016::/44", "17451"}, - {"2405:7000::/38", "9354"}, - {"2804:14d:72a7::/43", "28573"}, - {"2a04:d2c0::/29", "15552"}, - {"2a0b:3c40:19::/48", "20473"}, - {"2001:67c:23ec::/48", "24693"}, - {"2405:4500::/44", "9671"}, - {"240a:a36d::/32", "143527"}, - {"2600:1001:f000::/44", "6167"}, - {"2602:809:9000::/46", "399201"}, - {"2408:8406:4800::/39", "4808"}, - {"240a:a151::/32", "142987"}, - {"2620:90:c000::/48", "701"}, - {"2001:559:869d::/48", "33491"}, - {"2001:ee0:ccc0::/39", "45899"}, - {"2405:800:c000::/34", "7545"}, - {"2600:1404:5c01::/34", "20940"}, - {"2602:ffc5:10::/42", "7489"}, - {"2800:200:f101::/40", "12252"}, - {"2a00:9d20:1::/48", "60626"}, - {"2001:438:fffd:110::/63", "3456"}, - {"240a:a010::/32", "142666"}, - {"2804:3850::/32", "266469"}, - {"2804:4f84::/32", "268331"}, - {"2a10:a647::/32", "47753"}, - {"2001:559:c391::/48", "21508"}, - {"240a:a535::/32", "143983"}, - {"240a:ac12::/32", "145740"}, - {"2605:b100:1600::/40", "577"}, - {"2620:13d:4000::/44", "63326"}, - {"2804:5914::/32", "268168"}, - {"2a12:2940::/29", "62177"}, - {"2804:8564:1180::/34", "262313"}, - {"2a04:4e40:8a00::/48", "54113"}, - {"2a04:6680::/48", "198325"}, - {"2a09:bac0:404::/48", "13335"}, - {"2001:559:71c::/48", "20214"}, - {"2001:da8:231::/48", "24350"}, - {"2402:800:95c5::/42", "7552"}, - {"2600:1fa0:4010::/41", "16509"}, - {"2620:9:a003::/48", "395515"}, - {"2a02:26f7:fbc4::/48", "36183"}, - {"2400:addf::/39", "9541"}, - {"2409:8051:1000::/47", "56047"}, - {"2600:140f:2c01::/38", "20940"}, - {"2600:3000:1512::/36", "13649"}, - {"2804:590::/32", "262523"}, - {"2806:2f0:3580::/36", "17072"}, - {"2a0d:2582:160::/43", "211367"}, - {"2c0f:f538::/32", "22354"}, - {"2400:7400:e02e::/48", "38044"}, - {"2401:d800:5a90::/42", "7552"}, - {"2604:f400:6::/48", "19982"}, - {"2804:594c::/32", "52870"}, - {"2a02:2648::/29", "42514"}, - {"2a0b:2b40::/29", "42035"}, - {"2001:579:e01c::/42", "22773"}, - {"2001:1248:a566::/43", "11172"}, - {"2a02:7b0:64::/48", "39780"}, - {"2a0e:4200::/29", "204790"}, - {"2404:7900::/32", "131160"}, - {"2405:1c0:7f10::/46", "55303"}, - {"2a01:60e0::/32", "199935"}, - {"2a0d:8d06:1000::/48", "48079"}, - {"2001:559:8684::/46", "7922"}, - {"2001:df3:5c00::/48", "135905"}, - {"2804:4ab4::/32", "267258"}, - {"2001:579:9020::/41", "22773"}, - {"2001:df5:8280::/48", "138622"}, - {"2001:12f0:d40::/40", "1916"}, - {"2408:80fa:7580::/42", "17623"}, - {"2606:2800:e415::/48", "15133"}, - {"2a09:a540::/29", "57353"}, - {"2a0a:e100::/29", "206927"}, - {"2001:559:85f1::/48", "7016"}, - {"2409:8017:2904::/32", "56044"}, - {"2409:8050:2000::/47", "56047"}, - {"240e:967:1800::/34", "4134"}, - {"2605:3600:11::/48", "20034"}, - {"2620:ae::/48", "22950"}, - {"2001:559:8329::/48", "33660"}, - {"2403:34c0::/32", "4787"}, - {"2602:fed2::/48", "53356"}, - {"2607:ac80:200::/32", "17"}, - {"2804:4a60::/32", "267236"}, - {"2600:6c10:420::/38", "20115"}, - {"2600:9000:5300::/45", "16509"}, - {"2803:b2c0:2100::/48", "264851"}, - {"2404:1ec0::/32", "138511"}, - {"2804:14c:65a8::/41", "28573"}, - {"2a02:26f7:c548::/48", "36183"}, - {"2a11:fa80::/29", "204790"}, - {"2803:7a80:9bf::/32", "263713"}, - {"2a01:5043:7::/48", "202196"}, - {"2a02:ee80:4277::/44", "3573"}, - {"2402:2c80::/32", "134090"}, - {"2600:1f01:48e0::/46", "16509"}, - {"2a03:6e60:1::/48", "47720"}, - {"2a0b:9380::/32", "206002"}, - {"2001:579:c0df::/39", "22773"}, - {"2400:9c80:d7e1::/48", "58396"}, - {"2403:bd80::/32", "59105"}, - {"2404:1c40:10::/44", "24432"}, - {"2803:1440::/32", "263781"}, - {"2001:559:764::/48", "33287"}, - {"2001:7fc:2::/47", "3970"}, - {"2001:df5:6a00::/48", "133742"}, - {"2402:800:972b::/43", "7552"}, - {"2402:800:bde0::/38", "7552"}, - {"240e:438:2640::/36", "4134"}, - {"2804:21b0::/32", "264567"}, - {"2a00:f28:2000::/36", "57187"}, - {"2001:678:c08::/48", "207491"}, - {"2600:5c00:21d1::/48", "3456"}, - {"2804:554::/32", "53143"}, - {"2a02:26f7:eb48::/48", "36183"}, - {"2a02:26f7:fb48::/48", "36183"}, - {"2001:559:43e::/48", "20214"}, - {"2001:559:847c::/48", "7016"}, - {"2600:1402:3001::/36", "20940"}, - {"2804:1eb8::/32", "52564"}, - {"2a03:2880:f01d::/46", "32934"}, - {"2600:1000:9010::/40", "22394"}, - {"2605:9500:b001::/48", "14244"}, - {"2800:bf0:178::/40", "27947"}, - {"2a02:2ad0:11b::/45", "702"}, - {"2a07:3400::/32", "62874"}, - {"2408:840c:3800::/40", "17621"}, - {"240a:a27d::/32", "143287"}, - {"2605:5fc8::/32", "46573"}, - {"2801:80:1df0::/48", "267509"}, - {"2a03:90c0:210::/40", "199524"}, - {"2001:559:8414::/48", "7922"}, - {"2001:559:c3e4::/48", "7016"}, - {"2407:a6c0::/32", "63790"}, - {"2603:6010::/28", "10796"}, - {"2803:84c0::/32", "262191"}, - {"2804:42e8::/32", "267536"}, - {"2804:597c::/32", "268705"}, - {"2a0b:1600::/29", "56485"}, - {"2001:559:1b5::/48", "7016"}, - {"2001:559:766::/47", "33491"}, - {"2401:d800:58e0::/39", "7552"}, - {"2600:1409:800::/48", "35994"}, - {"2607:f098:4100::/34", "33363"}, - {"2804:5310::/32", "268561"}, - {"2407:6080::/32", "133583"}, - {"2001:df0:1800::/48", "23642"}, - {"2408:8456:be40::/39", "17816"}, - {"2605:9ac0:fffe::/48", "3356"}, - {"2a00:1c40::/29", "8851"}, - {"2a05:e380:3::/29", "15739"}, - {"2001:559:c0dd::/46", "7922"}, - {"2001:4490:7c00::/46", "9829"}, - {"2409:8915:2400::/39", "56044"}, - {"2409:8b0c::/30", "56042"}, - {"2806:268:489::/41", "13999"}, - {"2001:468::/40", "11537"}, - {"2001:67c:2388::/48", "12843"}, - {"2001:af8:4::/32", "5385"}, - {"2401:e700::/32", "38628"}, - {"2806:21a:1400::/40", "262913"}, - {"2a02:c28::/29", "8681"}, - {"2a02:2278:216::/32", "28907"}, - {"2a07:c884::/32", "207249"}, - {"2001:fd8:f240::/42", "132199"}, - {"240a:ade0::/32", "146202"}, - {"240e:3b5:1200::/39", "4134"}, - {"2600:1488:a002::/40", "20940"}, - {"2804:53a0:4000::/36", "268596"}, - {"2804:6214::/32", "269274"}, - {"2804:7f0c::/34", "271663"}, - {"2a0c:b640::/44", "34872"}, - {"240a:a4ac::/32", "143846"}, - {"240a:a6ab::/32", "144357"}, - {"2803:da10::/32", "271931"}, - {"2a01:8380::/32", "5433"}, - {"2a0f:5707:fff4::/47", "207401"}, - {"2408:8456:9640::/36", "17816"}, - {"2600:1417:c01::/35", "20940"}, - {"2a00:fe00:d07e::/48", "702"}, - {"2a02:778::/32", "48284"}, - {"2a02:26f0:ce00::/48", "34164"}, - {"2001:67c:26d0::/48", "198476"}, - {"2001:250:7031::/48", "23910"}, - {"2402:800:5bee::/37", "7552"}, - {"2607:f0b0::/45", "13319"}, - {"2001:44c8:a121::/36", "38444"}, - {"240a:a343::/32", "143485"}, - {"2607:fae0:f00c::/47", "8038"}, - {"2a07:ecc0::/29", "48399"}, - {"240a:a3c7::/32", "143617"}, - {"2607:f868:8008::/34", "20141"}, - {"2a0a:bb00::/29", "64435"}, - {"2001:678:638::/48", "204307"}, - {"240a:61:2000::/36", "9605"}, - {"240a:ad20::/32", "146010"}, - {"2800:200:e261::/40", "12252"}, - {"2a10:bc40::/29", "211598"}, - {"2001:250:6427::/48", "23910"}, - {"2403:9800:7f17::/48", "4648"}, - {"2409:8915:2d00::/38", "56044"}, - {"2a00:5200::/32", "20985"}, - {"2a04:7d82::/32", "44974"}, - {"2a0f:5680:2::/47", "60906"}, - {"2800:bf0:3804::/39", "27947"}, - {"2a06:1280:c0df::/36", "61138"}, - {"2a0e:6a00::/29", "209057"}, - {"2409:8054:54::/48", "9808"}, - {"240a:a6ed::/32", "144423"}, - {"2600:1408:9c02::/34", "20940"}, - {"2806:230:3025::/48", "11888"}, - {"2a06:a005:e0::/44", "211358"}, - {"2a0d:3140::/29", "198668"}, - {"2a0c:8040::/29", "211892"}, - {"2001:559:c4a9::/48", "33491"}, - {"2001:e68:20db:10::/63", "54994"}, - {"2408:80f1:20::/43", "140979"}, - {"2001:470:dd::/48", "397787"}, - {"2806:230:2026::/48", "265594"}, - {"2a00:bdc0:e007::/44", "28709"}, - {"2001:4490:d100::/46", "9829"}, - {"2402:5ec0:2000::/32", "23724"}, - {"2602:ff96:3::/48", "31863"}, - {"2603:c001:2810::/38", "31898"}, - {"2607:6980:e000::/44", "36351"}, - {"2804:3b98::/32", "266159"}, - {"2a02:25e8::/29", "52157"}, - {"2a09:e1c0::/32", "200462"}, - {"2a11::/48", "6233"}, - {"2001:44b8:30a4::/48", "7545"}, - {"2a01:6460::/32", "13193"}, - {"2800:40:32::/47", "16814"}, - {"240a:a879::/32", "144819"}, - {"2600:1488:6381::/37", "20940"}, - {"2605:9180:5000::/32", "53597"}, - {"2402:8100:2450::/45", "45271"}, - {"2408:8256:3d6c::/43", "17623"}, - {"2604:85c0::/45", "16524"}, - {"2620:1bc:1030::/32", "7726"}, - {"2806:20d:320a::/43", "32098"}, - {"2806:2f0:9763::/40", "17072"}, - {"2a06:1600:71::/48", "39221"}, - {"2001:250:504b::/43", "24361"}, - {"2409:8000:1100::/37", "9808"}, - {"2600:230f::/32", "20115"}, - {"2600:370f:3523::/44", "32261"}, - {"2604:20c0::/36", "40641"}, - {"2a02:2e02:1800::/40", "12479"}, - {"2a04:7100::/29", "62391"}, - {"2a0e:15c0::/38", "60781"}, - {"2a0e:eec1::/32", "49542"}, - {"2001:df6:6b00::/48", "135772"}, - {"2408:8459:7650::/36", "17816"}, - {"2602:fdea:2::/48", "19186"}, - {"2607:f1c0::/40", "8560"}, - {"2804:7a24::/32", "271350"}, - {"2001:250:240::/39", "23910"}, - {"240e:982:200::/36", "4134"}, - {"2800:160:2078::/45", "14259"}, - {"2a02:26f7:f7c9::/46", "20940"}, - {"2a06:9280::/29", "12984"}, - {"2408:8459:b010::/42", "17623"}, - {"2800:440:8104::/48", "27738"}, - {"2a02:888:8244::/46", "48695"}, - {"2a02:2e02:1d90::/38", "12479"}, - {"2800:160:2167::/44", "14259"}, - {"2a02:2410::/32", "44286"}, - {"2a02:26f7:e601::/46", "20940"}, - {"2001:1248:9900::/44", "11172"}, - {"2408:8459:e010::/42", "17623"}, - {"240e:44d:4300::/42", "140345"}, - {"2803:d320::/32", "263689"}, - {"2a11:2100::/29", "42375"}, - {"2001:678:7d4::/48", "13045"}, - {"2001:da8:c80d::/46", "24356"}, - {"2804:1d14::/32", "61694"}, - {"2406:2100::/45", "56209"}, - {"2a02:e980:cb::/43", "19551"}, - {"2001:418:9809::/33", "2914"}, - {"2403:9800:7f11::/45", "4771"}, - {"2408:8456:ed00::/42", "17622"}, - {"2800:560::/32", "27833"}, - {"2806:230:6006::/48", "265594"}, - {"2400:a980:34ff::/48", "133111"}, - {"240a:a03e::/32", "142712"}, - {"240a:a495::/32", "143823"}, - {"240e:108:83::/48", "4811"}, - {"2607:d500:d00::/40", "13768"}, - {"2a02:26f7:f644::/48", "36183"}, - {"2001:559:c24b::/48", "33650"}, - {"2402:9d80:269::/48", "131429"}, - {"240a:afa8::/32", "146658"}, - {"2606:5000:4a00::/35", "209"}, - {"2804:66f4::/32", "269594"}, - {"2001:67c:224::/48", "51164"}, - {"2402:1500:8000::/33", "25222"}, - {"240e:9b:f02a::/45", "140259"}, - {"2801:11:4800::/48", "269850"}, - {"2a03:e842::/44", "43131"}, - {"2401:d800:fdf0::/38", "7552"}, - {"2804:358:200::/32", "53246"}, - {"2804:d70::/41", "52626"}, - {"2a0a:1ac7:1::/32", "206897"}, - {"2402:4200:f000::/48", "24284"}, - {"240a:a587::/32", "144065"}, - {"240e:37b:ac00::/33", "4134"}, - {"2a10:f40::/29", "207459"}, - {"240a:a2c7::/32", "143361"}, - {"2620:52:11::/40", "22753"}, - {"2800:68:21::/46", "27947"}, - {"2001:41a8:604::/48", "34164"}, - {"2406:e000:c1e::/31", "23655"}, - {"2804:1380::/47", "263536"}, - {"2804:27d4::/32", "263924"}, - {"2a02:26f0:9600::/48", "34164"}, - {"240e:983:180b::/40", "4134"}, - {"2804:998:81::/32", "28589"}, - {"240a:a5ba::/32", "144116"}, - {"2602:fd50:20::/48", "206628"}, - {"2803:6940::/35", "61512"}, - {"2804:56a0::/32", "268013"}, - {"2804:5af4::/32", "268809"}, - {"2a02:26f7:fa40::/48", "36183"}, - {"2a07:35c2::/31", "197561"}, - {"2a0a:1f43::/29", "212144"}, - {"2c0f:f970::/32", "328471"}, - {"2600:370f:75aa::/43", "32261"}, - {"2a0a:7d80::/47", "6697"}, - {"2001:a10:185::/48", "207105"}, - {"2402:7500:f9ff::/48", "24158"}, - {"2406:9e00:1113::/48", "55352"}, - {"2620:160:e320::/44", "4196"}, - {"2a01:310::/32", "8312"}, - {"2a01:5041:4eff::/48", "202196"}, - {"2001:67c:1be8::/48", "57692"}, - {"2001:df1:3700:4000::40/48", "136324"}, - {"2001:4541:a000::/29", "9924"}, - {"2804:2558::/48", "264275"}, - {"2804:7d2c::/32", "271544"}, - {"2a06:55c0::/29", "206130"}, - {"2001:16d8:a0a1::/46", "16150"}, - {"2406:4440:80::/43", "46997"}, - {"2409:8054:41::/46", "56040"}, - {"2409:8c20:1834::/34", "56046"}, - {"2a02:cc4:2f00::/41", "8211"}, - {"2a03:9b80::/34", "375"}, - {"2001:67c:34c::/48", "28714"}, - {"2408:8459:5610::/42", "17623"}, - {"2605:a401:816a::/45", "33363"}, - {"2606:a000:408::/38", "11426"}, - {"2620:128:f021::/48", "18872"}, - {"2a00:47c0:711::/48", "27435"}, - {"2a01:c8::/38", "20756"}, - {"2a01:5a8:2::/47", "8866"}, - {"2401:13c0:c000::/36", "132652"}, - {"2600:1406:3f::/41", "20940"}, - {"2a01:7c8:f4::/33", "20857"}, - {"2a02:5620::/32", "202675"}, - {"2001:df7:a800::/48", "18267"}, - {"2620:12b:d005::/46", "35873"}, - {"2a01:4a0:2003::/29", "201011"}, - {"2c0f:f7a8:8011::/48", "4134"}, - {"2001:67c:1598::/48", "24642"}, - {"2406:c500:ffcd::/48", "7545"}, - {"240a:ac07::/32", "145729"}, - {"2607:fd48:fff0:1046::/44", "13536"}, - {"2803:f00:4c3::/48", "262182"}, - {"2804:7c64::/32", "271493"}, - {"2a00:f460::/32", "28968"}, - {"2001:67c:2224::/48", "42655"}, - {"2401:4900:ee0::/43", "134426"}, - {"240a:adeb::/32", "146213"}, - {"2600:1406:1e01::/34", "20940"}, - {"2800:800:a00::/43", "26611"}, - {"2804:1ddc::/32", "263258"}, - {"2a11:f240::/29", "208846"}, - {"2001:559:80d1::/48", "13367"}, - {"2402:800:3863::/43", "7552"}, - {"240a:a858::/32", "144786"}, - {"2600:6ce6:4410::/27", "16787"}, - {"2603:90f5:1200::/40", "20115"}, - {"240a:abb3::/32", "145645"}, - {"240e:30b:1200::/29", "4134"}, - {"2804:14c:5ba5::/41", "28573"}, - {"2804:14d:2a77::/44", "28573"}, - {"2a00:19a8::/32", "49640"}, - {"2001:559:82e5::/48", "7016"}, - {"2001:559:c2e7::/48", "33668"}, - {"2402:800:58ee::/39", "7552"}, - {"2402:800:96b7::/41", "7552"}, - {"2a00:1f78::/32", "8893"}, - {"2a02:26f7:d5c8::/47", "36183"}, - {"2a05:7f00:188::/48", "1921"}, - {"2402:8100:20e4::/47", "55644"}, - {"2409:8052:800::/47", "56047"}, - {"240e:44d:2c40::/42", "140349"}, - {"2804:7af4::/32", "271402"}, - {"2409:806a:900::/35", "9808"}, - {"2600:1014:b040::/42", "6167"}, - {"2804:e30:4c00::/38", "11338"}, - {"2806:2f0:7241::/46", "17072"}, - {"2a0e:97c3:5c7::/48", "20473"}, - {"2001:c20:486f::/43", "3758"}, - {"2409:805c:3100::/36", "9808"}, - {"240a:a254::/32", "143246"}, - {"240e:108:11d6::/48", "134756"}, - {"2804:5cd0::/32", "268932"}, - {"2a02:2400::/32", "29263"}, - {"2801:80:1b80::/48", "266461"}, - {"2001:44b8:1c::/46", "7545"}, - {"2400:c600:3410::/41", "24389"}, - {"2409:8914:a600::/39", "56044"}, - {"240a:a278::/32", "143282"}, - {"240e:3bd:1200::/39", "4134"}, - {"2600:1009:d000::/43", "6167"}, - {"2804:5154:130::/32", "268445"}, - {"2a0a:e805:500::/40", "64476"}, - {"2001:559:122::/48", "7015"}, - {"2804:789c::/32", "271254"}, - {"2a02:2149:c000::/34", "1241"}, - {"2406:3000:3:e::/58", "4657"}, - {"2620:132:f365::/40", "394977"}, - {"2a06:3040:b::/48", "203020"}, - {"2a0c:580::/29", "210107"}, - {"2a12:4946:a002::/40", "211088"}, - {"2001:559:726::/48", "33659"}, - {"2804:40fc::/32", "265996"}, - {"2c0f:f6d0:104::/46", "327687"}, - {"2001:559:4b6::/48", "21508"}, - {"2001:559:87c8::/48", "33667"}, - {"2001:1248:a4f4::/39", "11172"}, - {"2800:bf0:8267::/48", "27947"}, - {"2a01:a1c0::/32", "21412"}, - {"2a0a:90c0:1049::/45", "205080"}, - {"2001:559:c29b::/48", "33652"}, - {"2001:12c4::/33", "28262"}, - {"2401:4900:5190::/44", "45609"}, - {"2602:ff59::/36", "53282"}, - {"2607:f738:300::/41", "17184"}, - {"2803:6900:578::/48", "52423"}, - {"2a0f:b500::/32", "206313"}, - {"2408:8957:4200::/40", "17622"}, - {"240a:af14::/32", "146510"}, - {"2804:79a4::/32", "271318"}, - {"2a02:6ea0:ea00::/40", "60068"}, - {"2001:df5:fd00::/48", "138034"}, - {"2409:8904:2840::/39", "24547"}, - {"240a:a978::/32", "145074"}, - {"2606:f900:6100::/46", "16583"}, - {"2803:a80:1::/48", "22698"}, - {"2803:c180:2510::/32", "52341"}, - {"2a00:d4a0::/29", "15600"}, - {"2a07:6a82::/31", "203568"}, - {"2001:559:c344::/48", "21508"}, - {"2001:da8:2030::/44", "24357"}, - {"2603:c001:3430::/38", "31898"}, - {"2604:ca00:4d4::/42", "36492"}, - {"2800:160:1114::/47", "14259"}, - {"2001:559:819a::/48", "33489"}, - {"2602:808:4004::/48", "398960"}, - {"2804:6d48::/32", "270522"}, - {"2a02:26f7:ebcc::/48", "36183"}, - {"2a0e:44c0::/29", "39371"}, - {"2a0e:fd45:1001::/38", "44103"}, - {"2001:780:5307::/32", "12337"}, - {"2607:f7c0:8100::/34", "36444"}, - {"2804:310:3::/32", "262688"}, - {"2a01:8840:6d::/48", "207266"}, - {"2a01:cd01:4f2a::/47", "28708"}, - {"2a03:90c0:460::/43", "199524"}, - {"2001:579:a064::/43", "22773"}, - {"2001:ee0:d240::/39", "45899"}, - {"2405:6600::/37", "45845"}, - {"2806:2f0:9ca3::/41", "17072"}, - {"2a02:b08::/29", "25486"}, - {"2409:8054:40::/48", "9808"}, - {"240e:940:e00::/40", "136197"}, - {"2804:dc0::/32", "28610"}, - {"2804:2624::/36", "264324"}, - {"2401:d800:9610::/42", "7552"}, - {"2600:1f01:4874::/47", "16509"}, - {"2607:f708::/32", "18558"}, - {"2a06:1287:2900::/47", "207150"}, - {"2001:559:c32c::/47", "33659"}, - {"240e:a7:7fcc::/46", "140512"}, - {"2607:8700:106::/48", "25820"}, - {"2001:559:c209::/48", "33657"}, - {"2606:3380:54::/48", "53334"}, - {"2001:1388:4::/44", "6147"}, - {"2001:4998:3d::/41", "10310"}, - {"2402:800:bff0::/44", "7552"}, - {"240e:5a:4300::/40", "140294"}, - {"240e:3bd:9c00::/34", "140310"}, - {"2804:5b30::/32", "268824"}, - {"2001:67c:2d68::/48", "31169"}, - {"2400:a980:3100::/37", "133111"}, - {"2402:3a80:c000::/44", "38266"}, - {"2402:9d80::/47", "131429"}, - {"2605:3640::/32", "13476"}, - {"2800:5d0::/38", "52302"}, - {"2a02:2e02:9f70::/40", "12479"}, - {"2a06:f906::/36", "56630"}, - {"2a0e:22c0:1::/48", "48918"}, - {"2c0f:e868::/32", "328641"}, - {"2001:559:c35b::/45", "33650"}, - {"2602:fcd3:103::/48", "212934"}, - {"2804:6504::/32", "269463"}, - {"2a10:2f00:15f::/48", "212194"}, - {"2001:1a48::/32", "25512"}, - {"2600:1006:f050::/39", "22394"}, - {"2600:370f:60a5::/41", "32261"}, - {"2600:6c21:20::/38", "20115"}, - {"2806:2f0:34a1::/46", "17072"}, - {"2a02:26f7:df05::/46", "20940"}, - {"2a03:9000::/32", "49371"}, - {"2a07:4480::/32", "59494"}, - {"2a0a:22c0::/29", "60167"}, - {"2404:8000::/43", "17451"}, - {"2405:800:8000::/35", "4817"}, - {"2606:4b40::/32", "31791"}, - {"2803:6900:1500::/47", "52423"}, - {"2a02:2e02:2390::/37", "12479"}, - {"2001:1248:8459::/45", "11172"}, - {"2405:203:c03::/45", "55836"}, - {"2600:6c20:83f::/41", "20115"}, - {"2804:728c::/32", "270860"}, - {"2a02:26f7:b98b::/48", "20940"}, - {"2a02:2af8:410::/32", "702"}, - {"2a03:79a0::/32", "47989"}, - {"2a0c:9480::/29", "62177"}, - {"2001:7a8:3450::/32", "13193"}, - {"2804:31a8::/32", "265029"}, - {"240a:ad4d::/32", "146055"}, - {"2a02:26f0:110::/48", "34164"}, - {"2001:468:c08::/45", "10886"}, - {"2001:67c:25dc::/48", "41018"}, - {"240a:a0f2::/32", "142892"}, - {"2600:2101::/29", "11404"}, - {"2a09:6640::/29", "13135"}, - {"2405:1dc0::/32", "46047"}, - {"2804:4290::/32", "267508"}, - {"2408:8957:9300::/40", "17816"}, - {"2600:1409:8801::/37", "20940"}, - {"2800:160:11dd::/42", "14259"}, - {"2804:2cb4::/32", "265238"}, - {"2600:1004:a030::/40", "22394"}, - {"2604:2100::/32", "3634"}, - {"2800:160:17c4::/47", "14259"}, - {"2804:cc4:11::/32", "52551"}, - {"2a00:1630:5201::/29", "49544"}, - {"2001:559:1a1::/48", "7725"}, - {"2001:559:468::/48", "33491"}, - {"2404:8d05::/30", "10089"}, - {"2406:16c0::/40", "132934"}, - {"2620:13a:b001::/48", "54344"}, - {"2804:1d7c::/32", "264373"}, - {"2806:260:100a::/43", "13999"}, - {"2a00:fa60::/35", "53550"}, - {"2a0d:1680::/29", "199926"}, - {"2404:99c0::/32", "132196"}, - {"2404:e801:2020::/32", "55430"}, - {"2409:8027:801::/34", "9808"}, - {"240a:a73f::/32", "144505"}, - {"2602:fed2:7700::/48", "38179"}, - {"2620:111:1036::/48", "18469"}, - {"2804:10a4:4000::/35", "263642"}, - {"2804:37f0:9900::/34", "266445"}, - {"2806:2f0:1080::/48", "22884"}, - {"2a05:f840::/29", "57795"}, - {"2001:1820:1b::/32", "12956"}, - {"2800:160:13cd::/42", "14259"}, - {"2a02:26f7:da::/48", "36183"}, - {"2a02:2e02:9550::/42", "12479"}, - {"2001:438:6e::/47", "397942"}, - {"2400:fc00:4550::/36", "45773"}, - {"2403:6e40:200::/44", "9830"}, - {"240a:aaa7::/32", "145377"}, - {"240e:3b2:2200::/37", "136198"}, - {"240e:44d::/42", "140345"}, - {"2001:579:c299::/37", "22773"}, - {"2804:1538::/32", "263378"}, - {"2804:4048::/32", "265949"}, - {"2001:559:8170::/48", "33659"}, - {"2604:9000::/39", "19693"}, - {"2604:b180:170::/44", "36339"}, - {"2a00:5400:f006::/36", "35753"}, - {"2a00:6300::/32", "42228"}, - {"2a02:16d8:103::/48", "15133"}, - {"2001:ac8:89::/43", "9009"}, - {"2406:6200::/37", "23756"}, - {"240a:aabd::/32", "145399"}, - {"240e:438:40::/38", "4134"}, - {"2602:807:6003::/48", "399209"}, - {"2001:250:5074::/44", "24361"}, - {"2409:8055:5c::/48", "9808"}, - {"2620:14d::/36", "17324"}, - {"2a02:26f7:cb89::/42", "20940"}, - {"2a07:1ec0::/29", "41364"}, - {"2001:678:f::/43", "25192"}, - {"2408:822a::/32", "4837"}, - {"2a07:c883::/32", "59872"}, - {"2a0e:e6c0:2000::/36", "51579"}, - {"2c0e:4010:a000::/36", "36994"}, - {"2001:550:5700:100::/36", "174"}, - {"2607:fae0:f200::/44", "63311"}, - {"2804:29b8::/32", "28126"}, - {"2804:8094::/32", "271760"}, - {"2a04:4e40:fa00::/48", "54113"}, - {"2a07:85c1::/48", "174"}, - {"2a0e:8f01::/48", "38230"}, - {"2001:1838:6004::/48", "13331"}, - {"2001:4878:c007::/44", "12222"}, - {"2607:fb58:2002::/36", "36086"}, - {"2803:15c0:5000::/32", "269822"}, - {"2804:19ac::/32", "61811"}, - {"2804:3b6c::/32", "266148"}, - {"2a05:dfc7:45::/46", "208753"}, - {"2a06:7d80::/29", "204046"}, - {"2a12:b340::/29", "59829"}, - {"2001:548::/32", "30432"}, - {"2001:559:86ee::/48", "33287"}, - {"2001:559:c1a8::/48", "33662"}, - {"2001:67c:1bb8::/48", "3306"}, - {"240e:3b0:ec00::/35", "140314"}, - {"2600:1002:b000::/41", "6167"}, - {"2804:14d:728e::/42", "28573"}, - {"2804:6c4c::/32", "270458"}, - {"2a07:8e00::/29", "42331"}, - {"2001:500:a0::/45", "12041"}, - {"2600:1012:b030::/44", "22394"}, - {"2804:74:ffff::/48", "52468"}, - {"2804:404c::/43", "265950"}, - {"2a01:4b40::/36", "21299"}, - {"240e:43:f800::/37", "134761"}, - {"240e:61:2000::/35", "136199"}, - {"2a02:5be0:2::/47", "39588"}, - {"2406:6e00:ef98::/35", "17457"}, - {"240a:ac58::/32", "145810"}, - {"2a00:cb8:971::/48", "15695"}, - {"2a01:368::/29", "20845"}, - {"2001:67c:20c4::/48", "8767"}, - {"240e:ff:9000::/36", "134763"}, - {"2607:f518:2000::/37", "46887"}, - {"2620:135:2000::/40", "19704"}, - {"2a00:dd0:bbbc::/33", "47869"}, - {"2a0d:7c40::/32", "54290"}, - {"2402:800:7e82::/42", "7552"}, - {"2803:7200:18::/34", "27696"}, - {"2806:319::/32", "265530"}, - {"2a02:710::/32", "42973"}, - {"2a02:2668::/34", "16345"}, - {"2a09:26c0::/32", "41114"}, - {"2a0f:3000::/29", "12586"}, - {"2001:559:5f8::/48", "33659"}, - {"2001:559:8653::/48", "33659"}, - {"2405:3440::/44", "138311"}, - {"2602:fc09:cd::/43", "13780"}, - {"2806:2f0:6023::/41", "17072"}, - {"2a04:b880:5::/48", "43578"}, - {"2800:160:1860::/46", "14259"}, - {"2a02:888:8243::/48", "47794"}, - {"2a02:e980:142::/44", "19551"}, - {"2404:8c40::/48", "136374"}, - {"2602:fcce:904::/38", "399200"}, - {"2603:c024:8000::/35", "31898"}, - {"2a02:26f0:a::/48", "34164"}, - {"2408:8956:6600::/40", "17622"}, - {"2804:5e88::/32", "269039"}, - {"2806:230:601b::/48", "11888"}, - {"2a01:c506::/28", "12479"}, - {"2a02:26f7:c74d::/42", "20940"}, - {"2a02:26f7:fb40::/48", "36183"}, - {"2a0e:97c0:6c0::/44", "210013"}, - {"2001:559:c22d::/46", "33287"}, - {"2001:19d0:305::/48", "6423"}, - {"2406:daa0:80a0::/44", "16509"}, - {"2407:ca40:30::/48", "142502"}, - {"240a:a715::/32", "144463"}, - {"240a:acec::/32", "145958"}, - {"2a12:4946:4000::/44", "211184"}, - {"2001:1248:a54a::/43", "11172"}, - {"2404:bf40:a340::/48", "2764"}, - {"2602:80c:f000::/44", "400235"}, - {"2602:fd8d::/36", "398044"}, - {"2804:ad4::/32", "52925"}, - {"2a05:b2c0::/31", "12859"}, - {"2001:559:4d4::/48", "20214"}, - {"2408:8456:aa10::/42", "134543"}, - {"240e:980:9c00::/31", "4134"}, - {"2600:370f:7085::/46", "32261"}, - {"2a07:9444::/30", "202682"}, - {"2405:7740::/32", "23827"}, - {"2409:8087:5d00::/34", "9808"}, - {"240a:a1d4::/32", "143118"}, - {"240e:49:5000::/36", "137693"}, - {"2804:7328:1000::/34", "270899"}, - {"2404:c800:8203::/48", "20940"}, - {"240a:a7c4::/32", "144638"}, - {"2804:14d:c600::/40", "28573"}, - {"2a02:26f7:f945::/46", "20940"}, - {"2001:13b0:c001::/35", "3549"}, - {"2600:1415:1801::/37", "20940"}, - {"2600:370f:5281::/41", "32261"}, - {"2605:3600:1a::/48", "20034"}, - {"2804:210::/32", "262790"}, - {"2804:7a8:200::/32", "262309"}, - {"2a00:9a40::/32", "6819"}, - {"2402:ef19:200::/30", "7633"}, - {"2804:1138::/32", "262726"}, - {"2001:550:409::/48", "30103"}, - {"240a:a764::/32", "144542"}, - {"2600:1014:a020::/40", "22394"}, - {"2803:840:2300::/47", "263793"}, - {"2a01:358:5811::/37", "9121"}, - {"2a0e:b107:580::/44", "138211"}, - {"240e:87c:390::/41", "137692"}, - {"2620:df:4000::/48", "14618"}, - {"2804:14d:1400::/40", "28573"}, - {"2a02:e182::/36", "33517"}, - {"2402:800:7cb0::/41", "7552"}, - {"240a:aaeb::/32", "145445"}, - {"2605:e000:40b::/48", "10838"}, - {"2a02:1390:f000::/40", "21351"}, - {"2001:559:8069::/48", "7015"}, - {"2401:14c0::/45", "136531"}, - {"2408:8459:c010::/42", "17623"}, - {"240a:ad9f::/32", "146137"}, - {"2804:a00::/47", "262838"}, - {"2a02:ac80:4001::/35", "25145"}, - {"2a03:7380:5c80::/42", "13188"}, - {"2a11:2900::/29", "212559"}, - {"2001:df3:b880::/48", "17538"}, - {"2403:fe00::/32", "38743"}, - {"2804:8544::/32", "272568"}, - {"2400:7e00::/32", "24572"}, - {"2402:1c00::/36", "23838"}, - {"2602:fbb6::/36", "2914"}, - {"2606:3c80:a300:10::/40", "33582"}, - {"2800:160:2031::/46", "14259"}, - {"2804:dcc::/32", "28638"}, - {"2a02:88d:823f::/40", "47794"}, - {"2001:550:3501::/38", "174"}, - {"2001:559:755::/48", "33651"}, - {"240a:a2ea::/32", "143396"}, - {"2600:1415:19::/38", "20940"}, - {"2605:a840::/32", "7775"}, - {"2804:760::/35", "262638"}, - {"2804:1820::/32", "61920"}, - {"2a04:fb00:1::/48", "39315"}, - {"2001:559:8288::/48", "7015"}, - {"2804:5b7c::/32", "268848"}, - {"2001:da8:209::/48", "23910"}, - {"2400:9380:84c0::/44", "136167"}, - {"240a:ad3a::/32", "146036"}, - {"2620:109:3000::/45", "29888"}, - {"2804:4a78:a200::/33", "267242"}, - {"2a09:5180::/29", "42487"}, - {"2a0a:340:ff00::/40", "48043"}, - {"2a0b:7080:10::/42", "7489"}, - {"2a0b:f100::/29", "43451"}, - {"2001:470:61::/45", "6939"}, - {"2001:4490:d140::/46", "9829"}, - {"2401:fa00:42::/45", "24424"}, - {"2409:8915:2b00::/37", "56044"}, - {"2620:5e:c000::/48", "393304"}, - {"2800:440:106::/48", "27738"}, - {"2a0e:8300::/29", "43415"}, - {"2400:52e0:1::/48", "200325"}, - {"2402:800:b1f0::/38", "7552"}, - {"2a0e:5c00::/29", "209097"}, - {"2001:4b21:0:1::/32", "34288"}, - {"2620:11b:3000::/48", "26470"}, - {"2803:b60::/32", "269797"}, - {"2804:5e48:ff50::/48", "269023"}, - {"2001:41e0::/32", "20932"}, - {"2402:8100:30d0::/44", "45271"}, - {"2404:4a00:2094::/48", "55423"}, - {"240a:ac1f::/32", "145753"}, - {"240a:aff7::/32", "146737"}, - {"2804:52e0::/32", "268547"}, - {"2a02:ee80:42d2::/45", "3573"}, - {"2a09:bac0:38::/47", "13335"}, - {"2001:559:87cf::/48", "7922"}, - {"2402:800:9b1d::/42", "7552"}, - {"2408:8957:12c0::/39", "17816"}, - {"240e:44d:4280::/41", "4134"}, - {"2804:5d48::/32", "268962"}, - {"2a0e:d780::/29", "204790"}, - {"2600:1401:c001::/30", "20940"}, - {"2600:1406:9401::/36", "20940"}, - {"2806:3d0::/32", "398013"}, - {"2a02:26f7:e7d4::/48", "36183"}, - {"2a0c:f8c0::/30", "210214"}, - {"2a0f:3784:103::/40", "213204"}, - {"2001:559:c0d2::/48", "7922"}, - {"2602:fef0::/47", "396388"}, - {"2607:f208:df00::/48", "398101"}, - {"2a07:14c0:6000::/36", "208861"}, - {"2001:678:150::/48", "59617"}, - {"2408:8409:8400::/40", "4808"}, - {"240e:108:20::/48", "4134"}, - {"2604:4d40:fff::/48", "213073"}, - {"2804:14c:f200::/40", "28573"}, - {"2804:32ac::/32", "265092"}, - {"2806:230:401c::/48", "265594"}, - {"2a02:26f7:c8cc::/48", "36183"}, - {"2a02:26f7:d211::/42", "20940"}, - {"2800:160:16a6::/47", "14259"}, - {"2803:2540:12::/48", "271874"}, - {"2a02:2218::/29", "41157"}, - {"2a02:f040::/47", "59605"}, - {"2001:250:582b::/43", "24363"}, - {"2001:1a11:1d::/46", "42298"}, - {"240a:a043::/32", "142717"}, - {"2600:380:7480::/38", "20057"}, - {"2001:559:c3a1::/46", "7015"}, - {"2403:c380::/32", "59189"}, - {"240e:980:8900::/40", "4134"}, - {"2607:fd48:202::/47", "13536"}, - {"2804:508::/32", "52999"}, - {"2001:1a40:110::/44", "5416"}, - {"2404:bf40:e902::/48", "7545"}, - {"240a:a023::/32", "142685"}, - {"2804:1248:9000::/33", "263467"}, - {"2804:3220:2001::/46", "265058"}, - {"2804:5490::/32", "268658"}, - {"2804:76a0:f000::/36", "271124"}, - {"2001:df5:9a80::/48", "134458"}, - {"240a:a0ee::/32", "142888"}, - {"2620:7e:60c0::/48", "7385"}, - {"2408:8459:6a50::/37", "17816"}, - {"240a:a107::/32", "142913"}, - {"240a:a9a6::/32", "145120"}, - {"2607:f740:e00d::/43", "63911"}, - {"2800:160:1e6b::/43", "14259"}, - {"2a0e:1bc1::/35", "208621"}, - {"2a0e:b107:260::/44", "208627"}, - {"2402:800:b830::/41", "7552"}, - {"2405:6e00:488::/43", "18291"}, - {"240a:a49d::/32", "143831"}, - {"2804:4c60::/32", "267367"}, - {"2a02:26f7:b9a1::/46", "20940"}, - {"2a03:2880:f044::/47", "32934"}, - {"2a10:ac00::/32", "31242"}, - {"2402:800:bd80::/42", "7552"}, - {"2402:800:be70::/39", "7552"}, - {"2a02:51c0::/32", "42277"}, - {"2c0f:f418:4::/32", "37714"}, - {"2001:67c:253c::/48", "21080"}, - {"2401:d800:f260::/40", "7552"}, - {"2405:3140:11::/48", "56006"}, - {"2409:8924:1f00::/34", "56046"}, - {"2a00:79e1:805::/48", "15169"}, - {"2001:678:f2c::/48", "211499"}, - {"2600:805:808::/48", "33172"}, - {"2600:e400::/29", "30404"}, - {"2602:ffc5:610::/44", "147173"}, - {"2001:1900:3013::/32", "3356"}, - {"2620:126:e000::/48", "21556"}, - {"2804:26a0::/32", "263845"}, - {"2a0c:93c0:8020::/48", "212465"}, - {"2806:230:1001::/48", "11888"}, - {"2a04:5300::/29", "13135"}, - {"2a0e:68c0:2::/48", "209121"}, - {"2001:559:c18b::/48", "21508"}, - {"2405:a100:10::/41", "131283"}, - {"2804:3bac::/35", "266164"}, - {"2a0b:e640:1::/48", "206316"}, - {"2402:800:5e01::/42", "7552"}, - {"240a:abfc::/32", "145718"}, - {"2a01:7660::/45", "12843"}, - {"2a03:b780::/32", "29134"}, - {"2a11:8700::/29", "204790"}, - {"2804:d34::/32", "52611"}, - {"2804:2a80:8000::/33", "53094"}, - {"2001:559:c12f::/48", "33656"}, - {"240a:adb3::/32", "146157"}, - {"2604:500::/32", "22464"}, - {"2806:230:100e::/48", "265594"}, - {"240a:a81f::/32", "144729"}, - {"2600:1404:e800::/48", "35994"}, - {"2600:9000:21f3::/38", "16509"}, - {"2604:2a00::/32", "23138"}, - {"2001:ee0:df00::/34", "45899"}, - {"2400:8b00:b00::/42", "45727"}, - {"2404:3440::/32", "138534"}, - {"2408:840c:c900::/40", "17621"}, - {"2602:ffc5:190::/46", "7489"}, - {"2804:28e4:e825::/35", "28260"}, - {"2a11:4e00::/36", "213042"}, - {"2001:67c:2fd0::/48", "201925"}, - {"240a:a574::/32", "144046"}, - {"2801:80:50::/48", "11802"}, - {"2409:8a50:300::/37", "56047"}, - {"240e:965:9800::/34", "4134"}, - {"2a07:5440::/29", "24875"}, - {"2a0d:da00::/32", "205072"}, - {"2400:ffc0:4::/47", "132335"}, - {"2401:d800:2c70::/40", "7552"}, - {"240a:ae73::/32", "146349"}, - {"2803:e40:84::/44", "27797"}, - {"2804:3f10:6101::/38", "262566"}, - {"2a0d:5600:63::/48", "9009"}, - {"2405:6e00:400::/43", "133612"}, - {"240e:8::/31", "4134"}, - {"2606:6380:5::/46", "26721"}, - {"2804:8434:300::/47", "272246"}, - {"2a00:1cb8:2:e::/48", "12713"}, - {"2a02:26f7:dc09::/46", "20940"}, - {"2a03:5780::/48", "25122"}, - {"2409:8038:900::/35", "9808"}, - {"240a:a3bf::/32", "143609"}, - {"240e:5a:43c0::/37", "140295"}, - {"2606:a000::/37", "11426"}, - {"2804:6a1c::/32", "270313"}, - {"2a02:2f0c:8002:3::4/61", "8708"}, - {"2a02:ac80:f001::/29", "25145"}, - {"2a0b:ae40:1::/45", "40676"}, - {"2001:1248:96c5::/43", "11172"}, - {"240a:a988::/32", "145090"}, - {"2600:370f:526a::/40", "32261"}, - {"2a00:e98::/32", "39912"}, - {"2a02:26f0:8a01::/39", "20940"}, - {"2a03:a060::/32", "203538"}, - {"2a0b:abc0::/29", "205516"}, - {"2001:559:c380::/48", "33659"}, - {"2620:11e:3083::/48", "7060"}, - {"2803:b780:a::/43", "27742"}, - {"2001:559:80c3::/45", "33651"}, - {"2606:2400:1002::/48", "16896"}, - {"2803:efc0::/48", "3549"}, - {"2804:7e58::/32", "271618"}, - {"2a02:26f7:f780::/48", "36183"}, - {"2001:67c:2380::/48", "20897"}, - {"2602:103:2000::/33", "20115"}, - {"2800:e01:7000::/30", "27665"}, - {"2804:799c::/32", "271316"}, - {"2a02:888:8144::/46", "48695"}, - {"2a02:26f7:c340::/48", "36183"}, - {"2a0e:7bc0::/29", "57610"}, - {"2402:800:34c5::/43", "7552"}, - {"2a01:5041:2efd::/46", "202196"}, - {"2a02:25b0::/32", "49101"}, - {"2602:ffcd::/36", "55254"}, - {"2800:160:12a6::/44", "14259"}, - {"2a02:2e02:9fd0::/34", "12479"}, - {"2404:f4c0:ff13::/48", "149506"}, - {"2804:14c:75ab::/41", "28573"}, - {"2001:550:7702:1::/47", "174"}, - {"2001:da8:e81b::/48", "24368"}, - {"2403:1940:100::/48", "137935"}, - {"2804:84a8::/32", "272274"}, - {"2405:e40::/45", "139005"}, - {"2409:8087:5020::/40", "56047"}, - {"240a:a38f::/32", "143561"}, - {"240e:3b3:9200::/36", "140317"}, - {"2001:67c:2558::/48", "20943"}, - {"2401:b00:12::/36", "17564"}, - {"2001:250:3c0d::/46", "138369"}, - {"240e:45c:8200::/40", "131285"}, - {"2604:3940::/32", "31841"}, - {"2606:5080::/32", "63343"}, - {"2a00:4a00:3000::/33", "39356"}, - {"2408:8256:3b9f::/37", "17816"}, - {"240a:ace3::/32", "145949"}, - {"240e:e1:8e00::/35", "4811"}, - {"2607:fcd0:100:f::/52", "8100"}, - {"2a01:488:bb1a::/48", "398106"}, - {"2a02:888:8250::/48", "48695"}, - {"2a02:6f60::/32", "12617"}, - {"2806:2f0:83a1::/46", "17072"}, - {"2a01:4642:100::/40", "9042"}, - {"2804:6498::/32", "269437"}, - {"2804:83ec::/32", "272229"}, - {"2400:1a00:8003::/43", "17501"}, - {"240a:ab48::/32", "145538"}, - {"2605:e4c0::/32", "63394"}, - {"2606:82c0:11::/45", "32167"}, - {"2401:d800:2db2::/41", "7552"}, - {"2408:8459:f110::/42", "17623"}, - {"2600:40ff:fcfc::/47", "7046"}, - {"2607:fc48:440::/48", "40009"}, - {"2001:1930:7c08::/48", "11985"}, - {"2408:8459:3c10::/41", "17623"}, - {"2605:8780::/32", "393457"}, - {"2803:6700:640::/48", "263210"}, - {"2a02:4e0:fe02::/48", "16135"}, - {"2a02:e88:8000::/48", "44914"}, - {"2a02:25a8::/32", "12824"}, - {"2a05:6d80::/29", "9110"}, - {"2407:5c80::/32", "59362"}, - {"2804:434c::/32", "267561"}, - {"2001:559:756::/47", "7922"}, - {"2001:19b8::/32", "30340"}, - {"2401:d800:7160::/40", "7552"}, - {"240e:45c:b600::/33", "131285"}, - {"2a00:5e80::/32", "15557"}, - {"2001:559:753::/48", "33659"}, - {"240e:45c:b100::/40", "140537"}, - {"2a10:a500:21::/32", "205920"}, - {"2408:8226::/32", "4837"}, - {"240a:a138::/32", "142962"}, - {"2001:44b8:1065::/48", "4739"}, - {"2409:8087:6100::/38", "9808"}, - {"2804:14d:1a85::/41", "28573"}, - {"2804:2dd8::/32", "265307"}, - {"2804:6528::/32", "269472"}, - {"2a02:26f7:cf04::/48", "36183"}, - {"2001:67c:8fc::/48", "212925"}, - {"2402:a00::/43", "45916"}, - {"2403:9800:7c00::/40", "4648"}, - {"2620:149:14a::/47", "714"}, - {"2803:f340::/35", "14754"}, - {"2001:67c:1b58::/47", "35559"}, - {"2404:1c40:2d::/48", "24432"}, - {"240e:145::/30", "4134"}, - {"2605:e740:100::/40", "174"}, - {"2620:31:2007::/48", "53722"}, - {"2804:2d14::/32", "265260"}, - {"2001:559:83d6::/48", "33287"}, - {"2402:800:55c5::/43", "7552"}, - {"2407:e80:4::/32", "58689"}, - {"2409:8087:5802::/48", "56040"}, - {"2600:6c39:409::/41", "20115"}, - {"2620:103:a000::/44", "12148"}, - {"2806:300::/46", "28387"}, - {"2a0f:5707:aa00::/44", "34924"}, - {"2001:559:3e6::/48", "20214"}, - {"2001:918:ffb7::/48", "8300"}, - {"2407:a600:4000::/36", "18004"}, - {"2600:1000:b000::/40", "6167"}, - {"2600:40fc:1010::/45", "14210"}, - {"2001:678:9c::/48", "57801"}, - {"2605:8300:f::/48", "25645"}, - {"2a02:26f7:bd04::/48", "36183"}, - {"2a02:26f7:bd48::/48", "36183"}, - {"2a12:eb00::/29", "49581"}, - {"2402:7d80:9999::/48", "63583"}, - {"2804:151:1::/46", "10954"}, - {"2a03:7a0::/29", "43940"}, - {"2001:1248:55cb::/43", "11172"}, - {"240e:974:e01::/35", "4134"}, - {"2401:d800:9ca0::/41", "7552"}, - {"240a:a94a::/32", "145028"}, - {"2604:5540:4010::/48", "13750"}, - {"2607:d300::/32", "8059"}, - {"2001:1a11:12a::/47", "42298"}, - {"2001:44b8:30b3::/44", "4739"}, - {"2404:8000:100c::/43", "17451"}, - {"240a:a12d::/32", "142951"}, - {"240c:c0a8:5c49::/48", "24364"}, - {"2606:5000:600::/35", "209"}, - {"2803:3400::/32", "14754"}, - {"2804:3574::/32", "266287"}, - {"2804:70bc:9000::/33", "270745"}, - {"2a00:1420::/32", "44993"}, - {"2a0e:15c2::/29", "60781"}, - {"2001:67c:2ae0::/48", "3292"}, - {"2600:6c38:748::/45", "20115"}, - {"2804:14d:ac00::/40", "28573"}, - {"2804:1d04:f000::/36", "61689"}, - {"2804:55bc::/32", "267953"}, - {"2401:8800:a04::/40", "17439"}, - {"2404:2440:cafe::/48", "138521"}, - {"2001:559:163::/48", "33652"}, - {"2001:559:c2e0::/48", "7016"}, - {"2403:3b00::/32", "38083"}, - {"240e:678:e200::/39", "140329"}, - {"2804:2e34::/32", "265331"}, - {"2a0f:9340:3d::/48", "1299"}, - {"2001:67c:20d0::/47", "5421"}, - {"2001:1a68:c::/43", "15694"}, - {"2408:8456:ac10::/42", "134543"}, - {"2804:eec:1301::/48", "25933"}, - {"2804:217c::/32", "264557"}, - {"2804:6828::/32", "269672"}, - {"2a03:2880::/34", "32934"}, - {"2001:559:c1de::/48", "33287"}, - {"2408:8459:d080::/39", "17816"}, - {"240e:329::/25", "4134"}, - {"2602:fcdd::/36", "398697"}, - {"2001:559:c419::/48", "7016"}, - {"2405:fb80::/32", "132006"}, - {"240a:a5d8::/32", "144146"}, - {"2600:1401:7::/48", "35994"}, - {"2602:fd0f::/36", "18515"}, - {"2001:559:8218::/47", "7922"}, - {"240e:44d:1c80::/41", "4134"}, - {"2804:30b4::/32", "264970"}, - {"2a02:2e02:1610::/41", "12479"}, - {"2001:67c:59c::/48", "59448"}, - {"240e:438:9a40::/37", "4134"}, - {"2a02:88d:812f::/48", "47794"}, - {"2a02:26f7:b999::/46", "20940"}, - {"2a0e:b107:1590::/47", "142598"}, - {"2001:550:1900:2::/45", "174"}, - {"240a:a082::/32", "142780"}, - {"2600:380:2000::/40", "20057"}, - {"2a03:2880:f238::/46", "32934"}, - {"2a0c:efc0::/46", "206356"}, - {"2001:df3:9400::/48", "134138"}, - {"2803:180::/32", "28036"}, - {"2804:5c0c::/32", "268884"}, - {"2c0f:f4c0:1482::/32", "37611"}, - {"2001:df4:9800::/48", "38775"}, - {"2400:4480:1000::/47", "17426"}, - {"2408:8256:38a0::/39", "17816"}, - {"2604:d600:115c::/38", "32098"}, - {"2a01:81e0::/46", "199783"}, - {"2001:678:538::/48", "197942"}, - {"2001:df0:d680::/46", "139287"}, - {"2804:4d4::/32", "262469"}, - {"2a0a:3200::/29", "400177"}, - {"2001:4210:9805::/44", "25818"}, - {"2408:8756:d100::/28", "17816"}, - {"240a:a80c::/32", "144710"}, - {"2800:bf0:8298::/42", "27947"}, - {"2a02:26f7:f701::/46", "20940"}, - {"2001:250:5002::/44", "24361"}, - {"2408:8956:5b00::/40", "17816"}, - {"240e:44d:e80::/41", "4134"}, - {"2803:ad10::/32", "272042"}, - {"2804:71c8::/32", "270811"}, - {"2001:559:85f8::/48", "33662"}, - {"2404:5d80:6100::/40", "33438"}, - {"2600:1012:f000::/43", "6167"}, - {"2803:f0e0::/32", "269864"}, - {"2804:5780::/32", "262734"}, - {"2a02:2e02:9040::/43", "12479"}, - {"2a03:2480:70::/48", "200107"}, - {"2001:1248:97fb::/45", "11172"}, - {"2406:cd40::/32", "132202"}, - {"2607:fca8:a538::/48", "54380"}, - {"2001:67c:20cc::/48", "16243"}, - {"2603:c014::/36", "31898"}, - {"2804:14c:ce82::/41", "28573"}, - {"2a0c:4480:1::/46", "204720"}, - {"2409:8c28:d06::/35", "56041"}, - {"240e:974:e000::/40", "139220"}, - {"2607:7e80:f000::/36", "395354"}, - {"2800:160:150d::/43", "14259"}, - {"2804:7820::/32", "271222"}, - {"2804:8394::/32", "272206"}, - {"2001:678:ce4::/48", "60557"}, - {"2001:678:edc::/48", "1257"}, - {"2407:b001:1010::/48", "394749"}, - {"2804:1908::/32", "61770"}, - {"2804:7150::/32", "270781"}, - {"2400:5100::/32", "10012"}, - {"2401:d800:9c10::/42", "7552"}, - {"2600:6c38:1ab::/43", "20115"}, - {"2806:370:41a0::/41", "28403"}, - {"2a02:f040:7::/48", "59605"}, - {"2a0c:8440::/48", "205296"}, - {"2400:9380:8030::/48", "4134"}, - {"2409:8054:301b::/45", "56040"}, - {"2800:482:4002::/48", "10620"}, - {"2a00:d40:100::/45", "2597"}, - {"2a07:e900::/29", "8888"}, - {"2a0e:97c0:420::/44", "211267"}, - {"2400:1c00:66::/48", "45143"}, - {"2408:8956:a100::/40", "17816"}, - {"2603:fa68::/29", "63023"}, - {"2a01:6e00:a::/43", "43142"}, - {"2a02:26f7:eb4c::/48", "36183"}, - {"2a03:dc40:ffef::/48", "199926"}, - {"2a03:e140:1b::/48", "56674"}, - {"2a05:f507:73::/45", "13443"}, - {"2a06:e881:1705::/46", "206813"}, - {"2001:1248:991b::/42", "11172"}, - {"2a0c:b642:5000::/43", "49519"}, - {"2001:438:66::/44", "6461"}, - {"2001:559:8534::/48", "7015"}, - {"2001:678:a34::/48", "51567"}, - {"2801:0:90::/48", "28109"}, - {"2a01:400::/32", "44212"}, - {"2a04:4e40:b000::/48", "54113"}, - {"2600:40f0:150::/35", "701"}, - {"2804:25c8:4000::/38", "264302"}, - {"2804:622c::/32", "269280"}, - {"2804:7c44::/32", "271485"}, - {"2a02:9b0::/44", "35819"}, - {"2a02:26f7:e308::/48", "36183"}, - {"2400:2000:b::/45", "20940"}, - {"2804:802c:130::/41", "271734"}, - {"2001:3d8::/32", "9595"}, - {"2001:559:c114::/48", "7016"}, - {"2001:978:3902::/38", "174"}, - {"2001:da8:204::/48", "24349"}, - {"2400:8b00:c80::/42", "45727"}, - {"2600:1408:8401::/36", "20940"}, - {"2803:af80:1100::/32", "263732"}, - {"2a02:e58::/46", "209523"}, - {"2401:cd81::/48", "63920"}, - {"2401:d800:7c52::/40", "7552"}, - {"2409:890c::/30", "56042"}, - {"2600:1fa0:81a0::/44", "16509"}, - {"2001:67c:2350::/48", "6830"}, - {"2409:801e:3005::/46", "9808"}, - {"2620:100:900c::/47", "26211"}, - {"2800:bf0:3740::/47", "52257"}, - {"2a10:d506::/31", "398464"}, - {"2404:bf40:a0c0::/48", "2764"}, - {"2408:8956:fe00::/39", "17816"}, - {"2803:4510::/32", "272018"}, - {"2803:8420:ff00::/48", "269799"}, - {"2804:6c0:10::/44", "262418"}, - {"2804:161c:d00::/45", "263268"}, - {"2a0e:fd45:40f7::/48", "398646"}, - {"2001:df4:bb80::/48", "139495"}, - {"2409:8000:5b00::/40", "9808"}, - {"2804:7e54::/32", "271617"}, - {"2a06:5f00::/29", "204147"}, - {"2001:559:c511::/48", "7922"}, - {"2001:579:92be::/41", "22773"}, - {"2402:800:3c01::/43", "7552"}, - {"2804:1d40::/32", "52674"}, - {"2804:5308::/32", "268559"}, - {"2a02:ee80:405a::/42", "3573"}, - {"2a07:de40:400::/38", "29298"}, - {"2a0a:ec02:401::/48", "42692"}, - {"2a0c:7e41:5357::/48", "20473"}, - {"2a0f:bf00::/42", "208196"}, - {"240e:679:8800::/38", "140330"}, - {"2600:1010:9110::/36", "22394"}, - {"2600:40ff:fc00::/48", "7046"}, - {"2606:2800:457::/44", "15133"}, - {"2a00:ba60::/31", "35625"}, - {"2001:7f8:1f::/48", "1835"}, - {"2400:cb00:a0f7::/48", "13335"}, - {"2407:9940::/48", "18403"}, - {"2607:d700::/32", "19566"}, - {"2001:559:91::/46", "7922"}, - {"2408:80f1:200::/43", "17621"}, - {"2800:160:1864::/47", "14259"}, - {"2a00:1f88::/32", "29545"}, - {"2a02:26f7:57::/48", "20940"}, - {"2a0f:9400:7842::/47", "147028"}, - {"2400:a980:50fd::/46", "133111"}, - {"240e:67c:8c00::/33", "4134"}, - {"2800:98:1809::/45", "14754"}, - {"2804:57a8::/32", "268078"}, - {"2a02:26f7:b98d::/46", "20940"}, - {"2001:4490:4800::/40", "9829"}, - {"2401:7200:2102::/48", "55328"}, - {"2402:7d80::/38", "63582"}, - {"2605:940:510::/44", "396919"}, - {"2a02:26f7:f54c::/48", "36183"}, - {"2a03:d400::/42", "198913"}, - {"2a10:9c0::/29", "61272"}, - {"2401:7340:1000::/48", "34985"}, - {"2804:14d:be8b::/41", "28573"}, - {"2a02:26f7:b7c8::/48", "36183"}, - {"2a03:f580:2::/32", "15763"}, - {"2001:df6:2400::/48", "38880"}, - {"2001:4118::/32", "2607"}, - {"2409:8c28:91a1::/34", "56041"}, - {"2607:fa10::/32", "7106"}, - {"2620:107:6000::/51", "6462"}, - {"2801:80:17e0::/43", "61580"}, - {"2803:d100:e7c0::/36", "52362"}, - {"2804:2d80:aa03::/40", "262378"}, - {"2001:559:c337::/48", "33652"}, - {"2001:648:2cf0::/38", "5408"}, - {"240a:a7d1::/32", "144651"}, - {"240a:a965::/32", "145055"}, - {"240e:309:1200::/32", "4134"}, - {"2620:106:7080::/46", "11795"}, - {"2803:b100::/32", "52392"}, - {"2a06:3300::/29", "56532"}, - {"240a:a19e::/32", "143064"}, - {"240a:af23::/32", "146525"}, - {"2804:6530::/32", "269474"}, - {"2a02:88d:402f::/48", "47794"}, - {"2a02:4540:7040::/45", "197207"}, - {"2a0c:f587:fffd::/48", "205381"}, - {"2001:559:8715::/48", "33659"}, - {"2409:8948:9200::/40", "24445"}, - {"240a:a6f4::/32", "144430"}, - {"2602:fc23:11b::/48", "207852"}, - {"2804:37e8:fd00::/38", "262671"}, - {"2a03:1780::/32", "34173"}, - {"2001:4d50::/32", "34309"}, - {"2603:c0f8:2820::/39", "20054"}, - {"2800:9a7:3011::/41", "14522"}, - {"2a03:f0c0::/32", "16253"}, - {"2a06:f901:c000::/36", "8849"}, - {"2a0e:b3c0::/29", "204790"}, - {"2001:559:29f::/48", "33652"}, - {"2407:dc00::/46", "9714"}, - {"240a:a139::/32", "142963"}, - {"240a:a975::/32", "145071"}, - {"240e:3bf:c800::/37", "4134"}, - {"2602:fbb5::/36", "13849"}, - {"2a01:c50f:d140::/38", "12479"}, - {"2a02:26f7:e2c1::/46", "20940"}, - {"2a02:6300::/42", "50128"}, -} diff --git a/vendor/github.com/libp2p/go-libp2p-asn-util/sorted-network-list.bin b/vendor/github.com/libp2p/go-libp2p-asn-util/sorted-network-list.bin new file mode 100644 index 000000000..165957a53 Binary files /dev/null and b/vendor/github.com/libp2p/go-libp2p-asn-util/sorted-network-list.bin differ diff --git a/vendor/github.com/libp2p/go-libp2p-asn-util/version.json b/vendor/github.com/libp2p/go-libp2p-asn-util/version.json index a654d65ab..26a7d4785 100644 --- a/vendor/github.com/libp2p/go-libp2p-asn-util/version.json +++ b/vendor/github.com/libp2p/go-libp2p-asn-util/version.json @@ -1,3 +1,3 @@ { - "version": "v0.3.0" + "version": "v0.4.1" } diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub/gossipsub.go b/vendor/github.com/libp2p/go-libp2p-pubsub/gossipsub.go index f2880e823..aace05533 100644 --- a/vendor/github.com/libp2p/go-libp2p-pubsub/gossipsub.go +++ b/vendor/github.com/libp2p/go-libp2p-pubsub/gossipsub.go @@ -9,12 +9,14 @@ import ( pb "github.com/libp2p/go-libp2p-pubsub/pb" + "github.com/libp2p/go-libp2p/core/event" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/network" "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/peerstore" "github.com/libp2p/go-libp2p/core/protocol" "github.com/libp2p/go-libp2p/core/record" + "github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoremem" ) const ( @@ -231,6 +233,7 @@ func DefaultGossipSubRouter(h host.Host) *GossipSubRouter { iasked: make(map[peer.ID]int), outbound: make(map[peer.ID]bool), connect: make(chan connectInfo, params.MaxPendingConnections), + cab: pstoremem.NewAddrBook(), mcache: NewMessageCache(params.HistoryGossip, params.HistoryLength), protos: GossipSubDefaultProtocols, feature: GossipSubDefaultFeatures, @@ -431,6 +434,7 @@ type GossipSubRouter struct { outbound map[peer.ID]bool // connection direction cache, marks peers with outbound connections backoff map[string]map[peer.ID]time.Time // prune backoff connect chan connectInfo // px connection requests + cab peerstore.AddrBook protos []protocol.ID feature GossipSubFeatureTest @@ -509,6 +513,9 @@ func (gs *GossipSubRouter) Attach(p *PubSub) { go gs.connector() } + // Manage our address book from events emitted by libp2p + go gs.manageAddrBook() + // connect to direct peers if len(gs.direct) > 0 { go func() { @@ -522,6 +529,46 @@ func (gs *GossipSubRouter) Attach(p *PubSub) { } } +func (gs *GossipSubRouter) manageAddrBook() { + sub, err := gs.p.host.EventBus().Subscribe([]interface{}{ + &event.EvtPeerIdentificationCompleted{}, + &event.EvtPeerConnectednessChanged{}, + }) + if err != nil { + log.Errorf("failed to subscribe to peer identification events: %v", err) + return + } + defer sub.Close() + + for { + select { + case <-gs.p.ctx.Done(): + return + case ev := <-sub.Out(): + switch ev := ev.(type) { + case event.EvtPeerIdentificationCompleted: + if ev.SignedPeerRecord != nil { + cab, ok := peerstore.GetCertifiedAddrBook(gs.cab) + if ok { + ttl := peerstore.RecentlyConnectedAddrTTL + if gs.p.host.Network().Connectedness(ev.Peer) == network.Connected { + ttl = peerstore.ConnectedAddrTTL + } + _, err := cab.ConsumePeerRecord(ev.SignedPeerRecord, ttl) + if err != nil { + log.Warnf("failed to consume signed peer record: %v", err) + } + } + } + case event.EvtPeerConnectednessChanged: + if ev.Connectedness != network.Connected { + gs.cab.UpdateAddrs(ev.Peer, peerstore.ConnectedAddrTTL, peerstore.RecentlyConnectedAddrTTL) + } + } + } + } +} + func (gs *GossipSubRouter) AddPeer(p peer.ID, proto protocol.ID) { log.Debugf("PEERUP: Add new peer %s using %s", p, proto) gs.tracer.AddPeer(p, proto) @@ -534,7 +581,7 @@ loop: for _, c := range conns { stat := c.Stat() - if stat.Transient { + if stat.Limited { continue } @@ -951,7 +998,7 @@ func (gs *GossipSubRouter) connector() { } log.Debugf("connecting to %s", ci.p) - cab, ok := peerstore.GetCertifiedAddrBook(gs.p.host.Peerstore()) + cab, ok := peerstore.GetCertifiedAddrBook(gs.cab) if ok && ci.spr != nil { _, err := cab.ConsumePeerRecord(ci.spr, peerstore.TempAddrTTL) if err != nil { @@ -960,7 +1007,7 @@ func (gs *GossipSubRouter) connector() { } ctx, cancel := context.WithTimeout(gs.p.ctx, gs.params.ConnectionTimeout) - err := gs.p.host.Connect(ctx, peer.AddrInfo{ID: ci.p}) + err := gs.p.host.Connect(ctx, peer.AddrInfo{ID: ci.p, Addrs: gs.cab.Addrs(ci.p)}) cancel() if err != nil { log.Debugf("error connecting to %s: %s", ci.p, err) @@ -1886,7 +1933,7 @@ func (gs *GossipSubRouter) makePrune(p peer.ID, topic string, doPX bool, isUnsub return p != xp && gs.score.Score(xp) >= 0 }) - cab, ok := peerstore.GetCertifiedAddrBook(gs.p.host.Peerstore()) + cab, ok := peerstore.GetCertifiedAddrBook(gs.cab) px = make([]*pb.PeerInfo, 0, len(peers)) for _, p := range peers { // see if we have a signed peer record to send back; if we don't, just send diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub/notify.go b/vendor/github.com/libp2p/go-libp2p-pubsub/notify.go index a18d8a2af..f560d3984 100644 --- a/vendor/github.com/libp2p/go-libp2p-pubsub/notify.go +++ b/vendor/github.com/libp2p/go-libp2p-pubsub/notify.go @@ -18,7 +18,7 @@ func (p *PubSubNotif) ClosedStream(n network.Network, s network.Stream) { func (p *PubSubNotif) Connected(n network.Network, c network.Conn) { // ignore transient connections - if c.Stat().Transient { + if c.Stat().Limited { return } @@ -48,7 +48,7 @@ func (p *PubSubNotif) ListenClose(n network.Network, _ ma.Multiaddr) { func (p *PubSubNotif) Initialize() { isTransient := func(pid peer.ID) bool { for _, c := range p.host.Network().ConnsToPeer(pid) { - if !c.Stat().Transient { + if !c.Stat().Limited { return false } } diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub/peer_gater.go b/vendor/github.com/libp2p/go-libp2p-pubsub/peer_gater.go index 4e26bc266..0e9f43f77 100644 --- a/vendor/github.com/libp2p/go-libp2p-pubsub/peer_gater.go +++ b/vendor/github.com/libp2p/go-libp2p-pubsub/peer_gater.go @@ -303,7 +303,7 @@ func (pg *peerGater) getPeerIP(p peer.ID) string { // most streams; it's a nightmare to track multiple IPs per peer, so pick the best one. streams := make(map[string]int) for _, c := range conns { - if c.Stat().Transient { + if c.Stat().Limited { // ignore transient continue } diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub/score.go b/vendor/github.com/libp2p/go-libp2p-pubsub/score.go index ec6c82137..4d146120d 100644 --- a/vendor/github.com/libp2p/go-libp2p-pubsub/score.go +++ b/vendor/github.com/libp2p/go-libp2p-pubsub/score.go @@ -990,7 +990,7 @@ func (ps *peerScore) getIPs(p peer.ID) []string { conns := ps.host.Network().ConnsToPeer(p) res := make([]string, 0, 1) for _, c := range conns { - if c.Stat().Transient { + if c.Stat().Limited { // ignore transient continue } diff --git a/vendor/github.com/libp2p/go-libp2p/README.md b/vendor/github.com/libp2p/go-libp2p/README.md index 7a95a1370..960d89e4f 100644 --- a/vendor/github.com/libp2p/go-libp2p/README.md +++ b/vendor/github.com/libp2p/go-libp2p/README.md @@ -1,6 +1,6 @@

- libp2p hex logo + libp2p hex logo

The Go implementation of the libp2p Networking Stack.

@@ -83,7 +83,7 @@ There's a few things you can do right now to help out: ## Supported Go Versions We test against and support the two most recent major releases of Go. This is -informed by Go's own [security policy](https://go.dev/security). +informed by Go's own [security policy](https://go.dev/doc/security/policy). # Notable Users Some notable users of go-libp2p are: diff --git a/vendor/github.com/libp2p/go-libp2p/config/config.go b/vendor/github.com/libp2p/go-libp2p/config/config.go index 8be5a4399..cc689baf7 100644 --- a/vendor/github.com/libp2p/go-libp2p/config/config.go +++ b/vendor/github.com/libp2p/go-libp2p/config/config.go @@ -1,6 +1,7 @@ package config import ( + "context" "crypto/rand" "errors" "fmt" @@ -23,7 +24,6 @@ import ( "github.com/libp2p/go-libp2p/p2p/host/autonat" "github.com/libp2p/go-libp2p/p2p/host/autorelay" bhost "github.com/libp2p/go-libp2p/p2p/host/basic" - blankhost "github.com/libp2p/go-libp2p/p2p/host/blank" "github.com/libp2p/go-libp2p/p2p/host/eventbus" "github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoremem" rcmgr "github.com/libp2p/go-libp2p/p2p/host/resource-manager" @@ -38,6 +38,7 @@ import ( ma "github.com/multiformats/go-multiaddr" madns "github.com/multiformats/go-multiaddr-dns" + "github.com/quic-go/quic-go" "go.uber.org/fx" "go.uber.org/fx/fxevent" ) @@ -128,6 +129,8 @@ type Config struct { DialRanker network.DialRanker SwarmOpts []swarm.Option + + DisableIdentifyAddressDiscovery bool } func (cfg *Config) makeSwarm(eventBus event.Bus, enableMetrics bool) (*swarm.Swarm, error) { @@ -190,20 +193,11 @@ func (cfg *Config) makeSwarm(eventBus event.Bus, enableMetrics bool) (*swarm.Swa return swarm.NewSwarm(pid, cfg.Peerstore, eventBus, opts...) } -func (cfg *Config) addTransports(h host.Host) error { - swrm, ok := h.Network().(transport.TransportNetwork) - if !ok { - // Should probably skip this if no transports. - return fmt.Errorf("swarm does not support transports") - } - +func (cfg *Config) addTransports() ([]fx.Option, error) { fxopts := []fx.Option{ fx.WithLogger(func() fxevent.Logger { return getFXLogger() }), fx.Provide(fx.Annotate(tptu.New, fx.ParamTags(`name:"security"`))), fx.Supply(cfg.Muxers), - fx.Supply(h.ID()), - fx.Provide(func() host.Host { return h }), - fx.Provide(func() crypto.PrivKey { return h.Peerstore().PrivKey(h.ID()) }), fx.Provide(func() connmgr.ConnectionGater { return cfg.ConnectionGater }), fx.Provide(func() pnet.PSK { return cfg.PSK }), fx.Provide(func() network.ResourceManager { return cfg.ResourceManager }), @@ -265,12 +259,21 @@ func (cfg *Config) addTransports(h host.Host) error { if cfg.QUICReuse != nil { fxopts = append(fxopts, cfg.QUICReuse...) } else { - fxopts = append(fxopts, fx.Provide(quicreuse.NewConnManager)) // TODO: close the ConnManager when shutting down the node + fxopts = append(fxopts, + fx.Provide(func(key quic.StatelessResetKey, tokenGenerator quic.TokenGeneratorKey, _ *swarm.Swarm, lifecycle fx.Lifecycle) (*quicreuse.ConnManager, error) { + cm, err := quicreuse.NewConnManager(key, tokenGenerator) + if err != nil { + return nil, err + } + lifecycle.Append(fx.StopHook(cm.Close)) + return cm, nil + }), + ) } fxopts = append(fxopts, fx.Invoke( fx.Annotate( - func(tpts []transport.Transport) error { + func(swrm *swarm.Swarm, tpts []transport.Transport) error { for _, t := range tpts { if err := swrm.AddTransport(t); err != nil { return err @@ -278,63 +281,35 @@ func (cfg *Config) addTransports(h host.Host) error { } return nil }, - fx.ParamTags(`group:"transport"`), + fx.ParamTags("", `group:"transport"`), )), ) if cfg.Relay { fxopts = append(fxopts, fx.Invoke(circuitv2.AddTransport)) } - app := fx.New(fxopts...) - if err := app.Err(); err != nil { - h.Close() - return err - } - return nil + return fxopts, nil } -// NewNode constructs a new libp2p Host from the Config. -// -// This function consumes the config. Do not reuse it (really!). -func (cfg *Config) NewNode() (host.Host, error) { - // If possible check that the resource manager conn limit is higher than the - // limit set in the conn manager. - if l, ok := cfg.ResourceManager.(connmgr.GetConnLimiter); ok { - err := cfg.ConnManager.CheckLimit(l) - if err != nil { - log.Warn(fmt.Sprintf("rcmgr limit conflicts with connmgr limit: %v", err)) - } - } - - eventBus := eventbus.NewBus(eventbus.WithMetricsTracer(eventbus.NewMetricsTracer(eventbus.WithRegisterer(cfg.PrometheusRegisterer)))) - swrm, err := cfg.makeSwarm(eventBus, !cfg.DisableMetrics) - if err != nil { - return nil, err - } - - if !cfg.DisableMetrics { - rcmgr.MustRegisterWith(cfg.PrometheusRegisterer) - } - +func (cfg *Config) newBasicHost(swrm *swarm.Swarm, eventBus event.Bus) (*bhost.BasicHost, error) { h, err := bhost.NewHost(swrm, &bhost.HostOpts{ - EventBus: eventBus, - ConnManager: cfg.ConnManager, - AddrsFactory: cfg.AddrsFactory, - NATManager: cfg.NATManager, - EnablePing: !cfg.DisablePing, - UserAgent: cfg.UserAgent, - ProtocolVersion: cfg.ProtocolVersion, - EnableHolePunching: cfg.EnableHolePunching, - HolePunchingOptions: cfg.HolePunchingOptions, - EnableRelayService: cfg.EnableRelayService, - RelayServiceOpts: cfg.RelayServiceOpts, - EnableMetrics: !cfg.DisableMetrics, - PrometheusRegisterer: cfg.PrometheusRegisterer, + EventBus: eventBus, + ConnManager: cfg.ConnManager, + AddrsFactory: cfg.AddrsFactory, + NATManager: cfg.NATManager, + EnablePing: !cfg.DisablePing, + UserAgent: cfg.UserAgent, + ProtocolVersion: cfg.ProtocolVersion, + EnableHolePunching: cfg.EnableHolePunching, + HolePunchingOptions: cfg.HolePunchingOptions, + EnableRelayService: cfg.EnableRelayService, + RelayServiceOpts: cfg.RelayServiceOpts, + EnableMetrics: !cfg.DisableMetrics, + PrometheusRegisterer: cfg.PrometheusRegisterer, + DisableIdentifyAddressDiscovery: cfg.DisableIdentifyAddressDiscovery, }) if err != nil { - swrm.Close() return nil, err } - if cfg.Relay { // If we've enabled the relay, we should filter out relay // addresses by default. @@ -345,60 +320,144 @@ func (cfg *Config) NewNode() (host.Host, error) { return oldFactory(autorelay.Filter(addrs)) } } + return h, nil +} - if err := cfg.addTransports(h); err != nil { - h.Close() - return nil, err +// NewNode constructs a new libp2p Host from the Config. +// +// This function consumes the config. Do not reuse it (really!). +func (cfg *Config) NewNode() (host.Host, error) { + if cfg.EnableAutoRelay && !cfg.Relay { + return nil, fmt.Errorf("cannot enable autorelay; relay is not enabled") + } + // If possible check that the resource manager conn limit is higher than the + // limit set in the conn manager. + if l, ok := cfg.ResourceManager.(connmgr.GetConnLimiter); ok { + err := cfg.ConnManager.CheckLimit(l) + if err != nil { + log.Warn(fmt.Sprintf("rcmgr limit conflicts with connmgr limit: %v", err)) + } } - // TODO: This method succeeds if listening on one address succeeds. We - // should probably fail if listening on *any* addr fails. - if err := h.Network().Listen(cfg.ListenAddrs...); err != nil { - h.Close() + if !cfg.DisableMetrics { + rcmgr.MustRegisterWith(cfg.PrometheusRegisterer) + } + + fxopts := []fx.Option{ + fx.Provide(func() event.Bus { + return eventbus.NewBus(eventbus.WithMetricsTracer(eventbus.NewMetricsTracer(eventbus.WithRegisterer(cfg.PrometheusRegisterer)))) + }), + fx.Provide(func(eventBus event.Bus, lifecycle fx.Lifecycle) (*swarm.Swarm, error) { + sw, err := cfg.makeSwarm(eventBus, !cfg.DisableMetrics) + if err != nil { + return nil, err + } + lifecycle.Append(fx.StopHook(sw.Close)) + return sw, nil + }), + // Make sure the swarm constructor depends on the quicreuse.ConnManager. + // That way, the ConnManager will be started before the swarm, and more importantly, + // the swarm will be stopped before the ConnManager. + fx.Decorate(func(sw *swarm.Swarm, _ *quicreuse.ConnManager, lifecycle fx.Lifecycle) *swarm.Swarm { + lifecycle.Append(fx.Hook{ + OnStart: func(context.Context) error { + // TODO: This method succeeds if listening on one address succeeds. We + // should probably fail if listening on *any* addr fails. + return sw.Listen(cfg.ListenAddrs...) + }, + OnStop: func(context.Context) error { + return sw.Close() + }, + }) + return sw + }), + fx.Provide(cfg.newBasicHost), + fx.Provide(func(bh *bhost.BasicHost) host.Host { + return bh + }), + fx.Provide(func(h *swarm.Swarm) peer.ID { return h.LocalPeer() }), + fx.Provide(func(h *swarm.Swarm) crypto.PrivKey { return h.Peerstore().PrivKey(h.LocalPeer()) }), + } + transportOpts, err := cfg.addTransports() + if err != nil { return nil, err } + fxopts = append(fxopts, transportOpts...) // Configure routing and autorelay - var router routing.PeerRouting if cfg.Routing != nil { - router, err = cfg.Routing(h) - if err != nil { - h.Close() - return nil, err - } + fxopts = append(fxopts, + fx.Provide(cfg.Routing), + fx.Provide(func(h host.Host, router routing.PeerRouting) *routed.RoutedHost { + return routed.Wrap(h, router) + }), + ) } // Note: h.AddrsFactory may be changed by relayFinder, but non-relay version is // used by AutoNAT below. - var ar *autorelay.AutoRelay - addrF := h.AddrsFactory if cfg.EnableAutoRelay { - if !cfg.Relay { - h.Close() - return nil, fmt.Errorf("cannot enable autorelay; relay is not enabled") - } if !cfg.DisableMetrics { mt := autorelay.WithMetricsTracer( autorelay.NewMetricsTracer(autorelay.WithRegisterer(cfg.PrometheusRegisterer))) mtOpts := []autorelay.Option{mt} cfg.AutoRelayOpts = append(mtOpts, cfg.AutoRelayOpts...) } - - ar, err = autorelay.NewAutoRelay(h, cfg.AutoRelayOpts...) - if err != nil { - return nil, err - } + fxopts = append(fxopts, + fx.Invoke(func(h *bhost.BasicHost, lifecycle fx.Lifecycle) (*autorelay.AutoRelay, error) { + ar, err := autorelay.NewAutoRelay(h, cfg.AutoRelayOpts...) + if err != nil { + return nil, err + } + lifecycle.Append(fx.StartStopHook(ar.Start, ar.Close)) + return ar, nil + }), + ) } + var bh *bhost.BasicHost + fxopts = append(fxopts, fx.Invoke(func(bho *bhost.BasicHost) { bh = bho })) + fxopts = append(fxopts, fx.Invoke(func(h *bhost.BasicHost, lifecycle fx.Lifecycle) { + lifecycle.Append(fx.StartHook(h.Start)) + })) + + var rh *routed.RoutedHost + if cfg.Routing != nil { + fxopts = append(fxopts, fx.Invoke(func(bho *routed.RoutedHost) { rh = bho })) + } + + app := fx.New(fxopts...) + if err := app.Start(context.Background()); err != nil { + return nil, err + } + + if err := cfg.addAutoNAT(bh); err != nil { + app.Stop(context.Background()) + if cfg.Routing != nil { + rh.Close() + } else { + bh.Close() + } + return nil, err + } + + if cfg.Routing != nil { + return &closableRoutedHost{App: app, RoutedHost: rh}, nil + } + return &closableBasicHost{App: app, BasicHost: bh}, nil +} + +func (cfg *Config) addAutoNAT(h *bhost.BasicHost) error { + addrF := h.AddrsFactory autonatOpts := []autonat.Option{ autonat.UsingAddresses(func() []ma.Multiaddr { return addrF(h.AllAddrs()) }), } if !cfg.DisableMetrics { - autonatOpts = append(autonatOpts, - autonat.WithMetricsTracer( - autonat.NewMetricsTracer(autonat.WithRegisterer(cfg.PrometheusRegisterer)))) + autonatOpts = append(autonatOpts, autonat.WithMetricsTracer( + autonat.NewMetricsTracer(autonat.WithRegisterer(cfg.PrometheusRegisterer)), + )) } if cfg.AutoNATConfig.ThrottleInterval != 0 { autonatOpts = append(autonatOpts, @@ -408,16 +467,15 @@ func (cfg *Config) NewNode() (host.Host, error) { if cfg.AutoNATConfig.EnableService { autonatPrivKey, _, err := crypto.GenerateEd25519Key(rand.Reader) if err != nil { - return nil, err + return err } ps, err := pstoremem.NewPeerstore() if err != nil { - return nil, err + return err } // Pull out the pieces of the config that we _actually_ care about. - // Specifically, don't set up things like autorelay, listeners, - // identify, etc. + // Specifically, don't set up things like listeners, identify, etc. autoNatCfg := Config{ Transports: cfg.Transports, Muxers: cfg.Muxers, @@ -436,21 +494,40 @@ func (cfg *Config) NewNode() (host.Host, error) { }, } - dialer, err := autoNatCfg.makeSwarm(eventbus.NewBus(), false) + fxopts, err := autoNatCfg.addTransports() if err != nil { - h.Close() - return nil, err + return err } - dialerHost := blankhost.NewBlankHost(dialer) - if err := autoNatCfg.addTransports(dialerHost); err != nil { - dialerHost.Close() - h.Close() - return nil, err + var dialer *swarm.Swarm + + fxopts = append(fxopts, + fx.Provide(eventbus.NewBus), + fx.Provide(func(lifecycle fx.Lifecycle, b event.Bus) (*swarm.Swarm, error) { + lifecycle.Append(fx.Hook{ + OnStop: func(context.Context) error { + return ps.Close() + }}) + var err error + dialer, err = autoNatCfg.makeSwarm(b, false) + return dialer, err + + }), + fx.Provide(func(s *swarm.Swarm) peer.ID { return s.LocalPeer() }), + fx.Provide(func() crypto.PrivKey { return autonatPrivKey }), + ) + app := fx.New(fxopts...) + if err := app.Err(); err != nil { + return err } - // NOTE: We're dropping the blank host here but that's fine. It - // doesn't really _do_ anything and doesn't even need to be - // closed (as long as we close the underlying network). - autonatOpts = append(autonatOpts, autonat.EnableService(dialerHost.Network())) + err = app.Start(context.Background()) + if err != nil { + return err + } + go func() { + <-dialer.Done() // The swarm used for autonat has closed, we can cleanup now + app.Stop(context.Background()) + }() + autonatOpts = append(autonatOpts, autonat.EnableService(dialer)) } if cfg.AutoNATConfig.ForceReachability != nil { autonatOpts = append(autonatOpts, autonat.WithReachability(*cfg.AutoNATConfig.ForceReachability)) @@ -458,25 +535,10 @@ func (cfg *Config) NewNode() (host.Host, error) { autonat, err := autonat.New(h, autonatOpts...) if err != nil { - h.Close() - return nil, fmt.Errorf("cannot enable autorelay; autonat failed to start: %v", err) + return fmt.Errorf("cannot enable autorelay; autonat failed to start: %v", err) } h.SetAutoNat(autonat) - - // start the host background tasks - h.Start() - - var ho host.Host - ho = h - if router != nil { - ho = routed.Wrap(h, router) - } - if ar != nil { - arh := autorelay.NewAutoRelayHost(ho, ar) - arh.Start() - ho = arh - } - return ho, nil + return nil } // Option is a libp2p config option that can be given to the libp2p constructor diff --git a/vendor/github.com/libp2p/go-libp2p/config/host.go b/vendor/github.com/libp2p/go-libp2p/config/host.go new file mode 100644 index 000000000..ac61df2cd --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p/config/host.go @@ -0,0 +1,30 @@ +package config + +import ( + "context" + + basichost "github.com/libp2p/go-libp2p/p2p/host/basic" + routed "github.com/libp2p/go-libp2p/p2p/host/routed" + + "go.uber.org/fx" +) + +type closableBasicHost struct { + *fx.App + *basichost.BasicHost +} + +func (h *closableBasicHost) Close() error { + _ = h.App.Stop(context.Background()) + return h.BasicHost.Close() +} + +type closableRoutedHost struct { + *fx.App + *routed.RoutedHost +} + +func (h *closableRoutedHost) Close() error { + _ = h.App.Stop(context.Background()) + return h.RoutedHost.Close() +} diff --git a/vendor/github.com/libp2p/go-libp2p/core/crypto/ecdsa.go b/vendor/github.com/libp2p/go-libp2p/core/crypto/ecdsa.go index 8e392c9ed..c890afe83 100644 --- a/vendor/github.com/libp2p/go-libp2p/core/crypto/ecdsa.go +++ b/vendor/github.com/libp2p/go-libp2p/core/crypto/ecdsa.go @@ -4,6 +4,7 @@ import ( "crypto/ecdsa" "crypto/elliptic" "crypto/rand" + "crypto/sha256" "crypto/x509" "encoding/asn1" "errors" @@ -12,7 +13,6 @@ import ( pb "github.com/libp2p/go-libp2p/core/crypto/pb" "github.com/libp2p/go-libp2p/core/internal/catch" - "github.com/libp2p/go-libp2p/internal/sha256" ) // ECDSAPrivateKey is an implementation of an ECDSA private key diff --git a/vendor/github.com/libp2p/go-libp2p/core/crypto/key.go b/vendor/github.com/libp2p/go-libp2p/core/crypto/key.go index 3652c3cde..6725188d7 100644 --- a/vendor/github.com/libp2p/go-libp2p/core/crypto/key.go +++ b/vendor/github.com/libp2p/go-libp2p/core/crypto/key.go @@ -4,12 +4,10 @@ package crypto import ( - "crypto/elliptic" "crypto/rand" "crypto/subtle" "encoding/base64" "errors" - "fmt" "io" "github.com/libp2p/go-libp2p/core/crypto/pb" @@ -122,51 +120,6 @@ func GenerateKeyPairWithReader(typ, bits int, src io.Reader) (PrivKey, PubKey, e } } -// GenerateEKeyPair returns an ephemeral public key and returns a function that will compute -// the shared secret key. Used in the identify module. -// -// Focuses only on ECDH now, but can be made more general in the future. -func GenerateEKeyPair(curveName string) ([]byte, GenSharedKey, error) { - var curve elliptic.Curve - - switch curveName { - case "P-256": - curve = elliptic.P256() - case "P-384": - curve = elliptic.P384() - case "P-521": - curve = elliptic.P521() - default: - return nil, nil, fmt.Errorf("unknown curve name") - } - - priv, x, y, err := elliptic.GenerateKey(curve, rand.Reader) - if err != nil { - return nil, nil, err - } - - pubKey := elliptic.Marshal(curve, x, y) - - done := func(theirPub []byte) ([]byte, error) { - // Verify and unpack node's public key. - x, y := elliptic.Unmarshal(curve, theirPub) - if x == nil { - return nil, fmt.Errorf("malformed public key: %d %v", len(theirPub), theirPub) - } - - if !curve.IsOnCurve(x, y) { - return nil, errors.New("invalid public key") - } - - // Generate shared secret. - secret, _ := curve.ScalarMult(x, y, priv) - - return secret.Bytes(), nil - } - - return pubKey, done, nil -} - // UnmarshalPublicKey converts a protobuf serialized public key into its // representative object func UnmarshalPublicKey(data []byte) (PubKey, error) { diff --git a/vendor/github.com/libp2p/go-libp2p/core/crypto/rsa_go.go b/vendor/github.com/libp2p/go-libp2p/core/crypto/rsa_go.go index c955cf8e0..845dae926 100644 --- a/vendor/github.com/libp2p/go-libp2p/core/crypto/rsa_go.go +++ b/vendor/github.com/libp2p/go-libp2p/core/crypto/rsa_go.go @@ -4,13 +4,13 @@ import ( "crypto" "crypto/rand" "crypto/rsa" + "crypto/sha256" "crypto/x509" "errors" "io" pb "github.com/libp2p/go-libp2p/core/crypto/pb" "github.com/libp2p/go-libp2p/core/internal/catch" - "github.com/libp2p/go-libp2p/internal/sha256" ) // RsaPrivateKey is a rsa private key diff --git a/vendor/github.com/libp2p/go-libp2p/core/crypto/secp256k1.go b/vendor/github.com/libp2p/go-libp2p/core/crypto/secp256k1.go index bcd68ac6d..99e7464bc 100644 --- a/vendor/github.com/libp2p/go-libp2p/core/crypto/secp256k1.go +++ b/vendor/github.com/libp2p/go-libp2p/core/crypto/secp256k1.go @@ -1,6 +1,7 @@ package crypto import ( + "crypto/sha256" "fmt" "io" @@ -9,7 +10,6 @@ import ( "github.com/decred/dcrd/dcrec/secp256k1/v4" "github.com/decred/dcrd/dcrec/secp256k1/v4/ecdsa" - "github.com/libp2p/go-libp2p/internal/sha256" ) // Secp256k1PrivateKey is a Secp256k1 private key diff --git a/vendor/github.com/libp2p/go-libp2p/core/event/identify.go b/vendor/github.com/libp2p/go-libp2p/core/event/identify.go index ff1499587..888572a2d 100644 --- a/vendor/github.com/libp2p/go-libp2p/core/event/identify.go +++ b/vendor/github.com/libp2p/go-libp2p/core/event/identify.go @@ -1,11 +1,40 @@ package event -import "github.com/libp2p/go-libp2p/core/peer" +import ( + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" + "github.com/libp2p/go-libp2p/core/record" + "github.com/multiformats/go-multiaddr" +) // EvtPeerIdentificationCompleted is emitted when the initial identification round for a peer is completed. type EvtPeerIdentificationCompleted struct { // Peer is the ID of the peer whose identification succeeded. Peer peer.ID + + // Conn is the connection we identified. + Conn network.Conn + + // ListenAddrs is the list of addresses the peer is listening on. + ListenAddrs []multiaddr.Multiaddr + + // Protocols is the list of protocols the peer advertised on this connection. + Protocols []protocol.ID + + // SignedPeerRecord is the provided signed peer record of the peer. May be nil. + SignedPeerRecord *record.Envelope + + // AgentVersion is like a UserAgent string in browsers, or client version in + // bittorrent includes the client name and client. + AgentVersion string + + // ProtocolVersion is the protocolVersion field in the identify message + ProtocolVersion string + + // ObservedAddr is the our side's connection address as observed by the + // peer. This is not verified, the peer could return anything here. + ObservedAddr multiaddr.Multiaddr } // EvtPeerIdentificationFailed is emitted when the initial identification round for a peer failed. diff --git a/vendor/github.com/libp2p/go-libp2p/core/network/context.go b/vendor/github.com/libp2p/go-libp2p/core/network/context.go index 7fabfb53e..75db77593 100644 --- a/vendor/github.com/libp2p/go-libp2p/core/network/context.go +++ b/vendor/github.com/libp2p/go-libp2p/core/network/context.go @@ -13,12 +13,12 @@ var DialPeerTimeout = 60 * time.Second type noDialCtxKey struct{} type dialPeerTimeoutCtxKey struct{} type forceDirectDialCtxKey struct{} -type useTransientCtxKey struct{} +type allowLimitedConnCtxKey struct{} type simConnectCtxKey struct{ isClient bool } var noDial = noDialCtxKey{} var forceDirectDial = forceDirectDialCtxKey{} -var useTransient = useTransientCtxKey{} +var allowLimitedConn = allowLimitedConnCtxKey{} var simConnectIsServer = simConnectCtxKey{} var simConnectIsClient = simConnectCtxKey{isClient: true} @@ -94,15 +94,35 @@ func WithDialPeerTimeout(ctx context.Context, timeout time.Duration) context.Con return context.WithValue(ctx, dialPeerTimeoutCtxKey{}, timeout) } -// WithUseTransient constructs a new context with an option that instructs the network -// that it is acceptable to use a transient connection when opening a new stream. -func WithUseTransient(ctx context.Context, reason string) context.Context { - return context.WithValue(ctx, useTransient, reason) +// WithAllowLimitedConn constructs a new context with an option that instructs +// the network that it is acceptable to use a limited connection when opening a +// new stream. +func WithAllowLimitedConn(ctx context.Context, reason string) context.Context { + return context.WithValue(ctx, allowLimitedConn, reason) } -// GetUseTransient returns true if the use transient option is set in the context. -func GetUseTransient(ctx context.Context) (usetransient bool, reason string) { - v := ctx.Value(useTransient) +// WithUseTransient constructs a new context with an option that instructs the network +// that it is acceptable to use a transient connection when opening a new stream. +// +// Deprecated: Use WithAllowLimitedConn instead. +func WithUseTransient(ctx context.Context, reason string) context.Context { + return context.WithValue(ctx, allowLimitedConn, reason) +} + +// GetAllowLimitedConn returns true if the allow limited conn option is set in the context. +func GetAllowLimitedConn(ctx context.Context) (usetransient bool, reason string) { + v := ctx.Value(allowLimitedConn) + if v != nil { + return true, v.(string) + } + return false, "" +} + +// GetUseTransient returns true if the use transient option is set in the context. +// +// Deprecated: Use GetAllowLimitedConn instead. +func GetUseTransient(ctx context.Context) (usetransient bool, reason string) { + v := ctx.Value(allowLimitedConn) if v != nil { return true, v.(string) } diff --git a/vendor/github.com/libp2p/go-libp2p/core/network/errors.go b/vendor/github.com/libp2p/go-libp2p/core/network/errors.go index 03bb90c26..0f98cd5a2 100644 --- a/vendor/github.com/libp2p/go-libp2p/core/network/errors.go +++ b/vendor/github.com/libp2p/go-libp2p/core/network/errors.go @@ -22,7 +22,13 @@ var ErrNoConn = errors.New("no usable connection to peer") // ErrTransientConn is returned when attempting to open a stream to a peer with only a transient // connection, without specifying the UseTransient option. -var ErrTransientConn = errors.New("transient connection to peer") +// +// Deprecated: Use ErrLimitedConn instead. +var ErrTransientConn = ErrLimitedConn + +// ErrLimitedConn is returned when attempting to open a stream to a peer with only a conn +// connection, without specifying the AllowLimitedConn option. +var ErrLimitedConn = errors.New("limited connection to peer") // ErrResourceLimitExceeded is returned when attempting to perform an operation that would // exceed system resource limits. diff --git a/vendor/github.com/libp2p/go-libp2p/core/network/network.go b/vendor/github.com/libp2p/go-libp2p/core/network/network.go index 66b0a1cd3..22efbf235 100644 --- a/vendor/github.com/libp2p/go-libp2p/core/network/network.go +++ b/vendor/github.com/libp2p/go-libp2p/core/network/network.go @@ -55,16 +55,23 @@ const ( // Connected means has an open, live connection to peer Connected + // Deprecated: CanConnect is deprecated and will be removed in a future release. + // // CanConnect means recently connected to peer, terminated gracefully CanConnect + // Deprecated: CannotConnect is deprecated and will be removed in a future release. + // // CannotConnect means recently attempted connecting but failed to connect. // (should signal "made effort, failed") CannotConnect + + // Limited means we have a transient connection to the peer, but aren't fully connected. + Limited ) func (c Connectedness) String() string { - str := [...]string{"NotConnected", "Connected", "CanConnect", "CannotConnect"} + str := [...]string{"NotConnected", "Connected", "CanConnect", "CannotConnect", "Limited"} if c < 0 || int(c) >= len(str) { return unrecognized } @@ -111,8 +118,10 @@ type Stats struct { Direction Direction // Opened is the timestamp when this connection was opened. Opened time.Time - // Transient indicates that this connection is transient and may be closed soon. - Transient bool + // Limited indicates that this connection is Limited. It maybe limited by + // bytes or time. In practice, this is a connection formed over a circuit v2 + // relay. + Limited bool // Extra stores additional metadata about this connection. Extra map[interface{}]interface{} } diff --git a/vendor/github.com/libp2p/go-libp2p/core/peerstore/peerstore.go b/vendor/github.com/libp2p/go-libp2p/core/peerstore/peerstore.go index 4c9227f81..0ef09df9f 100644 --- a/vendor/github.com/libp2p/go-libp2p/core/peerstore/peerstore.go +++ b/vendor/github.com/libp2p/go-libp2p/core/peerstore/peerstore.go @@ -28,9 +28,10 @@ var ( // RecentlyConnectedAddrTTL is used when we recently connected to a peer. // It means that we are reasonably certain of the peer's address. - RecentlyConnectedAddrTTL = time.Minute * 30 + RecentlyConnectedAddrTTL = time.Minute * 15 // OwnObservedAddrTTL is used for our own external addresses observed by peers. + // Deprecated: observed addresses are maintained till we disconnect from the peer which provided it OwnObservedAddrTTL = time.Minute * 30 ) diff --git a/vendor/github.com/libp2p/go-libp2p/core/routing/routing.go b/vendor/github.com/libp2p/go-libp2p/core/routing/routing.go index e1d47451d..b995b052b 100644 --- a/vendor/github.com/libp2p/go-libp2p/core/routing/routing.go +++ b/vendor/github.com/libp2p/go-libp2p/core/routing/routing.go @@ -76,7 +76,7 @@ type Routing interface { ValueStore // Bootstrap allows callers to hint to the routing system to get into a - // Boostrapped state and remain there. It is not a synchronous call. + // Bootstrapped state and remain there. It is not a synchronous call. Bootstrap(context.Context) error // TODO expose io.Closer or plain-old Close error diff --git a/vendor/github.com/libp2p/go-libp2p/defaults.go b/vendor/github.com/libp2p/go-libp2p/defaults.go index d11302690..8f7dc9467 100644 --- a/vendor/github.com/libp2p/go-libp2p/defaults.go +++ b/vendor/github.com/libp2p/go-libp2p/defaults.go @@ -27,8 +27,8 @@ import ( // Useful when you want to extend, but not replace, the supported transport // security protocols. var DefaultSecurity = ChainOptions( - Security(noise.ID, noise.New), Security(tls.ID, tls.New), + Security(noise.ID, noise.New), ) // DefaultMuxers configures libp2p to use the stream connection multiplexers. diff --git a/vendor/github.com/libp2p/go-libp2p/internal/sha256/post_go1_21.go b/vendor/github.com/libp2p/go-libp2p/internal/sha256/post_go1_21.go deleted file mode 100644 index 98c14b609..000000000 --- a/vendor/github.com/libp2p/go-libp2p/internal/sha256/post_go1_21.go +++ /dev/null @@ -1,23 +0,0 @@ -//go:build go1.21 - -// This package use build tags to select between github.com/minio/sha256-simd -// for go1.20 and bellow and crypto/sha256 for go1.21 and above. -// This is used because a fast SHANI implementation of sha256 is only avaiable -// in the std for go1.21 and above. See https://go.dev/issue/50543. -// TODO: Once go1.22 releases remove this package and replace all uses -// with crypto/sha256 because the two supported version of go will have the fast -// implementation. -package sha256 - -import ( - "crypto/sha256" - "hash" -) - -func Sum256(b []byte) [sha256.Size]byte { - return sha256.Sum256(b) -} - -func New() hash.Hash { - return sha256.New() -} diff --git a/vendor/github.com/libp2p/go-libp2p/internal/sha256/pre_go1_21.go b/vendor/github.com/libp2p/go-libp2p/internal/sha256/pre_go1_21.go deleted file mode 100644 index db0573333..000000000 --- a/vendor/github.com/libp2p/go-libp2p/internal/sha256/pre_go1_21.go +++ /dev/null @@ -1,24 +0,0 @@ -//go:build !go1.21 - -// This package use build tags to select between github.com/minio/sha256-simd -// for go1.20 and bellow and crypto/sha256 for go1.21 and above. -// This is used because a fast SHANI implementation of sha256 is only avaiable -// in the std for go1.21 and above. See https://go.dev/issue/50543. -// TODO: Once go1.22 releases remove this package and replace all uses -// with crypto/sha256 because the two supported version of go will have the fast -// implementation. -package sha256 - -import ( - "hash" - - "github.com/minio/sha256-simd" -) - -func Sum256(b []byte) [sha256.Size]byte { - return sha256.Sum256(b) -} - -func New() hash.Hash { - return sha256.New() -} diff --git a/vendor/github.com/libp2p/go-libp2p/libp2p.go b/vendor/github.com/libp2p/go-libp2p/libp2p.go index db23253b1..1440648db 100644 --- a/vendor/github.com/libp2p/go-libp2p/libp2p.go +++ b/vendor/github.com/libp2p/go-libp2p/libp2p.go @@ -42,13 +42,13 @@ func ChainOptions(opts ...Option) Option { // - If no security transport is provided, the host uses the go-libp2p's noise // and/or tls encrypted transport to encrypt all traffic; // -// - If no peer identity is provided, it generates a random RSA 2048 key-pair +// - If no peer identity is provided, it generates a random Ed25519 key-pair // and derives a new identity from it; // // - If no peerstore is provided, the host is initialized with an empty // peerstore. // -// To stop/shutdown the returned libp2p node, the user needs to cancel the passed context and call `Close` on the returned Host. +// To stop/shutdown the returned libp2p node, the user needs to call `Close` on the returned Host. func New(opts ...Option) (host.Host, error) { return NewWithoutDefaults(append(opts, FallbackDefaults)...) } diff --git a/vendor/github.com/libp2p/go-libp2p/options.go b/vendor/github.com/libp2p/go-libp2p/options.go index 1a1e9d398..de95251ad 100644 --- a/vendor/github.com/libp2p/go-libp2p/options.go +++ b/vendor/github.com/libp2p/go-libp2p/options.go @@ -349,7 +349,7 @@ func EnableAutoRelayWithPeerSource(peerSource autorelay.PeerSource, opts ...auto // forcing the local node to believe it is reachable externally. func ForceReachabilityPublic() Option { return func(cfg *Config) error { - public := network.Reachability(network.ReachabilityPublic) + public := network.ReachabilityPublic cfg.AutoNATConfig.ForceReachability = &public return nil } @@ -359,7 +359,7 @@ func ForceReachabilityPublic() Option { // forceing the local node to believe it is behind a NAT and not reachable externally. func ForceReachabilityPrivate() Option { return func(cfg *Config) error { - private := network.Reachability(network.ReachabilityPrivate) + private := network.ReachabilityPrivate cfg.AutoNATConfig.ForceReachability = &private return nil } @@ -598,3 +598,14 @@ func SwarmOpts(opts ...swarm.Option) Option { return nil } } + +// DisableIdentifyAddressDiscovery disables address discovery using peer provided observed addresses +// in identify. If you know your public addresses upfront, the recommended way is to use +// AddressFactory to provide the external adddress to the host and use this option to disable +// discovery from identify. +func DisableIdentifyAddressDiscovery() Option { + return func(cfg *Config) error { + cfg.DisableIdentifyAddressDiscovery = true + return nil + } +} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/discovery/backoff/backoffcache.go b/vendor/github.com/libp2p/go-libp2p/p2p/discovery/backoff/backoffcache.go index 82c07241f..c8f11802e 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/discovery/backoff/backoffcache.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/discovery/backoff/backoffcache.go @@ -82,14 +82,6 @@ func (c realClock) Now() time.Time { return time.Now() } -// withClock lets you override the default time.Now() call. Useful for tests. -func withClock(c clock) BackoffDiscoveryOption { - return func(b *BackoffDiscovery) error { - b.clock = c - return nil - } -} - type backoffCache struct { // strat is assigned on creation and not written to strat BackoffStrategy diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/autonat/autonat.go b/vendor/github.com/libp2p/go-libp2p/p2p/host/autonat/autonat.go index fc8c6763b..479f31ecf 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/host/autonat/autonat.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/host/autonat/autonat.go @@ -431,7 +431,7 @@ func (as *AmbientAutoNAT) getPeerToProbe() peer.ID { func (as *AmbientAutoNAT) Close() error { as.ctxCancel() if as.service != nil { - as.service.Disable() + return as.service.Close() } <-as.backgroundRunning return nil @@ -444,7 +444,7 @@ func (s *StaticAutoNAT) Status() network.Reachability { func (s *StaticAutoNAT) Close() error { if s.service != nil { - s.service.Disable() + return s.service.Close() } return nil } diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/autonat/svc.go b/vendor/github.com/libp2p/go-libp2p/p2p/host/autonat/svc.go index cf1dff8e7..d29355014 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/host/autonat/svc.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/host/autonat/svc.go @@ -273,6 +273,11 @@ func (as *autoNATService) Disable() { } } +func (as *autoNATService) Close() error { + as.Disable() + return as.config.dialer.Close() +} + func (as *autoNATService) background(ctx context.Context) { defer close(as.backgroundRunning) diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/autorelay/addrsplosion.go b/vendor/github.com/libp2p/go-libp2p/p2p/host/autorelay/addrsplosion.go index c6353b157..710dab149 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/host/autorelay/addrsplosion.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/host/autorelay/addrsplosion.go @@ -54,7 +54,7 @@ func isRelayAddr(a ma.Multiaddr) bool { func isDNSAddr(a ma.Multiaddr) bool { if first, _ := ma.SplitFirst(a); first != nil { switch first.Protocol().Code { - case ma.P_DNS4, ma.P_DNS6, ma.P_DNSADDR: + case ma.P_DNS, ma.P_DNS4, ma.P_DNS6, ma.P_DNSADDR: return true } } diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/autorelay/host.go b/vendor/github.com/libp2p/go-libp2p/p2p/host/autorelay/host.go deleted file mode 100644 index c6bd9c570..000000000 --- a/vendor/github.com/libp2p/go-libp2p/p2p/host/autorelay/host.go +++ /dev/null @@ -1,23 +0,0 @@ -package autorelay - -import ( - "github.com/libp2p/go-libp2p/core/host" -) - -type AutoRelayHost struct { - host.Host - ar *AutoRelay -} - -func (h *AutoRelayHost) Close() error { - _ = h.ar.Close() - return h.Host.Close() -} - -func (h *AutoRelayHost) Start() { - h.ar.Start() -} - -func NewAutoRelayHost(h host.Host, ar *AutoRelay) *AutoRelayHost { - return &AutoRelayHost{Host: h, ar: ar} -} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/autorelay/metrics.go b/vendor/github.com/libp2p/go-libp2p/p2p/host/autorelay/metrics.go index 8028655b0..af4b53ed0 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/host/autorelay/metrics.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/host/autorelay/metrics.go @@ -59,7 +59,7 @@ var ( prometheus.CounterOpts{ Namespace: metricNamespace, Name: "candidates_circuit_v2_support_total", - Help: "Candidiates supporting circuit v2", + Help: "Candidates supporting circuit v2", }, []string{"support"}, ) @@ -167,7 +167,7 @@ func NewMetricsTracer(opts ...MetricsTracerOption) MetricsTracer { metricshelper.RegisterCollectors(setting.reg, collectors...) // Initialise these counters to 0 otherwise the first reservation requests aren't handled - // correctly when using promql increse function + // correctly when using promql increase function reservationRequestsOutcomeTotal.WithLabelValues("refresh", "success") reservationRequestsOutcomeTotal.WithLabelValues("new", "success") candidatesCircuitV2SupportTotal.WithLabelValues("yes") diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/autorelay/relay_finder.go b/vendor/github.com/libp2p/go-libp2p/p2p/host/autorelay/relay_finder.go index ef79950b7..13f8c63e6 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/host/autorelay/relay_finder.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/host/autorelay/relay_finder.go @@ -63,7 +63,7 @@ type relayFinder struct { candidates map[peer.ID]*candidate backoff map[peer.ID]time.Time maybeConnectToRelayTrigger chan struct{} // cap: 1 - // Any time _something_ hapens that might cause us to need new candidates. + // Any time _something_ happens that might cause us to need new candidates. // This could be // * the disconnection of a relay // * the failed attempt to obtain a reservation with a current candidate diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/basic/basic_host.go b/vendor/github.com/libp2p/go-libp2p/p2p/host/basic/basic_host.go index 6c3ba53e5..8fc808e6b 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/host/basic/basic_host.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/host/basic/basic_host.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "net" + "slices" "sync" "time" @@ -27,6 +28,7 @@ import ( "github.com/libp2p/go-libp2p/p2p/protocol/holepunch" "github.com/libp2p/go-libp2p/p2p/protocol/identify" "github.com/libp2p/go-libp2p/p2p/protocol/ping" + libp2pwebrtc "github.com/libp2p/go-libp2p/p2p/transport/webrtc" libp2pwebtransport "github.com/libp2p/go-libp2p/p2p/transport/webtransport" "github.com/prometheus/client_golang/prometheus" @@ -52,6 +54,8 @@ var ( DefaultAddrsFactory = func(addrs []ma.Multiaddr) []ma.Multiaddr { return addrs } ) +const maxPeerRecordSize = 8 * 1024 // 8k to be compatible with identify's limit + // AddrsFactory functions can be passed to New in order to override // addresses returned by Addrs. type AddrsFactory func([]ma.Multiaddr) []ma.Multiaddr @@ -160,6 +164,9 @@ type HostOpts struct { EnableMetrics bool // PrometheusRegisterer is the PrometheusRegisterer used for metrics PrometheusRegisterer prometheus.Registerer + + // DisableIdentifyAddressDiscovery disables address discovery using peer provided observed addresses in identify + DisableIdentifyAddressDiscovery bool } // NewHost constructs a new *BasicHost and activates it by attaching its stream and connection handlers to the given inet.Network. @@ -171,12 +178,11 @@ func NewHost(n network.Network, opts *HostOpts) (*BasicHost, error) { opts.EventBus = eventbus.NewBus() } - psManager, err := pstoremanager.NewPeerstoreManager(n.Peerstore(), opts.EventBus) + psManager, err := pstoremanager.NewPeerstoreManager(n.Peerstore(), opts.EventBus, n) if err != nil { return nil, err } hostCtx, cancel := context.WithCancel(context.Background()) - h := &BasicHost{ network: n, psManager: psManager, @@ -244,6 +250,9 @@ func NewHost(n network.Network, opts *HostOpts) (*BasicHost, error) { identify.WithMetricsTracer( identify.NewMetricsTracer(identify.WithRegisterer(opts.PrometheusRegisterer)))) } + if opts.DisableIdentifyAddressDiscovery { + idOpts = append(idOpts, identify.DisableObservedAddrManager()) + } h.ids, err = identify.NewIDService(h, idOpts...) if err != nil { @@ -415,7 +424,7 @@ func (h *BasicHost) newStreamHandler(s network.Stream) { } logf("protocol EOF: %s (took %s)", s.Conn().RemotePeer(), took) } else { - log.Debugf("protocol mux failed: %s (took %s)", err, took) + log.Debugf("protocol mux failed: %s (took %s, id:%s, remote peer:%s, remote addr:%v)", err, took, s.ID(), s.Conn().RemotePeer(), s.Conn().RemoteMultiaddr()) } s.Reset() return @@ -482,15 +491,18 @@ func makeUpdatedAddrEvent(prev, current []ma.Multiaddr) *event.EvtLocalAddresses return &evt } -func (h *BasicHost) makeSignedPeerRecord(evt *event.EvtLocalAddressesUpdated) (*record.Envelope, error) { - current := make([]ma.Multiaddr, 0, len(evt.Current)) - for _, a := range evt.Current { - current = append(current, a.Address) +func (h *BasicHost) makeSignedPeerRecord(addrs []ma.Multiaddr) (*record.Envelope, error) { + // Limit the length of currentAddrs to ensure that our signed peer records aren't rejected + peerRecordSize := 64 // HostID + k, err := h.signKey.Raw() + if err != nil { + peerRecordSize += 2 * len(k) // 1 for signature, 1 for public key } - + // we want the final address list to be small for keeping the signed peer record in size + addrs = trimHostAddrList(addrs, maxPeerRecordSize-peerRecordSize-256) // 256 B of buffer rec := peer.PeerRecordFromAddrInfo(peer.AddrInfo{ ID: h.ID(), - Addrs: current, + Addrs: addrs, }) return record.Seal(rec, h.signKey) } @@ -513,7 +525,7 @@ func (h *BasicHost) background() { if !h.disableSignedPeerRecord { // add signed peer record to the event - sr, err := h.makeSignedPeerRecord(changeEvt) + sr, err := h.makeSignedPeerRecord(currentAddrs) if err != nil { log.Errorf("error creating a signed peer record from the set of current addresses, err=%s", err) return @@ -543,7 +555,7 @@ func (h *BasicHost) background() { h.updateLocalIpAddr() } // Request addresses anyways because, technically, address filters still apply. - // The underlying AllAddrs call is effectivley a no-op. + // The underlying AllAddrs call is effectively a no-op. curr := h.Addrs() emitAddrChange(curr, lastAddrs) lastAddrs = curr @@ -724,8 +736,10 @@ func (h *BasicHost) Connect(ctx context.Context, pi peer.AddrInfo) error { h.Peerstore().AddAddrs(pi.ID, pi.Addrs, peerstore.TempAddrTTL) forceDirect, _ := network.GetForceDirectDial(ctx) + canUseLimitedConn, _ := network.GetAllowLimitedConn(ctx) if !forceDirect { - if h.Network().Connectedness(pi.ID) == network.Connected { + connectedness := h.Network().Connectedness(pi.ID) + if connectedness == network.Connected || (canUseLimitedConn && connectedness == network.Limited) { return nil } } @@ -787,7 +801,9 @@ func (h *BasicHost) Addrs() []ma.Multiaddr { copy(addrs, addrsOld) for i, addr := range addrs { - if ok, n := libp2pwebtransport.IsWebtransportMultiaddr(addr); ok && n == 0 { + wtOK, wtN := libp2pwebtransport.IsWebtransportMultiaddr(addr) + webrtcOK, webrtcN := libp2pwebrtc.IsWebRTCDirectMultiaddr(addr) + if (wtOK && wtN == 0) || (webrtcOK && webrtcN == 0) { t := s.TransportForListening(addr) tpt, ok := t.(addCertHasher) if !ok { @@ -795,19 +811,24 @@ func (h *BasicHost) Addrs() []ma.Multiaddr { } addrWithCerthash, added := tpt.AddCertHashes(addr) if !added { - log.Debug("Couldn't add certhashes to webtransport multiaddr because we aren't listening on webtransport") + log.Debugf("Couldn't add certhashes to multiaddr: %s", addr) continue } addrs[i] = addrWithCerthash } } + return addrs } // NormalizeMultiaddr returns a multiaddr suitable for equality checks. // If the multiaddr is a webtransport component, it removes the certhashes. func (h *BasicHost) NormalizeMultiaddr(addr ma.Multiaddr) ma.Multiaddr { - if ok, n := libp2pwebtransport.IsWebtransportMultiaddr(addr); ok && n > 0 { + ok, n := libp2pwebtransport.IsWebtransportMultiaddr(addr) + if !ok { + ok, n = libp2pwebrtc.IsWebRTCDirectMultiaddr(addr) + } + if ok && n > 0 { out := addr for i := 0; i < n; i++ { out, _ = ma.SplitLast(out) @@ -989,6 +1010,58 @@ func inferWebtransportAddrsFromQuic(in []ma.Multiaddr) []ma.Multiaddr { return out } +func trimHostAddrList(addrs []ma.Multiaddr, maxSize int) []ma.Multiaddr { + totalSize := 0 + for _, a := range addrs { + totalSize += len(a.Bytes()) + } + if totalSize <= maxSize { + return addrs + } + + score := func(addr ma.Multiaddr) int { + var res int + if manet.IsPublicAddr(addr) { + res |= 1 << 12 + } else if !manet.IsIPLoopback(addr) { + res |= 1 << 11 + } + var protocolWeight int + ma.ForEach(addr, func(c ma.Component) bool { + switch c.Protocol().Code { + case ma.P_QUIC_V1: + protocolWeight = 5 + case ma.P_TCP: + protocolWeight = 4 + case ma.P_WSS: + protocolWeight = 3 + case ma.P_WEBTRANSPORT: + protocolWeight = 2 + case ma.P_WEBRTC_DIRECT: + protocolWeight = 1 + case ma.P_P2P: + return false + } + return true + }) + res |= 1 << protocolWeight + return res + } + + slices.SortStableFunc(addrs, func(a, b ma.Multiaddr) int { + return score(b) - score(a) // b-a for reverse order + }) + totalSize = 0 + for i, a := range addrs { + totalSize += len(a.Bytes()) + if totalSize > maxSize { + addrs = addrs[:i] + break + } + } + return addrs +} + // SetAutoNat sets the autonat service for the host. func (h *BasicHost) SetAutoNat(a autonat.AutoNAT) { h.addrMu.Lock() @@ -1030,7 +1103,6 @@ func (h *BasicHost) Close() error { _ = h.emitters.evtLocalProtocolsUpdated.Close() _ = h.emitters.evtLocalAddrsUpdated.Close() - h.Network().Close() h.psManager.Close() if h.Peerstore() != nil { diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/basic/natmgr.go b/vendor/github.com/libp2p/go-libp2p/p2p/host/basic/natmgr.go index 8e8fbea34..bc55e4d76 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/host/basic/natmgr.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/host/basic/natmgr.go @@ -127,7 +127,7 @@ func (nmgr *natManager) background(ctx context.Context) { for { select { case <-nmgr.syncFlag: - nmgr.doSync() // sync when our listen addresses chnage. + nmgr.doSync() // sync when our listen addresses change. case <-ctx.Done(): return } diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/blank/blank.go b/vendor/github.com/libp2p/go-libp2p/p2p/host/blank/blank.go deleted file mode 100644 index 0fdded30f..000000000 --- a/vendor/github.com/libp2p/go-libp2p/p2p/host/blank/blank.go +++ /dev/null @@ -1,232 +0,0 @@ -package blankhost - -import ( - "context" - "errors" - "fmt" - "io" - - "github.com/libp2p/go-libp2p/core/connmgr" - "github.com/libp2p/go-libp2p/core/event" - "github.com/libp2p/go-libp2p/core/host" - "github.com/libp2p/go-libp2p/core/network" - "github.com/libp2p/go-libp2p/core/peer" - "github.com/libp2p/go-libp2p/core/peerstore" - "github.com/libp2p/go-libp2p/core/protocol" - "github.com/libp2p/go-libp2p/core/record" - "github.com/libp2p/go-libp2p/p2p/host/eventbus" - - logging "github.com/ipfs/go-log/v2" - - ma "github.com/multiformats/go-multiaddr" - mstream "github.com/multiformats/go-multistream" -) - -var log = logging.Logger("blankhost") - -// BlankHost is the thinnest implementation of the host.Host interface -type BlankHost struct { - n network.Network - mux *mstream.MultistreamMuxer[protocol.ID] - cmgr connmgr.ConnManager - eventbus event.Bus - emitters struct { - evtLocalProtocolsUpdated event.Emitter - } -} - -type config struct { - cmgr connmgr.ConnManager - eventBus event.Bus -} - -type Option = func(cfg *config) - -func WithConnectionManager(cmgr connmgr.ConnManager) Option { - return func(cfg *config) { - cfg.cmgr = cmgr - } -} - -func WithEventBus(eventBus event.Bus) Option { - return func(cfg *config) { - cfg.eventBus = eventBus - } -} - -func NewBlankHost(n network.Network, options ...Option) *BlankHost { - cfg := config{ - cmgr: &connmgr.NullConnMgr{}, - } - for _, opt := range options { - opt(&cfg) - } - - bh := &BlankHost{ - n: n, - cmgr: cfg.cmgr, - mux: mstream.NewMultistreamMuxer[protocol.ID](), - } - if bh.eventbus == nil { - bh.eventbus = eventbus.NewBus(eventbus.WithMetricsTracer(eventbus.NewMetricsTracer())) - } - - // subscribe the connection manager to network notifications (has no effect with NullConnMgr) - n.Notify(bh.cmgr.Notifee()) - - var err error - if bh.emitters.evtLocalProtocolsUpdated, err = bh.eventbus.Emitter(&event.EvtLocalProtocolsUpdated{}); err != nil { - return nil - } - - n.SetStreamHandler(bh.newStreamHandler) - - // persist a signed peer record for self to the peerstore. - if err := bh.initSignedRecord(); err != nil { - log.Errorf("error creating blank host, err=%s", err) - return nil - } - - return bh -} - -func (bh *BlankHost) initSignedRecord() error { - cab, ok := peerstore.GetCertifiedAddrBook(bh.n.Peerstore()) - if !ok { - log.Error("peerstore does not support signed records") - return errors.New("peerstore does not support signed records") - } - rec := peer.PeerRecordFromAddrInfo(peer.AddrInfo{ID: bh.ID(), Addrs: bh.Addrs()}) - ev, err := record.Seal(rec, bh.Peerstore().PrivKey(bh.ID())) - if err != nil { - log.Errorf("failed to create signed record for self, err=%s", err) - return fmt.Errorf("failed to create signed record for self, err=%s", err) - } - _, err = cab.ConsumePeerRecord(ev, peerstore.PermanentAddrTTL) - if err != nil { - log.Errorf("failed to persist signed record to peerstore,err=%s", err) - return fmt.Errorf("failed to persist signed record for self, err=%s", err) - } - return err -} - -var _ host.Host = (*BlankHost)(nil) - -func (bh *BlankHost) Addrs() []ma.Multiaddr { - addrs, err := bh.n.InterfaceListenAddresses() - if err != nil { - log.Debug("error retrieving network interface addrs: ", err) - return nil - } - - return addrs -} - -func (bh *BlankHost) Close() error { - return bh.n.Close() -} - -func (bh *BlankHost) Connect(ctx context.Context, ai peer.AddrInfo) error { - // absorb addresses into peerstore - bh.Peerstore().AddAddrs(ai.ID, ai.Addrs, peerstore.TempAddrTTL) - - cs := bh.n.ConnsToPeer(ai.ID) - if len(cs) > 0 { - return nil - } - - _, err := bh.Network().DialPeer(ctx, ai.ID) - if err != nil { - return fmt.Errorf("failed to dial: %w", err) - } - return err -} - -func (bh *BlankHost) Peerstore() peerstore.Peerstore { - return bh.n.Peerstore() -} - -func (bh *BlankHost) ID() peer.ID { - return bh.n.LocalPeer() -} - -func (bh *BlankHost) NewStream(ctx context.Context, p peer.ID, protos ...protocol.ID) (network.Stream, error) { - s, err := bh.n.NewStream(ctx, p) - if err != nil { - return nil, fmt.Errorf("failed to open stream: %w", err) - } - - selected, err := mstream.SelectOneOf(protos, s) - if err != nil { - s.Reset() - return nil, fmt.Errorf("failed to negotiate protocol: %w", err) - } - - s.SetProtocol(selected) - bh.Peerstore().AddProtocols(p, selected) - - return s, nil -} - -func (bh *BlankHost) RemoveStreamHandler(pid protocol.ID) { - bh.Mux().RemoveHandler(pid) - bh.emitters.evtLocalProtocolsUpdated.Emit(event.EvtLocalProtocolsUpdated{ - Removed: []protocol.ID{pid}, - }) -} - -func (bh *BlankHost) SetStreamHandler(pid protocol.ID, handler network.StreamHandler) { - bh.Mux().AddHandler(pid, func(p protocol.ID, rwc io.ReadWriteCloser) error { - is := rwc.(network.Stream) - is.SetProtocol(p) - handler(is) - return nil - }) - bh.emitters.evtLocalProtocolsUpdated.Emit(event.EvtLocalProtocolsUpdated{ - Added: []protocol.ID{pid}, - }) -} - -func (bh *BlankHost) SetStreamHandlerMatch(pid protocol.ID, m func(protocol.ID) bool, handler network.StreamHandler) { - bh.Mux().AddHandlerWithFunc(pid, m, func(p protocol.ID, rwc io.ReadWriteCloser) error { - is := rwc.(network.Stream) - is.SetProtocol(p) - handler(is) - return nil - }) - bh.emitters.evtLocalProtocolsUpdated.Emit(event.EvtLocalProtocolsUpdated{ - Added: []protocol.ID{pid}, - }) -} - -// newStreamHandler is the remote-opened stream handler for network.Network -func (bh *BlankHost) newStreamHandler(s network.Stream) { - protoID, handle, err := bh.Mux().Negotiate(s) - if err != nil { - log.Infow("protocol negotiation failed", "error", err) - s.Reset() - return - } - - s.SetProtocol(protoID) - - handle(protoID, s) -} - -// TODO: i'm not sure this really needs to be here -func (bh *BlankHost) Mux() protocol.Switch { - return bh.mux -} - -// TODO: also not sure this fits... Might be better ways around this (leaky abstractions) -func (bh *BlankHost) Network() network.Network { - return bh.n -} - -func (bh *BlankHost) ConnManager() connmgr.ConnManager { - return bh.cmgr -} - -func (bh *BlankHost) EventBus() event.Bus { - return bh.eventbus -} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoremem/addr_book.go b/vendor/github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoremem/addr_book.go index 67f9f9146..209937ca8 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoremem/addr_book.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoremem/addr_book.go @@ -49,7 +49,7 @@ func (segments *addrSegments) get(p peer.ID) *addrSegment { if len(p) == 0 { // it's not terribly useful to use an empty peer ID, but at least we should not panic return segments[0] } - return segments[uint8(p[len(p)-1])] + return segments[p[len(p)-1]] } type clock interface { diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoremem/protobook.go b/vendor/github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoremem/protobook.go index 0000f97ff..51c4b0282 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoremem/protobook.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoremem/protobook.go @@ -17,7 +17,7 @@ type protoSegment struct { type protoSegments [256]*protoSegment func (s *protoSegments) get(p peer.ID) *protoSegment { - return s[byte(p[len(p)-1])] + return s[p[len(p)-1]] } var errTooManyProtocols = errors.New("too many protocols") diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/pstoremanager/pstoremanager.go b/vendor/github.com/libp2p/go-libp2p/p2p/host/pstoremanager/pstoremanager.go index d9550f494..93cc2a98d 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/host/pstoremanager/pstoremanager.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/host/pstoremanager/pstoremanager.go @@ -41,6 +41,7 @@ func WithCleanupInterval(t time.Duration) Option { type PeerstoreManager struct { pstore peerstore.Peerstore eventBus event.Bus + network network.Network cancel context.CancelFunc refCount sync.WaitGroup @@ -49,11 +50,12 @@ type PeerstoreManager struct { cleanupInterval time.Duration } -func NewPeerstoreManager(pstore peerstore.Peerstore, eventBus event.Bus, opts ...Option) (*PeerstoreManager, error) { +func NewPeerstoreManager(pstore peerstore.Peerstore, eventBus event.Bus, network network.Network, opts ...Option) (*PeerstoreManager, error) { m := &PeerstoreManager{ pstore: pstore, gracePeriod: time.Minute, eventBus: eventBus, + network: network, } for _, opt := range opts { if err := opt(m); err != nil { @@ -101,20 +103,28 @@ func (m *PeerstoreManager) background(ctx context.Context, sub event.Subscriptio ev := e.(event.EvtPeerConnectednessChanged) p := ev.Peer switch ev.Connectedness { - case network.NotConnected: + case network.Connected, network.Limited: + // If we reconnect to the peer before we've cleared the information, + // keep it. This is an optimization to keep the disconnected map + // small. We still need to check that a peer is actually + // disconnected before removing it from the peer store. + delete(disconnected, p) + default: if _, ok := disconnected[p]; !ok { disconnected[p] = time.Now() } - case network.Connected: - // If we reconnect to the peer before we've cleared the information, keep it. - delete(disconnected, p) } case <-ticker.C: now := time.Now() for p, disconnectTime := range disconnected { if disconnectTime.Add(m.gracePeriod).Before(now) { - m.pstore.RemovePeer(p) - delete(disconnected, p) + // Check that the peer is actually not connected at this point. + // This avoids a race condition where the Connected notification + // is processed after this time has fired. + if m.network.Connectedness(p) != network.Connected { + m.pstore.RemovePeer(p) + delete(disconnected, p) + } } } case <-ctx.Done(): diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/resource-manager/README.md b/vendor/github.com/libp2p/go-libp2p/p2p/host/resource-manager/README.md index 72eb192ad..68ce0aa01 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/host/resource-manager/README.md +++ b/vendor/github.com/libp2p/go-libp2p/p2p/host/resource-manager/README.md @@ -161,7 +161,7 @@ belong to some service in the system. Hence, this suggests that apart from global limits, we can constrain stream usage at finer granularity, at the protocol and service level. -Once again, we disinguish between inbound and outbound streams. +Once again, we distinguish between inbound and outbound streams. Inbound streams are initiated by remote peers and consume resources in response to network events; controlling inbound stream usage is again paramount for protecting the system from overload or attack. diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/resource-manager/conn_limiter.go b/vendor/github.com/libp2p/go-libp2p/p2p/host/resource-manager/conn_limiter.go new file mode 100644 index 000000000..717249e85 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p/p2p/host/resource-manager/conn_limiter.go @@ -0,0 +1,288 @@ +package rcmgr + +import ( + "math" + "net/netip" + "slices" + "sync" +) + +type ConnLimitPerSubnet struct { + // This defines how big the subnet is. For example, a /24 subnet has a + // PrefixLength of 24. All IPs that share the same 24 bit prefix are in the same + // subnet. Are in the same subnet, and bound to the same limit. + PrefixLength int + // The maximum number of connections allowed for each subnet. + ConnCount int +} + +type NetworkPrefixLimit struct { + // The Network prefix for which this limit applies. + Network netip.Prefix + + // The maximum number of connections allowed for this subnet. + ConnCount int +} + +// 8 for now so that it matches the number of concurrent dials we may do +// in swarm_dial.go. With future smart dialing work we should bring this +// down +var defaultMaxConcurrentConns = 8 + +var defaultIP4Limit = ConnLimitPerSubnet{ + ConnCount: defaultMaxConcurrentConns, + PrefixLength: 32, +} +var defaultIP6Limits = []ConnLimitPerSubnet{ + { + ConnCount: defaultMaxConcurrentConns, + PrefixLength: 56, + }, + { + ConnCount: 8 * defaultMaxConcurrentConns, + PrefixLength: 48, + }, +} + +var DefaultNetworkPrefixLimitV4 = sortNetworkPrefixes([]NetworkPrefixLimit{ + { + // Loopback address for v4 https://datatracker.ietf.org/doc/html/rfc6890#section-2.2.2 + Network: netip.MustParsePrefix("127.0.0.0/8"), + ConnCount: math.MaxInt, // Unlimited + }, +}) +var DefaultNetworkPrefixLimitV6 = sortNetworkPrefixes([]NetworkPrefixLimit{ + { + // Loopback address for v6 https://datatracker.ietf.org/doc/html/rfc6890#section-2.2.3 + Network: netip.MustParsePrefix("::1/128"), + ConnCount: math.MaxInt, // Unlimited + }, +}) + +// Network prefixes limits must be sorted by most specific to least specific. This lets us +// actually use the more specific limits, otherwise only the less specific ones +// would be matched. e.g. 1.2.3.0/24 must come before 1.2.0.0/16. +func sortNetworkPrefixes(limits []NetworkPrefixLimit) []NetworkPrefixLimit { + slices.SortStableFunc(limits, func(a, b NetworkPrefixLimit) int { + return b.Network.Bits() - a.Network.Bits() + }) + return limits +} + +// WithNetworkPrefixLimit sets the limits for the number of connections allowed +// for a specific Network Prefix. Use this when you want to set higher limits +// for a specific subnet than the default limit per subnet. +func WithNetworkPrefixLimit(ipv4 []NetworkPrefixLimit, ipv6 []NetworkPrefixLimit) Option { + return func(rm *resourceManager) error { + if ipv4 != nil { + rm.connLimiter.networkPrefixLimitV4 = sortNetworkPrefixes(ipv4) + } + if ipv6 != nil { + rm.connLimiter.networkPrefixLimitV6 = sortNetworkPrefixes(ipv6) + } + return nil + } +} + +// WithLimitPerSubnet sets the limits for the number of connections allowed per +// subnet. This will limit the number of connections per subnet if that subnet +// is not defined in the NetworkPrefixLimit option. Think of this as a default +// limit for any given subnet. +func WithLimitPerSubnet(ipv4 []ConnLimitPerSubnet, ipv6 []ConnLimitPerSubnet) Option { + return func(rm *resourceManager) error { + if ipv4 != nil { + rm.connLimiter.connLimitPerSubnetV4 = ipv4 + } + if ipv6 != nil { + rm.connLimiter.connLimitPerSubnetV6 = ipv6 + } + return nil + } +} + +type connLimiter struct { + mu sync.Mutex + + // Specific Network Prefix limits. If these are set, they take precedence over the + // subnet limits. + // These must be sorted by most specific to least specific. + networkPrefixLimitV4 []NetworkPrefixLimit + networkPrefixLimitV6 []NetworkPrefixLimit + connsPerNetworkPrefixV4 []int + connsPerNetworkPrefixV6 []int + + // Subnet limits. + connLimitPerSubnetV4 []ConnLimitPerSubnet + connLimitPerSubnetV6 []ConnLimitPerSubnet + ip4connsPerLimit []map[string]int + ip6connsPerLimit []map[string]int +} + +func newConnLimiter() *connLimiter { + return &connLimiter{ + networkPrefixLimitV4: DefaultNetworkPrefixLimitV4, + networkPrefixLimitV6: DefaultNetworkPrefixLimitV6, + + connLimitPerSubnetV4: []ConnLimitPerSubnet{defaultIP4Limit}, + connLimitPerSubnetV6: defaultIP6Limits, + } +} + +func (cl *connLimiter) addNetworkPrefixLimit(isIP6 bool, npLimit NetworkPrefixLimit) { + cl.mu.Lock() + defer cl.mu.Unlock() + if isIP6 { + cl.networkPrefixLimitV6 = append(cl.networkPrefixLimitV6, npLimit) + cl.networkPrefixLimitV6 = sortNetworkPrefixes(cl.networkPrefixLimitV6) + } else { + cl.networkPrefixLimitV4 = append(cl.networkPrefixLimitV4, npLimit) + cl.networkPrefixLimitV4 = sortNetworkPrefixes(cl.networkPrefixLimitV4) + } +} + +// addConn adds a connection for the given IP address. It returns true if the connection is allowed. +func (cl *connLimiter) addConn(ip netip.Addr) bool { + cl.mu.Lock() + defer cl.mu.Unlock() + networkPrefixLimits := cl.networkPrefixLimitV4 + connsPerNetworkPrefix := cl.connsPerNetworkPrefixV4 + limits := cl.connLimitPerSubnetV4 + connsPerLimit := cl.ip4connsPerLimit + isIP6 := ip.Is6() + if isIP6 { + networkPrefixLimits = cl.networkPrefixLimitV6 + connsPerNetworkPrefix = cl.connsPerNetworkPrefixV6 + limits = cl.connLimitPerSubnetV6 + connsPerLimit = cl.ip6connsPerLimit + } + + // Check Network Prefix limits first + if len(connsPerNetworkPrefix) == 0 && len(networkPrefixLimits) > 0 { + // Initialize the counts + connsPerNetworkPrefix = make([]int, len(networkPrefixLimits)) + if isIP6 { + cl.connsPerNetworkPrefixV6 = connsPerNetworkPrefix + } else { + cl.connsPerNetworkPrefixV4 = connsPerNetworkPrefix + } + } + + for i, limit := range networkPrefixLimits { + if limit.Network.Contains(ip) { + if connsPerNetworkPrefix[i]+1 > limit.ConnCount { + return false + } + connsPerNetworkPrefix[i]++ + // Done. If we find a match in the network prefix limits, we use + // that and don't use the general subnet limits. + return true + } + } + + if len(connsPerLimit) == 0 && len(limits) > 0 { + connsPerLimit = make([]map[string]int, len(limits)) + if isIP6 { + cl.ip6connsPerLimit = connsPerLimit + } else { + cl.ip4connsPerLimit = connsPerLimit + } + } + + for i, limit := range limits { + prefix, err := ip.Prefix(limit.PrefixLength) + if err != nil { + return false + } + masked := prefix.String() + counts, ok := connsPerLimit[i][masked] + if !ok { + if connsPerLimit[i] == nil { + connsPerLimit[i] = make(map[string]int) + } + connsPerLimit[i][masked] = 0 + } + if counts+1 > limit.ConnCount { + return false + } + } + + // All limit checks passed, now we update the counts + for i, limit := range limits { + prefix, _ := ip.Prefix(limit.PrefixLength) + masked := prefix.String() + connsPerLimit[i][masked]++ + } + + return true +} + +func (cl *connLimiter) rmConn(ip netip.Addr) { + cl.mu.Lock() + defer cl.mu.Unlock() + networkPrefixLimits := cl.networkPrefixLimitV4 + connsPerNetworkPrefix := cl.connsPerNetworkPrefixV4 + limits := cl.connLimitPerSubnetV4 + connsPerLimit := cl.ip4connsPerLimit + isIP6 := ip.Is6() + if isIP6 { + networkPrefixLimits = cl.networkPrefixLimitV6 + connsPerNetworkPrefix = cl.connsPerNetworkPrefixV6 + limits = cl.connLimitPerSubnetV6 + connsPerLimit = cl.ip6connsPerLimit + } + + // Check NetworkPrefix limits first + if len(connsPerNetworkPrefix) == 0 && len(networkPrefixLimits) > 0 { + // Initialize just in case. We should have already initialized in + // addConn, but if the callers calls rmConn first we don't want to panic + connsPerNetworkPrefix = make([]int, len(networkPrefixLimits)) + if isIP6 { + cl.connsPerNetworkPrefixV6 = connsPerNetworkPrefix + } else { + cl.connsPerNetworkPrefixV4 = connsPerNetworkPrefix + } + } + for i, limit := range networkPrefixLimits { + if limit.Network.Contains(ip) { + count := connsPerNetworkPrefix[i] + if count <= 0 { + log.Errorf("unexpected conn count for ip %s. Was this not added with addConn first?", ip) + return + } + connsPerNetworkPrefix[i]-- + // Done. We updated the count in the defined network prefix limit. + return + } + } + + if len(connsPerLimit) == 0 && len(limits) > 0 { + // Initialize just in case. We should have already initialized in + // addConn, but if the callers calls rmConn first we don't want to panic + connsPerLimit = make([]map[string]int, len(limits)) + if isIP6 { + cl.ip6connsPerLimit = connsPerLimit + } else { + cl.ip4connsPerLimit = connsPerLimit + } + } + + for i, limit := range limits { + prefix, err := ip.Prefix(limit.PrefixLength) + if err != nil { + // Unexpected since we should have seen this IP before in addConn + log.Errorf("unexpected error getting prefix: %v", err) + continue + } + masked := prefix.String() + counts, ok := connsPerLimit[i][masked] + if !ok || counts == 0 { + // Unexpected, but don't panic + log.Errorf("unexpected conn count for %s ok=%v count=%v", masked, ok, counts) + continue + } + connsPerLimit[i][masked]-- + if connsPerLimit[i][masked] <= 0 { + delete(connsPerLimit[i], masked) + } + } +} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/resource-manager/extapi.go b/vendor/github.com/libp2p/go-libp2p/p2p/host/resource-manager/extapi.go index b3214f814..415d7f8bd 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/host/resource-manager/extapi.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/host/resource-manager/extapi.go @@ -147,5 +147,5 @@ func (r *resourceManager) Stat() (result ResourceManagerStat) { } func (r *resourceManager) GetConnLimit() int { - return r.limits.GetConnLimits().GetConnTotalLimit() + return r.limits.GetSystemLimits().GetConnTotalLimit() } diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/resource-manager/rcmgr.go b/vendor/github.com/libp2p/go-libp2p/p2p/host/resource-manager/rcmgr.go index 188a171f5..2eb1b3a6b 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/host/resource-manager/rcmgr.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/host/resource-manager/rcmgr.go @@ -3,6 +3,7 @@ package rcmgr import ( "context" "fmt" + "net/netip" "strings" "sync" "time" @@ -13,6 +14,7 @@ import ( logging "github.com/ipfs/go-log/v2" "github.com/multiformats/go-multiaddr" + manet "github.com/multiformats/go-multiaddr/net" ) var log = logging.Logger("rcmgr") @@ -20,6 +22,8 @@ var log = logging.Logger("rcmgr") type resourceManager struct { limits Limiter + connLimiter *connLimiter + trace *trace metrics *metrics disableMetrics bool @@ -103,6 +107,7 @@ type connectionScope struct { rcmgr *resourceManager peer *peerScope endpoint multiaddr.Multiaddr + ip netip.Addr } var _ network.ConnScope = (*connectionScope)(nil) @@ -129,11 +134,12 @@ type Option func(*resourceManager) error func NewResourceManager(limits Limiter, opts ...Option) (network.ResourceManager, error) { allowlist := newAllowlist() r := &resourceManager{ - limits: limits, - allowlist: &allowlist, - svc: make(map[string]*serviceScope), - proto: make(map[protocol.ID]*protocolScope), - peer: make(map[peer.ID]*peerScope), + limits: limits, + connLimiter: newConnLimiter(), + allowlist: &allowlist, + svc: make(map[string]*serviceScope), + proto: make(map[protocol.ID]*protocolScope), + peer: make(map[peer.ID]*peerScope), } for _, opt := range opts { @@ -142,6 +148,28 @@ func NewResourceManager(limits Limiter, opts ...Option) (network.ResourceManager } } + registeredConnLimiterPrefixes := make(map[string]struct{}) + for _, npLimit := range r.connLimiter.networkPrefixLimitV4 { + registeredConnLimiterPrefixes[npLimit.Network.String()] = struct{}{} + } + for _, npLimit := range r.connLimiter.networkPrefixLimitV6 { + registeredConnLimiterPrefixes[npLimit.Network.String()] = struct{}{} + } + for _, network := range allowlist.allowedNetworks { + prefix, err := netip.ParsePrefix(network.String()) + if err != nil { + log.Debugf("failed to parse prefix from allowlist %s, %s", network, err) + continue + } + if _, ok := registeredConnLimiterPrefixes[prefix.String()]; !ok { + // connlimiter doesn't know about this network. Let's fix that + r.connLimiter.addNetworkPrefixLimit(prefix.Addr().Is6(), NetworkPrefixLimit{ + Network: prefix, + ConnCount: r.limits.GetAllowlistedSystemLimits().GetConnTotalLimit(), + }) + } + } + if !r.disableMetrics { var sr TraceReporter sr, err := NewStatsTraceReporter() @@ -310,12 +338,37 @@ func (r *resourceManager) nextStreamId() int64 { return r.streamId } +// OpenConnectionNoIP is deprecated and will be removed in the next release +func (r *resourceManager) OpenConnectionNoIP(dir network.Direction, usefd bool, endpoint multiaddr.Multiaddr) (network.ConnManagementScope, error) { + return r.openConnection(dir, usefd, endpoint, netip.Addr{}) +} + func (r *resourceManager) OpenConnection(dir network.Direction, usefd bool, endpoint multiaddr.Multiaddr) (network.ConnManagementScope, error) { + ip, err := manet.ToIP(endpoint) + if err != nil { + // No IP address + return r.openConnection(dir, usefd, endpoint, netip.Addr{}) + } + + ipAddr, ok := netip.AddrFromSlice(ip) + if !ok { + return nil, fmt.Errorf("failed to convert ip to netip.Addr") + } + return r.openConnection(dir, usefd, endpoint, ipAddr) +} + +func (r *resourceManager) openConnection(dir network.Direction, usefd bool, endpoint multiaddr.Multiaddr, ip netip.Addr) (network.ConnManagementScope, error) { + if ip.IsValid() { + if ok := r.connLimiter.addConn(ip); !ok { + return nil, fmt.Errorf("connections per ip limit exceeded for %s", endpoint) + } + } + var conn *connectionScope - conn = newConnectionScope(dir, usefd, r.limits.GetConnLimits(), r, endpoint) + conn = newConnectionScope(dir, usefd, r.limits.GetConnLimits(), r, endpoint, ip) err := conn.AddConn(dir, usefd) - if err != nil { + if err != nil && ip.IsValid() { // Try again if this is an allowlisted connection // Failed to open connection, let's see if this was allowlisted and try again allowed := r.allowlist.Allowed(endpoint) @@ -476,7 +529,7 @@ func newPeerScope(p peer.ID, limit Limit, rcmgr *resourceManager) *peerScope { } } -func newConnectionScope(dir network.Direction, usefd bool, limit Limit, rcmgr *resourceManager, endpoint multiaddr.Multiaddr) *connectionScope { +func newConnectionScope(dir network.Direction, usefd bool, limit Limit, rcmgr *resourceManager, endpoint multiaddr.Multiaddr, ip netip.Addr) *connectionScope { return &connectionScope{ resourceScope: newResourceScope(limit, []*resourceScope{rcmgr.transient.resourceScope, rcmgr.system.resourceScope}, @@ -485,6 +538,7 @@ func newConnectionScope(dir network.Direction, usefd bool, limit Limit, rcmgr *r usefd: usefd, rcmgr: rcmgr, endpoint: endpoint, + ip: ip, } } @@ -643,6 +697,18 @@ func (s *connectionScope) PeerScope() network.PeerScope { return s.peer } +func (s *connectionScope) Done() { + s.Lock() + defer s.Unlock() + if s.done { + return + } + if s.ip.IsValid() { + s.rcmgr.connLimiter.rmConn(s.ip) + } + s.resourceScope.doneUnlocked() +} + // transferAllowedToStandard transfers this connection scope from being part of // the allowlist set of scopes to being part of the standard set of scopes. // Happens when we first allowlisted this connection due to its IP, but later diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/resource-manager/scope.go b/vendor/github.com/libp2p/go-libp2p/p2p/host/resource-manager/scope.go index 60089c3a5..8a6bc2303 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/host/resource-manager/scope.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/host/resource-manager/scope.go @@ -118,12 +118,10 @@ func (rc *resources) checkMemory(rsvp int64, prio uint8) error { threshold, mulOk := mulInt64WithOverflow(1+int64(prio), limit) if !mulOk { thresholdBig := big.NewInt(limit) - thresholdBig = thresholdBig.Mul(thresholdBig, big.NewInt(1+int64(prio))) + thresholdBig.Mul(thresholdBig, big.NewInt(1+int64(prio))) thresholdBig.Rsh(thresholdBig, 8) // Divide 256 - if !thresholdBig.IsInt64() { - // Shouldn't happen since the threshold can only be <= limit - threshold = limit - } + // necessarily a Int64 since we multiplied a int64 != MaxInt64 with + // a uint8+1 (max 255+1 = 256) and divided by 256 threshold = thresholdBig.Int64() } else { threshold = threshold / 256 @@ -745,10 +743,13 @@ func (s *resourceScope) Done() { s.Lock() defer s.Unlock() + s.doneUnlocked() +} + +func (s *resourceScope) doneUnlocked() { if s.done { return } - stat := s.rc.stat() if s.owner != nil { s.owner.ReleaseResources(stat) diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/routed/routed.go b/vendor/github.com/libp2p/go-libp2p/p2p/host/routed/routed.go index eb8e58ee7..8248e50f0 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/host/routed/routed.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/host/routed/routed.go @@ -48,8 +48,10 @@ func Wrap(h host.Host, r Routing) *RoutedHost { func (rh *RoutedHost) Connect(ctx context.Context, pi peer.AddrInfo) error { // first, check if we're already connected unless force direct dial. forceDirect, _ := network.GetForceDirectDial(ctx) + canUseLimitedConn, _ := network.GetAllowLimitedConn(ctx) if !forceDirect { - if rh.Network().Connectedness(pi.ID) == network.Connected { + connectedness := rh.Network().Connectedness(pi.ID) + if connectedness == network.Connected || (canUseLimitedConn && connectedness == network.Limited) { return nil } } diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/net/connmgr/connmgr.go b/vendor/github.com/libp2p/go-libp2p/p2p/net/connmgr/connmgr.go index 6caa3dc1a..cf6bb58e4 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/net/connmgr/connmgr.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/net/connmgr/connmgr.go @@ -73,7 +73,7 @@ type segments struct { } func (ss *segments) get(p peer.ID) *segment { - return ss.buckets[byte(p[len(p)-1])] + return ss.buckets[p[len(p)-1]] } func (ss *segments) countPeers() (count int) { diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/net/reuseport/dialer.go b/vendor/github.com/libp2p/go-libp2p/p2p/net/reuseport/dialer.go index 2efc02d39..ec3769a7a 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/net/reuseport/dialer.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/net/reuseport/dialer.go @@ -33,7 +33,7 @@ func randAddr(addrs []*net.TCPAddr) *net.TCPAddr { // // In-order: // -// 1. If we're _explicitly_ listening on the prefered source address for the destination address +// 1. If we're _explicitly_ listening on the preferred source address for the destination address // (per the system's routes), we'll use that listener's port as the source port. // 2. If we're listening on one or more _unspecified_ addresses (zero address), we'll pick a source // port from one of these listener's. diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/net/swarm/connectedness_event_emitter.go b/vendor/github.com/libp2p/go-libp2p/p2p/net/swarm/connectedness_event_emitter.go new file mode 100644 index 000000000..07db583fc --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p/p2p/net/swarm/connectedness_event_emitter.go @@ -0,0 +1,143 @@ +package swarm + +import ( + "context" + "sync" + + "github.com/libp2p/go-libp2p/core/event" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" +) + +// connectednessEventEmitter emits PeerConnectednessChanged events. +// We ensure that for any peer we connected to we always sent atleast 1 NotConnected Event after +// the peer disconnects. This is because peers can observe a connection before they are notified +// of the connection by a peer connectedness changed event. +type connectednessEventEmitter struct { + mx sync.RWMutex + // newConns is the channel that holds the peerIDs we recently connected to + newConns chan peer.ID + removeConnsMx sync.Mutex + // removeConns is a slice of peerIDs we have recently closed connections to + removeConns []peer.ID + // lastEvent is the last connectedness event sent for a particular peer. + lastEvent map[peer.ID]network.Connectedness + // connectedness is the function that gives the peers current connectedness state + connectedness func(peer.ID) network.Connectedness + // emitter is the PeerConnectednessChanged event emitter + emitter event.Emitter + wg sync.WaitGroup + removeConnNotif chan struct{} + ctx context.Context + cancel context.CancelFunc +} + +func newConnectednessEventEmitter(connectedness func(peer.ID) network.Connectedness, emitter event.Emitter) *connectednessEventEmitter { + ctx, cancel := context.WithCancel(context.Background()) + c := &connectednessEventEmitter{ + newConns: make(chan peer.ID, 32), + lastEvent: make(map[peer.ID]network.Connectedness), + removeConnNotif: make(chan struct{}, 1), + connectedness: connectedness, + emitter: emitter, + ctx: ctx, + cancel: cancel, + } + c.wg.Add(1) + go c.runEmitter() + return c +} + +func (c *connectednessEventEmitter) AddConn(p peer.ID) { + c.mx.RLock() + defer c.mx.RUnlock() + if c.ctx.Err() != nil { + return + } + + c.newConns <- p +} + +func (c *connectednessEventEmitter) RemoveConn(p peer.ID) { + c.mx.RLock() + defer c.mx.RUnlock() + if c.ctx.Err() != nil { + return + } + + c.removeConnsMx.Lock() + // This queue is roughly bounded by the total number of added connections we + // have. If consumers of connectedness events are slow, we apply + // backpressure to AddConn operations. + // + // We purposefully don't block/backpressure here to avoid deadlocks, since it's + // reasonable for a consumer of the event to want to remove a connection. + c.removeConns = append(c.removeConns, p) + + c.removeConnsMx.Unlock() + + select { + case c.removeConnNotif <- struct{}{}: + default: + } +} + +func (c *connectednessEventEmitter) Close() { + c.cancel() + c.wg.Wait() +} + +func (c *connectednessEventEmitter) runEmitter() { + defer c.wg.Done() + for { + select { + case p := <-c.newConns: + c.notifyPeer(p, true) + case <-c.removeConnNotif: + c.sendConnRemovedNotifications() + case <-c.ctx.Done(): + c.mx.Lock() // Wait for all pending AddConn & RemoveConn operations to complete + defer c.mx.Unlock() + for { + select { + case p := <-c.newConns: + c.notifyPeer(p, true) + case <-c.removeConnNotif: + c.sendConnRemovedNotifications() + default: + return + } + } + } + } +} + +// notifyPeer sends the peer connectedness event using the emitter. +// Use forceNotConnectedEvent = true to send a NotConnected event even if +// no Connected event was sent for this peer. +// In case a peer is disconnected before we sent the Connected event, we still +// send the Disconnected event because a connection to the peer can be observed +// in such cases. +func (c *connectednessEventEmitter) notifyPeer(p peer.ID, forceNotConnectedEvent bool) { + oldState := c.lastEvent[p] + c.lastEvent[p] = c.connectedness(p) + if c.lastEvent[p] == network.NotConnected { + delete(c.lastEvent, p) + } + if (forceNotConnectedEvent && c.lastEvent[p] == network.NotConnected) || c.lastEvent[p] != oldState { + c.emitter.Emit(event.EvtPeerConnectednessChanged{ + Peer: p, + Connectedness: c.lastEvent[p], + }) + } +} + +func (c *connectednessEventEmitter) sendConnRemovedNotifications() { + c.removeConnsMx.Lock() + removeConns := c.removeConns + c.removeConns = nil + c.removeConnsMx.Unlock() + for _, p := range removeConns { + c.notifyPeer(p, false) + } +} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/net/swarm/swarm.go b/vendor/github.com/libp2p/go-libp2p/p2p/net/swarm/swarm.go index a76edce6c..7897277cc 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/net/swarm/swarm.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/net/swarm/swarm.go @@ -203,9 +203,10 @@ type Swarm struct { dialRanker network.DialRanker - udpBlackHoleConfig blackHoleConfig - ipv6BlackHoleConfig blackHoleConfig - bhd *blackHoleDetector + udpBlackHoleConfig blackHoleConfig + ipv6BlackHoleConfig blackHoleConfig + bhd *blackHoleDetector + connectednessEventEmitter *connectednessEventEmitter } // NewSwarm constructs a Swarm. @@ -238,6 +239,7 @@ func NewSwarm(local peer.ID, peers peerstore.Peerstore, eventBus event.Bus, opts s.transports.m = make(map[int]transport.Transport) s.notifs.m = make(map[network.Notifiee]struct{}) s.directConnNotifs.m = make(map[peer.ID][]chan struct{}) + s.connectednessEventEmitter = newConnectednessEventEmitter(s.Connectedness, emitter) for _, opt := range opts { if err := opt(s); err != nil { @@ -254,7 +256,6 @@ func NewSwarm(local peer.ID, peers peerstore.Peerstore, eventBus event.Bus, opts s.backf.init(s.ctx) s.bhd = newBlackHoleDetector(s.udpBlackHoleConfig, s.ipv6BlackHoleConfig, s.metricsTracer) - return s, nil } @@ -263,11 +264,14 @@ func (s *Swarm) Close() error { return nil } +// Done returns a channel that is closed when the swarm is closed. +func (s *Swarm) Done() <-chan struct{} { + return s.ctx.Done() +} + func (s *Swarm) close() { s.ctxCancel() - s.emitter.Close() - // Prevents new connections and/or listeners from being added to the swarm. s.listeners.Lock() listeners := s.listeners.m @@ -281,9 +285,10 @@ func (s *Swarm) close() { // Lots of goroutines but we might as well do this in parallel. We want to shut down as fast as // possible. - + s.refs.Add(len(listeners)) for l := range listeners { go func(l transport.Listener) { + defer s.refs.Done() if err := l.Close(); err != nil && err != transport.ErrListenerClosed { log.Errorf("error when shutting down listener: %s", err) } @@ -302,6 +307,8 @@ func (s *Swarm) close() { // Wait for everything to finish. s.refs.Wait() + s.connectednessEventEmitter.Close() + s.emitter.Close() // Now close out any transports (if necessary). Do this after closing // all connections/listeners. @@ -344,6 +351,7 @@ func (s *Swarm) addConn(tc transport.CapableConn, dir network.Direction) (*Conn, } stat.Direction = dir stat.Opened = time.Now() + isLimited := stat.Limited // Wrap and register the connection. c := &Conn{ @@ -384,21 +392,24 @@ func (s *Swarm) addConn(tc transport.CapableConn, dir network.Direction) (*Conn, } c.streams.m = make(map[*Stream]struct{}) - isFirstConnection := len(s.conns.m[p]) == 0 s.conns.m[p] = append(s.conns.m[p], c) - // Add two swarm refs: // * One will be decremented after the close notifications fire in Conn.doClose // * The other will be decremented when Conn.start exits. s.refs.Add(2) - // Take the notification lock before releasing the conns lock to block // Disconnect notifications until after the Connect notifications done. + // This lock also ensures that swarm.refs.Wait() exits after we have + // enqueued the peer connectedness changed notification. + // TODO: Fix this fragility by taking a swarm ref for dial worker loop c.notifyLk.Lock() s.conns.Unlock() - // Notify goroutines waiting for a direct connection - if !c.Stat().Transient { + s.connectednessEventEmitter.AddConn(p) + + if !isLimited { + // Notify goroutines waiting for a direct connection + // // Go routines interested in waiting for direct connection first acquire this lock // and then acquire s.conns.RLock. Do not acquire this lock before conns.Unlock to // prevent deadlock. @@ -409,16 +420,6 @@ func (s *Swarm) addConn(tc transport.CapableConn, dir network.Direction) (*Conn, delete(s.directConnNotifs.m, p) s.directConnNotifs.Unlock() } - - // Emit event after releasing `s.conns` lock so that a consumer can still - // use swarm methods that need the `s.conns` lock. - if isFirstConnection { - s.emitter.Emit(event.EvtPeerConnectednessChanged{ - Peer: p, - Connectedness: network.Connected, - }) - } - s.notifyAll(func(f network.Notifiee) { f.Connected(s, c) }) @@ -449,14 +450,14 @@ func (s *Swarm) StreamHandler() network.StreamHandler { // NewStream creates a new stream on any available connection to peer, dialing // if necessary. -// Use network.WithUseTransient to open a stream over a transient(relayed) +// Use network.WithAllowLimitedConn to open a stream over a limited(relayed) // connection. func (s *Swarm) NewStream(ctx context.Context, p peer.ID) (network.Stream, error) { log.Debugf("[%s] opening stream to peer [%s]", s.local, p) // Algorithm: // 1. Find the best connection, otherwise, dial. - // 2. If the best connection is transient, wait for a direct conn via conn + // 2. If the best connection is limited, wait for a direct conn via conn // reversal or hole punching. // 3. Try opening a stream. // 4. If the underlying connection is, in fact, closed, close the outer @@ -485,8 +486,8 @@ func (s *Swarm) NewStream(ctx context.Context, p peer.ID) (network.Stream, error } } - useTransient, _ := network.GetUseTransient(ctx) - if !useTransient && c.Stat().Transient { + limitedAllowed, _ := network.GetAllowLimitedConn(ctx) + if !limitedAllowed && c.Stat().Limited { var err error c, err = s.waitForDirectConn(ctx, p) if err != nil { @@ -512,12 +513,12 @@ func (s *Swarm) waitForDirectConn(ctx context.Context, p peer.ID) (*Conn, error) if c == nil { s.directConnNotifs.Unlock() return nil, network.ErrNoConn - } else if !c.Stat().Transient { + } else if !c.Stat().Limited { s.directConnNotifs.Unlock() return c, nil } - // Wait for transient connection to upgrade to a direct connection either by + // Wait for limited connection to upgrade to a direct connection either by // connection reversal or hole punching. ch := make(chan struct{}) s.directConnNotifs.m[p] = append(s.directConnNotifs.m[p], ch) @@ -549,8 +550,8 @@ func (s *Swarm) waitForDirectConn(ctx context.Context, p peer.ID) (*Conn, error) if c == nil { return nil, network.ErrNoConn } - if c.Stat().Transient { - return nil, network.ErrTransientConn + if c.Stat().Limited { + return nil, network.ErrLimitedConn } return c, nil } @@ -571,11 +572,11 @@ func (s *Swarm) ConnsToPeer(p peer.ID) []network.Conn { } func isBetterConn(a, b *Conn) bool { - // If one is transient and not the other, prefer the non-transient connection. - aTransient := a.Stat().Transient - bTransient := b.Stat().Transient - if aTransient != bTransient { - return !aTransient + // If one is limited and not the other, prefer the unlimited connection. + aLimited := a.Stat().Limited + bLimited := b.Stat().Limited + if aLimited != bLimited { + return !aLimited } // If one is direct and not the other, prefer the direct connection. @@ -626,7 +627,7 @@ func (s *Swarm) bestConnToPeer(p peer.ID) *Conn { // bestAcceptableConnToPeer returns the best acceptable connection, considering the passed in ctx. // If network.WithForceDirectDial is used, it only returns a direct connections, ignoring -// any transient (relayed) connections to the peer. +// any limited (relayed) connections to the peer. func (s *Swarm) bestAcceptableConnToPeer(ctx context.Context, p peer.ID) *Conn { conn := s.bestConnToPeer(p) @@ -646,8 +647,28 @@ func isDirectConn(c *Conn) bool { // To check if we have an open connection, use `s.Connectedness(p) == // network.Connected`. func (s *Swarm) Connectedness(p peer.ID) network.Connectedness { - if s.bestConnToPeer(p) != nil { - return network.Connected + s.conns.RLock() + defer s.conns.RUnlock() + + return s.connectednessUnlocked(p) +} + +// connectednessUnlocked returns the connectedness of a peer. +func (s *Swarm) connectednessUnlocked(p peer.ID) network.Connectedness { + var haveLimited bool + for _, c := range s.conns.m[p] { + if c.IsClosed() { + // These will be garbage collected soon + continue + } + if c.Stat().Limited { + haveLimited = true + } else { + return network.Connected + } + } + if haveLimited { + return network.Limited } return network.NotConnected } @@ -745,24 +766,7 @@ func (s *Swarm) removeConn(c *Conn) { p := c.RemotePeer() s.conns.Lock() - cs := s.conns.m[p] - - if len(cs) == 1 { - delete(s.conns.m, p) - s.conns.Unlock() - - // Emit event after releasing `s.conns` lock so that a consumer can still - // use swarm methods that need the `s.conns` lock. - s.emitter.Emit(event.EvtPeerConnectednessChanged{ - Peer: p, - Connectedness: network.NotConnected, - }) - return - } - - defer s.conns.Unlock() - for i, ci := range cs { if ci == c { // NOTE: We're intentionally preserving order. @@ -774,6 +778,10 @@ func (s *Swarm) removeConn(c *Conn) { break } } + if len(s.conns.m[p]) == 0 { + delete(s.conns.m, p) + } + s.conns.Unlock() } // String returns a string representation of Network. diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/net/swarm/swarm_conn.go b/vendor/github.com/libp2p/go-libp2p/p2p/net/swarm/swarm_conn.go index 8c3ce7c5a..38e942cce 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/net/swarm/swarm_conn.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/net/swarm/swarm_conn.go @@ -73,6 +73,11 @@ func (c *Conn) doClose() { c.err = c.conn.Close() + // Send the connectedness event after closing the connection. + // This ensures that both remote connection close and local connection + // close events are sent after the underlying transport connection is closed. + c.swarm.connectednessEventEmitter.RemoveConn(c.RemotePeer()) + // This is just for cleaning up state. The connection has already been closed. // We *could* optimize this but it really isn't worth it. for s := range streams { @@ -85,10 +90,11 @@ func (c *Conn) doClose() { c.notifyLk.Lock() defer c.notifyLk.Unlock() + // Only notify for disconnection if we notified for connection c.swarm.notifyAll(func(f network.Notifiee) { f.Disconnected(c.swarm, c) }) - c.swarm.refs.Done() // taken in Swarm.addConn + c.swarm.refs.Done() }() } @@ -108,7 +114,6 @@ func (c *Conn) start() { go func() { defer c.swarm.refs.Done() defer c.Close() - for { ts, err := c.conn.AcceptStream() if err != nil { @@ -193,9 +198,9 @@ func (c *Conn) Stat() network.ConnStats { // NewStream returns a new Stream from this connection func (c *Conn) NewStream(ctx context.Context) (network.Stream, error) { - if c.Stat().Transient { - if useTransient, _ := network.GetUseTransient(ctx); !useTransient { - return nil, network.ErrTransientConn + if c.Stat().Limited { + if useLimited, _ := network.GetAllowLimitedConn(ctx); !useLimited { + return nil, network.ErrLimitedConn } } diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/net/swarm/swarm_dial.go b/vendor/github.com/libp2p/go-libp2p/p2p/net/swarm/swarm_dial.go index 3fb15383a..f639ce16a 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/net/swarm/swarm_dial.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/net/swarm/swarm_dial.go @@ -426,7 +426,7 @@ var quicDraft29DialMatcher = mafmt.And(mafmt.IP, mafmt.Base(ma.P_UDP), mafmt.Bas // filterKnownUndialables takes a list of multiaddrs, and removes those // that we definitely don't want to dial: addresses configured to be blocked, // IPv6 link-local addresses, addresses without a dial-capable transport, -// addresses that we know to be our own, and addresses with a better tranport +// addresses that we know to be our own, and addresses with a better transport // available. This is an optimization to avoid wasting time on dials that we // know are going to fail or for which we have a better alternative. func (s *Swarm) filterKnownUndialables(p peer.ID, addrs []ma.Multiaddr) (goodAddrs []ma.Multiaddr, addrErrs []TransportError) { @@ -546,7 +546,7 @@ func (s *Swarm) dialAddr(ctx context.Context, p peer.ID, addr ma.Multiaddr, updC } // We're recording any error as a failure here. - // Notably, this also applies to cancelations (i.e. if another dial attempt was faster). + // Notably, this also applies to cancellations (i.e. if another dial attempt was faster). // This is ok since the black hole detector uses a very low threshold (5%). s.bhd.RecordResult(addr, err == nil) diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/net/swarm/swarm_metrics.go b/vendor/github.com/libp2p/go-libp2p/p2p/net/swarm/swarm_metrics.go index 9cc34599d..b5c0f2e49 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/net/swarm/swarm_metrics.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/net/swarm/swarm_metrics.go @@ -166,7 +166,7 @@ func appendConnectionState(tags []string, cs network.ConnectionState) []string { // This shouldn't happen, unless the transport doesn't properly set the Transport field in the ConnectionState. tags = append(tags, "unknown") } else { - tags = append(tags, string(cs.Transport)) + tags = append(tags, cs.Transport) } // These might be empty, depending on the transport. // For example, QUIC doesn't set security nor muxer. diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/net/upgrader/listener.go b/vendor/github.com/libp2p/go-libp2p/p2p/net/upgrader/listener.go index 0871d2f5a..8af2791b3 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/net/upgrader/listener.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/net/upgrader/listener.go @@ -37,7 +37,7 @@ type listener struct { // Close closes the listener. func (l *listener) Close() error { - // Do this first to try to get any relevent errors. + // Do this first to try to get any relevant errors. err := l.Listener.Close() l.cancel() diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/client/dial.go b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/client/dial.go index ecf5d3a51..271652506 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/client/dial.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/client/dial.go @@ -179,7 +179,7 @@ func (c *Client) connect(s network.Stream, dest peer.AddrInfo) (*Conn, error) { // relay connection and we mark the connection as transient. var stat network.ConnStats if limit := msg.GetLimit(); limit != nil { - stat.Transient = true + stat.Limited = true stat.Extra = make(map[interface{}]interface{}) stat.Extra[StatLimitDuration] = time.Duration(limit.GetDuration()) * time.Second stat.Extra[StatLimitData] = limit.GetData() diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/client/handlers.go b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/client/handlers.go index 6b5361b12..389f0e44b 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/client/handlers.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/client/handlers.go @@ -22,6 +22,8 @@ func (c *Client) handleStreamV2(s network.Stream) { defer rd.Close() writeResponse := func(status pbv2.Status) error { + s.SetWriteDeadline(time.Now().Add(StreamTimeout)) + defer s.SetWriteDeadline(time.Time{}) wr := util.NewDelimitedWriter(s) var msg pbv2.StopMessage @@ -67,7 +69,7 @@ func (c *Client) handleStreamV2(s network.Stream) { // relay connection and we mark the connection as transient. var stat network.ConnStats if limit := msg.GetLimit(); limit != nil { - stat.Transient = true + stat.Limited = true stat.Extra = make(map[interface{}]interface{}) stat.Extra[StatLimitDuration] = time.Duration(limit.GetDuration()) * time.Second stat.Extra[StatLimitData] = limit.GetData() diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/client/transport.go b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/client/transport.go index e08d55707..2c9e49f50 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/client/transport.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/client/transport.go @@ -50,6 +50,7 @@ var _ io.Closer = (*Client)(nil) func (c *Client) Dial(ctx context.Context, a ma.Multiaddr, p peer.ID) (transport.CapableConn, error) { connScope, err := c.host.Network().ResourceManager().OpenConnection(network.DirOutbound, false, a) + if err != nil { return nil, err } diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/relay/constraints.go b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/relay/constraints.go index 4b9b54cd8..28698d9c0 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/relay/constraints.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/relay/constraints.go @@ -29,7 +29,7 @@ type constraints struct { total []time.Time peers map[peer.ID][]time.Time ips map[string][]time.Time - asns map[string][]time.Time + asns map[uint32][]time.Time } // newConstraints creates a new constraints object. @@ -40,7 +40,7 @@ func newConstraints(rc *Resources) *constraints { rc: rc, peers: make(map[peer.ID][]time.Time), ips: make(map[string][]time.Time), - asns: make(map[string][]time.Time), + asns: make(map[uint32][]time.Time), } } @@ -73,13 +73,10 @@ func (c *constraints) AddReservation(p peer.ID, a ma.Multiaddr) error { } var asnReservations []time.Time - var asn string - // Only public addresses have an ASN. Skip checking ASN for private addresses as - // initialising the ASN store is a costly operation. Skipping this check reduces a lot of - // flakiness in tests - if ip.To4() == nil && manet.IsPublicAddr(a) { - asn, _ = asnutil.Store.AsnForIPv6(ip) - if asn != "" { + var asn uint32 + if ip.To4() == nil { + asn = asnutil.AsnForIPv6(ip) + if asn != 0 { asnReservations = c.asns[asn] if len(asnReservations) >= c.rc.MaxReservationsPerASN { return errTooManyReservationsForASN @@ -96,7 +93,7 @@ func (c *constraints) AddReservation(p peer.ID, a ma.Multiaddr) error { ipReservations = append(ipReservations, expiry) c.ips[ip.String()] = ipReservations - if asn != "" { + if asn != 0 { asnReservations = append(asnReservations, expiry) c.asns[asn] = asnReservations } diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/relay/relay.go b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/relay/relay.go index e3c8f4758..1629a6d1a 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/relay/relay.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/relay/relay.go @@ -19,7 +19,6 @@ import ( logging "github.com/ipfs/go-log/v2" pool "github.com/libp2p/go-buffer-pool" - asnutil "github.com/libp2p/go-libp2p-asn-util" ma "github.com/multiformats/go-multiaddr" manet "github.com/multiformats/go-multiaddr/net" ) @@ -296,7 +295,7 @@ func (r *Relay) handleConnect(s network.Stream, msg *pbv2.HopMessage) pbv2.Statu destConns := r.conns[dest.ID] if destConns >= r.rc.MaxCircuits { r.mx.Unlock() - log.Debugf("refusing connection from %s to %s; too many connecitons to %s", src, dest.ID, dest.ID) + log.Debugf("refusing connection from %s to %s; too many connections to %s", src, dest.ID, dest.ID) fail(pbv2.Status_RESOURCE_LIMIT_EXCEEDED) return pbv2.Status_RESOURCE_LIMIT_EXCEEDED } @@ -557,6 +556,8 @@ func (r *Relay) handleError(s network.Stream, status pbv2.Status) { } func (r *Relay) writeResponse(s network.Stream, status pbv2.Status, rsvp *pbv2.Reservation, limit *pbv2.Limit) error { + s.SetWriteDeadline(time.Now().Add(StreamTimeout)) + defer s.SetWriteDeadline(time.Time{}) wr := util.NewDelimitedWriter(s) var msg pbv2.HopMessage @@ -624,8 +625,6 @@ func (r *Relay) makeLimitMsg(p peer.ID) *pbv2.Limit { } func (r *Relay) background() { - asnutil.Store.Init() - ticker := time.NewTicker(time.Minute) defer ticker.Stop() diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/holepunch/holepuncher.go b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/holepunch/holepuncher.go index b651bd782..479376ef0 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/holepunch/holepuncher.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/holepunch/holepuncher.go @@ -174,7 +174,7 @@ func (hp *holePuncher) directConnect(rp peer.ID) error { // initiateHolePunch opens a new hole punching coordination stream, // exchanges the addresses and measures the RTT. func (hp *holePuncher) initiateHolePunch(rp peer.ID) ([]ma.Multiaddr, []ma.Multiaddr, time.Duration, error) { - hpCtx := network.WithUseTransient(hp.ctx, "hole-punch") + hpCtx := network.WithAllowLimitedConn(hp.ctx, "hole-punch") sCtx := network.WithNoDial(hpCtx, "hole-punch") str, err := hp.host.NewStream(sCtx, rp, Protocol) diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/holepunch/svc.go b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/holepunch/svc.go index 47bf434fb..9de0a11e0 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/holepunch/svc.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/holepunch/svc.go @@ -182,7 +182,7 @@ func (s *Service) incomingHolePunch(str network.Stream) (rtt time.Duration, remo } if err := str.Scope().ReserveMemory(maxMsgSize, network.ReservationPriorityAlways); err != nil { - log.Debugf("error reserving memory for stream: %s, err") + log.Debugf("error reserving memory for stream: %s", err) return 0, nil, nil, err } defer str.Scope().ReleaseMemory(maxMsgSize) @@ -196,7 +196,7 @@ func (s *Service) incomingHolePunch(str network.Stream) (rtt time.Duration, remo str.SetDeadline(time.Now().Add(StreamTimeout)) if err := rd.ReadMsg(msg); err != nil { - return 0, nil, nil, fmt.Errorf("failed to read message from initator: %w", err) + return 0, nil, nil, fmt.Errorf("failed to read message from initiator: %w", err) } if t := msg.GetType(); t != pb.HolePunch_CONNECT { return 0, nil, nil, fmt.Errorf("expected CONNECT message from initiator but got %d", t) @@ -218,13 +218,13 @@ func (s *Service) incomingHolePunch(str network.Stream) (rtt time.Duration, remo msg.ObsAddrs = addrsToBytes(ownAddrs) tstart := time.Now() if err := wr.WriteMsg(msg); err != nil { - return 0, nil, nil, fmt.Errorf("failed to write CONNECT message to initator: %w", err) + return 0, nil, nil, fmt.Errorf("failed to write CONNECT message to initiator: %w", err) } // Read SYNC message msg.Reset() if err := rd.ReadMsg(msg); err != nil { - return 0, nil, nil, fmt.Errorf("failed to read message from initator: %w", err) + return 0, nil, nil, fmt.Errorf("failed to read message from initiator: %w", err) } if t := msg.GetType(); t != pb.HolePunch_SYNC { return 0, nil, nil, fmt.Errorf("expected SYNC message from initiator but got %d", t) diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/id.go b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/id.go index 6c07dbdc8..a91cc4f92 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/id.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/id.go @@ -34,24 +34,27 @@ import ( var log = logging.Logger("net/identify") +var Timeout = 30 * time.Second // timeout on all incoming Identify interactions + const ( // ID is the protocol.ID of version 1.0.0 of the identify service. ID = "/ipfs/id/1.0.0" // IDPush is the protocol.ID of the Identify push protocol. // It sends full identify messages containing the current state of the peer. IDPush = "/ipfs/id/push/1.0.0" -) -const ServiceName = "libp2p.identify" + ServiceName = "libp2p.identify" -const maxPushConcurrency = 32 - -var Timeout = 60 * time.Second // timeout on all incoming Identify interactions - -const ( - legacyIDSize = 2 * 1024 // 2k Bytes - signedIDSize = 8 * 1024 // 8K - maxMessages = 10 + legacyIDSize = 2 * 1024 + signedIDSize = 8 * 1024 + maxOwnIdentifyMsgSize = 4 * 1024 // smaller than what we accept. This is 4k to be compatible with rust-libp2p + maxMessages = 10 + maxPushConcurrency = 32 + // number of addresses to keep for peers we have disconnected from for peerstore.RecentlyConnectedTTL time + // This number can be small as we already filter peer addresses based on whether the peer is connected to us over + // localhost, private IP or public IP address + recentlyConnectedPeerMaxAddrs = 20 + connectedPeerMaxAddrs = 500 ) var defaultUserAgent = "github.com/libp2p/go-libp2p" @@ -159,7 +162,8 @@ type idService struct { addrMu sync.Mutex // our own observed addresses. - observedAddrs *ObservedAddrManager + observedAddrMgr *ObservedAddrManager + disableObservedAddrManager bool emitters struct { evtPeerProtocolsUpdated event.Emitter @@ -171,6 +175,12 @@ type idService struct { sync.Mutex snapshot identifySnapshot } + + natEmitter *natEmitter +} + +type normalizer interface { + NormalizeMultiaddr(ma.Multiaddr) ma.Multiaddr } // NewIDService constructs a new *idService and activates it by @@ -199,11 +209,27 @@ func NewIDService(h host.Host, opts ...Option) (*idService, error) { metricsTracer: cfg.metricsTracer, } - observedAddrs, err := NewObservedAddrManager(h) - if err != nil { - return nil, fmt.Errorf("failed to create observed address manager: %s", err) + var normalize func(ma.Multiaddr) ma.Multiaddr + if hn, ok := h.(normalizer); ok { + normalize = hn.NormalizeMultiaddr + } + + var err error + if cfg.disableObservedAddrManager { + s.disableObservedAddrManager = true + } else { + observedAddrs, err := NewObservedAddrManager(h.Network().ListenAddresses, + h.Addrs, h.Network().InterfaceListenAddresses, normalize) + if err != nil { + return nil, fmt.Errorf("failed to create observed address manager: %s", err) + } + natEmitter, err := newNATEmitter(h, observedAddrs, time.Minute) + if err != nil { + return nil, fmt.Errorf("failed to create nat emitter: %s", err) + } + s.natEmitter = natEmitter + s.observedAddrMgr = observedAddrs } - s.observedAddrs = observedAddrs s.emitters.evtPeerProtocolsUpdated, err = h.EventBus().Emitter(&event.EvtPeerProtocolsUpdated{}) if err != nil { @@ -341,17 +367,26 @@ func (ids *idService) sendPushes(ctx context.Context) { // Close shuts down the idService func (ids *idService) Close() error { ids.ctxCancel() - ids.observedAddrs.Close() + if !ids.disableObservedAddrManager { + ids.observedAddrMgr.Close() + ids.natEmitter.Close() + } ids.refCount.Wait() return nil } func (ids *idService) OwnObservedAddrs() []ma.Multiaddr { - return ids.observedAddrs.Addrs() + if ids.disableObservedAddrManager { + return nil + } + return ids.observedAddrMgr.Addrs() } func (ids *idService) ObservedAddrsFor(local ma.Multiaddr) []ma.Multiaddr { - return ids.observedAddrs.AddrsFor(local) + if ids.disableObservedAddrManager { + return nil + } + return ids.observedAddrMgr.AddrsFor(local) } // IdentifyConn runs the Identify protocol on a connection. @@ -400,8 +435,6 @@ func (ids *idService) IdentifyWait(c network.Conn) <-chan struct{} { ids.emitters.evtPeerIdentificationFailed.Emit(event.EvtPeerIdentificationFailed{Peer: c.RemotePeer(), Reason: err}) return } - - ids.emitters.evtPeerIdentificationCompleted.Emit(event.EvtPeerIdentificationCompleted{Peer: c.RemotePeer()}) }() return e.IdentifyWaitChan @@ -410,7 +443,7 @@ func (ids *idService) IdentifyWait(c network.Conn) <-chan struct{} { func (ids *idService) identifyConn(c network.Conn) error { ctx, cancel := context.WithTimeout(context.Background(), Timeout) defer cancel() - s, err := c.NewStream(network.WithUseTransient(ctx, "identify")) + s, err := c.NewStream(network.WithAllowLimitedConn(ctx, "identify")) if err != nil { log.Debugw("error opening identify stream", "peer", c.RemotePeer(), "error", err) return err @@ -555,10 +588,18 @@ func readAllIDMessages(r pbio.Reader, finalMsg proto.Message) error { } func (ids *idService) updateSnapshot() (updated bool) { - addrs := ids.Host.Addrs() - slices.SortFunc(addrs, func(a, b ma.Multiaddr) int { return bytes.Compare(a.Bytes(), b.Bytes()) }) protos := ids.Host.Mux().Protocols() slices.Sort(protos) + + addrs := ids.Host.Addrs() + slices.SortFunc(addrs, func(a, b ma.Multiaddr) int { return bytes.Compare(a.Bytes(), b.Bytes()) }) + + usedSpace := len(ids.ProtocolVersion) + len(ids.UserAgent) + for i := 0; i < len(protos); i++ { + usedSpace += len(protos[i]) + } + addrs = trimHostAddrList(addrs, maxOwnIdentifyMsgSize-usedSpace-256) // 256 bytes of buffer + snapshot := identifySnapshot{ addrs: addrs, protocols: protos, @@ -711,8 +752,16 @@ func (ids *idService) consumeMessage(mes *pb.Identify, c network.Conn, isPush bo }) } - // mes.ObservedAddr - ids.consumeObservedAddress(mes.GetObservedAddr(), c) + obsAddr, err := ma.NewMultiaddrBytes(mes.GetObservedAddr()) + if err != nil { + log.Debugf("error parsing received observed addr for %s: %s", c, err) + obsAddr = nil + } + + if obsAddr != nil && !ids.disableObservedAddrManager { + // TODO refactor this to use the emitted events instead of having this func call explicitly. + ids.observedAddrMgr.Record(c, obsAddr) + } // mes.ListenAddrs laddrs := mes.GetListenAddrs() @@ -746,7 +795,8 @@ func (ids *idService) consumeMessage(mes *pb.Identify, c network.Conn, isPush bo // Taking the lock ensures that we don't concurrently process a disconnect. ids.addrMu.Lock() ttl := peerstore.RecentlyConnectedAddrTTL - if ids.Host.Network().Connectedness(p) == network.Connected { + switch ids.Host.Network().Connectedness(p) { + case network.Limited, network.Connected: ttl = peerstore.ConnectedAddrTTL } @@ -763,13 +813,19 @@ func (ids *idService) consumeMessage(mes *pb.Identify, c network.Conn, isPush bo signedAddrs, err := ids.consumeSignedPeerRecord(c.RemotePeer(), signedPeerRecord) if err != nil { log.Debugf("failed to consume signed peer record: %s", err) + signedPeerRecord = nil } else { addrs = signedAddrs } } else { addrs = lmaddrs } - ids.Host.Peerstore().AddAddrs(p, filterAddrs(addrs, c.RemoteMultiaddr()), ttl) + addrs = filterAddrs(addrs, c.RemoteMultiaddr()) + if len(addrs) > connectedPeerMaxAddrs { + addrs = addrs[:connectedPeerMaxAddrs] + } + + ids.Host.Peerstore().AddAddrs(p, addrs, ttl) // Finally, expire all temporary addrs. ids.Host.Peerstore().UpdateAddrs(p, peerstore.TempAddrTTL, 0) @@ -786,6 +842,18 @@ func (ids *idService) consumeMessage(mes *pb.Identify, c network.Conn, isPush bo // get the key from the other side. we may not have it (no-auth transport) ids.consumeReceivedPubKey(c, mes.PublicKey) + + ids.emitters.evtPeerIdentificationCompleted.Emit(event.EvtPeerIdentificationCompleted{ + Peer: c.RemotePeer(), + Conn: c, + ListenAddrs: lmaddrs, + Protocols: mesProtocols, + SignedPeerRecord: signedPeerRecord, + ObservedAddr: obsAddr, + ProtocolVersion: pv, + AgentVersion: av, + }) + } func (ids *idService) consumeSignedPeerRecord(p peer.ID, signedPeerRecord *record.Envelope) ([]ma.Multiaddr, error) { @@ -919,20 +987,6 @@ func HasConsistentTransport(a ma.Multiaddr, green []ma.Multiaddr) bool { return false } -func (ids *idService) consumeObservedAddress(observed []byte, c network.Conn) { - if observed == nil { - return - } - - maddr, err := ma.NewMultiaddrBytes(observed) - if err != nil { - log.Debugf("error parsing received observed addr for %s: %s", c, err) - return - } - - ids.observedAddrs.Record(c, maddr) -} - // addConnWithLock assuems caller holds the connsMu lock func (ids *idService) addConnWithLock(c network.Conn) { _, found := ids.conns[c] @@ -975,13 +1029,36 @@ func (nn *netNotifiee) Disconnected(_ network.Network, c network.Conn) { delete(ids.conns, c) ids.connsMu.Unlock() - if ids.Host.Network().Connectedness(c.RemotePeer()) != network.Connected { - // Last disconnect. - // Undo the setting of addresses to peer.ConnectedAddrTTL we did - ids.addrMu.Lock() - defer ids.addrMu.Unlock() - ids.Host.Peerstore().UpdateAddrs(c.RemotePeer(), peerstore.ConnectedAddrTTL, peerstore.RecentlyConnectedAddrTTL) + if !ids.disableObservedAddrManager { + ids.observedAddrMgr.removeConn(c) } + + // Last disconnect. + // Undo the setting of addresses to peer.ConnectedAddrTTL we did + ids.addrMu.Lock() + defer ids.addrMu.Unlock() + + // This check MUST happen after acquiring the Lock as identify on a different connection + // might be trying to add addresses. + switch ids.Host.Network().Connectedness(c.RemotePeer()) { + case network.Connected, network.Limited: + return + } + // peerstore returns the elements in a random order as it uses a map to store the addresses + addrs := ids.Host.Peerstore().Addrs(c.RemotePeer()) + n := len(addrs) + if n > recentlyConnectedPeerMaxAddrs { + // We want to always save the address we are connected to + for i, a := range addrs { + if a.Equal(c.RemoteMultiaddr()) { + addrs[i], addrs[0] = addrs[0], addrs[i] + } + } + n = recentlyConnectedPeerMaxAddrs + } + ids.Host.Peerstore().UpdateAddrs(c.RemotePeer(), peerstore.ConnectedAddrTTL, peerstore.TempAddrTTL) + ids.Host.Peerstore().AddAddrs(c.RemotePeer(), addrs[:n], peerstore.RecentlyConnectedAddrTTL) + ids.Host.Peerstore().UpdateAddrs(c.RemotePeer(), peerstore.TempAddrTTL, 0) } func (nn *netNotifiee) Listen(n network.Network, a ma.Multiaddr) {} @@ -1000,3 +1077,55 @@ func filterAddrs(addrs []ma.Multiaddr, remote ma.Multiaddr) []ma.Multiaddr { } return ma.FilterAddrs(addrs, manet.IsPublicAddr) } + +func trimHostAddrList(addrs []ma.Multiaddr, maxSize int) []ma.Multiaddr { + totalSize := 0 + for _, a := range addrs { + totalSize += len(a.Bytes()) + } + if totalSize <= maxSize { + return addrs + } + + score := func(addr ma.Multiaddr) int { + var res int + if manet.IsPublicAddr(addr) { + res |= 1 << 12 + } else if !manet.IsIPLoopback(addr) { + res |= 1 << 11 + } + var protocolWeight int + ma.ForEach(addr, func(c ma.Component) bool { + switch c.Protocol().Code { + case ma.P_QUIC_V1: + protocolWeight = 5 + case ma.P_TCP: + protocolWeight = 4 + case ma.P_WSS: + protocolWeight = 3 + case ma.P_WEBTRANSPORT: + protocolWeight = 2 + case ma.P_WEBRTC_DIRECT: + protocolWeight = 1 + case ma.P_P2P: + return false + } + return true + }) + res |= 1 << protocolWeight + return res + } + + slices.SortStableFunc(addrs, func(a, b ma.Multiaddr) int { + return score(b) - score(a) // b-a for reverse order + }) + totalSize = 0 + for i, a := range addrs { + totalSize += len(a.Bytes()) + if totalSize > maxSize { + addrs = addrs[:i] + break + } + } + return addrs +} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/nat_emitter.go b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/nat_emitter.go new file mode 100644 index 000000000..fec9b68fe --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/nat_emitter.go @@ -0,0 +1,119 @@ +package identify + +import ( + "context" + "fmt" + "sync" + "time" + + "github.com/libp2p/go-libp2p/core/event" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/p2p/host/eventbus" +) + +type natEmitter struct { + ctx context.Context + cancel context.CancelFunc + wg sync.WaitGroup + reachabilitySub event.Subscription + reachability network.Reachability + eventInterval time.Duration + + currentUDPNATDeviceType network.NATDeviceType + currentTCPNATDeviceType network.NATDeviceType + emitNATDeviceTypeChanged event.Emitter + + observedAddrMgr *ObservedAddrManager +} + +func newNATEmitter(h host.Host, o *ObservedAddrManager, eventInterval time.Duration) (*natEmitter, error) { + ctx, cancel := context.WithCancel(context.Background()) + n := &natEmitter{ + observedAddrMgr: o, + ctx: ctx, + cancel: cancel, + eventInterval: eventInterval, + } + reachabilitySub, err := h.EventBus().Subscribe(new(event.EvtLocalReachabilityChanged), eventbus.Name("identify (nat emitter)")) + if err != nil { + return nil, fmt.Errorf("failed to subscribe to reachability event: %s", err) + } + n.reachabilitySub = reachabilitySub + + emitter, err := h.EventBus().Emitter(new(event.EvtNATDeviceTypeChanged), eventbus.Stateful) + if err != nil { + return nil, fmt.Errorf("failed to create emitter for NATDeviceType: %s", err) + } + n.emitNATDeviceTypeChanged = emitter + + n.wg.Add(1) + go n.worker() + return n, nil +} + +func (n *natEmitter) worker() { + defer n.wg.Done() + subCh := n.reachabilitySub.Out() + ticker := time.NewTicker(n.eventInterval) + pendingUpdate := false + enoughTimeSinceLastUpdate := true + for { + select { + case evt, ok := <-subCh: + if !ok { + subCh = nil + continue + } + ev, ok := evt.(event.EvtLocalReachabilityChanged) + if !ok { + log.Error("invalid event: %v", evt) + continue + } + n.reachability = ev.Reachability + case <-ticker.C: + enoughTimeSinceLastUpdate = true + if pendingUpdate { + n.maybeNotify() + pendingUpdate = false + enoughTimeSinceLastUpdate = false + } + case <-n.observedAddrMgr.addrRecordedNotif: + pendingUpdate = true + if enoughTimeSinceLastUpdate { + n.maybeNotify() + pendingUpdate = false + enoughTimeSinceLastUpdate = false + } + case <-n.ctx.Done(): + return + } + } +} + +func (n *natEmitter) maybeNotify() { + if n.reachability == network.ReachabilityPrivate { + tcpNATType, udpNATType := n.observedAddrMgr.getNATType() + if tcpNATType != n.currentTCPNATDeviceType { + n.currentTCPNATDeviceType = tcpNATType + n.emitNATDeviceTypeChanged.Emit(event.EvtNATDeviceTypeChanged{ + TransportProtocol: network.NATTransportTCP, + NatDeviceType: n.currentTCPNATDeviceType, + }) + } + if udpNATType != n.currentUDPNATDeviceType { + n.currentUDPNATDeviceType = udpNATType + n.emitNATDeviceTypeChanged.Emit(event.EvtNATDeviceTypeChanged{ + TransportProtocol: network.NATTransportUDP, + NatDeviceType: n.currentUDPNATDeviceType, + }) + } + } +} + +func (n *natEmitter) Close() { + n.cancel() + n.wg.Wait() + n.reachabilitySub.Close() + n.emitNATDeviceTypeChanged.Close() +} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/obsaddr.go b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/obsaddr.go index 70a7eccd4..4437c4b01 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/obsaddr.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/obsaddr.go @@ -3,16 +3,12 @@ package identify import ( "context" "fmt" + "net" + "slices" + "sort" "sync" - "time" - "golang.org/x/exp/slices" - - "github.com/libp2p/go-libp2p/core/event" - "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/network" - "github.com/libp2p/go-libp2p/core/peerstore" - "github.com/libp2p/go-libp2p/p2p/host/eventbus" ma "github.com/multiformats/go-multiaddr" manet "github.com/multiformats/go-multiaddr/net" @@ -25,217 +21,252 @@ import ( // the GC rounds set by GCInterval. var ActivationThresh = 4 -// GCInterval specicies how often to make a round cleaning seen events and -// observed addresses. An address will be cleaned if it has not been seen in -// OwnObservedAddressTTL (10 minutes). A "seen" event will be cleaned up if -// it is older than OwnObservedAddressTTL * ActivationThresh (40 minutes). -var GCInterval = 10 * time.Minute - // observedAddrManagerWorkerChannelSize defines how many addresses can be enqueued // for adding to an ObservedAddrManager. var observedAddrManagerWorkerChannelSize = 16 -// maxObservedAddrsPerIPAndTransport is the maximum number of observed addresses -// we will return for each (IPx/TCP or UDP) group. -var maxObservedAddrsPerIPAndTransport = 2 +const maxExternalThinWaistAddrsPerLocalAddr = 3 -// observation records an address observation from an "observer" (where every IP -// address is a unique observer). -type observation struct { - // seenTime is the last time this observation was made. - seenTime time.Time - // inbound indicates whether or not this observation has been made from - // an inbound connection. This remains true even if we an observation - // from a subsequent outbound connection. - inbound bool +// thinWaist is a struct that stores the address along with it's thin waist prefix and rest of the multiaddr +type thinWaist struct { + Addr, TW, Rest ma.Multiaddr } -// observedAddr is an entry for an address reported by our peers. -// We only use addresses that: -// - have been observed at least 4 times in last 40 minutes. (counter symmetric nats) -// - have been observed at least once recently (10 minutes), because our position in the -// network, or network port mapppings, may have changed. -type observedAddr struct { - addr ma.Multiaddr - seenBy map[string]observation // peer(observer) address -> observation info - lastSeen time.Time - numInbound int +// thinWaistWithCount is a thinWaist along with the count of the connection that have it as the local address +type thinWaistWithCount struct { + thinWaist + Count int } -func (oa *observedAddr) activated() bool { - - // We only activate if other peers observed the same address - // of ours at least 4 times. SeenBy peers are removed by GC if - // they say the address more than ttl*ActivationThresh - return len(oa.seenBy) >= ActivationThresh -} - -// GroupKey returns the group in which this observation belongs. Currently, an -// observed address's group is just the address with all ports set to 0. This -// means we can advertise the most commonly observed external ports without -// advertising _every_ observed port. -func (oa *observedAddr) groupKey() string { - key := make([]byte, 0, len(oa.addr.Bytes())) - ma.ForEach(oa.addr, func(c ma.Component) bool { - switch proto := c.Protocol(); proto.Code { - case ma.P_TCP, ma.P_UDP: - key = append(key, proto.VCode...) - key = append(key, 0, 0) // zero in two bytes - default: - key = append(key, c.Bytes()...) +func thinWaistForm(a ma.Multiaddr) (thinWaist, error) { + i := 0 + tw, rest := ma.SplitFunc(a, func(c ma.Component) bool { + if i > 1 { + return true } - return true + switch i { + case 0: + if c.Protocol().Code == ma.P_IP4 || c.Protocol().Code == ma.P_IP6 { + i++ + return false + } + return true + case 1: + if c.Protocol().Code == ma.P_TCP || c.Protocol().Code == ma.P_UDP { + i++ + return false + } + return true + } + return false }) - - return string(key) + if i <= 1 { + return thinWaist{}, fmt.Errorf("not a thinwaist address: %s", a) + } + return thinWaist{Addr: a, TW: tw, Rest: rest}, nil } -type newObservation struct { - conn network.Conn +// getObserver returns the observer for the multiaddress +// For an IPv4 multiaddress the observer is the IP address +// For an IPv6 multiaddress the observer is the first /56 prefix of the IP address +func getObserver(a ma.Multiaddr) (string, error) { + ip, err := manet.ToIP(a) + if err != nil { + return "", err + } + if ip4 := ip.To4(); ip4 != nil { + return ip4.String(), nil + } + // Count /56 prefix as a single observer. + return ip.Mask(net.CIDRMask(56, 128)).String(), nil +} + +// connMultiaddrs provides IsClosed along with network.ConnMultiaddrs. It is easier to mock this than network.Conn +type connMultiaddrs interface { + network.ConnMultiaddrs + IsClosed() bool +} + +// observerSetCacheSize is the number of transport sharing the same thinwaist (tcp, ws, wss), (quic, webtransport, webrtc-direct) +// This is 3 in practice right now, but keep a buffer of 3 extra elements +const observerSetCacheSize = 5 + +// observerSet is the set of observers who have observed ThinWaistAddr +type observerSet struct { + ObservedTWAddr ma.Multiaddr + ObservedBy map[string]int + + mu sync.RWMutex // protects following + cachedMultiaddrs map[string]ma.Multiaddr // cache of localMultiaddr rest(addr - thinwaist) => output multiaddr +} + +func (s *observerSet) cacheMultiaddr(addr ma.Multiaddr) ma.Multiaddr { + if addr == nil { + return s.ObservedTWAddr + } + addrStr := string(addr.Bytes()) + s.mu.RLock() + res, ok := s.cachedMultiaddrs[addrStr] + s.mu.RUnlock() + if ok { + return res + } + + s.mu.Lock() + defer s.mu.Unlock() + // Check if some other go routine added this while we were waiting + res, ok = s.cachedMultiaddrs[addrStr] + if ok { + return res + } + if s.cachedMultiaddrs == nil { + s.cachedMultiaddrs = make(map[string]ma.Multiaddr, observerSetCacheSize) + } + if len(s.cachedMultiaddrs) == observerSetCacheSize { + // remove one entry if we will go over the limit + for k := range s.cachedMultiaddrs { + delete(s.cachedMultiaddrs, k) + break + } + } + s.cachedMultiaddrs[addrStr] = ma.Join(s.ObservedTWAddr, addr) + return s.cachedMultiaddrs[addrStr] +} + +type observation struct { + conn connMultiaddrs observed ma.Multiaddr } -// ObservedAddrManager keeps track of a ObservedAddrs. +// ObservedAddrManager maps connection's local multiaddrs to their externally observable multiaddress type ObservedAddrManager struct { - host host.Host + // Our listen addrs + listenAddrs func() []ma.Multiaddr + // Our listen addrs with interface addrs for unspecified addrs + interfaceListenAddrs func() ([]ma.Multiaddr, error) + // All host addrs + hostAddrs func() []ma.Multiaddr + // Any normalization required before comparing. Useful to remove certhash + normalize func(ma.Multiaddr) ma.Multiaddr + // worker channel for new observations + wch chan observation + // notified on recording an observation + addrRecordedNotif chan struct{} - closeOnce sync.Once - refCount sync.WaitGroup - ctx context.Context // the context is canceled when Close is called + // for closing + wg sync.WaitGroup + ctx context.Context ctxCancel context.CancelFunc - // latest observation from active connections - // we'll "re-observe" these when we gc - activeConnsMu sync.Mutex - // active connection -> most recent observation - activeConns map[network.Conn]ma.Multiaddr - - mu sync.RWMutex - closed bool - // local(internal) address -> list of observed(external) addresses - addrs map[string][]*observedAddr - ttl time.Duration - refreshTimer *time.Timer - - // this is the worker channel - wch chan newObservation - - reachabilitySub event.Subscription - reachability network.Reachability - - currentUDPNATDeviceType network.NATDeviceType - currentTCPNATDeviceType network.NATDeviceType - emitNATDeviceTypeChanged event.Emitter + mu sync.RWMutex + // local thin waist => external thin waist => observerSet + externalAddrs map[string]map[string]*observerSet + // connObservedTWAddrs maps the connection to the last observed thin waist multiaddr on that connection + connObservedTWAddrs map[connMultiaddrs]ma.Multiaddr + // localMultiaddr => thin waist form with the count of the connections the multiaddr + // was seen on for tracking our local listen addresses + localAddrs map[string]*thinWaistWithCount } -// NewObservedAddrManager returns a new address manager using -// peerstore.OwnObservedAddressTTL as the TTL. -func NewObservedAddrManager(host host.Host) (*ObservedAddrManager, error) { - oas := &ObservedAddrManager{ - addrs: make(map[string][]*observedAddr), - ttl: peerstore.OwnObservedAddrTTL, - wch: make(chan newObservation, observedAddrManagerWorkerChannelSize), - host: host, - activeConns: make(map[network.Conn]ma.Multiaddr), - // refresh every ttl/2 so we don't forget observations from connected peers - refreshTimer: time.NewTimer(peerstore.OwnObservedAddrTTL / 2), +// NewObservedAddrManager returns a new address manager using peerstore.OwnObservedAddressTTL as the TTL. +func NewObservedAddrManager(listenAddrs, hostAddrs func() []ma.Multiaddr, + interfaceListenAddrs func() ([]ma.Multiaddr, error), normalize func(ma.Multiaddr) ma.Multiaddr) (*ObservedAddrManager, error) { + if normalize == nil { + normalize = func(addr ma.Multiaddr) ma.Multiaddr { return addr } } - oas.ctx, oas.ctxCancel = context.WithCancel(context.Background()) - - reachabilitySub, err := host.EventBus().Subscribe(new(event.EvtLocalReachabilityChanged), eventbus.Name("identify (obsaddr)")) - if err != nil { - return nil, fmt.Errorf("failed to subscribe to reachability event: %s", err) + o := &ObservedAddrManager{ + externalAddrs: make(map[string]map[string]*observerSet), + connObservedTWAddrs: make(map[connMultiaddrs]ma.Multiaddr), + localAddrs: make(map[string]*thinWaistWithCount), + wch: make(chan observation, observedAddrManagerWorkerChannelSize), + addrRecordedNotif: make(chan struct{}, 1), + listenAddrs: listenAddrs, + interfaceListenAddrs: interfaceListenAddrs, + hostAddrs: hostAddrs, + normalize: normalize, } - oas.reachabilitySub = reachabilitySub + o.ctx, o.ctxCancel = context.WithCancel(context.Background()) - emitter, err := host.EventBus().Emitter(new(event.EvtNATDeviceTypeChanged), eventbus.Stateful) - if err != nil { - return nil, fmt.Errorf("failed to create emitter for NATDeviceType: %s", err) - } - oas.emitNATDeviceTypeChanged = emitter - - oas.host.Network().Notify((*obsAddrNotifiee)(oas)) - oas.refCount.Add(1) - go oas.worker() - return oas, nil + o.wg.Add(1) + go o.worker() + return o, nil } // AddrsFor return all activated observed addresses associated with the given // (resolved) listen address. -func (oas *ObservedAddrManager) AddrsFor(addr ma.Multiaddr) (addrs []ma.Multiaddr) { - oas.mu.RLock() - defer oas.mu.RUnlock() - - if len(oas.addrs) == 0 { +func (o *ObservedAddrManager) AddrsFor(addr ma.Multiaddr) (addrs []ma.Multiaddr) { + if addr == nil { + return nil + } + o.mu.RLock() + defer o.mu.RUnlock() + tw, err := thinWaistForm(o.normalize(addr)) + if err != nil { return nil } - observedAddrs, ok := oas.addrs[string(addr.Bytes())] - if !ok { - return + observerSets := o.getTopExternalAddrs(string(tw.TW.Bytes())) + res := make([]ma.Multiaddr, 0, len(observerSets)) + for _, s := range observerSets { + res = append(res, s.cacheMultiaddr(tw.Rest)) } - - return oas.filter(observedAddrs) + return res } // Addrs return all activated observed addresses -func (oas *ObservedAddrManager) Addrs() []ma.Multiaddr { - oas.mu.RLock() - defer oas.mu.RUnlock() +func (o *ObservedAddrManager) Addrs() []ma.Multiaddr { + o.mu.RLock() + defer o.mu.RUnlock() - if len(oas.addrs) == 0 { - return nil + m := make(map[string][]*observerSet) + for localTWStr := range o.externalAddrs { + m[localTWStr] = append(m[localTWStr], o.getTopExternalAddrs(localTWStr)...) } - - var allObserved []*observedAddr - for _, addrs := range oas.addrs { - allObserved = append(allObserved, addrs...) - } - return oas.filter(allObserved) -} - -func (oas *ObservedAddrManager) filter(observedAddrs []*observedAddr) []ma.Multiaddr { - pmap := make(map[string][]*observedAddr) - now := time.Now() - - for i := range observedAddrs { - a := observedAddrs[i] - if now.Sub(a.lastSeen) <= oas.ttl && a.activated() { - // group addresses by their IPX/Transport Protocol(TCP or UDP) pattern. - pat := a.groupKey() - pmap[pat] = append(pmap[pat], a) - + addrs := make([]ma.Multiaddr, 0, maxExternalThinWaistAddrsPerLocalAddr*5) // assume 5 transports + for _, t := range o.localAddrs { + for _, s := range m[string(t.TW.Bytes())] { + addrs = append(addrs, s.cacheMultiaddr(t.Rest)) } } - - addrs := make([]ma.Multiaddr, 0, len(observedAddrs)) - for pat := range pmap { - s := pmap[pat] - - slices.SortFunc(s, func(first, second *observedAddr) int { - // We prefer inbound connection observations over outbound. - if first.numInbound > second.numInbound { - return -1 - } - // For ties, we prefer the ones with more votes. - if first.numInbound == second.numInbound && len(first.seenBy) > len(second.seenBy) { - return -1 - } - return 1 - }) - - for i := 0; i < maxObservedAddrsPerIPAndTransport && i < len(s); i++ { - addrs = append(addrs, s[i].addr) - } - } - return addrs } -// Record records an address observation, if valid. -func (oas *ObservedAddrManager) Record(conn network.Conn, observed ma.Multiaddr) { +func (o *ObservedAddrManager) getTopExternalAddrs(localTWStr string) []*observerSet { + observerSets := make([]*observerSet, 0, len(o.externalAddrs[localTWStr])) + for _, v := range o.externalAddrs[localTWStr] { + if len(v.ObservedBy) >= ActivationThresh { + observerSets = append(observerSets, v) + } + } + slices.SortFunc(observerSets, func(a, b *observerSet) int { + diff := len(b.ObservedBy) - len(a.ObservedBy) + if diff != 0 { + return diff + } + // In case we have elements with equal counts, + // keep the address list stable by using the lexicographically smaller address + as := a.ObservedTWAddr.String() + bs := b.ObservedTWAddr.String() + if as < bs { + return -1 + } else if as > bs { + return 1 + } else { + return 0 + } + + }) + n := len(observerSets) + if n > maxExternalThinWaistAddrsPerLocalAddr { + n = maxExternalThinWaistAddrsPerLocalAddr + } + return observerSets[:n] +} + +// Record enqueues an observation for recording +func (o *ObservedAddrManager) Record(conn connMultiaddrs, observed ma.Multiaddr) { select { - case oas.wch <- newObservation{ + case o.wch <- observation{ conn: conn, observed: observed, }: @@ -247,182 +278,72 @@ func (oas *ObservedAddrManager) Record(conn network.Conn, observed ma.Multiaddr) } } -func (oas *ObservedAddrManager) worker() { - defer oas.refCount.Done() +func (o *ObservedAddrManager) worker() { + defer o.wg.Done() - ticker := time.NewTicker(GCInterval) - defer ticker.Stop() - - subChan := oas.reachabilitySub.Out() for { select { - case evt, ok := <-subChan: - if !ok { - subChan = nil - continue - } - ev := evt.(event.EvtLocalReachabilityChanged) - oas.reachability = ev.Reachability - case obs := <-oas.wch: - oas.maybeRecordObservation(obs.conn, obs.observed) - case <-ticker.C: - oas.gc() - case <-oas.refreshTimer.C: - oas.refresh() - case <-oas.ctx.Done(): + case obs := <-o.wch: + o.maybeRecordObservation(obs.conn, obs.observed) + case <-o.ctx.Done(): return } } } -func (oas *ObservedAddrManager) refresh() { - oas.activeConnsMu.Lock() - recycledObservations := make([]newObservation, 0, len(oas.activeConns)) - for conn, observed := range oas.activeConns { - recycledObservations = append(recycledObservations, newObservation{ - conn: conn, - observed: observed, - }) +func (o *ObservedAddrManager) shouldRecordObservation(conn connMultiaddrs, observed ma.Multiaddr) (shouldRecord bool, localTW thinWaist, observedTW thinWaist) { + if conn == nil || observed == nil { + return false, thinWaist{}, thinWaist{} } - oas.activeConnsMu.Unlock() - - oas.mu.Lock() - defer oas.mu.Unlock() - for _, obs := range recycledObservations { - oas.recordObservationUnlocked(obs.conn, obs.observed) - } - // refresh every ttl/2 so we don't forget observations from connected peers - oas.refreshTimer.Reset(oas.ttl / 2) -} - -func (oas *ObservedAddrManager) gc() { - oas.mu.Lock() - defer oas.mu.Unlock() - - now := time.Now() - for local, observedAddrs := range oas.addrs { - filteredAddrs := observedAddrs[:0] - for _, a := range observedAddrs { - // clean up SeenBy set - for k, ob := range a.seenBy { - if now.Sub(ob.seenTime) > oas.ttl*time.Duration(ActivationThresh) { - delete(a.seenBy, k) - if ob.inbound { - a.numInbound-- - } - } - } - - // leave only alive observed addresses - if now.Sub(a.lastSeen) <= oas.ttl { - filteredAddrs = append(filteredAddrs, a) - } - } - if len(filteredAddrs) > 0 { - oas.addrs[local] = filteredAddrs - } else { - delete(oas.addrs, local) - } - } -} - -func (oas *ObservedAddrManager) addConn(conn network.Conn, observed ma.Multiaddr) { - oas.activeConnsMu.Lock() - defer oas.activeConnsMu.Unlock() - - // We need to make sure we haven't received a disconnect event for this - // connection yet. The only way to do that right now is to make sure the - // swarm still has the connection. - // - // Doing this under a lock that we _also_ take in a disconnect event - // handler ensures everything happens in the right order. - for _, c := range oas.host.Network().ConnsToPeer(conn.RemotePeer()) { - if c == conn { - oas.activeConns[conn] = observed - return - } - } -} - -func (oas *ObservedAddrManager) removeConn(conn network.Conn) { - // DO NOT remove this lock. - // This ensures we don't call addConn at the same time: - // 1. see that we have a connection and pause inside addConn right before recording it. - // 2. process a disconnect event. - // 3. record the connection (leaking it). - - oas.activeConnsMu.Lock() - delete(oas.activeConns, conn) - oas.activeConnsMu.Unlock() -} - -type normalizeMultiaddrer interface { - NormalizeMultiaddr(addr ma.Multiaddr) ma.Multiaddr -} - -type addrsProvider interface { - Addrs() []ma.Multiaddr -} - -type listenAddrsProvider interface { - ListenAddresses() []ma.Multiaddr - InterfaceListenAddresses() ([]ma.Multiaddr, error) -} - -func shouldRecordObservation(host addrsProvider, network listenAddrsProvider, conn network.ConnMultiaddrs, observed ma.Multiaddr) bool { - // First, determine if this observation is even worth keeping... - // Ignore observations from loopback nodes. We already know our loopback // addresses. if manet.IsIPLoopback(observed) { - return false + return false, thinWaist{}, thinWaist{} } // Provided by NAT64 peers, these addresses are specific to the peer and not publicly routable if manet.IsNAT64IPv4ConvertedIPv6Addr(observed) { - return false + return false, thinWaist{}, thinWaist{} } // we should only use ObservedAddr when our connection's LocalAddr is one // of our ListenAddrs. If we Dial out using an ephemeral addr, knowing that // address's external mapping is not very useful because the port will not be // the same as the listen addr. - ifaceaddrs, err := network.InterfaceListenAddresses() + ifaceaddrs, err := o.interfaceListenAddrs() if err != nil { log.Infof("failed to get interface listen addrs", err) - return false + return false, thinWaist{}, thinWaist{} } - normalizer, canNormalize := host.(normalizeMultiaddrer) - - if canNormalize { - for i, a := range ifaceaddrs { - ifaceaddrs[i] = normalizer.NormalizeMultiaddr(a) - } + for i, a := range ifaceaddrs { + ifaceaddrs[i] = o.normalize(a) } - local := conn.LocalMultiaddr() - if canNormalize { - local = normalizer.NormalizeMultiaddr(local) - } + local := o.normalize(conn.LocalMultiaddr()) - listenAddrs := network.ListenAddresses() - if canNormalize { - for i, a := range listenAddrs { - listenAddrs[i] = normalizer.NormalizeMultiaddr(a) - } + listenAddrs := o.listenAddrs() + for i, a := range listenAddrs { + listenAddrs[i] = o.normalize(a) } if !ma.Contains(ifaceaddrs, local) && !ma.Contains(listenAddrs, local) { // not in our list - return false + return false, thinWaist{}, thinWaist{} } - hostAddrs := host.Addrs() - if canNormalize { - for i, a := range hostAddrs { - hostAddrs[i] = normalizer.NormalizeMultiaddr(a) - } + localTW, err = thinWaistForm(local) + if err != nil { + return false, thinWaist{}, thinWaist{} + } + observedTW, err = thinWaistForm(o.normalize(observed)) + if err != nil { + return false, thinWaist{}, thinWaist{} + } + + hostAddrs := o.hostAddrs() + for i, a := range hostAddrs { + hostAddrs[i] = o.normalize(a) } // We should reject the connection if the observation doesn't match the @@ -434,207 +355,192 @@ func shouldRecordObservation(host addrsProvider, network listenAddrsProvider, co "from", conn.RemoteMultiaddr(), "observed", observed, ) - return false + return false, thinWaist{}, thinWaist{} } - return true + return true, localTW, observedTW } -func (oas *ObservedAddrManager) maybeRecordObservation(conn network.Conn, observed ma.Multiaddr) { - shouldRecord := shouldRecordObservation(oas.host, oas.host.Network(), conn, observed) - if shouldRecord { - // Ok, the observation is good, record it. - log.Debugw("added own observed listen addr", "observed", observed) - defer oas.addConn(conn, observed) - - oas.mu.Lock() - defer oas.mu.Unlock() - oas.recordObservationUnlocked(conn, observed) - - if oas.reachability == network.ReachabilityPrivate { - oas.emitAllNATTypes() - } - } -} - -func (oas *ObservedAddrManager) recordObservationUnlocked(conn network.Conn, observed ma.Multiaddr) { - now := time.Now() - observerString := observerGroup(conn.RemoteMultiaddr()) - localString := string(conn.LocalMultiaddr().Bytes()) - ob := observation{ - seenTime: now, - inbound: conn.Stat().Direction == network.DirInbound, - } - - // check if observed address seen yet, if so, update it - for _, observedAddr := range oas.addrs[localString] { - if observedAddr.addr.Equal(observed) { - // Don't trump an outbound observation with an inbound - // one. - wasInbound := observedAddr.seenBy[observerString].inbound - isInbound := ob.inbound - ob.inbound = isInbound || wasInbound - - if !wasInbound && isInbound { - observedAddr.numInbound++ - } - - observedAddr.seenBy[observerString] = ob - observedAddr.lastSeen = now - return - } - } - - // observed address not seen yet, append it - oa := &observedAddr{ - addr: observed, - seenBy: map[string]observation{ - observerString: ob, - }, - lastSeen: now, - } - if ob.inbound { - oa.numInbound++ - } - oas.addrs[localString] = append(oas.addrs[localString], oa) -} - -// For a given transport Protocol (TCP/UDP): -// -// 1. If we have an activated address, we are behind an Cone NAT. -// With regards to RFC 3489, this could be either a Full Cone NAT, a Restricted Cone NAT or a -// Port Restricted Cone NAT. However, we do NOT differentiate between them here and simply classify all such NATs as a Cone NAT. -// -// 2. If four different peers observe a different address for us on outbound connections, we -// are MOST probably behind a Symmetric NAT. -// -// Please see the documentation on the enumerations for `network.NATDeviceType` for more details about these NAT Device types -// and how they relate to NAT traversal via Hole Punching. -func (oas *ObservedAddrManager) emitAllNATTypes() { - var allObserved []*observedAddr - for _, addrs := range oas.addrs { - allObserved = append(allObserved, addrs...) - } - - hasChanged, natType := oas.emitSpecificNATType(allObserved, ma.P_TCP, network.NATTransportTCP, oas.currentTCPNATDeviceType) - if hasChanged { - oas.currentTCPNATDeviceType = natType - } - - hasChanged, natType = oas.emitSpecificNATType(allObserved, ma.P_UDP, network.NATTransportUDP, oas.currentUDPNATDeviceType) - if hasChanged { - oas.currentUDPNATDeviceType = natType - } -} - -// returns true along with the new NAT device type if the NAT device type for the given protocol has changed. -// returns false otherwise. -func (oas *ObservedAddrManager) emitSpecificNATType(addrs []*observedAddr, protoCode int, transportProto network.NATTransportProtocol, - currentNATType network.NATDeviceType) (bool, network.NATDeviceType) { - now := time.Now() - seenBy := make(map[string]struct{}) - cnt := 0 - - for _, oa := range addrs { - _, err := oa.addr.ValueForProtocol(protoCode) - if err != nil { - continue - } - - // if we have an activated addresses, it's a Cone NAT. - if now.Sub(oa.lastSeen) <= oas.ttl && oa.activated() { - if currentNATType != network.NATDeviceTypeCone { - oas.emitNATDeviceTypeChanged.Emit(event.EvtNATDeviceTypeChanged{ - TransportProtocol: transportProto, - NatDeviceType: network.NATDeviceTypeCone, - }) - return true, network.NATDeviceTypeCone - } - - // our current NAT Device Type is already CONE, nothing to do here. - return false, 0 - } - - // An observed address on an outbound connection that has ONLY been seen by one peer - if now.Sub(oa.lastSeen) <= oas.ttl && oa.numInbound == 0 && len(oa.seenBy) == 1 { - cnt++ - for s := range oa.seenBy { - seenBy[s] = struct{}{} - } - } - } - - // If four different peers observe a different address for us on each of four outbound connections, we - // are MOST probably behind a Symmetric NAT. - if cnt >= ActivationThresh && len(seenBy) >= ActivationThresh { - if currentNATType != network.NATDeviceTypeSymmetric { - oas.emitNATDeviceTypeChanged.Emit(event.EvtNATDeviceTypeChanged{ - TransportProtocol: transportProto, - NatDeviceType: network.NATDeviceTypeSymmetric, - }) - return true, network.NATDeviceTypeSymmetric - } - } - - return false, 0 -} - -func (oas *ObservedAddrManager) Close() error { - oas.closeOnce.Do(func() { - oas.ctxCancel() - - oas.mu.Lock() - oas.closed = true - oas.refreshTimer.Stop() - oas.mu.Unlock() - - oas.refCount.Wait() - oas.reachabilitySub.Close() - oas.host.Network().StopNotify((*obsAddrNotifiee)(oas)) - }) - return nil -} - -// observerGroup is a function that determines what part of -// a multiaddr counts as a different observer. for example, -// two ipfs nodes at the same IP/TCP transport would get -// the exact same NAT mapping; they would count as the -// same observer. This may protect against NATs who assign -// different ports to addresses at different IP hosts, but -// not TCP ports. -// -// Here, we use the root multiaddr address. This is mostly -// IP addresses. In practice, this is what we want. -func observerGroup(m ma.Multiaddr) string { - // TODO: If IPv6 rolls out we should mark /64 routing zones as one group - first, _ := ma.SplitFirst(m) - return string(first.Bytes()) -} - -// SetTTL sets the TTL of an observed address manager. -func (oas *ObservedAddrManager) SetTTL(ttl time.Duration) { - oas.mu.Lock() - defer oas.mu.Unlock() - if oas.closed { +func (o *ObservedAddrManager) maybeRecordObservation(conn connMultiaddrs, observed ma.Multiaddr) { + shouldRecord, localTW, observedTW := o.shouldRecordObservation(conn, observed) + if !shouldRecord { return } - oas.ttl = ttl - // refresh every ttl/2 so we don't forget observations from connected peers - oas.refreshTimer.Reset(ttl / 2) + log.Debugw("added own observed listen addr", "observed", observed) + + o.mu.Lock() + defer o.mu.Unlock() + o.recordObservationUnlocked(conn, localTW, observedTW) + select { + case o.addrRecordedNotif <- struct{}{}: + default: + } } -// TTL gets the TTL of an observed address manager. -func (oas *ObservedAddrManager) TTL() time.Duration { - oas.mu.RLock() - defer oas.mu.RUnlock() - return oas.ttl +func (o *ObservedAddrManager) recordObservationUnlocked(conn connMultiaddrs, localTW, observedTW thinWaist) { + if conn.IsClosed() { + // dont record if the connection is already closed. Any previous observations will be removed in + // the disconnected callback + return + } + localTWStr := string(localTW.TW.Bytes()) + observedTWStr := string(observedTW.TW.Bytes()) + observer, err := getObserver(conn.RemoteMultiaddr()) + if err != nil { + return + } + + prevObservedTWAddr, ok := o.connObservedTWAddrs[conn] + if !ok { + t, ok := o.localAddrs[string(localTW.Addr.Bytes())] + if !ok { + t = &thinWaistWithCount{ + thinWaist: localTW, + } + o.localAddrs[string(localTW.Addr.Bytes())] = t + } + t.Count++ + } else { + if prevObservedTWAddr.Equal(observedTW.TW) { + // we have received the same observation again, nothing to do + return + } + // if we have a previous entry remove it from externalAddrs + o.removeExternalAddrsUnlocked(observer, localTWStr, string(prevObservedTWAddr.Bytes())) + // no need to change the localAddrs map here + } + o.connObservedTWAddrs[conn] = observedTW.TW + o.addExternalAddrsUnlocked(observedTW.TW, observer, localTWStr, observedTWStr) } -type obsAddrNotifiee ObservedAddrManager - -func (on *obsAddrNotifiee) Listen(n network.Network, a ma.Multiaddr) {} -func (on *obsAddrNotifiee) ListenClose(n network.Network, a ma.Multiaddr) {} -func (on *obsAddrNotifiee) Connected(n network.Network, v network.Conn) {} -func (on *obsAddrNotifiee) Disconnected(n network.Network, v network.Conn) { - (*ObservedAddrManager)(on).removeConn(v) +func (o *ObservedAddrManager) removeExternalAddrsUnlocked(observer, localTWStr, observedTWStr string) { + s, ok := o.externalAddrs[localTWStr][observedTWStr] + if !ok { + return + } + s.ObservedBy[observer]-- + if s.ObservedBy[observer] <= 0 { + delete(s.ObservedBy, observer) + } + if len(s.ObservedBy) == 0 { + delete(o.externalAddrs[localTWStr], observedTWStr) + } + if len(o.externalAddrs[localTWStr]) == 0 { + delete(o.externalAddrs, localTWStr) + } +} + +func (o *ObservedAddrManager) addExternalAddrsUnlocked(observedTWAddr ma.Multiaddr, observer, localTWStr, observedTWStr string) { + s, ok := o.externalAddrs[localTWStr][observedTWStr] + if !ok { + s = &observerSet{ + ObservedTWAddr: observedTWAddr, + ObservedBy: make(map[string]int), + } + if _, ok := o.externalAddrs[localTWStr]; !ok { + o.externalAddrs[localTWStr] = make(map[string]*observerSet) + } + o.externalAddrs[localTWStr][observedTWStr] = s + } + s.ObservedBy[observer]++ +} + +func (o *ObservedAddrManager) removeConn(conn connMultiaddrs) { + if conn == nil { + return + } + o.mu.Lock() + defer o.mu.Unlock() + + // normalize before obtaining the thinWaist so that we are always dealing + // with the normalized form of the address + localTW, err := thinWaistForm(o.normalize(conn.LocalMultiaddr())) + if err != nil { + return + } + t, ok := o.localAddrs[string(localTW.Addr.Bytes())] + if !ok { + return + } + t.Count-- + if t.Count <= 0 { + delete(o.localAddrs, string(localTW.Addr.Bytes())) + } + + observedTWAddr, ok := o.connObservedTWAddrs[conn] + if !ok { + return + } + delete(o.connObservedTWAddrs, conn) + observer, err := getObserver(conn.RemoteMultiaddr()) + if err != nil { + return + } + + o.removeExternalAddrsUnlocked(observer, string(localTW.TW.Bytes()), string(observedTWAddr.Bytes())) + select { + case o.addrRecordedNotif <- struct{}{}: + default: + } +} + +func (o *ObservedAddrManager) getNATType() (tcpNATType, udpNATType network.NATDeviceType) { + o.mu.RLock() + defer o.mu.RUnlock() + + var tcpCounts, udpCounts []int + var tcpTotal, udpTotal int + for _, m := range o.externalAddrs { + isTCP := false + for _, v := range m { + if _, err := v.ObservedTWAddr.ValueForProtocol(ma.P_TCP); err == nil { + isTCP = true + } + break + } + for _, v := range m { + if isTCP { + tcpCounts = append(tcpCounts, len(v.ObservedBy)) + tcpTotal += len(v.ObservedBy) + } else { + udpCounts = append(udpCounts, len(v.ObservedBy)) + udpTotal += len(v.ObservedBy) + } + } + } + + sort.Sort(sort.Reverse(sort.IntSlice(tcpCounts))) + sort.Sort(sort.Reverse(sort.IntSlice(udpCounts))) + + tcpTopCounts, udpTopCounts := 0, 0 + for i := 0; i < maxExternalThinWaistAddrsPerLocalAddr && i < len(tcpCounts); i++ { + tcpTopCounts += tcpCounts[i] + } + for i := 0; i < maxExternalThinWaistAddrsPerLocalAddr && i < len(udpCounts); i++ { + udpTopCounts += udpCounts[i] + } + + // If the top elements cover more than 1/2 of all the observations, there's a > 50% chance that + // hole punching based on outputs of observed address manager will succeed + if tcpTotal >= 3*maxExternalThinWaistAddrsPerLocalAddr { + if tcpTopCounts >= tcpTotal/2 { + tcpNATType = network.NATDeviceTypeCone + } else { + tcpNATType = network.NATDeviceTypeSymmetric + } + } + if udpTotal >= 3*maxExternalThinWaistAddrsPerLocalAddr { + if udpTopCounts >= udpTotal/2 { + udpNATType = network.NATDeviceTypeCone + } else { + udpNATType = network.NATDeviceTypeSymmetric + } + } + return +} + +func (o *ObservedAddrManager) Close() error { + o.ctxCancel() + o.wg.Wait() + return nil } diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/opts.go b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/opts.go index f18866568..bd0fd896b 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/opts.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/opts.go @@ -1,10 +1,11 @@ package identify type config struct { - protocolVersion string - userAgent string - disableSignedPeerRecord bool - metricsTracer MetricsTracer + protocolVersion string + userAgent string + disableSignedPeerRecord bool + metricsTracer MetricsTracer + disableObservedAddrManager bool } // Option is an option function for identify. @@ -38,3 +39,11 @@ func WithMetricsTracer(tr MetricsTracer) Option { cfg.metricsTracer = tr } } + +// DisableObservedAddrManager disables the observed address manager. It also +// effectively disables the nat emitter and EvtNATDeviceTypeChanged +func DisableObservedAddrManager() Option { + return func(cfg *config) { + cfg.disableObservedAddrManager = true + } +} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/ping/ping.go b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/ping/ping.go index 6ff5c3fb6..9a6771559 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/ping/ping.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/ping/ping.go @@ -111,7 +111,7 @@ func pingError(err error) chan Result { // Ping pings the remote peer until the context is canceled, returning a stream // of RTTs or errors. func Ping(ctx context.Context, h host.Host, p peer.ID) <-chan Result { - s, err := h.NewStream(network.WithUseTransient(ctx, "ping"), p, ID) + s, err := h.NewStream(network.WithAllowLimitedConn(ctx, "ping"), p, ID) if err != nil { return pingError(err) } @@ -158,11 +158,10 @@ func Ping(ctx context.Context, h host.Host, p peer.ID) <-chan Result { } } }() - go func() { + context.AfterFunc(ctx, func() { // forces the ping to abort. - <-ctx.Done() s.Reset() - }() + }) return out } diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/security/noise/LICENSE.md b/vendor/github.com/libp2p/go-libp2p/p2p/security/noise/LICENSE.md deleted file mode 100644 index 15601cba6..000000000 --- a/vendor/github.com/libp2p/go-libp2p/p2p/security/noise/LICENSE.md +++ /dev/null @@ -1,229 +0,0 @@ -The contents of this repository are Copyright (c) corresponding authors and -contributors, licensed under the `Permissive License Stack` meaning either of: - -- Apache-2.0 Software License: https://www.apache.org/licenses/LICENSE-2.0 - ([...4tr2kfsq](https://gateway.ipfs.io/ipfs/bafkreiankqxazcae4onkp436wag2lj3ccso4nawxqkkfckd6cg4tr2kfsq)) - -- MIT Software License: https://opensource.org/licenses/MIT - ([...vljevcba](https://gateway.ipfs.io/ipfs/bafkreiepofszg4gfe2gzuhojmksgemsub2h4uy2gewdnr35kswvljevcba)) - -You may not use the contents of this repository except in compliance -with one of the listed Licenses. For an extended clarification of the -intent behind the choice of Licensing please refer to -https://protocol.ai/blog/announcing-the-permissive-license-stack/ - -Unless required by applicable law or agreed to in writing, software -distributed under the terms listed in this notice is distributed on -an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, -either express or implied. See each License for the specific language -governing permissions and limitations under that License. - - -`SPDX-License-Identifier: Apache-2.0 OR MIT` - -Verbatim copies of both licenses are included below: - -
Apache-2.0 Software License - -``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS -``` -
- -
MIT Software License - -``` -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -``` -
diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/security/noise/handshake.go b/vendor/github.com/libp2p/go-libp2p/p2p/security/noise/handshake.go index a9493bf8d..476076843 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/security/noise/handshake.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/security/noise/handshake.go @@ -5,7 +5,6 @@ import ( "crypto/rand" "encoding/binary" "fmt" - "hash" "os" "runtime/debug" "time" @@ -13,7 +12,6 @@ import ( "github.com/libp2p/go-libp2p/core/crypto" "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/sec" - "github.com/libp2p/go-libp2p/internal/sha256" "github.com/libp2p/go-libp2p/p2p/security/noise/pb" "github.com/flynn/noise" @@ -27,15 +25,8 @@ import ( // our libp2p identity key. const payloadSigPrefix = "noise-libp2p-static-key:" -type minioSHAFn struct{} - -func (h minioSHAFn) Hash() hash.Hash { return sha256.New() } -func (h minioSHAFn) HashName() string { return "SHA256" } - -var shaHashFn noise.HashFunc = minioSHAFn{} - // All noise session share a fixed cipher suite -var cipherSuite = noise.NewCipherSuite(noise.DH25519, noise.CipherChaChaPoly, shaHashFn) +var cipherSuite = noise.NewCipherSuite(noise.DH25519, noise.CipherChaChaPoly, noise.HashSHA256) // runHandshake exchanges handshake messages with the remote peer to establish // a noise-libp2p session. It blocks until the handshake completes or fails. diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/security/tls/crypto.go b/vendor/github.com/libp2p/go-libp2p/p2p/security/tls/crypto.go index 385de5a16..70a594d06 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/security/tls/crypto.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/security/tls/crypto.go @@ -11,6 +11,7 @@ import ( "encoding/asn1" "errors" "fmt" + "io" "math/big" "os" "runtime/debug" @@ -41,6 +42,7 @@ type Identity struct { // IdentityConfig is used to configure an Identity type IdentityConfig struct { CertTemplate *x509.Certificate + KeyLogWriter io.Writer } // IdentityOption transforms an IdentityConfig to apply optional settings. @@ -53,6 +55,18 @@ func WithCertTemplate(template *x509.Certificate) IdentityOption { } } +// WithKeyLogWriter optionally specifies a destination for TLS master secrets +// in NSS key log format that can be used to allow external programs +// such as Wireshark to decrypt TLS connections. +// See https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format. +// Use of KeyLogWriter compromises security and should only be +// used for debugging. +func WithKeyLogWriter(w io.Writer) IdentityOption { + return func(c *IdentityConfig) { + c.KeyLogWriter = w + } +} + // NewIdentity creates a new identity func NewIdentity(privKey ic.PrivKey, opts ...IdentityOption) (*Identity, error) { config := IdentityConfig{} @@ -83,6 +97,7 @@ func NewIdentity(privKey ic.PrivKey, opts ...IdentityOption) (*Identity, error) }, NextProtos: []string{alpn}, SessionTicketsDisabled: true, + KeyLogWriter: config.KeyLogWriter, }, }, nil } diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/security/tls/transport.go b/vendor/github.com/libp2p/go-libp2p/p2p/security/tls/transport.go index 7c28efe37..0c494a7fd 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/security/tls/transport.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/security/tls/transport.go @@ -113,7 +113,7 @@ func (t *Transport) SecureOutbound(ctx context.Context, insecure net.Conn, p pee for _, muxer := range t.muxers { muxers = append(muxers, (string)(muxer)) } - // Prepend the prefered muxers list to TLS config. + // Prepend the preferred muxers list to TLS config. config.NextProtos = append(muxers, config.NextProtos...) cs, err := t.handshake(ctx, tls.Client(insecure, config), keyCh) if err != nil { diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/quicreuse/config.go b/vendor/github.com/libp2p/go-libp2p/p2p/transport/quicreuse/config.go index 45b1d4b8c..92c881ef7 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/transport/quicreuse/config.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/quicreuse/config.go @@ -1,7 +1,6 @@ package quicreuse import ( - "net" "time" "github.com/quic-go/quic-go" @@ -12,12 +11,8 @@ var quicConfig = &quic.Config{ MaxIncomingUniStreams: 5, // allow some unidirectional streams, in case we speak WebTransport MaxStreamReceiveWindow: 10 * (1 << 20), // 10 MB MaxConnectionReceiveWindow: 15 * (1 << 20), // 15 MB - RequireAddressValidation: func(net.Addr) bool { - // TODO(#1535): require source address validation when under load - return false - }, - KeepAlivePeriod: 15 * time.Second, - Versions: []quic.VersionNumber{quic.Version1}, + KeepAlivePeriod: 15 * time.Second, + Versions: []quic.VersionNumber{quic.Version1}, // We don't use datagrams (yet), but this is necessary for WebTransport EnableDatagrams: true, } diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/quicreuse/connmgr.go b/vendor/github.com/libp2p/go-libp2p/p2p/transport/quicreuse/connmgr.go index 0add5ddfc..ec2b7b280 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/transport/quicreuse/connmgr.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/quicreuse/connmgr.go @@ -222,3 +222,7 @@ func (c *ConnManager) Close() error { } return c.reuseUDP4.Close() } + +func (c *ConnManager) ClientConfig() *quic.Config { + return c.clientConfig +} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/tcp/metrics.go b/vendor/github.com/libp2p/go-libp2p/p2p/transport/tcp/metrics.go index 8e7308f3a..4434b037b 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/transport/tcp/metrics.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/tcp/metrics.go @@ -1,4 +1,4 @@ -//go:build !windows && !riscv64 +//go:build !windows && !riscv64 && !loong64 package tcp diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/tcp/metrics_general.go b/vendor/github.com/libp2p/go-libp2p/p2p/transport/tcp/metrics_general.go index e9868609f..419fff360 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/transport/tcp/metrics_general.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/tcp/metrics_general.go @@ -1,4 +1,4 @@ -//go:build !linux && !darwin && !windows && !riscv64 +//go:build !linux && !darwin && !windows && !riscv64 && !loong64 package tcp diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/tcp/metrics_none.go b/vendor/github.com/libp2p/go-libp2p/p2p/transport/tcp/metrics_none.go index 01cf3e9c5..8538b30c8 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/transport/tcp/metrics_none.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/tcp/metrics_none.go @@ -1,6 +1,6 @@ // riscv64 see: https://github.com/marten-seemann/tcp/pull/1 -//go:build windows || riscv64 +//go:build windows || riscv64 || loong64 package tcp diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/connection.go b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/connection.go new file mode 100644 index 000000000..cd28ec320 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/connection.go @@ -0,0 +1,255 @@ +package libp2pwebrtc + +import ( + "context" + "errors" + "fmt" + "math" + "net" + "sync" + "sync/atomic" + + ic "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + tpt "github.com/libp2p/go-libp2p/core/transport" + + ma "github.com/multiformats/go-multiaddr" + "github.com/pion/datachannel" + "github.com/pion/webrtc/v3" +) + +var _ tpt.CapableConn = &connection{} + +const maxAcceptQueueLen = 256 + +type errConnectionTimeout struct{} + +var _ net.Error = &errConnectionTimeout{} + +func (errConnectionTimeout) Error() string { return "connection timeout" } +func (errConnectionTimeout) Timeout() bool { return true } +func (errConnectionTimeout) Temporary() bool { return false } + +type dataChannel struct { + stream datachannel.ReadWriteCloser + channel *webrtc.DataChannel +} + +type connection struct { + pc *webrtc.PeerConnection + transport *WebRTCTransport + scope network.ConnManagementScope + + closeOnce sync.Once + closeErr error + + localPeer peer.ID + localMultiaddr ma.Multiaddr + + remotePeer peer.ID + remoteKey ic.PubKey + remoteMultiaddr ma.Multiaddr + + m sync.Mutex + streams map[uint16]*stream + nextStreamID atomic.Int32 + + acceptQueue chan dataChannel + + ctx context.Context + cancel context.CancelFunc +} + +func newConnection( + direction network.Direction, + pc *webrtc.PeerConnection, + transport *WebRTCTransport, + scope network.ConnManagementScope, + + localPeer peer.ID, + localMultiaddr ma.Multiaddr, + + remotePeer peer.ID, + remoteKey ic.PubKey, + remoteMultiaddr ma.Multiaddr, + incomingDataChannels chan dataChannel, +) (*connection, error) { + ctx, cancel := context.WithCancel(context.Background()) + c := &connection{ + pc: pc, + transport: transport, + scope: scope, + + localPeer: localPeer, + localMultiaddr: localMultiaddr, + + remotePeer: remotePeer, + remoteKey: remoteKey, + remoteMultiaddr: remoteMultiaddr, + ctx: ctx, + cancel: cancel, + streams: make(map[uint16]*stream), + + acceptQueue: incomingDataChannels, + } + switch direction { + case network.DirInbound: + c.nextStreamID.Store(1) + case network.DirOutbound: + // stream ID 0 is used for the Noise handshake stream + c.nextStreamID.Store(2) + } + + pc.OnConnectionStateChange(c.onConnectionStateChange) + return c, nil +} + +// ConnState implements transport.CapableConn +func (c *connection) ConnState() network.ConnectionState { + return network.ConnectionState{Transport: "webrtc-direct"} +} + +// Close closes the underlying peerconnection. +func (c *connection) Close() error { + c.closeOnce.Do(func() { c.closeWithError(errors.New("connection closed")) }) + return nil +} + +// closeWithError is used to Close the connection when the underlying DTLS connection fails +func (c *connection) closeWithError(err error) { + c.closeErr = err + // cancel must be called after closeErr is set. This ensures interested goroutines waiting on + // ctx.Done can read closeErr without holding the conn lock. + c.cancel() + // closing peerconnection will close the datachannels associated with the streams + c.pc.Close() + + c.m.Lock() + streams := c.streams + c.streams = nil + c.m.Unlock() + for _, s := range streams { + s.closeForShutdown(err) + } + c.scope.Done() +} + +func (c *connection) IsClosed() bool { + return c.ctx.Err() != nil +} + +func (c *connection) OpenStream(ctx context.Context) (network.MuxedStream, error) { + if c.IsClosed() { + return nil, c.closeErr + } + + id := c.nextStreamID.Add(2) - 2 + if id > math.MaxUint16 { + return nil, errors.New("exhausted stream ID space") + } + streamID := uint16(id) + dc, err := c.pc.CreateDataChannel("", &webrtc.DataChannelInit{ID: &streamID}) + if err != nil { + return nil, err + } + rwc, err := c.detachChannel(ctx, dc) + if err != nil { + dc.Close() + return nil, fmt.Errorf("detach channel failed for stream(%d): %w", streamID, err) + } + str := newStream(dc, rwc, func() { c.removeStream(streamID) }) + if err := c.addStream(str); err != nil { + str.Reset() + return nil, fmt.Errorf("failed to add stream(%d) to connection: %w", streamID, err) + } + return str, nil +} + +func (c *connection) AcceptStream() (network.MuxedStream, error) { + select { + case <-c.ctx.Done(): + return nil, c.closeErr + case dc := <-c.acceptQueue: + str := newStream(dc.channel, dc.stream, func() { c.removeStream(*dc.channel.ID()) }) + if err := c.addStream(str); err != nil { + str.Reset() + return nil, err + } + return str, nil + } +} + +func (c *connection) LocalPeer() peer.ID { return c.localPeer } +func (c *connection) RemotePeer() peer.ID { return c.remotePeer } +func (c *connection) RemotePublicKey() ic.PubKey { return c.remoteKey } +func (c *connection) LocalMultiaddr() ma.Multiaddr { return c.localMultiaddr } +func (c *connection) RemoteMultiaddr() ma.Multiaddr { return c.remoteMultiaddr } +func (c *connection) Scope() network.ConnScope { return c.scope } +func (c *connection) Transport() tpt.Transport { return c.transport } + +func (c *connection) addStream(str *stream) error { + c.m.Lock() + defer c.m.Unlock() + if c.streams == nil { + return c.closeErr + } + if _, ok := c.streams[str.id]; ok { + return errors.New("stream ID already exists") + } + c.streams[str.id] = str + return nil +} + +func (c *connection) removeStream(id uint16) { + c.m.Lock() + defer c.m.Unlock() + delete(c.streams, id) +} + +func (c *connection) onConnectionStateChange(state webrtc.PeerConnectionState) { + if state == webrtc.PeerConnectionStateFailed || state == webrtc.PeerConnectionStateClosed { + c.closeOnce.Do(func() { + c.closeWithError(errConnectionTimeout{}) + }) + } +} + +// detachChannel detaches an outgoing channel by taking into account the context +// passed to `OpenStream` as well the closure of the underlying peerconnection +// +// The underlying SCTP stream for a datachannel implements a net.Conn interface. +// However, the datachannel creates a goroutine which continuously reads from +// the SCTP stream and surfaces the data using an OnMessage callback. +// +// The actual abstractions are as follows: webrtc.DataChannel +// wraps pion.DataChannel, which wraps sctp.Stream. +// +// The goroutine for reading, Detach method, +// and the OnMessage callback are present at the webrtc.DataChannel level. +// Detach provides us abstracted access to the underlying pion.DataChannel, +// which allows us to issue Read calls to the datachannel. +// This was desired because it was not feasible to introduce backpressure +// with the OnMessage callbacks. The tradeoff is a change in the semantics of +// the OnOpen callback, and having to force close Read locally. +func (c *connection) detachChannel(ctx context.Context, dc *webrtc.DataChannel) (datachannel.ReadWriteCloser, error) { + done := make(chan struct{}) + + var rwc datachannel.ReadWriteCloser + var err error + // OnOpen will return immediately for detached datachannels + // refer: https://github.com/pion/webrtc/blob/7ab3174640b3ce15abebc2516a2ca3939b5f105f/datachannel.go#L278-L282 + dc.OnOpen(func() { + rwc, err = dc.Detach() + // this is safe since the function should return instantly if the peerconnection is closed + close(done) + }) + select { + case <-c.ctx.Done(): + return nil, c.closeErr + case <-ctx.Done(): + return nil, ctx.Err() + case <-done: + return rwc, err + } +} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/fingerprint.go b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/fingerprint.go new file mode 100644 index 000000000..fd715865a --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/fingerprint.go @@ -0,0 +1,53 @@ +package libp2pwebrtc + +import ( + "crypto" + "crypto/x509" + "errors" + + ma "github.com/multiformats/go-multiaddr" + "github.com/multiformats/go-multibase" + mh "github.com/multiformats/go-multihash" + "github.com/pion/webrtc/v3" +) + +// parseFingerprint is forked from pion to avoid bytes to string alloc, +// and to avoid the entire hex interspersing when we do not need it anyway + +var errHashUnavailable = errors.New("fingerprint: hash algorithm is not linked into the binary") + +// parseFingerprint creates a fingerprint for a certificate using the specified hash algorithm +func parseFingerprint(cert *x509.Certificate, algo crypto.Hash) ([]byte, error) { + if !algo.Available() { + return nil, errHashUnavailable + } + h := algo.New() + // Hash.Writer is specified to be never returning an error. + // https://golang.org/pkg/hash/#Hash + h.Write(cert.Raw) + return h.Sum(nil), nil +} + +func decodeRemoteFingerprint(maddr ma.Multiaddr) (*mh.DecodedMultihash, error) { + remoteFingerprintMultibase, err := maddr.ValueForProtocol(ma.P_CERTHASH) + if err != nil { + return nil, err + } + _, data, err := multibase.Decode(remoteFingerprintMultibase) + if err != nil { + return nil, err + } + return mh.Decode(data) +} + +func encodeDTLSFingerprint(fp webrtc.DTLSFingerprint) (string, error) { + digest, err := decodeInterspersedHexFromASCIIString(fp.Value) + if err != nil { + return "", err + } + encoded, err := mh.Encode(digest, mh.SHA2_256) + if err != nil { + return "", err + } + return multibase.Encode(multibase.Base64url, encoded) +} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/hex.go b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/hex.go new file mode 100644 index 000000000..482036540 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/hex.go @@ -0,0 +1,70 @@ +package libp2pwebrtc + +// The code in this file is adapted from the Go standard library's hex package. +// As found in https://cs.opensource.google/go/go/+/refs/tags/go1.20.2:src/encoding/hex/hex.go +// +// The reason we adapted the original code is to allow us to deal with interspersed requirements +// while at the same time hex encoding/decoding, without having to do so in two passes. + +import ( + "encoding/hex" + "errors" +) + +// encodeInterspersedHex encodes a byte slice into a string of hex characters, +// separating each encoded byte with a colon (':'). +// +// Example: { 0x01, 0x02, 0x03 } -> "01:02:03" +func encodeInterspersedHex(src []byte) string { + if len(src) == 0 { + return "" + } + s := hex.EncodeToString(src) + n := len(s) + // Determine number of colons + colons := n / 2 + if n%2 == 0 { + colons-- + } + buffer := make([]byte, n+colons) + + for i, j := 0, 0; i < n; i, j = i+2, j+3 { + copy(buffer[j:j+2], s[i:i+2]) + if j+3 < len(buffer) { + buffer[j+2] = ':' + } + } + return string(buffer) +} + +var errUnexpectedIntersperseHexChar = errors.New("unexpected character in interspersed hex string") + +// decodeInterspersedHexFromASCIIString decodes an ASCII string of hex characters into a byte slice, +// where the hex characters are expected to be separated by a colon (':'). +// +// NOTE that this function returns an error in case the input string contains non-ASCII characters. +// +// Example: "01:02:03" -> { 0x01, 0x02, 0x03 } +func decodeInterspersedHexFromASCIIString(s string) ([]byte, error) { + n := len(s) + buffer := make([]byte, n/3*2+n%3) + j := 0 + for i := 0; i < n; i++ { + if i%3 == 2 { + if s[i] != ':' { + return nil, errUnexpectedIntersperseHexChar + } + } else { + if s[i] == ':' { + return nil, errUnexpectedIntersperseHexChar + } + buffer[j] = s[i] + j++ + } + } + dst := make([]byte, hex.DecodedLen(len(buffer))) + if _, err := hex.Decode(dst, buffer); err != nil { + return nil, err + } + return dst, nil +} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/listener.go b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/listener.go new file mode 100644 index 000000000..1834fc812 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/listener.go @@ -0,0 +1,350 @@ +package libp2pwebrtc + +import ( + "context" + "crypto" + "encoding/hex" + "errors" + "fmt" + "net" + "strings" + "sync" + "time" + + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + tpt "github.com/libp2p/go-libp2p/core/transport" + "github.com/libp2p/go-libp2p/p2p/transport/webrtc/udpmux" + + ma "github.com/multiformats/go-multiaddr" + manet "github.com/multiformats/go-multiaddr/net" + "github.com/multiformats/go-multibase" + "github.com/multiformats/go-multihash" + "github.com/pion/webrtc/v3" +) + +type connMultiaddrs struct { + local, remote ma.Multiaddr +} + +var _ network.ConnMultiaddrs = &connMultiaddrs{} + +func (c *connMultiaddrs) LocalMultiaddr() ma.Multiaddr { return c.local } +func (c *connMultiaddrs) RemoteMultiaddr() ma.Multiaddr { return c.remote } + +const ( + candidateSetupTimeout = 20 * time.Second + DefaultMaxInFlightConnections = 10 +) + +type listener struct { + transport *WebRTCTransport + + mux *udpmux.UDPMux + + config webrtc.Configuration + localFingerprint webrtc.DTLSFingerprint + localFingerprintMultibase string + + localAddr net.Addr + localMultiaddr ma.Multiaddr + + // buffered incoming connections + acceptQueue chan tpt.CapableConn + + // used to control the lifecycle of the listener + ctx context.Context + cancel context.CancelFunc + wg sync.WaitGroup +} + +var _ tpt.Listener = &listener{} + +func newListener(transport *WebRTCTransport, laddr ma.Multiaddr, socket net.PacketConn, config webrtc.Configuration) (*listener, error) { + localFingerprints, err := config.Certificates[0].GetFingerprints() + if err != nil { + return nil, err + } + + localMh, err := hex.DecodeString(strings.ReplaceAll(localFingerprints[0].Value, ":", "")) + if err != nil { + return nil, err + } + localMhBuf, err := multihash.Encode(localMh, multihash.SHA2_256) + if err != nil { + return nil, err + } + localFpMultibase, err := multibase.Encode(multibase.Base64url, localMhBuf) + if err != nil { + return nil, err + } + + l := &listener{ + transport: transport, + config: config, + localFingerprint: localFingerprints[0], + localFingerprintMultibase: localFpMultibase, + localMultiaddr: laddr, + localAddr: socket.LocalAddr(), + acceptQueue: make(chan tpt.CapableConn), + } + + l.ctx, l.cancel = context.WithCancel(context.Background()) + l.mux = udpmux.NewUDPMux(socket) + l.mux.Start() + + l.wg.Add(1) + go func() { + defer l.wg.Done() + l.listen() + }() + + return l, err +} + +func (l *listener) listen() { + // Accepting a connection requires instantiating a peerconnection and a noise connection + // which is expensive. We therefore limit the number of in-flight connection requests. A + // connection is considered to be in flight from the instant it is handled until it is + // dequeued by a call to Accept, or errors out in some way. + inFlightSemaphore := make(chan struct{}, l.transport.maxInFlightConnections) + for { + select { + case inFlightSemaphore <- struct{}{}: + case <-l.ctx.Done(): + return + } + + candidate, err := l.mux.Accept(l.ctx) + if err != nil { + if l.ctx.Err() == nil { + log.Debugf("accepting candidate failed: %s", err) + } + return + } + + go func() { + defer func() { <-inFlightSemaphore }() + + ctx, cancel := context.WithTimeout(l.ctx, candidateSetupTimeout) + defer cancel() + + conn, err := l.handleCandidate(ctx, candidate) + if err != nil { + l.mux.RemoveConnByUfrag(candidate.Ufrag) + log.Debugf("could not accept connection: %s: %v", candidate.Ufrag, err) + return + } + + select { + case <-ctx.Done(): + log.Warn("could not push connection: ctx done") + conn.Close() + case l.acceptQueue <- conn: + // acceptQueue is an unbuffered channel, so this blocks until the connection is accepted. + } + }() + } +} + +func (l *listener) handleCandidate(ctx context.Context, candidate udpmux.Candidate) (tpt.CapableConn, error) { + remoteMultiaddr, err := manet.FromNetAddr(candidate.Addr) + if err != nil { + return nil, err + } + if l.transport.gater != nil { + localAddr, _ := ma.SplitFunc(l.localMultiaddr, func(c ma.Component) bool { return c.Protocol().Code == ma.P_CERTHASH }) + if !l.transport.gater.InterceptAccept(&connMultiaddrs{local: localAddr, remote: remoteMultiaddr}) { + // The connection attempt is rejected before we can send the client an error. + // This means that the connection attempt will time out. + return nil, errors.New("connection gated") + } + } + scope, err := l.transport.rcmgr.OpenConnection(network.DirInbound, false, remoteMultiaddr) + if err != nil { + return nil, err + } + conn, err := l.setupConnection(ctx, scope, remoteMultiaddr, candidate) + if err != nil { + scope.Done() + return nil, err + } + if l.transport.gater != nil && !l.transport.gater.InterceptSecured(network.DirInbound, conn.RemotePeer(), conn) { + conn.Close() + return nil, errors.New("connection gated") + } + return conn, nil +} + +func (l *listener) setupConnection( + ctx context.Context, scope network.ConnManagementScope, + remoteMultiaddr ma.Multiaddr, candidate udpmux.Candidate, +) (tConn tpt.CapableConn, err error) { + var w webRTCConnection + defer func() { + if err != nil { + if w.PeerConnection != nil { + _ = w.PeerConnection.Close() + } + if tConn != nil { + _ = tConn.Close() + } + } + }() + + settingEngine := webrtc.SettingEngine{LoggerFactory: pionLoggerFactory} + settingEngine.SetAnsweringDTLSRole(webrtc.DTLSRoleServer) + settingEngine.SetICECredentials(candidate.Ufrag, candidate.Ufrag) + settingEngine.SetLite(true) + settingEngine.SetICEUDPMux(l.mux) + settingEngine.SetIncludeLoopbackCandidate(true) + settingEngine.DisableCertificateFingerprintVerification(true) + settingEngine.SetICETimeouts( + l.transport.peerConnectionTimeouts.Disconnect, + l.transport.peerConnectionTimeouts.Failed, + l.transport.peerConnectionTimeouts.Keepalive, + ) + // This is higher than the path MTU due to a bug in the sctp chunking logic. + // Remove this after https://github.com/pion/sctp/pull/301 is included + // in a release. + settingEngine.SetReceiveMTU(udpmux.ReceiveBufSize) + settingEngine.DetachDataChannels() + settingEngine.SetSCTPMaxReceiveBufferSize(sctpReceiveBufferSize) + if err := scope.ReserveMemory(sctpReceiveBufferSize, network.ReservationPriorityMedium); err != nil { + return nil, err + } + + w, err = newWebRTCConnection(settingEngine, l.config) + if err != nil { + return nil, fmt.Errorf("instantiating peer connection failed: %w", err) + } + + errC := addOnConnectionStateChangeCallback(w.PeerConnection) + // Infer the client SDP from the incoming STUN message by setting the ice-ufrag. + if err := w.PeerConnection.SetRemoteDescription(webrtc.SessionDescription{ + SDP: createClientSDP(candidate.Addr, candidate.Ufrag), + Type: webrtc.SDPTypeOffer, + }); err != nil { + return nil, err + } + answer, err := w.PeerConnection.CreateAnswer(nil) + if err != nil { + return nil, err + } + if err := w.PeerConnection.SetLocalDescription(answer); err != nil { + return nil, err + } + + select { + case <-ctx.Done(): + return nil, ctx.Err() + case err := <-errC: + if err != nil { + return nil, fmt.Errorf("peer connection failed for ufrag: %s", candidate.Ufrag) + } + } + + // Run the noise handshake. + rwc, err := detachHandshakeDataChannel(ctx, w.HandshakeDataChannel) + if err != nil { + return nil, err + } + handshakeChannel := newStream(w.HandshakeDataChannel, rwc, func() {}) + // we do not yet know A's peer ID so accept any inbound + remotePubKey, err := l.transport.noiseHandshake(ctx, w.PeerConnection, handshakeChannel, "", crypto.SHA256, true) + if err != nil { + return nil, err + } + remotePeer, err := peer.IDFromPublicKey(remotePubKey) + if err != nil { + return nil, err + } + // earliest point where we know the remote's peerID + if err := scope.SetPeer(remotePeer); err != nil { + return nil, err + } + + localMultiaddrWithoutCerthash, _ := ma.SplitFunc(l.localMultiaddr, func(c ma.Component) bool { return c.Protocol().Code == ma.P_CERTHASH }) + conn, err := newConnection( + network.DirInbound, + w.PeerConnection, + l.transport, + scope, + l.transport.localPeerId, + localMultiaddrWithoutCerthash, + remotePeer, + remotePubKey, + remoteMultiaddr, + w.IncomingDataChannels, + ) + if err != nil { + return nil, err + } + + return conn, err +} + +func (l *listener) Accept() (tpt.CapableConn, error) { + select { + case <-l.ctx.Done(): + return nil, tpt.ErrListenerClosed + case conn := <-l.acceptQueue: + return conn, nil + } +} + +func (l *listener) Close() error { + select { + case <-l.ctx.Done(): + default: + } + l.cancel() + l.mux.Close() + l.wg.Wait() +loop: + for { + select { + case conn := <-l.acceptQueue: + conn.Close() + default: + break loop + } + } + return nil +} + +func (l *listener) Addr() net.Addr { + return l.localAddr +} + +func (l *listener) Multiaddr() ma.Multiaddr { + return l.localMultiaddr +} + +// addOnConnectionStateChangeCallback adds the OnConnectionStateChange to the PeerConnection. +// The channel returned here: +// * is closed when the state changes to Connection +// * receives an error when the state changes to Failed +// * doesn't receive anything (nor is closed) when the state changes to Disconnected +func addOnConnectionStateChangeCallback(pc *webrtc.PeerConnection) <-chan error { + errC := make(chan error, 1) + var once sync.Once + pc.OnConnectionStateChange(func(state webrtc.PeerConnectionState) { + switch state { + case webrtc.PeerConnectionStateConnected: + once.Do(func() { close(errC) }) + case webrtc.PeerConnectionStateFailed: + once.Do(func() { + errC <- errors.New("peerconnection failed") + close(errC) + }) + case webrtc.PeerConnectionStateDisconnected: + // the connection can move to a disconnected state and back to a connected state without ICE renegotiation. + // This could happen when underlying UDP packets are lost, and therefore the connection moves to the disconnected state. + // If the connection then receives packets on the connection, it can move back to the connected state. + // If no packets are received until the failed timeout is triggered, the connection moves to the failed state. + log.Warn("peerconnection disconnected") + } + }) + return errC +} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/logger.go b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/logger.go new file mode 100644 index 000000000..ac9fab767 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/logger.go @@ -0,0 +1,58 @@ +package libp2pwebrtc + +import ( + logging "github.com/ipfs/go-log/v2" + pionLogging "github.com/pion/logging" +) + +var log = logging.Logger("webrtc-transport") + +// pionLog is the logger provided to pion for internal logging +var pionLog = logging.Logger("webrtc-transport-pion") + +// pionLogger wraps the StandardLogger interface to provide a LeveledLogger interface +// as expected by pion +type pionLogger struct { + logging.StandardLogger +} + +var pLog = pionLogger{pionLog} + +var _ pionLogging.LeveledLogger = pLog + +func (l pionLogger) Debug(s string) { + l.StandardLogger.Debug(s) +} + +func (l pionLogger) Error(s string) { + l.StandardLogger.Error(s) +} + +func (l pionLogger) Info(s string) { + l.StandardLogger.Info(s) +} +func (l pionLogger) Warn(s string) { + l.StandardLogger.Warn(s) +} + +func (l pionLogger) Trace(s string) { + l.StandardLogger.Debug(s) +} + +func (l pionLogger) Tracef(s string, args ...interface{}) { + l.StandardLogger.Debugf(s, args...) +} + +// loggerFactory returns pLog for all new logger instances +type loggerFactory struct{} + +// NewLogger returns pLog for all new logger instances. Internally pion creates lots of +// separate logging objects unnecessarily. To avoid the allocations we use a single log +// object for all of pion logging. +func (loggerFactory) NewLogger(scope string) pionLogging.LeveledLogger { + return pLog +} + +var _ pionLogging.LoggerFactory = loggerFactory{} + +var pionLoggerFactory = loggerFactory{} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/message.go b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/message.go new file mode 100644 index 000000000..8b57fc807 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/message.go @@ -0,0 +1,3 @@ +package libp2pwebrtc + +//go:generate protoc --go_out=. --go_opt=Mpb/message.proto=./pb pb/message.proto diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/pb/generate.go b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/pb/generate.go new file mode 100644 index 000000000..5785a9525 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/pb/generate.go @@ -0,0 +1,3 @@ +package pb + +//go:generate protoc --go_out=. --go_opt=paths=source_relative -I . message.proto diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/pb/message.pb.go b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/pb/message.pb.go new file mode 100644 index 000000000..384bddd28 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/pb/message.pb.go @@ -0,0 +1,231 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.30.0 +// protoc v3.21.12 +// source: message.proto + +package pb + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Message_Flag int32 + +const ( + // The sender will no longer send messages on the stream. + Message_FIN Message_Flag = 0 + // The sender will no longer read messages on the stream. Incoming data is + // being discarded on receipt. + Message_STOP_SENDING Message_Flag = 1 + // The sender abruptly terminates the sending part of the stream. The + // receiver can discard any data that it already received on that stream. + Message_RESET Message_Flag = 2 + // Sending the FIN_ACK flag acknowledges the previous receipt of a message + // with the FIN flag set. Receiving a FIN_ACK flag gives the recipient + // confidence that the remote has received all sent messages. + Message_FIN_ACK Message_Flag = 3 +) + +// Enum value maps for Message_Flag. +var ( + Message_Flag_name = map[int32]string{ + 0: "FIN", + 1: "STOP_SENDING", + 2: "RESET", + 3: "FIN_ACK", + } + Message_Flag_value = map[string]int32{ + "FIN": 0, + "STOP_SENDING": 1, + "RESET": 2, + "FIN_ACK": 3, + } +) + +func (x Message_Flag) Enum() *Message_Flag { + p := new(Message_Flag) + *p = x + return p +} + +func (x Message_Flag) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Message_Flag) Descriptor() protoreflect.EnumDescriptor { + return file_message_proto_enumTypes[0].Descriptor() +} + +func (Message_Flag) Type() protoreflect.EnumType { + return &file_message_proto_enumTypes[0] +} + +func (x Message_Flag) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *Message_Flag) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = Message_Flag(num) + return nil +} + +// Deprecated: Use Message_Flag.Descriptor instead. +func (Message_Flag) EnumDescriptor() ([]byte, []int) { + return file_message_proto_rawDescGZIP(), []int{0, 0} +} + +type Message struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Flag *Message_Flag `protobuf:"varint,1,opt,name=flag,enum=Message_Flag" json:"flag,omitempty"` + Message []byte `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"` +} + +func (x *Message) Reset() { + *x = Message{} + if protoimpl.UnsafeEnabled { + mi := &file_message_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Message) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Message) ProtoMessage() {} + +func (x *Message) ProtoReflect() protoreflect.Message { + mi := &file_message_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Message.ProtoReflect.Descriptor instead. +func (*Message) Descriptor() ([]byte, []int) { + return file_message_proto_rawDescGZIP(), []int{0} +} + +func (x *Message) GetFlag() Message_Flag { + if x != nil && x.Flag != nil { + return *x.Flag + } + return Message_FIN +} + +func (x *Message) GetMessage() []byte { + if x != nil { + return x.Message + } + return nil +} + +var File_message_proto protoreflect.FileDescriptor + +var file_message_proto_rawDesc = []byte{ + 0x0a, 0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, + 0x81, 0x01, 0x0a, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x04, 0x66, + 0x6c, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x2e, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x04, 0x66, 0x6c, 0x61, 0x67, 0x12, 0x18, + 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x39, 0x0a, 0x04, 0x46, 0x6c, 0x61, 0x67, + 0x12, 0x07, 0x0a, 0x03, 0x46, 0x49, 0x4e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x4f, + 0x50, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, + 0x45, 0x53, 0x45, 0x54, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x46, 0x49, 0x4e, 0x5f, 0x41, 0x43, + 0x4b, 0x10, 0x03, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2f, 0x67, 0x6f, 0x2d, 0x6c, 0x69, 0x62, 0x70, + 0x32, 0x70, 0x2f, 0x70, 0x32, 0x70, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, + 0x2f, 0x77, 0x65, 0x62, 0x72, 0x74, 0x63, 0x2f, 0x70, 0x62, +} + +var ( + file_message_proto_rawDescOnce sync.Once + file_message_proto_rawDescData = file_message_proto_rawDesc +) + +func file_message_proto_rawDescGZIP() []byte { + file_message_proto_rawDescOnce.Do(func() { + file_message_proto_rawDescData = protoimpl.X.CompressGZIP(file_message_proto_rawDescData) + }) + return file_message_proto_rawDescData +} + +var file_message_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_message_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_message_proto_goTypes = []interface{}{ + (Message_Flag)(0), // 0: Message.Flag + (*Message)(nil), // 1: Message +} +var file_message_proto_depIdxs = []int32{ + 0, // 0: Message.flag:type_name -> Message.Flag + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_message_proto_init() } +func file_message_proto_init() { + if File_message_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_message_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Message); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_message_proto_rawDesc, + NumEnums: 1, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_message_proto_goTypes, + DependencyIndexes: file_message_proto_depIdxs, + EnumInfos: file_message_proto_enumTypes, + MessageInfos: file_message_proto_msgTypes, + }.Build() + File_message_proto = out.File + file_message_proto_rawDesc = nil + file_message_proto_goTypes = nil + file_message_proto_depIdxs = nil +} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/pb/message.proto b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/pb/message.proto new file mode 100644 index 000000000..aab885b0d --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/pb/message.proto @@ -0,0 +1,24 @@ +syntax = "proto2"; + +option go_package = "github.com/libp2p/go-libp2p/p2p/transport/webrtc/pb"; + +message Message { + enum Flag { + // The sender will no longer send messages on the stream. + FIN = 0; + // The sender will no longer read messages on the stream. Incoming data is + // being discarded on receipt. + STOP_SENDING = 1; + // The sender abruptly terminates the sending part of the stream. The + // receiver can discard any data that it already received on that stream. + RESET = 2; + // Sending the FIN_ACK flag acknowledges the previous receipt of a message + // with the FIN flag set. Receiving a FIN_ACK flag gives the recipient + // confidence that the remote has received all sent messages. + FIN_ACK = 3; + } + + optional Flag flag=1; + + optional bytes message = 2; +} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/sdp.go b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/sdp.go new file mode 100644 index 000000000..878b668a1 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/sdp.go @@ -0,0 +1,143 @@ +package libp2pwebrtc + +import ( + "crypto" + "fmt" + "net" + "strings" + + "github.com/multiformats/go-multihash" +) + +// clientSDP describes an SDP format string which can be used +// to infer a client's SDP offer from the incoming STUN message. +// The fingerprint used to render a client SDP is arbitrary since +// it fingerprint verification is disabled in favour of a noise +// handshake. The max message size is fixed to 16384 bytes. +const clientSDP = `v=0 +o=- 0 0 IN %[1]s %[2]s +s=- +c=IN %[1]s %[2]s +t=0 0 + +m=application %[3]d UDP/DTLS/SCTP webrtc-datachannel +a=mid:0 +a=ice-options:ice2 +a=ice-ufrag:%[4]s +a=ice-pwd:%[4]s +a=fingerprint:sha-256 ba:78:16:bf:8f:01:cf:ea:41:41:40:de:5d:ae:22:23:b0:03:61:a3:96:17:7a:9c:b4:10:ff:61:f2:00:15:ad +a=setup:actpass +a=sctp-port:5000 +a=max-message-size:16384 +` + +func createClientSDP(addr *net.UDPAddr, ufrag string) string { + ipVersion := "IP4" + if addr.IP.To4() == nil { + ipVersion = "IP6" + } + return fmt.Sprintf( + clientSDP, + ipVersion, + addr.IP, + addr.Port, + ufrag, + ) +} + +// serverSDP defines an SDP format string used by a dialer +// to infer the SDP answer of a server based on the provided +// multiaddr, and the locally set ICE credentials. The max +// message size is fixed to 16384 bytes. +const serverSDP = `v=0 +o=- 0 0 IN %[1]s %[2]s +s=- +t=0 0 +a=ice-lite +m=application %[3]d UDP/DTLS/SCTP webrtc-datachannel +c=IN %[1]s %[2]s +a=mid:0 +a=ice-options:ice2 +a=ice-ufrag:%[4]s +a=ice-pwd:%[4]s +a=fingerprint:%[5]s + +a=setup:passive +a=sctp-port:5000 +a=max-message-size:16384 +a=candidate:1 1 UDP 1 %[2]s %[3]d typ host +a=end-of-candidates +` + +func createServerSDP(addr *net.UDPAddr, ufrag string, fingerprint multihash.DecodedMultihash) (string, error) { + ipVersion := "IP4" + if addr.IP.To4() == nil { + ipVersion = "IP6" + } + + sdpString, err := getSupportedSDPString(fingerprint.Code) + if err != nil { + return "", err + } + + var builder strings.Builder + builder.Grow(len(fingerprint.Digest)*3 + 8) + builder.WriteString(sdpString) + builder.WriteByte(' ') + builder.WriteString(encodeInterspersedHex(fingerprint.Digest)) + fp := builder.String() + + return fmt.Sprintf( + serverSDP, + ipVersion, + addr.IP, + addr.Port, + ufrag, + fp, + ), nil +} + +// getSupportedSDPHash converts a multihash code to the +// corresponding crypto.Hash for supported protocols. If a +// crypto.Hash cannot be found, it returns `(0, false)` +func getSupportedSDPHash(code uint64) (crypto.Hash, bool) { + switch code { + case multihash.MD5: + return crypto.MD5, true + case multihash.SHA1: + return crypto.SHA1, true + case multihash.SHA3_224: + return crypto.SHA3_224, true + case multihash.SHA2_256: + return crypto.SHA256, true + case multihash.SHA3_384: + return crypto.SHA3_384, true + case multihash.SHA2_512: + return crypto.SHA512, true + default: + return 0, false + } +} + +// getSupportedSDPString converts a multihash code +// to a string format recognised by pion for fingerprint +// algorithms +func getSupportedSDPString(code uint64) (string, error) { + // values based on (cryto.Hash).String() + switch code { + case multihash.MD5: + return "md5", nil + case multihash.SHA1: + return "sha-1", nil + case multihash.SHA3_224: + return "sha3-224", nil + case multihash.SHA2_256: + return "sha-256", nil + case multihash.SHA3_384: + return "sha3-384", nil + case multihash.SHA2_512: + return "sha-512", nil + default: + return "", fmt.Errorf("unsupported hash code (%d)", code) + } +} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/stream.go b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/stream.go new file mode 100644 index 000000000..56f869f5e --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/stream.go @@ -0,0 +1,281 @@ +package libp2pwebrtc + +import ( + "errors" + "os" + "sync" + "time" + + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/p2p/transport/webrtc/pb" + "github.com/libp2p/go-msgio/pbio" + + "github.com/pion/datachannel" + "github.com/pion/webrtc/v3" +) + +const ( + // maxMessageSize is the maximum message size of the Protobuf message we send / receive. + maxMessageSize = 16384 + // maxSendBuffer is the maximum data we enqueue on the underlying data channel for writes. + // The underlying SCTP layer has an unbounded buffer for writes. We limit the amount enqueued + // per stream is limited to avoid a single stream monopolizing the entire connection. + maxSendBuffer = 2 * maxMessageSize + // sendBufferLowThreshold is the threshold below which we write more data on the underlying + // data channel. We want a notification as soon as we can write 1 full sized message. + sendBufferLowThreshold = maxSendBuffer - maxMessageSize + // maxTotalControlMessagesSize is the maximum total size of all control messages we will + // write on this stream. + // 4 control messages of size 10 bytes + 10 bytes buffer. This number doesn't need to be + // exact. In the worst case, we enqueue these many bytes more in the webrtc peer connection + // send queue. + maxTotalControlMessagesSize = 50 + + // Proto overhead assumption is 5 bytes + protoOverhead = 5 + // Varint overhead is assumed to be 2 bytes. This is safe since + // 1. This is only used and when writing message, and + // 2. We only send messages in chunks of `maxMessageSize - varintOverhead` + // which includes the data and the protobuf header. Since `maxMessageSize` + // is less than or equal to 2 ^ 14, the varint will not be more than + // 2 bytes in length. + varintOverhead = 2 + // maxFINACKWait is the maximum amount of time a stream will wait to read + // FIN_ACK before closing the data channel + maxFINACKWait = 10 * time.Second +) + +type receiveState uint8 + +const ( + receiveStateReceiving receiveState = iota + receiveStateDataRead // received and read the FIN + receiveStateReset // either by calling CloseRead locally, or by receiving +) + +type sendState uint8 + +const ( + sendStateSending sendState = iota + sendStateDataSent + sendStateDataReceived + sendStateReset +) + +// Package pion detached data channel into a net.Conn +// and then a network.MuxedStream +type stream struct { + mx sync.Mutex + + // readerMx ensures that only a single goroutine reads from the reader. Read is not threadsafe + // But we may need to read from reader for control messages from a different goroutine. + readerMx sync.Mutex + reader pbio.Reader + + // this buffer is limited up to a single message. Reason we need it + // is because a reader might read a message midway, and so we need a + // wait to buffer that for as long as the remaining part is not (yet) read + nextMessage *pb.Message + receiveState receiveState + + writer pbio.Writer // concurrent writes prevented by mx + writeStateChanged chan struct{} + sendState sendState + writeDeadline time.Time + + controlMessageReaderOnce sync.Once + // controlMessageReaderEndTime is the end time for reading FIN_ACK from the control + // message reader. We cannot rely on SetReadDeadline to do this since that is prone to + // race condition where a previous deadline timer fires after the latest call to + // SetReadDeadline + // See: https://github.com/pion/sctp/pull/290 + controlMessageReaderEndTime time.Time + + onDoneOnce sync.Once + onDone func() + id uint16 // for logging purposes + dataChannel *datachannel.DataChannel + closeForShutdownErr error +} + +var _ network.MuxedStream = &stream{} + +func newStream( + channel *webrtc.DataChannel, + rwc datachannel.ReadWriteCloser, + onDone func(), +) *stream { + s := &stream{ + reader: pbio.NewDelimitedReader(rwc, maxMessageSize), + writer: pbio.NewDelimitedWriter(rwc), + writeStateChanged: make(chan struct{}, 1), + id: *channel.ID(), + dataChannel: rwc.(*datachannel.DataChannel), + onDone: onDone, + } + s.dataChannel.SetBufferedAmountLowThreshold(sendBufferLowThreshold) + s.dataChannel.OnBufferedAmountLow(func() { + s.notifyWriteStateChanged() + + }) + return s +} + +func (s *stream) Close() error { + s.mx.Lock() + isClosed := s.closeForShutdownErr != nil + s.mx.Unlock() + if isClosed { + return nil + } + defer s.cleanup() + closeWriteErr := s.CloseWrite() + closeReadErr := s.CloseRead() + if closeWriteErr != nil || closeReadErr != nil { + s.Reset() + return errors.Join(closeWriteErr, closeReadErr) + } + + s.mx.Lock() + if s.controlMessageReaderEndTime.IsZero() { + s.controlMessageReaderEndTime = time.Now().Add(maxFINACKWait) + s.setDataChannelReadDeadline(time.Now().Add(-1 * time.Hour)) + } + s.mx.Unlock() + return nil +} + +func (s *stream) Reset() error { + s.mx.Lock() + isClosed := s.closeForShutdownErr != nil + s.mx.Unlock() + if isClosed { + return nil + } + + defer s.cleanup() + cancelWriteErr := s.cancelWrite() + closeReadErr := s.CloseRead() + s.setDataChannelReadDeadline(time.Now().Add(-1 * time.Hour)) + return errors.Join(closeReadErr, cancelWriteErr) +} + +func (s *stream) closeForShutdown(closeErr error) { + defer s.cleanup() + + s.mx.Lock() + defer s.mx.Unlock() + + s.closeForShutdownErr = closeErr + s.notifyWriteStateChanged() +} + +func (s *stream) SetDeadline(t time.Time) error { + _ = s.SetReadDeadline(t) + return s.SetWriteDeadline(t) +} + +// processIncomingFlag process the flag on an incoming message +// It needs to be called while the mutex is locked. +func (s *stream) processIncomingFlag(flag *pb.Message_Flag) { + if flag == nil { + return + } + + switch *flag { + case pb.Message_STOP_SENDING: + // We must process STOP_SENDING after sending a FIN(sendStateDataSent). Remote peer + // may not send a FIN_ACK once it has sent a STOP_SENDING + if s.sendState == sendStateSending || s.sendState == sendStateDataSent { + s.sendState = sendStateReset + } + s.notifyWriteStateChanged() + case pb.Message_FIN_ACK: + s.sendState = sendStateDataReceived + s.notifyWriteStateChanged() + case pb.Message_FIN: + if s.receiveState == receiveStateReceiving { + s.receiveState = receiveStateDataRead + } + if err := s.writer.WriteMsg(&pb.Message{Flag: pb.Message_FIN_ACK.Enum()}); err != nil { + log.Debugf("failed to send FIN_ACK: %s", err) + // Remote has finished writing all the data It'll stop waiting for the + // FIN_ACK eventually or will be notified when we close the datachannel + } + s.spawnControlMessageReader() + case pb.Message_RESET: + if s.receiveState == receiveStateReceiving { + s.receiveState = receiveStateReset + } + s.spawnControlMessageReader() + } +} + +// spawnControlMessageReader is used for processing control messages after the reader is closed. +func (s *stream) spawnControlMessageReader() { + s.controlMessageReaderOnce.Do(func() { + // Spawn a goroutine to ensure that we're not holding any locks + go func() { + // cleanup the sctp deadline timer goroutine + defer s.setDataChannelReadDeadline(time.Time{}) + + defer s.dataChannel.Close() + + // Unblock any Read call waiting on reader.ReadMsg + s.setDataChannelReadDeadline(time.Now().Add(-1 * time.Hour)) + + s.readerMx.Lock() + // We have the lock: any readers blocked on reader.ReadMsg have exited. + s.mx.Lock() + defer s.mx.Unlock() + // From this point onwards only this goroutine will do reader.ReadMsg. + // We just wanted to ensure any exising readers have exited. + // Read calls from this point onwards will exit immediately on checking + // s.readState + s.readerMx.Unlock() + + if s.nextMessage != nil { + s.processIncomingFlag(s.nextMessage.Flag) + s.nextMessage = nil + } + var msg pb.Message + for { + // Connection closed. No need to cleanup the data channel. + if s.closeForShutdownErr != nil { + return + } + // Write half of the stream completed. + if s.sendState == sendStateDataReceived || s.sendState == sendStateReset { + return + } + // FIN_ACK wait deadling exceeded. + if !s.controlMessageReaderEndTime.IsZero() && time.Now().After(s.controlMessageReaderEndTime) { + return + } + + s.setDataChannelReadDeadline(s.controlMessageReaderEndTime) + s.mx.Unlock() + err := s.reader.ReadMsg(&msg) + s.mx.Lock() + if err != nil { + // We have to manually manage deadline exceeded errors since pion/sctp can + // return deadline exceeded error for cancelled deadlines + // see: https://github.com/pion/sctp/pull/290/files + if errors.Is(err, os.ErrDeadlineExceeded) { + continue + } + return + } + s.processIncomingFlag(msg.Flag) + } + }() + }) +} + +func (s *stream) cleanup() { + s.onDoneOnce.Do(func() { + if s.onDone != nil { + s.onDone() + } + }) +} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/stream_read.go b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/stream_read.go new file mode 100644 index 000000000..80d99ea91 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/stream_read.go @@ -0,0 +1,113 @@ +package libp2pwebrtc + +import ( + "io" + "time" + + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/p2p/transport/webrtc/pb" +) + +func (s *stream) Read(b []byte) (int, error) { + s.readerMx.Lock() + defer s.readerMx.Unlock() + + s.mx.Lock() + defer s.mx.Unlock() + + if s.closeForShutdownErr != nil { + return 0, s.closeForShutdownErr + } + switch s.receiveState { + case receiveStateDataRead: + return 0, io.EOF + case receiveStateReset: + return 0, network.ErrReset + } + + if len(b) == 0 { + return 0, nil + } + + var read int + for { + if s.nextMessage == nil { + // load the next message + s.mx.Unlock() + var msg pb.Message + err := s.reader.ReadMsg(&msg) + s.mx.Lock() + if err != nil { + // connection was closed + if s.closeForShutdownErr != nil { + return 0, s.closeForShutdownErr + } + if err == io.EOF { + // if the channel was properly closed, return EOF + if s.receiveState == receiveStateDataRead { + return 0, io.EOF + } + // This case occurs when remote closes the datachannel without writing a FIN + // message. Some implementations discard the buffered data on closing the + // datachannel. For these implementations a stream reset will be observed as an + // abrupt closing of the datachannel. + s.receiveState = receiveStateReset + return 0, network.ErrReset + } + if s.receiveState == receiveStateReset { + return 0, network.ErrReset + } + if s.receiveState == receiveStateDataRead { + return 0, io.EOF + } + return 0, err + } + s.nextMessage = &msg + } + + if len(s.nextMessage.Message) > 0 { + n := copy(b, s.nextMessage.Message) + read += n + s.nextMessage.Message = s.nextMessage.Message[n:] + return read, nil + } + + // process flags on the message after reading all the data + s.processIncomingFlag(s.nextMessage.Flag) + s.nextMessage = nil + if s.closeForShutdownErr != nil { + return read, s.closeForShutdownErr + } + switch s.receiveState { + case receiveStateDataRead: + return read, io.EOF + case receiveStateReset: + return read, network.ErrReset + } + } +} + +func (s *stream) SetReadDeadline(t time.Time) error { + s.mx.Lock() + defer s.mx.Unlock() + if s.receiveState == receiveStateReceiving { + s.setDataChannelReadDeadline(t) + } + return nil +} + +func (s *stream) setDataChannelReadDeadline(t time.Time) error { + return s.dataChannel.SetReadDeadline(t) +} + +func (s *stream) CloseRead() error { + s.mx.Lock() + defer s.mx.Unlock() + var err error + if s.receiveState == receiveStateReceiving && s.closeForShutdownErr == nil { + err = s.writer.WriteMsg(&pb.Message{Flag: pb.Message_STOP_SENDING.Enum()}) + s.receiveState = receiveStateReset + } + s.spawnControlMessageReader() + return err +} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/stream_write.go b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/stream_write.go new file mode 100644 index 000000000..534a8d8e6 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/stream_write.go @@ -0,0 +1,157 @@ +package libp2pwebrtc + +import ( + "errors" + "os" + "time" + + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/p2p/transport/webrtc/pb" +) + +var errWriteAfterClose = errors.New("write after close") + +// If we have less space than minMessageSize, we don't put a new message on the data channel. +// Instead, we wait until more space opens up. +const minMessageSize = 1 << 10 + +func (s *stream) Write(b []byte) (int, error) { + s.mx.Lock() + defer s.mx.Unlock() + + if s.closeForShutdownErr != nil { + return 0, s.closeForShutdownErr + } + switch s.sendState { + case sendStateReset: + return 0, network.ErrReset + case sendStateDataSent, sendStateDataReceived: + return 0, errWriteAfterClose + } + + if !s.writeDeadline.IsZero() && time.Now().After(s.writeDeadline) { + return 0, os.ErrDeadlineExceeded + } + + var writeDeadlineTimer *time.Timer + defer func() { + if writeDeadlineTimer != nil { + writeDeadlineTimer.Stop() + } + }() + + var n int + var msg pb.Message + for len(b) > 0 { + if s.closeForShutdownErr != nil { + return n, s.closeForShutdownErr + } + switch s.sendState { + case sendStateReset: + return n, network.ErrReset + case sendStateDataSent, sendStateDataReceived: + return n, errWriteAfterClose + } + + writeDeadline := s.writeDeadline + // deadline deleted, stop and remove the timer + if writeDeadline.IsZero() && writeDeadlineTimer != nil { + writeDeadlineTimer.Stop() + writeDeadlineTimer = nil + } + var writeDeadlineChan <-chan time.Time + if !writeDeadline.IsZero() { + if writeDeadlineTimer == nil { + writeDeadlineTimer = time.NewTimer(time.Until(writeDeadline)) + } else { + if !writeDeadlineTimer.Stop() { + <-writeDeadlineTimer.C + } + writeDeadlineTimer.Reset(time.Until(writeDeadline)) + } + writeDeadlineChan = writeDeadlineTimer.C + } + + availableSpace := s.availableSendSpace() + if availableSpace < minMessageSize { + s.mx.Unlock() + select { + case <-writeDeadlineChan: + s.mx.Lock() + return n, os.ErrDeadlineExceeded + case <-s.writeStateChanged: + } + s.mx.Lock() + continue + } + end := maxMessageSize + if end > availableSpace { + end = availableSpace + } + end -= protoOverhead + varintOverhead + if end > len(b) { + end = len(b) + } + msg = pb.Message{Message: b[:end]} + if err := s.writer.WriteMsg(&msg); err != nil { + return n, err + } + n += end + b = b[end:] + } + return n, nil +} + +func (s *stream) SetWriteDeadline(t time.Time) error { + s.mx.Lock() + defer s.mx.Unlock() + s.writeDeadline = t + s.notifyWriteStateChanged() + return nil +} + +func (s *stream) availableSendSpace() int { + buffered := int(s.dataChannel.BufferedAmount()) + availableSpace := maxSendBuffer - buffered + if availableSpace+maxTotalControlMessagesSize < 0 { // this should never happen, but better check + log.Errorw("data channel buffered more data than the maximum amount", "max", maxSendBuffer, "buffered", buffered) + } + return availableSpace +} + +func (s *stream) cancelWrite() error { + s.mx.Lock() + defer s.mx.Unlock() + + // There's no need to reset the write half if the write half has been closed + // successfully or has been reset previously + if s.sendState == sendStateDataReceived || s.sendState == sendStateReset { + return nil + } + s.sendState = sendStateReset + // Remove reference to this stream from data channel + s.dataChannel.OnBufferedAmountLow(nil) + s.notifyWriteStateChanged() + return s.writer.WriteMsg(&pb.Message{Flag: pb.Message_RESET.Enum()}) +} + +func (s *stream) CloseWrite() error { + s.mx.Lock() + defer s.mx.Unlock() + + if s.sendState != sendStateSending { + return nil + } + s.sendState = sendStateDataSent + // Remove reference to this stream from data channel + s.dataChannel.OnBufferedAmountLow(nil) + s.notifyWriteStateChanged() + return s.writer.WriteMsg(&pb.Message{Flag: pb.Message_FIN.Enum()}) +} + +func (s *stream) notifyWriteStateChanged() { + select { + case s.writeStateChanged <- struct{}{}: + default: + } +} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/transport.go b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/transport.go new file mode 100644 index 000000000..b04753eca --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/transport.go @@ -0,0 +1,651 @@ +// Package libp2pwebrtc implements the WebRTC transport for go-libp2p, +// as described in https://github.com/libp2p/specs/tree/master/webrtc. +// +// At this point, this package is EXPERIMENTAL, and the WebRTC transport is not enabled by default. +// While we're fairly confident that the implementation correctly implements the specification, +// we're not making any guarantees regarding its security (especially regarding resource exhaustion attacks). +// Fixes, even for security-related issues, will be conducted in the open. +// +// Experimentation is encouraged. Please open an issue if you encounter any problems with this transport. +// +// The udpmux subpackage contains the logic for multiplexing multiple WebRTC (ICE) +// connections over a single UDP socket. +package libp2pwebrtc + +import ( + "context" + "crypto" + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/x509" + "encoding/binary" + "errors" + "fmt" + "net" + "time" + + mrand "golang.org/x/exp/rand" + "google.golang.org/protobuf/proto" + + "github.com/libp2p/go-libp2p/core/connmgr" + ic "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/pnet" + "github.com/libp2p/go-libp2p/core/sec" + tpt "github.com/libp2p/go-libp2p/core/transport" + "github.com/libp2p/go-libp2p/p2p/security/noise" + "github.com/libp2p/go-libp2p/p2p/transport/webrtc/pb" + "github.com/libp2p/go-msgio" + + ma "github.com/multiformats/go-multiaddr" + manet "github.com/multiformats/go-multiaddr/net" + "github.com/multiformats/go-multihash" + + "github.com/pion/datachannel" + "github.com/pion/webrtc/v3" +) + +var webrtcComponent *ma.Component + +func init() { + var err error + webrtcComponent, err = ma.NewComponent(ma.ProtocolWithCode(ma.P_WEBRTC_DIRECT).Name, "") + if err != nil { + log.Fatal(err) + } +} + +const ( + // handshakeChannelNegotiated is used to specify that the + // handshake data channel does not need negotiation via DCEP. + // A constant is used since the `DataChannelInit` struct takes + // references instead of values. + handshakeChannelNegotiated = true + // handshakeChannelID is the agreed ID for the handshake data + // channel. A constant is used since the `DataChannelInit` struct takes + // references instead of values. We specify the type here as this + // value is only ever copied and passed by reference + handshakeChannelID = uint16(0) +) + +// timeout values for the peerconnection +// https://github.com/pion/webrtc/blob/v3.1.50/settingengine.go#L102-L109 +const ( + DefaultDisconnectedTimeout = 20 * time.Second + DefaultFailedTimeout = 30 * time.Second + DefaultKeepaliveTimeout = 15 * time.Second + + sctpReceiveBufferSize = 100_000 +) + +type WebRTCTransport struct { + webrtcConfig webrtc.Configuration + rcmgr network.ResourceManager + gater connmgr.ConnectionGater + privKey ic.PrivKey + noiseTpt *noise.Transport + localPeerId peer.ID + + // timeouts + peerConnectionTimeouts iceTimeouts + + // in-flight connections + maxInFlightConnections uint32 +} + +var _ tpt.Transport = &WebRTCTransport{} + +type Option func(*WebRTCTransport) error + +type iceTimeouts struct { + Disconnect time.Duration + Failed time.Duration + Keepalive time.Duration +} + +func New(privKey ic.PrivKey, psk pnet.PSK, gater connmgr.ConnectionGater, rcmgr network.ResourceManager, opts ...Option) (*WebRTCTransport, error) { + if psk != nil { + log.Error("WebRTC doesn't support private networks yet.") + return nil, fmt.Errorf("WebRTC doesn't support private networks yet") + } + if rcmgr == nil { + rcmgr = &network.NullResourceManager{} + } + localPeerID, err := peer.IDFromPrivateKey(privKey) + if err != nil { + return nil, fmt.Errorf("get local peer ID: %w", err) + } + // We use elliptic P-256 since it is widely supported by browsers. + // + // Implementation note: Testing with the browser, + // it seems like Chromium only supports ECDSA P-256 or RSA key signatures in the webrtc TLS certificate. + // We tried using P-228 and P-384 which caused the DTLS handshake to fail with Illegal Parameter + // + // Please refer to this is a list of suggested algorithms for the WebCrypto API. + // The algorithm for generating a certificate for an RTCPeerConnection + // must adhere to the WebCrpyto API. From my observation, + // RSA and ECDSA P-256 is supported on almost all browsers. + // Ed25519 is not present on the list. + pk, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) + if err != nil { + return nil, fmt.Errorf("generate key for cert: %w", err) + } + cert, err := webrtc.GenerateCertificate(pk) + if err != nil { + return nil, fmt.Errorf("generate certificate: %w", err) + } + config := webrtc.Configuration{ + Certificates: []webrtc.Certificate{*cert}, + } + noiseTpt, err := noise.New(noise.ID, privKey, nil) + if err != nil { + return nil, fmt.Errorf("unable to create noise transport: %w", err) + } + transport := &WebRTCTransport{ + rcmgr: rcmgr, + gater: gater, + webrtcConfig: config, + privKey: privKey, + noiseTpt: noiseTpt, + localPeerId: localPeerID, + + peerConnectionTimeouts: iceTimeouts{ + Disconnect: DefaultDisconnectedTimeout, + Failed: DefaultFailedTimeout, + Keepalive: DefaultKeepaliveTimeout, + }, + + maxInFlightConnections: DefaultMaxInFlightConnections, + } + for _, opt := range opts { + if err := opt(transport); err != nil { + return nil, err + } + } + return transport, nil +} + +func (t *WebRTCTransport) Protocols() []int { + return []int{ma.P_WEBRTC_DIRECT} +} + +func (t *WebRTCTransport) Proxy() bool { + return false +} + +func (t *WebRTCTransport) CanDial(addr ma.Multiaddr) bool { + isValid, n := IsWebRTCDirectMultiaddr(addr) + return isValid && n > 0 +} + +// Listen returns a listener for addr. +// +// The IP, Port combination for addr must be exclusive to this listener as a WebRTC listener cannot +// be multiplexed on the same port as other UDP based transports like QUIC and WebTransport. +// See https://github.com/libp2p/go-libp2p/issues/2446 for details. +func (t *WebRTCTransport) Listen(addr ma.Multiaddr) (tpt.Listener, error) { + addr, wrtcComponent := ma.SplitLast(addr) + isWebrtc := wrtcComponent.Equal(webrtcComponent) + if !isWebrtc { + return nil, fmt.Errorf("must listen on webrtc multiaddr") + } + nw, host, err := manet.DialArgs(addr) + if err != nil { + return nil, fmt.Errorf("listener could not fetch dialargs: %w", err) + } + udpAddr, err := net.ResolveUDPAddr(nw, host) + if err != nil { + return nil, fmt.Errorf("listener could not resolve udp address: %w", err) + } + + socket, err := net.ListenUDP(nw, udpAddr) + if err != nil { + return nil, fmt.Errorf("listen on udp: %w", err) + } + + listener, err := t.listenSocket(socket) + if err != nil { + socket.Close() + return nil, err + } + return listener, nil +} + +func (t *WebRTCTransport) listenSocket(socket *net.UDPConn) (tpt.Listener, error) { + listenerMultiaddr, err := manet.FromNetAddr(socket.LocalAddr()) + if err != nil { + return nil, err + } + + listenerFingerprint, err := t.getCertificateFingerprint() + if err != nil { + return nil, err + } + + encodedLocalFingerprint, err := encodeDTLSFingerprint(listenerFingerprint) + if err != nil { + return nil, err + } + + certComp, err := ma.NewComponent(ma.ProtocolWithCode(ma.P_CERTHASH).Name, encodedLocalFingerprint) + if err != nil { + return nil, err + } + listenerMultiaddr = listenerMultiaddr.Encapsulate(webrtcComponent).Encapsulate(certComp) + + return newListener( + t, + listenerMultiaddr, + socket, + t.webrtcConfig, + ) +} + +func (t *WebRTCTransport) Dial(ctx context.Context, remoteMultiaddr ma.Multiaddr, p peer.ID) (tpt.CapableConn, error) { + scope, err := t.rcmgr.OpenConnection(network.DirOutbound, false, remoteMultiaddr) + if err != nil { + return nil, err + } + if err := scope.SetPeer(p); err != nil { + scope.Done() + return nil, err + } + conn, err := t.dial(ctx, scope, remoteMultiaddr, p) + if err != nil { + scope.Done() + return nil, err + } + return conn, nil +} + +func (t *WebRTCTransport) dial(ctx context.Context, scope network.ConnManagementScope, remoteMultiaddr ma.Multiaddr, p peer.ID) (tConn tpt.CapableConn, err error) { + var w webRTCConnection + defer func() { + if err != nil { + if w.PeerConnection != nil { + _ = w.PeerConnection.Close() + } + if tConn != nil { + _ = tConn.Close() + } + } + }() + + remoteMultihash, err := decodeRemoteFingerprint(remoteMultiaddr) + if err != nil { + return nil, fmt.Errorf("decode fingerprint: %w", err) + } + remoteHashFunction, ok := getSupportedSDPHash(remoteMultihash.Code) + if !ok { + return nil, fmt.Errorf("unsupported hash function: %w", nil) + } + + rnw, rhost, err := manet.DialArgs(remoteMultiaddr) + if err != nil { + return nil, fmt.Errorf("generate dial args: %w", err) + } + + raddr, err := net.ResolveUDPAddr(rnw, rhost) + if err != nil { + return nil, fmt.Errorf("resolve udp address: %w", err) + } + + // Instead of encoding the local fingerprint we + // generate a random UUID as the connection ufrag. + // The only requirement here is that the ufrag and password + // must be equal, which will allow the server to determine + // the password using the STUN message. + ufrag := genUfrag() + + settingEngine := webrtc.SettingEngine{ + LoggerFactory: pionLoggerFactory, + } + settingEngine.SetICECredentials(ufrag, ufrag) + settingEngine.DetachDataChannels() + // use the first best address candidate + settingEngine.SetPrflxAcceptanceMinWait(0) + settingEngine.SetICETimeouts( + t.peerConnectionTimeouts.Disconnect, + t.peerConnectionTimeouts.Failed, + t.peerConnectionTimeouts.Keepalive, + ) + // By default, webrtc will not collect candidates on the loopback address. + // This is disallowed in the ICE specification. However, implementations + // do not strictly follow this, for eg. Chrome gathers TCP loopback candidates. + // If you run pion on a system with only the loopback interface UP, + // it will not connect to anything. + settingEngine.SetIncludeLoopbackCandidate(true) + settingEngine.SetSCTPMaxReceiveBufferSize(sctpReceiveBufferSize) + if err := scope.ReserveMemory(sctpReceiveBufferSize, network.ReservationPriorityMedium); err != nil { + return nil, err + } + + w, err = newWebRTCConnection(settingEngine, t.webrtcConfig) + if err != nil { + return nil, fmt.Errorf("instantiating peer connection failed: %w", err) + } + + errC := addOnConnectionStateChangeCallback(w.PeerConnection) + + // do offer-answer exchange + offer, err := w.PeerConnection.CreateOffer(nil) + if err != nil { + return nil, fmt.Errorf("create offer: %w", err) + } + + err = w.PeerConnection.SetLocalDescription(offer) + if err != nil { + return nil, fmt.Errorf("set local description: %w", err) + } + + answerSDPString, err := createServerSDP(raddr, ufrag, *remoteMultihash) + if err != nil { + return nil, fmt.Errorf("render server SDP: %w", err) + } + + answer := webrtc.SessionDescription{SDP: answerSDPString, Type: webrtc.SDPTypeAnswer} + err = w.PeerConnection.SetRemoteDescription(answer) + if err != nil { + return nil, fmt.Errorf("set remote description: %w", err) + } + + // await peerconnection opening + select { + case err := <-errC: + if err != nil { + return nil, err + } + case <-ctx.Done(): + return nil, errors.New("peerconnection opening timed out") + } + + // We are connected, run the noise handshake + detached, err := detachHandshakeDataChannel(ctx, w.HandshakeDataChannel) + if err != nil { + return nil, err + } + channel := newStream(w.HandshakeDataChannel, detached, func() {}) + + remotePubKey, err := t.noiseHandshake(ctx, w.PeerConnection, channel, p, remoteHashFunction, false) + if err != nil { + return nil, err + } + + // Setup local and remote address for the connection + cp, err := w.HandshakeDataChannel.Transport().Transport().ICETransport().GetSelectedCandidatePair() + if cp == nil { + return nil, errors.New("ice connection did not have selected candidate pair: nil result") + } + if err != nil { + return nil, fmt.Errorf("ice connection did not have selected candidate pair: error: %w", err) + } + // the local address of the selected candidate pair should be the local address for the connection + localAddr, err := manet.FromNetAddr(&net.UDPAddr{IP: net.ParseIP(cp.Local.Address), Port: int(cp.Local.Port)}) + if err != nil { + return nil, err + } + remoteMultiaddrWithoutCerthash, _ := ma.SplitFunc(remoteMultiaddr, func(c ma.Component) bool { return c.Protocol().Code == ma.P_CERTHASH }) + + conn, err := newConnection( + network.DirOutbound, + w.PeerConnection, + t, + scope, + t.localPeerId, + localAddr, + p, + remotePubKey, + remoteMultiaddrWithoutCerthash, + w.IncomingDataChannels, + ) + if err != nil { + return nil, err + } + + if t.gater != nil && !t.gater.InterceptSecured(network.DirOutbound, p, conn) { + return nil, fmt.Errorf("secured connection gated") + } + return conn, nil +} + +func genUfrag() string { + const ( + uFragAlphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" + uFragPrefix = "libp2p+webrtc+v1/" + uFragIdLength = 32 + uFragIdOffset = len(uFragPrefix) + uFragLength = uFragIdOffset + uFragIdLength + ) + + seed := [8]byte{} + rand.Read(seed[:]) + r := mrand.New(mrand.NewSource(binary.BigEndian.Uint64(seed[:]))) + b := make([]byte, uFragLength) + for i := uFragIdOffset; i < uFragLength; i++ { + b[i] = uFragAlphabet[r.Intn(len(uFragAlphabet))] + } + return string(b) +} + +func (t *WebRTCTransport) getCertificateFingerprint() (webrtc.DTLSFingerprint, error) { + fps, err := t.webrtcConfig.Certificates[0].GetFingerprints() + if err != nil { + return webrtc.DTLSFingerprint{}, err + } + return fps[0], nil +} + +func (t *WebRTCTransport) generateNoisePrologue(pc *webrtc.PeerConnection, hash crypto.Hash, inbound bool) ([]byte, error) { + raw := pc.SCTP().Transport().GetRemoteCertificate() + cert, err := x509.ParseCertificate(raw) + if err != nil { + return nil, err + } + + // NOTE: should we want we can fork the cert code as well to avoid + // all the extra allocations due to unneeded string interspersing (hex) + localFp, err := t.getCertificateFingerprint() + if err != nil { + return nil, err + } + + remoteFpBytes, err := parseFingerprint(cert, hash) + if err != nil { + return nil, err + } + + localFpBytes, err := decodeInterspersedHexFromASCIIString(localFp.Value) + if err != nil { + return nil, err + } + + localEncoded, err := multihash.Encode(localFpBytes, multihash.SHA2_256) + if err != nil { + log.Debugf("could not encode multihash for local fingerprint") + return nil, err + } + remoteEncoded, err := multihash.Encode(remoteFpBytes, multihash.SHA2_256) + if err != nil { + log.Debugf("could not encode multihash for remote fingerprint") + return nil, err + } + + result := []byte("libp2p-webrtc-noise:") + if inbound { + result = append(result, remoteEncoded...) + result = append(result, localEncoded...) + } else { + result = append(result, localEncoded...) + result = append(result, remoteEncoded...) + } + return result, nil +} + +func (t *WebRTCTransport) noiseHandshake(ctx context.Context, pc *webrtc.PeerConnection, s *stream, peer peer.ID, hash crypto.Hash, inbound bool) (ic.PubKey, error) { + prologue, err := t.generateNoisePrologue(pc, hash, inbound) + if err != nil { + return nil, fmt.Errorf("generate prologue: %w", err) + } + opts := make([]noise.SessionOption, 0, 2) + opts = append(opts, noise.Prologue(prologue)) + if peer == "" { + opts = append(opts, noise.DisablePeerIDCheck()) + } + sessionTransport, err := t.noiseTpt.WithSessionOptions(opts...) + if err != nil { + return nil, fmt.Errorf("failed to instantiate Noise transport: %w", err) + } + var secureConn sec.SecureConn + if inbound { + secureConn, err = sessionTransport.SecureOutbound(ctx, netConnWrapper{s}, peer) + if err != nil { + return nil, fmt.Errorf("failed to secure inbound connection: %w", err) + } + } else { + secureConn, err = sessionTransport.SecureInbound(ctx, netConnWrapper{s}, peer) + if err != nil { + return nil, fmt.Errorf("failed to secure outbound connection: %w", err) + } + } + return secureConn.RemotePublicKey(), nil +} + +func (t *WebRTCTransport) AddCertHashes(addr ma.Multiaddr) (ma.Multiaddr, bool) { + listenerFingerprint, err := t.getCertificateFingerprint() + if err != nil { + return nil, false + } + + encodedLocalFingerprint, err := encodeDTLSFingerprint(listenerFingerprint) + if err != nil { + return nil, false + } + + certComp, err := ma.NewComponent(ma.ProtocolWithCode(ma.P_CERTHASH).Name, encodedLocalFingerprint) + if err != nil { + return nil, false + } + return addr.Encapsulate(certComp), true +} + +type netConnWrapper struct { + *stream +} + +func (netConnWrapper) LocalAddr() net.Addr { return nil } +func (netConnWrapper) RemoteAddr() net.Addr { return nil } +func (w netConnWrapper) Close() error { + // Close called while running the security handshake is an error and we should Reset the + // stream in that case rather than gracefully closing + w.stream.Reset() + return nil +} + +// detachHandshakeDataChannel detaches the handshake data channel +func detachHandshakeDataChannel(ctx context.Context, dc *webrtc.DataChannel) (datachannel.ReadWriteCloser, error) { + done := make(chan struct{}) + var rwc datachannel.ReadWriteCloser + var err error + dc.OnOpen(func() { + defer close(done) + rwc, err = dc.Detach() + }) + // this is safe since for detached datachannels, the peerconnection runs the onOpen + // callback immediately if the SCTP transport is also connected. + select { + case <-done: + return rwc, err + case <-ctx.Done(): + return nil, ctx.Err() + } +} + +// webRTCConnection holds the webrtc.PeerConnection with the handshake channel and the queue for +// incoming data channels created by the peer. +// +// When creating a webrtc.PeerConnection, It is important to set the OnDataChannel handler upfront +// before connecting with the peer. If the handler's set up after connecting with the peer, there's +// a small window of time where datachannels created by the peer may not surface to us and cause a +// memory leak. +type webRTCConnection struct { + PeerConnection *webrtc.PeerConnection + HandshakeDataChannel *webrtc.DataChannel + IncomingDataChannels chan dataChannel +} + +func newWebRTCConnection(settings webrtc.SettingEngine, config webrtc.Configuration) (webRTCConnection, error) { + api := webrtc.NewAPI(webrtc.WithSettingEngine(settings)) + pc, err := api.NewPeerConnection(config) + if err != nil { + return webRTCConnection{}, fmt.Errorf("failed to create peer connection: %w", err) + } + + negotiated, id := handshakeChannelNegotiated, handshakeChannelID + handshakeDataChannel, err := pc.CreateDataChannel("", &webrtc.DataChannelInit{ + Negotiated: &negotiated, + ID: &id, + }) + if err != nil { + pc.Close() + return webRTCConnection{}, fmt.Errorf("failed to create handshake channel: %w", err) + } + + incomingDataChannels := make(chan dataChannel, maxAcceptQueueLen) + pc.OnDataChannel(func(dc *webrtc.DataChannel) { + dc.OnOpen(func() { + rwc, err := dc.Detach() + if err != nil { + log.Warnf("could not detach datachannel: id: %d", *dc.ID()) + return + } + select { + case incomingDataChannels <- dataChannel{rwc, dc}: + default: + log.Warnf("connection busy, rejecting stream") + b, _ := proto.Marshal(&pb.Message{Flag: pb.Message_RESET.Enum()}) + w := msgio.NewWriter(rwc) + w.WriteMsg(b) + rwc.Close() + } + }) + }) + return webRTCConnection{ + PeerConnection: pc, + HandshakeDataChannel: handshakeDataChannel, + IncomingDataChannels: incomingDataChannels, + }, nil +} + +// IsWebRTCDirectMultiaddr returns whether addr is a /webrtc-direct multiaddr with the count of certhashes +// in addr +func IsWebRTCDirectMultiaddr(addr ma.Multiaddr) (bool, int) { + var foundUDP, foundWebRTC bool + certHashCount := 0 + ma.ForEach(addr, func(c ma.Component) bool { + if !foundUDP { + if c.Protocol().Code == ma.P_UDP { + foundUDP = true + } + return true + } + if !foundWebRTC && foundUDP { + // protocol after udp must be webrtc-direct + if c.Protocol().Code != ma.P_WEBRTC_DIRECT { + return false + } + foundWebRTC = true + return true + } + if foundWebRTC { + if c.Protocol().Code == ma.P_CERTHASH { + certHashCount++ + } else { + return false + } + } + return true + }) + return foundUDP && foundWebRTC, certHashCount +} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/udpmux/mux.go b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/udpmux/mux.go new file mode 100644 index 000000000..98e60e3f1 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/udpmux/mux.go @@ -0,0 +1,298 @@ +package udpmux + +import ( + "bytes" + "context" + "fmt" + "io" + "net" + "strings" + "sync" + + logging "github.com/ipfs/go-log/v2" + pool "github.com/libp2p/go-buffer-pool" + "github.com/pion/ice/v2" + "github.com/pion/stun" +) + +var log = logging.Logger("webrtc-udpmux") + +// ReceiveBufSize is the size of the buffer used to receive packets from the PacketConn. +// It is fine for this number to be higher than the actual path MTU as this value is not +// used to decide the packet size on the write path. +const ReceiveBufSize = 1500 + +type Candidate struct { + Ufrag string + Addr *net.UDPAddr +} + +// UDPMux multiplexes multiple ICE connections over a single net.PacketConn, +// generally a UDP socket. +// +// The connections are indexed by (ufrag, IP address family) and by remote +// address from which the connection has received valid STUN/RTC packets. +// +// When a new packet is received on the underlying net.PacketConn, we +// first check the address map to see if there is a connection associated with the +// remote address: +// If found, we pass the packet to that connection. +// Otherwise, we check to see if the packet is a STUN packet. +// If it is, we read the ufrag from the STUN packet and use it to check if there +// is a connection associated with the (ufrag, IP address family) pair. +// If found we add the association to the address map. +type UDPMux struct { + socket net.PacketConn + + queue chan Candidate + + mx sync.Mutex + // ufragMap allows us to multiplex incoming STUN packets based on ufrag + ufragMap map[ufragConnKey]*muxedConnection + // addrMap allows us to correctly direct incoming packets after the connection + // is established and ufrag isn't available on all packets + addrMap map[string]*muxedConnection + // ufragAddrMap allows cleaning up all addresses from the addrMap once the connection is closed + // During the ICE connectivity checks, the same ufrag might be used on multiple addresses. + ufragAddrMap map[ufragConnKey][]net.Addr + + // the context controls the lifecycle of the mux + wg sync.WaitGroup + ctx context.Context + cancel context.CancelFunc +} + +var _ ice.UDPMux = &UDPMux{} + +func NewUDPMux(socket net.PacketConn) *UDPMux { + ctx, cancel := context.WithCancel(context.Background()) + mux := &UDPMux{ + ctx: ctx, + cancel: cancel, + socket: socket, + ufragMap: make(map[ufragConnKey]*muxedConnection), + addrMap: make(map[string]*muxedConnection), + ufragAddrMap: make(map[ufragConnKey][]net.Addr), + queue: make(chan Candidate, 32), + } + + return mux +} + +func (mux *UDPMux) Start() { + mux.wg.Add(1) + go func() { + defer mux.wg.Done() + mux.readLoop() + }() +} + +// GetListenAddresses implements ice.UDPMux +func (mux *UDPMux) GetListenAddresses() []net.Addr { + return []net.Addr{mux.socket.LocalAddr()} +} + +// GetConn implements ice.UDPMux +// It creates a net.PacketConn for a given ufrag if an existing one cannot be found. +// We differentiate IPv4 and IPv6 addresses, since a remote is can be reachable at multiple different +// UDP addresses of the same IP address family (eg. server-reflexive addresses and peer-reflexive addresses). +func (mux *UDPMux) GetConn(ufrag string, addr net.Addr) (net.PacketConn, error) { + a, ok := addr.(*net.UDPAddr) + if !ok { + return nil, fmt.Errorf("unexpected address type: %T", addr) + } + select { + case <-mux.ctx.Done(): + return nil, io.ErrClosedPipe + default: + isIPv6 := ok && a.IP.To4() == nil + _, conn := mux.getOrCreateConn(ufrag, isIPv6, mux, addr) + return conn, nil + } +} + +// Close implements ice.UDPMux +func (mux *UDPMux) Close() error { + select { + case <-mux.ctx.Done(): + return nil + default: + } + mux.cancel() + mux.socket.Close() + mux.wg.Wait() + return nil +} + +// writeTo writes a packet to the underlying net.PacketConn +func (mux *UDPMux) writeTo(buf []byte, addr net.Addr) (int, error) { + return mux.socket.WriteTo(buf, addr) +} + +func (mux *UDPMux) readLoop() { + for { + select { + case <-mux.ctx.Done(): + return + default: + } + + buf := pool.Get(ReceiveBufSize) + + n, addr, err := mux.socket.ReadFrom(buf) + if err != nil { + if strings.Contains(err.Error(), "use of closed network connection") { + log.Debugf("readLoop exiting: socket %s closed", mux.socket.LocalAddr()) + } else { + log.Errorf("error reading from socket %s: %v", mux.socket.LocalAddr(), err) + } + pool.Put(buf) + return + } + buf = buf[:n] + + if processed := mux.processPacket(buf, addr); !processed { + pool.Put(buf) + } + } +} + +func (mux *UDPMux) processPacket(buf []byte, addr net.Addr) (processed bool) { + udpAddr, ok := addr.(*net.UDPAddr) + if !ok { + log.Errorf("received a non-UDP address: %s", addr) + return false + } + isIPv6 := udpAddr.IP.To4() == nil + + // Connections are indexed by remote address. We first + // check if the remote address has a connection associated + // with it. If yes, we push the received packet to the connection + mux.mx.Lock() + conn, ok := mux.addrMap[addr.String()] + mux.mx.Unlock() + if ok { + if err := conn.Push(buf, addr); err != nil { + log.Debugf("could not push packet: %v", err) + return false + } + return true + } + + if !stun.IsMessage(buf) { + log.Debug("incoming message is not a STUN message") + return false + } + + msg := &stun.Message{Raw: buf} + if err := msg.Decode(); err != nil { + log.Debugf("failed to decode STUN message: %s", err) + return false + } + if msg.Type != stun.BindingRequest { + log.Debugf("incoming message should be a STUN binding request, got %s", msg.Type) + return false + } + + ufrag, err := ufragFromSTUNMessage(msg) + if err != nil { + log.Debugf("could not find STUN username: %s", err) + return false + } + + connCreated, conn := mux.getOrCreateConn(ufrag, isIPv6, mux, udpAddr) + if connCreated { + select { + case mux.queue <- Candidate{Addr: udpAddr, Ufrag: ufrag}: + default: + log.Debugw("queue full, dropping incoming candidate", "ufrag", ufrag, "addr", udpAddr) + conn.Close() + return false + } + } + + if err := conn.Push(buf, addr); err != nil { + log.Debugf("could not push packet: %v", err) + return false + } + return true +} + +func (mux *UDPMux) Accept(ctx context.Context) (Candidate, error) { + select { + case c := <-mux.queue: + return c, nil + case <-ctx.Done(): + return Candidate{}, ctx.Err() + case <-mux.ctx.Done(): + return Candidate{}, mux.ctx.Err() + } +} + +type ufragConnKey struct { + ufrag string + isIPv6 bool +} + +// ufragFromSTUNMessage returns the local or ufrag +// from the STUN username attribute. Local ufrag is the ufrag of the +// peer which initiated the connectivity check, e.g in a connectivity +// check from A to B, the username attribute will be B_ufrag:A_ufrag +// with the local ufrag value being A_ufrag. In case of ice-lite, the +// localUfrag value will always be the remote peer's ufrag since ICE-lite +// implementations do not generate connectivity checks. In our specific +// case, since the local and remote ufrag is equal, we can return +// either value. +func ufragFromSTUNMessage(msg *stun.Message) (string, error) { + attr, err := msg.Get(stun.AttrUsername) + if err != nil { + return "", err + } + index := bytes.Index(attr, []byte{':'}) + if index == -1 { + return "", fmt.Errorf("invalid STUN username attribute") + } + return string(attr[index+1:]), nil +} + +// RemoveConnByUfrag removes the connection associated with the ufrag and all the +// addresses associated with that connection. This method is called by pion when +// a peerconnection is closed. +func (mux *UDPMux) RemoveConnByUfrag(ufrag string) { + if ufrag == "" { + return + } + + mux.mx.Lock() + defer mux.mx.Unlock() + + for _, isIPv6 := range [...]bool{true, false} { + key := ufragConnKey{ufrag: ufrag, isIPv6: isIPv6} + if _, ok := mux.ufragMap[key]; ok { + delete(mux.ufragMap, key) + for _, addr := range mux.ufragAddrMap[key] { + delete(mux.addrMap, addr.String()) + } + delete(mux.ufragAddrMap, key) + } + } +} + +func (mux *UDPMux) getOrCreateConn(ufrag string, isIPv6 bool, _ *UDPMux, addr net.Addr) (created bool, _ *muxedConnection) { + key := ufragConnKey{ufrag: ufrag, isIPv6: isIPv6} + + mux.mx.Lock() + defer mux.mx.Unlock() + + if conn, ok := mux.ufragMap[key]; ok { + mux.addrMap[addr.String()] = conn + mux.ufragAddrMap[key] = append(mux.ufragAddrMap[key], addr) + return false, conn + } + + conn := newMuxedConnection(mux, func() { mux.RemoveConnByUfrag(ufrag) }) + mux.ufragMap[key] = conn + mux.addrMap[addr.String()] = conn + mux.ufragAddrMap[key] = append(mux.ufragAddrMap[key], addr) + return true, conn +} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/udpmux/muxed_connection.go b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/udpmux/muxed_connection.go new file mode 100644 index 000000000..2af5d3325 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webrtc/udpmux/muxed_connection.go @@ -0,0 +1,112 @@ +package udpmux + +import ( + "context" + "errors" + "net" + "time" + + pool "github.com/libp2p/go-buffer-pool" +) + +type packet struct { + buf []byte + addr net.Addr +} + +var _ net.PacketConn = &muxedConnection{} + +const queueLen = 128 + +// muxedConnection provides a net.PacketConn abstraction +// over packetQueue and adds the ability to store addresses +// from which this connection (indexed by ufrag) received +// data. +type muxedConnection struct { + ctx context.Context + cancel context.CancelFunc + onClose func() + queue chan packet + mux *UDPMux +} + +var _ net.PacketConn = &muxedConnection{} + +func newMuxedConnection(mux *UDPMux, onClose func()) *muxedConnection { + ctx, cancel := context.WithCancel(mux.ctx) + return &muxedConnection{ + ctx: ctx, + cancel: cancel, + queue: make(chan packet, queueLen), + onClose: onClose, + mux: mux, + } +} + +func (c *muxedConnection) Push(buf []byte, addr net.Addr) error { + select { + case <-c.ctx.Done(): + return errors.New("closed") + default: + } + select { + case c.queue <- packet{buf: buf, addr: addr}: + return nil + default: + return errors.New("queue full") + } +} + +func (c *muxedConnection) ReadFrom(buf []byte) (int, net.Addr, error) { + select { + case p := <-c.queue: + n := copy(buf, p.buf) // This might discard parts of the packet, if p is too short + if n < len(p.buf) { + log.Debugf("short read, had %d, read %d", len(p.buf), n) + } + pool.Put(p.buf) + return n, p.addr, nil + case <-c.ctx.Done(): + return 0, nil, c.ctx.Err() + } +} + +func (c *muxedConnection) WriteTo(p []byte, addr net.Addr) (n int, err error) { + return c.mux.writeTo(p, addr) +} + +func (c *muxedConnection) Close() error { + select { + case <-c.ctx.Done(): + return nil + default: + } + c.onClose() + c.cancel() + // drain the packet queue + for { + select { + case p := <-c.queue: + pool.Put(p.buf) + default: + return nil + } + } +} + +func (c *muxedConnection) LocalAddr() net.Addr { return c.mux.socket.LocalAddr() } + +func (*muxedConnection) SetDeadline(t time.Time) error { + // no deadline is desired here + return nil +} + +func (*muxedConnection) SetReadDeadline(t time.Time) error { + // no read deadline is desired here + return nil +} + +func (*muxedConnection) SetWriteDeadline(t time.Time) error { + // no write deadline is desired here + return nil +} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/webtransport/listener.go b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webtransport/listener.go index 337239fa8..2a7c3546f 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/transport/webtransport/listener.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webtransport/listener.go @@ -212,5 +212,14 @@ func (l *listener) Close() error { l.reuseListener.Close() err := l.server.Close() <-l.serverClosed +loop: + for { + select { + case conn := <-l.queue: + conn.Close() + default: + break loop + } + } return err } diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/transport/webtransport/transport.go b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webtransport/transport.go index 957d2ff1c..97172703f 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/transport/webtransport/transport.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/transport/webtransport/transport.go @@ -79,7 +79,7 @@ type transport struct { noise *noise.Transport connMx sync.Mutex - conns map[uint64]*conn // using quic-go's ConnectionTracingKey as map key + conns map[quic.ConnectionTracingID]*conn // using quic-go's ConnectionTracingKey as map key } var _ tpt.Transport = &transport{} @@ -105,7 +105,7 @@ func New(key ic.PrivKey, psk pnet.PSK, connManager *quicreuse.ConnManager, gater gater: gater, clock: clock.New(), connManager: connManager, - conns: map[uint64]*conn{}, + conns: map[quic.ConnectionTracingID]*conn{}, } for _, opt := range opts { if err := opt(t); err != nil { @@ -203,11 +203,10 @@ func (t *transport) dial(ctx context.Context, addr ma.Multiaddr, url, sni string return nil, err } dialer := webtransport.Dialer{ - RoundTripper: &http3.RoundTripper{ - Dial: func(ctx context.Context, addr string, tlsCfg *tls.Config, cfg *quic.Config) (quic.EarlyConnection, error) { - return conn.(quic.EarlyConnection), nil - }, + DialAddr: func(ctx context.Context, addr string, tlsCfg *tls.Config, cfg *quic.Config) (quic.EarlyConnection, error) { + return conn.(quic.EarlyConnection), nil }, + QUICConfig: t.connManager.ClientConfig().Clone(), } rsp, sess, err := dialer.Dial(ctx, url, nil) if err != nil { @@ -348,7 +347,7 @@ func (t *transport) allowWindowIncrease(conn quic.Connection, size uint64) bool t.connMx.Lock() defer t.connMx.Unlock() - c, ok := t.conns[conn.Context().Value(quic.ConnectionTracingKey).(uint64)] + c, ok := t.conns[conn.Context().Value(quic.ConnectionTracingKey).(quic.ConnectionTracingID)] if !ok { return false } @@ -357,13 +356,13 @@ func (t *transport) allowWindowIncrease(conn quic.Connection, size uint64) bool func (t *transport) addConn(sess *webtransport.Session, c *conn) { t.connMx.Lock() - t.conns[sess.Context().Value(quic.ConnectionTracingKey).(uint64)] = c + t.conns[sess.Context().Value(quic.ConnectionTracingKey).(quic.ConnectionTracingID)] = c t.connMx.Unlock() } func (t *transport) removeConn(sess *webtransport.Session) { t.connMx.Lock() - delete(t.conns, sess.Context().Value(quic.ConnectionTracingKey).(uint64)) + delete(t.conns, sess.Context().Value(quic.ConnectionTracingKey).(quic.ConnectionTracingID)) t.connMx.Unlock() } diff --git a/vendor/github.com/libp2p/go-libp2p/version.json b/vendor/github.com/libp2p/go-libp2p/version.json index 7b5ac4c94..fb0aea4f0 100644 --- a/vendor/github.com/libp2p/go-libp2p/version.json +++ b/vendor/github.com/libp2p/go-libp2p/version.json @@ -1,3 +1,3 @@ { - "version": "v0.32.2" + "version": "v0.35.0" } diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE b/vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE deleted file mode 100644 index 8dada3eda..000000000 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE b/vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE deleted file mode 100644 index 5d8cb5b72..000000000 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE +++ /dev/null @@ -1 +0,0 @@ -Copyright 2012 Matt T. Proud (matt.proud@gmail.com) diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore deleted file mode 100644 index e16fb946b..000000000 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore +++ /dev/null @@ -1 +0,0 @@ -cover.dat diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile deleted file mode 100644 index 81be21437..000000000 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -all: - -cover: - go test -cover -v -coverprofile=cover.dat ./... - go tool cover -func cover.dat - -.PHONY: cover diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go deleted file mode 100644 index 258c0636a..000000000 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2013 Matt T. Proud -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package pbutil - -import ( - "encoding/binary" - "errors" - "io" - - "github.com/golang/protobuf/proto" -) - -var errInvalidVarint = errors.New("invalid varint32 encountered") - -// ReadDelimited decodes a message from the provided length-delimited stream, -// where the length is encoded as 32-bit varint prefix to the message body. -// It returns the total number of bytes read and any applicable error. This is -// roughly equivalent to the companion Java API's -// MessageLite#parseDelimitedFrom. As per the reader contract, this function -// calls r.Read repeatedly as required until exactly one message including its -// prefix is read and decoded (or an error has occurred). The function never -// reads more bytes from the stream than required. The function never returns -// an error if a message has been read and decoded correctly, even if the end -// of the stream has been reached in doing so. In that case, any subsequent -// calls return (0, io.EOF). -func ReadDelimited(r io.Reader, m proto.Message) (n int, err error) { - // Per AbstractParser#parsePartialDelimitedFrom with - // CodedInputStream#readRawVarint32. - var headerBuf [binary.MaxVarintLen32]byte - var bytesRead, varIntBytes int - var messageLength uint64 - for varIntBytes == 0 { // i.e. no varint has been decoded yet. - if bytesRead >= len(headerBuf) { - return bytesRead, errInvalidVarint - } - // We have to read byte by byte here to avoid reading more bytes - // than required. Each read byte is appended to what we have - // read before. - newBytesRead, err := r.Read(headerBuf[bytesRead : bytesRead+1]) - if newBytesRead == 0 { - if err != nil { - return bytesRead, err - } - // A Reader should not return (0, nil), but if it does, - // it should be treated as no-op (according to the - // Reader contract). So let's go on... - continue - } - bytesRead += newBytesRead - // Now present everything read so far to the varint decoder and - // see if a varint can be decoded already. - messageLength, varIntBytes = proto.DecodeVarint(headerBuf[:bytesRead]) - } - - messageBuf := make([]byte, messageLength) - newBytesRead, err := io.ReadFull(r, messageBuf) - bytesRead += newBytesRead - if err != nil { - return bytesRead, err - } - - return bytesRead, proto.Unmarshal(messageBuf, m) -} diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go deleted file mode 100644 index 8fb59ad22..000000000 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2013 Matt T. Proud -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package pbutil - -import ( - "encoding/binary" - "io" - - "github.com/golang/protobuf/proto" -) - -// WriteDelimited encodes and dumps a message to the provided writer prefixed -// with a 32-bit varint indicating the length of the encoded message, producing -// a length-delimited record stream, which can be used to chain together -// encoded messages of the same type together in a file. It returns the total -// number of bytes written and any applicable error. This is roughly -// equivalent to the companion Java API's MessageLite#writeDelimitedTo. -func WriteDelimited(w io.Writer, m proto.Message) (n int, err error) { - buffer, err := proto.Marshal(m) - if err != nil { - return 0, err - } - - var buf [binary.MaxVarintLen32]byte - encodedLength := binary.PutUvarint(buf[:], uint64(len(buffer))) - - sync, err := w.Write(buf[:encodedLength]) - if err != nil { - return sync, err - } - - n, err = w.Write(buffer) - return n + sync, err -} diff --git a/vendor/github.com/miekg/dns/README.md b/vendor/github.com/miekg/dns/README.md index 95bc08d5c..e57d86afe 100644 --- a/vendor/github.com/miekg/dns/README.md +++ b/vendor/github.com/miekg/dns/README.md @@ -82,6 +82,7 @@ A not-so-up-to-date-list-that-may-be-actually-current: * https://dnscheck.tools/ * https://github.com/egbakou/domainverifier * https://github.com/semihalev/sdns +* https://github.com/wintbiit/NineDNS Send pull request if you want to be listed here. @@ -125,6 +126,7 @@ Example programs can be found in the `github.com/miekg/exdns` repository. *all of them* * 103{4,5} - DNS standard +* 1183 - ISDN, X25 and other deprecated records * 1348 - NSAP record (removed the record) * 1982 - Serial Arithmetic * 1876 - LOC record diff --git a/vendor/github.com/miekg/dns/acceptfunc.go b/vendor/github.com/miekg/dns/acceptfunc.go index ab2812e33..1a59a854e 100644 --- a/vendor/github.com/miekg/dns/acceptfunc.go +++ b/vendor/github.com/miekg/dns/acceptfunc.go @@ -10,8 +10,6 @@ type MsgAcceptFunc func(dh Header) MsgAcceptAction // // * opcode isn't OpcodeQuery or OpcodeNotify // -// * Zero bit isn't zero -// // * does not have exactly 1 question in the question section // // * has more than 1 RR in the Answer section diff --git a/vendor/github.com/miekg/dns/defaults.go b/vendor/github.com/miekg/dns/defaults.go index 6d7e17605..02d9199a4 100644 --- a/vendor/github.com/miekg/dns/defaults.go +++ b/vendor/github.com/miekg/dns/defaults.go @@ -5,7 +5,6 @@ import ( "net" "strconv" "strings" - "unicode" ) const hexDigit = "0123456789abcdef" @@ -23,8 +22,7 @@ func (dns *Msg) SetReply(request *Msg) *Msg { } dns.Rcode = RcodeSuccess if len(request.Question) > 0 { - dns.Question = make([]Question, 1) - dns.Question[0] = request.Question[0] + dns.Question = []Question{request.Question[0]} } return dns } @@ -293,26 +291,19 @@ func IsFqdn(s string) bool { return (len(s)-i)%2 != 0 } -// IsRRset checks if a set of RRs is a valid RRset as defined by RFC 2181. -// This means the RRs need to have the same type, name, and class. Returns true -// if the RR set is valid, otherwise false. +// IsRRset reports whether a set of RRs is a valid RRset as defined by RFC 2181. +// This means the RRs need to have the same type, name, and class. func IsRRset(rrset []RR) bool { if len(rrset) == 0 { return false } - if len(rrset) == 1 { - return true - } - rrHeader := rrset[0].Header() - rrType := rrHeader.Rrtype - rrClass := rrHeader.Class - rrName := rrHeader.Name + baseH := rrset[0].Header() for _, rr := range rrset[1:] { - curRRHeader := rr.Header() - if curRRHeader.Rrtype != rrType || curRRHeader.Class != rrClass || curRRHeader.Name != rrName { + curH := rr.Header() + if curH.Rrtype != baseH.Rrtype || curH.Class != baseH.Class || curH.Name != baseH.Name { // Mismatch between the records, so this is not a valid rrset for - //signing/verifying + // signing/verifying return false } } @@ -330,19 +321,15 @@ func Fqdn(s string) string { } // CanonicalName returns the domain name in canonical form. A name in canonical -// form is lowercase and fully qualified. See Section 6.2 in RFC 4034. -// According to the RFC all uppercase US-ASCII letters in the owner name of the -// RR areeplaced by the corresponding lowercase US-ASCII letters. +// form is lowercase and fully qualified. Only US-ASCII letters are affected. See +// Section 6.2 in RFC 4034. func CanonicalName(s string) string { - var result strings.Builder - for _, ch := range s { - if unicode.IsUpper(ch) && (ch >= 0x00 && ch <= 0x7F) { - result.WriteRune(unicode.ToLower(ch)) - } else { - result.WriteRune(ch) + return strings.Map(func(r rune) rune { + if r >= 'A' && r <= 'Z' { + r += 'a' - 'A' } - } - return Fqdn(result.String()) + return r + }, Fqdn(s)) } // Copied from the official Go code. diff --git a/vendor/github.com/miekg/dns/dnssec_keyscan.go b/vendor/github.com/miekg/dns/dnssec_keyscan.go index f79658169..9c9972db6 100644 --- a/vendor/github.com/miekg/dns/dnssec_keyscan.go +++ b/vendor/github.com/miekg/dns/dnssec_keyscan.go @@ -37,7 +37,8 @@ func (k *DNSKEY) ReadPrivateKey(q io.Reader, file string) (crypto.PrivateKey, er return nil, ErrPrivKey } // TODO(mg): check if the pubkey matches the private key - algo, err := strconv.ParseUint(strings.SplitN(m["algorithm"], " ", 2)[0], 10, 8) + algoStr, _, _ := strings.Cut(m["algorithm"], " ") + algo, err := strconv.ParseUint(algoStr, 10, 8) if err != nil { return nil, ErrPrivKey } @@ -159,7 +160,7 @@ func parseKey(r io.Reader, file string) (map[string]string, error) { k = l.token case zValue: if k == "" { - return nil, &ParseError{file, "no private key seen", l} + return nil, &ParseError{file: file, err: "no private key seen", lex: l} } m[strings.ToLower(k)] = l.token diff --git a/vendor/github.com/miekg/dns/edns.go b/vendor/github.com/miekg/dns/edns.go index b5bdac816..1b58e8f0a 100644 --- a/vendor/github.com/miekg/dns/edns.go +++ b/vendor/github.com/miekg/dns/edns.go @@ -185,7 +185,7 @@ func (rr *OPT) Do() bool { // SetDo sets the DO (DNSSEC OK) bit. // If we pass an argument, set the DO bit to that value. -// It is possible to pass 2 or more arguments. Any arguments after the 1st is silently ignored. +// It is possible to pass 2 or more arguments, but they will be ignored. func (rr *OPT) SetDo(do ...bool) { if len(do) == 1 { if do[0] { @@ -508,6 +508,7 @@ func (e *EDNS0_LLQ) String() string { " " + strconv.FormatUint(uint64(e.LeaseLife), 10) return s } + func (e *EDNS0_LLQ) copy() EDNS0 { return &EDNS0_LLQ{e.Code, e.Version, e.Opcode, e.Error, e.Id, e.LeaseLife} } diff --git a/vendor/github.com/miekg/dns/generate.go b/vendor/github.com/miekg/dns/generate.go index ac8df34dd..a81d2bc51 100644 --- a/vendor/github.com/miekg/dns/generate.go +++ b/vendor/github.com/miekg/dns/generate.go @@ -35,17 +35,17 @@ func (zp *ZoneParser) generate(l lex) (RR, bool) { token = token[:i] } - sx := strings.SplitN(token, "-", 2) - if len(sx) != 2 { + startStr, endStr, ok := strings.Cut(token, "-") + if !ok { return zp.setParseError("bad start-stop in $GENERATE range", l) } - start, err := strconv.ParseInt(sx[0], 10, 64) + start, err := strconv.ParseInt(startStr, 10, 64) if err != nil { return zp.setParseError("bad start in $GENERATE range", l) } - end, err := strconv.ParseInt(sx[1], 10, 64) + end, err := strconv.ParseInt(endStr, 10, 64) if err != nil { return zp.setParseError("bad stop in $GENERATE range", l) } @@ -54,7 +54,7 @@ func (zp *ZoneParser) generate(l lex) (RR, bool) { } // _BLANK - l, ok := zp.c.Next() + l, ok = zp.c.Next() if !ok || l.value != zBlank { return zp.setParseError("garbage after $GENERATE range", l) } @@ -116,7 +116,7 @@ func (r *generateReader) parseError(msg string, end int) *ParseError { l.token = r.s[r.si-1 : end] l.column += r.si // l.column starts one zBLANK before r.s - return &ParseError{r.file, msg, l} + return &ParseError{file: r.file, err: msg, lex: l} } func (r *generateReader) Read(p []byte) (int, error) { @@ -211,15 +211,16 @@ func (r *generateReader) ReadByte() (byte, error) { func modToPrintf(s string) (string, int64, string) { // Modifier is { offset [ ,width [ ,base ] ] } - provide default // values for optional width and type, if necessary. - var offStr, widthStr, base string - switch xs := strings.Split(s, ","); len(xs) { - case 1: - offStr, widthStr, base = xs[0], "0", "d" - case 2: - offStr, widthStr, base = xs[0], xs[1], "d" - case 3: - offStr, widthStr, base = xs[0], xs[1], xs[2] - default: + offStr, s, ok0 := strings.Cut(s, ",") + widthStr, s, ok1 := strings.Cut(s, ",") + base, _, ok2 := strings.Cut(s, ",") + if !ok0 { + widthStr = "0" + } + if !ok1 { + base = "d" + } + if ok2 { return "", 0, "bad modifier in $GENERATE" } @@ -234,8 +235,8 @@ func modToPrintf(s string) (string, int64, string) { return "", 0, "bad offset in $GENERATE" } - width, err := strconv.ParseInt(widthStr, 10, 64) - if err != nil || width < 0 || width > 255 { + width, err := strconv.ParseUint(widthStr, 10, 8) + if err != nil { return "", 0, "bad width in $GENERATE" } diff --git a/vendor/github.com/miekg/dns/listen_no_reuseport.go b/vendor/github.com/miekg/dns/listen_no_reuseport.go index 6ed50f86b..8cebb2f17 100644 --- a/vendor/github.com/miekg/dns/listen_no_reuseport.go +++ b/vendor/github.com/miekg/dns/listen_no_reuseport.go @@ -7,16 +7,18 @@ import "net" const supportsReusePort = false -func listenTCP(network, addr string, reuseport bool) (net.Listener, error) { - if reuseport { +func listenTCP(network, addr string, reuseport, reuseaddr bool) (net.Listener, error) { + if reuseport || reuseaddr { // TODO(tmthrgd): return an error? } return net.Listen(network, addr) } -func listenUDP(network, addr string, reuseport bool) (net.PacketConn, error) { - if reuseport { +const supportsReuseAddr = false + +func listenUDP(network, addr string, reuseport, reuseaddr bool) (net.PacketConn, error) { + if reuseport || reuseaddr { // TODO(tmthrgd): return an error? } diff --git a/vendor/github.com/miekg/dns/listen_reuseport.go b/vendor/github.com/miekg/dns/listen_reuseport.go index 89bac9034..41326f20b 100644 --- a/vendor/github.com/miekg/dns/listen_reuseport.go +++ b/vendor/github.com/miekg/dns/listen_reuseport.go @@ -25,19 +25,41 @@ func reuseportControl(network, address string, c syscall.RawConn) error { return opErr } -func listenTCP(network, addr string, reuseport bool) (net.Listener, error) { +const supportsReuseAddr = true + +func reuseaddrControl(network, address string, c syscall.RawConn) error { + var opErr error + err := c.Control(func(fd uintptr) { + opErr = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEADDR, 1) + }) + if err != nil { + return err + } + + return opErr +} + +func listenTCP(network, addr string, reuseport, reuseaddr bool) (net.Listener, error) { var lc net.ListenConfig - if reuseport { + switch { + case reuseaddr && reuseport: + case reuseport: lc.Control = reuseportControl + case reuseaddr: + lc.Control = reuseaddrControl } return lc.Listen(context.Background(), network, addr) } -func listenUDP(network, addr string, reuseport bool) (net.PacketConn, error) { +func listenUDP(network, addr string, reuseport, reuseaddr bool) (net.PacketConn, error) { var lc net.ListenConfig - if reuseport { + switch { + case reuseaddr && reuseport: + case reuseport: lc.Control = reuseportControl + case reuseaddr: + lc.Control = reuseaddrControl } return lc.ListenPacket(context.Background(), network, addr) diff --git a/vendor/github.com/miekg/dns/msg.go b/vendor/github.com/miekg/dns/msg.go index b05cf14e9..8294d0395 100644 --- a/vendor/github.com/miekg/dns/msg.go +++ b/vendor/github.com/miekg/dns/msg.go @@ -501,30 +501,28 @@ func packTxtString(s string, msg []byte, offset int) (int, error) { return offset, nil } -func packOctetString(s string, msg []byte, offset int, tmp []byte) (int, error) { - if offset >= len(msg) || len(s) > len(tmp) { +func packOctetString(s string, msg []byte, offset int) (int, error) { + if offset >= len(msg) || len(s) > 256*4+1 { return offset, ErrBuf } - bs := tmp[:len(s)] - copy(bs, s) - for i := 0; i < len(bs); i++ { + for i := 0; i < len(s); i++ { if len(msg) <= offset { return offset, ErrBuf } - if bs[i] == '\\' { + if s[i] == '\\' { i++ - if i == len(bs) { + if i == len(s) { break } // check for \DDD - if isDDD(bs[i:]) { - msg[offset] = dddToByte(bs[i:]) + if isDDD(s[i:]) { + msg[offset] = dddToByte(s[i:]) i += 2 } else { - msg[offset] = bs[i] + msg[offset] = s[i] } } else { - msg[offset] = bs[i] + msg[offset] = s[i] } offset++ } diff --git a/vendor/github.com/miekg/dns/msg_helpers.go b/vendor/github.com/miekg/dns/msg_helpers.go index 8582fc0ad..acec21f7d 100644 --- a/vendor/github.com/miekg/dns/msg_helpers.go +++ b/vendor/github.com/miekg/dns/msg_helpers.go @@ -20,9 +20,7 @@ func unpackDataA(msg []byte, off int) (net.IP, int, error) { if off+net.IPv4len > len(msg) { return nil, len(msg), &Error{err: "overflow unpacking a"} } - a := append(make(net.IP, 0, net.IPv4len), msg[off:off+net.IPv4len]...) - off += net.IPv4len - return a, off, nil + return cloneSlice(msg[off : off+net.IPv4len]), off + net.IPv4len, nil } func packDataA(a net.IP, msg []byte, off int) (int, error) { @@ -47,9 +45,7 @@ func unpackDataAAAA(msg []byte, off int) (net.IP, int, error) { if off+net.IPv6len > len(msg) { return nil, len(msg), &Error{err: "overflow unpacking aaaa"} } - aaaa := append(make(net.IP, 0, net.IPv6len), msg[off:off+net.IPv6len]...) - off += net.IPv6len - return aaaa, off, nil + return cloneSlice(msg[off : off+net.IPv6len]), off + net.IPv6len, nil } func packDataAAAA(aaaa net.IP, msg []byte, off int) (int, error) { @@ -410,29 +406,24 @@ func packStringTxt(s []string, msg []byte, off int) (int, error) { func unpackDataOpt(msg []byte, off int) ([]EDNS0, int, error) { var edns []EDNS0 -Option: - var code uint16 - if off+4 > len(msg) { - return nil, len(msg), &Error{err: "overflow unpacking opt"} + for off < len(msg) { + if off+4 > len(msg) { + return nil, len(msg), &Error{err: "overflow unpacking opt"} + } + code := binary.BigEndian.Uint16(msg[off:]) + off += 2 + optlen := binary.BigEndian.Uint16(msg[off:]) + off += 2 + if off+int(optlen) > len(msg) { + return nil, len(msg), &Error{err: "overflow unpacking opt"} + } + opt := makeDataOpt(code) + if err := opt.unpack(msg[off : off+int(optlen)]); err != nil { + return nil, len(msg), err + } + edns = append(edns, opt) + off += int(optlen) } - code = binary.BigEndian.Uint16(msg[off:]) - off += 2 - optlen := binary.BigEndian.Uint16(msg[off:]) - off += 2 - if off+int(optlen) > len(msg) { - return nil, len(msg), &Error{err: "overflow unpacking opt"} - } - e := makeDataOpt(code) - if err := e.unpack(msg[off : off+int(optlen)]); err != nil { - return nil, len(msg), err - } - edns = append(edns, e) - off += int(optlen) - - if off < len(msg) { - goto Option - } - return edns, off, nil } @@ -461,8 +452,7 @@ func unpackStringOctet(msg []byte, off int) (string, int, error) { } func packStringOctet(s string, msg []byte, off int) (int, error) { - txtTmp := make([]byte, 256*4+1) - off, err := packOctetString(s, msg, off, txtTmp) + off, err := packOctetString(s, msg, off) if err != nil { return len(msg), err } diff --git a/vendor/github.com/miekg/dns/privaterr.go b/vendor/github.com/miekg/dns/privaterr.go index d256b652e..350ea5a47 100644 --- a/vendor/github.com/miekg/dns/privaterr.go +++ b/vendor/github.com/miekg/dns/privaterr.go @@ -84,7 +84,7 @@ Fetch: err := r.Data.Parse(text) if err != nil { - return &ParseError{"", err.Error(), l} + return &ParseError{wrappedErr: err, lex: l} } return nil diff --git a/vendor/github.com/miekg/dns/scan.go b/vendor/github.com/miekg/dns/scan.go index 3083c3e5f..1f92ae421 100644 --- a/vendor/github.com/miekg/dns/scan.go +++ b/vendor/github.com/miekg/dns/scan.go @@ -4,7 +4,9 @@ import ( "bufio" "fmt" "io" + "io/fs" "os" + "path" "path/filepath" "strconv" "strings" @@ -64,20 +66,26 @@ const ( // ParseError is a parsing error. It contains the parse error and the location in the io.Reader // where the error occurred. type ParseError struct { - file string - err string - lex lex + file string + err string + wrappedErr error + lex lex } func (e *ParseError) Error() (s string) { if e.file != "" { s = e.file + ": " } + if e.err == "" && e.wrappedErr != nil { + e.err = e.wrappedErr.Error() + } s += "dns: " + e.err + ": " + strconv.QuoteToASCII(e.lex.token) + " at line: " + strconv.Itoa(e.lex.line) + ":" + strconv.Itoa(e.lex.column) return } +func (e *ParseError) Unwrap() error { return e.wrappedErr } + type lex struct { token string // text of the token err bool // when true, token text has lexer error @@ -168,8 +176,9 @@ type ZoneParser struct { // sub is used to parse $INCLUDE files and $GENERATE directives. // Next, by calling subNext, forwards the resulting RRs from this // sub parser to the calling code. - sub *ZoneParser - osFile *os.File + sub *ZoneParser + r io.Reader + fsys fs.FS includeDepth uint8 @@ -188,7 +197,7 @@ func NewZoneParser(r io.Reader, origin, file string) *ZoneParser { if origin != "" { origin = Fqdn(origin) if _, ok := IsDomainName(origin); !ok { - pe = &ParseError{file, "bad initial origin name", lex{}} + pe = &ParseError{file: file, err: "bad initial origin name"} } } @@ -220,6 +229,24 @@ func (zp *ZoneParser) SetIncludeAllowed(v bool) { zp.includeAllowed = v } +// SetIncludeFS provides an [fs.FS] to use when looking for the target of +// $INCLUDE directives. ($INCLUDE must still be enabled separately by calling +// [ZoneParser.SetIncludeAllowed].) If fsys is nil, [os.Open] will be used. +// +// When fsys is an on-disk FS, the ability of $INCLUDE to reach files from +// outside its root directory depends upon the FS implementation. For +// instance, [os.DirFS] will refuse to open paths like "../../etc/passwd", +// however it will still follow links which may point anywhere on the system. +// +// FS paths are slash-separated on all systems, even Windows. $INCLUDE paths +// containing other characters such as backslash and colon may be accepted as +// valid, but those characters will never be interpreted by an FS +// implementation as path element separators. See [fs.ValidPath] for more +// details. +func (zp *ZoneParser) SetIncludeFS(fsys fs.FS) { + zp.fsys = fsys +} + // Err returns the first non-EOF error that was encountered by the // ZoneParser. func (zp *ZoneParser) Err() error { @@ -237,7 +264,7 @@ func (zp *ZoneParser) Err() error { } func (zp *ZoneParser) setParseError(err string, l lex) (RR, bool) { - zp.parseErr = &ParseError{zp.file, err, l} + zp.parseErr = &ParseError{file: zp.file, err: err, lex: l} return nil, false } @@ -260,9 +287,11 @@ func (zp *ZoneParser) subNext() (RR, bool) { return rr, true } - if zp.sub.osFile != nil { - zp.sub.osFile.Close() - zp.sub.osFile = nil + if zp.sub.r != nil { + if c, ok := zp.sub.r.(io.Closer); ok { + c.Close() + } + zp.sub.r = nil } if zp.sub.Err() != nil { @@ -402,24 +431,44 @@ func (zp *ZoneParser) Next() (RR, bool) { // Start with the new file includePath := l.token - if !filepath.IsAbs(includePath) { - includePath = filepath.Join(filepath.Dir(zp.file), includePath) - } - - r1, e1 := os.Open(includePath) - if e1 != nil { - var as string - if !filepath.IsAbs(l.token) { - as = fmt.Sprintf(" as `%s'", includePath) + var r1 io.Reader + var e1 error + if zp.fsys != nil { + // fs.FS always uses / as separator, even on Windows, so use + // path instead of filepath here: + if !path.IsAbs(includePath) { + includePath = path.Join(path.Dir(zp.file), includePath) } - msg := fmt.Sprintf("failed to open `%s'%s: %v", l.token, as, e1) - return zp.setParseError(msg, l) + // os.DirFS, and probably others, expect all paths to be + // relative, so clean the path and remove leading / if + // present: + includePath = strings.TrimLeft(path.Clean(includePath), "/") + + r1, e1 = zp.fsys.Open(includePath) + } else { + if !filepath.IsAbs(includePath) { + includePath = filepath.Join(filepath.Dir(zp.file), includePath) + } + r1, e1 = os.Open(includePath) + } + if e1 != nil { + var as string + if includePath != l.token { + as = fmt.Sprintf(" as `%s'", includePath) + } + zp.parseErr = &ParseError{ + file: zp.file, + wrappedErr: fmt.Errorf("failed to open `%s'%s: %w", l.token, as, e1), + lex: l, + } + return nil, false } zp.sub = NewZoneParser(r1, neworigin, includePath) - zp.sub.defttl, zp.sub.includeDepth, zp.sub.osFile = zp.defttl, zp.includeDepth+1, r1 + zp.sub.defttl, zp.sub.includeDepth, zp.sub.r = zp.defttl, zp.includeDepth+1, r1 zp.sub.SetIncludeAllowed(true) + zp.sub.SetIncludeFS(zp.fsys) return zp.subNext() case zExpectDirTTLBl: if l.value != zBlank { @@ -605,8 +654,6 @@ func (zp *ZoneParser) Next() (RR, bool) { if !isPrivate && zp.c.Peek().token == "" { // This is a dynamic update rr. - // TODO(tmthrgd): Previously slurpRemainder was only called - // for certain RR types, which may have been important. if err := slurpRemainder(zp.c); err != nil { return zp.setParseError(err.err, err.lex) } @@ -1216,42 +1263,34 @@ func stringToCm(token string) (e, m uint8, ok bool) { if token[len(token)-1] == 'M' || token[len(token)-1] == 'm' { token = token[0 : len(token)-1] } - s := strings.SplitN(token, ".", 2) - var meters, cmeters, val int - var err error - switch len(s) { - case 2: - if cmeters, err = strconv.Atoi(s[1]); err != nil { - return - } + + var ( + meters, cmeters, val int + err error + ) + mStr, cmStr, hasCM := strings.Cut(token, ".") + if hasCM { // There's no point in having more than 2 digits in this part, and would rather make the implementation complicated ('123' should be treated as '12'). // So we simply reject it. // We also make sure the first character is a digit to reject '+-' signs. - if len(s[1]) > 2 || s[1][0] < '0' || s[1][0] > '9' { + cmeters, err = strconv.Atoi(cmStr) + if err != nil || len(cmStr) > 2 || cmStr[0] < '0' || cmStr[0] > '9' { return } - if len(s[1]) == 1 { + if len(cmStr) == 1 { // 'nn.1' must be treated as 'nn-meters and 10cm, not 1cm. cmeters *= 10 } - if s[0] == "" { - // This will allow omitting the 'meter' part, like .01 (meaning 0.01m = 1cm). - break - } - fallthrough - case 1: - if meters, err = strconv.Atoi(s[0]); err != nil { - return - } - // RFC1876 states the max value is 90000000.00. The latter two conditions enforce it. - if s[0][0] < '0' || s[0][0] > '9' || meters > 90000000 || (meters == 90000000 && cmeters != 0) { - return - } - case 0: - // huh? - return 0, 0, false } - ok = true + // This slighly ugly condition will allow omitting the 'meter' part, like .01 (meaning 0.01m = 1cm). + if !hasCM || mStr != "" { + meters, err = strconv.Atoi(mStr) + // RFC1876 states the max value is 90000000.00. The latter two conditions enforce it. + if err != nil || mStr[0] < '0' || mStr[0] > '9' || meters > 90000000 || (meters == 90000000 && cmeters != 0) { + return + } + } + if meters > 0 { e = 2 val = meters @@ -1263,8 +1302,7 @@ func stringToCm(token string) (e, m uint8, ok bool) { e++ val /= 10 } - m = uint8(val) - return + return e, uint8(val), true } func toAbsoluteName(name, origin string) (absolute string, ok bool) { @@ -1337,12 +1375,12 @@ func slurpRemainder(c *zlexer) *ParseError { case zBlank: l, _ = c.Next() if l.value != zNewline && l.value != zEOF { - return &ParseError{"", "garbage after rdata", l} + return &ParseError{err: "garbage after rdata", lex: l} } case zNewline: case zEOF: default: - return &ParseError{"", "garbage after rdata", l} + return &ParseError{err: "garbage after rdata", lex: l} } return nil } @@ -1351,16 +1389,16 @@ func slurpRemainder(c *zlexer) *ParseError { // Used for NID and L64 record. func stringToNodeID(l lex) (uint64, *ParseError) { if len(l.token) < 19 { - return 0, &ParseError{l.token, "bad NID/L64 NodeID/Locator64", l} + return 0, &ParseError{file: l.token, err: "bad NID/L64 NodeID/Locator64", lex: l} } // There must be three colons at fixes positions, if not its a parse error if l.token[4] != ':' && l.token[9] != ':' && l.token[14] != ':' { - return 0, &ParseError{l.token, "bad NID/L64 NodeID/Locator64", l} + return 0, &ParseError{file: l.token, err: "bad NID/L64 NodeID/Locator64", lex: l} } s := l.token[0:4] + l.token[5:9] + l.token[10:14] + l.token[15:19] u, err := strconv.ParseUint(s, 16, 64) if err != nil { - return 0, &ParseError{l.token, "bad NID/L64 NodeID/Locator64", l} + return 0, &ParseError{file: l.token, err: "bad NID/L64 NodeID/Locator64", lex: l} } return u, nil } diff --git a/vendor/github.com/miekg/dns/scan_rr.go b/vendor/github.com/miekg/dns/scan_rr.go index d08c8e6a7..1a90c61f8 100644 --- a/vendor/github.com/miekg/dns/scan_rr.go +++ b/vendor/github.com/miekg/dns/scan_rr.go @@ -1,9 +1,9 @@ package dns import ( - "bytes" "encoding/base64" "errors" + "fmt" "net" "strconv" "strings" @@ -12,23 +12,23 @@ import ( // A remainder of the rdata with embedded spaces, return the parsed string (sans the spaces) // or an error func endingToString(c *zlexer, errstr string) (string, *ParseError) { - var buffer bytes.Buffer + var s strings.Builder l, _ := c.Next() // zString for l.value != zNewline && l.value != zEOF { if l.err { - return buffer.String(), &ParseError{"", errstr, l} + return s.String(), &ParseError{err: errstr, lex: l} } switch l.value { case zString: - buffer.WriteString(l.token) + s.WriteString(l.token) case zBlank: // Ok default: - return "", &ParseError{"", errstr, l} + return "", &ParseError{err: errstr, lex: l} } l, _ = c.Next() } - return buffer.String(), nil + return s.String(), nil } // A remainder of the rdata with embedded spaces, split on unquoted whitespace @@ -37,7 +37,7 @@ func endingToTxtSlice(c *zlexer, errstr string) ([]string, *ParseError) { // Get the remaining data until we see a zNewline l, _ := c.Next() if l.err { - return nil, &ParseError{"", errstr, l} + return nil, &ParseError{err: errstr, lex: l} } // Build the slice @@ -46,7 +46,7 @@ func endingToTxtSlice(c *zlexer, errstr string) ([]string, *ParseError) { empty := false for l.value != zNewline && l.value != zEOF { if l.err { - return nil, &ParseError{"", errstr, l} + return nil, &ParseError{err: errstr, lex: l} } switch l.value { case zString: @@ -73,7 +73,7 @@ func endingToTxtSlice(c *zlexer, errstr string) ([]string, *ParseError) { case zBlank: if quote { // zBlank can only be seen in between txt parts. - return nil, &ParseError{"", errstr, l} + return nil, &ParseError{err: errstr, lex: l} } case zQuote: if empty && quote { @@ -82,13 +82,13 @@ func endingToTxtSlice(c *zlexer, errstr string) ([]string, *ParseError) { quote = !quote empty = true default: - return nil, &ParseError{"", errstr, l} + return nil, &ParseError{err: errstr, lex: l} } l, _ = c.Next() } if quote { - return nil, &ParseError{"", errstr, l} + return nil, &ParseError{err: errstr, lex: l} } return s, nil @@ -103,7 +103,7 @@ func (rr *A) parse(c *zlexer, o string) *ParseError { // IPv4. isIPv4 := !strings.Contains(l.token, ":") if rr.A == nil || !isIPv4 || l.err { - return &ParseError{"", "bad A A", l} + return &ParseError{err: "bad A A", lex: l} } return slurpRemainder(c) } @@ -115,7 +115,7 @@ func (rr *AAAA) parse(c *zlexer, o string) *ParseError { // addresses cannot include ":". isIPv6 := strings.Contains(l.token, ":") if rr.AAAA == nil || !isIPv6 || l.err { - return &ParseError{"", "bad AAAA AAAA", l} + return &ParseError{err: "bad AAAA AAAA", lex: l} } return slurpRemainder(c) } @@ -124,7 +124,7 @@ func (rr *NS) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{"", "bad NS Ns", l} + return &ParseError{err: "bad NS Ns", lex: l} } rr.Ns = name return slurpRemainder(c) @@ -134,7 +134,7 @@ func (rr *PTR) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{"", "bad PTR Ptr", l} + return &ParseError{err: "bad PTR Ptr", lex: l} } rr.Ptr = name return slurpRemainder(c) @@ -144,7 +144,7 @@ func (rr *NSAPPTR) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{"", "bad NSAP-PTR Ptr", l} + return &ParseError{err: "bad NSAP-PTR Ptr", lex: l} } rr.Ptr = name return slurpRemainder(c) @@ -154,7 +154,7 @@ func (rr *RP) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() mbox, mboxOk := toAbsoluteName(l.token, o) if l.err || !mboxOk { - return &ParseError{"", "bad RP Mbox", l} + return &ParseError{err: "bad RP Mbox", lex: l} } rr.Mbox = mbox @@ -164,7 +164,7 @@ func (rr *RP) parse(c *zlexer, o string) *ParseError { txt, txtOk := toAbsoluteName(l.token, o) if l.err || !txtOk { - return &ParseError{"", "bad RP Txt", l} + return &ParseError{err: "bad RP Txt", lex: l} } rr.Txt = txt @@ -175,7 +175,7 @@ func (rr *MR) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{"", "bad MR Mr", l} + return &ParseError{err: "bad MR Mr", lex: l} } rr.Mr = name return slurpRemainder(c) @@ -185,7 +185,7 @@ func (rr *MB) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{"", "bad MB Mb", l} + return &ParseError{err: "bad MB Mb", lex: l} } rr.Mb = name return slurpRemainder(c) @@ -195,7 +195,7 @@ func (rr *MG) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{"", "bad MG Mg", l} + return &ParseError{err: "bad MG Mg", lex: l} } rr.Mg = name return slurpRemainder(c) @@ -220,6 +220,29 @@ func (rr *HINFO) parse(c *zlexer, o string) *ParseError { rr.Cpu = chunks[0] rr.Os = strings.Join(chunks[1:], " ") + return nil +} + +// according to RFC 1183 the parsing is identical to HINFO, so just use that code. +func (rr *ISDN) parse(c *zlexer, o string) *ParseError { + chunks, e := endingToTxtSlice(c, "bad ISDN Fields") + if e != nil { + return e + } + + if ln := len(chunks); ln == 0 { + return nil + } else if ln == 1 { + // Can we split it? + if out := strings.Fields(chunks[0]); len(out) > 1 { + chunks = out + } else { + chunks = append(chunks, "") + } + } + + rr.Address = chunks[0] + rr.SubAddress = strings.Join(chunks[1:], " ") return nil } @@ -228,7 +251,7 @@ func (rr *MINFO) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() rmail, rmailOk := toAbsoluteName(l.token, o) if l.err || !rmailOk { - return &ParseError{"", "bad MINFO Rmail", l} + return &ParseError{err: "bad MINFO Rmail", lex: l} } rr.Rmail = rmail @@ -238,7 +261,7 @@ func (rr *MINFO) parse(c *zlexer, o string) *ParseError { email, emailOk := toAbsoluteName(l.token, o) if l.err || !emailOk { - return &ParseError{"", "bad MINFO Email", l} + return &ParseError{err: "bad MINFO Email", lex: l} } rr.Email = email @@ -249,7 +272,7 @@ func (rr *MF) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{"", "bad MF Mf", l} + return &ParseError{err: "bad MF Mf", lex: l} } rr.Mf = name return slurpRemainder(c) @@ -259,7 +282,7 @@ func (rr *MD) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{"", "bad MD Md", l} + return &ParseError{err: "bad MD Md", lex: l} } rr.Md = name return slurpRemainder(c) @@ -269,7 +292,7 @@ func (rr *MX) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{"", "bad MX Pref", l} + return &ParseError{err: "bad MX Pref", lex: l} } rr.Preference = uint16(i) @@ -279,7 +302,7 @@ func (rr *MX) parse(c *zlexer, o string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{"", "bad MX Mx", l} + return &ParseError{err: "bad MX Mx", lex: l} } rr.Mx = name @@ -290,7 +313,7 @@ func (rr *RT) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil { - return &ParseError{"", "bad RT Preference", l} + return &ParseError{err: "bad RT Preference", lex: l} } rr.Preference = uint16(i) @@ -300,7 +323,7 @@ func (rr *RT) parse(c *zlexer, o string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{"", "bad RT Host", l} + return &ParseError{err: "bad RT Host", lex: l} } rr.Host = name @@ -311,7 +334,7 @@ func (rr *AFSDB) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{"", "bad AFSDB Subtype", l} + return &ParseError{err: "bad AFSDB Subtype", lex: l} } rr.Subtype = uint16(i) @@ -321,7 +344,7 @@ func (rr *AFSDB) parse(c *zlexer, o string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{"", "bad AFSDB Hostname", l} + return &ParseError{err: "bad AFSDB Hostname", lex: l} } rr.Hostname = name return slurpRemainder(c) @@ -330,7 +353,7 @@ func (rr *AFSDB) parse(c *zlexer, o string) *ParseError { func (rr *X25) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() if l.err { - return &ParseError{"", "bad X25 PSDNAddress", l} + return &ParseError{err: "bad X25 PSDNAddress", lex: l} } rr.PSDNAddress = l.token return slurpRemainder(c) @@ -340,7 +363,7 @@ func (rr *KX) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{"", "bad KX Pref", l} + return &ParseError{err: "bad KX Pref", lex: l} } rr.Preference = uint16(i) @@ -350,7 +373,7 @@ func (rr *KX) parse(c *zlexer, o string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{"", "bad KX Exchanger", l} + return &ParseError{err: "bad KX Exchanger", lex: l} } rr.Exchanger = name return slurpRemainder(c) @@ -360,7 +383,7 @@ func (rr *CNAME) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{"", "bad CNAME Target", l} + return &ParseError{err: "bad CNAME Target", lex: l} } rr.Target = name return slurpRemainder(c) @@ -370,7 +393,7 @@ func (rr *DNAME) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{"", "bad DNAME Target", l} + return &ParseError{err: "bad DNAME Target", lex: l} } rr.Target = name return slurpRemainder(c) @@ -380,7 +403,7 @@ func (rr *SOA) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() ns, nsOk := toAbsoluteName(l.token, o) if l.err || !nsOk { - return &ParseError{"", "bad SOA Ns", l} + return &ParseError{err: "bad SOA Ns", lex: l} } rr.Ns = ns @@ -390,7 +413,7 @@ func (rr *SOA) parse(c *zlexer, o string) *ParseError { mbox, mboxOk := toAbsoluteName(l.token, o) if l.err || !mboxOk { - return &ParseError{"", "bad SOA Mbox", l} + return &ParseError{err: "bad SOA Mbox", lex: l} } rr.Mbox = mbox @@ -403,16 +426,16 @@ func (rr *SOA) parse(c *zlexer, o string) *ParseError { for i := 0; i < 5; i++ { l, _ = c.Next() if l.err { - return &ParseError{"", "bad SOA zone parameter", l} + return &ParseError{err: "bad SOA zone parameter", lex: l} } if j, err := strconv.ParseUint(l.token, 10, 32); err != nil { if i == 0 { // Serial must be a number - return &ParseError{"", "bad SOA zone parameter", l} + return &ParseError{err: "bad SOA zone parameter", lex: l} } // We allow other fields to be unitful duration strings if v, ok = stringToTTL(l.token); !ok { - return &ParseError{"", "bad SOA zone parameter", l} + return &ParseError{err: "bad SOA zone parameter", lex: l} } } else { @@ -442,7 +465,7 @@ func (rr *SRV) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{"", "bad SRV Priority", l} + return &ParseError{err: "bad SRV Priority", lex: l} } rr.Priority = uint16(i) @@ -450,7 +473,7 @@ func (rr *SRV) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() // zString i, e1 := strconv.ParseUint(l.token, 10, 16) if e1 != nil || l.err { - return &ParseError{"", "bad SRV Weight", l} + return &ParseError{err: "bad SRV Weight", lex: l} } rr.Weight = uint16(i) @@ -458,7 +481,7 @@ func (rr *SRV) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() // zString i, e2 := strconv.ParseUint(l.token, 10, 16) if e2 != nil || l.err { - return &ParseError{"", "bad SRV Port", l} + return &ParseError{err: "bad SRV Port", lex: l} } rr.Port = uint16(i) @@ -468,7 +491,7 @@ func (rr *SRV) parse(c *zlexer, o string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{"", "bad SRV Target", l} + return &ParseError{err: "bad SRV Target", lex: l} } rr.Target = name return slurpRemainder(c) @@ -478,7 +501,7 @@ func (rr *NAPTR) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{"", "bad NAPTR Order", l} + return &ParseError{err: "bad NAPTR Order", lex: l} } rr.Order = uint16(i) @@ -486,7 +509,7 @@ func (rr *NAPTR) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() // zString i, e1 := strconv.ParseUint(l.token, 10, 16) if e1 != nil || l.err { - return &ParseError{"", "bad NAPTR Preference", l} + return &ParseError{err: "bad NAPTR Preference", lex: l} } rr.Preference = uint16(i) @@ -494,57 +517,57 @@ func (rr *NAPTR) parse(c *zlexer, o string) *ParseError { c.Next() // zBlank l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{"", "bad NAPTR Flags", l} + return &ParseError{err: "bad NAPTR Flags", lex: l} } l, _ = c.Next() // Either String or Quote if l.value == zString { rr.Flags = l.token l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{"", "bad NAPTR Flags", l} + return &ParseError{err: "bad NAPTR Flags", lex: l} } } else if l.value == zQuote { rr.Flags = "" } else { - return &ParseError{"", "bad NAPTR Flags", l} + return &ParseError{err: "bad NAPTR Flags", lex: l} } // Service c.Next() // zBlank l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{"", "bad NAPTR Service", l} + return &ParseError{err: "bad NAPTR Service", lex: l} } l, _ = c.Next() // Either String or Quote if l.value == zString { rr.Service = l.token l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{"", "bad NAPTR Service", l} + return &ParseError{err: "bad NAPTR Service", lex: l} } } else if l.value == zQuote { rr.Service = "" } else { - return &ParseError{"", "bad NAPTR Service", l} + return &ParseError{err: "bad NAPTR Service", lex: l} } // Regexp c.Next() // zBlank l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{"", "bad NAPTR Regexp", l} + return &ParseError{err: "bad NAPTR Regexp", lex: l} } l, _ = c.Next() // Either String or Quote if l.value == zString { rr.Regexp = l.token l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{"", "bad NAPTR Regexp", l} + return &ParseError{err: "bad NAPTR Regexp", lex: l} } } else if l.value == zQuote { rr.Regexp = "" } else { - return &ParseError{"", "bad NAPTR Regexp", l} + return &ParseError{err: "bad NAPTR Regexp", lex: l} } // After quote no space?? @@ -554,7 +577,7 @@ func (rr *NAPTR) parse(c *zlexer, o string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{"", "bad NAPTR Replacement", l} + return &ParseError{err: "bad NAPTR Replacement", lex: l} } rr.Replacement = name return slurpRemainder(c) @@ -564,7 +587,7 @@ func (rr *TALINK) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() previousName, previousNameOk := toAbsoluteName(l.token, o) if l.err || !previousNameOk { - return &ParseError{"", "bad TALINK PreviousName", l} + return &ParseError{err: "bad TALINK PreviousName", lex: l} } rr.PreviousName = previousName @@ -574,7 +597,7 @@ func (rr *TALINK) parse(c *zlexer, o string) *ParseError { nextName, nextNameOk := toAbsoluteName(l.token, o) if l.err || !nextNameOk { - return &ParseError{"", "bad TALINK NextName", l} + return &ParseError{err: "bad TALINK NextName", lex: l} } rr.NextName = nextName @@ -592,7 +615,7 @@ func (rr *LOC) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 32) if e != nil || l.err || i > 90 { - return &ParseError{"", "bad LOC Latitude", l} + return &ParseError{err: "bad LOC Latitude", lex: l} } rr.Latitude = 1000 * 60 * 60 * uint32(i) @@ -603,7 +626,7 @@ func (rr *LOC) parse(c *zlexer, o string) *ParseError { goto East } if i, err := strconv.ParseUint(l.token, 10, 32); err != nil || l.err || i > 59 { - return &ParseError{"", "bad LOC Latitude minutes", l} + return &ParseError{err: "bad LOC Latitude minutes", lex: l} } else { rr.Latitude += 1000 * 60 * uint32(i) } @@ -611,7 +634,7 @@ func (rr *LOC) parse(c *zlexer, o string) *ParseError { c.Next() // zBlank l, _ = c.Next() if i, err := strconv.ParseFloat(l.token, 64); err != nil || l.err || i < 0 || i >= 60 { - return &ParseError{"", "bad LOC Latitude seconds", l} + return &ParseError{err: "bad LOC Latitude seconds", lex: l} } else { rr.Latitude += uint32(1000 * i) } @@ -622,14 +645,14 @@ func (rr *LOC) parse(c *zlexer, o string) *ParseError { goto East } // If still alive, flag an error - return &ParseError{"", "bad LOC Latitude North/South", l} + return &ParseError{err: "bad LOC Latitude North/South", lex: l} East: // East c.Next() // zBlank l, _ = c.Next() if i, err := strconv.ParseUint(l.token, 10, 32); err != nil || l.err || i > 180 { - return &ParseError{"", "bad LOC Longitude", l} + return &ParseError{err: "bad LOC Longitude", lex: l} } else { rr.Longitude = 1000 * 60 * 60 * uint32(i) } @@ -640,14 +663,14 @@ East: goto Altitude } if i, err := strconv.ParseUint(l.token, 10, 32); err != nil || l.err || i > 59 { - return &ParseError{"", "bad LOC Longitude minutes", l} + return &ParseError{err: "bad LOC Longitude minutes", lex: l} } else { rr.Longitude += 1000 * 60 * uint32(i) } c.Next() // zBlank l, _ = c.Next() if i, err := strconv.ParseFloat(l.token, 64); err != nil || l.err || i < 0 || i >= 60 { - return &ParseError{"", "bad LOC Longitude seconds", l} + return &ParseError{err: "bad LOC Longitude seconds", lex: l} } else { rr.Longitude += uint32(1000 * i) } @@ -658,19 +681,19 @@ East: goto Altitude } // If still alive, flag an error - return &ParseError{"", "bad LOC Longitude East/West", l} + return &ParseError{err: "bad LOC Longitude East/West", lex: l} Altitude: c.Next() // zBlank l, _ = c.Next() if l.token == "" || l.err { - return &ParseError{"", "bad LOC Altitude", l} + return &ParseError{err: "bad LOC Altitude", lex: l} } if l.token[len(l.token)-1] == 'M' || l.token[len(l.token)-1] == 'm' { l.token = l.token[0 : len(l.token)-1] } if i, err := strconv.ParseFloat(l.token, 64); err != nil { - return &ParseError{"", "bad LOC Altitude", l} + return &ParseError{err: "bad LOC Altitude", lex: l} } else { rr.Altitude = uint32(i*100.0 + 10000000.0 + 0.5) } @@ -685,19 +708,19 @@ Altitude: case 0: // Size exp, m, ok := stringToCm(l.token) if !ok { - return &ParseError{"", "bad LOC Size", l} + return &ParseError{err: "bad LOC Size", lex: l} } rr.Size = exp&0x0f | m<<4&0xf0 case 1: // HorizPre exp, m, ok := stringToCm(l.token) if !ok { - return &ParseError{"", "bad LOC HorizPre", l} + return &ParseError{err: "bad LOC HorizPre", lex: l} } rr.HorizPre = exp&0x0f | m<<4&0xf0 case 2: // VertPre exp, m, ok := stringToCm(l.token) if !ok { - return &ParseError{"", "bad LOC VertPre", l} + return &ParseError{err: "bad LOC VertPre", lex: l} } rr.VertPre = exp&0x0f | m<<4&0xf0 } @@ -705,7 +728,7 @@ Altitude: case zBlank: // Ok default: - return &ParseError{"", "bad LOC Size, HorizPre or VertPre", l} + return &ParseError{err: "bad LOC Size, HorizPre or VertPre", lex: l} } l, _ = c.Next() } @@ -717,14 +740,14 @@ func (rr *HIP) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{"", "bad HIP PublicKeyAlgorithm", l} + return &ParseError{err: "bad HIP PublicKeyAlgorithm", lex: l} } rr.PublicKeyAlgorithm = uint8(i) c.Next() // zBlank l, _ = c.Next() // zString if l.token == "" || l.err { - return &ParseError{"", "bad HIP Hit", l} + return &ParseError{err: "bad HIP Hit", lex: l} } rr.Hit = l.token // This can not contain spaces, see RFC 5205 Section 6. rr.HitLength = uint8(len(rr.Hit)) / 2 @@ -732,12 +755,12 @@ func (rr *HIP) parse(c *zlexer, o string) *ParseError { c.Next() // zBlank l, _ = c.Next() // zString if l.token == "" || l.err { - return &ParseError{"", "bad HIP PublicKey", l} + return &ParseError{err: "bad HIP PublicKey", lex: l} } rr.PublicKey = l.token // This cannot contain spaces decodedPK, decodedPKerr := base64.StdEncoding.DecodeString(rr.PublicKey) if decodedPKerr != nil { - return &ParseError{"", "bad HIP PublicKey", l} + return &ParseError{err: "bad HIP PublicKey", lex: l} } rr.PublicKeyLength = uint16(len(decodedPK)) @@ -749,13 +772,13 @@ func (rr *HIP) parse(c *zlexer, o string) *ParseError { case zString: name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{"", "bad HIP RendezvousServers", l} + return &ParseError{err: "bad HIP RendezvousServers", lex: l} } xs = append(xs, name) case zBlank: // Ok default: - return &ParseError{"", "bad HIP RendezvousServers", l} + return &ParseError{err: "bad HIP RendezvousServers", lex: l} } l, _ = c.Next() } @@ -769,7 +792,7 @@ func (rr *CERT) parse(c *zlexer, o string) *ParseError { if v, ok := StringToCertType[l.token]; ok { rr.Type = v } else if i, err := strconv.ParseUint(l.token, 10, 16); err != nil { - return &ParseError{"", "bad CERT Type", l} + return &ParseError{err: "bad CERT Type", lex: l} } else { rr.Type = uint16(i) } @@ -777,7 +800,7 @@ func (rr *CERT) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() // zString i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{"", "bad CERT KeyTag", l} + return &ParseError{err: "bad CERT KeyTag", lex: l} } rr.KeyTag = uint16(i) c.Next() // zBlank @@ -785,7 +808,7 @@ func (rr *CERT) parse(c *zlexer, o string) *ParseError { if v, ok := StringToAlgorithm[l.token]; ok { rr.Algorithm = v } else if i, err := strconv.ParseUint(l.token, 10, 8); err != nil { - return &ParseError{"", "bad CERT Algorithm", l} + return &ParseError{err: "bad CERT Algorithm", lex: l} } else { rr.Algorithm = uint8(i) } @@ -811,7 +834,7 @@ func (rr *CSYNC) parse(c *zlexer, o string) *ParseError { j, e := strconv.ParseUint(l.token, 10, 32) if e != nil { // Serial must be a number - return &ParseError{"", "bad CSYNC serial", l} + return &ParseError{err: "bad CSYNC serial", lex: l} } rr.Serial = uint32(j) @@ -821,7 +844,7 @@ func (rr *CSYNC) parse(c *zlexer, o string) *ParseError { j, e1 := strconv.ParseUint(l.token, 10, 16) if e1 != nil { // Serial must be a number - return &ParseError{"", "bad CSYNC flags", l} + return &ParseError{err: "bad CSYNC flags", lex: l} } rr.Flags = uint16(j) @@ -839,12 +862,12 @@ func (rr *CSYNC) parse(c *zlexer, o string) *ParseError { tokenUpper := strings.ToUpper(l.token) if k, ok = StringToType[tokenUpper]; !ok { if k, ok = typeToInt(l.token); !ok { - return &ParseError{"", "bad CSYNC TypeBitMap", l} + return &ParseError{err: "bad CSYNC TypeBitMap", lex: l} } } rr.TypeBitMap = append(rr.TypeBitMap, k) default: - return &ParseError{"", "bad CSYNC TypeBitMap", l} + return &ParseError{err: "bad CSYNC TypeBitMap", lex: l} } l, _ = c.Next() } @@ -855,7 +878,7 @@ func (rr *ZONEMD) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 32) if e != nil || l.err { - return &ParseError{"", "bad ZONEMD Serial", l} + return &ParseError{err: "bad ZONEMD Serial", lex: l} } rr.Serial = uint32(i) @@ -863,7 +886,7 @@ func (rr *ZONEMD) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{"", "bad ZONEMD Scheme", l} + return &ParseError{err: "bad ZONEMD Scheme", lex: l} } rr.Scheme = uint8(i) @@ -871,7 +894,7 @@ func (rr *ZONEMD) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() i, err := strconv.ParseUint(l.token, 10, 8) if err != nil || l.err { - return &ParseError{"", "bad ZONEMD Hash Algorithm", l} + return &ParseError{err: "bad ZONEMD Hash Algorithm", lex: l} } rr.Hash = uint8(i) @@ -892,11 +915,11 @@ func (rr *RRSIG) parse(c *zlexer, o string) *ParseError { if strings.HasPrefix(tokenUpper, "TYPE") { t, ok = typeToInt(l.token) if !ok { - return &ParseError{"", "bad RRSIG Typecovered", l} + return &ParseError{err: "bad RRSIG Typecovered", lex: l} } rr.TypeCovered = t } else { - return &ParseError{"", "bad RRSIG Typecovered", l} + return &ParseError{err: "bad RRSIG Typecovered", lex: l} } } else { rr.TypeCovered = t @@ -905,14 +928,14 @@ func (rr *RRSIG) parse(c *zlexer, o string) *ParseError { c.Next() // zBlank l, _ = c.Next() if l.err { - return &ParseError{"", "bad RRSIG Algorithm", l} + return &ParseError{err: "bad RRSIG Algorithm", lex: l} } i, e := strconv.ParseUint(l.token, 10, 8) rr.Algorithm = uint8(i) // if 0 we'll check the mnemonic in the if if e != nil { v, ok := StringToAlgorithm[l.token] if !ok { - return &ParseError{"", "bad RRSIG Algorithm", l} + return &ParseError{err: "bad RRSIG Algorithm", lex: l} } rr.Algorithm = v } @@ -921,7 +944,7 @@ func (rr *RRSIG) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{"", "bad RRSIG Labels", l} + return &ParseError{err: "bad RRSIG Labels", lex: l} } rr.Labels = uint8(i) @@ -929,7 +952,7 @@ func (rr *RRSIG) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() i, e2 := strconv.ParseUint(l.token, 10, 32) if e2 != nil || l.err { - return &ParseError{"", "bad RRSIG OrigTtl", l} + return &ParseError{err: "bad RRSIG OrigTtl", lex: l} } rr.OrigTtl = uint32(i) @@ -940,7 +963,7 @@ func (rr *RRSIG) parse(c *zlexer, o string) *ParseError { if i, err := strconv.ParseUint(l.token, 10, 32); err == nil { rr.Expiration = uint32(i) } else { - return &ParseError{"", "bad RRSIG Expiration", l} + return &ParseError{err: "bad RRSIG Expiration", lex: l} } } else { rr.Expiration = i @@ -952,7 +975,7 @@ func (rr *RRSIG) parse(c *zlexer, o string) *ParseError { if i, err := strconv.ParseUint(l.token, 10, 32); err == nil { rr.Inception = uint32(i) } else { - return &ParseError{"", "bad RRSIG Inception", l} + return &ParseError{err: "bad RRSIG Inception", lex: l} } } else { rr.Inception = i @@ -962,7 +985,7 @@ func (rr *RRSIG) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() i, e3 := strconv.ParseUint(l.token, 10, 16) if e3 != nil || l.err { - return &ParseError{"", "bad RRSIG KeyTag", l} + return &ParseError{err: "bad RRSIG KeyTag", lex: l} } rr.KeyTag = uint16(i) @@ -971,7 +994,7 @@ func (rr *RRSIG) parse(c *zlexer, o string) *ParseError { rr.SignerName = l.token name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{"", "bad RRSIG SignerName", l} + return &ParseError{err: "bad RRSIG SignerName", lex: l} } rr.SignerName = name @@ -984,11 +1007,13 @@ func (rr *RRSIG) parse(c *zlexer, o string) *ParseError { return nil } +func (rr *NXT) parse(c *zlexer, o string) *ParseError { return rr.NSEC.parse(c, o) } + func (rr *NSEC) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{"", "bad NSEC NextDomain", l} + return &ParseError{err: "bad NSEC NextDomain", lex: l} } rr.NextDomain = name @@ -1006,12 +1031,12 @@ func (rr *NSEC) parse(c *zlexer, o string) *ParseError { tokenUpper := strings.ToUpper(l.token) if k, ok = StringToType[tokenUpper]; !ok { if k, ok = typeToInt(l.token); !ok { - return &ParseError{"", "bad NSEC TypeBitMap", l} + return &ParseError{err: "bad NSEC TypeBitMap", lex: l} } } rr.TypeBitMap = append(rr.TypeBitMap, k) default: - return &ParseError{"", "bad NSEC TypeBitMap", l} + return &ParseError{err: "bad NSEC TypeBitMap", lex: l} } l, _ = c.Next() } @@ -1022,27 +1047,27 @@ func (rr *NSEC3) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{"", "bad NSEC3 Hash", l} + return &ParseError{err: "bad NSEC3 Hash", lex: l} } rr.Hash = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{"", "bad NSEC3 Flags", l} + return &ParseError{err: "bad NSEC3 Flags", lex: l} } rr.Flags = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e2 := strconv.ParseUint(l.token, 10, 16) if e2 != nil || l.err { - return &ParseError{"", "bad NSEC3 Iterations", l} + return &ParseError{err: "bad NSEC3 Iterations", lex: l} } rr.Iterations = uint16(i) c.Next() l, _ = c.Next() if l.token == "" || l.err { - return &ParseError{"", "bad NSEC3 Salt", l} + return &ParseError{err: "bad NSEC3 Salt", lex: l} } if l.token != "-" { rr.SaltLength = uint8(len(l.token)) / 2 @@ -1052,7 +1077,7 @@ func (rr *NSEC3) parse(c *zlexer, o string) *ParseError { c.Next() l, _ = c.Next() if l.token == "" || l.err { - return &ParseError{"", "bad NSEC3 NextDomain", l} + return &ParseError{err: "bad NSEC3 NextDomain", lex: l} } rr.HashLength = 20 // Fix for NSEC3 (sha1 160 bits) rr.NextDomain = l.token @@ -1071,12 +1096,12 @@ func (rr *NSEC3) parse(c *zlexer, o string) *ParseError { tokenUpper := strings.ToUpper(l.token) if k, ok = StringToType[tokenUpper]; !ok { if k, ok = typeToInt(l.token); !ok { - return &ParseError{"", "bad NSEC3 TypeBitMap", l} + return &ParseError{err: "bad NSEC3 TypeBitMap", lex: l} } } rr.TypeBitMap = append(rr.TypeBitMap, k) default: - return &ParseError{"", "bad NSEC3 TypeBitMap", l} + return &ParseError{err: "bad NSEC3 TypeBitMap", lex: l} } l, _ = c.Next() } @@ -1087,21 +1112,21 @@ func (rr *NSEC3PARAM) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{"", "bad NSEC3PARAM Hash", l} + return &ParseError{err: "bad NSEC3PARAM Hash", lex: l} } rr.Hash = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{"", "bad NSEC3PARAM Flags", l} + return &ParseError{err: "bad NSEC3PARAM Flags", lex: l} } rr.Flags = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e2 := strconv.ParseUint(l.token, 10, 16) if e2 != nil || l.err { - return &ParseError{"", "bad NSEC3PARAM Iterations", l} + return &ParseError{err: "bad NSEC3PARAM Iterations", lex: l} } rr.Iterations = uint16(i) c.Next() @@ -1116,7 +1141,7 @@ func (rr *NSEC3PARAM) parse(c *zlexer, o string) *ParseError { func (rr *EUI48) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() if len(l.token) != 17 || l.err { - return &ParseError{"", "bad EUI48 Address", l} + return &ParseError{err: "bad EUI48 Address", lex: l} } addr := make([]byte, 12) dash := 0 @@ -1125,7 +1150,7 @@ func (rr *EUI48) parse(c *zlexer, o string) *ParseError { addr[i+1] = l.token[i+1+dash] dash++ if l.token[i+1+dash] != '-' { - return &ParseError{"", "bad EUI48 Address", l} + return &ParseError{err: "bad EUI48 Address", lex: l} } } addr[10] = l.token[15] @@ -1133,7 +1158,7 @@ func (rr *EUI48) parse(c *zlexer, o string) *ParseError { i, e := strconv.ParseUint(string(addr), 16, 48) if e != nil { - return &ParseError{"", "bad EUI48 Address", l} + return &ParseError{err: "bad EUI48 Address", lex: l} } rr.Address = i return slurpRemainder(c) @@ -1142,7 +1167,7 @@ func (rr *EUI48) parse(c *zlexer, o string) *ParseError { func (rr *EUI64) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() if len(l.token) != 23 || l.err { - return &ParseError{"", "bad EUI64 Address", l} + return &ParseError{err: "bad EUI64 Address", lex: l} } addr := make([]byte, 16) dash := 0 @@ -1151,7 +1176,7 @@ func (rr *EUI64) parse(c *zlexer, o string) *ParseError { addr[i+1] = l.token[i+1+dash] dash++ if l.token[i+1+dash] != '-' { - return &ParseError{"", "bad EUI64 Address", l} + return &ParseError{err: "bad EUI64 Address", lex: l} } } addr[14] = l.token[21] @@ -1159,7 +1184,7 @@ func (rr *EUI64) parse(c *zlexer, o string) *ParseError { i, e := strconv.ParseUint(string(addr), 16, 64) if e != nil { - return &ParseError{"", "bad EUI68 Address", l} + return &ParseError{err: "bad EUI68 Address", lex: l} } rr.Address = i return slurpRemainder(c) @@ -1169,14 +1194,14 @@ func (rr *SSHFP) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{"", "bad SSHFP Algorithm", l} + return &ParseError{err: "bad SSHFP Algorithm", lex: l} } rr.Algorithm = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{"", "bad SSHFP Type", l} + return &ParseError{err: "bad SSHFP Type", lex: l} } rr.Type = uint8(i) c.Next() // zBlank @@ -1192,21 +1217,21 @@ func (rr *DNSKEY) parseDNSKEY(c *zlexer, o, typ string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{"", "bad " + typ + " Flags", l} + return &ParseError{err: "bad " + typ + " Flags", lex: l} } rr.Flags = uint16(i) c.Next() // zBlank l, _ = c.Next() // zString i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{"", "bad " + typ + " Protocol", l} + return &ParseError{err: "bad " + typ + " Protocol", lex: l} } rr.Protocol = uint8(i) c.Next() // zBlank l, _ = c.Next() // zString i, e2 := strconv.ParseUint(l.token, 10, 8) if e2 != nil || l.err { - return &ParseError{"", "bad " + typ + " Algorithm", l} + return &ParseError{err: "bad " + typ + " Algorithm", lex: l} } rr.Algorithm = uint8(i) s, e3 := endingToString(c, "bad "+typ+" PublicKey") @@ -1228,7 +1253,7 @@ func (rr *IPSECKEY) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() num, err := strconv.ParseUint(l.token, 10, 8) if err != nil || l.err { - return &ParseError{"", "bad IPSECKEY value", l} + return &ParseError{err: "bad IPSECKEY value", lex: l} } rr.Precedence = uint8(num) c.Next() // zBlank @@ -1236,7 +1261,7 @@ func (rr *IPSECKEY) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() num, err = strconv.ParseUint(l.token, 10, 8) if err != nil || l.err { - return &ParseError{"", "bad IPSECKEY value", l} + return &ParseError{err: "bad IPSECKEY value", lex: l} } rr.GatewayType = uint8(num) c.Next() // zBlank @@ -1244,19 +1269,19 @@ func (rr *IPSECKEY) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() num, err = strconv.ParseUint(l.token, 10, 8) if err != nil || l.err { - return &ParseError{"", "bad IPSECKEY value", l} + return &ParseError{err: "bad IPSECKEY value", lex: l} } rr.Algorithm = uint8(num) c.Next() // zBlank l, _ = c.Next() if l.err { - return &ParseError{"", "bad IPSECKEY gateway", l} + return &ParseError{err: "bad IPSECKEY gateway", lex: l} } rr.GatewayAddr, rr.GatewayHost, err = parseAddrHostUnion(l.token, o, rr.GatewayType) if err != nil { - return &ParseError{"", "IPSECKEY " + err.Error(), l} + return &ParseError{wrappedErr: fmt.Errorf("IPSECKEY %w", err), lex: l} } c.Next() // zBlank @@ -1273,14 +1298,14 @@ func (rr *AMTRELAY) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() num, err := strconv.ParseUint(l.token, 10, 8) if err != nil || l.err { - return &ParseError{"", "bad AMTRELAY value", l} + return &ParseError{err: "bad AMTRELAY value", lex: l} } rr.Precedence = uint8(num) c.Next() // zBlank l, _ = c.Next() if l.err || !(l.token == "0" || l.token == "1") { - return &ParseError{"", "bad discovery value", l} + return &ParseError{err: "bad discovery value", lex: l} } if l.token == "1" { rr.GatewayType = 0x80 @@ -1291,19 +1316,19 @@ func (rr *AMTRELAY) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() num, err = strconv.ParseUint(l.token, 10, 8) if err != nil || l.err { - return &ParseError{"", "bad AMTRELAY value", l} + return &ParseError{err: "bad AMTRELAY value", lex: l} } rr.GatewayType |= uint8(num) c.Next() // zBlank l, _ = c.Next() if l.err { - return &ParseError{"", "bad AMTRELAY gateway", l} + return &ParseError{err: "bad AMTRELAY gateway", lex: l} } rr.GatewayAddr, rr.GatewayHost, err = parseAddrHostUnion(l.token, o, rr.GatewayType&0x7f) if err != nil { - return &ParseError{"", "AMTRELAY " + err.Error(), l} + return &ParseError{wrappedErr: fmt.Errorf("AMTRELAY %w", err), lex: l} } return slurpRemainder(c) @@ -1339,21 +1364,21 @@ func (rr *RKEY) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{"", "bad RKEY Flags", l} + return &ParseError{err: "bad RKEY Flags", lex: l} } rr.Flags = uint16(i) c.Next() // zBlank l, _ = c.Next() // zString i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{"", "bad RKEY Protocol", l} + return &ParseError{err: "bad RKEY Protocol", lex: l} } rr.Protocol = uint8(i) c.Next() // zBlank l, _ = c.Next() // zString i, e2 := strconv.ParseUint(l.token, 10, 8) if e2 != nil || l.err { - return &ParseError{"", "bad RKEY Algorithm", l} + return &ParseError{err: "bad RKEY Algorithm", lex: l} } rr.Algorithm = uint8(i) s, e3 := endingToString(c, "bad RKEY PublicKey") @@ -1386,21 +1411,21 @@ func (rr *GPOS) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() _, e := strconv.ParseFloat(l.token, 64) if e != nil || l.err { - return &ParseError{"", "bad GPOS Longitude", l} + return &ParseError{err: "bad GPOS Longitude", lex: l} } rr.Longitude = l.token c.Next() // zBlank l, _ = c.Next() _, e1 := strconv.ParseFloat(l.token, 64) if e1 != nil || l.err { - return &ParseError{"", "bad GPOS Latitude", l} + return &ParseError{err: "bad GPOS Latitude", lex: l} } rr.Latitude = l.token c.Next() // zBlank l, _ = c.Next() _, e2 := strconv.ParseFloat(l.token, 64) if e2 != nil || l.err { - return &ParseError{"", "bad GPOS Altitude", l} + return &ParseError{err: "bad GPOS Altitude", lex: l} } rr.Altitude = l.token return slurpRemainder(c) @@ -1410,7 +1435,7 @@ func (rr *DS) parseDS(c *zlexer, o, typ string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{"", "bad " + typ + " KeyTag", l} + return &ParseError{err: "bad " + typ + " KeyTag", lex: l} } rr.KeyTag = uint16(i) c.Next() // zBlank @@ -1419,7 +1444,7 @@ func (rr *DS) parseDS(c *zlexer, o, typ string) *ParseError { tokenUpper := strings.ToUpper(l.token) i, ok := StringToAlgorithm[tokenUpper] if !ok || l.err { - return &ParseError{"", "bad " + typ + " Algorithm", l} + return &ParseError{err: "bad " + typ + " Algorithm", lex: l} } rr.Algorithm = i } else { @@ -1429,7 +1454,7 @@ func (rr *DS) parseDS(c *zlexer, o, typ string) *ParseError { l, _ = c.Next() i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{"", "bad " + typ + " DigestType", l} + return &ParseError{err: "bad " + typ + " DigestType", lex: l} } rr.DigestType = uint8(i) s, e2 := endingToString(c, "bad "+typ+" Digest") @@ -1444,7 +1469,7 @@ func (rr *TA) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{"", "bad TA KeyTag", l} + return &ParseError{err: "bad TA KeyTag", lex: l} } rr.KeyTag = uint16(i) c.Next() // zBlank @@ -1453,7 +1478,7 @@ func (rr *TA) parse(c *zlexer, o string) *ParseError { tokenUpper := strings.ToUpper(l.token) i, ok := StringToAlgorithm[tokenUpper] if !ok || l.err { - return &ParseError{"", "bad TA Algorithm", l} + return &ParseError{err: "bad TA Algorithm", lex: l} } rr.Algorithm = i } else { @@ -1463,7 +1488,7 @@ func (rr *TA) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{"", "bad TA DigestType", l} + return &ParseError{err: "bad TA DigestType", lex: l} } rr.DigestType = uint8(i) s, e2 := endingToString(c, "bad TA Digest") @@ -1478,21 +1503,21 @@ func (rr *TLSA) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{"", "bad TLSA Usage", l} + return &ParseError{err: "bad TLSA Usage", lex: l} } rr.Usage = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{"", "bad TLSA Selector", l} + return &ParseError{err: "bad TLSA Selector", lex: l} } rr.Selector = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e2 := strconv.ParseUint(l.token, 10, 8) if e2 != nil || l.err { - return &ParseError{"", "bad TLSA MatchingType", l} + return &ParseError{err: "bad TLSA MatchingType", lex: l} } rr.MatchingType = uint8(i) // So this needs be e2 (i.e. different than e), because...??t @@ -1508,21 +1533,21 @@ func (rr *SMIMEA) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{"", "bad SMIMEA Usage", l} + return &ParseError{err: "bad SMIMEA Usage", lex: l} } rr.Usage = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{"", "bad SMIMEA Selector", l} + return &ParseError{err: "bad SMIMEA Selector", lex: l} } rr.Selector = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e2 := strconv.ParseUint(l.token, 10, 8) if e2 != nil || l.err { - return &ParseError{"", "bad SMIMEA MatchingType", l} + return &ParseError{err: "bad SMIMEA MatchingType", lex: l} } rr.MatchingType = uint8(i) // So this needs be e2 (i.e. different than e), because...??t @@ -1537,14 +1562,14 @@ func (rr *SMIMEA) parse(c *zlexer, o string) *ParseError { func (rr *RFC3597) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() if l.token != "\\#" { - return &ParseError{"", "bad RFC3597 Rdata", l} + return &ParseError{err: "bad RFC3597 Rdata", lex: l} } c.Next() // zBlank l, _ = c.Next() rdlength, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{"", "bad RFC3597 Rdata ", l} + return &ParseError{err: "bad RFC3597 Rdata ", lex: l} } s, e1 := endingToString(c, "bad RFC3597 Rdata") @@ -1552,7 +1577,7 @@ func (rr *RFC3597) parse(c *zlexer, o string) *ParseError { return e1 } if int(rdlength)*2 != len(s) { - return &ParseError{"", "bad RFC3597 Rdata", l} + return &ParseError{err: "bad RFC3597 Rdata", lex: l} } rr.Rdata = s return nil @@ -1600,14 +1625,14 @@ func (rr *URI) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{"", "bad URI Priority", l} + return &ParseError{err: "bad URI Priority", lex: l} } rr.Priority = uint16(i) c.Next() // zBlank l, _ = c.Next() i, e1 := strconv.ParseUint(l.token, 10, 16) if e1 != nil || l.err { - return &ParseError{"", "bad URI Weight", l} + return &ParseError{err: "bad URI Weight", lex: l} } rr.Weight = uint16(i) @@ -1617,7 +1642,7 @@ func (rr *URI) parse(c *zlexer, o string) *ParseError { return e2 } if len(s) != 1 { - return &ParseError{"", "bad URI Target", l} + return &ParseError{err: "bad URI Target", lex: l} } rr.Target = s[0] return nil @@ -1637,7 +1662,7 @@ func (rr *NID) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{"", "bad NID Preference", l} + return &ParseError{err: "bad NID Preference", lex: l} } rr.Preference = uint16(i) c.Next() // zBlank @@ -1654,14 +1679,14 @@ func (rr *L32) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{"", "bad L32 Preference", l} + return &ParseError{err: "bad L32 Preference", lex: l} } rr.Preference = uint16(i) c.Next() // zBlank l, _ = c.Next() // zString rr.Locator32 = net.ParseIP(l.token) if rr.Locator32 == nil || l.err { - return &ParseError{"", "bad L32 Locator", l} + return &ParseError{err: "bad L32 Locator", lex: l} } return slurpRemainder(c) } @@ -1670,7 +1695,7 @@ func (rr *LP) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{"", "bad LP Preference", l} + return &ParseError{err: "bad LP Preference", lex: l} } rr.Preference = uint16(i) @@ -1679,7 +1704,7 @@ func (rr *LP) parse(c *zlexer, o string) *ParseError { rr.Fqdn = l.token name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{"", "bad LP Fqdn", l} + return &ParseError{err: "bad LP Fqdn", lex: l} } rr.Fqdn = name return slurpRemainder(c) @@ -1689,7 +1714,7 @@ func (rr *L64) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{"", "bad L64 Preference", l} + return &ParseError{err: "bad L64 Preference", lex: l} } rr.Preference = uint16(i) c.Next() // zBlank @@ -1706,7 +1731,7 @@ func (rr *UID) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 32) if e != nil || l.err { - return &ParseError{"", "bad UID Uid", l} + return &ParseError{err: "bad UID Uid", lex: l} } rr.Uid = uint32(i) return slurpRemainder(c) @@ -1716,7 +1741,7 @@ func (rr *GID) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 32) if e != nil || l.err { - return &ParseError{"", "bad GID Gid", l} + return &ParseError{err: "bad GID Gid", lex: l} } rr.Gid = uint32(i) return slurpRemainder(c) @@ -1738,7 +1763,7 @@ func (rr *PX) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{"", "bad PX Preference", l} + return &ParseError{err: "bad PX Preference", lex: l} } rr.Preference = uint16(i) @@ -1747,7 +1772,7 @@ func (rr *PX) parse(c *zlexer, o string) *ParseError { rr.Map822 = l.token map822, map822Ok := toAbsoluteName(l.token, o) if l.err || !map822Ok { - return &ParseError{"", "bad PX Map822", l} + return &ParseError{err: "bad PX Map822", lex: l} } rr.Map822 = map822 @@ -1756,7 +1781,7 @@ func (rr *PX) parse(c *zlexer, o string) *ParseError { rr.Mapx400 = l.token mapx400, mapx400Ok := toAbsoluteName(l.token, o) if l.err || !mapx400Ok { - return &ParseError{"", "bad PX Mapx400", l} + return &ParseError{err: "bad PX Mapx400", lex: l} } rr.Mapx400 = mapx400 return slurpRemainder(c) @@ -1766,14 +1791,14 @@ func (rr *CAA) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{"", "bad CAA Flag", l} + return &ParseError{err: "bad CAA Flag", lex: l} } rr.Flag = uint8(i) c.Next() // zBlank l, _ = c.Next() // zString if l.value != zString { - return &ParseError{"", "bad CAA Tag", l} + return &ParseError{err: "bad CAA Tag", lex: l} } rr.Tag = l.token @@ -1783,7 +1808,7 @@ func (rr *CAA) parse(c *zlexer, o string) *ParseError { return e1 } if len(s) != 1 { - return &ParseError{"", "bad CAA Value", l} + return &ParseError{err: "bad CAA Value", lex: l} } rr.Value = s[0] return nil @@ -1794,7 +1819,7 @@ func (rr *TKEY) parse(c *zlexer, o string) *ParseError { // Algorithm if l.value != zString { - return &ParseError{"", "bad TKEY algorithm", l} + return &ParseError{err: "bad TKEY algorithm", lex: l} } rr.Algorithm = l.token c.Next() // zBlank @@ -1803,13 +1828,13 @@ func (rr *TKEY) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{"", "bad TKEY key length", l} + return &ParseError{err: "bad TKEY key length", lex: l} } rr.KeySize = uint16(i) c.Next() // zBlank l, _ = c.Next() if l.value != zString { - return &ParseError{"", "bad TKEY key", l} + return &ParseError{err: "bad TKEY key", lex: l} } rr.Key = l.token c.Next() // zBlank @@ -1818,13 +1843,13 @@ func (rr *TKEY) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{"", "bad TKEY otherdata length", l} + return &ParseError{err: "bad TKEY otherdata length", lex: l} } rr.OtherLen = uint16(i) c.Next() // zBlank l, _ = c.Next() if l.value != zString { - return &ParseError{"", "bad TKEY otherday", l} + return &ParseError{err: "bad TKEY otherday", lex: l} } rr.OtherData = l.token return nil @@ -1842,14 +1867,14 @@ func (rr *APL) parse(c *zlexer, o string) *ParseError { continue } if l.value != zString { - return &ParseError{"", "unexpected APL field", l} + return &ParseError{err: "unexpected APL field", lex: l} } // Expected format: [!]afi:address/prefix colon := strings.IndexByte(l.token, ':') if colon == -1 { - return &ParseError{"", "missing colon in APL field", l} + return &ParseError{err: "missing colon in APL field", lex: l} } family, cidr := l.token[:colon], l.token[colon+1:] @@ -1862,7 +1887,7 @@ func (rr *APL) parse(c *zlexer, o string) *ParseError { afi, e := strconv.ParseUint(family, 10, 16) if e != nil { - return &ParseError{"", "failed to parse APL family: " + e.Error(), l} + return &ParseError{wrappedErr: fmt.Errorf("failed to parse APL family: %w", e), lex: l} } var addrLen int switch afi { @@ -1871,19 +1896,19 @@ func (rr *APL) parse(c *zlexer, o string) *ParseError { case 2: addrLen = net.IPv6len default: - return &ParseError{"", "unrecognized APL family", l} + return &ParseError{err: "unrecognized APL family", lex: l} } ip, subnet, e1 := net.ParseCIDR(cidr) if e1 != nil { - return &ParseError{"", "failed to parse APL address: " + e1.Error(), l} + return &ParseError{wrappedErr: fmt.Errorf("failed to parse APL address: %w", e1), lex: l} } if !ip.Equal(subnet.IP) { - return &ParseError{"", "extra bits in APL address", l} + return &ParseError{err: "extra bits in APL address", lex: l} } if len(subnet.IP) != addrLen { - return &ParseError{"", "address mismatch with the APL family", l} + return &ParseError{err: "address mismatch with the APL family", lex: l} } prefixes = append(prefixes, APLPrefix{ diff --git a/vendor/github.com/miekg/dns/server.go b/vendor/github.com/miekg/dns/server.go index 64e388546..0207d6da2 100644 --- a/vendor/github.com/miekg/dns/server.go +++ b/vendor/github.com/miekg/dns/server.go @@ -226,6 +226,10 @@ type Server struct { // Whether to set the SO_REUSEPORT socket option, allowing multiple listeners to be bound to a single address. // It is only supported on certain GOOSes and when using ListenAndServe. ReusePort bool + // Whether to set the SO_REUSEADDR socket option, allowing multiple listeners to be bound to a single address. + // Crucially this allows binding when an existing server is listening on `0.0.0.0` or `::`. + // It is only supported on certain GOOSes and when using ListenAndServe. + ReuseAddr bool // AcceptMsgFunc will check the incoming message and will reject it early in the process. // By default DefaultMsgAcceptFunc will be used. MsgAcceptFunc MsgAcceptFunc @@ -304,7 +308,7 @@ func (srv *Server) ListenAndServe() error { switch srv.Net { case "tcp", "tcp4", "tcp6": - l, err := listenTCP(srv.Net, addr, srv.ReusePort) + l, err := listenTCP(srv.Net, addr, srv.ReusePort, srv.ReuseAddr) if err != nil { return err } @@ -317,7 +321,7 @@ func (srv *Server) ListenAndServe() error { return errors.New("dns: neither Certificates nor GetCertificate set in Config") } network := strings.TrimSuffix(srv.Net, "-tls") - l, err := listenTCP(network, addr, srv.ReusePort) + l, err := listenTCP(network, addr, srv.ReusePort, srv.ReuseAddr) if err != nil { return err } @@ -327,7 +331,7 @@ func (srv *Server) ListenAndServe() error { unlock() return srv.serveTCP(l) case "udp", "udp4", "udp6": - l, err := listenUDP(srv.Net, addr, srv.ReusePort) + l, err := listenUDP(srv.Net, addr, srv.ReusePort, srv.ReuseAddr) if err != nil { return err } diff --git a/vendor/github.com/miekg/dns/svcb.go b/vendor/github.com/miekg/dns/svcb.go index 6d496d74d..c1a740b68 100644 --- a/vendor/github.com/miekg/dns/svcb.go +++ b/vendor/github.com/miekg/dns/svcb.go @@ -85,7 +85,7 @@ func (rr *SVCB) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{l.token, "bad SVCB priority", l} + return &ParseError{file: l.token, err: "bad SVCB priority", lex: l} } rr.Priority = uint16(i) @@ -95,7 +95,7 @@ func (rr *SVCB) parse(c *zlexer, o string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{l.token, "bad SVCB Target", l} + return &ParseError{file: l.token, err: "bad SVCB Target", lex: l} } rr.Target = name @@ -111,7 +111,7 @@ func (rr *SVCB) parse(c *zlexer, o string) *ParseError { if !canHaveNextKey { // The key we can now read was probably meant to be // a part of the last value. - return &ParseError{l.token, "bad SVCB value quotation", l} + return &ParseError{file: l.token, err: "bad SVCB value quotation", lex: l} } // In key=value pairs, value does not have to be quoted unless value @@ -124,7 +124,7 @@ func (rr *SVCB) parse(c *zlexer, o string) *ParseError { // Key with no value and no equality sign key = l.token } else if idx == 0 { - return &ParseError{l.token, "bad SVCB key", l} + return &ParseError{file: l.token, err: "bad SVCB key", lex: l} } else { key, value = l.token[:idx], l.token[idx+1:] @@ -144,30 +144,30 @@ func (rr *SVCB) parse(c *zlexer, o string) *ParseError { value = l.token l, _ = c.Next() if l.value != zQuote { - return &ParseError{l.token, "SVCB unterminated value", l} + return &ParseError{file: l.token, err: "SVCB unterminated value", lex: l} } case zQuote: // There's nothing in double quotes. default: - return &ParseError{l.token, "bad SVCB value", l} + return &ParseError{file: l.token, err: "bad SVCB value", lex: l} } } } } kv := makeSVCBKeyValue(svcbStringToKey(key)) if kv == nil { - return &ParseError{l.token, "bad SVCB key", l} + return &ParseError{file: l.token, err: "bad SVCB key", lex: l} } if err := kv.parse(value); err != nil { - return &ParseError{l.token, err.Error(), l} + return &ParseError{file: l.token, wrappedErr: err, lex: l} } xs = append(xs, kv) case zQuote: - return &ParseError{l.token, "SVCB key can't contain double quotes", l} + return &ParseError{file: l.token, err: "SVCB key can't contain double quotes", lex: l} case zBlank: canHaveNextKey = true default: - return &ParseError{l.token, "bad SVCB values", l} + return &ParseError{file: l.token, err: "bad SVCB values", lex: l} } l, _ = c.Next() } @@ -314,10 +314,11 @@ func (s *SVCBMandatory) unpack(b []byte) error { } func (s *SVCBMandatory) parse(b string) error { - str := strings.Split(b, ",") - codes := make([]SVCBKey, 0, len(str)) - for _, e := range str { - codes = append(codes, svcbStringToKey(e)) + codes := make([]SVCBKey, 0, strings.Count(b, ",")+1) + for len(b) > 0 { + var key string + key, b, _ = strings.Cut(b, ",") + codes = append(codes, svcbStringToKey(key)) } s.Code = codes return nil @@ -613,19 +614,24 @@ func (s *SVCBIPv4Hint) String() string { } func (s *SVCBIPv4Hint) parse(b string) error { + if b == "" { + return errors.New("dns: svcbipv4hint: empty hint") + } if strings.Contains(b, ":") { return errors.New("dns: svcbipv4hint: expected ipv4, got ipv6") } - str := strings.Split(b, ",") - dst := make([]net.IP, len(str)) - for i, e := range str { + + hint := make([]net.IP, 0, strings.Count(b, ",")+1) + for len(b) > 0 { + var e string + e, b, _ = strings.Cut(b, ",") ip := net.ParseIP(e).To4() if ip == nil { return errors.New("dns: svcbipv4hint: bad ip") } - dst[i] = ip + hint = append(hint, ip) } - s.Hint = dst + s.Hint = hint return nil } @@ -733,9 +739,14 @@ func (s *SVCBIPv6Hint) String() string { } func (s *SVCBIPv6Hint) parse(b string) error { - str := strings.Split(b, ",") - dst := make([]net.IP, len(str)) - for i, e := range str { + if b == "" { + return errors.New("dns: svcbipv6hint: empty hint") + } + + hint := make([]net.IP, 0, strings.Count(b, ",")+1) + for len(b) > 0 { + var e string + e, b, _ = strings.Cut(b, ",") ip := net.ParseIP(e) if ip == nil { return errors.New("dns: svcbipv6hint: bad ip") @@ -743,9 +754,9 @@ func (s *SVCBIPv6Hint) parse(b string) error { if ip.To4() != nil { return errors.New("dns: svcbipv6hint: expected ipv6, got ipv4-mapped-ipv6") } - dst[i] = ip + hint = append(hint, ip) } - s.Hint = dst + s.Hint = hint return nil } diff --git a/vendor/github.com/miekg/dns/types.go b/vendor/github.com/miekg/dns/types.go index c9a03dec6..8e3129cbd 100644 --- a/vendor/github.com/miekg/dns/types.go +++ b/vendor/github.com/miekg/dns/types.go @@ -135,8 +135,8 @@ const ( RcodeNXRrset = 8 // NXRRSet - RR Set that should exist does not [DNS Update] RcodeNotAuth = 9 // NotAuth - Server Not Authoritative for zone [DNS Update] RcodeNotZone = 10 // NotZone - Name not contained in zone [DNS Update/TSIG] - RcodeBadSig = 16 // BADSIG - TSIG Signature Failure [TSIG] - RcodeBadVers = 16 // BADVERS - Bad OPT Version [EDNS0] + RcodeBadSig = 16 // BADSIG - TSIG Signature Failure [TSIG] https://www.rfc-editor.org/rfc/rfc6895.html#section-2.3 + RcodeBadVers = 16 // BADVERS - Bad OPT Version [EDNS0] https://www.rfc-editor.org/rfc/rfc6895.html#section-2.3 RcodeBadKey = 17 // BADKEY - Key not recognized [TSIG] RcodeBadTime = 18 // BADTIME - Signature out of time window [TSIG] RcodeBadMode = 19 // BADMODE - Bad TKEY Mode [TKEY] @@ -402,6 +402,17 @@ func (rr *X25) String() string { return rr.Hdr.String() + rr.PSDNAddress } +// ISDN RR. See RFC 1183, Section 3.2. +type ISDN struct { + Hdr RR_Header + Address string + SubAddress string +} + +func (rr *ISDN) String() string { + return rr.Hdr.String() + sprintTxt([]string{rr.Address, rr.SubAddress}) +} + // RT RR. See RFC 1183, Section 3.3. type RT struct { Hdr RR_Header @@ -786,7 +797,7 @@ func (rr *GPOS) String() string { return rr.Hdr.String() + rr.Longitude + " " + rr.Latitude + " " + rr.Altitude } -// LOC RR. See RFC RFC 1876. +// LOC RR. See RFC 1876. type LOC struct { Hdr RR_Header Version uint8 @@ -898,6 +909,11 @@ func (rr *RRSIG) String() string { return s } +// NXT RR. See RFC 2535. +type NXT struct { + NSEC +} + // NSEC RR. See RFC 4034 and RFC 3755. type NSEC struct { Hdr RR_Header @@ -982,7 +998,7 @@ func (rr *TALINK) String() string { sprintName(rr.PreviousName) + " " + sprintName(rr.NextName) } -// SSHFP RR. See RFC RFC 4255. +// SSHFP RR. See RFC 4255. type SSHFP struct { Hdr RR_Header Algorithm uint8 @@ -996,7 +1012,7 @@ func (rr *SSHFP) String() string { " " + strings.ToUpper(rr.FingerPrint) } -// KEY RR. See RFC RFC 2535. +// KEY RR. See RFC 2535. type KEY struct { DNSKEY } @@ -1306,7 +1322,7 @@ type NINFO struct { func (rr *NINFO) String() string { return rr.Hdr.String() + sprintTxt(rr.ZSData) } -// NID RR. See RFC RFC 6742. +// NID RR. See RFC 6742. type NID struct { Hdr RR_Header Preference uint16 diff --git a/vendor/github.com/miekg/dns/version.go b/vendor/github.com/miekg/dns/version.go index a09113662..dc34e5902 100644 --- a/vendor/github.com/miekg/dns/version.go +++ b/vendor/github.com/miekg/dns/version.go @@ -3,7 +3,7 @@ package dns import "fmt" // Version is current version of this library. -var Version = v{1, 1, 56} +var Version = v{1, 1, 58} // v holds the version of this library. type v struct { diff --git a/vendor/github.com/miekg/dns/xfr.go b/vendor/github.com/miekg/dns/xfr.go index 0a831c880..05b3c5add 100644 --- a/vendor/github.com/miekg/dns/xfr.go +++ b/vendor/github.com/miekg/dns/xfr.go @@ -80,8 +80,13 @@ func (t *Transfer) In(q *Msg, a string) (env chan *Envelope, err error) { func (t *Transfer) inAxfr(q *Msg, c chan *Envelope) { first := true - defer t.Close() - defer close(c) + defer func() { + // First close the connection, then the channel. This allows functions blocked on + // the channel to assume that the connection is closed and no further operations are + // pending when they resume. + t.Close() + close(c) + }() timeout := dnsTimeout if t.ReadTimeout != 0 { timeout = t.ReadTimeout @@ -131,8 +136,13 @@ func (t *Transfer) inIxfr(q *Msg, c chan *Envelope) { axfr := true n := 0 qser := q.Ns[0].(*SOA).Serial - defer t.Close() - defer close(c) + defer func() { + // First close the connection, then the channel. This allows functions blocked on + // the channel to assume that the connection is closed and no further operations are + // pending when they resume. + t.Close() + close(c) + }() timeout := dnsTimeout if t.ReadTimeout != 0 { timeout = t.ReadTimeout diff --git a/vendor/github.com/miekg/dns/zduplicate.go b/vendor/github.com/miekg/dns/zduplicate.go index 450bbbc29..03029fb3e 100644 --- a/vendor/github.com/miekg/dns/zduplicate.go +++ b/vendor/github.com/miekg/dns/zduplicate.go @@ -481,6 +481,21 @@ func (r1 *IPSECKEY) isDuplicate(_r2 RR) bool { return true } +func (r1 *ISDN) isDuplicate(_r2 RR) bool { + r2, ok := _r2.(*ISDN) + if !ok { + return false + } + _ = r2 + if r1.Address != r2.Address { + return false + } + if r1.SubAddress != r2.SubAddress { + return false + } + return true +} + func (r1 *KEY) isDuplicate(_r2 RR) bool { r2, ok := _r2.(*KEY) if !ok { @@ -871,6 +886,26 @@ func (r1 *NULL) isDuplicate(_r2 RR) bool { return true } +func (r1 *NXT) isDuplicate(_r2 RR) bool { + r2, ok := _r2.(*NXT) + if !ok { + return false + } + _ = r2 + if !isDuplicateName(r1.NextDomain, r2.NextDomain) { + return false + } + if len(r1.TypeBitMap) != len(r2.TypeBitMap) { + return false + } + for i := 0; i < len(r1.TypeBitMap); i++ { + if r1.TypeBitMap[i] != r2.TypeBitMap[i] { + return false + } + } + return true +} + func (r1 *OPENPGPKEY) isDuplicate(_r2 RR) bool { r2, ok := _r2.(*OPENPGPKEY) if !ok { diff --git a/vendor/github.com/miekg/dns/zmsg.go b/vendor/github.com/miekg/dns/zmsg.go index 3ea0eb423..39b3bc810 100644 --- a/vendor/github.com/miekg/dns/zmsg.go +++ b/vendor/github.com/miekg/dns/zmsg.go @@ -372,6 +372,18 @@ func (rr *IPSECKEY) pack(msg []byte, off int, compression compressionMap, compre return off, nil } +func (rr *ISDN) pack(msg []byte, off int, compression compressionMap, compress bool) (off1 int, err error) { + off, err = packString(rr.Address, msg, off) + if err != nil { + return off, err + } + off, err = packString(rr.SubAddress, msg, off) + if err != nil { + return off, err + } + return off, nil +} + func (rr *KEY) pack(msg []byte, off int, compression compressionMap, compress bool) (off1 int, err error) { off, err = packUint16(rr.Flags, msg, off) if err != nil { @@ -694,6 +706,18 @@ func (rr *NULL) pack(msg []byte, off int, compression compressionMap, compress b return off, nil } +func (rr *NXT) pack(msg []byte, off int, compression compressionMap, compress bool) (off1 int, err error) { + off, err = packDomainName(rr.NextDomain, msg, off, compression, false) + if err != nil { + return off, err + } + off, err = packDataNsec(rr.TypeBitMap, msg, off) + if err != nil { + return off, err + } + return off, nil +} + func (rr *OPENPGPKEY) pack(msg []byte, off int, compression compressionMap, compress bool) (off1 int, err error) { off, err = packStringBase64(rr.PublicKey, msg, off) if err != nil { @@ -1746,6 +1770,24 @@ func (rr *IPSECKEY) unpack(msg []byte, off int) (off1 int, err error) { return off, nil } +func (rr *ISDN) unpack(msg []byte, off int) (off1 int, err error) { + rdStart := off + _ = rdStart + + rr.Address, off, err = unpackString(msg, off) + if err != nil { + return off, err + } + if off == len(msg) { + return off, nil + } + rr.SubAddress, off, err = unpackString(msg, off) + if err != nil { + return off, err + } + return off, nil +} + func (rr *KEY) unpack(msg []byte, off int) (off1 int, err error) { rdStart := off _ = rdStart @@ -2224,6 +2266,24 @@ func (rr *NULL) unpack(msg []byte, off int) (off1 int, err error) { return off, nil } +func (rr *NXT) unpack(msg []byte, off int) (off1 int, err error) { + rdStart := off + _ = rdStart + + rr.NextDomain, off, err = UnpackDomainName(msg, off) + if err != nil { + return off, err + } + if off == len(msg) { + return off, nil + } + rr.TypeBitMap, off, err = unpackDataNsec(msg, off) + if err != nil { + return off, err + } + return off, nil +} + func (rr *OPENPGPKEY) unpack(msg []byte, off int) (off1 int, err error) { rdStart := off _ = rdStart diff --git a/vendor/github.com/miekg/dns/ztypes.go b/vendor/github.com/miekg/dns/ztypes.go index 1b6f43200..2c70fc44d 100644 --- a/vendor/github.com/miekg/dns/ztypes.go +++ b/vendor/github.com/miekg/dns/ztypes.go @@ -36,6 +36,7 @@ var TypeToRR = map[uint16]func() RR{ TypeHIP: func() RR { return new(HIP) }, TypeHTTPS: func() RR { return new(HTTPS) }, TypeIPSECKEY: func() RR { return new(IPSECKEY) }, + TypeISDN: func() RR { return new(ISDN) }, TypeKEY: func() RR { return new(KEY) }, TypeKX: func() RR { return new(KX) }, TypeL32: func() RR { return new(L32) }, @@ -59,6 +60,7 @@ var TypeToRR = map[uint16]func() RR{ TypeNSEC3: func() RR { return new(NSEC3) }, TypeNSEC3PARAM: func() RR { return new(NSEC3PARAM) }, TypeNULL: func() RR { return new(NULL) }, + TypeNXT: func() RR { return new(NXT) }, TypeOPENPGPKEY: func() RR { return new(OPENPGPKEY) }, TypeOPT: func() RR { return new(OPT) }, TypePTR: func() RR { return new(PTR) }, @@ -204,6 +206,7 @@ func (rr *HINFO) Header() *RR_Header { return &rr.Hdr } func (rr *HIP) Header() *RR_Header { return &rr.Hdr } func (rr *HTTPS) Header() *RR_Header { return &rr.Hdr } func (rr *IPSECKEY) Header() *RR_Header { return &rr.Hdr } +func (rr *ISDN) Header() *RR_Header { return &rr.Hdr } func (rr *KEY) Header() *RR_Header { return &rr.Hdr } func (rr *KX) Header() *RR_Header { return &rr.Hdr } func (rr *L32) Header() *RR_Header { return &rr.Hdr } @@ -227,6 +230,7 @@ func (rr *NSEC) Header() *RR_Header { return &rr.Hdr } func (rr *NSEC3) Header() *RR_Header { return &rr.Hdr } func (rr *NSEC3PARAM) Header() *RR_Header { return &rr.Hdr } func (rr *NULL) Header() *RR_Header { return &rr.Hdr } +func (rr *NXT) Header() *RR_Header { return &rr.Hdr } func (rr *OPENPGPKEY) Header() *RR_Header { return &rr.Hdr } func (rr *OPT) Header() *RR_Header { return &rr.Hdr } func (rr *PTR) Header() *RR_Header { return &rr.Hdr } @@ -437,6 +441,13 @@ func (rr *IPSECKEY) len(off int, compression map[string]struct{}) int { return l } +func (rr *ISDN) len(off int, compression map[string]struct{}) int { + l := rr.Hdr.len(off, compression) + l += len(rr.Address) + 1 + l += len(rr.SubAddress) + 1 + return l +} + func (rr *KX) len(off int, compression map[string]struct{}) int { l := rr.Hdr.len(off, compression) l += 2 // Preference @@ -966,6 +977,10 @@ func (rr *IPSECKEY) copy() RR { } } +func (rr *ISDN) copy() RR { + return &ISDN{rr.Hdr, rr.Address, rr.SubAddress} +} + func (rr *KEY) copy() RR { return &KEY{*rr.DNSKEY.copy().(*DNSKEY)} } @@ -1092,6 +1107,10 @@ func (rr *NULL) copy() RR { return &NULL{rr.Hdr, rr.Data} } +func (rr *NXT) copy() RR { + return &NXT{*rr.NSEC.copy().(*NSEC)} +} + func (rr *OPENPGPKEY) copy() RR { return &OPENPGPKEY{rr.Hdr, rr.PublicKey} } diff --git a/vendor/github.com/multiformats/go-multiaddr/net/ip.go b/vendor/github.com/multiformats/go-multiaddr/net/ip.go index ef936c562..def9321d2 100644 --- a/vendor/github.com/multiformats/go-multiaddr/net/ip.go +++ b/vendor/github.com/multiformats/go-multiaddr/net/ip.go @@ -123,20 +123,10 @@ func zoneless(m ma.Multiaddr) ma.Multiaddr { } } -var nat64WellKnownPrefix net.IPNet - -func init() { - _, np, err := net.ParseCIDR("64:ff9b::/96") - if err != nil { - panic(err) - } - nat64WellKnownPrefix = *np -} - // IsNAT64IPv4ConvertedIPv6Addr returns whether addr is a well-known prefix "64:ff9b::/96" addr // used for NAT64 Translation. See RFC 6052 func IsNAT64IPv4ConvertedIPv6Addr(addr ma.Multiaddr) bool { c, _ := ma.SplitFirst(addr) return c != nil && c.Protocol().Code == ma.P_IP6 && - nat64WellKnownPrefix.Contains(net.IP(c.RawValue())) + inAddrRange(c.RawValue(), nat64) } diff --git a/vendor/github.com/multiformats/go-multiaddr/net/private.go b/vendor/github.com/multiformats/go-multiaddr/net/private.go index 9f966de0f..af55c2a99 100644 --- a/vendor/github.com/multiformats/go-multiaddr/net/private.go +++ b/vendor/github.com/multiformats/go-multiaddr/net/private.go @@ -44,9 +44,22 @@ var unroutableCIDR4 = []string{ "255.255.255.255/32", } var unroutableCIDR6 = []string{ - "ff00::/8", + "ff00::/8", // multicast + "2001:db8::/32", // documentation } +var globalUnicast []*net.IPNet +var globalUnicastCIDR6 = []string{ + "2000::/3", +} + +var nat64CIDRs = []string{ + "64:ff9b:1::/48", // RFC 8215 + "64:ff9b::/96", // RFC 6052 +} + +var nat64 []*net.IPNet + // unResolvableDomains do not resolve to an IP address. // Ref: https://en.wikipedia.org/wiki/Special-use_domain_name#Reserved_domain_names var unResolvableDomains = []string{ @@ -82,6 +95,8 @@ func init() { Private6 = parseCIDR(privateCIDR6) Unroutable4 = parseCIDR(unroutableCIDR4) Unroutable6 = parseCIDR(unroutableCIDR6) + globalUnicast = parseCIDR(globalUnicastCIDR6) + nat64 = parseCIDR(nat64CIDRs) } func parseCIDR(cidrs []string) []*net.IPNet { @@ -109,7 +124,23 @@ func IsPublicAddr(a ma.Multiaddr) bool { isPublic = !inAddrRange(ip, Private4) && !inAddrRange(ip, Unroutable4) case ma.P_IP6: ip := net.IP(c.RawValue()) - isPublic = !inAddrRange(ip, Private6) && !inAddrRange(ip, Unroutable6) + // IP6 documentation prefix(part of Unroutable6) is a subset of the ip6 + // global unicast allocation so we ensure that it's not a documentation + // prefix by diffing with Unroutable6 + isPublicUnicastAddr := inAddrRange(ip, globalUnicast) && !inAddrRange(ip, Unroutable6) + if isPublicUnicastAddr { + isPublic = true + return false + } + // The WellKnown NAT64 prefix(RFC 6052) can only reference a public IPv4 + // address. + // The Local use NAT64 prefix(RFC 8215) can reference private IPv4 + // addresses. But since the translation from Local use NAT64 prefix to IPv4 + // address is left to the user we have no way of knowing which IPv4 address + // is referenced. We count these as Public addresses because a false + // negative for this method here is generally worse than a false positive. + isPublic = inAddrRange(ip, nat64) + return false case ma.P_DNS, ma.P_DNS4, ma.P_DNS6, ma.P_DNSADDR: dnsAddr := c.Value() isPublic = true diff --git a/vendor/github.com/multiformats/go-multiaddr/version.json b/vendor/github.com/multiformats/go-multiaddr/version.json index 5aa93fc5e..03cac9ee9 100644 --- a/vendor/github.com/multiformats/go-multiaddr/version.json +++ b/vendor/github.com/multiformats/go-multiaddr/version.json @@ -1,3 +1,3 @@ { - "version": "v0.12.3" + "version": "v0.12.4" } diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/profiles_and_reports.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/profiles_and_reports.go index bd3c6d028..26de28b57 100644 --- a/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/profiles_and_reports.go +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/profiles_and_reports.go @@ -144,7 +144,7 @@ func FinalizeProfilesAndReportsForSuites(suites TestSuites, cliConfig types.CLIC return messages, nil } -//loads each profile, combines them, deletes them, stores them in destination +// loads each profile, combines them, deletes them, stores them in destination func MergeAndCleanupCoverProfiles(profiles []string, destination string) error { combined := &bytes.Buffer{} modeRegex := regexp.MustCompile(`^mode: .*\n`) @@ -184,7 +184,7 @@ func GetCoverageFromCoverProfile(profile string) (float64, error) { cmd := exec.Command("go", "tool", "cover", "-func", profile) output, err := cmd.CombinedOutput() if err != nil { - return 0, fmt.Errorf("Could not process Coverprofile %s: %s", profile, err.Error()) + return 0, fmt.Errorf("Could not process Coverprofile %s: %s - %s", profile, err.Error(), string(output)) } re := regexp.MustCompile(`total:\s*\(statements\)\s*(\d*\.\d*)\%`) matches := re.FindStringSubmatch(string(output)) diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/test_suite.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/test_suite.go index 64dcb1b78..df99875be 100644 --- a/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/test_suite.go +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/test_suite.go @@ -7,6 +7,7 @@ import ( "path" "path/filepath" "regexp" + "runtime" "strings" "github.com/onsi/ginkgo/v2/types" @@ -192,7 +193,7 @@ func precompiledTestSuite(path string) (TestSuite, error) { return TestSuite{}, errors.New("this is not a .test binary") } - if filepath.Ext(path) == ".test" && info.Mode()&0111 == 0 { + if filepath.Ext(path) == ".test" && runtime.GOOS != "windows" && info.Mode()&0111 == 0 { return TestSuite{}, errors.New("this is not executable") } @@ -225,7 +226,7 @@ func suitesInDir(dir string, recurse bool) TestSuites { files, _ := os.ReadDir(dir) re := regexp.MustCompile(`^[^._].*_test\.go$`) for _, file := range files { - if !file.IsDir() && re.Match([]byte(file.Name())) { + if !file.IsDir() && re.MatchString(file.Name()) { suite := TestSuite{ Path: relPath(dir), PackageName: packageNameForSuite(dir), @@ -240,7 +241,7 @@ func suitesInDir(dir string, recurse bool) TestSuites { if recurse { re = regexp.MustCompile(`^[._]`) for _, file := range files { - if file.IsDir() && !re.Match([]byte(file.Name())) { + if file.IsDir() && !re.MatchString(file.Name()) { suites = append(suites, suitesInDir(dir+"/"+file.Name(), recurse)...) } } @@ -271,7 +272,7 @@ func filesHaveGinkgoSuite(dir string, files []os.DirEntry) bool { reGinkgo := regexp.MustCompile(`package ginkgo|\/ginkgo"|\/ginkgo\/v2"|\/ginkgo\/v2/dsl/`) for _, file := range files { - if !file.IsDir() && reTestFile.Match([]byte(file.Name())) { + if !file.IsDir() && reTestFile.MatchString(file.Name()) { contents, _ := os.ReadFile(dir + "/" + file.Name()) if reGinkgo.Match(contents) { return true diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/ginkgo.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/ginkgo.go index 958daccbf..5d8d00bb1 100644 --- a/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/ginkgo.go +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/ginkgo.go @@ -1,10 +1,11 @@ package outline import ( - "github.com/onsi/ginkgo/v2/types" "go/ast" "go/token" "strconv" + + "github.com/onsi/ginkgo/v2/types" ) const ( diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/import.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/import.go index 67ec5ab75..f0a6b5d26 100644 --- a/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/import.go +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/import.go @@ -28,14 +28,7 @@ func packageNameForImport(f *ast.File, path string) *string { } name := spec.Name.String() if name == "" { - // If the package name is not explicitly specified, - // make an educated guess. This is not guaranteed to be correct. - lastSlash := strings.LastIndex(path, "/") - if lastSlash == -1 { - name = path - } else { - name = path[lastSlash+1:] - } + name = "ginkgo" } if name == "." { name = "" diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/dependencies.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/dependencies.go index f5ddff30f..a34d94354 100644 --- a/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/dependencies.go +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/dependencies.go @@ -78,7 +78,7 @@ func (d Dependencies) resolveAndAdd(deps []string, depth int) { if err != nil { continue } - if !pkg.Goroot && (!ginkgoAndGomegaFilter.Match([]byte(pkg.Dir)) || ginkgoIntegrationTestFilter.Match([]byte(pkg.Dir))) { + if !pkg.Goroot && (!ginkgoAndGomegaFilter.MatchString(pkg.Dir) || ginkgoIntegrationTestFilter.MatchString(pkg.Dir)) { d.addDepIfNotPresent(pkg.Dir, depth) } } diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/package_hash.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/package_hash.go index e9f7ec0cb..17d052bdc 100644 --- a/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/package_hash.go +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/package_hash.go @@ -79,7 +79,7 @@ func (p *PackageHash) computeHashes() (codeHash string, codeModifiedTime time.Ti continue } - if goTestRegExp.Match([]byte(info.Name())) { + if goTestRegExp.MatchString(info.Name()) { testHash += p.hashForFileInfo(info) if info.ModTime().After(testModifiedTime) { testModifiedTime = info.ModTime() @@ -87,7 +87,7 @@ func (p *PackageHash) computeHashes() (codeHash string, codeModifiedTime time.Ti continue } - if p.watchRegExp.Match([]byte(info.Name())) { + if p.watchRegExp.MatchString(info.Name()) { codeHash += p.hashForFileInfo(info) if info.ModTime().After(codeModifiedTime) { codeModifiedTime = info.ModTime() diff --git a/vendor/github.com/onsi/ginkgo/v2/reporters/json_report.go b/vendor/github.com/onsi/ginkgo/v2/reporters/json_report.go index be506f9b4..5d3e8db99 100644 --- a/vendor/github.com/onsi/ginkgo/v2/reporters/json_report.go +++ b/vendor/github.com/onsi/ginkgo/v2/reporters/json_report.go @@ -18,6 +18,7 @@ func GenerateJSONReport(report types.Report, destination string) error { if err != nil { return err } + defer f.Close() enc := json.NewEncoder(f) enc.SetIndent("", " ") err = enc.Encode([]types.Report{ @@ -26,7 +27,7 @@ func GenerateJSONReport(report types.Report, destination string) error { if err != nil { return err } - return f.Close() + return nil } // MergeJSONReports produces a single JSON-formatted report at the passed in destination by merging the JSON-formatted reports provided in sources @@ -57,11 +58,12 @@ func MergeAndCleanupJSONReports(sources []string, destination string) ([]string, if err != nil { return messages, err } + defer f.Close() enc := json.NewEncoder(f) enc.SetIndent("", " ") err = enc.Encode(allReports) if err != nil { return messages, err } - return messages, f.Close() + return messages, nil } diff --git a/vendor/github.com/onsi/ginkgo/v2/reporters/junit_report.go b/vendor/github.com/onsi/ginkgo/v2/reporters/junit_report.go index 816042208..43244a9bd 100644 --- a/vendor/github.com/onsi/ginkgo/v2/reporters/junit_report.go +++ b/vendor/github.com/onsi/ginkgo/v2/reporters/junit_report.go @@ -15,6 +15,7 @@ import ( "fmt" "os" "path" + "regexp" "strings" "github.com/onsi/ginkgo/v2/config" @@ -104,6 +105,8 @@ type JUnitProperty struct { Value string `xml:"value,attr"` } +var ownerRE = regexp.MustCompile(`(?i)^owner:(.*)$`) + type JUnitTestCase struct { // Name maps onto the full text of the spec - equivalent to "[SpecReport.LeafNodeType] SpecReport.FullText()" Name string `xml:"name,attr"` @@ -113,6 +116,8 @@ type JUnitTestCase struct { Status string `xml:"status,attr"` // Time is the time in seconds to execute the spec - maps onto SpecReport.RunTime Time float64 `xml:"time,attr"` + // Owner is the owner the spec - is set if a label matching Label("owner:X") is provided. The last matching label is used as the owner, thereby allowing specs to override owners specified in container nodes. + Owner string `xml:"owner,attr,omitempty"` //Skipped is populated with a message if the test was skipped or pending Skipped *JUnitSkipped `xml:"skipped,omitempty"` //Error is populated if the test panicked or was interrupted @@ -195,6 +200,12 @@ func GenerateJUnitReportWithConfig(report types.Report, dst string, config Junit if len(labels) > 0 && !config.OmitSpecLabels { name = name + " [" + strings.Join(labels, ", ") + "]" } + owner := "" + for _, label := range labels { + if matches := ownerRE.FindStringSubmatch(label); len(matches) == 2 { + owner = matches[1] + } + } name = strings.TrimSpace(name) test := JUnitTestCase{ @@ -202,6 +213,7 @@ func GenerateJUnitReportWithConfig(report types.Report, dst string, config Junit Classname: report.SuiteDescription, Status: spec.State.String(), Time: spec.RunTime.Seconds(), + Owner: owner, } if !spec.State.Is(config.OmitTimelinesForSpecState) { test.SystemErr = systemErrForUnstructuredReporters(spec) diff --git a/vendor/github.com/onsi/ginkgo/v2/types/code_location.go b/vendor/github.com/onsi/ginkgo/v2/types/code_location.go index 9cd576817..57e87517e 100644 --- a/vendor/github.com/onsi/ginkgo/v2/types/code_location.go +++ b/vendor/github.com/onsi/ginkgo/v2/types/code_location.go @@ -149,7 +149,7 @@ func PruneStack(fullStackTrace string, skip int) string { re := regexp.MustCompile(`\/ginkgo\/|\/pkg\/testing\/|\/pkg\/runtime\/`) for i := 0; i < len(stack)/2; i++ { // We filter out based on the source code file name. - if !re.Match([]byte(stack[i*2+1])) { + if !re.MatchString(stack[i*2+1]) { prunedStack = append(prunedStack, stack[i*2]) prunedStack = append(prunedStack, stack[i*2+1]) } diff --git a/vendor/github.com/onsi/ginkgo/v2/types/errors.go b/vendor/github.com/onsi/ginkgo/v2/types/errors.go index 4fbdc3e9b..6bb72d00c 100644 --- a/vendor/github.com/onsi/ginkgo/v2/types/errors.go +++ b/vendor/github.com/onsi/ginkgo/v2/types/errors.go @@ -505,6 +505,15 @@ func (g ginkgoErrors) IncorrectVariadicParameterTypeToTableFunction(expected, ac } } +func (g ginkgoErrors) ContextsCannotBeUsedInSubtreeTables(cl CodeLocation) error { + return GinkgoError{ + Heading: "Contexts cannot be used in subtree tables", + Message: "You''ve defined a subtree body function that accepts a context but did not provide one in the table entry. Ginkgo SpecContexts can only be passed in to subject and setup nodes - so if you are trying to implement a spec timeout you should request a context in the It function within your subtree body function, not in the subtree body function itself.", + CodeLocation: cl, + DocLink: "table-specs", + } +} + /* Parallel Synchronization errors */ func (g ginkgoErrors) AggregatedReportUnavailableDueToNodeDisappearing() error { diff --git a/vendor/github.com/onsi/ginkgo/v2/types/version.go b/vendor/github.com/onsi/ginkgo/v2/types/version.go index a37f30828..ed9346474 100644 --- a/vendor/github.com/onsi/ginkgo/v2/types/version.go +++ b/vendor/github.com/onsi/ginkgo/v2/types/version.go @@ -1,3 +1,3 @@ package types -const VERSION = "2.13.0" +const VERSION = "2.15.0" diff --git a/vendor/github.com/opencontainers/runtime-spec/specs-go/config.go b/vendor/github.com/opencontainers/runtime-spec/specs-go/config.go index 4e7717d53..d1236ba72 100644 --- a/vendor/github.com/opencontainers/runtime-spec/specs-go/config.go +++ b/vendor/github.com/opencontainers/runtime-spec/specs-go/config.go @@ -187,6 +187,10 @@ type Hook struct { type Hooks struct { // Prestart is Deprecated. Prestart is a list of hooks to be run before the container process is executed. // It is called in the Runtime Namespace + // + // Deprecated: use [Hooks.CreateRuntime], [Hooks.CreateContainer], and + // [Hooks.StartContainer] instead, which allow more granular hook control + // during the create and start phase. Prestart []Hook `json:"prestart,omitempty"` // CreateRuntime is a list of hooks to be run after the container has been created but before pivot_root or any equivalent operation has been called // It is called in the Runtime Namespace @@ -371,6 +375,12 @@ type LinuxMemory struct { // Total memory limit (memory + swap). Swap *int64 `json:"swap,omitempty"` // Kernel memory limit (in bytes). + // + // Deprecated: kernel-memory limits are not supported in cgroups v2, and + // were obsoleted in [kernel v5.4]. This field should no longer be used, + // as it may be ignored by runtimes. + // + // [kernel v5.4]: https://github.com/torvalds/linux/commit/0158115f702b0ba208ab0 Kernel *int64 `json:"kernel,omitempty"` // Kernel memory limit for tcp (in bytes) KernelTCP *int64 `json:"kernelTCP,omitempty"` diff --git a/vendor/github.com/opencontainers/runtime-spec/specs-go/version.go b/vendor/github.com/opencontainers/runtime-spec/specs-go/version.go index b3fca349c..503971e05 100644 --- a/vendor/github.com/opencontainers/runtime-spec/specs-go/version.go +++ b/vendor/github.com/opencontainers/runtime-spec/specs-go/version.go @@ -6,7 +6,7 @@ const ( // VersionMajor is for an API incompatible changes VersionMajor = 1 // VersionMinor is for functionality in a backwards-compatible manner - VersionMinor = 1 + VersionMinor = 2 // VersionPatch is for backwards-compatible bug fixes VersionPatch = 0 diff --git a/vendor/github.com/pion/datachannel/.gitignore b/vendor/github.com/pion/datachannel/.gitignore index f977e7485..6e2f206a9 100644 --- a/vendor/github.com/pion/datachannel/.gitignore +++ b/vendor/github.com/pion/datachannel/.gitignore @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + ### JetBrains IDE ### ##################### .idea/ diff --git a/vendor/github.com/pion/datachannel/.golangci.yml b/vendor/github.com/pion/datachannel/.golangci.yml index d7a88eca3..6dd80c805 100644 --- a/vendor/github.com/pion/datachannel/.golangci.yml +++ b/vendor/github.com/pion/datachannel/.golangci.yml @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + linters-settings: govet: check-shadowing: true @@ -10,7 +13,14 @@ linters-settings: modules: - github.com/pkg/errors: recommendations: - - errors + - errors + forbidigo: + forbid: + - ^fmt.Print(f|ln)?$ + - ^log.(Panic|Fatal|Print)(f|ln)?$ + - ^os.Exit$ + - ^panic$ + - ^print(ln)?$ linters: enable: @@ -18,9 +28,7 @@ linters: - bidichk # Checks for dangerous unicode character sequences - bodyclose # checks whether HTTP response body is closed successfully - contextcheck # check the function whether use a non-inherited context - - deadcode # Finds unused code - decorder # check declaration order and count of types, constants, variables and functions - - depguard # Go linter that checks if package imports are in a list of acceptable packages - dogsled # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()) - dupl # Tool for code clone detection - durationcheck # check for two durations multiplied together @@ -30,6 +38,7 @@ linters: - errorlint # errorlint is a linter for that can be used to find code that will cause problems with the error wrapping scheme introduced in Go 1.13. - exhaustive # check exhaustiveness of enum switch statements - exportloopref # checks for pointers to enclosing loop variables + - forbidigo # Forbids identifiers - forcetypeassert # finds forced type assertions - gci # Gci control golang package import order and make it always deterministic. - gochecknoglobals # Checks that no globals are present in Go code @@ -53,14 +62,12 @@ linters: - importas # Enforces consistent import aliases - ineffassign # Detects when assignments to existing variables are not used - misspell # Finds commonly misspelled English words in comments - - nakedret # Finds naked returns in functions greater than a specified function length - nilerr # Finds the code that returns nil even if it checks that the error is not nil. - nilnil # Checks that there is no simultaneous return of `nil` error and an invalid value. - noctx # noctx finds sending http request without context.Context - predeclared # find code that shadows one of Go's predeclared identifiers - revive # golint replacement, finds style mistakes - staticcheck # Staticcheck is a go vet on steroids, applying a ton of static analysis checks - - structcheck # Finds unused struct fields - stylecheck # Stylecheck is a replacement for golint - tagliatelle # Checks the struct tags. - tenv # tenv is analyzer that detects using os.Setenv instead of t.Setenv since Go1.17 @@ -69,14 +76,13 @@ linters: - unconvert # Remove unnecessary type conversions - unparam # Reports unused function parameters - unused # Checks Go code for unused constants, variables, functions and types - - varcheck # Finds unused global variables and constants - wastedassign # wastedassign finds wasted assignment statements - whitespace # Tool for detection of leading and trailing whitespace disable: + - depguard # Go linter that checks if package imports are in a list of acceptable packages - containedctx # containedctx is a linter that detects struct contained context.Context field - cyclop # checks function and package cyclomatic complexity - exhaustivestruct # Checks if all struct's fields are initialized - - forbidigo # Forbids identifiers - funlen # Tool for detection of long functions - gocyclo # Computes and checks the cyclomatic complexity of functions - godot # Check if comments end in a period @@ -87,6 +93,7 @@ linters: - maintidx # maintidx measures the maintainability index of each function. - makezero # Finds slice declarations with non-zero initial length - maligned # Tool to detect Go structs that would take less memory if their fields were sorted + - nakedret # Finds naked returns in functions greater than a specified function length - nestif # Reports deeply nested if statements - nlreturn # nlreturn checks for a new line before return and branch statements to increase code clarity - nolintlint # Reports ill-formed or insufficient nolint directives @@ -104,16 +111,16 @@ linters: issues: exclude-use-default: false exclude-rules: - # Allow complex tests, better to be self contained - - path: _test\.go + # Allow complex tests and examples, better to be self contained + - path: (examples|main\.go|_test\.go) linters: + - forbidigo - gocognit - # Allow complex main function in examples - - path: examples - text: "of func `main` is high" + # Allow forbidden identifiers in CLI commands + - path: cmd linters: - - gocognit + - forbidigo run: skip-dirs-use-default: false diff --git a/vendor/github.com/pion/datachannel/.goreleaser.yml b/vendor/github.com/pion/datachannel/.goreleaser.yml new file mode 100644 index 000000000..30093e9d6 --- /dev/null +++ b/vendor/github.com/pion/datachannel/.goreleaser.yml @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +builds: +- skip: true diff --git a/vendor/github.com/pion/datachannel/AUTHORS.txt b/vendor/github.com/pion/datachannel/AUTHORS.txt deleted file mode 100644 index c5d9d8d34..000000000 --- a/vendor/github.com/pion/datachannel/AUTHORS.txt +++ /dev/null @@ -1,17 +0,0 @@ -# Thank you to everyone that made Pion possible. If you are interested in contributing -# we would love to have you https://github.com/pion/webrtc/wiki/Contributing -# -# This file is auto generated, using git to list all individuals contributors. -# see `.github/generate-authors.sh` for the scripting -Atsushi Watanabe -backkem -Benny Daon -Chinmay Kousik -Eric Daniels -Hugo Arregui -Hugo Arregui -John Bradley -Norman Rasmussen -Sean DuBois -Sean DuBois -Yutaka Takeda diff --git a/vendor/github.com/pion/datachannel/DESIGN.md b/vendor/github.com/pion/datachannel/DESIGN.md deleted file mode 100644 index 55d6c8fff..000000000 --- a/vendor/github.com/pion/datachannel/DESIGN.md +++ /dev/null @@ -1,20 +0,0 @@ -

- Design -

- -### Portable -Pion Data Channels is written in Go and extremely portable. Anywhere Golang runs, Pion Data Channels should work as well! Instead of dealing with complicated -cross-compiling of multiple libraries, you now can run anywhere with one `go build` - -### Simple API -The API is based on an io.ReadWriteCloser. - -### Readable -If code comes from an RFC we try to make sure everything is commented with a link to the spec. -This makes learning and debugging easier, this library was written to also serve as a guide for others. - -### Tested -Every commit is tested via travis-ci Go provides fantastic facilities for testing, and more will be added as time goes on. - -### Shared libraries -Every pion product is built using shared libraries, allowing others to review and reuse our libraries. diff --git a/vendor/github.com/pion/datachannel/LICENSE b/vendor/github.com/pion/datachannel/LICENSE index ab602974d..491caf6b0 100644 --- a/vendor/github.com/pion/datachannel/LICENSE +++ b/vendor/github.com/pion/datachannel/LICENSE @@ -1,21 +1,9 @@ MIT License -Copyright (c) 2018 +Copyright (c) 2023 The Pion community -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/pion/datachannel/README.md b/vendor/github.com/pion/datachannel/README.md index 7be311dae..c68be942a 100644 --- a/vendor/github.com/pion/datachannel/README.md +++ b/vendor/github.com/pion/datachannel/README.md @@ -6,32 +6,29 @@

A Go implementation of WebRTC Data Channels

Pion Data Channels - Slack Widget
- Build Status - GoDoc + GitHub Workflow Status + Go Reference Coverage Status Go Report Card - License: MIT


-See [DESIGN.md](DESIGN.md) for an overview of features and future goals. - ### Roadmap The library is used as a part of our WebRTC implementation. Please refer to that [roadmap](https://github.com/pion/webrtc/issues/9) to track our major milestones. ### Community -Pion has an active community on the [Golang Slack](https://invite.slack.golangbridge.org/). Sign up and join the **#pion** channel for discussions and support. You can also use [Pion mailing list](https://groups.google.com/forum/#!forum/pion). +Pion has an active community on the [Slack](https://pion.ly/slack). + +Follow the [Pion Twitter](https://twitter.com/_pion) for project updates and important WebRTC news. We are always looking to support **your projects**. Please reach out if you have something to build! - If you need commercial support or don't want to use public methods you can contact us at [team@pion.ly](mailto:team@pion.ly) ### Contributing -Check out the **[contributing wiki](https://github.com/pion/webrtc/wiki/Contributing)** to join the group of amazing people making this project possible: +Check out the [contributing wiki](https://github.com/pion/webrtc/wiki/Contributing) to join the group of amazing people making this project possible ### License MIT License - see [LICENSE](LICENSE) for full text diff --git a/vendor/github.com/pion/datachannel/codecov.yml b/vendor/github.com/pion/datachannel/codecov.yml index 085200a48..263e4d45c 100644 --- a/vendor/github.com/pion/datachannel/codecov.yml +++ b/vendor/github.com/pion/datachannel/codecov.yml @@ -3,6 +3,8 @@ # # It is automatically copied from https://github.com/pion/.goassets repository. # +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT coverage: status: diff --git a/vendor/github.com/pion/datachannel/datachannel.go b/vendor/github.com/pion/datachannel/datachannel.go index 0b125d662..0050185ca 100644 --- a/vendor/github.com/pion/datachannel/datachannel.go +++ b/vendor/github.com/pion/datachannel/datachannel.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + // Package datachannel implements WebRTC Data Channels package datachannel @@ -71,12 +74,12 @@ type Config struct { LoggerFactory logging.LoggerFactory } -func newDataChannel(stream *sctp.Stream, config *Config) (*DataChannel, error) { +func newDataChannel(stream *sctp.Stream, config *Config) *DataChannel { return &DataChannel{ Config: *config, stream: stream, log: config.LoggerFactory.NewLogger("datachannel"), - }, nil + } } // Dial opens a data channels over SCTP @@ -115,7 +118,12 @@ func Client(stream *sctp.Stream, config *Config) (*DataChannel, error) { return nil, fmt.Errorf("failed to send ChannelOpen %w", err) } } - return newDataChannel(stream, config) + dc := newDataChannel(stream, config) + + if err := dc.commitReliabilityParams(); err != nil { + return nil, err + } + return dc, nil } // Accept is used to accept incoming data channels over SCTP @@ -164,10 +172,7 @@ func Server(stream *sctp.Stream, config *Config) (*DataChannel, error) { config.Label = string(openMsg.Label) config.Protocol = string(openMsg.Protocol) - dataChannel, err := newDataChannel(stream, config) - if err != nil { - return nil, err - } + dataChannel := newDataChannel(stream, config) err = dataChannel.writeDataChannelAck() if err != nil { @@ -280,13 +285,9 @@ func (c *DataChannel) handleDCEP(data []byte) error { switch msg := msg.(type) { case *channelAck: - c.log.Debug("Received DATA_CHANNEL_ACK") - if err = c.commitReliabilityParams(); err != nil { - return err - } c.onOpenComplete() default: - return fmt.Errorf("%w %v", ErrInvalidMessageType, msg) + return fmt.Errorf("%w, wanted ACK got %v", ErrUnexpectedDataChannelType, msg) } return nil diff --git a/vendor/github.com/pion/datachannel/errors.go b/vendor/github.com/pion/datachannel/errors.go index f7aeecc0d..2f98bf84b 100644 --- a/vendor/github.com/pion/datachannel/errors.go +++ b/vendor/github.com/pion/datachannel/errors.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package datachannel import "errors" diff --git a/vendor/github.com/pion/datachannel/message.go b/vendor/github.com/pion/datachannel/message.go index 27848c77f..53f221b14 100644 --- a/vendor/github.com/pion/datachannel/message.go +++ b/vendor/github.com/pion/datachannel/message.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package datachannel import ( @@ -8,6 +11,7 @@ import ( type message interface { Marshal() ([]byte, error) Unmarshal([]byte) error + String() string } // messageType is the first byte in a DataChannel message that specifies type diff --git a/vendor/github.com/pion/datachannel/message_channel_ack.go b/vendor/github.com/pion/datachannel/message_channel_ack.go index fd2075790..8fe396f86 100644 --- a/vendor/github.com/pion/datachannel/message_channel_ack.go +++ b/vendor/github.com/pion/datachannel/message_channel_ack.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package datachannel // channelAck is used to ACK a DataChannel open @@ -16,7 +19,11 @@ func (c *channelAck) Marshal() ([]byte, error) { } // Unmarshal populates the struct with the given raw data -func (c *channelAck) Unmarshal(raw []byte) error { +func (c *channelAck) Unmarshal(_ []byte) error { // Message type already checked in Parse and there is no further data return nil } + +func (c channelAck) String() string { + return "ACK" +} diff --git a/vendor/github.com/pion/datachannel/message_channel_open.go b/vendor/github.com/pion/datachannel/message_channel_open.go index 5eb58633c..e7052f4a7 100644 --- a/vendor/github.com/pion/datachannel/message_channel_open.go +++ b/vendor/github.com/pion/datachannel/message_channel_open.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package datachannel import ( @@ -72,6 +75,23 @@ const ( ChannelTypePartialReliableTimedUnordered ChannelType = 0x82 ) +func (c ChannelType) String() string { + switch c { + case ChannelTypeReliable: + case ChannelTypeReliableUnordered: + return "ReliableUnordered" + case ChannelTypePartialReliableRexmit: + return "PartialReliableRexmit" + case ChannelTypePartialReliableRexmitUnordered: + return "PartialReliableRexmitUnordered" + case ChannelTypePartialReliableTimed: + return "PartialReliableTimed" + case ChannelTypePartialReliableTimedUnordered: + return "PartialReliableTimedUnordered" + } + return "Unknown" +} + // ChannelPriority enums const ( ChannelPriorityBelowNormal uint16 = 128 @@ -121,3 +141,7 @@ func (c *channelOpen) Unmarshal(raw []byte) error { c.Protocol = raw[channelOpenHeaderLength+labelLength : channelOpenHeaderLength+labelLength+protocolLength] return nil } + +func (c channelOpen) String() string { + return fmt.Sprintf("Open ChannelType(%s) Priority(%v) ReliabilityParameter(%d) Label(%s) Protocol(%s)", c.ChannelType, c.Priority, c.ReliabilityParameter, string(c.Label), string(c.Protocol)) +} diff --git a/vendor/github.com/pion/datachannel/renovate.json b/vendor/github.com/pion/datachannel/renovate.json index f1614058a..f1bb98c6a 100644 --- a/vendor/github.com/pion/datachannel/renovate.json +++ b/vendor/github.com/pion/datachannel/renovate.json @@ -1,27 +1,6 @@ { + "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ - "config:base", - ":disableDependencyDashboard" - ], - "postUpdateOptions": [ - "gomodTidy" - ], - "commitBody": "Generated by renovateBot", - "packageRules": [ - { - "matchUpdateTypes": ["minor", "patch", "pin", "digest"], - "automerge": true - }, - { - "packagePatterns": ["^golang.org/x/"], - "schedule": ["on the first day of the month"] - } - ], - "ignorePaths": [ - ".github/workflows/generate-authors.yml", - ".github/workflows/lint.yaml", - ".github/workflows/renovate-go-mod-fix.yaml", - ".github/workflows/test.yaml", - ".github/workflows/tidy-check.yaml" + "github>pion/renovate-config" ] } diff --git a/vendor/github.com/pion/dtls/v2/conn.go b/vendor/github.com/pion/dtls/v2/conn.go index 2b7585108..ccea999d9 100644 --- a/vendor/github.com/pion/dtls/v2/conn.go +++ b/vendor/github.com/pion/dtls/v2/conn.go @@ -34,6 +34,9 @@ const ( inboundBufferSize = 8192 // Default replay protection window is specified by RFC 6347 Section 4.1.2.6 defaultReplayProtectionWindow = 64 + // maxAppDataPacketQueueSize is the maximum number of app data packets we will + // enqueue before the handshake is completed + maxAppDataPacketQueueSize = 100 ) func invalidKeyingLabels() map[string]bool { @@ -81,7 +84,7 @@ type Conn struct { replayProtectionWindow uint } -func createConn(ctx context.Context, nextConn net.Conn, config *Config, isClient bool, initialState *State) (*Conn, error) { +func createConn(nextConn net.Conn, config *Config, isClient bool) (*Conn, error) { err := validateConfig(config) if err != nil { return nil, err @@ -91,21 +94,6 @@ func createConn(ctx context.Context, nextConn net.Conn, config *Config, isClient return nil, errNilNextConn } - cipherSuites, err := parseCipherSuites(config.CipherSuites, config.CustomCipherSuites, config.includeCertificateSuites(), config.PSK != nil) - if err != nil { - return nil, err - } - - signatureSchemes, err := signaturehash.ParseSignatureSchemes(config.SignatureSchemes, config.InsecureHashes) - if err != nil { - return nil, err - } - - workerInterval := initialTickerInterval - if config.FlightInterval != 0 { - workerInterval = config.FlightInterval - } - loggerFactory := config.LoggerFactory if loggerFactory == nil { loggerFactory = logging.NewDefaultLoggerFactory() @@ -149,6 +137,28 @@ func createConn(ctx context.Context, nextConn net.Conn, config *Config, isClient c.setRemoteEpoch(0) c.setLocalEpoch(0) + return c, nil +} + +func handshakeConn(ctx context.Context, conn *Conn, config *Config, isClient bool, initialState *State) (*Conn, error) { + if conn == nil { + return nil, errNilNextConn + } + + cipherSuites, err := parseCipherSuites(config.CipherSuites, config.CustomCipherSuites, config.includeCertificateSuites(), config.PSK != nil) + if err != nil { + return nil, err + } + + signatureSchemes, err := signaturehash.ParseSignatureSchemes(config.SignatureSchemes, config.InsecureHashes) + if err != nil { + return nil, err + } + + workerInterval := initialTickerInterval + if config.FlightInterval != 0 { + workerInterval = config.FlightInterval + } serverName := config.ServerName // Do not allow the use of an IP address literal as an SNI value. @@ -180,7 +190,7 @@ func createConn(ctx context.Context, nextConn net.Conn, config *Config, isClient clientCAs: config.ClientCAs, customCipherSuites: config.CustomCipherSuites, retransmitInterval: workerInterval, - log: logger, + log: conn.log, initialEpoch: 0, keyLogWriter: config.KeyLogWriter, sessionStore: config.SessionStore, @@ -205,16 +215,16 @@ func createConn(ctx context.Context, nextConn net.Conn, config *Config, isClient var initialFSMState handshakeState if initialState != nil { - if c.state.isClient { + if conn.state.isClient { initialFlight = flight5 } else { initialFlight = flight6 } initialFSMState = handshakeFinished - c.state = *initialState + conn.state = *initialState } else { - if c.state.isClient { + if conn.state.isClient { initialFlight = flight1 } else { initialFlight = flight0 @@ -222,13 +232,13 @@ func createConn(ctx context.Context, nextConn net.Conn, config *Config, isClient initialFSMState = handshakePreparing } // Do handshake - if err := c.handshake(ctx, hsCfg, initialFlight, initialFSMState); err != nil { + if err := conn.handshake(ctx, hsCfg, initialFlight, initialFSMState); err != nil { return nil, err } - c.log.Trace("Handshake Completed") + conn.log.Trace("Handshake Completed") - return c, nil + return conn, nil } // Dial connects to the given network address and establishes a DTLS connection on top. @@ -279,7 +289,12 @@ func ClientWithContext(ctx context.Context, conn net.Conn, config *Config) (*Con return nil, errPSKAndIdentityMustBeSetForClient } - return createConn(ctx, conn, config, true, nil) + dconn, err := createConn(conn, config, true) + if err != nil { + return nil, err + } + + return handshakeConn(ctx, dconn, config, true, nil) } // ServerWithContext listens for incoming DTLS connections. @@ -287,8 +302,11 @@ func ServerWithContext(ctx context.Context, conn net.Conn, config *Config) (*Con if config == nil { return nil, errNoConfigProvided } - - return createConn(ctx, conn, config, false, nil) + dconn, err := createConn(conn, config, false) + if err != nil { + return nil, err + } + return handshakeConn(ctx, dconn, config, false, nil) } // Read reads data from the connection. @@ -374,14 +392,12 @@ func (c *Conn) ConnectionState() State { // SelectedSRTPProtectionProfile returns the selected SRTPProtectionProfile func (c *Conn) SelectedSRTPProtectionProfile() (SRTPProtectionProfile, bool) { - c.lock.RLock() - defer c.lock.RUnlock() - - if c.state.srtpProtectionProfile == 0 { + profile := c.state.getSRTPProtectionProfile() + if profile == 0 { return 0, false } - return c.state.srtpProtectionProfile, true + return profile, true } func (c *Conn) writePackets(ctx context.Context, pkts []*packet) error { @@ -609,13 +625,8 @@ func (c *Conn) readAndBuffer(ctx context.Context) error { hasHandshake = true } - var e *alertError - if errors.As(err, &e) { - if e.IsFatalOrCloseNotify() { - return e - } - } else if err != nil { - return e + if err != nil { + return err } } if hasHandshake { @@ -650,12 +661,20 @@ func (c *Conn) handleQueuedPackets(ctx context.Context) error { return e } } else if err != nil { - return e + return err } } return nil } +func (c *Conn) enqueueEncryptedPackets(packet []byte) bool { + if len(c.encryptedPackets) < maxAppDataPacketQueueSize { + c.encryptedPackets = append(c.encryptedPackets, packet) + return true + } + return false +} + func (c *Conn) handleIncomingPacket(ctx context.Context, buf []byte, enqueue bool) (bool, *alert.Alert, error) { //nolint:gocognit h := &recordlayer.Header{} if err := h.Unmarshal(buf); err != nil { @@ -664,7 +683,6 @@ func (c *Conn) handleIncomingPacket(ctx context.Context, buf []byte, enqueue boo c.log.Debugf("discarded broken packet: %v", err) return false, nil, nil } - // Validate epoch remoteEpoch := c.state.getRemoteEpoch() if h.Epoch > remoteEpoch { @@ -675,8 +693,9 @@ func (c *Conn) handleIncomingPacket(ctx context.Context, buf []byte, enqueue boo return false, nil, nil } if enqueue { - c.log.Debug("received packet of next epoch, queuing packet") - c.encryptedPackets = append(c.encryptedPackets, buf) + if ok := c.enqueueEncryptedPackets(buf); ok { + c.log.Debug("received packet of next epoch, queuing packet") + } } return false, nil, nil } @@ -699,8 +718,9 @@ func (c *Conn) handleIncomingPacket(ctx context.Context, buf []byte, enqueue boo if h.Epoch != 0 { if c.state.cipherSuite == nil || !c.state.cipherSuite.IsInitialized() { if enqueue { - c.encryptedPackets = append(c.encryptedPackets, buf) - c.log.Debug("handshake not finished, queuing packet") + if ok := c.enqueueEncryptedPackets(buf); ok { + c.log.Debug("handshake not finished, queuing packet") + } } return false, nil, nil } @@ -751,8 +771,9 @@ func (c *Conn) handleIncomingPacket(ctx context.Context, buf []byte, enqueue boo case *protocol.ChangeCipherSpec: if c.state.cipherSuite == nil || !c.state.cipherSuite.IsInitialized() { if enqueue { - c.encryptedPackets = append(c.encryptedPackets, buf) - c.log.Debugf("CipherSuite not initialized, queuing packet") + if ok := c.enqueueEncryptedPackets(buf); ok { + c.log.Debugf("CipherSuite not initialized, queuing packet") + } } return false, nil, nil } @@ -883,7 +904,11 @@ func (c *Conn) handshake(ctx context.Context, cfg *handshakeConfig, initialFligh } } else { switch { - case errors.Is(err, context.DeadlineExceeded), errors.Is(err, context.Canceled), errors.Is(err, io.EOF): + case errors.Is(err, context.DeadlineExceeded), errors.Is(err, context.Canceled), errors.Is(err, io.EOF), errors.Is(err, net.ErrClosed): + case errors.Is(err, recordlayer.ErrInvalidPacketLength): + // Decode error must be silently discarded + // [RFC6347 Section-4.1.2.7] + continue default: if c.isHandshakeCompletedSuccessfully() { // Keep read loop and pass the read error to Read() diff --git a/vendor/github.com/pion/dtls/v2/flight0handler.go b/vendor/github.com/pion/dtls/v2/flight0handler.go index ec766ddff..a0619958f 100644 --- a/vendor/github.com/pion/dtls/v2/flight0handler.go +++ b/vendor/github.com/pion/dtls/v2/flight0handler.go @@ -60,7 +60,7 @@ func flight0Parse(_ context.Context, _ flightConn, state *State, cache *handshak if !ok { return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InsufficientSecurity}, errServerNoMatchingSRTPProfile } - state.srtpProtectionProfile = profile + state.setSRTPProtectionProfile(profile) case *extension.UseExtendedMasterSecret: if cfg.extendedMasterSecret != DisableExtendedMasterSecret { state.extendedMasterSecret = true diff --git a/vendor/github.com/pion/dtls/v2/flight3handler.go b/vendor/github.com/pion/dtls/v2/flight3handler.go index 5a763dc08..ab4e730a5 100644 --- a/vendor/github.com/pion/dtls/v2/flight3handler.go +++ b/vendor/github.com/pion/dtls/v2/flight3handler.go @@ -56,7 +56,7 @@ func flight3Parse(ctx context.Context, c flightConn, state *State, cache *handsh if !found { return 0, &alert.Alert{Level: alert.Fatal, Description: alert.IllegalParameter}, errClientNoMatchingSRTPProfile } - state.srtpProtectionProfile = profile + state.setSRTPProtectionProfile(profile) case *extension.UseExtendedMasterSecret: if cfg.extendedMasterSecret != DisableExtendedMasterSecret { state.extendedMasterSecret = true @@ -71,7 +71,7 @@ func flight3Parse(ctx context.Context, c flightConn, state *State, cache *handsh if cfg.extendedMasterSecret == RequireExtendedMasterSecret && !state.extendedMasterSecret { return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InsufficientSecurity}, errClientRequiredButNoServerEMS } - if len(cfg.localSRTPProtectionProfiles) > 0 && state.srtpProtectionProfile == 0 { + if len(cfg.localSRTPProtectionProfiles) > 0 && state.getSRTPProtectionProfile() == 0 { return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InsufficientSecurity}, errRequestedButNoSRTPExtension } diff --git a/vendor/github.com/pion/dtls/v2/flight4bhandler.go b/vendor/github.com/pion/dtls/v2/flight4bhandler.go index 6bbbc5972..6b1b90469 100644 --- a/vendor/github.com/pion/dtls/v2/flight4bhandler.go +++ b/vendor/github.com/pion/dtls/v2/flight4bhandler.go @@ -59,9 +59,9 @@ func flight4bGenerate(_ flightConn, state *State, cache *handshakeCache, cfg *ha Supported: true, }) } - if state.srtpProtectionProfile != 0 { + if state.getSRTPProtectionProfile() != 0 { extensions = append(extensions, &extension.UseSRTP{ - ProtectionProfiles: []SRTPProtectionProfile{state.srtpProtectionProfile}, + ProtectionProfiles: []SRTPProtectionProfile{state.getSRTPProtectionProfile()}, }) } diff --git a/vendor/github.com/pion/dtls/v2/flight4handler.go b/vendor/github.com/pion/dtls/v2/flight4handler.go index 67a486461..404f7d193 100644 --- a/vendor/github.com/pion/dtls/v2/flight4handler.go +++ b/vendor/github.com/pion/dtls/v2/flight4handler.go @@ -228,9 +228,9 @@ func flight4Generate(_ flightConn, state *State, _ *handshakeCache, cfg *handsha Supported: true, }) } - if state.srtpProtectionProfile != 0 { + if state.getSRTPProtectionProfile() != 0 { extensions = append(extensions, &extension.UseSRTP{ - ProtectionProfiles: []SRTPProtectionProfile{state.srtpProtectionProfile}, + ProtectionProfiles: []SRTPProtectionProfile{state.getSRTPProtectionProfile()}, }) } if state.cipherSuite.AuthenticationType() == CipherSuiteAuthenticationTypeCertificate { diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/recordlayer/errors.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/recordlayer/errors.go index cd4cb60a5..1c1898844 100644 --- a/vendor/github.com/pion/dtls/v2/pkg/protocol/recordlayer/errors.go +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/recordlayer/errors.go @@ -11,9 +11,11 @@ import ( ) var ( - errBufferTooSmall = &protocol.TemporaryError{Err: errors.New("buffer is too small")} //nolint:goerr113 - errInvalidPacketLength = &protocol.TemporaryError{Err: errors.New("packet length and declared length do not match")} //nolint:goerr113 - errSequenceNumberOverflow = &protocol.InternalError{Err: errors.New("sequence number overflow")} //nolint:goerr113 - errUnsupportedProtocolVersion = &protocol.FatalError{Err: errors.New("unsupported protocol version")} //nolint:goerr113 - errInvalidContentType = &protocol.TemporaryError{Err: errors.New("invalid content type")} //nolint:goerr113 + // ErrInvalidPacketLength is returned when the packet length too small or declared length do not match + ErrInvalidPacketLength = &protocol.TemporaryError{Err: errors.New("packet length and declared length do not match")} //nolint:goerr113 + + errBufferTooSmall = &protocol.TemporaryError{Err: errors.New("buffer is too small")} //nolint:goerr113 + errSequenceNumberOverflow = &protocol.InternalError{Err: errors.New("sequence number overflow")} //nolint:goerr113 + errUnsupportedProtocolVersion = &protocol.FatalError{Err: errors.New("unsupported protocol version")} //nolint:goerr113 + errInvalidContentType = &protocol.TemporaryError{Err: errors.New("invalid content type")} //nolint:goerr113 ) diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/recordlayer/recordlayer.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/recordlayer/recordlayer.go index 02325fd2d..a570f745f 100644 --- a/vendor/github.com/pion/dtls/v2/pkg/protocol/recordlayer/recordlayer.go +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/recordlayer/recordlayer.go @@ -86,12 +86,12 @@ func UnpackDatagram(buf []byte) ([][]byte, error) { for offset := 0; len(buf) != offset; { if len(buf)-offset <= HeaderSize { - return nil, errInvalidPacketLength + return nil, ErrInvalidPacketLength } pktLen := (HeaderSize + int(binary.BigEndian.Uint16(buf[offset+11:]))) if offset+pktLen > len(buf) { - return nil, errInvalidPacketLength + return nil, ErrInvalidPacketLength } out = append(out, buf[offset:offset+pktLen]) diff --git a/vendor/github.com/pion/dtls/v2/resume.go b/vendor/github.com/pion/dtls/v2/resume.go index c470d856b..f070d7537 100644 --- a/vendor/github.com/pion/dtls/v2/resume.go +++ b/vendor/github.com/pion/dtls/v2/resume.go @@ -13,7 +13,11 @@ func Resume(state *State, conn net.Conn, config *Config) (*Conn, error) { if err := state.initCipherSuite(); err != nil { return nil, err } - c, err := createConn(context.Background(), conn, config, state.isClient, state) + dconn, err := createConn(conn, config, state.isClient) + if err != nil { + return nil, err + } + c, err := handshakeConn(context.Background(), dconn, config, state.isClient, state) if err != nil { return nil, err } diff --git a/vendor/github.com/pion/dtls/v2/state.go b/vendor/github.com/pion/dtls/v2/state.go index e9f86a80b..9f26d43f1 100644 --- a/vendor/github.com/pion/dtls/v2/state.go +++ b/vendor/github.com/pion/dtls/v2/state.go @@ -22,7 +22,7 @@ type State struct { masterSecret []byte cipherSuite CipherSuite // nil if a cipherSuite hasn't been chosen - srtpProtectionProfile SRTPProtectionProfile // Negotiated SRTPProtectionProfile + srtpProtectionProfile atomic.Value // Negotiated SRTPProtectionProfile PeerCertificates [][]byte IdentityHint []byte SessionID []byte @@ -87,7 +87,7 @@ func (s *State) serialize() *serializedState { SequenceNumber: atomic.LoadUint64(&s.localSequenceNumber[epoch]), LocalRandom: localRnd, RemoteRandom: remoteRnd, - SRTPProtectionProfile: uint16(s.srtpProtectionProfile), + SRTPProtectionProfile: uint16(s.getSRTPProtectionProfile()), PeerCertificates: s.PeerCertificates, IdentityHint: s.IdentityHint, SessionID: s.SessionID, @@ -123,7 +123,7 @@ func (s *State) deserialize(serialized serializedState) { s.cipherSuite = cipherSuiteForID(CipherSuiteID(serialized.CipherSuiteID), nil) atomic.StoreUint64(&s.localSequenceNumber[epoch], serialized.SequenceNumber) - s.srtpProtectionProfile = SRTPProtectionProfile(serialized.SRTPProtectionProfile) + s.setSRTPProtectionProfile(SRTPProtectionProfile(serialized.SRTPProtectionProfile)) // Set remote certificate s.PeerCertificates = serialized.PeerCertificates @@ -214,3 +214,15 @@ func (s *State) getLocalEpoch() uint16 { } return 0 } + +func (s *State) setSRTPProtectionProfile(profile SRTPProtectionProfile) { + s.srtpProtectionProfile.Store(profile) +} + +func (s *State) getSRTPProtectionProfile() SRTPProtectionProfile { + if val, ok := s.srtpProtectionProfile.Load().(SRTPProtectionProfile); ok { + return val + } + + return 0 +} diff --git a/vendor/github.com/pion/ice/v2/AUTHORS.txt b/vendor/github.com/pion/ice/v2/AUTHORS.txt index 57eb69378..56269cc72 100644 --- a/vendor/github.com/pion/ice/v2/AUTHORS.txt +++ b/vendor/github.com/pion/ice/v2/AUTHORS.txt @@ -8,11 +8,14 @@ Adam Kiss adwpc Aleksandr Razumov aler9 <46489434+aler9@users.noreply.github.com> +Anshul Antoine Baché +ar-hosseinkhani Artur Shellunts Assad Obaid Atsushi Watanabe backkem +boks1971 buptczq cgojin Chao Yuan diff --git a/vendor/github.com/pion/ice/v2/active_tcp.go b/vendor/github.com/pion/ice/v2/active_tcp.go new file mode 100644 index 000000000..024e6e7ac --- /dev/null +++ b/vendor/github.com/pion/ice/v2/active_tcp.go @@ -0,0 +1,158 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package ice + +import ( + "context" + "io" + "net" + "sync/atomic" + "time" + + "github.com/pion/logging" + "github.com/pion/transport/v2/packetio" +) + +type activeTCPConn struct { + readBuffer, writeBuffer *packetio.Buffer + localAddr, remoteAddr atomic.Value + closed int32 +} + +func newActiveTCPConn(ctx context.Context, localAddress, remoteAddress string, log logging.LeveledLogger) (a *activeTCPConn) { + a = &activeTCPConn{ + readBuffer: packetio.NewBuffer(), + writeBuffer: packetio.NewBuffer(), + } + + laddr, err := getTCPAddrOnInterface(localAddress) + if err != nil { + atomic.StoreInt32(&a.closed, 1) + log.Infof("Failed to dial TCP address %s: %v", remoteAddress, err) + return + } + a.localAddr.Store(laddr) + + go func() { + defer func() { + atomic.StoreInt32(&a.closed, 1) + }() + + dialer := &net.Dialer{ + LocalAddr: laddr, + } + conn, err := dialer.DialContext(ctx, "tcp", remoteAddress) + if err != nil { + log.Infof("Failed to dial TCP address %s: %v", remoteAddress, err) + return + } + + a.remoteAddr.Store(conn.RemoteAddr()) + + go func() { + buff := make([]byte, receiveMTU) + + for atomic.LoadInt32(&a.closed) == 0 { + n, err := readStreamingPacket(conn, buff) + if err != nil { + log.Infof("Failed to read streaming packet: %s", err) + break + } + + if _, err := a.readBuffer.Write(buff[:n]); err != nil { + log.Infof("Failed to write to buffer: %s", err) + break + } + } + }() + + buff := make([]byte, receiveMTU) + + for atomic.LoadInt32(&a.closed) == 0 { + n, err := a.writeBuffer.Read(buff) + if err != nil { + log.Infof("Failed to read from buffer: %s", err) + break + } + + if _, err = writeStreamingPacket(conn, buff[:n]); err != nil { + log.Infof("Failed to write streaming packet: %s", err) + break + } + } + + if err := conn.Close(); err != nil { + log.Infof("Failed to close connection: %s", err) + } + }() + + return a +} + +func (a *activeTCPConn) ReadFrom(buff []byte) (n int, srcAddr net.Addr, err error) { + if atomic.LoadInt32(&a.closed) == 1 { + return 0, nil, io.ErrClosedPipe + } + + srcAddr = a.RemoteAddr() + n, err = a.readBuffer.Read(buff) + return +} + +func (a *activeTCPConn) WriteTo(buff []byte, _ net.Addr) (n int, err error) { + if atomic.LoadInt32(&a.closed) == 1 { + return 0, io.ErrClosedPipe + } + + return a.writeBuffer.Write(buff) +} + +func (a *activeTCPConn) Close() error { + atomic.StoreInt32(&a.closed, 1) + _ = a.readBuffer.Close() + _ = a.writeBuffer.Close() + return nil +} + +func (a *activeTCPConn) LocalAddr() net.Addr { + if v, ok := a.localAddr.Load().(*net.TCPAddr); ok { + return v + } + + return &net.TCPAddr{} +} + +func (a *activeTCPConn) RemoteAddr() net.Addr { + if v, ok := a.remoteAddr.Load().(*net.TCPAddr); ok { + return v + } + + return &net.TCPAddr{} +} + +func (a *activeTCPConn) SetDeadline(time.Time) error { return io.EOF } +func (a *activeTCPConn) SetReadDeadline(time.Time) error { return io.EOF } +func (a *activeTCPConn) SetWriteDeadline(time.Time) error { return io.EOF } + +func getTCPAddrOnInterface(address string) (*net.TCPAddr, error) { + addr, err := net.ResolveTCPAddr("tcp", address) + if err != nil { + return nil, err + } + + l, err := net.ListenTCP("tcp", addr) + if err != nil { + return nil, err + } + defer func() { + _ = l.Close() + }() + + tcpAddr, ok := l.Addr().(*net.TCPAddr) + if !ok { + return nil, errInvalidAddress + } + + return tcpAddr, nil +} diff --git a/vendor/github.com/pion/ice/v2/agent.go b/vendor/github.com/pion/ice/v2/agent.go index 5350330f6..5befb4a4c 100644 --- a/vendor/github.com/pion/ice/v2/agent.go +++ b/vendor/github.com/pion/ice/v2/agent.go @@ -8,7 +8,9 @@ package ice import ( "context" "fmt" + "math" "net" + "strconv" "strings" "sync" "sync/atomic" @@ -72,6 +74,9 @@ type Agent struct { prflxAcceptanceMinWait time.Duration relayAcceptanceMinWait time.Duration + tcpPriorityOffset uint16 + disableActiveTCP bool + portMin uint16 portMax uint16 @@ -121,6 +126,10 @@ type Agent struct { taskLoopDone chan struct{} err atomicx.Error + // Callback that allows user to implement custom behavior + // for STUN Binding Requests + userBindingRequestHandler func(m *stun.Message, local, remote Candidate, pair *CandidatePair) bool + gatherCandidateCancel func() gatherCandidateDone chan struct{} @@ -315,6 +324,10 @@ func NewAgent(config *AgentConfig) (*Agent, error) { //nolint:gocognit insecureSkipVerify: config.InsecureSkipVerify, includeLoopback: config.IncludeLoopback, + + disableActiveTCP: config.DisableActiveTCP, + + userBindingRequestHandler: config.BindingRequestHandler, } if a.net == nil { @@ -450,6 +463,9 @@ func (a *Agent) connectivityChecks() { } } + t := time.NewTimer(math.MaxInt64) + t.Stop() + for { interval := defaultKeepaliveInterval @@ -470,10 +486,13 @@ func (a *Agent) connectivityChecks() { updateInterval(a.disconnectedTimeout) updateInterval(a.failedTimeout) - t := time.NewTimer(interval) + t.Reset(interval) + select { case <-a.forceCandidateContact: - t.Stop() + if !t.Stop() { + <-t.C + } contact() case <-t.C: contact() @@ -488,6 +507,10 @@ func (a *Agent) updateConnectionState(newState ConnectionState) { if a.connectionState != newState { // Connection has gone to failed, release all gathered candidates if newState == ConnectionStateFailed { + a.removeUfragFromMux() + a.checklist = make([]*CandidatePair, 0) + a.pendingBindingRequests = make([]bindingRequest, 0) + a.setSelectedPair(nil) a.deleteAllCandidates() } @@ -529,7 +552,7 @@ func (a *Agent) setSelectedPair(p *CandidatePair) { } func (a *Agent) pingAllCandidates() { - a.log.Trace("pinging all candidates") + a.log.Trace("Pinging all candidates") if len(a.checklist) == 0 { a.log.Warn("Failed to ping without candidate pairs. Connection is not possible yet.") @@ -543,7 +566,7 @@ func (a *Agent) pingAllCandidates() { } if p.bindingRequestCount > a.maxBindingRequests { - a.log.Tracef("max requests reached for pair %s, marking it as failed", p) + a.log.Tracef("Maximum requests reached for pair %s, marking it as failed", p) p.state = CandidatePairStateFailed } else { a.selector.PingCandidate(p.Local, p.Remote) @@ -651,11 +674,9 @@ func (a *Agent) AddRemoteCandidate(c Candidate) error { return nil } - // Cannot check for network yet because it might not be applied - // when mDNS hostname is used. + // TCP Candidates with TCP type active will probe server passive ones, so + // no need to do anything with them. if c.TCPType() == TCPTypeActive { - // TCP Candidates with TCP type active will probe server passive ones, so - // no need to do anything with them. a.log.Infof("Ignoring remote candidate with tcpType active: %s", c) return nil } @@ -678,6 +699,7 @@ func (a *Agent) AddRemoteCandidate(c Candidate) error { go func() { if err := a.run(a.context(), func(ctx context.Context, agent *Agent) { + // nolint: contextcheck agent.addRemoteCandidate(c) }); err != nil { a.log.Warnf("Failed to add remote candidate %s: %v", c.Address(), err) @@ -709,6 +731,7 @@ func (a *Agent) resolveAndAddMulticastCandidate(c *CandidateHost) { } if err = a.run(a.context(), func(ctx context.Context, agent *Agent) { + // nolint: contextcheck agent.addRemoteCandidate(c) }); err != nil { a.log.Warnf("Failed to add mDNS candidate %s: %v", c.Address(), err) @@ -723,6 +746,47 @@ func (a *Agent) requestConnectivityCheck() { } } +func (a *Agent) addRemotePassiveTCPCandidate(remoteCandidate Candidate) { + localIPs, err := localInterfaces(a.net, a.interfaceFilter, a.ipFilter, []NetworkType{remoteCandidate.NetworkType()}, a.includeLoopback) + if err != nil { + a.log.Warnf("Failed to iterate local interfaces, host candidates will not be gathered %s", err) + return + } + + for i := range localIPs { + conn := newActiveTCPConn( + a.context(), + net.JoinHostPort(localIPs[i].String(), "0"), + net.JoinHostPort(remoteCandidate.Address(), strconv.Itoa(remoteCandidate.Port())), + a.log, + ) + + tcpAddr, ok := conn.LocalAddr().(*net.TCPAddr) + if !ok { + closeConnAndLog(conn, a.log, "Failed to create Active ICE-TCP Candidate: %v", errInvalidAddress) + continue + } + + localCandidate, err := NewCandidateHost(&CandidateHostConfig{ + Network: remoteCandidate.NetworkType().String(), + Address: localIPs[i].String(), + Port: tcpAddr.Port, + Component: ComponentRTP, + TCPType: TCPTypeActive, + }) + if err != nil { + closeConnAndLog(conn, a.log, "Failed to create Active ICE-TCP Candidate: %v", err) + continue + } + + localCandidate.start(a, conn, a.startedCh) + a.localCandidates[localCandidate.NetworkType()] = append(a.localCandidates[localCandidate.NetworkType()], localCandidate) + a.chanCandidate <- localCandidate + + a.addPair(localCandidate, remoteCandidate) + } +} + // addRemoteCandidate assumes you are holding the lock (must be execute using a.run) func (a *Agent) addRemoteCandidate(c Candidate) { set := a.remoteCandidates[c.NetworkType()] @@ -733,12 +797,25 @@ func (a *Agent) addRemoteCandidate(c Candidate) { } } + tcpNetworkTypeFound := false + for _, networkType := range a.networkTypes { + if networkType.IsTCP() { + tcpNetworkTypeFound = true + } + } + + if !a.disableActiveTCP && tcpNetworkTypeFound && c.TCPType() == TCPTypePassive { + a.addRemotePassiveTCPCandidate(c) + } + set = append(set, c) a.remoteCandidates[c.NetworkType()] = set - if localCandidates, ok := a.localCandidates[c.NetworkType()]; ok { - for _, localCandidate := range localCandidates { - a.addPair(localCandidate, c) + if c.TCPType() != TCPTypePassive { + if localCandidates, ok := a.localCandidates[c.NetworkType()]; ok { + for _, localCandidate := range localCandidates { + a.addPair(localCandidate, c) + } } } @@ -750,7 +827,7 @@ func (a *Agent) addCandidate(ctx context.Context, c Candidate, candidateConn net set := a.localCandidates[c.NetworkType()] for _, candidate := range set { if candidate.Equal(c) { - a.log.Debugf("Ignore duplicate candidate: %s", c.String()) + a.log.Debugf("Ignore duplicate candidate: %s", c) if err := c.close(); err != nil { a.log.Warnf("Failed to close duplicate candidate: %v", err) } @@ -778,6 +855,24 @@ func (a *Agent) addCandidate(ctx context.Context, c Candidate, candidateConn net }) } +// GetRemoteCandidates returns the remote candidates +func (a *Agent) GetRemoteCandidates() ([]Candidate, error) { + var res []Candidate + + err := a.run(a.context(), func(ctx context.Context, agent *Agent) { + var candidates []Candidate + for _, set := range agent.remoteCandidates { + candidates = append(candidates, set...) + } + res = candidates + }) + if err != nil { + return nil, err + } + + return res, nil +} + // GetLocalCandidates returns the local candidates func (a *Agent) GetLocalCandidates() ([]Candidate, error) { var res []Candidate @@ -899,7 +994,7 @@ func (a *Agent) findRemoteCandidate(networkType NetworkType, addr net.Addr) Cand } func (a *Agent) sendBindingRequest(m *stun.Message, local, remote Candidate) { - a.log.Tracef("ping STUN from %s to %s", local.String(), remote.String()) + a.log.Tracef("Ping STUN from %s to %s", local, remote) a.invalidatePendingBindingRequests(time.Now()) a.pendingBindingRequests = append(a.pendingBindingRequests, bindingRequest{ @@ -981,7 +1076,7 @@ func (a *Agent) handleInbound(m *stun.Message, local Candidate, remote net.Addr) !(m.Type.Class == stun.ClassSuccessResponse || m.Type.Class == stun.ClassRequest || m.Type.Class == stun.ClassIndication) { - a.log.Tracef("unhandled STUN from %s to %s class(%s) method(%s)", remote, local, m.Type.Class, m.Type.Method) + a.log.Tracef("Unhandled STUN from %s to %s class(%s) method(%s)", remote, local, m.Type.Class, m.Type.Method) return } @@ -1014,6 +1109,8 @@ func (a *Agent) handleInbound(m *stun.Message, local Candidate, remote net.Addr) a.selector.HandleSuccessResponse(m, local, remoteCandidate, remote) } else if m.Type.Class == stun.ClassRequest { + a.log.Tracef("Inbound STUN (Request) from %s to %s, useCandidate: %v", remote, local, m.Contains(stun.AttrUseCandidate)) + if err = stunx.AssertUsername(m, a.localUfrag+":"+a.remoteUfrag); err != nil { a.log.Warnf("Discard message from (%s), %v", remote, err) return @@ -1049,8 +1146,6 @@ func (a *Agent) handleInbound(m *stun.Message, local Candidate, remote net.Addr) a.addRemoteCandidate(remoteCandidate) } - a.log.Tracef("inbound STUN (Request) from %s to %s", remote.String(), local.String()) - a.selector.HandleBindingRequest(m, local, remoteCandidate) } diff --git a/vendor/github.com/pion/ice/v2/agent_config.go b/vendor/github.com/pion/ice/v2/agent_config.go index f5897cd4a..7f7b67a3e 100644 --- a/vendor/github.com/pion/ice/v2/agent_config.go +++ b/vendor/github.com/pion/ice/v2/agent_config.go @@ -41,6 +41,10 @@ const ( // defaultMaxBindingRequests is the maximum number of binding requests before considering a pair failed defaultMaxBindingRequests = 7 + // TCPPriorityOffset is a number which is subtracted from the default (UDP) candidate type preference + // for host, srflx and prfx candidate types. + defaultTCPPriorityOffset = 27 + // maxBufferSize is the number of bytes that can be buffered before we start to error maxBufferSize = 1000 * 1000 // 1MB @@ -174,6 +178,23 @@ type AgentConfig struct { // Include loopback addresses in the candidate list. IncludeLoopback bool + + // TCPPriorityOffset is a number which is subtracted from the default (UDP) candidate type preference + // for host, srflx and prfx candidate types. It helps to configure relative preference of UDP candidates + // against TCP ones. Relay candidates for TCP and UDP are always 0 and not affected by this setting. + // When this is nil, defaultTCPPriorityOffset is used. + TCPPriorityOffset *uint16 + + // DisableActiveTCP can be used to disable Active TCP candidates. Otherwise when TCP is enabled + // Active TCP candidates will be created when a new passive TCP remote candidate is added. + DisableActiveTCP bool + + // BindingRequestHandler allows applications to perform logic on incoming STUN Binding Requests + // This was implemented to allow users to + // * Log incoming Binding Requests for debugging + // * Implement draft-thatcher-ice-renomination + // * Implement custom CandidatePair switching logic + BindingRequestHandler func(m *stun.Message, local, remote Candidate, pair *CandidatePair) bool } // initWithDefaults populates an agent and falls back to defaults if fields are unset @@ -208,6 +229,12 @@ func (config *AgentConfig) initWithDefaults(a *Agent) { a.relayAcceptanceMinWait = *config.RelayAcceptanceMinWait } + if config.TCPPriorityOffset == nil { + a.tcpPriorityOffset = defaultTCPPriorityOffset + } else { + a.tcpPriorityOffset = *config.TCPPriorityOffset + } + if config.DisconnectedTimeout == nil { a.disconnectedTimeout = defaultDisconnectedTimeout } else { diff --git a/vendor/github.com/pion/ice/v2/candidate_base.go b/vendor/github.com/pion/ice/v2/candidate_base.go index 8e551d8f2..7f97be82f 100644 --- a/vendor/github.com/pion/ice/v2/candidate_base.go +++ b/vendor/github.com/pion/ice/v2/candidate_base.go @@ -31,8 +31,8 @@ type candidateBase struct { resolvedAddr net.Addr - lastSent atomic.Value - lastReceived atomic.Value + lastSent atomic.Int64 + lastReceived atomic.Int64 conn net.PacketConn currAgent *Agent @@ -268,6 +268,7 @@ func (c *candidateBase) handleInboundPacket(buf []byte, srcAddr net.Addr) { } if err := a.run(c, func(ctx context.Context, a *Agent) { + // nolint: contextcheck a.handleInbound(m, c, srcAddr) }); err != nil { a.log.Warnf("Failed to handle message: %v", err) @@ -336,14 +337,34 @@ func (c *candidateBase) writeTo(raw []byte, dst Candidate) (int, error) { if errors.Is(err, io.ErrClosedPipe) { return n, err } - c.agent().log.Infof("%s: %v", errSendPacket, err) + c.agent().log.Infof("Failed to send packet: %v", err) return n, nil } c.seen(true) return n, nil } +// TypePreference returns the type preference for this candidate +func (c *candidateBase) TypePreference() uint16 { + pref := c.Type().Preference() + if pref == 0 { + return 0 + } + + if c.NetworkType().IsTCP() { + var tcpPriorityOffset uint16 = defaultTCPPriorityOffset + if c.agent() != nil { + tcpPriorityOffset = c.agent().tcpPriorityOffset + } + + pref -= tcpPriorityOffset + } + + return pref +} + // Priority computes the priority for this ICE Candidate +// See: https://www.rfc-editor.org/rfc/rfc8445#section-5.1.2.1 func (c *candidateBase) Priority() uint32 { if c.priorityOverride != 0 { return c.priorityOverride @@ -355,9 +376,10 @@ func (c *candidateBase) Priority() uint32 { // candidates for a particular component for a particular data stream // that have the same type, the local preference MUST be unique for each // one. - return (1<<24)*uint32(c.Type().Preference()) + + + return (1<<24)*uint32(c.TypePreference()) + (1<<8)*uint32(c.LocalPreference()) + - uint32(256-c.Component()) + (1<<0)*uint32(256-c.Component()) } // Equal is used to compare two candidateBases @@ -378,27 +400,27 @@ func (c *candidateBase) String() string { // LastReceived returns a time.Time indicating the last time // this candidate was received func (c *candidateBase) LastReceived() time.Time { - if lastReceived, ok := c.lastReceived.Load().(time.Time); ok { - return lastReceived + if lastReceived := c.lastReceived.Load(); lastReceived != 0 { + return time.Unix(0, lastReceived) } return time.Time{} } func (c *candidateBase) setLastReceived(t time.Time) { - c.lastReceived.Store(t) + c.lastReceived.Store(t.UnixNano()) } // LastSent returns a time.Time indicating the last time // this candidate was sent func (c *candidateBase) LastSent() time.Time { - if lastSent, ok := c.lastSent.Load().(time.Time); ok { - return lastSent + if lastSent := c.lastSent.Load(); lastSent != 0 { + return time.Unix(0, lastSent) } return time.Time{} } func (c *candidateBase) setLastSent(t time.Time) { - c.lastSent.Store(t) + c.lastSent.Store(t.UnixNano()) } func (c *candidateBase) seen(outbound bool) { diff --git a/vendor/github.com/pion/ice/v2/candidate_peer_reflexive.go b/vendor/github.com/pion/ice/v2/candidate_peer_reflexive.go index f019ec698..bbcfe3358 100644 --- a/vendor/github.com/pion/ice/v2/candidate_peer_reflexive.go +++ b/vendor/github.com/pion/ice/v2/candidate_peer_reflexive.go @@ -39,9 +39,8 @@ func NewCandidatePeerReflexive(config *CandidatePeerReflexiveConfig) (*Candidate } candidateID := config.CandidateID - candidateIDGenerator := newCandidateIDGenerator() if candidateID == "" { - candidateID = candidateIDGenerator.Generate() + candidateID = globalCandidateIDGenerator.Generate() } return &CandidatePeerReflexive{ diff --git a/vendor/github.com/pion/ice/v2/candidatepair.go b/vendor/github.com/pion/ice/v2/candidatepair.go index f33be539c..34ec04707 100644 --- a/vendor/github.com/pion/ice/v2/candidatepair.go +++ b/vendor/github.com/pion/ice/v2/candidatepair.go @@ -35,8 +35,8 @@ func (p *CandidatePair) String() string { return "" } - return fmt.Sprintf("prio %d (local, prio %d) %s <-> %s (remote, prio %d)", - p.priority(), p.Local.Priority(), p.Local, p.Remote, p.Remote.Priority()) + return fmt.Sprintf("prio %d (local, prio %d) %s <-> %s (remote, prio %d), state: %s, nominated: %v, nominateOnBindingSuccess: %v", + p.priority(), p.Local.Priority(), p.Local, p.Remote, p.Remote.Priority(), p.state, p.nominated, p.nominateOnBindingSuccess) } func (p *CandidatePair) equal(other *CandidatePair) bool { @@ -97,6 +97,6 @@ func (p *CandidatePair) Write(b []byte) (int, error) { func (a *Agent) sendSTUN(msg *stun.Message, local, remote Candidate) { _, err := local.writeTo(msg.Raw, remote) if err != nil { - a.log.Tracef("failed to send STUN message: %s", err) + a.log.Tracef("Failed to send STUN message: %s", err) } } diff --git a/vendor/github.com/pion/ice/v2/errors.go b/vendor/github.com/pion/ice/v2/errors.go index e05cce898..46785edbe 100644 --- a/vendor/github.com/pion/ice/v2/errors.go +++ b/vendor/github.com/pion/ice/v2/errors.go @@ -112,29 +112,27 @@ var ( // ErrDetermineNetworkType indicates that the NetworkType was not able to be parsed ErrDetermineNetworkType = errors.New("unable to determine networkType") - errSendPacket = errors.New("failed to send packet") errAttributeTooShortICECandidate = errors.New("attribute not long enough to be ICE candidate") - errParseComponent = errors.New("could not parse component") - errParsePriority = errors.New("could not parse priority") - errParsePort = errors.New("could not parse port") - errParseRelatedAddr = errors.New("could not parse related addresses") - errParseTCPType = errors.New("could not parse TCP type") - errGetXorMappedAddrResponse = errors.New("failed to get XOR-MAPPED-ADDRESS response") + errClosingConnection = errors.New("failed to close connection") errConnectionAddrAlreadyExist = errors.New("connection with same remote address already exists") - errReadingStreamingPacket = errors.New("error reading streaming packet") - errWriting = errors.New("error writing to") - errClosingConnection = errors.New("error closing connection") - errRead = errors.New("unexpected error trying to read") - errUnknownRole = errors.New("unknown role") - errICEWriteSTUNMessage = errors.New("the ICE conn can't write STUN messages") - errUDPMuxDisabled = errors.New("UDPMux is not enabled") - errNoXorAddrMapping = errors.New("no address mapping") - errSendSTUNPacket = errors.New("failed to send STUN packet") - errXORMappedAddrTimeout = errors.New("timeout while waiting for XORMappedAddr") + errGetXorMappedAddrResponse = errors.New("failed to get XOR-MAPPED-ADDRESS response") + errInvalidAddress = errors.New("invalid address") + errNoTCPMuxAvailable = errors.New("no TCP mux is available") errNotImplemented = errors.New("not implemented yet") errNoUDPMuxAvailable = errors.New("no UDP mux is available") - errNoTCPMuxAvailable = errors.New("no TCP mux is available") - errInvalidAddress = errors.New("invalid address") + errNoXorAddrMapping = errors.New("no address mapping") + errParseComponent = errors.New("failed to parse component") + errParsePort = errors.New("failed to parse port") + errParsePriority = errors.New("failed to parse priority") + errParseRelatedAddr = errors.New("failed to parse related addresses") + errParseTCPType = errors.New("failed to parse TCP type") + errRead = errors.New("failed to read") + errUDPMuxDisabled = errors.New("UDPMux is not enabled") + errUnknownRole = errors.New("unknown role") + errWrite = errors.New("failed to write") + errWriteSTUNMessage = errors.New("failed to send STUN message") + errWriteSTUNMessageToIceConn = errors.New("failed to write STUN message to ICE connection") + errXORMappedAddrTimeout = errors.New("timeout while waiting for XORMappedAddr") // UDPMuxDefault should not listen on unspecified address, but to keep backward compatibility, don't return error now. // will be used in the future. diff --git a/vendor/github.com/pion/ice/v2/gather.go b/vendor/github.com/pion/ice/v2/gather.go index 15e2da146..f93e6c16a 100644 --- a/vendor/github.com/pion/ice/v2/gather.go +++ b/vendor/github.com/pion/ice/v2/gather.go @@ -32,7 +32,7 @@ func closeConnAndLog(c io.Closer, log logging.LeveledLogger, msg string, args .. return } - log.Warnf(msg) + log.Warnf(msg, args...) if err := c.Close(); err != nil { log.Warnf("Failed to close connection: %v", err) } @@ -400,7 +400,7 @@ func (a *Agent) gatherCandidatesSrflxUDPMux(ctx context.Context, urls []*stun.UR hostPort := fmt.Sprintf("%s:%d", url.Host, url.Port) serverAddr, err := a.net.ResolveUDPAddr(network, hostPort) if err != nil { - a.log.Warnf("Failed to resolve STUN host: %s: %v", hostPort, err) + a.log.Debugf("Failed to resolve STUN host: %s: %v", hostPort, err) return } @@ -462,7 +462,7 @@ func (a *Agent) gatherCandidatesSrflx(ctx context.Context, urls []*stun.URI, net hostPort := fmt.Sprintf("%s:%d", url.Host, url.Port) serverAddr, err := a.net.ResolveUDPAddr(network, hostPort) if err != nil { - a.log.Warnf("Failed to resolve STUN host: %s: %v", hostPort, err) + a.log.Debugf("Failed to resolve STUN host: %s: %v", hostPort, err) return } diff --git a/vendor/github.com/pion/ice/v2/selection.go b/vendor/github.com/pion/ice/v2/selection.go index 9f312637f..69bde40ac 100644 --- a/vendor/github.com/pion/ice/v2/selection.go +++ b/vendor/github.com/pion/ice/v2/selection.go @@ -51,7 +51,7 @@ func (s *controllingSelector) ContactCandidates() { switch { case s.agent.getSelectedPair() != nil: if s.agent.validateSelectedPair() { - s.log.Trace("checking keepalive") + s.log.Trace("Checking keepalive") s.agent.checkKeepalive() } case s.nominatedPair != nil: @@ -59,7 +59,7 @@ func (s *controllingSelector) ContactCandidates() { default: p := s.agent.getBestValidCandidatePair() if p != nil && s.isNominatable(p.Local) && s.isNominatable(p.Remote) { - s.log.Tracef("Nominatable pair found, nominating (%s, %s)", p.Local.String(), p.Remote.String()) + s.log.Tracef("Nominatable pair found, nominating (%s, %s)", p.Local, p.Remote) p.nominated = true s.nominatedPair = p s.nominatePair(p) @@ -87,7 +87,7 @@ func (s *controllingSelector) nominatePair(pair *CandidatePair) { return } - s.log.Tracef("ping STUN (nominate candidate pair) from %s to %s", pair.Local.String(), pair.Remote.String()) + s.log.Tracef("Ping STUN (nominate candidate pair) from %s to %s", pair.Local, pair.Remote) s.agent.sendBindingRequest(msg, pair.Local, pair.Remote) } @@ -106,12 +106,17 @@ func (s *controllingSelector) HandleBindingRequest(m *stun.Message, local, remot if bestPair == nil { s.log.Tracef("No best pair available") } else if bestPair.equal(p) && s.isNominatable(p.Local) && s.isNominatable(p.Remote) { - s.log.Tracef("The candidate (%s, %s) is the best candidate available, marking it as nominated", - p.Local.String(), p.Remote.String()) + s.log.Tracef("The candidate (%s, %s) is the best candidate available, marking it as nominated", p.Local, p.Remote) s.nominatedPair = p s.nominatePair(p) } } + + if s.agent.userBindingRequestHandler != nil { + if shouldSwitch := s.agent.userBindingRequestHandler(m, local, remote, p); shouldSwitch { + s.agent.setSelectedPair(p) + } + } } func (s *controllingSelector) HandleSuccessResponse(m *stun.Message, local, remote Candidate, remoteAddr net.Addr) { @@ -130,7 +135,7 @@ func (s *controllingSelector) HandleSuccessResponse(m *stun.Message, local, remo return } - s.log.Tracef("inbound STUN (SuccessResponse) from %s to %s", remote.String(), local.String()) + s.log.Tracef("Inbound STUN (SuccessResponse) from %s to %s", remote, local) p := s.agent.findPair(local, remote) if p == nil { @@ -173,7 +178,7 @@ func (s *controlledSelector) Start() { func (s *controlledSelector) ContactCandidates() { if s.agent.getSelectedPair() != nil { if s.agent.validateSelectedPair() { - s.log.Trace("checking keepalive") + s.log.Trace("Checking keepalive") s.agent.checkKeepalive() } } else { @@ -221,7 +226,7 @@ func (s *controlledSelector) HandleSuccessResponse(m *stun.Message, local, remot return } - s.log.Tracef("inbound STUN (SuccessResponse) from %s to %s", remote.String(), local.String()) + s.log.Tracef("Inbound STUN (SuccessResponse) from %s to %s", remote, local) p := s.agent.findPair(local, remote) if p == nil { @@ -237,20 +242,18 @@ func (s *controlledSelector) HandleSuccessResponse(m *stun.Message, local, remot (selectedPair != p && selectedPair.priority() <= p.priority()) { s.agent.setSelectedPair(p) } else if selectedPair != p { - s.log.Tracef("ignore nominate new pair %s, already nominated pair %s", p, selectedPair) + s.log.Tracef("Ignore nominate new pair %s, already nominated pair %s", p, selectedPair) } } } func (s *controlledSelector) HandleBindingRequest(m *stun.Message, local, remote Candidate) { - useCandidate := m.Contains(stun.AttrUseCandidate) - p := s.agent.findPair(local, remote) if p == nil { p = s.agent.addPair(local, remote) } - if useCandidate { + if m.Contains(stun.AttrUseCandidate) { // https://tools.ietf.org/html/rfc8445#section-7.3.1.5 if p.state == CandidatePairStateSucceeded { @@ -258,11 +261,11 @@ func (s *controlledSelector) HandleBindingRequest(m *stun.Message, local, remote // previously sent by this pair produced a successful response and // generated a valid pair (Section 7.2.5.3.2). The agent sets the // nominated flag value of the valid pair to true. - if selectedPair := s.agent.getSelectedPair(); selectedPair == nil || - (selectedPair != p && selectedPair.priority() <= p.priority()) { + selectedPair := s.agent.getSelectedPair() + if selectedPair == nil || (selectedPair != p && selectedPair.priority() <= p.priority()) { s.agent.setSelectedPair(p) } else if selectedPair != p { - s.log.Tracef("ignore nominate new pair %s, already nominated pair %s", p, selectedPair) + s.log.Tracef("Ignore nominate new pair %s, already nominated pair %s", p, selectedPair) } } else { // If the received Binding request triggered a new check to be @@ -279,6 +282,12 @@ func (s *controlledSelector) HandleBindingRequest(m *stun.Message, local, remote s.agent.sendBindingSuccess(m, local, remote) s.PingCandidate(local, remote) + + if s.agent.userBindingRequestHandler != nil { + if shouldSwitch := s.agent.userBindingRequestHandler(m, local, remote, p); shouldSwitch { + s.agent.setSelectedPair(p) + } + } } type liteSelector struct { diff --git a/vendor/github.com/pion/ice/v2/tcp_mux.go b/vendor/github.com/pion/ice/v2/tcp_mux.go index fb4e5243e..ff3afed02 100644 --- a/vendor/github.com/pion/ice/v2/tcp_mux.go +++ b/vendor/github.com/pion/ice/v2/tcp_mux.go @@ -10,6 +10,7 @@ import ( "net" "strings" "sync" + "time" "github.com/pion/logging" "github.com/pion/stun" @@ -52,6 +53,16 @@ type TCPMuxParams struct { // if the write buffer is full, the subsequent write packet will be dropped until it has enough space. // a default 4MB is recommended. WriteBufferSize int + + // A new established connection will be removed if the first STUN binding request is not received within this timeout, + // avoiding the client with bad network or attacker to create a lot of empty connections. + // Default 30s timeout will be used if not set. + FirstStunBindTimeout time.Duration + + // TCPMux will create connection from STUN binding request with an unknown username, if + // the connection is not used in the timeout, it will be removed to avoid resource leak / attack. + // Default 30s timeout will be used if not set. + AliveDurationForConnFromStun time.Duration } // NewTCPMuxDefault creates a new instance of TCPMuxDefault. @@ -60,6 +71,14 @@ func NewTCPMuxDefault(params TCPMuxParams) *TCPMuxDefault { params.Logger = logging.NewDefaultLoggerFactory().NewLogger("ice") } + if params.FirstStunBindTimeout == 0 { + params.FirstStunBindTimeout = 30 * time.Second + } + + if params.AliveDurationForConnFromStun == 0 { + params.AliveDurationForConnFromStun = 30 * time.Second + } + m := &TCPMuxDefault{ params: ¶ms, @@ -110,13 +129,14 @@ func (m *TCPMuxDefault) GetConnByUfrag(ufrag string, isIPv6 bool, local net.IP) } if conn, ok := m.getConn(ufrag, isIPv6, local); ok { + conn.ClearAliveTimer() return conn, nil } - return m.createConn(ufrag, isIPv6, local) + return m.createConn(ufrag, isIPv6, local, false) } -func (m *TCPMuxDefault) createConn(ufrag string, isIPv6 bool, local net.IP) (*tcpPacketConn, error) { +func (m *TCPMuxDefault) createConn(ufrag string, isIPv6 bool, local net.IP, fromStun bool) (*tcpPacketConn, error) { addr, ok := m.LocalAddr().(*net.TCPAddr) if !ok { return nil, ErrGetTransportAddress @@ -124,11 +144,17 @@ func (m *TCPMuxDefault) createConn(ufrag string, isIPv6 bool, local net.IP) (*tc localAddr := *addr localAddr.IP = local + var alive time.Duration + if fromStun { + alive = m.params.AliveDurationForConnFromStun + } + conn := newTCPPacketConn(tcpPacketParams{ - ReadBuffer: m.params.ReadBufferSize, - WriteBuffer: m.params.WriteBufferSize, - LocalAddr: &localAddr, - Logger: m.params.Logger, + ReadBuffer: m.params.ReadBufferSize, + WriteBuffer: m.params.WriteBufferSize, + LocalAddr: &localAddr, + Logger: m.params.Logger, + AliveDuration: alive, }) var conns map[ipAddr]*tcpPacketConn @@ -163,13 +189,26 @@ func (m *TCPMuxDefault) closeAndLogError(closer io.Closer) { } func (m *TCPMuxDefault) handleConn(conn net.Conn) { - buf := make([]byte, receiveMTU) + buf := make([]byte, 512) + if m.params.FirstStunBindTimeout > 0 { + if err := conn.SetReadDeadline(time.Now().Add(m.params.FirstStunBindTimeout)); err != nil { + m.params.Logger.Warnf("Failed to set read deadline for first STUN message: %s to %s , err: %s", conn.RemoteAddr(), conn.LocalAddr(), err) + } + } n, err := readStreamingPacket(conn, buf) if err != nil { - m.params.Logger.Warnf("Error reading first packet from %s: %s", conn.RemoteAddr().String(), err) + if errors.Is(err, io.ErrShortBuffer) { + m.params.Logger.Warnf("Buffer too small for first packet from %s: %s", conn.RemoteAddr(), err) + } else { + m.params.Logger.Warnf("Error reading first packet from %s: %s", conn.RemoteAddr(), err) + } + m.closeAndLogError(conn) return } + if err = conn.SetReadDeadline(time.Time{}); err != nil { + m.params.Logger.Warnf("Failed to reset read deadline from %s: %s", conn.RemoteAddr(), err) + } buf = buf[:n] @@ -191,7 +230,7 @@ func (m *TCPMuxDefault) handleConn(conn net.Conn) { } for _, attr := range msg.Attributes { - m.params.Logger.Debugf("msg attr: %s", attr.String()) + m.params.Logger.Debugf("Message attribute: %s", attr.String()) } attr, err := msg.Get(stun.AttrUsername) @@ -204,9 +243,6 @@ func (m *TCPMuxDefault) handleConn(conn net.Conn) { ufrag := strings.Split(string(attr), ":")[0] m.params.Logger.Debugf("Ufrag: %s", ufrag) - m.mu.Lock() - defer m.mu.Unlock() - host, _, err := net.SplitHostPort(conn.RemoteAddr().String()) if err != nil { m.closeAndLogError(conn) @@ -222,15 +258,18 @@ func (m *TCPMuxDefault) handleConn(conn net.Conn) { m.params.Logger.Warnf("Failed to get local tcp address in STUN message from %s to %s", conn.RemoteAddr(), conn.LocalAddr()) return } + m.mu.Lock() packetConn, ok := m.getConn(ufrag, isIPv6, localAddr.IP) if !ok { - packetConn, err = m.createConn(ufrag, isIPv6, localAddr.IP) + packetConn, err = m.createConn(ufrag, isIPv6, localAddr.IP, true) if err != nil { + m.mu.Unlock() m.closeAndLogError(conn) m.params.Logger.Warnf("Failed to create packetConn for STUN message from %s to %s", conn.RemoteAddr(), conn.LocalAddr()) return } } + m.mu.Unlock() if err := packetConn.AddConn(conn, buf); err != nil { m.closeAndLogError(conn) diff --git a/vendor/github.com/pion/ice/v2/tcp_packet_conn.go b/vendor/github.com/pion/ice/v2/tcp_packet_conn.go index 8c51fd1cc..60ea2c80c 100644 --- a/vendor/github.com/pion/ice/v2/tcp_packet_conn.go +++ b/vendor/github.com/pion/ice/v2/tcp_packet_conn.go @@ -56,12 +56,12 @@ func (bc *bufferedConn) writeProcess() { } if err != nil { - bc.logger.Warnf("read buffer error: %s", err) + bc.logger.Warnf("Failed to read from buffer: %s", err) continue } if _, err := bc.Conn.Write(pktBuf[:n]); err != nil { - bc.logger.Warnf("write error: %s", err) + bc.logger.Warnf("Failed to write: %s", err) continue } } @@ -85,6 +85,7 @@ type tcpPacketConn struct { wg sync.WaitGroup closedChan chan struct{} closeOnce sync.Once + aliveTimer *time.Timer } type streamingPacket struct { @@ -94,10 +95,11 @@ type streamingPacket struct { } type tcpPacketParams struct { - ReadBuffer int - LocalAddr net.Addr - Logger logging.LeveledLogger - WriteBuffer int + ReadBuffer int + LocalAddr net.Addr + Logger logging.LeveledLogger + WriteBuffer int + AliveDuration time.Duration } func newTCPPacketConn(params tcpPacketParams) *tcpPacketConn { @@ -110,11 +112,26 @@ func newTCPPacketConn(params tcpPacketParams) *tcpPacketConn { closedChan: make(chan struct{}), } + if params.AliveDuration > 0 { + p.aliveTimer = time.AfterFunc(params.AliveDuration, func() { + p.params.Logger.Warn("close tcp packet conn by alive timeout") + _ = p.Close() + }) + } + return p } +func (t *tcpPacketConn) ClearAliveTimer() { + t.mu.Lock() + if t.aliveTimer != nil { + t.aliveTimer.Stop() + } + t.mu.Unlock() +} + func (t *tcpPacketConn) AddConn(conn net.Conn, firstPacketData []byte) error { - t.params.Logger.Infof("AddConn: %s remote %s to local %s", conn.RemoteAddr().Network(), conn.RemoteAddr(), conn.LocalAddr()) + t.params.Logger.Infof("Added connection: %s remote %s to local %s", conn.RemoteAddr().Network(), conn.RemoteAddr(), conn.LocalAddr()) t.mu.Lock() defer t.mu.Unlock() @@ -160,7 +177,7 @@ func (t *tcpPacketConn) startReading(conn net.Conn) { for { n, err := readStreamingPacket(conn, buf) if err != nil { - t.params.Logger.Infof("%v: %s", errReadingStreamingPacket, err) + t.params.Logger.Warnf("Failed to read streaming packet: %s", err) t.handleRecv(streamingPacket{nil, conn.RemoteAddr(), err}) t.removeConn(conn) return @@ -231,7 +248,7 @@ func (t *tcpPacketConn) WriteTo(buf []byte, rAddr net.Addr) (n int, err error) { n, err = writeStreamingPacket(conn, buf) if err != nil { - t.params.Logger.Tracef("%w %s", errWriting, rAddr) + t.params.Logger.Tracef("%w %s", errWrite, rAddr) return n, err } @@ -261,6 +278,9 @@ func (t *tcpPacketConn) Close() error { t.closeOnce.Do(func() { close(t.closedChan) shouldCloseRecvChan = true + if t.aliveTimer != nil { + t.aliveTimer.Stop() + } }) for _, conn := range t.conns { diff --git a/vendor/github.com/pion/ice/v2/transport.go b/vendor/github.com/pion/ice/v2/transport.go index cd37a9b26..93dc719b0 100644 --- a/vendor/github.com/pion/ice/v2/transport.go +++ b/vendor/github.com/pion/ice/v2/transport.go @@ -86,7 +86,7 @@ func (c *Conn) Write(p []byte) (int, error) { } if stun.IsMessage(p) { - return 0, errICEWriteSTUNMessage + return 0, errWriteSTUNMessageToIceConn } pair := c.agent.getSelectedPair() diff --git a/vendor/github.com/pion/ice/v2/udp_mux.go b/vendor/github.com/pion/ice/v2/udp_mux.go index 405bb7b1a..ba2a7e380 100644 --- a/vendor/github.com/pion/ice/v2/udp_mux.go +++ b/vendor/github.com/pion/ice/v2/udp_mux.go @@ -36,7 +36,7 @@ type UDPMuxDefault struct { connsIPv4, connsIPv6 map[string]*udpMuxedConn addressMapMu sync.RWMutex - addressMap map[string]*udpMuxedConn + addressMap map[udpMuxedConnAddr]*udpMuxedConn // Buffer pool to recycle buffers for net.UDPAddr encodes/decodes pool *sync.Pool @@ -47,8 +47,6 @@ type UDPMuxDefault struct { localAddrsForUnspecified []net.Addr } -const maxAddrSize = 512 - // UDPMuxParams are parameters for UDPMux. type UDPMuxParams struct { Logger logging.LeveledLogger @@ -89,7 +87,7 @@ func NewUDPMuxDefault(params UDPMuxParams) *UDPMuxDefault { if params.Net == nil { var err error if params.Net, err = stdnet.NewNet(); err != nil { - params.Logger.Errorf("failed to get create network: %v", err) + params.Logger.Errorf("Failed to get create network: %v", err) } } @@ -99,13 +97,13 @@ func NewUDPMuxDefault(params UDPMuxParams) *UDPMuxDefault { localAddrsForUnspecified = append(localAddrsForUnspecified, &net.UDPAddr{IP: ip, Port: addr.Port}) } } else { - params.Logger.Errorf("failed to get local interfaces for unspecified addr: %v", err) + params.Logger.Errorf("Failed to get local interfaces for unspecified addr: %v", err) } } } m := &UDPMuxDefault{ - addressMap: map[string]*udpMuxedConn{}, + addressMap: map[udpMuxedConnAddr]*udpMuxedConn{}, params: params, connsIPv4: make(map[string]*udpMuxedConn), connsIPv6: make(map[string]*udpMuxedConn), @@ -113,7 +111,7 @@ func NewUDPMuxDefault(params UDPMuxParams) *UDPMuxDefault { pool: &sync.Pool{ New: func() interface{} { // Big enough buffer to fit both packet and address - return newBufferHolder(receiveMTU + maxAddrSize) + return newBufferHolder(receiveMTU) }, }, localAddrsForUnspecified: localAddrsForUnspecified, @@ -246,7 +244,7 @@ func (m *UDPMuxDefault) writeTo(buf []byte, rAddr net.Addr) (n int, err error) { return m.params.UDPConn.WriteTo(buf, rAddr) } -func (m *UDPMuxDefault) registerConnForAddress(conn *udpMuxedConn, addr string) { +func (m *UDPMuxDefault) registerConnForAddress(conn *udpMuxedConn, addr udpMuxedConnAddr) { if m.IsClosed() { return } @@ -290,7 +288,7 @@ func (m *UDPMuxDefault) connWorker() { if os.IsTimeout(err) { continue } else if !errors.Is(err, io.EOF) { - logger.Errorf("could not read udp packet: %v", err) + logger.Errorf("Failed to read UDP packet: %v", err) } return @@ -298,13 +296,13 @@ func (m *UDPMuxDefault) connWorker() { udpAddr, ok := addr.(*net.UDPAddr) if !ok { - logger.Errorf("underlying PacketConn did not return a UDPAddr") + logger.Errorf("Underlying PacketConn did not return a UDPAddr") return } // If we have already seen this address dispatch to the appropriate destination m.addressMapMu.Lock() - destinationConn := m.addressMap[addr.String()] + destinationConn := m.addressMap[newUDPMuxedConnAddr(udpAddr)] m.addressMapMu.Unlock() // If we haven't seen this address before but is a STUN packet lookup by ufrag @@ -333,12 +331,12 @@ func (m *UDPMuxDefault) connWorker() { } if destinationConn == nil { - m.params.Logger.Tracef("dropping packet from %s, addr: %s", udpAddr.String(), addr.String()) + m.params.Logger.Tracef("Dropping packet from %s, addr: %s", udpAddr, addr) continue } if err = destinationConn.writePacket(buf[:n], udpAddr); err != nil { - m.params.Logger.Errorf("could not write packet: %v", err) + m.params.Logger.Errorf("Failed to write packet: %v", err) } } } @@ -353,7 +351,9 @@ func (m *UDPMuxDefault) getConn(ufrag string, isIPv6 bool) (val *udpMuxedConn, o } type bufferHolder struct { - buf []byte + next *bufferHolder + buf []byte + addr *net.UDPAddr } func newBufferHolder(size int) *bufferHolder { @@ -361,3 +361,8 @@ func newBufferHolder(size int) *bufferHolder { buf: make([]byte, size), } } + +func (b *bufferHolder) reset() { + b.next = nil + b.addr = nil +} diff --git a/vendor/github.com/pion/ice/v2/udp_mux_universal.go b/vendor/github.com/pion/ice/v2/udp_mux_universal.go index 07b6a70ea..0a648af3e 100644 --- a/vendor/github.com/pion/ice/v2/udp_mux_universal.go +++ b/vendor/github.com/pion/ice/v2/udp_mux_universal.go @@ -188,9 +188,9 @@ func (m *UniversalUDPMuxDefault) GetXORMappedAddr(serverAddr net.Addr, deadline // Otherwise, make a STUN request to discover the address // or wait for already sent request to complete - waitAddrReceived, err := m.sendSTUN(serverAddr) + waitAddrReceived, err := m.writeSTUN(serverAddr) if err != nil { - return nil, fmt.Errorf("%w: %s", errSendSTUNPacket, err) //nolint:errorlint + return nil, fmt.Errorf("%w: %s", errWriteSTUNMessage, err) //nolint:errorlint } // Block until response was handled by the connWorker routine and XORMappedAddress was updated @@ -209,11 +209,11 @@ func (m *UniversalUDPMuxDefault) GetXORMappedAddr(serverAddr net.Addr, deadline } } -// sendSTUN sends a STUN request via UDP conn. +// writeSTUN sends a STUN request via UDP conn. // // The returned channel is closed when the STUN response has been received. // Method is safe for concurrent use. -func (m *UniversalUDPMuxDefault) sendSTUN(serverAddr net.Addr) (chan struct{}, error) { +func (m *UniversalUDPMuxDefault) writeSTUN(serverAddr net.Addr) (chan struct{}, error) { m.mu.Lock() defer m.mu.Unlock() diff --git a/vendor/github.com/pion/ice/v2/udp_muxed_conn.go b/vendor/github.com/pion/ice/v2/udp_muxed_conn.go index 09e4b3a8e..322d02074 100644 --- a/vendor/github.com/pion/ice/v2/udp_muxed_conn.go +++ b/vendor/github.com/pion/ice/v2/udp_muxed_conn.go @@ -4,16 +4,33 @@ package ice import ( - "encoding/binary" "io" "net" "sync" "time" "github.com/pion/logging" - "github.com/pion/transport/v2/packetio" ) +type udpMuxedConnState int + +const ( + udpMuxedConnOpen udpMuxedConnState = iota + udpMuxedConnWaiting + udpMuxedConnClosed +) + +type udpMuxedConnAddr struct { + ip [16]byte + port uint16 +} + +func newUDPMuxedConnAddr(addr *net.UDPAddr) (a udpMuxedConnAddr) { + copy(a.ip[:], addr.IP.To16()) + a.port = uint16(addr.Port) + return a +} + type udpMuxedConnParams struct { Mux *UDPMuxDefault AddrPool *sync.Pool @@ -26,54 +43,63 @@ type udpMuxedConnParams struct { type udpMuxedConn struct { params *udpMuxedConnParams // Remote addresses that we have sent to on this conn - addresses []string + addresses []udpMuxedConnAddr - // Channel holding incoming packets - buf *packetio.Buffer - closedChan chan struct{} - closeOnce sync.Once - mu sync.Mutex + // FIFO queue holding incoming packets + bufHead, bufTail *bufferHolder + notify chan struct{} + closedChan chan struct{} + state udpMuxedConnState + mu sync.Mutex } func newUDPMuxedConn(params *udpMuxedConnParams) *udpMuxedConn { - p := &udpMuxedConn{ + return &udpMuxedConn{ params: params, - buf: packetio.NewBuffer(), + notify: make(chan struct{}, 1), closedChan: make(chan struct{}), } - - return p } func (c *udpMuxedConn) ReadFrom(b []byte) (n int, rAddr net.Addr, err error) { - buf := c.params.AddrPool.Get().(*bufferHolder) //nolint:forcetypeassert - defer c.params.AddrPool.Put(buf) + for { + c.mu.Lock() + if c.bufTail != nil { + pkt := c.bufTail + c.bufTail = pkt.next - // Read address - total, err := c.buf.Read(buf.buf) - if err != nil { - return 0, nil, err + if pkt == c.bufHead { + c.bufHead = nil + } + c.mu.Unlock() + + if len(b) < len(pkt.buf) { + err = io.ErrShortBuffer + } else { + n = copy(b, pkt.buf) + rAddr = pkt.addr + } + + pkt.reset() + c.params.AddrPool.Put(pkt) + + return + } + + if c.state == udpMuxedConnClosed { + c.mu.Unlock() + return 0, nil, io.EOF + } + + c.state = udpMuxedConnWaiting + c.mu.Unlock() + + select { + case <-c.notify: + case <-c.closedChan: + return 0, nil, io.EOF + } } - - dataLen := int(binary.LittleEndian.Uint16(buf.buf[:2])) - if dataLen > total || dataLen > len(b) { - return 0, nil, io.ErrShortBuffer - } - - // Read data and then address - offset := 2 - copy(b, buf.buf[offset:offset+dataLen]) - offset += dataLen - - // Read address len & decode address - addrLen := int(binary.LittleEndian.Uint16(buf.buf[offset : offset+2])) - offset += 2 - - if rAddr, err = decodeUDPAddr(buf.buf[offset : offset+addrLen]); err != nil { - return 0, nil, err - } - - return dataLen, rAddr, nil } func (c *udpMuxedConn) WriteTo(buf []byte, rAddr net.Addr) (n int, err error) { @@ -81,7 +107,7 @@ func (c *udpMuxedConn) WriteTo(buf []byte, rAddr net.Addr) (n int, err error) { return 0, io.ErrClosedPipe } // Each time we write to a new address, we'll register it with the mux - addr := rAddr.String() + addr := newUDPMuxedConnAddr(rAddr.(*net.UDPAddr)) if !c.containsAddress(addr) { c.addAddress(addr) } @@ -110,32 +136,41 @@ func (c *udpMuxedConn) CloseChannel() <-chan struct{} { } func (c *udpMuxedConn) Close() error { - var err error - c.closeOnce.Do(func() { - err = c.buf.Close() + c.mu.Lock() + defer c.mu.Unlock() + if c.state != udpMuxedConnClosed { + for pkt := c.bufTail; pkt != nil; { + next := pkt.next + + pkt.reset() + c.params.AddrPool.Put(pkt) + + pkt = next + } + c.bufHead = nil + c.bufTail = nil + + c.state = udpMuxedConnClosed close(c.closedChan) - }) - return err + } + return nil } func (c *udpMuxedConn) isClosed() bool { - select { - case <-c.closedChan: - return true - default: - return false - } -} - -func (c *udpMuxedConn) getAddresses() []string { c.mu.Lock() defer c.mu.Unlock() - addresses := make([]string, len(c.addresses)) + return c.state == udpMuxedConnClosed +} + +func (c *udpMuxedConn) getAddresses() []udpMuxedConnAddr { + c.mu.Lock() + defer c.mu.Unlock() + addresses := make([]udpMuxedConnAddr, len(c.addresses)) copy(addresses, c.addresses) return addresses } -func (c *udpMuxedConn) addAddress(addr string) { +func (c *udpMuxedConn) addAddress(addr udpMuxedConnAddr) { c.mu.Lock() c.addresses = append(c.addresses, addr) c.mu.Unlock() @@ -144,11 +179,11 @@ func (c *udpMuxedConn) addAddress(addr string) { c.params.Mux.registerConnForAddress(c, addr) } -func (c *udpMuxedConn) removeAddress(addr string) { +func (c *udpMuxedConn) removeAddress(addr udpMuxedConnAddr) { c.mu.Lock() defer c.mu.Unlock() - newAddresses := make([]string, 0, len(c.addresses)) + newAddresses := make([]udpMuxedConnAddr, 0, len(c.addresses)) for _, a := range c.addresses { if a != addr { newAddresses = append(newAddresses, a) @@ -158,7 +193,7 @@ func (c *udpMuxedConn) removeAddress(addr string) { c.addresses = newAddresses } -func (c *udpMuxedConn) containsAddress(addr string) bool { +func (c *udpMuxedConn) containsAddress(addr udpMuxedConnAddr) bool { c.mu.Lock() defer c.mu.Unlock() for _, a := range c.addresses { @@ -170,77 +205,44 @@ func (c *udpMuxedConn) containsAddress(addr string) bool { } func (c *udpMuxedConn) writePacket(data []byte, addr *net.UDPAddr) error { - // Write two packets, address and data - buf := c.params.AddrPool.Get().(*bufferHolder) //nolint:forcetypeassert - defer c.params.AddrPool.Put(buf) - - // Format of buffer | data len | data bytes | addr len | addr bytes | - if len(buf.buf) < len(data)+maxAddrSize { + pkt := c.params.AddrPool.Get().(*bufferHolder) //nolint:forcetypeassert + if cap(pkt.buf) < len(data) { + c.params.AddrPool.Put(pkt) return io.ErrShortBuffer } - // Data length - binary.LittleEndian.PutUint16(buf.buf, uint16(len(data))) - offset := 2 - // Data - copy(buf.buf[offset:], data) - offset += len(data) + pkt.buf = append(pkt.buf[:0], data...) + pkt.addr = addr - // Write address first, leaving room for its length - n, err := encodeUDPAddr(addr, buf.buf[offset+2:]) - if err != nil { - return err + c.mu.Lock() + if c.state == udpMuxedConnClosed { + c.mu.Unlock() + + pkt.reset() + c.params.AddrPool.Put(pkt) + + return io.ErrClosedPipe } - total := offset + n + 2 - // Address len - binary.LittleEndian.PutUint16(buf.buf[offset:], uint16(n)) - - if _, err := c.buf.Write(buf.buf[:total]); err != nil { - return err + if c.bufHead != nil { + c.bufHead.next = pkt } + c.bufHead = pkt + + if c.bufTail == nil { + c.bufTail = pkt + } + + state := c.state + c.state = udpMuxedConnOpen + c.mu.Unlock() + + if state == udpMuxedConnWaiting { + select { + case c.notify <- struct{}{}: + default: + } + } + return nil } - -func encodeUDPAddr(addr *net.UDPAddr, buf []byte) (int, error) { - ipData, err := addr.IP.MarshalText() - if err != nil { - return 0, err - } - total := 2 + len(ipData) + 2 + len(addr.Zone) - if total > len(buf) { - return 0, io.ErrShortBuffer - } - - binary.LittleEndian.PutUint16(buf, uint16(len(ipData))) - offset := 2 - n := copy(buf[offset:], ipData) - offset += n - binary.LittleEndian.PutUint16(buf[offset:], uint16(addr.Port)) - offset += 2 - copy(buf[offset:], addr.Zone) - return total, nil -} - -func decodeUDPAddr(buf []byte) (*net.UDPAddr, error) { - addr := net.UDPAddr{} - - offset := 0 - ipLen := int(binary.LittleEndian.Uint16(buf[:2])) - offset += 2 - // Basic bounds checking - if ipLen+offset > len(buf) { - return nil, io.ErrShortBuffer - } - if err := addr.IP.UnmarshalText(buf[offset : offset+ipLen]); err != nil { - return nil, err - } - offset += ipLen - addr.Port = int(binary.LittleEndian.Uint16(buf[offset : offset+2])) - offset += 2 - zone := make([]byte, len(buf[offset:])) - copy(zone, buf[offset:]) - addr.Zone = string(zone) - - return &addr, nil -} diff --git a/vendor/github.com/pion/interceptor/.golangci.yml b/vendor/github.com/pion/interceptor/.golangci.yml index 4e3eddf42..e06de4d3c 100644 --- a/vendor/github.com/pion/interceptor/.golangci.yml +++ b/vendor/github.com/pion/interceptor/.golangci.yml @@ -3,7 +3,8 @@ linters-settings: govet: - check-shadowing: true + enable: + - shadow misspell: locale: US exhaustive: @@ -29,7 +30,6 @@ linters: - bodyclose # checks whether HTTP response body is closed successfully - contextcheck # check the function whether use a non-inherited context - decorder # check declaration order and count of types, constants, variables and functions - - depguard # Go linter that checks if package imports are in a list of acceptable packages - dogsled # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()) - dupl # Tool for code clone detection - durationcheck # check for two durations multiplied together @@ -63,7 +63,6 @@ linters: - importas # Enforces consistent import aliases - ineffassign # Detects when assignments to existing variables are not used - misspell # Finds commonly misspelled English words in comments - - nakedret # Finds naked returns in functions greater than a specified function length - nilerr # Finds the code that returns nil even if it checks that the error is not nil. - nilnil # Checks that there is no simultaneous return of `nil` error and an invalid value. - noctx # noctx finds sending http request without context.Context @@ -81,6 +80,7 @@ linters: - wastedassign # wastedassign finds wasted assignment statements - whitespace # Tool for detection of leading and trailing whitespace disable: + - depguard # Go linter that checks if package imports are in a list of acceptable packages - containedctx # containedctx is a linter that detects struct contained context.Context field - cyclop # checks function and package cyclomatic complexity - exhaustivestruct # Checks if all struct's fields are initialized @@ -94,6 +94,7 @@ linters: - maintidx # maintidx measures the maintainability index of each function. - makezero # Finds slice declarations with non-zero initial length - maligned # Tool to detect Go structs that would take less memory if their fields were sorted + - nakedret # Finds naked returns in functions greater than a specified function length - nestif # Reports deeply nested if statements - nlreturn # nlreturn checks for a new line before return and branch statements to increase code clarity - nolintlint # Reports ill-formed or insufficient nolint directives @@ -110,28 +111,15 @@ linters: issues: exclude-use-default: false + exclude-dirs-use-default: false exclude-rules: - # Allow complex tests, better to be self contained - - path: _test\.go - linters: - - gocognit - - forbidigo - - # Allow complex main function in examples - - path: examples - text: "of func `main` is high" - linters: - - gocognit - - # Allow forbidden identifiers in examples - - path: examples + # Allow complex tests and examples, better to be self contained + - path: (examples|main\.go|_test\.go) linters: - forbidigo + - gocognit # Allow forbidden identifiers in CLI commands - path: cmd linters: - forbidigo - -run: - skip-dirs-use-default: false diff --git a/vendor/github.com/pion/interceptor/AUTHORS.txt b/vendor/github.com/pion/interceptor/AUTHORS.txt deleted file mode 100644 index 44a421ef8..000000000 --- a/vendor/github.com/pion/interceptor/AUTHORS.txt +++ /dev/null @@ -1,30 +0,0 @@ -# Thank you to everyone that made Pion possible. If you are interested in contributing -# we would love to have you https://github.com/pion/webrtc/wiki/Contributing -# -# This file is auto generated, using git to list all individuals contributors. -# see https://github.com/pion/.goassets/blob/master/scripts/generate-authors.sh for the scripting -Aaron Boushley -Adam Kiss -adamroach -Aditya Kumar -aler9 <46489434+aler9@users.noreply.github.com> -Antoine Baché -Atsushi Watanabe -Bobby Peck -boks1971 -David Zhao -Jonathan Müller -Kevin Caffrey -Maksim Nesterov -Mathis Engelbart -Miroslav -Miroslav Šedivý -Quentin Renard -Rayleigh Li -Sean DuBois -Steffen Vogel -XLPolar -ziminghua <565209960@qq.com> - -# List of contributors not appearing in Git history - diff --git a/vendor/github.com/pion/interceptor/README.md b/vendor/github.com/pion/interceptor/README.md index dcc856f1e..5db5d4414 100644 --- a/vendor/github.com/pion/interceptor/README.md +++ b/vendor/github.com/pion/interceptor/README.md @@ -78,7 +78,7 @@ We are always looking to support **your projects**. Please reach out if you have If you need commercial support or don't want to use public methods you can contact us at [team@pion.ly](mailto:team@pion.ly) ### Contributing -Check out the [contributing wiki](https://github.com/pion/webrtc/wiki/Contributing) to join the group of amazing people making this project possible: [AUTHORS.txt](./AUTHORS.txt) +Check out the [contributing wiki](https://github.com/pion/webrtc/wiki/Contributing) to join the group of amazing people making this project possible ### License MIT License - see [LICENSE](LICENSE) for full text diff --git a/vendor/github.com/pion/interceptor/internal/sequencenumber/unwrapper.go b/vendor/github.com/pion/interceptor/internal/sequencenumber/unwrapper.go new file mode 100644 index 000000000..311ff09df --- /dev/null +++ b/vendor/github.com/pion/interceptor/internal/sequencenumber/unwrapper.go @@ -0,0 +1,45 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package sequencenumber provides a sequence number unwrapper +package sequencenumber + +const ( + maxSequenceNumberPlusOne = int64(65536) + breakpoint = 32768 // half of max uint16 +) + +// Unwrapper stores an unwrapped sequence number +type Unwrapper struct { + init bool + lastUnwrapped int64 +} + +func isNewer(value, previous uint16) bool { + if value-previous == breakpoint { + return value > previous + } + return value != previous && (value-previous) < breakpoint +} + +// Unwrap unwraps the next sequencenumber +func (u *Unwrapper) Unwrap(i uint16) int64 { + if !u.init { + u.init = true + u.lastUnwrapped = int64(i) + return u.lastUnwrapped + } + + lastWrapped := uint16(u.lastUnwrapped) + delta := int64(i - lastWrapped) + if isNewer(i, lastWrapped) { + if delta < 0 { + delta += maxSequenceNumberPlusOne + } + } else if delta > 0 && u.lastUnwrapped+delta-maxSequenceNumberPlusOne >= 0 { + delta -= maxSequenceNumberPlusOne + } + + u.lastUnwrapped += delta + return u.lastUnwrapped +} diff --git a/vendor/github.com/pion/interceptor/pkg/nack/generator_interceptor.go b/vendor/github.com/pion/interceptor/pkg/nack/generator_interceptor.go index faf533ba4..051e424c3 100644 --- a/vendor/github.com/pion/interceptor/pkg/nack/generator_interceptor.go +++ b/vendor/github.com/pion/interceptor/pkg/nack/generator_interceptor.go @@ -21,12 +21,14 @@ type GeneratorInterceptorFactory struct { // NewInterceptor constructs a new ReceiverInterceptor func (g *GeneratorInterceptorFactory) NewInterceptor(_ string) (interceptor.Interceptor, error) { i := &GeneratorInterceptor{ - size: 512, - skipLastN: 0, - interval: time.Millisecond * 100, - receiveLogs: map[uint32]*receiveLog{}, - close: make(chan struct{}), - log: logging.NewDefaultLoggerFactory().NewLogger("nack_generator"), + size: 512, + skipLastN: 0, + maxNacksPerPacket: 0, + interval: time.Millisecond * 100, + receiveLogs: map[uint32]*receiveLog{}, + nackCountLogs: map[uint32]map[uint16]uint16{}, + close: make(chan struct{}), + log: logging.NewDefaultLoggerFactory().NewLogger("nack_generator"), } for _, opt := range g.opts { @@ -45,13 +47,15 @@ func (g *GeneratorInterceptorFactory) NewInterceptor(_ string) (interceptor.Inte // GeneratorInterceptor interceptor generates nack feedback messages. type GeneratorInterceptor struct { interceptor.NoOp - size uint16 - skipLastN uint16 - interval time.Duration - m sync.Mutex - wg sync.WaitGroup - close chan struct{} - log logging.LeveledLogger + size uint16 + skipLastN uint16 + maxNacksPerPacket uint16 + interval time.Duration + m sync.Mutex + wg sync.WaitGroup + close chan struct{} + log logging.LeveledLogger + nackCountLogs map[uint32]map[uint16]uint16 receiveLogs map[uint32]*receiveLog receiveLogsMu sync.Mutex @@ -131,6 +135,7 @@ func (n *GeneratorInterceptor) Close() error { return nil } +// nolint:gocognit func (n *GeneratorInterceptor) loop(rtcpWriter interceptor.RTCPWriter) { defer n.wg.Done() @@ -147,14 +152,47 @@ func (n *GeneratorInterceptor) loop(rtcpWriter interceptor.RTCPWriter) { for ssrc, receiveLog := range n.receiveLogs { missing := receiveLog.missingSeqNumbers(n.skipLastN) + + if len(missing) == 0 || n.nackCountLogs[ssrc] == nil { + n.nackCountLogs[ssrc] = map[uint16]uint16{} + } if len(missing) == 0 { continue } + filteredMissing := []uint16{} + if n.maxNacksPerPacket > 0 { + for _, missingSeq := range missing { + if n.nackCountLogs[ssrc][missingSeq] < n.maxNacksPerPacket { + filteredMissing = append(filteredMissing, missingSeq) + } + n.nackCountLogs[ssrc][missingSeq]++ + } + } else { + filteredMissing = missing + } + nack := &rtcp.TransportLayerNack{ SenderSSRC: senderSSRC, MediaSSRC: ssrc, - Nacks: rtcp.NackPairsFromSequenceNumbers(missing), + Nacks: rtcp.NackPairsFromSequenceNumbers(filteredMissing), + } + + for nackSeq := range n.nackCountLogs[ssrc] { + isMissing := false + for _, missingSeq := range missing { + if missingSeq == nackSeq { + isMissing = true + break + } + } + if !isMissing { + delete(n.nackCountLogs[ssrc], nackSeq) + } + } + + if len(filteredMissing) == 0 { + continue } if _, err := rtcpWriter.Write([]rtcp.Packet{nack}, interceptor.Attributes{}); err != nil { diff --git a/vendor/github.com/pion/interceptor/pkg/nack/generator_option.go b/vendor/github.com/pion/interceptor/pkg/nack/generator_option.go index e4f46f7c9..346bc999d 100644 --- a/vendor/github.com/pion/interceptor/pkg/nack/generator_option.go +++ b/vendor/github.com/pion/interceptor/pkg/nack/generator_option.go @@ -30,6 +30,15 @@ func GeneratorSkipLastN(skipLastN uint16) GeneratorOption { } } +// GeneratorMaxNacksPerPacket sets the maximum number of NACKs sent per missing packet, e.g. if set to 2, a missing +// packet will only be NACKed at most twice. If set to 0 (default), max number of NACKs is unlimited +func GeneratorMaxNacksPerPacket(maxNacks uint16) GeneratorOption { + return func(r *GeneratorInterceptor) error { + r.maxNacksPerPacket = maxNacks + return nil + } +} + // GeneratorLog sets a logger for the interceptor func GeneratorLog(log logging.LeveledLogger) GeneratorOption { return func(r *GeneratorInterceptor) error { diff --git a/vendor/github.com/pion/interceptor/pkg/report/receiver_interceptor.go b/vendor/github.com/pion/interceptor/pkg/report/receiver_interceptor.go index c126f9abc..0afbd08f5 100644 --- a/vendor/github.com/pion/interceptor/pkg/report/receiver_interceptor.go +++ b/vendor/github.com/pion/interceptor/pkg/report/receiver_interceptor.go @@ -100,7 +100,7 @@ func (r *ReceiverInterceptor) loop(rtcpWriter interceptor.RTCPWriter) { select { case <-ticker.C: now := r.now() - r.streams.Range(func(key, value interface{}) bool { + r.streams.Range(func(_, value interface{}) bool { if stream, ok := value.(*receiverStream); !ok { r.log.Warnf("failed to cast ReceiverInterceptor stream") } else if _, err := rtcpWriter.Write([]rtcp.Packet{stream.generateReport(now)}, interceptor.Attributes{}); err != nil { @@ -142,8 +142,8 @@ func (r *ReceiverInterceptor) BindRemoteStream(info *interceptor.StreamInfo, rea }) } -// UnbindLocalStream is called when the Stream is removed. It can be used to clean up any data related to that track. -func (r *ReceiverInterceptor) UnbindLocalStream(info *interceptor.StreamInfo) { +// UnbindRemoteStream is called when the Stream is removed. It can be used to clean up any data related to that track. +func (r *ReceiverInterceptor) UnbindRemoteStream(info *interceptor.StreamInfo) { r.streams.Delete(info.SSRC) } diff --git a/vendor/github.com/pion/interceptor/pkg/report/receiver_stream.go b/vendor/github.com/pion/interceptor/pkg/report/receiver_stream.go index b899bb1b2..ebe08473d 100644 --- a/vendor/github.com/pion/interceptor/pkg/report/receiver_stream.go +++ b/vendor/github.com/pion/interceptor/pkg/report/receiver_stream.go @@ -12,6 +12,13 @@ import ( "github.com/pion/rtp" ) +const ( + // packetsPerHistoryEntry represents how many packets are in the bitmask for + // each entry in the `packets` slice in the receiver stream. Because we use + // a uint64, we can keep track of 64 packets per entry. + packetsPerHistoryEntry = 64 +) + type receiverStream struct { ssrc uint32 receiverSSRC uint32 @@ -57,10 +64,10 @@ func (stream *receiverStream) processRTP(now time.Time, pktHeader *rtp.Header) { } else { // following frames stream.setReceived(pktHeader.SequenceNumber) - diff := int32(pktHeader.SequenceNumber) - int32(stream.lastSeqnum) - if diff > 0 || diff < -0x0FFF { - // overflow - if diff < -0x0FFF { + diff := pktHeader.SequenceNumber - stream.lastSeqnum + if diff > 0 && diff < (1<<15) { + // wrap around + if pktHeader.SequenceNumber < stream.lastSeqnum { stream.seqnumCycles++ } @@ -86,18 +93,18 @@ func (stream *receiverStream) processRTP(now time.Time, pktHeader *rtp.Header) { } func (stream *receiverStream) setReceived(seq uint16) { - pos := seq % stream.size - stream.packets[pos/64] |= 1 << (pos % 64) + pos := seq % (stream.size * packetsPerHistoryEntry) + stream.packets[pos/packetsPerHistoryEntry] |= 1 << (pos % packetsPerHistoryEntry) } func (stream *receiverStream) delReceived(seq uint16) { - pos := seq % stream.size - stream.packets[pos/64] &^= 1 << (pos % 64) + pos := seq % (stream.size * packetsPerHistoryEntry) + stream.packets[pos/packetsPerHistoryEntry] &^= 1 << (pos % packetsPerHistoryEntry) } func (stream *receiverStream) getReceived(seq uint16) bool { - pos := seq % stream.size - return (stream.packets[pos/64] & (1 << (pos % 64))) != 0 + pos := seq % (stream.size * packetsPerHistoryEntry) + return (stream.packets[pos/packetsPerHistoryEntry] & (1 << (pos % packetsPerHistoryEntry))) != 0 } func (stream *receiverStream) processSenderReport(now time.Time, sr *rtcp.SenderReport) { diff --git a/vendor/github.com/pion/interceptor/pkg/report/sender_interceptor.go b/vendor/github.com/pion/interceptor/pkg/report/sender_interceptor.go index 02d1c0001..1b6f4b252 100644 --- a/vendor/github.com/pion/interceptor/pkg/report/sender_interceptor.go +++ b/vendor/github.com/pion/interceptor/pkg/report/sender_interceptor.go @@ -13,6 +13,9 @@ import ( "github.com/pion/rtp" ) +// TickerFactory is a factory to create new tickers +type TickerFactory func(d time.Duration) Ticker + // SenderInterceptorFactory is a interceptor.Factory for a SenderInterceptor type SenderInterceptorFactory struct { opts []SenderOption @@ -23,8 +26,11 @@ func (s *SenderInterceptorFactory) NewInterceptor(_ string) (interceptor.Interce i := &SenderInterceptor{ interval: 1 * time.Second, now: time.Now, - log: logging.NewDefaultLoggerFactory().NewLogger("sender_interceptor"), - close: make(chan struct{}), + newTicker: func(d time.Duration) Ticker { + return &timeTicker{time.NewTicker(d)} + }, + log: logging.NewDefaultLoggerFactory().NewLogger("sender_interceptor"), + close: make(chan struct{}), } for _, opt := range s.opts { @@ -44,13 +50,17 @@ func NewSenderInterceptor(opts ...SenderOption) (*SenderInterceptorFactory, erro // SenderInterceptor interceptor generates sender reports. type SenderInterceptor struct { interceptor.NoOp - interval time.Duration - now func() time.Time - streams sync.Map - log logging.LeveledLogger - m sync.Mutex - wg sync.WaitGroup - close chan struct{} + interval time.Duration + now func() time.Time + newTicker TickerFactory + streams sync.Map + log logging.LeveledLogger + m sync.Mutex + wg sync.WaitGroup + close chan struct{} + started chan struct{} + + useLatestPacket bool } func (s *SenderInterceptor) isClosed() bool { @@ -95,13 +105,18 @@ func (s *SenderInterceptor) BindRTCPWriter(writer interceptor.RTCPWriter) interc func (s *SenderInterceptor) loop(rtcpWriter interceptor.RTCPWriter) { defer s.wg.Done() - ticker := time.NewTicker(s.interval) + ticker := s.newTicker(s.interval) defer ticker.Stop() + if s.started != nil { + // This lets us synchronize in tests to know whether the loop has begun or not. + // It only happens if started was initialized, which should not occur in non-tests. + close(s.started) + } for { select { - case <-ticker.C: + case <-ticker.Ch(): now := s.now() - s.streams.Range(func(key, value interface{}) bool { + s.streams.Range(func(_, value interface{}) bool { if stream, ok := value.(*senderStream); !ok { s.log.Warnf("failed to cast SenderInterceptor stream") } else if _, err := rtcpWriter.Write([]rtcp.Packet{stream.generateReport(now)}, interceptor.Attributes{}); err != nil { @@ -120,7 +135,7 @@ func (s *SenderInterceptor) loop(rtcpWriter interceptor.RTCPWriter) { // BindLocalStream lets you modify any outgoing RTP packets. It is called once for per LocalStream. The returned method // will be called once per rtp packet. func (s *SenderInterceptor) BindLocalStream(info *interceptor.StreamInfo, writer interceptor.RTPWriter) interceptor.RTPWriter { - stream := newSenderStream(info.SSRC, info.ClockRate) + stream := newSenderStream(info.SSRC, info.ClockRate, s.useLatestPacket) s.streams.Store(info.SSRC, stream) return interceptor.RTPWriterFunc(func(header *rtp.Header, payload []byte, a interceptor.Attributes) (int, error) { @@ -129,3 +144,8 @@ func (s *SenderInterceptor) BindLocalStream(info *interceptor.StreamInfo, writer return writer.Write(header, payload, a) }) } + +// UnbindLocalStream is called when the Stream is removed. It can be used to clean up any data related to that track. +func (s *SenderInterceptor) UnbindLocalStream(info *interceptor.StreamInfo) { + s.streams.Delete(info.SSRC) +} diff --git a/vendor/github.com/pion/interceptor/pkg/report/sender_option.go b/vendor/github.com/pion/interceptor/pkg/report/sender_option.go index 6932e1c0a..1e489b0b3 100644 --- a/vendor/github.com/pion/interceptor/pkg/report/sender_option.go +++ b/vendor/github.com/pion/interceptor/pkg/report/sender_option.go @@ -35,3 +35,29 @@ func SenderNow(f func() time.Time) SenderOption { return nil } } + +// SenderTicker sets an alternative for the time.NewTicker function. +func SenderTicker(f TickerFactory) SenderOption { + return func(r *SenderInterceptor) error { + r.newTicker = f + return nil + } +} + +// SenderUseLatestPacket sets the interceptor to always use the latest packet, even +// if it appears to be out-of-order. +func SenderUseLatestPacket() SenderOption { + return func(r *SenderInterceptor) error { + r.useLatestPacket = true + return nil + } +} + +// enableStartTracking is used by tests to synchronize whether the loop() has begun +// and it's safe to start sending ticks to the ticker. +func enableStartTracking(startedCh chan struct{}) SenderOption { + return func(r *SenderInterceptor) error { + r.started = startedCh + return nil + } +} diff --git a/vendor/github.com/pion/interceptor/pkg/report/sender_stream.go b/vendor/github.com/pion/interceptor/pkg/report/sender_stream.go index 29d14da41..44658e246 100644 --- a/vendor/github.com/pion/interceptor/pkg/report/sender_stream.go +++ b/vendor/github.com/pion/interceptor/pkg/report/sender_stream.go @@ -17,17 +17,21 @@ type senderStream struct { clockRate float64 m sync.Mutex + useLatestPacket bool + // data from rtp packets lastRTPTimeRTP uint32 lastRTPTimeTime time.Time + lastRTPSN uint16 packetCount uint32 octetCount uint32 } -func newSenderStream(ssrc uint32, clockRate uint32) *senderStream { +func newSenderStream(ssrc uint32, clockRate uint32, useLatestPacket bool) *senderStream { return &senderStream{ - ssrc: ssrc, - clockRate: float64(clockRate), + ssrc: ssrc, + clockRate: float64(clockRate), + useLatestPacket: useLatestPacket, } } @@ -35,9 +39,13 @@ func (stream *senderStream) processRTP(now time.Time, header *rtp.Header, payloa stream.m.Lock() defer stream.m.Unlock() - // always update time to minimize errors - stream.lastRTPTimeRTP = header.Timestamp - stream.lastRTPTimeTime = now + diff := header.SequenceNumber - stream.lastRTPSN + if stream.useLatestPacket || stream.packetCount == 0 || (diff > 0 && diff < (1<<15)) { + // Told to consider every packet, or this was the first packet, or it's in-order + stream.lastRTPSN = header.SequenceNumber + stream.lastRTPTimeRTP = header.Timestamp + stream.lastRTPTimeTime = now + } stream.packetCount++ stream.octetCount += uint32(len(payload)) diff --git a/vendor/github.com/pion/interceptor/pkg/report/ticker.go b/vendor/github.com/pion/interceptor/pkg/report/ticker.go new file mode 100644 index 000000000..59a8c6c50 --- /dev/null +++ b/vendor/github.com/pion/interceptor/pkg/report/ticker.go @@ -0,0 +1,20 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package report + +import "time" + +// Ticker is an interface for *time.Ticker for use with the SenderTicker option. +type Ticker interface { + Ch() <-chan time.Time + Stop() +} + +type timeTicker struct { + *time.Ticker +} + +func (t *timeTicker) Ch() <-chan time.Time { + return t.C +} diff --git a/vendor/github.com/pion/interceptor/pkg/twcc/arrival_time_map.go b/vendor/github.com/pion/interceptor/pkg/twcc/arrival_time_map.go new file mode 100644 index 000000000..abca1ff53 --- /dev/null +++ b/vendor/github.com/pion/interceptor/pkg/twcc/arrival_time_map.go @@ -0,0 +1,192 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package twcc + +const ( + minCapacity = 128 + maxNumberOfPackets = 1 << 15 +) + +// packetArrivalTimeMap is adapted from Chrome's implementation of TWCC, and keeps track +// of the arrival times of packets. It is used by the TWCC interceptor to build feedback +// packets. +// See https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:third_party/webrtc/modules/remote_bitrate_estimator/packet_arrival_map.h;drc=b5cd13bb6d5d157a5fbe3628b2dd1c1e106203c6 +type packetArrivalTimeMap struct { + // arrivalTimes is a circular buffer, where the packet with sequence number sn is stored + // in slot sn % len(arrivalTimes) + arrivalTimes []int64 + + // The unwrapped sequence numbers for the range of valid sequence numbers in arrivalTimes. + // beginSequenceNumber is inclusive, and endSequenceNumber is exclusive. + beginSequenceNumber, endSequenceNumber int64 +} + +// AddPacket records the fact that the packet with sequence number sequenceNumber arrived +// at arrivalTime. +func (m *packetArrivalTimeMap) AddPacket(sequenceNumber int64, arrivalTime int64) { + if m.arrivalTimes == nil { + // First packet + m.reallocate(minCapacity) + m.beginSequenceNumber = sequenceNumber + m.endSequenceNumber = sequenceNumber + 1 + m.arrivalTimes[m.index(sequenceNumber)] = arrivalTime + return + } + + if sequenceNumber >= m.beginSequenceNumber && sequenceNumber < m.endSequenceNumber { + // The packet is within the buffer, no need to resize. + m.arrivalTimes[m.index(sequenceNumber)] = arrivalTime + return + } + + if sequenceNumber < m.beginSequenceNumber { + // The packet goes before the current buffer. Expand to add packet, + // but only if it fits within the maximum number of packets. + newSize := int(m.endSequenceNumber - sequenceNumber) + if newSize > maxNumberOfPackets { + // Don't expand the buffer back for this packet, as it would remove newer received + // packets. + return + } + m.adjustToSize(newSize) + m.arrivalTimes[m.index(sequenceNumber)] = arrivalTime + m.setNotReceived(sequenceNumber+1, m.beginSequenceNumber) + m.beginSequenceNumber = sequenceNumber + return + } + + // The packet goes after the buffer. + newEndSequenceNumber := sequenceNumber + 1 + + if newEndSequenceNumber >= m.endSequenceNumber+maxNumberOfPackets { + // All old packets have to be removed. + m.beginSequenceNumber = sequenceNumber + m.endSequenceNumber = newEndSequenceNumber + m.arrivalTimes[m.index(sequenceNumber)] = arrivalTime + return + } + + if m.beginSequenceNumber < newEndSequenceNumber-maxNumberOfPackets { + // Remove oldest entries. + m.beginSequenceNumber = newEndSequenceNumber - maxNumberOfPackets + } + + m.adjustToSize(int(newEndSequenceNumber - m.beginSequenceNumber)) + + // Packets can be received out of order. If this isn't the next expected packet, + // add enough placeholders to fill the gap. + m.setNotReceived(m.endSequenceNumber, sequenceNumber) + m.endSequenceNumber = newEndSequenceNumber + m.arrivalTimes[m.index(sequenceNumber)] = arrivalTime +} + +func (m *packetArrivalTimeMap) setNotReceived(startInclusive, endExclusive int64) { + for sn := startInclusive; sn < endExclusive; sn++ { + m.arrivalTimes[m.index(sn)] = -1 + } +} + +// BeginSequenceNumber returns the first valid sequence number in the map. +func (m *packetArrivalTimeMap) BeginSequenceNumber() int64 { + return m.beginSequenceNumber +} + +// EndSequenceNumber returns the first sequence number after the last valid sequence number in the map. +func (m *packetArrivalTimeMap) EndSequenceNumber() int64 { + return m.endSequenceNumber +} + +// FindNextAtOrAfter returns the sequence number and timestamp of the first received packet that has a sequence number +// greator or equal to sequenceNumber. +func (m *packetArrivalTimeMap) FindNextAtOrAfter(sequenceNumber int64) (foundSequenceNumber int64, arrivalTime int64, ok bool) { + for sequenceNumber = m.Clamp(sequenceNumber); sequenceNumber < m.endSequenceNumber; sequenceNumber++ { + if t := m.get(sequenceNumber); t >= 0 { + return sequenceNumber, t, true + } + } + return -1, -1, false +} + +// EraseTo erases all elements from the beginning of the map until sequenceNumber. +func (m *packetArrivalTimeMap) EraseTo(sequenceNumber int64) { + if sequenceNumber < m.beginSequenceNumber { + return + } + if sequenceNumber >= m.endSequenceNumber { + // Erase all. + m.beginSequenceNumber = m.endSequenceNumber + return + } + // Remove some + m.beginSequenceNumber = sequenceNumber + m.adjustToSize(int(m.endSequenceNumber - m.beginSequenceNumber)) +} + +// RemoveOldPackets removes packets from the beginning of the map as long as they are before +// sequenceNumber and with an age older than arrivalTimeLimit. +func (m *packetArrivalTimeMap) RemoveOldPackets(sequenceNumber int64, arrivalTimeLimit int64) { + checkTo := min64(sequenceNumber, m.endSequenceNumber) + for m.beginSequenceNumber < checkTo && m.get(m.beginSequenceNumber) <= arrivalTimeLimit { + m.beginSequenceNumber++ + } + m.adjustToSize(int(m.endSequenceNumber - m.beginSequenceNumber)) +} + +// HasReceived returns whether a packet with the sequence number has been received. +func (m *packetArrivalTimeMap) HasReceived(sequenceNumber int64) bool { + return m.get(sequenceNumber) >= 0 +} + +// Clamp returns sequenceNumber clamped to [beginSequenceNumber, endSequenceNumber] +func (m *packetArrivalTimeMap) Clamp(sequenceNumber int64) int64 { + if sequenceNumber < m.beginSequenceNumber { + return m.beginSequenceNumber + } + if m.endSequenceNumber < sequenceNumber { + return m.endSequenceNumber + } + return sequenceNumber +} + +func (m *packetArrivalTimeMap) get(sequenceNumber int64) int64 { + if sequenceNumber < m.beginSequenceNumber || sequenceNumber >= m.endSequenceNumber { + return -1 + } + return m.arrivalTimes[m.index(sequenceNumber)] +} + +func (m *packetArrivalTimeMap) index(sequenceNumber int64) int { + // Sequence number might be negative, and we always guarantee that arrivalTimes + // length is a power of 2, so it's easier to use "&" instead of "%" + return int(sequenceNumber & int64(m.capacity()-1)) +} + +func (m *packetArrivalTimeMap) adjustToSize(newSize int) { + if newSize > m.capacity() { + newCapacity := m.capacity() + for newCapacity < newSize { + newCapacity *= 2 + } + m.reallocate(newCapacity) + } + if m.capacity() > max(minCapacity, newSize*4) { + newCapacity := m.capacity() + for newCapacity >= 2*max(newSize, minCapacity) { + newCapacity /= 2 + } + m.reallocate(newCapacity) + } +} + +func (m *packetArrivalTimeMap) capacity() int { + return len(m.arrivalTimes) +} + +func (m *packetArrivalTimeMap) reallocate(newCapacity int) { + newBuffer := make([]int64, newCapacity) + for sn := m.beginSequenceNumber; sn < m.endSequenceNumber; sn++ { + newBuffer[int(sn&(int64(newCapacity-1)))] = m.get(sn) + } + m.arrivalTimes = newBuffer +} diff --git a/vendor/github.com/pion/interceptor/pkg/twcc/sender_interceptor.go b/vendor/github.com/pion/interceptor/pkg/twcc/sender_interceptor.go index 8706e4518..d7906fc68 100644 --- a/vendor/github.com/pion/interceptor/pkg/twcc/sender_interceptor.go +++ b/vendor/github.com/pion/interceptor/pkg/twcc/sender_interceptor.go @@ -196,7 +196,7 @@ func (s *SenderInterceptor) loop(w interceptor.RTCPWriter) { case <-ticker.C: // build and send twcc pkts := s.recorder.BuildFeedbackPacket() - if pkts == nil { + if len(pkts) == 0 { continue } if _, err := w.Write(pkts, nil); err != nil { diff --git a/vendor/github.com/pion/interceptor/pkg/twcc/twcc.go b/vendor/github.com/pion/interceptor/pkg/twcc/twcc.go index 235f1f11c..c7246f30c 100644 --- a/vendor/github.com/pion/interceptor/pkg/twcc/twcc.go +++ b/vendor/github.com/pion/interceptor/pkg/twcc/twcc.go @@ -7,94 +7,157 @@ package twcc import ( "math" + "github.com/pion/interceptor/internal/sequencenumber" "github.com/pion/rtcp" ) -type pktInfo struct { - sequenceNumber uint32 - arrivalTime int64 -} +const ( + packetWindowMicroseconds = 500_000 + maxMissingSequenceNumbers = 0x7FFE +) // Recorder records incoming RTP packets and their delays and creates // transport wide congestion control feedback reports as specified in // https://datatracker.ietf.org/doc/html/draft-holmer-rmcat-transport-wide-cc-extensions-01 type Recorder struct { - receivedPackets []pktInfo + arrivalTimeMap packetArrivalTimeMap - cycles uint32 - lastSequenceNumber uint16 + sequenceUnwrapper sequencenumber.Unwrapper + + // startSequenceNumber is the first sequence number that will be included in the the + // next feedback packet. + startSequenceNumber *int64 senderSSRC uint32 mediaSSRC uint32 fbPktCnt uint8 + + packetsHeld int } // NewRecorder creates a new Recorder which uses the given senderSSRC in the created // feedback packets. func NewRecorder(senderSSRC uint32) *Recorder { return &Recorder{ - receivedPackets: []pktInfo{}, - senderSSRC: senderSSRC, + senderSSRC: senderSSRC, } } // Record marks a packet with mediaSSRC and a transport wide sequence number sequenceNumber as received at arrivalTime. func (r *Recorder) Record(mediaSSRC uint32, sequenceNumber uint16, arrivalTime int64) { r.mediaSSRC = mediaSSRC - if sequenceNumber < 0x0fff && (r.lastSequenceNumber&0xffff) > 0xf000 { - r.cycles += 1 << 16 + + // "Unwrap" the sequence number to get a monotonically increasing sequence number that + // won't wrap around after math.MaxUint16. + unwrappedSN := r.sequenceUnwrapper.Unwrap(sequenceNumber) + r.maybeCullOldPackets(unwrappedSN, arrivalTime) + if r.startSequenceNumber == nil || unwrappedSN < *r.startSequenceNumber { + r.startSequenceNumber = &unwrappedSN + } + + // We are only interested in the first time a packet is received. + if r.arrivalTimeMap.HasReceived(unwrappedSN) { + return + } + + r.arrivalTimeMap.AddPacket(unwrappedSN, arrivalTime) + r.packetsHeld++ + + // Limit the range of sequence numbers to send feedback for. + if *r.startSequenceNumber < r.arrivalTimeMap.BeginSequenceNumber() { + sn := r.arrivalTimeMap.BeginSequenceNumber() + r.startSequenceNumber = &sn } - r.receivedPackets = insertSorted(r.receivedPackets, pktInfo{ - sequenceNumber: r.cycles | uint32(sequenceNumber), - arrivalTime: arrivalTime, - }) - r.lastSequenceNumber = sequenceNumber } -func insertSorted(list []pktInfo, element pktInfo) []pktInfo { - if len(list) == 0 { - return append(list, element) +func (r *Recorder) maybeCullOldPackets(sequenceNumber int64, arrivalTime int64) { + if r.startSequenceNumber != nil && *r.startSequenceNumber >= r.arrivalTimeMap.EndSequenceNumber() && arrivalTime >= packetWindowMicroseconds { + r.arrivalTimeMap.RemoveOldPackets(sequenceNumber, arrivalTime-packetWindowMicroseconds) } - for i := len(list) - 1; i >= 0; i-- { - if list[i].sequenceNumber < element.sequenceNumber { - list = append(list, pktInfo{}) - copy(list[i+2:], list[i+1:]) - list[i+1] = element - return list - } - if list[i].sequenceNumber == element.sequenceNumber { - list[i] = element - return list - } - } - // element.sequenceNumber is between 0 and first ever received sequenceNumber - return append([]pktInfo{element}, list...) +} + +// PacketsHeld returns the number of received packets currently held by the recorder +func (r *Recorder) PacketsHeld() int { + return r.packetsHeld } // BuildFeedbackPacket creates a new RTCP packet containing a TWCC feedback report. func (r *Recorder) BuildFeedbackPacket() []rtcp.Packet { - if len(r.receivedPackets) < 2 { + if r.startSequenceNumber == nil { return nil } - feedback := newFeedback(r.senderSSRC, r.mediaSSRC, r.fbPktCnt) - r.fbPktCnt++ - feedback.setBase(uint16(r.receivedPackets[0].sequenceNumber&0xffff), r.receivedPackets[0].arrivalTime) - - var pkts []rtcp.Packet - for _, pkt := range r.receivedPackets { - ok := feedback.addReceived(uint16(pkt.sequenceNumber&0xffff), pkt.arrivalTime) - if !ok { - pkts = append(pkts, feedback.getRTCP()) - feedback = newFeedback(r.senderSSRC, r.mediaSSRC, r.fbPktCnt) - r.fbPktCnt++ - feedback.addReceived(uint16(pkt.sequenceNumber&0xffff), pkt.arrivalTime) + endSN := r.arrivalTimeMap.EndSequenceNumber() + var feedbacks []rtcp.Packet + for *r.startSequenceNumber < endSN { + feedback := r.maybeBuildFeedbackPacket(*r.startSequenceNumber, endSN) + if feedback == nil { + break } - } - r.receivedPackets = []pktInfo{} - pkts = append(pkts, feedback.getRTCP()) + feedbacks = append(feedbacks, feedback.getRTCP()) - return pkts + // NOTE: we don't erase packets from the history in case they need to be resent + // after a reordering. They will be removed instead in Record when they get too + // old. + } + r.packetsHeld = 0 + return feedbacks +} + +// maybeBuildFeedbackPacket builds a feedback packet starting from startSN (inclusive) until +// endSN (exclusive). +func (r *Recorder) maybeBuildFeedbackPacket(beginSeqNumInclusive, endSeqNumExclusive int64) *feedback { + // NOTE: The logic of this method is inspired by the implementation in Chrome. + // See https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:third_party/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy.cc;l=276;drc=b5cd13bb6d5d157a5fbe3628b2dd1c1e106203c6 + startSNInclusive, endSNExclusive := r.arrivalTimeMap.Clamp(beginSeqNumInclusive), r.arrivalTimeMap.Clamp(endSeqNumExclusive) + + // Create feedback on demand, as we don't yet know if there are packets in the range that have been + // received. + var fb *feedback + + nextSequenceNumber := beginSeqNumInclusive + + for seq := startSNInclusive; seq < endSNExclusive; seq++ { + foundSeq, arrivalTime, ok := r.arrivalTimeMap.FindNextAtOrAfter(seq) + seq = foundSeq + if !ok || seq >= endSNExclusive { + break + } + + if fb == nil { + fb = newFeedback(r.senderSSRC, r.mediaSSRC, r.fbPktCnt) + r.fbPktCnt++ + + // It should be possible to add seq to this new packet. + // If the difference between seq and beginSeqNumInclusive is too large, discard + // reporting too old missing packets. + baseSequenceNumber := max64(beginSeqNumInclusive, seq-maxMissingSequenceNumbers) + + // baseSequenceNumber is the expected first sequence number. This is known, + // but we may not have actually received it, so the base time should be the time + // of the first received packet in the feedback. + fb.setBase(uint16(baseSequenceNumber), arrivalTime) + + if !fb.addReceived(uint16(seq), arrivalTime) { + // Could not add a single received packet to the feedback. + // This is unexpected to actually occur, but if it does, we'll + // try again after skipping any missing packets. + // NOTE: It's fine that we already incremented fbPktCnt, as in essence + // we did actually "skip" a feedback (and this matches Chrome's behavior). + r.startSequenceNumber = &seq + return nil + } + } else if !fb.addReceived(uint16(seq), arrivalTime) { + // Could not add timestamp. Packet may be full. Return + // and try again with a fresh packet. + break + } + + nextSequenceNumber = seq + 1 + } + + r.startSequenceNumber = &nextSequenceNumber + return fb } type feedback struct { @@ -154,10 +217,16 @@ func (f *feedback) getRTCP() *rtcp.TransportLayerCC { func (f *feedback) addReceived(sequenceNumber uint16, timestampUS int64) bool { deltaUS := timestampUS - f.lastTimestampUS - delta250US := deltaUS / 250 + var delta250US int64 + if deltaUS >= 0 { + delta250US = (deltaUS + rtcp.TypeTCCDeltaScaleFactor/2) / rtcp.TypeTCCDeltaScaleFactor + } else { + delta250US = (deltaUS - rtcp.TypeTCCDeltaScaleFactor/2) / rtcp.TypeTCCDeltaScaleFactor + } if delta250US < math.MinInt16 || delta250US > math.MaxInt16 { // delta doesn't fit into 16 bit, need to create new packet return false } + deltaUSRounded := delta250US * rtcp.TypeTCCDeltaScaleFactor for ; f.nextSequenceNumber != sequenceNumber; f.nextSequenceNumber++ { if !f.lastChunk.canAdd(rtcp.TypeTCCPacketNotReceived) { @@ -183,9 +252,9 @@ func (f *feedback) addReceived(sequenceNumber uint16, timestampUS int64) bool { f.lastChunk.add(recvDelta) f.deltas = append(f.deltas, &rtcp.RecvDelta{ Type: recvDelta, - Delta: deltaUS, + Delta: deltaUSRounded, }) - f.lastTimestampUS = timestampUS + f.lastTimestampUS += deltaUSRounded f.sequenceNumberCount++ f.nextSequenceNumber++ return true @@ -268,9 +337,30 @@ func (c *chunk) reset() { c.hasDifferentTypes = false } +func max(a, b int) int { + if a > b { + return a + } + return b +} + func min(a, b int) int { if a < b { return a } return b } + +func max64(a, b int64) int64 { + if a > b { + return a + } + return b +} + +func min64(a, b int64) int64 { + if a < b { + return a + } + return b +} diff --git a/vendor/github.com/pion/mdns/.gitignore b/vendor/github.com/pion/mdns/.gitignore index f977e7485..6e2f206a9 100644 --- a/vendor/github.com/pion/mdns/.gitignore +++ b/vendor/github.com/pion/mdns/.gitignore @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + ### JetBrains IDE ### ##################### .idea/ diff --git a/vendor/github.com/pion/mdns/.golangci.yml b/vendor/github.com/pion/mdns/.golangci.yml index 48696f16b..6dd80c805 100644 --- a/vendor/github.com/pion/mdns/.golangci.yml +++ b/vendor/github.com/pion/mdns/.golangci.yml @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + linters-settings: govet: check-shadowing: true @@ -10,7 +13,14 @@ linters-settings: modules: - github.com/pkg/errors: recommendations: - - errors + - errors + forbidigo: + forbid: + - ^fmt.Print(f|ln)?$ + - ^log.(Panic|Fatal|Print)(f|ln)?$ + - ^os.Exit$ + - ^panic$ + - ^print(ln)?$ linters: enable: @@ -19,7 +29,6 @@ linters: - bodyclose # checks whether HTTP response body is closed successfully - contextcheck # check the function whether use a non-inherited context - decorder # check declaration order and count of types, constants, variables and functions - - depguard # Go linter that checks if package imports are in a list of acceptable packages - dogsled # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()) - dupl # Tool for code clone detection - durationcheck # check for two durations multiplied together @@ -29,6 +38,7 @@ linters: - errorlint # errorlint is a linter for that can be used to find code that will cause problems with the error wrapping scheme introduced in Go 1.13. - exhaustive # check exhaustiveness of enum switch statements - exportloopref # checks for pointers to enclosing loop variables + - forbidigo # Forbids identifiers - forcetypeassert # finds forced type assertions - gci # Gci control golang package import order and make it always deterministic. - gochecknoglobals # Checks that no globals are present in Go code @@ -52,7 +62,6 @@ linters: - importas # Enforces consistent import aliases - ineffassign # Detects when assignments to existing variables are not used - misspell # Finds commonly misspelled English words in comments - - nakedret # Finds naked returns in functions greater than a specified function length - nilerr # Finds the code that returns nil even if it checks that the error is not nil. - nilnil # Checks that there is no simultaneous return of `nil` error and an invalid value. - noctx # noctx finds sending http request without context.Context @@ -70,10 +79,10 @@ linters: - wastedassign # wastedassign finds wasted assignment statements - whitespace # Tool for detection of leading and trailing whitespace disable: + - depguard # Go linter that checks if package imports are in a list of acceptable packages - containedctx # containedctx is a linter that detects struct contained context.Context field - cyclop # checks function and package cyclomatic complexity - exhaustivestruct # Checks if all struct's fields are initialized - - forbidigo # Forbids identifiers - funlen # Tool for detection of long functions - gocyclo # Computes and checks the cyclomatic complexity of functions - godot # Check if comments end in a period @@ -84,6 +93,7 @@ linters: - maintidx # maintidx measures the maintainability index of each function. - makezero # Finds slice declarations with non-zero initial length - maligned # Tool to detect Go structs that would take less memory if their fields were sorted + - nakedret # Finds naked returns in functions greater than a specified function length - nestif # Reports deeply nested if statements - nlreturn # nlreturn checks for a new line before return and branch statements to increase code clarity - nolintlint # Reports ill-formed or insufficient nolint directives @@ -101,16 +111,16 @@ linters: issues: exclude-use-default: false exclude-rules: - # Allow complex tests, better to be self contained - - path: _test\.go + # Allow complex tests and examples, better to be self contained + - path: (examples|main\.go|_test\.go) linters: + - forbidigo - gocognit - # Allow complex main function in examples - - path: examples - text: "of func `main` is high" + # Allow forbidden identifiers in CLI commands + - path: cmd linters: - - gocognit + - forbidigo run: skip-dirs-use-default: false diff --git a/vendor/github.com/pion/mdns/.goreleaser.yml b/vendor/github.com/pion/mdns/.goreleaser.yml index 2caa5fbd3..30093e9d6 100644 --- a/vendor/github.com/pion/mdns/.goreleaser.yml +++ b/vendor/github.com/pion/mdns/.goreleaser.yml @@ -1,2 +1,5 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + builds: - skip: true diff --git a/vendor/github.com/pion/mdns/AUTHORS.txt b/vendor/github.com/pion/mdns/AUTHORS.txt deleted file mode 100644 index 48ceb8211..000000000 --- a/vendor/github.com/pion/mdns/AUTHORS.txt +++ /dev/null @@ -1,17 +0,0 @@ -# Thank you to everyone that made Pion possible. If you are interested in contributing -# we would love to have you https://github.com/pion/webrtc/wiki/Contributing -# -# This file is auto generated, using git to list all individuals contributors. -# see https://github.com/pion/.goassets/blob/master/scripts/generate-authors.sh for the scripting -Atsushi Watanabe -Bjørn Remseth -Doug Cone -Hugo Arregui -Javier Peletier -Jonas van den Berg <24623262+vonas@users.noreply.github.com> -Konstantin Itskov -Sean DuBois -Sean DuBois - -# List of contributors not appearing in Git history - diff --git a/vendor/github.com/pion/mdns/README.md b/vendor/github.com/pion/mdns/README.md index b2d7d9c73..70b488188 100644 --- a/vendor/github.com/pion/mdns/README.md +++ b/vendor/github.com/pion/mdns/README.md @@ -8,8 +8,8 @@ Pion mDNS Slack Widget
- Build Status - GoDoc + GitHub Workflow Status + Go Reference Coverage Status Go Report Card License: MIT @@ -24,6 +24,12 @@ For a mDNS server that responds to queries for `pion-test.local` go run examples/server/main.go ``` +For a mDNS server that responds to queries for `pion-test.local` with a given address +```sh +go run examples/server/publish_ip/main.go -ip=[IP] +``` +If you don't set the `ip` parameter, "1.2.3.4" will be used instead. + ### Running Client To query using Pion you can run the `query` example @@ -41,19 +47,26 @@ Or the avahi client avahi-resolve -a pion-test.local ``` -### References -https://tools.ietf.org/html/rfc6762 -https://tools.ietf.org/id/draft-ietf-rtcweb-mdns-ice-candidates-02.html +### RFCs +#### Implemented +- **RFC 6762** [Multicast DNS][rfc6762] +- **draft-ietf-rtcweb-mdns-ice-candidates-02** [Using Multicast DNS to protect privacy when exposing ICE candidates](https://datatracker.ietf.org/doc/html/draft-ietf-rtcweb-mdns-ice-candidates-02.html) + +[rfc6762]: https://tools.ietf.org/html/rfc6762 + +### Roadmap +The library is used as a part of our WebRTC implementation. Please refer to that [roadmap](https://github.com/pion/webrtc/issues/9) to track our major milestones. ### Community -Pion has an active community on the [Golang Slack](https://invite.slack.golangbridge.org/). Sign up and join the **#pion** channel for discussions and support. You can also use [Pion mailing list](https://groups.google.com/forum/#!forum/pion). +Pion has an active community on the [Slack](https://pion.ly/slack). + +Follow the [Pion Twitter](https://twitter.com/_pion) for project updates and important WebRTC news. We are always looking to support **your projects**. Please reach out if you have something to build! - If you need commercial support or don't want to use public methods you can contact us at [team@pion.ly](mailto:team@pion.ly) ### Contributing -Check out the **[contributing wiki](https://github.com/pion/webrtc/wiki/Contributing)** to join the group of amazing people making this project possible: +Check out the [contributing wiki](https://github.com/pion/webrtc/wiki/Contributing) to join the group of amazing people making this project possible ### License -MIT License - see [LICENSE](LICENSE) for full text +MIT License - see [LICENSE](LICENSE) for full text \ No newline at end of file diff --git a/vendor/github.com/pion/mdns/codecov.yml b/vendor/github.com/pion/mdns/codecov.yml index 085200a48..263e4d45c 100644 --- a/vendor/github.com/pion/mdns/codecov.yml +++ b/vendor/github.com/pion/mdns/codecov.yml @@ -3,6 +3,8 @@ # # It is automatically copied from https://github.com/pion/.goassets repository. # +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT coverage: status: diff --git a/vendor/github.com/pion/mdns/config.go b/vendor/github.com/pion/mdns/config.go index e028046e7..34fc8fe7c 100644 --- a/vendor/github.com/pion/mdns/config.go +++ b/vendor/github.com/pion/mdns/config.go @@ -1,6 +1,10 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package mdns import ( + "net" "time" "github.com/pion/logging" @@ -23,5 +27,15 @@ type Config struct { // when we get questions LocalNames []string + // LocalAddress will override the published address with the given IP + // when set. Otherwise, the automatically determined address will be used. + LocalAddress net.IP + LoggerFactory logging.LoggerFactory + + // IncludeLoopback will include loopback interfaces to be eligble for queries and answers. + IncludeLoopback bool + + // Interfaces will override the interfaces used for queries and answers. + Interfaces []net.Interface } diff --git a/vendor/github.com/pion/mdns/conn.go b/vendor/github.com/pion/mdns/conn.go index 31037e252..1f146072b 100644 --- a/vendor/github.com/pion/mdns/conn.go +++ b/vendor/github.com/pion/mdns/conn.go @@ -1,11 +1,13 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package mdns import ( "context" "errors" - "math/big" + "fmt" "net" - "runtime" "sync" "time" @@ -24,7 +26,7 @@ type Conn struct { queryInterval time.Duration localNames []string - queries []query + queries []*query ifaces []net.Interface closed chan interface{} @@ -45,26 +47,42 @@ const ( destinationAddress = "224.0.0.251:5353" maxMessageRecords = 3 responseTTL = 120 + // maxPacketSize is the maximum size of a mdns packet. + // From RFC 6762: + // Even when fragmentation is used, a Multicast DNS packet, including IP + // and UDP headers, MUST NOT exceed 9000 bytes. + // https://datatracker.ietf.org/doc/html/rfc6762#section-17 + maxPacketSize = 9000 ) var errNoPositiveMTUFound = errors.New("no positive MTU found") -// Server establishes a mDNS connection over an existing conn +// Server establishes a mDNS connection over an existing conn. +// +// Currently, the server only supports listening on an IPv4 connection, but internally +// it supports answering with IPv6 AAAA records if this were ever to change. func Server(conn *ipv4.PacketConn, config *Config) (*Conn, error) { if config == nil { return nil, errNilConfig } - ifaces, err := net.Interfaces() - if err != nil { - return nil, err + ifaces := config.Interfaces + if ifaces == nil { + var err error + ifaces, err = net.Interfaces() + if err != nil { + return nil, err + } } inboundBufferSize := 0 joinErrCount := 0 ifacesToUse := make([]net.Interface, 0, len(ifaces)) for i, ifc := range ifaces { - if err = conn.JoinGroup(&ifaces[i], &net.UDPAddr{IP: net.IPv4(224, 0, 0, 251)}); err != nil { + if !config.IncludeLoopback && ifc.Flags&net.FlagLoopback == net.FlagLoopback { + continue + } + if err := conn.JoinGroup(&ifaces[i], &net.UDPAddr{IP: net.IPv4(224, 0, 0, 251)}); err != nil { joinErrCount++ continue } @@ -79,6 +97,9 @@ func Server(conn *ipv4.PacketConn, config *Config) (*Conn, error) { if inboundBufferSize == 0 { return nil, errNoPositiveMTUFound } + if inboundBufferSize > maxPacketSize { + inboundBufferSize = maxPacketSize + } if joinErrCount >= len(ifaces) { return nil, errJoiningMulticastGroup } @@ -100,7 +121,7 @@ func Server(conn *ipv4.PacketConn, config *Config) (*Conn, error) { c := &Conn{ queryInterval: defaultQueryInterval, - queries: []query{}, + queries: []*query{}, socket: conn, dstAddr: dstAddr, localNames: localNames, @@ -112,11 +133,23 @@ func Server(conn *ipv4.PacketConn, config *Config) (*Conn, error) { c.queryInterval = config.QueryInterval } + if err := conn.SetControlMessage(ipv4.FlagInterface, true); err != nil { + c.log.Warnf("Failed to SetControlMessage on PacketConn %v", err) + } + + if config.IncludeLoopback { + // this is an efficient way for us to send ourselves a message faster instead of it going + // further out into the network stack. + if err := conn.SetMulticastLoopback(true); err != nil { + c.log.Warnf("Failed to SetMulticastLoopback(true) on PacketConn %v; this may cause inefficient network path communications", err) + } + } + // https://www.rfc-editor.org/rfc/rfc6762.html#section-17 // Multicast DNS messages carried by UDP may be up to the IP MTU of the // physical interface, less the space required for the IP header (20 // bytes for IPv4; 40 bytes for IPv6) and the UDP header (8 bytes). - go c.start(inboundBufferSize - 20 - 8) + go c.start(inboundBufferSize-20-8, config) return c, nil } @@ -148,11 +181,22 @@ func (c *Conn) Query(ctx context.Context, name string) (dnsmessage.ResourceHeade nameWithSuffix := name + "." queryChan := make(chan queryResult, 1) + query := &query{nameWithSuffix, queryChan} c.mu.Lock() - c.queries = append(c.queries, query{nameWithSuffix, queryChan}) - ticker := time.NewTicker(c.queryInterval) + c.queries = append(c.queries, query) c.mu.Unlock() + defer func() { + c.mu.Lock() + defer c.mu.Unlock() + for i := len(c.queries) - 1; i >= 0; i-- { + if c.queries[i] == query { + c.queries = append(c.queries[:i], c.queries[i+1:]...) + } + } + }() + + ticker := time.NewTicker(c.queryInterval) defer ticker.Stop() c.sendQuestion(nameWithSuffix) @@ -163,6 +207,11 @@ func (c *Conn) Query(ctx context.Context, name string) (dnsmessage.ResourceHeade case <-c.closed: return dnsmessage.ResourceHeader{}, nil, errConnectionClosed case res := <-queryChan: + // Given https://datatracker.ietf.org/doc/html/draft-ietf-mmusic-mdns-ice-candidates#section-3.2.2-2 + // An ICE agent SHOULD ignore candidates where the hostname resolution returns more than one IP address. + // + // We will take the first we receive which could result in a race between two suitable addresses where + // one is better than the other (e.g. localhost vs LAN). return res.answer, res.addr, nil case <-ctx.Done(): return dnsmessage.ResourceHeader{}, nil, errContextElapsed @@ -170,16 +219,37 @@ func (c *Conn) Query(ctx context.Context, name string) (dnsmessage.ResourceHeade } } -func ipToBytes(ip net.IP) (out [4]byte) { +type ipToBytesError struct { + ip net.IP + expectedType string +} + +func (err ipToBytesError) Error() string { + return fmt.Sprintf("ip (%s) is not %s", err.ip, err.expectedType) +} + +func ipv4ToBytes(ip net.IP) ([4]byte, error) { rawIP := ip.To4() if rawIP == nil { - return + return [4]byte{}, ipToBytesError{ip, "IPv4"} } - ipInt := big.NewInt(0) - ipInt.SetBytes(rawIP) - copy(out[:], ipInt.Bytes()) - return + // net.IPs are stored in big endian / network byte order + var out [4]byte + copy(out[:], rawIP[:]) + return out, nil +} + +func ipv6ToBytes(ip net.IP) ([16]byte, error) { + rawIP := ip.To16() + if rawIP == nil { + return [16]byte{}, ipToBytesError{ip, "IPv6"} + } + + // net.IPs are stored in big endian / network byte order + var out [16]byte + copy(out[:], rawIP[:]) + return out, nil } func interfaceForRemote(remote string) (net.IP, error) { @@ -224,32 +294,49 @@ func (c *Conn) sendQuestion(name string) { return } - c.writeToSocket(rawQuery) + c.writeToSocket(0, rawQuery, false) } -const isWindows = runtime.GOOS == "windows" - -func (c *Conn) writeToSocket(b []byte) { - var wcm ipv4.ControlMessage - for i := range c.ifaces { - if isWindows { - if err := c.socket.SetMulticastInterface(&c.ifaces[i]); err != nil { - c.log.Warnf("Failed to set multicast interface for %d: %v", i, err) - } - } else { - wcm.IfIndex = c.ifaces[i].Index +func (c *Conn) writeToSocket(ifIndex int, b []byte, srcIfcIsLoopback bool) { + if ifIndex != 0 { + ifc, err := net.InterfaceByIndex(ifIndex) + if err != nil { + c.log.Warnf("Failed to get interface for %d: %v", ifIndex, err) + return } - if _, err := c.socket.WriteTo(b, &wcm, c.dstAddr); err != nil { - c.log.Warnf("Failed to send mDNS packet on interface %d: %v", i, err) + if srcIfcIsLoopback && ifc.Flags&net.FlagLoopback == 0 { + // avoid accidentally tricking the destination that itself is the same as us + c.log.Warnf("Interface is not loopback %d", ifIndex) + return + } + if err := c.socket.SetMulticastInterface(ifc); err != nil { + c.log.Warnf("Failed to set multicast interface for %d: %v", ifIndex, err) + } else { + if _, err := c.socket.WriteTo(b, nil, c.dstAddr); err != nil { + c.log.Warnf("Failed to send mDNS packet on interface %d: %v", ifIndex, err) + } + } + return + } + for ifcIdx := range c.ifaces { + if srcIfcIsLoopback && c.ifaces[ifcIdx].Flags&net.FlagLoopback == 0 { + // avoid accidentally tricking the destination that itself is the same as us + continue + } + if err := c.socket.SetMulticastInterface(&c.ifaces[ifcIdx]); err != nil { + c.log.Warnf("Failed to set multicast interface for %d: %v", c.ifaces[ifcIdx].Index, err) + } else { + if _, err := c.socket.WriteTo(b, nil, c.dstAddr); err != nil { + c.log.Warnf("Failed to send mDNS packet on interface %d: %v", c.ifaces[ifcIdx].Index, err) + } } } } -func (c *Conn) sendAnswer(name string, dst net.IP) { +func createAnswer(name string, addr net.IP) (dnsmessage.Message, error) { packedName, err := dnsmessage.NewName(name) if err != nil { - c.log.Warnf("Failed to construct mDNS packet %v", err) - return + return dnsmessage.Message{}, err } msg := dnsmessage.Message{ @@ -265,23 +352,48 @@ func (c *Conn) sendAnswer(name string, dst net.IP) { Name: packedName, TTL: responseTTL, }, - Body: &dnsmessage.AResource{ - A: ipToBytes(dst), - }, }, }, } - rawAnswer, err := msg.Pack() + if ip4 := addr.To4(); ip4 != nil { + ipBuf, err := ipv4ToBytes(addr) + if err != nil { + return dnsmessage.Message{}, err + } + msg.Answers[0].Body = &dnsmessage.AResource{ + A: ipBuf, + } + } else { + ipBuf, err := ipv6ToBytes(addr) + if err != nil { + return dnsmessage.Message{}, err + } + msg.Answers[0].Body = &dnsmessage.AAAAResource{ + AAAA: ipBuf, + } + } + + return msg, nil +} + +func (c *Conn) sendAnswer(name string, ifIndex int, addr net.IP) { + answer, err := createAnswer(name, addr) + if err != nil { + c.log.Warnf("Failed to create mDNS answer %v", err) + return + } + + rawAnswer, err := answer.Pack() if err != nil { c.log.Warnf("Failed to construct mDNS packet %v", err) return } - c.writeToSocket(rawAnswer) + c.writeToSocket(ifIndex, rawAnswer, addr.IsLoopback()) } -func (c *Conn) start(inboundBufferSize int) { //nolint gocognit +func (c *Conn) start(inboundBufferSize int, config *Config) { //nolint gocognit defer func() { c.mu.Lock() defer c.mu.Unlock() @@ -292,7 +404,7 @@ func (c *Conn) start(inboundBufferSize int) { //nolint gocognit p := dnsmessage.Parser{} for { - n, _, src, err := c.socket.ReadFrom(b) + n, cm, src, err := c.socket.ReadFrom(b) if err != nil { if errors.Is(err, net.ErrClosed) { return @@ -300,6 +412,21 @@ func (c *Conn) start(inboundBufferSize int) { //nolint gocognit c.log.Warnf("Failed to ReadFrom %q %v", src, err) continue } + var ifIndex int + if cm != nil { + ifIndex = cm.IfIndex + } + var srcIP net.IP + switch addr := src.(type) { + case *net.UDPAddr: + srcIP = addr.IP + case *net.TCPAddr: + srcIP = addr.IP + default: + c.log.Warnf("Failed to determine address type %T for source address %s", src, src) + continue + } + srcIsIPv4 := srcIP.To4() != nil func() { c.mu.RLock() @@ -321,13 +448,77 @@ func (c *Conn) start(inboundBufferSize int) { //nolint gocognit for _, localName := range c.localNames { if localName == q.Name.String() { - localAddress, err := interfaceForRemote(src.String()) - if err != nil { - c.log.Warnf("Failed to get local interface to communicate with %s: %v", src.String(), err) - continue - } + if config.LocalAddress != nil { + c.sendAnswer(q.Name.String(), ifIndex, config.LocalAddress) + } else { + var localAddress net.IP - c.sendAnswer(q.Name.String(), localAddress) + // prefer the address of the interface if we know its index, but otherwise + // derive it from the address we read from. We do this because even if + // multicast loopback is in use or we send from a loopback interface, + // there are still cases where the IP packet will contain the wrong + // source IP (e.g. a LAN interface). + // For example, we can have a packet that has: + // Source: 192.168.65.3 + // Destination: 224.0.0.251 + // Interface Index: 1 + // Interface Addresses @ 1: [127.0.0.1/8 ::1/128] + if ifIndex != 0 { + ifc, netErr := net.InterfaceByIndex(ifIndex) + if netErr != nil { + c.log.Warnf("Failed to get interface for %d: %v", ifIndex, netErr) + continue + } + addrs, addrsErr := ifc.Addrs() + if addrsErr != nil { + c.log.Warnf("Failed to get addresses for interface %d: %v", ifIndex, addrsErr) + continue + } + if len(addrs) == 0 { + c.log.Warnf("Expected more than one address for interface %d", ifIndex) + continue + } + var selectedIP net.IP + for _, addr := range addrs { + var ip net.IP + switch addr := addr.(type) { + case *net.IPNet: + ip = addr.IP + case *net.IPAddr: + ip = addr.IP + default: + c.log.Warnf("Failed to determine address type %T from interface %d", addr, ifIndex) + continue + } + + // match up respective IP types + if ipv4 := ip.To4(); ipv4 == nil { + if srcIsIPv4 { + continue + } else if !isSupportedIPv6(ip) { + continue + } + } else if !srcIsIPv4 { + continue + } + selectedIP = ip + break + } + if selectedIP == nil { + c.log.Warnf("Failed to find suitable IP for interface %d; deriving address from source address instead", ifIndex) + } else { + localAddress = selectedIP + } + } else if ifIndex == 0 || localAddress == nil { + localAddress, err = interfaceForRemote(src.String()) + if err != nil { + c.log.Warnf("Failed to get local interface to communicate with %s: %v", src.String(), err) + continue + } + } + + c.sendAnswer(q.Name.String(), ifIndex, localAddress) + } } } } @@ -371,7 +562,7 @@ func ipFromAnswerHeader(a dnsmessage.ResourceHeader, p dnsmessage.Parser) (ip [] if err != nil { return nil, err } - ip = net.IP(resource.A[:]) + ip = resource.A[:] } else { resource, err := p.AAAAResource() if err != nil { @@ -382,3 +573,25 @@ func ipFromAnswerHeader(a dnsmessage.ResourceHeader, p dnsmessage.Parser) (ip [] return } + +// The conditions of invalidation written below are defined in +// https://tools.ietf.org/html/rfc8445#section-5.1.1.1 +func isSupportedIPv6(ip net.IP) bool { + if len(ip) != net.IPv6len || + isZeros(ip[0:12]) || // !(IPv4-compatible IPv6) + ip[0] == 0xfe && ip[1]&0xc0 == 0xc0 || // !(IPv6 site-local unicast) + ip.IsLinkLocalUnicast() || + ip.IsLinkLocalMulticast() { + return false + } + return true +} + +func isZeros(ip net.IP) bool { + for i := 0; i < len(ip); i++ { + if ip[i] != 0 { + return false + } + } + return true +} diff --git a/vendor/github.com/pion/mdns/errors.go b/vendor/github.com/pion/mdns/errors.go index 0a1b61240..f065e165f 100644 --- a/vendor/github.com/pion/mdns/errors.go +++ b/vendor/github.com/pion/mdns/errors.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package mdns import "errors" diff --git a/vendor/github.com/pion/mdns/mdns.go b/vendor/github.com/pion/mdns/mdns.go index 853ae833e..a76b16b65 100644 --- a/vendor/github.com/pion/mdns/mdns.go +++ b/vendor/github.com/pion/mdns/mdns.go @@ -1,2 +1,5 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + // Package mdns implements mDNS (multicast DNS) package mdns diff --git a/vendor/github.com/pion/rtcp/.gitignore b/vendor/github.com/pion/rtcp/.gitignore index f977e7485..6e2f206a9 100644 --- a/vendor/github.com/pion/rtcp/.gitignore +++ b/vendor/github.com/pion/rtcp/.gitignore @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + ### JetBrains IDE ### ##################### .idea/ diff --git a/vendor/github.com/pion/rtcp/.golangci.yml b/vendor/github.com/pion/rtcp/.golangci.yml index d7a88eca3..6dd80c805 100644 --- a/vendor/github.com/pion/rtcp/.golangci.yml +++ b/vendor/github.com/pion/rtcp/.golangci.yml @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + linters-settings: govet: check-shadowing: true @@ -10,7 +13,14 @@ linters-settings: modules: - github.com/pkg/errors: recommendations: - - errors + - errors + forbidigo: + forbid: + - ^fmt.Print(f|ln)?$ + - ^log.(Panic|Fatal|Print)(f|ln)?$ + - ^os.Exit$ + - ^panic$ + - ^print(ln)?$ linters: enable: @@ -18,9 +28,7 @@ linters: - bidichk # Checks for dangerous unicode character sequences - bodyclose # checks whether HTTP response body is closed successfully - contextcheck # check the function whether use a non-inherited context - - deadcode # Finds unused code - decorder # check declaration order and count of types, constants, variables and functions - - depguard # Go linter that checks if package imports are in a list of acceptable packages - dogsled # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()) - dupl # Tool for code clone detection - durationcheck # check for two durations multiplied together @@ -30,6 +38,7 @@ linters: - errorlint # errorlint is a linter for that can be used to find code that will cause problems with the error wrapping scheme introduced in Go 1.13. - exhaustive # check exhaustiveness of enum switch statements - exportloopref # checks for pointers to enclosing loop variables + - forbidigo # Forbids identifiers - forcetypeassert # finds forced type assertions - gci # Gci control golang package import order and make it always deterministic. - gochecknoglobals # Checks that no globals are present in Go code @@ -53,14 +62,12 @@ linters: - importas # Enforces consistent import aliases - ineffassign # Detects when assignments to existing variables are not used - misspell # Finds commonly misspelled English words in comments - - nakedret # Finds naked returns in functions greater than a specified function length - nilerr # Finds the code that returns nil even if it checks that the error is not nil. - nilnil # Checks that there is no simultaneous return of `nil` error and an invalid value. - noctx # noctx finds sending http request without context.Context - predeclared # find code that shadows one of Go's predeclared identifiers - revive # golint replacement, finds style mistakes - staticcheck # Staticcheck is a go vet on steroids, applying a ton of static analysis checks - - structcheck # Finds unused struct fields - stylecheck # Stylecheck is a replacement for golint - tagliatelle # Checks the struct tags. - tenv # tenv is analyzer that detects using os.Setenv instead of t.Setenv since Go1.17 @@ -69,14 +76,13 @@ linters: - unconvert # Remove unnecessary type conversions - unparam # Reports unused function parameters - unused # Checks Go code for unused constants, variables, functions and types - - varcheck # Finds unused global variables and constants - wastedassign # wastedassign finds wasted assignment statements - whitespace # Tool for detection of leading and trailing whitespace disable: + - depguard # Go linter that checks if package imports are in a list of acceptable packages - containedctx # containedctx is a linter that detects struct contained context.Context field - cyclop # checks function and package cyclomatic complexity - exhaustivestruct # Checks if all struct's fields are initialized - - forbidigo # Forbids identifiers - funlen # Tool for detection of long functions - gocyclo # Computes and checks the cyclomatic complexity of functions - godot # Check if comments end in a period @@ -87,6 +93,7 @@ linters: - maintidx # maintidx measures the maintainability index of each function. - makezero # Finds slice declarations with non-zero initial length - maligned # Tool to detect Go structs that would take less memory if their fields were sorted + - nakedret # Finds naked returns in functions greater than a specified function length - nestif # Reports deeply nested if statements - nlreturn # nlreturn checks for a new line before return and branch statements to increase code clarity - nolintlint # Reports ill-formed or insufficient nolint directives @@ -104,16 +111,16 @@ linters: issues: exclude-use-default: false exclude-rules: - # Allow complex tests, better to be self contained - - path: _test\.go + # Allow complex tests and examples, better to be self contained + - path: (examples|main\.go|_test\.go) linters: + - forbidigo - gocognit - # Allow complex main function in examples - - path: examples - text: "of func `main` is high" + # Allow forbidden identifiers in CLI commands + - path: cmd linters: - - gocognit + - forbidigo run: skip-dirs-use-default: false diff --git a/vendor/github.com/pion/rtcp/.goreleaser.yml b/vendor/github.com/pion/rtcp/.goreleaser.yml new file mode 100644 index 000000000..30093e9d6 --- /dev/null +++ b/vendor/github.com/pion/rtcp/.goreleaser.yml @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +builds: +- skip: true diff --git a/vendor/github.com/pion/rtcp/AUTHORS.txt b/vendor/github.com/pion/rtcp/AUTHORS.txt deleted file mode 100644 index 5d5a53cc2..000000000 --- a/vendor/github.com/pion/rtcp/AUTHORS.txt +++ /dev/null @@ -1,23 +0,0 @@ -# Thank you to everyone that made Pion possible. If you are interested in contributing -# we would love to have you https://github.com/pion/webrtc/wiki/Contributing -# -# This file is auto generated, using git to list all individuals contributors. -# see `.github/generate-authors.sh` for the scripting -Adam Roach -adwpc -aggresss -Atsushi Watanabe -cnderrauber -Gabor Pongracz -Hugo Arregui -Hugo Arregui -Juliusz Chroboczek -Kevin Wang -lllf -Luke Curley -Mathis Engelbart -Max Hawkins -Sean DuBois -Sean DuBois -Simone Gotti -Woodrow Douglass diff --git a/vendor/github.com/pion/rtcp/LICENSE b/vendor/github.com/pion/rtcp/LICENSE index ab602974d..491caf6b0 100644 --- a/vendor/github.com/pion/rtcp/LICENSE +++ b/vendor/github.com/pion/rtcp/LICENSE @@ -1,21 +1,9 @@ MIT License -Copyright (c) 2018 +Copyright (c) 2023 The Pion community -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/pion/rtcp/README.md b/vendor/github.com/pion/rtcp/README.md index ec82c3fa6..063574aa9 100644 --- a/vendor/github.com/pion/rtcp/README.md +++ b/vendor/github.com/pion/rtcp/README.md @@ -9,8 +9,8 @@ Sourcegraph Widget Slack Widget
- Build Status - GoDoc + GitHub Workflow Status + Go Reference Coverage Status Go Report Card License: MIT @@ -23,14 +23,15 @@ See [DESIGN.md](DESIGN.md) for an overview of features and future goals. The library is used as a part of our WebRTC implementation. Please refer to that [roadmap](https://github.com/pion/webrtc/issues/9) to track our major milestones. ### Community -Pion has an active community on the [Golang Slack](https://invite.slack.golangbridge.org/). Sign up and join the **#pion** channel for discussions and support. You can also use [Pion mailing list](https://groups.google.com/forum/#!forum/pion). +Pion has an active community on the [Slack](https://pion.ly/slack). + +Follow the [Pion Twitter](https://twitter.com/_pion) for project updates and important WebRTC news. We are always looking to support **your projects**. Please reach out if you have something to build! - If you need commercial support or don't want to use public methods you can contact us at [team@pion.ly](mailto:team@pion.ly) ### Contributing -Check out the **[contributing wiki](https://github.com/pion/webrtc/wiki/Contributing)** to join the group of amazing people making this project possible: +Check out the [contributing wiki](https://github.com/pion/webrtc/wiki/Contributing) to join the group of amazing people making this project possible ### License MIT License - see [LICENSE](LICENSE) for full text diff --git a/vendor/github.com/pion/rtcp/codecov.yml b/vendor/github.com/pion/rtcp/codecov.yml index 085200a48..263e4d45c 100644 --- a/vendor/github.com/pion/rtcp/codecov.yml +++ b/vendor/github.com/pion/rtcp/codecov.yml @@ -3,6 +3,8 @@ # # It is automatically copied from https://github.com/pion/.goassets repository. # +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT coverage: status: diff --git a/vendor/github.com/pion/rtcp/compound_packet.go b/vendor/github.com/pion/rtcp/compound_packet.go index 33448248d..a621c6117 100644 --- a/vendor/github.com/pion/rtcp/compound_packet.go +++ b/vendor/github.com/pion/rtcp/compound_packet.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtcp import ( @@ -107,6 +110,15 @@ func (c CompoundPacket) Marshal() ([]byte, error) { return Marshal(p) } +// MarshalSize returns the size of the packet once marshaled +func (c CompoundPacket) MarshalSize() int { + l := 0 + for _, p := range c { + l += p.MarshalSize() + } + return l +} + // Unmarshal decodes a CompoundPacket from binary. func (c *CompoundPacket) Unmarshal(rawData []byte) error { out := make(CompoundPacket, 0) @@ -121,11 +133,7 @@ func (c *CompoundPacket) Unmarshal(rawData []byte) error { } *c = out - if err := c.Validate(); err != nil { - return err - } - - return nil + return c.Validate() } // DestinationSSRC returns the synchronization sources associated with this diff --git a/vendor/github.com/pion/rtcp/doc.go b/vendor/github.com/pion/rtcp/doc.go index a983c2e45..22f06cc85 100644 --- a/vendor/github.com/pion/rtcp/doc.go +++ b/vendor/github.com/pion/rtcp/doc.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + /* Package rtcp implements encoding and decoding of RTCP packets according to RFCs 3550 and 5506. @@ -35,6 +38,5 @@ Encoding RTCP packets: } pliData, err := pkt.Marshal() // ... - */ package rtcp diff --git a/vendor/github.com/pion/rtcp/errors.go b/vendor/github.com/pion/rtcp/errors.go index ed5bd0029..d2477af6b 100644 --- a/vendor/github.com/pion/rtcp/errors.go +++ b/vendor/github.com/pion/rtcp/errors.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtcp import "errors" @@ -19,6 +22,7 @@ var ( errSDESMissingType = errors.New("rtcp: sdes item missing type") errReasonTooLong = errors.New("rtcp: reason must be < 255 octets long") errBadVersion = errors.New("rtcp: invalid packet version") + errBadLength = errors.New("rtcp: invalid packet length") errWrongPadding = errors.New("rtcp: invalid padding value") errWrongFeedbackType = errors.New("rtcp: wrong feedback message type") errWrongPayloadType = errors.New("rtcp: wrong payload type") diff --git a/vendor/github.com/pion/rtcp/extended_report.go b/vendor/github.com/pion/rtcp/extended_report.go index 62e576bb4..0f9ee2ccf 100644 --- a/vendor/github.com/pion/rtcp/extended_report.go +++ b/vendor/github.com/pion/rtcp/extended_report.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtcp import ( @@ -10,8 +13,9 @@ import ( // more report blocks, each of which conveys a different kind of // information. // -// 0 1 2 3 -// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // |V=2|P|reserved | PT=XR=207 | length | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -88,8 +92,9 @@ func (t BlockTypeType) String() string { // Loss RLE report blocks (RFC 3611 §4.1) and Duplicate RLE // report blocks (RFC 3611 §4.2). // -// 0 1 2 3 -// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // | BT = 1 or 2 | rsvd. | T | block length | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -117,27 +122,27 @@ type rleReportBlock struct { // // Run Length Chunk: // -// 0 1 -// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// |C|R| run length | -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// 0 1 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// |C|R| run length | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // // Bit Vector Chunk: // -// 0 1 -// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// |C| bit vector | -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// 0 1 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// |C| bit vector | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // // Terminating Null Chunk: // -// 0 1 -// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// |0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0| -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// 0 1 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// |0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0| +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ type Chunk uint16 // LossRLEReportBlock is used to report information about packet @@ -234,8 +239,9 @@ func (c Chunk) Value() uint { // PacketReceiptTimesReportBlock represents a Packet Receipt Times // report block, as described in RFC 3611 section 4.3. // -// 0 1 2 3 -// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // | BT=3 | rsvd. | T | block length | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -278,8 +284,9 @@ func (b *PacketReceiptTimesReportBlock) unpackBlockHeader() { // ReceiverReferenceTimeReportBlock encodes a Receiver Reference Time // report block as described in RFC 3611 section 4.4. // -// 0 1 2 3 -// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // | BT=4 | reserved | block length = 2 | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -309,8 +316,9 @@ func (b *ReceiverReferenceTimeReportBlock) unpackBlockHeader() { // DLRRReportBlock encodes a DLRR Report Block as described in // RFC 3611 section 4.5. // -// 0 1 2 3 -// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // | BT=5 | reserved | block length | // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ @@ -357,8 +365,9 @@ func (b *DLRRReportBlock) unpackBlockHeader() { // StatisticsSummaryReportBlock encodes a Statistics Summary Report // Block as described in RFC 3611, section 4.6. // -// 0 1 2 3 -// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // | BT=6 |L|D|J|ToH|rsvd.| block length = 9 | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -455,8 +464,9 @@ func (b *StatisticsSummaryReportBlock) unpackBlockHeader() { // VoIPMetricsReportBlock encodes a VoIP Metrics Report Block as described // in RFC 3611, section 4.7. // -// 0 1 2 3 -// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // | BT=7 | reserved | block length = 8 | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -535,6 +545,11 @@ func (b *UnknownReportBlock) setupBlockHeader() { func (b *UnknownReportBlock) unpackBlockHeader() { } +// MarshalSize returns the size of the packet once marshaled +func (x ExtendedReport) MarshalSize() int { + return wireSize(x) +} + // Marshal encodes the ExtendedReport in binary func (x ExtendedReport) Marshal() ([]byte, error) { for _, p := range x.Reports { @@ -631,7 +646,8 @@ func (x *ExtendedReport) Unmarshal(b []byte) error { // DestinationSSRC returns an array of SSRC values that this packet refers to. func (x *ExtendedReport) DestinationSSRC() []uint32 { - ssrc := make([]uint32, 0) + ssrc := make([]uint32, 0, len(x.Reports)+1) + ssrc = append(ssrc, x.SenderSSRC) for _, p := range x.Reports { ssrc = append(ssrc, p.DestinationSSRC()...) } diff --git a/vendor/github.com/pion/rtcp/full_intra_request.go b/vendor/github.com/pion/rtcp/full_intra_request.go index 74ca928d6..7c67c5043 100644 --- a/vendor/github.com/pion/rtcp/full_intra_request.go +++ b/vendor/github.com/pion/rtcp/full_intra_request.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtcp import ( @@ -64,6 +67,11 @@ func (p *FullIntraRequest) Unmarshal(rawPacket []byte) error { return errWrongType } + // The FCI field MUST contain one or more FIR entries + if 4*h.Length-firOffset <= 0 || (4*h.Length)%8 != 0 { + return errBadLength + } + p.SenderSSRC = binary.BigEndian.Uint32(rawPacket[headerLength:]) p.MediaSSRC = binary.BigEndian.Uint32(rawPacket[headerLength+ssrcLength:]) for i := headerLength + firOffset; i < (headerLength + int(h.Length*4)); i += 8 { @@ -80,11 +88,12 @@ func (p *FullIntraRequest) Header() Header { return Header{ Count: FormatFIR, Type: TypePayloadSpecificFeedback, - Length: uint16((p.len() / 4) - 1), + Length: uint16((p.MarshalSize() / 4) - 1), } } -func (p *FullIntraRequest) len() int { +// MarshalSize returns the size of the packet once marshaled +func (p *FullIntraRequest) MarshalSize() int { return headerLength + firOffset + len(p.FIR)*8 } diff --git a/vendor/github.com/pion/rtcp/fuzz.go b/vendor/github.com/pion/rtcp/fuzz.go deleted file mode 100644 index b8118224a..000000000 --- a/vendor/github.com/pion/rtcp/fuzz.go +++ /dev/null @@ -1,52 +0,0 @@ -//go:build gofuzz -// +build gofuzz - -package rtcp - -import ( - "bytes" - "io" -) - -// Fuzz implements a randomized fuzz test of the rtcp -// parser using go-fuzz. -// -// To run the fuzzer, first download go-fuzz: -// `go get github.com/dvyukov/go-fuzz/...` -// -// Then build the testing package: -// `go-fuzz-build github.com/pion/webrtc` -// -// And run the fuzzer on the corpus: -// ``` -// mkdir workdir -// -// # optionally add a starter corpus of valid rtcp packets. -// # the corpus should be as compact and diverse as possible. -// cp -r ~/my-rtcp-packets workdir/corpus -// -// go-fuzz -bin=ase-fuzz.zip -workdir=workdir -// ```` -func Fuzz(data []byte) int { - r := NewReader(bytes.NewReader(data)) - for { - _, data, err := r.ReadPacket() - if err == io.EOF { - break - } - if err != nil { - return 0 - } - - packet, err := Unmarshal(data) - if err != nil { - return 0 - } - - if _, err := packet.Marshal(); err != nil { - return 0 - } - } - - return 1 -} diff --git a/vendor/github.com/pion/rtcp/goodbye.go b/vendor/github.com/pion/rtcp/goodbye.go index 0d09199b1..bda1785b2 100644 --- a/vendor/github.com/pion/rtcp/goodbye.go +++ b/vendor/github.com/pion/rtcp/goodbye.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtcp import ( @@ -29,7 +32,7 @@ func (g Goodbye) Marshal() ([]byte, error) { * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ - rawPacket := make([]byte, g.len()) + rawPacket := make([]byte, g.MarshalSize()) packetBody := rawPacket[headerLength:] if len(g.Sources) > countMax { @@ -123,11 +126,12 @@ func (g *Goodbye) Header() Header { Padding: false, Count: uint8(len(g.Sources)), Type: TypeGoodbye, - Length: uint16((g.len() / 4) - 1), + Length: uint16((g.MarshalSize() / 4) - 1), } } -func (g *Goodbye) len() int { +// MarshalSize returns the size of the packet once marshaled +func (g *Goodbye) MarshalSize() int { srcsLength := len(g.Sources) * ssrcLength reasonLength := len(g.Reason) + 1 diff --git a/vendor/github.com/pion/rtcp/header.go b/vendor/github.com/pion/rtcp/header.go index 43f6abc06..534c82f2e 100644 --- a/vendor/github.com/pion/rtcp/header.go +++ b/vendor/github.com/pion/rtcp/header.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtcp import ( diff --git a/vendor/github.com/pion/rtcp/packet.go b/vendor/github.com/pion/rtcp/packet.go index 885d52cde..cdb83c048 100644 --- a/vendor/github.com/pion/rtcp/packet.go +++ b/vendor/github.com/pion/rtcp/packet.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtcp // Packet represents an RTCP packet, a protocol used for out-of-band statistics and control information for an RTP session @@ -7,6 +10,7 @@ type Packet interface { Marshal() ([]byte, error) Unmarshal(rawPacket []byte) error + MarshalSize() int } // Unmarshal takes an entire udp datagram (which may consist of multiple RTCP packets) and diff --git a/vendor/github.com/pion/rtcp/packet_buffer.go b/vendor/github.com/pion/rtcp/packet_buffer.go index 9febe9d43..f6c7eaa96 100644 --- a/vendor/github.com/pion/rtcp/packet_buffer.go +++ b/vendor/github.com/pion/rtcp/packet_buffer.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtcp import ( @@ -43,7 +46,6 @@ const omit = "omit" // PacketBuffer is initialized with. This function will // modify the PacketBuffer.bytes slice to exclude those // bytes that have been written into. -// func (b *packetBuffer) write(v interface{}) error { //nolint:gocognit value := reflect.ValueOf(v) diff --git a/vendor/github.com/pion/rtcp/packet_stringifier.go b/vendor/github.com/pion/rtcp/packet_stringifier.go index 888372e15..dd7c01f51 100644 --- a/vendor/github.com/pion/rtcp/packet_stringifier.go +++ b/vendor/github.com/pion/rtcp/packet_stringifier.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtcp import ( @@ -6,26 +9,26 @@ import ( ) /* - Converts an RTCP Packet into a human-readable format. The Packets - themselves can control the presentation as follows: +Converts an RTCP Packet into a human-readable format. The Packets +themselves can control the presentation as follows: - - Fields of a type that have a String() method will be formatted - with that String method (which should not emit '\n' characters) + - Fields of a type that have a String() method will be formatted + with that String method (which should not emit '\n' characters) - - Otherwise, fields with a tag containing a "fmt" string will use that - format when serializing the value. For example, to format an SSRC - value as base 16 insted of base 10: + - Otherwise, fields with a tag containing a "fmt" string will use that + format when serializing the value. For example, to format an SSRC + value as base 16 insted of base 10: - type ExamplePacket struct { - LocalSSRC uint32 `fmt:"0x%X"` - RemotsSSRCs []uint32 `fmt:"%X"` - } + type ExamplePacket struct { + LocalSSRC uint32 `fmt:"0x%X"` + RemotsSSRCs []uint32 `fmt:"%X"` + } - - If no fmt string is present, "%+v" is used by default +- If no fmt string is present, "%+v" is used by default - The intention of this stringify() function is to simplify creation - of String() methods on new packet types, as it provides a simple - baseline implementation that works well in the majority of cases. +The intention of this stringify() function is to simplify creation +of String() methods on new packet types, as it provides a simple +baseline implementation that works well in the majority of cases. */ func stringify(p Packet) string { value := reflect.Indirect(reflect.ValueOf(p)) diff --git a/vendor/github.com/pion/rtcp/picture_loss_indication.go b/vendor/github.com/pion/rtcp/picture_loss_indication.go index 86d4cf1b9..56a7de256 100644 --- a/vendor/github.com/pion/rtcp/picture_loss_indication.go +++ b/vendor/github.com/pion/rtcp/picture_loss_indication.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtcp import ( @@ -26,7 +29,7 @@ func (p PictureLossIndication) Marshal() ([]byte, error) { * * The semantics of this FB message is independent of the payload type. */ - rawPacket := make([]byte, p.len()) + rawPacket := make([]byte, p.MarshalSize()) packetBody := rawPacket[headerLength:] binary.BigEndian.PutUint32(packetBody, p.SenderSSRC) @@ -75,7 +78,8 @@ func (p *PictureLossIndication) Header() Header { } } -func (p *PictureLossIndication) len() int { +// MarshalSize returns the size of the packet once marshaled +func (p *PictureLossIndication) MarshalSize() int { return headerLength + ssrcLength*2 } diff --git a/vendor/github.com/pion/rtcp/rapid_resynchronization_request.go b/vendor/github.com/pion/rtcp/rapid_resynchronization_request.go index 00c7e8626..dc67d4928 100644 --- a/vendor/github.com/pion/rtcp/rapid_resynchronization_request.go +++ b/vendor/github.com/pion/rtcp/rapid_resynchronization_request.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtcp import ( @@ -32,7 +35,7 @@ func (p RapidResynchronizationRequest) Marshal() ([]byte, error) { * * The semantics of this FB message is independent of the payload type. */ - rawPacket := make([]byte, p.len()) + rawPacket := make([]byte, p.MarshalSize()) packetBody := rawPacket[headerLength:] binary.BigEndian.PutUint32(packetBody, p.SenderSSRC) @@ -67,7 +70,8 @@ func (p *RapidResynchronizationRequest) Unmarshal(rawPacket []byte) error { return nil } -func (p *RapidResynchronizationRequest) len() int { +// MarshalSize returns the size of the packet once marshaled +func (p *RapidResynchronizationRequest) MarshalSize() int { return headerLength + rrrHeaderLength } diff --git a/vendor/github.com/pion/rtcp/raw_packet.go b/vendor/github.com/pion/rtcp/raw_packet.go index d0f949030..eafb034fe 100644 --- a/vendor/github.com/pion/rtcp/raw_packet.go +++ b/vendor/github.com/pion/rtcp/raw_packet.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtcp import "fmt" @@ -40,3 +43,8 @@ func (r RawPacket) String() string { out := fmt.Sprintf("RawPacket: %v", ([]byte)(r)) return out } + +// MarshalSize returns the size of the packet once marshaled +func (r RawPacket) MarshalSize() int { + return len(r) +} diff --git a/vendor/github.com/pion/rtcp/receiver_estimated_maximum_bitrate.go b/vendor/github.com/pion/rtcp/receiver_estimated_maximum_bitrate.go index 69d1194b4..7be57e6ab 100644 --- a/vendor/github.com/pion/rtcp/receiver_estimated_maximum_bitrate.go +++ b/vendor/github.com/pion/rtcp/receiver_estimated_maximum_bitrate.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtcp import ( @@ -39,9 +42,8 @@ func (p ReceiverEstimatedMaximumBitrate) Marshal() (buf []byte, err error) { return buf, nil } -// MarshalSize returns the size of the packet when marshaled. -// This can be used in conjunction with `MarshalTo` to avoid allocations. -func (p ReceiverEstimatedMaximumBitrate) MarshalSize() (n int) { +// MarshalSize returns the size of the packet once marshaled +func (p ReceiverEstimatedMaximumBitrate) MarshalSize() int { return 20 + 4*len(p.SSRCs) } diff --git a/vendor/github.com/pion/rtcp/receiver_report.go b/vendor/github.com/pion/rtcp/receiver_report.go index 22ff233be..e91770206 100644 --- a/vendor/github.com/pion/rtcp/receiver_report.go +++ b/vendor/github.com/pion/rtcp/receiver_report.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtcp import ( @@ -55,7 +58,7 @@ func (r ReceiverReport) Marshal() ([]byte, error) { * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ - rawPacket := make([]byte, r.len()) + rawPacket := make([]byte, r.MarshalSize()) packetBody := rawPacket[headerLength:] binary.BigEndian.PutUint32(packetBody, r.SSRC) @@ -154,7 +157,8 @@ func (r *ReceiverReport) Unmarshal(rawPacket []byte) error { return nil } -func (r *ReceiverReport) len() int { +// MarshalSize returns the size of the packet once marshaled +func (r *ReceiverReport) MarshalSize() int { repsLength := 0 for _, rep := range r.Reports { repsLength += rep.len() @@ -167,7 +171,7 @@ func (r *ReceiverReport) Header() Header { return Header{ Count: uint8(len(r.Reports)), Type: TypeReceiverReport, - Length: uint16((r.len()/4)-1) + uint16(getPadding(len(r.ProfileExtensions))), + Length: uint16((r.MarshalSize()/4)-1) + uint16(getPadding(len(r.ProfileExtensions))), } } diff --git a/vendor/github.com/pion/rtcp/reception_report.go b/vendor/github.com/pion/rtcp/reception_report.go index 5bff8f2b5..c0b06059c 100644 --- a/vendor/github.com/pion/rtcp/reception_report.go +++ b/vendor/github.com/pion/rtcp/reception_report.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtcp import "encoding/binary" diff --git a/vendor/github.com/pion/rtcp/renovate.json b/vendor/github.com/pion/rtcp/renovate.json index f1614058a..f1bb98c6a 100644 --- a/vendor/github.com/pion/rtcp/renovate.json +++ b/vendor/github.com/pion/rtcp/renovate.json @@ -1,27 +1,6 @@ { + "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ - "config:base", - ":disableDependencyDashboard" - ], - "postUpdateOptions": [ - "gomodTidy" - ], - "commitBody": "Generated by renovateBot", - "packageRules": [ - { - "matchUpdateTypes": ["minor", "patch", "pin", "digest"], - "automerge": true - }, - { - "packagePatterns": ["^golang.org/x/"], - "schedule": ["on the first day of the month"] - } - ], - "ignorePaths": [ - ".github/workflows/generate-authors.yml", - ".github/workflows/lint.yaml", - ".github/workflows/renovate-go-mod-fix.yaml", - ".github/workflows/test.yaml", - ".github/workflows/tidy-check.yaml" + "github>pion/renovate-config" ] } diff --git a/vendor/github.com/pion/rtcp/rfc8888.go b/vendor/github.com/pion/rtcp/rfc8888.go index 8527fc8e7..544c6e380 100644 --- a/vendor/github.com/pion/rtcp/rfc8888.go +++ b/vendor/github.com/pion/rtcp/rfc8888.go @@ -1,9 +1,13 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtcp import ( "encoding/binary" "errors" "fmt" + "math" ) // https://www.rfc-editor.org/rfc/rfc8888.html#name-rtcp-congestion-control-fee @@ -89,8 +93,13 @@ func (b CCFeedbackReport) DestinationSSRC() []uint32 { } // Len returns the length of the report in bytes -func (b *CCFeedbackReport) Len() uint16 { - n := uint16(0) +func (b *CCFeedbackReport) Len() int { + return b.MarshalSize() +} + +// MarshalSize returns the size of the packet once marshaled +func (b *CCFeedbackReport) MarshalSize() int { + n := 0 for _, block := range b.ReportBlocks { n += block.len() } @@ -103,7 +112,7 @@ func (b *CCFeedbackReport) Header() Header { Padding: false, Count: FormatCCFB, Type: TypeTransportSpecificFeedback, - Length: b.Len()/4 - 1, + Length: uint16(b.MarshalSize()/4 - 1), } } @@ -118,7 +127,7 @@ func (b CCFeedbackReport) Marshal() ([]byte, error) { buf := make([]byte, length) copy(buf[:headerLength], headerBuf) binary.BigEndian.PutUint32(buf[headerLength:], b.SenderSSRC) - offset := uint16(reportBlockOffset) + offset := reportBlockOffset for _, block := range b.ReportBlocks { b, err := block.marshal() if err != nil { @@ -160,10 +169,10 @@ func (b *CCFeedbackReport) Unmarshal(rawPacket []byte) error { b.SenderSSRC = binary.BigEndian.Uint32(rawPacket[headerLength:]) - reportTimestampOffset := uint16(len(rawPacket) - reportTimestampLength) + reportTimestampOffset := len(rawPacket) - reportTimestampLength b.ReportTimestamp = binary.BigEndian.Uint32(rawPacket[reportTimestampOffset:]) - offset := uint16(reportBlockOffset) + offset := reportBlockOffset b.ReportBlocks = []CCFeedbackReportBlock{} for offset < reportTimestampOffset { var block CCFeedbackReportBlock @@ -195,12 +204,12 @@ type CCFeedbackReportBlock struct { } // len returns the length of the report block in bytes -func (b *CCFeedbackReportBlock) len() uint16 { +func (b *CCFeedbackReportBlock) len() int { n := len(b.MetricBlocks) if n%2 != 0 { n++ } - return reportsOffset + 2*uint16(n) + return reportsOffset + 2*n } func (b CCFeedbackReportBlock) String() string { @@ -253,14 +262,20 @@ func (b *CCFeedbackReportBlock) unmarshal(rawPacket []byte) error { if numReportsField == 0 { return nil } - endSequence := b.BeginSequence + numReportsField - numReports := endSequence - b.BeginSequence + 1 - if len(rawPacket) < int(reportsOffset+numReports*2) { + if int(b.BeginSequence)+int(numReportsField) > math.MaxUint16 { return errIncorrectNumReports } + + endSequence := b.BeginSequence + numReportsField + numReports := int(endSequence - b.BeginSequence + 1) + + if len(rawPacket) < reportsOffset+numReports*2 { + return errIncorrectNumReports + } + b.MetricBlocks = make([]CCFeedbackMetricBlock, numReports) - for i := uint16(0); i < numReports; i++ { + for i := int(0); i < numReports; i++ { var mb CCFeedbackMetricBlock offset := reportsOffset + 2*i if err := mb.unmarshal(rawPacket[offset : offset+2]); err != nil { diff --git a/vendor/github.com/pion/rtcp/sender_report.go b/vendor/github.com/pion/rtcp/sender_report.go index 8e0beeccd..aaee0ee9d 100644 --- a/vendor/github.com/pion/rtcp/sender_report.go +++ b/vendor/github.com/pion/rtcp/sender_report.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtcp import ( @@ -93,7 +96,7 @@ func (r SenderReport) Marshal() ([]byte, error) { * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ - rawPacket := make([]byte, r.len()) + rawPacket := make([]byte, r.MarshalSize()) packetBody := rawPacket[headerLength:] binary.BigEndian.PutUint32(packetBody[srSSRCOffset:], r.SSRC) @@ -225,7 +228,8 @@ func (r *SenderReport) DestinationSSRC() []uint32 { return out } -func (r *SenderReport) len() int { +// MarshalSize returns the size of the packet once marshaled +func (r *SenderReport) MarshalSize() int { repsLength := 0 for _, rep := range r.Reports { repsLength += rep.len() @@ -238,7 +242,7 @@ func (r *SenderReport) Header() Header { return Header{ Count: uint8(len(r.Reports)), Type: TypeSenderReport, - Length: uint16((r.len() / 4) - 1), + Length: uint16((r.MarshalSize() / 4) - 1), } } diff --git a/vendor/github.com/pion/rtcp/slice_loss_indication.go b/vendor/github.com/pion/rtcp/slice_loss_indication.go index ccd93c998..014fcb7cd 100644 --- a/vendor/github.com/pion/rtcp/slice_loss_indication.go +++ b/vendor/github.com/pion/rtcp/slice_loss_indication.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtcp import ( @@ -90,7 +93,8 @@ func (p *SliceLossIndication) Unmarshal(rawPacket []byte) error { return nil } -func (p *SliceLossIndication) len() int { +// MarshalSize returns the size of the packet once marshaled +func (p *SliceLossIndication) MarshalSize() int { return headerLength + sliOffset + (len(p.SLI) * 4) } @@ -99,7 +103,7 @@ func (p *SliceLossIndication) Header() Header { return Header{ Count: FormatSLI, Type: TypeTransportSpecificFeedback, - Length: uint16((p.len() / 4) - 1), + Length: uint16((p.MarshalSize() / 4) - 1), } } diff --git a/vendor/github.com/pion/rtcp/source_description.go b/vendor/github.com/pion/rtcp/source_description.go index c4483c301..fc29d8e1a 100644 --- a/vendor/github.com/pion/rtcp/source_description.go +++ b/vendor/github.com/pion/rtcp/source_description.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtcp import ( @@ -94,7 +97,7 @@ func (s SourceDescription) Marshal() ([]byte, error) { * +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ */ - rawPacket := make([]byte, s.len()) + rawPacket := make([]byte, s.MarshalSize()) packetBody := rawPacket[headerLength:] chunkOffset := 0 @@ -166,7 +169,8 @@ func (s *SourceDescription) Unmarshal(rawPacket []byte) error { return nil } -func (s *SourceDescription) len() int { +// MarshalSize returns the size of the packet once marshaled +func (s *SourceDescription) MarshalSize() int { chunksLength := 0 for _, c := range s.Chunks { chunksLength += c.len() @@ -179,7 +183,7 @@ func (s *SourceDescription) Header() Header { return Header{ Count: uint8(len(s.Chunks)), Type: TypeSourceDescription, - Length: uint16((s.len() / 4) - 1), + Length: uint16((s.MarshalSize() / 4) - 1), } } @@ -248,7 +252,7 @@ func (s *SourceDescriptionChunk) Unmarshal(rawPacket []byte) error { return err } s.Items = append(s.Items, it) - i += it.len() + i += it.Len() } return errPacketTooShort @@ -257,7 +261,7 @@ func (s *SourceDescriptionChunk) Unmarshal(rawPacket []byte) error { func (s SourceDescriptionChunk) len() int { chunkLen := sdesSourceLen for _, it := range s.Items { - chunkLen += it.len() + chunkLen += it.Len() } chunkLen += sdesTypeLen // for terminating null octet @@ -277,7 +281,8 @@ type SourceDescriptionItem struct { Text string } -func (s SourceDescriptionItem) len() int { +// Len returns the length of the SourceDescriptionItem when encoded as binary. +func (s SourceDescriptionItem) Len() int { /* * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 diff --git a/vendor/github.com/pion/rtcp/transport_layer_cc.go b/vendor/github.com/pion/rtcp/transport_layer_cc.go index 013902163..55b216205 100644 --- a/vendor/github.com/pion/rtcp/transport_layer_cc.go +++ b/vendor/github.com/pion/rtcp/transport_layer_cc.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtcp // Author: adwpc @@ -360,13 +363,18 @@ func (t *TransportLayerCC) packetLen() uint16 { // Len return total bytes with padding func (t *TransportLayerCC) Len() uint16 { + return uint16(t.MarshalSize()) +} + +// MarshalSize returns the size of the packet once marshaled +func (t *TransportLayerCC) MarshalSize() int { n := t.packetLen() // has padding if n%4 != 0 { n = (n/4 + 1) * 4 } - return n + return int(n) } func (t TransportLayerCC) String() string { @@ -396,7 +404,7 @@ func (t TransportLayerCC) Marshal() ([]byte, error) { return nil, err } - payload := make([]byte, t.Len()-headerLength) + payload := make([]byte, t.MarshalSize()-headerLength) binary.BigEndian.PutUint32(payload, t.SenderSSRC) binary.BigEndian.PutUint32(payload[4:], t.MediaSSRC) binary.BigEndian.PutUint16(payload[baseSequenceNumberOffset:], t.BaseSequenceNumber) @@ -427,7 +435,7 @@ func (t TransportLayerCC) Marshal() ([]byte, error) { } if t.Header.Padding { - payload[len(payload)-1] = uint8(t.Len() - t.packetLen()) + payload[len(payload)-1] = uint8(t.MarshalSize() - int(t.packetLen())) } return append(header, payload...), nil @@ -520,10 +528,10 @@ func (t *TransportLayerCC) Unmarshal(rawPacket []byte) error { //nolint:gocognit recvDeltasPos := packetStatusPos for _, delta := range t.RecvDeltas { - if recvDeltasPos >= totalLength { - return errPacketTooShort - } if delta.Type == TypeTCCPacketReceivedSmallDelta { + if recvDeltasPos+1 > totalLength { + return errPacketTooShort + } err := delta.Unmarshal(rawPacket[recvDeltasPos : recvDeltasPos+1]) if err != nil { return err @@ -531,6 +539,9 @@ func (t *TransportLayerCC) Unmarshal(rawPacket []byte) error { //nolint:gocognit recvDeltasPos++ } if delta.Type == TypeTCCPacketReceivedLargeDelta { + if recvDeltasPos+2 > totalLength { + return errPacketTooShort + } err := delta.Unmarshal(rawPacket[recvDeltasPos : recvDeltasPos+2]) if err != nil { return err diff --git a/vendor/github.com/pion/rtcp/transport_layer_nack.go b/vendor/github.com/pion/rtcp/transport_layer_nack.go index ab0c03d9d..802b915ec 100644 --- a/vendor/github.com/pion/rtcp/transport_layer_nack.go +++ b/vendor/github.com/pion/rtcp/transport_layer_nack.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtcp import ( @@ -132,6 +135,11 @@ func (p *TransportLayerNack) Unmarshal(rawPacket []byte) error { return errWrongType } + // The FCI field MUST contain at least one and MAY contain more than one Generic NACK + if 4*h.Length <= nackOffset { + return errBadLength + } + p.SenderSSRC = binary.BigEndian.Uint32(rawPacket[headerLength:]) p.MediaSSRC = binary.BigEndian.Uint32(rawPacket[headerLength+ssrcLength:]) for i := headerLength + nackOffset; i < (headerLength + int(h.Length*4)); i += 4 { @@ -143,7 +151,8 @@ func (p *TransportLayerNack) Unmarshal(rawPacket []byte) error { return nil } -func (p *TransportLayerNack) len() int { +// MarshalSize returns the size of the packet once marshaled +func (p *TransportLayerNack) MarshalSize() int { return headerLength + nackOffset + (len(p.Nacks) * 4) } @@ -152,7 +161,7 @@ func (p *TransportLayerNack) Header() Header { return Header{ Count: FormatTLN, Type: TypeTransportSpecificFeedback, - Length: uint16((p.len() / 4) - 1), + Length: uint16((p.MarshalSize() / 4) - 1), } } diff --git a/vendor/github.com/pion/rtcp/util.go b/vendor/github.com/pion/rtcp/util.go index 95e8f1a83..c68cebef5 100644 --- a/vendor/github.com/pion/rtcp/util.go +++ b/vendor/github.com/pion/rtcp/util.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtcp // getPadding Returns the padding required to make the length a multiple of 4 diff --git a/vendor/github.com/pion/rtp/.gitignore b/vendor/github.com/pion/rtp/.gitignore index f977e7485..6e2f206a9 100644 --- a/vendor/github.com/pion/rtp/.gitignore +++ b/vendor/github.com/pion/rtp/.gitignore @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + ### JetBrains IDE ### ##################### .idea/ diff --git a/vendor/github.com/pion/rtp/.golangci.yml b/vendor/github.com/pion/rtp/.golangci.yml index d6162c970..e06de4d3c 100644 --- a/vendor/github.com/pion/rtp/.golangci.yml +++ b/vendor/github.com/pion/rtp/.golangci.yml @@ -1,6 +1,10 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + linters-settings: govet: - check-shadowing: true + enable: + - shadow misspell: locale: US exhaustive: @@ -10,19 +14,33 @@ linters-settings: modules: - github.com/pkg/errors: recommendations: - - errors + - errors + forbidigo: + forbid: + - ^fmt.Print(f|ln)?$ + - ^log.(Panic|Fatal|Print)(f|ln)?$ + - ^os.Exit$ + - ^panic$ + - ^print(ln)?$ linters: enable: - asciicheck # Simple linter to check that your code does not contain non-ASCII identifiers + - bidichk # Checks for dangerous unicode character sequences - bodyclose # checks whether HTTP response body is closed successfully - - deadcode # Finds unused code - - depguard # Go linter that checks if package imports are in a list of acceptable packages + - contextcheck # check the function whether use a non-inherited context + - decorder # check declaration order and count of types, constants, variables and functions - dogsled # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()) - dupl # Tool for code clone detection + - durationcheck # check for two durations multiplied together - errcheck # Errcheck is a program for checking for unchecked errors in go programs. These unchecked errors can be critical bugs in some cases + - errchkjson # Checks types passed to the json encoding functions. Reports unsupported types and optionally reports occations, where the check for the returned error can be omitted. + - errname # Checks that sentinel errors are prefixed with the `Err` and error types are suffixed with the `Error`. + - errorlint # errorlint is a linter for that can be used to find code that will cause problems with the error wrapping scheme introduced in Go 1.13. - exhaustive # check exhaustiveness of enum switch statements - exportloopref # checks for pointers to enclosing loop variables + - forbidigo # Forbids identifiers + - forcetypeassert # finds forced type assertions - gci # Gci control golang package import order and make it always deterministic. - gochecknoglobals # Checks that no globals are present in Go code - gochecknoinits # Checks that no init functions are present in Go code @@ -35,55 +53,73 @@ linters: - gofumpt # Gofumpt checks whether code was gofumpt-ed. - goheader # Checks is file header matches to pattern - goimports # Goimports does everything that gofmt does. Additionally it checks unused imports - - golint # Golint differs from gofmt. Gofmt reformats Go source code, whereas golint prints out style mistakes + - gomoddirectives # Manage the use of 'replace', 'retract', and 'excludes' directives in go.mod. - gomodguard # Allow and block list linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations. - goprintffuncname # Checks that printf-like functions are named with `f` at the end - gosec # Inspects source code for security problems - gosimple # Linter for Go source code that specializes in simplifying a code - govet # Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string + - grouper # An analyzer to analyze expression groups. + - importas # Enforces consistent import aliases - ineffassign # Detects when assignments to existing variables are not used - misspell # Finds commonly misspelled English words in comments - - nakedret # Finds naked returns in functions greater than a specified function length + - nilerr # Finds the code that returns nil even if it checks that the error is not nil. + - nilnil # Checks that there is no simultaneous return of `nil` error and an invalid value. - noctx # noctx finds sending http request without context.Context - - scopelint # Scopelint checks for unpinned variables in go programs + - predeclared # find code that shadows one of Go's predeclared identifiers + - revive # golint replacement, finds style mistakes - staticcheck # Staticcheck is a go vet on steroids, applying a ton of static analysis checks - - structcheck # Finds unused struct fields - stylecheck # Stylecheck is a replacement for golint + - tagliatelle # Checks the struct tags. + - tenv # tenv is analyzer that detects using os.Setenv instead of t.Setenv since Go1.17 + - tparallel # tparallel detects inappropriate usage of t.Parallel() method in your Go test codes - typecheck # Like the front-end of a Go compiler, parses and type-checks Go code - unconvert # Remove unnecessary type conversions - unparam # Reports unused function parameters - unused # Checks Go code for unused constants, variables, functions and types - - varcheck # Finds unused global variables and constants + - wastedassign # wastedassign finds wasted assignment statements - whitespace # Tool for detection of leading and trailing whitespace disable: + - depguard # Go linter that checks if package imports are in a list of acceptable packages + - containedctx # containedctx is a linter that detects struct contained context.Context field + - cyclop # checks function and package cyclomatic complexity + - exhaustivestruct # Checks if all struct's fields are initialized - funlen # Tool for detection of long functions - gocyclo # Computes and checks the cyclomatic complexity of functions - godot # Check if comments end in a period - gomnd # An analyzer to detect magic numbers. + - ifshort # Checks that your code uses short syntax for if-statements whenever possible + - ireturn # Accept Interfaces, Return Concrete Types - lll # Reports long lines + - maintidx # maintidx measures the maintainability index of each function. + - makezero # Finds slice declarations with non-zero initial length - maligned # Tool to detect Go structs that would take less memory if their fields were sorted + - nakedret # Finds naked returns in functions greater than a specified function length - nestif # Reports deeply nested if statements - nlreturn # nlreturn checks for a new line before return and branch statements to increase code clarity - nolintlint # Reports ill-formed or insufficient nolint directives + - paralleltest # paralleltest detects missing usage of t.Parallel() method in your Go test - prealloc # Finds slice declarations that could potentially be preallocated + - promlinter # Check Prometheus metrics naming via promlint - rowserrcheck # checks whether Err of rows is checked successfully - sqlclosecheck # Checks that sql.Rows and sql.Stmt are closed. - testpackage # linter that makes you use a separate _test package + - thelper # thelper detects golang test helpers without t.Helper() call and checks the consistency of test helpers + - varnamelen # checks that the length of a variable's name matches its scope + - wrapcheck # Checks that errors returned from external packages are wrapped - wsl # Whitespace Linter - Forces you to use empty lines! issues: exclude-use-default: false + exclude-dirs-use-default: false exclude-rules: - # Allow complex tests, better to be self contained - - path: _test\.go + # Allow complex tests and examples, better to be self contained + - path: (examples|main\.go|_test\.go) linters: + - forbidigo - gocognit - # Allow complex main function in examples - - path: examples - text: "of func `main` is high" + # Allow forbidden identifiers in CLI commands + - path: cmd linters: - - gocognit - -run: - skip-dirs-use-default: false + - forbidigo diff --git a/vendor/github.com/pion/rtp/.goreleaser.yml b/vendor/github.com/pion/rtp/.goreleaser.yml new file mode 100644 index 000000000..30093e9d6 --- /dev/null +++ b/vendor/github.com/pion/rtp/.goreleaser.yml @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +builds: +- skip: true diff --git a/vendor/github.com/pion/rtp/AUTHORS.txt b/vendor/github.com/pion/rtp/AUTHORS.txt deleted file mode 100644 index a7bc7a02b..000000000 --- a/vendor/github.com/pion/rtp/AUTHORS.txt +++ /dev/null @@ -1,36 +0,0 @@ -# Thank you to everyone that made Pion possible. If you are interested in contributing -# we would love to have you https://github.com/pion/webrtc/wiki/Contributing -# -# This file is auto generated, using git to list all individuals contributors. -# see `.github/generate-authors.sh` for the scripting -adwpc -aler9 <46489434+aler9@users.noreply.github.com> -Antoine Baché -Antoine Baché -Atsushi Watanabe -baiyufei -Bao Nguyen -boks1971 -debiandebiandebian -ffmiyo -Guilherme -Haiyang Wang -Hugo Arregui -John Bradley -Juliusz Chroboczek -Kazuyuki Honda -Luke Curley -lxb -Michael MacDonald -Michael MacDonald -Michael Uti -Raphael Derosso Pereira -Rob Lofthouse -Robin Raymond -Sean DuBois -Sean DuBois -Sean DuBois -Simone Gotti -Tarrence van As -wangzixiang -Woodrow Douglass diff --git a/vendor/github.com/pion/rtp/LICENSE b/vendor/github.com/pion/rtp/LICENSE index ab602974d..2071b23b0 100644 --- a/vendor/github.com/pion/rtp/LICENSE +++ b/vendor/github.com/pion/rtp/LICENSE @@ -1,21 +1,9 @@ MIT License -Copyright (c) 2018 +Copyright (c) -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/pion/rtp/README.md b/vendor/github.com/pion/rtp/README.md index ce04599a8..c84621c07 100644 --- a/vendor/github.com/pion/rtp/README.md +++ b/vendor/github.com/pion/rtp/README.md @@ -9,8 +9,8 @@ Sourcegraph Widget Slack Widget
- Build Status - GoDoc + GitHub Workflow Status + Go Reference Coverage Status Go Report Card License: MIT @@ -21,14 +21,15 @@ The library is used as a part of our WebRTC implementation. Please refer to that [roadmap](https://github.com/pion/webrtc/issues/9) to track our major milestones. ### Community -Pion has an active community on the [Golang Slack](https://invite.slack.golangbridge.org/). Sign up and join the **#pion** channel for discussions and support. You can also use [Pion mailing list](https://groups.google.com/forum/#!forum/pion). +Pion has an active community on the [Slack](https://pion.ly/slack). + +Follow the [Pion Twitter](https://twitter.com/_pion) for project updates and important WebRTC news. We are always looking to support **your projects**. Please reach out if you have something to build! - If you need commercial support or don't want to use public methods you can contact us at [team@pion.ly](mailto:team@pion.ly) ### Contributing -Check out the **[contributing wiki](https://github.com/pion/webrtc/wiki/Contributing)** to join the group of amazing people making this project possible: +Check out the [contributing wiki](https://github.com/pion/webrtc/wiki/Contributing) to join the group of amazing people making this project possible ### License MIT License - see [LICENSE](LICENSE) for full text diff --git a/vendor/github.com/pion/rtp/abscapturetimeextension.go b/vendor/github.com/pion/rtp/abscapturetimeextension.go new file mode 100644 index 000000000..5e96cffb2 --- /dev/null +++ b/vendor/github.com/pion/rtp/abscapturetimeextension.go @@ -0,0 +1,106 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package rtp + +import ( + "encoding/binary" + "time" +) + +const ( + absCaptureTimeExtensionSize = 8 + absCaptureTimeExtendedExtensionSize = 16 +) + +// AbsCaptureTimeExtension is a extension payload format in +// http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | ID | len=7 | absolute capture timestamp (bit 0-23) | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | absolute capture timestamp (bit 24-55) | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | ... (56-63) | +// +-+-+-+-+-+-+-+-+ +type AbsCaptureTimeExtension struct { + Timestamp uint64 + EstimatedCaptureClockOffset *int64 +} + +// Marshal serializes the members to buffer. +func (t AbsCaptureTimeExtension) Marshal() ([]byte, error) { + if t.EstimatedCaptureClockOffset != nil { + buf := make([]byte, 16) + binary.BigEndian.PutUint64(buf[0:8], t.Timestamp) + binary.BigEndian.PutUint64(buf[8:16], uint64(*t.EstimatedCaptureClockOffset)) + return buf, nil + } + buf := make([]byte, 8) + binary.BigEndian.PutUint64(buf[0:8], t.Timestamp) + return buf, nil +} + +// Unmarshal parses the passed byte slice and stores the result in the members. +func (t *AbsCaptureTimeExtension) Unmarshal(rawData []byte) error { + if len(rawData) < absCaptureTimeExtensionSize { + return errTooSmall + } + t.Timestamp = binary.BigEndian.Uint64(rawData[0:8]) + if len(rawData) >= absCaptureTimeExtendedExtensionSize { + offset := int64(binary.BigEndian.Uint64(rawData[8:16])) + t.EstimatedCaptureClockOffset = &offset + } + return nil +} + +// CaptureTime produces the estimated time.Time represented by this extension. +func (t AbsCaptureTimeExtension) CaptureTime() time.Time { + return toTime(t.Timestamp) +} + +// EstimatedCaptureClockOffsetDuration produces the estimated time.Duration represented by this extension. +func (t AbsCaptureTimeExtension) EstimatedCaptureClockOffsetDuration() *time.Duration { + if t.EstimatedCaptureClockOffset == nil { + return nil + } + offset := *t.EstimatedCaptureClockOffset + negative := false + if offset < 0 { + offset = -offset + negative = true + } + duration := time.Duration(offset/(1<<32))*time.Second + time.Duration((offset&0xFFFFFFFF)*1e9/(1<<32))*time.Nanosecond + if negative { + duration = -duration + } + return &duration +} + +// NewAbsCaptureTimeExtension makes new AbsCaptureTimeExtension from time.Time. +func NewAbsCaptureTimeExtension(captureTime time.Time) *AbsCaptureTimeExtension { + return &AbsCaptureTimeExtension{ + Timestamp: toNtpTime(captureTime), + } +} + +// NewAbsCaptureTimeExtensionWithCaptureClockOffset makes new AbsCaptureTimeExtension from time.Time and a clock offset. +func NewAbsCaptureTimeExtensionWithCaptureClockOffset(captureTime time.Time, captureClockOffset time.Duration) *AbsCaptureTimeExtension { + ns := captureClockOffset.Nanoseconds() + negative := false + if ns < 0 { + ns = -ns + negative = true + } + lsb := (ns / 1e9) & 0xFFFFFFFF + msb := (((ns % 1e9) * (1 << 32)) / 1e9) & 0xFFFFFFFF + offset := (lsb << 32) | msb + if negative { + offset = -offset + } + return &AbsCaptureTimeExtension{ + Timestamp: toNtpTime(captureTime), + EstimatedCaptureClockOffset: &offset, + } +} diff --git a/vendor/github.com/pion/rtp/abssendtimeextension.go b/vendor/github.com/pion/rtp/abssendtimeextension.go index f0c6de375..fff38e983 100644 --- a/vendor/github.com/pion/rtp/abssendtimeextension.go +++ b/vendor/github.com/pion/rtp/abssendtimeextension.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtp import ( diff --git a/vendor/github.com/pion/rtp/audiolevelextension.go b/vendor/github.com/pion/rtp/audiolevelextension.go index ca44f2870..f180c8d62 100644 --- a/vendor/github.com/pion/rtp/audiolevelextension.go +++ b/vendor/github.com/pion/rtp/audiolevelextension.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtp import ( diff --git a/vendor/github.com/pion/rtp/codecov.yml b/vendor/github.com/pion/rtp/codecov.yml index 085200a48..263e4d45c 100644 --- a/vendor/github.com/pion/rtp/codecov.yml +++ b/vendor/github.com/pion/rtp/codecov.yml @@ -3,6 +3,8 @@ # # It is automatically copied from https://github.com/pion/.goassets repository. # +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT coverage: status: diff --git a/vendor/github.com/pion/rtp/pkg/obu/leb128.go b/vendor/github.com/pion/rtp/codecs/av1/obu/leb128.go similarity index 74% rename from vendor/github.com/pion/rtp/pkg/obu/leb128.go rename to vendor/github.com/pion/rtp/codecs/av1/obu/leb128.go index 988a8f442..f5fcbf651 100644 --- a/vendor/github.com/pion/rtp/pkg/obu/leb128.go +++ b/vendor/github.com/pion/rtp/codecs/av1/obu/leb128.go @@ -1,4 +1,7 @@ -// Package obu implements tools for working with the "Open Bitstream Unit" +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package obu implements tools for working with the Open Bitstream Unit. package obu import "errors" @@ -64,3 +67,19 @@ func ReadLeb128(in []byte) (uint, uint, error) { return 0, 0, ErrFailedToReadLEB128 } + +// WriteToLeb128 writes a uint to a LEB128 encoded byte slice. +func WriteToLeb128(in uint) []byte { + b := make([]byte, 10) + + for i := 0; i < len(b); i++ { + b[i] = byte(in & 0x7f) + in >>= 7 + if in == 0 { + return b[:i+1] + } + b[i] |= 0x80 + } + + return b // unreachable +} diff --git a/vendor/github.com/pion/rtp/codecs/av1_packet.go b/vendor/github.com/pion/rtp/codecs/av1_packet.go index 120a904c1..bcea6905d 100644 --- a/vendor/github.com/pion/rtp/codecs/av1_packet.go +++ b/vendor/github.com/pion/rtp/codecs/av1_packet.go @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package codecs import ( - "github.com/pion/rtp/pkg/obu" + "github.com/pion/rtp/codecs/av1/obu" ) const ( @@ -17,64 +20,91 @@ const ( nMask = byte(0b00001000) nBitshift = 3 + obuFrameTypeMask = byte(0b01111000) + obuFrameTypeBitshift = 3 + + obuFameTypeSequenceHeader = 1 + av1PayloaderHeadersize = 1 + + leb128Size = 1 ) // AV1Payloader payloads AV1 packets -type AV1Payloader struct{} +type AV1Payloader struct { + sequenceHeader []byte +} // Payload fragments a AV1 packet across one or more byte arrays // See AV1Packet for description of AV1 Payload Header func (p *AV1Payloader) Payload(mtu uint16, payload []byte) (payloads [][]byte) { - maxFragmentSize := int(mtu) - av1PayloaderHeadersize - 2 - payloadDataRemaining := len(payload) payloadDataIndex := 0 + payloadDataRemaining := len(payload) - // Make sure the fragment/payload size is correct - if min(maxFragmentSize, payloadDataRemaining) <= 0 { + // Payload Data and MTU is non-zero + if mtu <= 0 || payloadDataRemaining <= 0 { return payloads } + // Cache Sequence Header and packetize with next payload + frameType := (payload[0] & obuFrameTypeMask) >> obuFrameTypeBitshift + if frameType == obuFameTypeSequenceHeader { + p.sequenceHeader = payload + return + } + for payloadDataRemaining > 0 { - currentFragmentSize := min(maxFragmentSize, payloadDataRemaining) - leb128Size := 1 - if currentFragmentSize >= 127 { - leb128Size = 2 + obuCount := byte(1) + metadataSize := av1PayloaderHeadersize + if len(p.sequenceHeader) != 0 { + obuCount++ + metadataSize += leb128Size + len(p.sequenceHeader) } - out := make([]byte, av1PayloaderHeadersize+leb128Size+currentFragmentSize) - leb128Value := obu.EncodeLEB128(uint(currentFragmentSize)) - if leb128Size == 1 { - out[1] = byte(leb128Value) - } else { - out[1] = byte(leb128Value >> 8) - out[2] = byte(leb128Value) + out := make([]byte, min(int(mtu), payloadDataRemaining+metadataSize)) + outOffset := av1PayloaderHeadersize + out[0] = obuCount << wBitshift + + if obuCount == 2 { + // This Payload contain the start of a Coded Video Sequence + out[0] ^= nMask + + out[1] = byte(obu.EncodeLEB128(uint(len(p.sequenceHeader)))) + copy(out[2:], p.sequenceHeader) + + outOffset += leb128Size + len(p.sequenceHeader) + + p.sequenceHeader = nil } - copy(out[av1PayloaderHeadersize+leb128Size:], payload[payloadDataIndex:payloadDataIndex+currentFragmentSize]) - payloads = append(payloads, out) + outBufferRemaining := len(out) - outOffset + copy(out[outOffset:], payload[payloadDataIndex:payloadDataIndex+outBufferRemaining]) + payloadDataRemaining -= outBufferRemaining + payloadDataIndex += outBufferRemaining - payloadDataRemaining -= currentFragmentSize - payloadDataIndex += currentFragmentSize - - if len(payloads) > 1 { + // Does this Fragment contain an OBU that started in a previous payload + if len(payloads) > 0 { out[0] ^= zMask } + + // This OBU will be continued in next Payload if payloadDataRemaining != 0 { out[0] ^= yMask } + + payloads = append(payloads, out) } return payloads } // AV1Packet represents a depacketized AV1 RTP Packet -// -// 0 1 2 3 4 5 6 7 -// +-+-+-+-+-+-+-+-+ -// |Z|Y| W |N|-|-|-| -// +-+-+-+-+-+-+-+-+ -// +/* +* 0 1 2 3 4 5 6 7 +* +-+-+-+-+-+-+-+-+ +* |Z|Y| W |N|-|-|-| +* +-+-+-+-+-+-+-+-+ +**/ // https://aomediacodec.github.io/av1-rtp-spec/#44-av1-aggregation-header type AV1Packet struct { // Z: MUST be set to 1 if the first OBU element is an @@ -104,6 +134,8 @@ type AV1Packet struct { // Each AV1 RTP Packet is a collection of OBU Elements. Each OBU Element may be a full OBU, or just a fragment of one. // AV1Frame provides the tools to construct a collection of OBUs from a collection of OBU Elements OBUElements [][]byte + + videoDepacketizer } // Unmarshal parses the passed byte slice and stores the result in the AV1Packet this method is called upon @@ -123,13 +155,26 @@ func (p *AV1Packet) Unmarshal(payload []byte) ([]byte, error) { return nil, errIsKeyframeAndFragment } - currentIndex := uint(1) - p.OBUElements = [][]byte{} + if !p.zeroAllocation { + obuElements, err := p.parseBody(payload[1:]) + if err != nil { + return nil, err + } + p.OBUElements = obuElements + } - var ( - obuElementLength, bytesRead uint - err error - ) + return payload[1:], nil +} + +func (p *AV1Packet) parseBody(payload []byte) ([][]byte, error) { + if p.OBUElements != nil { + return p.OBUElements, nil + } + + obuElements := [][]byte{} + + var obuElementLength, bytesRead uint + currentIndex := uint(0) for i := 1; ; i++ { if currentIndex == uint(len(payload)) { break @@ -140,6 +185,7 @@ func (p *AV1Packet) Unmarshal(payload []byte) ([]byte, error) { bytesRead = 0 obuElementLength = uint(len(payload)) - currentIndex } else { + var err error obuElementLength, bytesRead, err = obu.ReadLeb128(payload[currentIndex:]) if err != nil { return nil, err @@ -150,9 +196,9 @@ func (p *AV1Packet) Unmarshal(payload []byte) ([]byte, error) { if uint(len(payload)) < currentIndex+obuElementLength { return nil, errShortPacket } - p.OBUElements = append(p.OBUElements, payload[currentIndex:currentIndex+obuElementLength]) + obuElements = append(obuElements, payload[currentIndex:currentIndex+obuElementLength]) currentIndex += obuElementLength } - return payload[1:], nil + return obuElements, nil } diff --git a/vendor/github.com/pion/rtp/codecs/codecs.go b/vendor/github.com/pion/rtp/codecs/codecs.go index 0e078974e..cd1c89150 100644 --- a/vendor/github.com/pion/rtp/codecs/codecs.go +++ b/vendor/github.com/pion/rtp/codecs/codecs.go @@ -1,2 +1,5 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + // Package codecs implements codec specific RTP payloader/depayloaders package codecs diff --git a/vendor/github.com/pion/rtp/codecs/common.go b/vendor/github.com/pion/rtp/codecs/common.go index af5632ac7..e807a0ac5 100644 --- a/vendor/github.com/pion/rtp/codecs/common.go +++ b/vendor/github.com/pion/rtp/codecs/common.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package codecs func min(a, b int) int { @@ -10,17 +13,27 @@ func min(a, b int) int { // audioDepacketizer is a mixin for audio codec depacketizers type audioDepacketizer struct{} -func (d *audioDepacketizer) IsPartitionTail(marker bool, payload []byte) bool { +func (d *audioDepacketizer) IsPartitionTail(_ bool, _ []byte) bool { return true } -func (d *audioDepacketizer) IsPartitionHead(payload []byte) bool { +func (d *audioDepacketizer) IsPartitionHead(_ []byte) bool { return true } // videoDepacketizer is a mixin for video codec depacketizers -type videoDepacketizer struct{} +type videoDepacketizer struct { + zeroAllocation bool +} -func (d *videoDepacketizer) IsPartitionTail(marker bool, payload []byte) bool { +func (d *videoDepacketizer) IsPartitionTail(marker bool, _ []byte) bool { return marker } + +// SetZeroAllocation enables Zero Allocation mode for the depacketizer +// By default the Depacketizers will allocate as they parse. These allocations +// are needed for Metadata and other optional values. If you don't need this information +// enabling SetZeroAllocation gives you higher performance at a reduced feature set. +func (d *videoDepacketizer) SetZeroAllocation(zeroAllocation bool) { + d.zeroAllocation = zeroAllocation +} diff --git a/vendor/github.com/pion/rtp/codecs/error.go b/vendor/github.com/pion/rtp/codecs/error.go index 7f72e7b8e..2083ef4d8 100644 --- a/vendor/github.com/pion/rtp/codecs/error.go +++ b/vendor/github.com/pion/rtp/codecs/error.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package codecs import "errors" diff --git a/vendor/github.com/pion/rtp/codecs/g711_packet.go b/vendor/github.com/pion/rtp/codecs/g711_packet.go index 7ab68b2c3..4afda55ec 100644 --- a/vendor/github.com/pion/rtp/codecs/g711_packet.go +++ b/vendor/github.com/pion/rtp/codecs/g711_packet.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package codecs // G711Payloader payloads G711 packets diff --git a/vendor/github.com/pion/rtp/codecs/g722_packet.go b/vendor/github.com/pion/rtp/codecs/g722_packet.go index 13e17b674..ae6672d9c 100644 --- a/vendor/github.com/pion/rtp/codecs/g722_packet.go +++ b/vendor/github.com/pion/rtp/codecs/g722_packet.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package codecs // G722Payloader payloads G722 packets diff --git a/vendor/github.com/pion/rtp/codecs/h264_packet.go b/vendor/github.com/pion/rtp/codecs/h264_packet.go index 11a82fe40..3021fc0fc 100644 --- a/vendor/github.com/pion/rtp/codecs/h264_packet.go +++ b/vendor/github.com/pion/rtp/codecs/h264_packet.go @@ -1,6 +1,10 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package codecs import ( + "bytes" "encoding/binary" "fmt" ) @@ -31,40 +35,32 @@ const ( outputStapAHeader = 0x78 ) -func annexbNALUStartCode() []byte { return []byte{0x00, 0x00, 0x00, 0x01} } +// nolint:gochecknoglobals +var ( + naluStartCode = []byte{0x00, 0x00, 0x01} + annexbNALUStartCode = []byte{0x00, 0x00, 0x00, 0x01} +) func emitNalus(nals []byte, emit func([]byte)) { - nextInd := func(nalu []byte, start int) (indStart int, indLen int) { - zeroCount := 0 + start := 0 + length := len(nals) - for i, b := range nalu[start:] { - if b == 0 { - zeroCount++ - continue - } else if b == 1 { - if zeroCount >= 2 { - return start + i - zeroCount, zeroCount + 1 - } - } - zeroCount = 0 + for start < length { + end := bytes.Index(nals[start:], annexbNALUStartCode) + offset := 4 + if end == -1 { + end = bytes.Index(nals[start:], naluStartCode) + offset = 3 + } + if end == -1 { + emit(nals[start:]) + break } - return -1, -1 - } - nextIndStart, nextIndLen := nextInd(nals, 0) - if nextIndStart == -1 { - emit(nals) - } else { - for nextIndStart != -1 { - prevStart := nextIndStart + nextIndLen - nextIndStart, nextIndLen = nextInd(nals, prevStart) - if nextIndStart != -1 { - emit(nals[prevStart:nextIndStart]) - } else { - // Emit until end of stream, no end indicator found - emit(nals[prevStart:]) - } - } + emit(nals[start : start+end]) + + // next NAL start position + start += end + offset } } @@ -137,18 +133,17 @@ func (p *H264Payloader) Payload(mtu uint16, payload []byte) [][]byte { // the FU header. An FU payload MAY have any number of octets and MAY // be empty. - naluData := nalu // According to the RFC, the first octet is skipped due to redundant information - naluDataIndex := 1 - naluDataLength := len(nalu) - naluDataIndex - naluDataRemaining := naluDataLength + naluIndex := 1 + naluLength := len(nalu) - naluIndex + naluRemaining := naluLength - if min(maxFragmentSize, naluDataRemaining) <= 0 { + if min(maxFragmentSize, naluRemaining) <= 0 { return } - for naluDataRemaining > 0 { - currentFragmentSize := min(maxFragmentSize, naluDataRemaining) + for naluRemaining > 0 { + currentFragmentSize := min(maxFragmentSize, naluRemaining) out := make([]byte, fuaHeaderSize+currentFragmentSize) // +---------------+ @@ -166,19 +161,19 @@ func (p *H264Payloader) Payload(mtu uint16, payload []byte) [][]byte { // +---------------+ out[1] = naluType - if naluDataRemaining == naluDataLength { + if naluRemaining == naluLength { // Set start bit out[1] |= 1 << 7 - } else if naluDataRemaining-currentFragmentSize == 0 { + } else if naluRemaining-currentFragmentSize == 0 { // Set end bit out[1] |= 1 << 6 } - copy(out[fuaHeaderSize:], naluData[naluDataIndex:naluDataIndex+currentFragmentSize]) + copy(out[fuaHeaderSize:], nalu[naluIndex:naluIndex+currentFragmentSize]) payloads = append(payloads, out) - naluDataRemaining -= currentFragmentSize - naluDataIndex += currentFragmentSize + naluRemaining -= currentFragmentSize + naluIndex += currentFragmentSize } }) @@ -193,14 +188,16 @@ type H264Packet struct { videoDepacketizer } -func (p *H264Packet) doPackaging(nalu []byte) []byte { +func (p *H264Packet) doPackaging(buf, nalu []byte) []byte { if p.IsAVC { - naluLength := make([]byte, 4) - binary.BigEndian.PutUint32(naluLength, uint32(len(nalu))) - return append(naluLength, nalu...) + buf = binary.BigEndian.AppendUint32(buf, uint32(len(nalu))) + buf = append(buf, nalu...) + return buf } - return append(annexbNALUStartCode(), nalu...) + buf = append(buf, annexbNALUStartCode...) + buf = append(buf, nalu...) + return buf } // IsDetectedFinalPacketInSequence returns true of the packet passed in has the @@ -211,10 +208,16 @@ func (p *H264Packet) IsDetectedFinalPacketInSequence(rtpPacketMarketBit bool) bo // Unmarshal parses the passed byte slice and stores the result in the H264Packet this method is called upon func (p *H264Packet) Unmarshal(payload []byte) ([]byte, error) { - if payload == nil { - return nil, errNilPacket - } else if len(payload) <= 2 { - return nil, fmt.Errorf("%w: %d <= 2", errShortPacket, len(payload)) + if p.zeroAllocation { + return payload, nil + } + + return p.parseBody(payload) +} + +func (p *H264Packet) parseBody(payload []byte) ([]byte, error) { + if len(payload) == 0 { + return nil, fmt.Errorf("%w: %d <=0", errShortPacket, len(payload)) } // NALU Types @@ -222,7 +225,7 @@ func (p *H264Packet) Unmarshal(payload []byte) ([]byte, error) { naluType := payload[0] & naluTypeBitmask switch { case naluType > 0 && naluType < 24: - return p.doPackaging(payload), nil + return p.doPackaging(nil, payload), nil case naluType == stapaNALUType: currOffset := int(stapaHeaderSize) @@ -235,7 +238,7 @@ func (p *H264Packet) Unmarshal(payload []byte) ([]byte, error) { return nil, fmt.Errorf("%w STAP-A declared size(%d) is larger than buffer(%d)", errShortPacket, naluSize, len(payload)-currOffset) } - result = append(result, p.doPackaging(payload[currOffset:currOffset+naluSize])...) + result = p.doPackaging(result, payload[currOffset:currOffset+naluSize]) currOffset += naluSize } return result, nil @@ -258,7 +261,7 @@ func (p *H264Packet) Unmarshal(payload []byte) ([]byte, error) { nalu := append([]byte{}, naluRefIdc|fragmentedNaluType) nalu = append(nalu, p.fuaBuffer...) p.fuaBuffer = nil - return p.doPackaging(nalu), nil + return p.doPackaging(nil, nalu), nil } return []byte{}, nil @@ -267,9 +270,18 @@ func (p *H264Packet) Unmarshal(payload []byte) ([]byte, error) { return nil, fmt.Errorf("%w: %d", errUnhandledNALUType, naluType) } -// H264PartitionHeadChecker is obsolete +// H264PartitionHeadChecker checks H264 partition head. +// +// Deprecated: replaced by H264Packet.IsPartitionHead() type H264PartitionHeadChecker struct{} +// IsPartitionHead checks if this is the head of a packetized nalu stream. +// +// Deprecated: replaced by H264Packet.IsPartitionHead() +func (*H264PartitionHeadChecker) IsPartitionHead(packet []byte) bool { + return (&H264Packet{}).IsPartitionHead(packet) +} + // IsPartitionHead checks if this is the head of a packetized nalu stream. func (*H264Packet) IsPartitionHead(payload []byte) bool { if len(payload) < 2 { diff --git a/vendor/github.com/pion/rtp/codecs/h265_packet.go b/vendor/github.com/pion/rtp/codecs/h265_packet.go index 6f0490dc6..2a194fdc9 100644 --- a/vendor/github.com/pion/rtp/codecs/h265_packet.go +++ b/vendor/github.com/pion/rtp/codecs/h265_packet.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package codecs import ( @@ -32,11 +35,13 @@ const ( // H265NALUHeader is a H265 NAL Unit Header // https://datatracker.ietf.org/doc/html/rfc7798#section-1.1.4 -// +---------------+---------------+ -// |0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7| -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// |F| Type | LayerID | TID | -// +-------------+-----------------+ +/* +* +---------------+---------------+ +* |0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7| +* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +* |F| Type | LayerID | TID | +* +-------------+-----------------+ +**/ type H265NALUHeader uint16 func newH265NALUHeader(highByte, lowByte uint8) H265NALUHeader { @@ -95,18 +100,19 @@ func (h H265NALUHeader) IsPACIPacket() bool { // // H265SingleNALUnitPacket represents a NALU packet, containing exactly one NAL unit. -// 0 1 2 3 -// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// | PayloadHdr | DONL (conditional) | -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// | | -// | NAL unit payload data | -// | | -// | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// | :...OPTIONAL RTP padding | -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// +/* +* 0 1 2 3 +* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +* | PayloadHdr | DONL (conditional) | +* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +* | | +* | NAL unit payload data | +* | | +* | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +* | :...OPTIONAL RTP padding | +* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +**/ // Reference: https://datatracker.ietf.org/doc/html/rfc7798#section-4.4.1 type H265SingleNALUnitPacket struct { // payloadHeader is the header of the H265 packet. @@ -184,19 +190,19 @@ func (p *H265SingleNALUnitPacket) isH265Packet() {} // // H265AggregationUnitFirst represent the First Aggregation Unit in an AP. -// -// 0 1 2 3 -// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// : DONL (conditional) | NALU size | -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// | NALU size | | -// +-+-+-+-+-+-+-+-+ NAL unit | -// | | -// | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// | : -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// +/* +* 0 1 2 3 +* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +* : DONL (conditional) | NALU size | +* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +* | NALU size | | +* +-+-+-+-+-+-+-+-+ NAL unit | +* | | +* | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +* | : +* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +**/ // Reference: https://datatracker.ietf.org/doc/html/rfc7798#section-4.4.2 type H265AggregationUnitFirst struct { donl *uint16 @@ -222,18 +228,18 @@ func (u H265AggregationUnitFirst) NalUnit() []byte { } // H265AggregationUnit represent the an Aggregation Unit in an AP, which is not the first one. -// -// 0 1 2 3 -// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// : DOND (cond) | NALU size | -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// | | -// | NAL unit | -// | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// | : -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// +/* +* 0 1 2 3 +* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +* : DOND (cond) | NALU size | +* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +* | | +* | NAL unit | +* | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +* | : +* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +**/ // Reference: https://datatracker.ietf.org/doc/html/rfc7798#section-4.4.2 type H265AggregationUnit struct { dond *uint8 @@ -259,18 +265,19 @@ func (u H265AggregationUnit) NalUnit() []byte { } // H265AggregationPacket represents an Aggregation packet. -// 0 1 2 3 -// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// | PayloadHdr (Type=48) | | -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | -// | | -// | two or more aggregation units | -// | | -// | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// | :...OPTIONAL RTP padding | -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// +/* +* 0 1 2 3 +* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +* | PayloadHdr (Type=48) | | +* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +* | | +* | two or more aggregation units | +* | | +* | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +* | :...OPTIONAL RTP padding | +* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +**/ // Reference: https://datatracker.ietf.org/doc/html/rfc7798#section-4.4.2 type H265AggregationPacket struct { firstUnit *H265AggregationUnitFirst @@ -395,11 +402,13 @@ const ( ) // H265FragmentationUnitHeader is a H265 FU Header -// +---------------+ -// |0|1|2|3|4|5|6|7| -// +-+-+-+-+-+-+-+-+ -// |S|E| FuType | -// +---------------+ +/* +* +---------------+ +* |0|1|2|3|4|5|6|7| +* +-+-+-+-+-+-+-+-+ +* |S|E| FuType | +* +---------------+ +**/ type H265FragmentationUnitHeader uint8 // S represents the start of a fragmented NAL unit. @@ -421,20 +430,20 @@ func (h H265FragmentationUnitHeader) FuType() uint8 { } // H265FragmentationUnitPacket represents a single Fragmentation Unit packet. -// -// 0 1 2 3 -// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// | PayloadHdr (Type=49) | FU header | DONL (cond) | -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| -// | DONL (cond) | | -// |-+-+-+-+-+-+-+-+ | -// | FU payload | -// | | -// | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// | :...OPTIONAL RTP padding | -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// +/* +* 0 1 2 3 +* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +* | PayloadHdr (Type=49) | FU header | DONL (cond) | +* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| +* | DONL (cond) | | +* |-+-+-+-+-+-+-+-+ | +* | FU payload | +* | | +* | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +* | :...OPTIONAL RTP padding | +* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +**/ // Reference: https://datatracker.ietf.org/doc/html/rfc7798#section-4.4.3 type H265FragmentationUnitPacket struct { // payloadHeader is the header of the H265 packet. @@ -521,22 +530,22 @@ func (p *H265FragmentationUnitPacket) isH265Packet() {} // // H265PACIPacket represents a single H265 PACI packet. -// -// 0 1 2 3 -// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// | PayloadHdr (Type=50) |A| cType | PHSsize |F0..2|Y| -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// | Payload Header Extension Structure (PHES) | -// |=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=| -// | | -// | PACI payload: NAL unit | -// | . . . | -// | | -// | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// | :...OPTIONAL RTP padding | -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// +/* +* 0 1 2 3 +* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +* | PayloadHdr (Type=50) |A| cType | PHSsize |F0..2|Y| +* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +* | Payload Header Extension Structure (PHES) | +* |=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=| +* | | +* | PACI payload: NAL unit | +* | . . . | +* | | +* | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +* | :...OPTIONAL RTP padding | +* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +**/ // Reference: https://datatracker.ietf.org/doc/html/rfc7798#section-4.4.4 type H265PACIPacket struct { // payloadHeader is the header of the H265 packet. diff --git a/vendor/github.com/pion/rtp/codecs/opus_packet.go b/vendor/github.com/pion/rtp/codecs/opus_packet.go index cd5ea332d..00ee9035f 100644 --- a/vendor/github.com/pion/rtp/codecs/opus_packet.go +++ b/vendor/github.com/pion/rtp/codecs/opus_packet.go @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package codecs // OpusPayloader payloads Opus packets type OpusPayloader struct{} // Payload fragments an Opus packet across one or more byte arrays -func (p *OpusPayloader) Payload(mtu uint16, payload []byte) [][]byte { +func (p *OpusPayloader) Payload(_ uint16, payload []byte) [][]byte { if payload == nil { return [][]byte{} } @@ -33,5 +36,14 @@ func (p *OpusPacket) Unmarshal(packet []byte) ([]byte, error) { return packet, nil } -// OpusPartitionHeadChecker is obsolete +// OpusPartitionHeadChecker checks Opus partition head. +// +// Deprecated: replaced by OpusPacket.IsPartitionHead() type OpusPartitionHeadChecker struct{} + +// IsPartitionHead checks whether if this is a head of the Opus partition. +// +// Deprecated: replaced by OpusPacket.IsPartitionHead() +func (*OpusPartitionHeadChecker) IsPartitionHead(packet []byte) bool { + return (&OpusPacket{}).IsPartitionHead(packet) +} diff --git a/vendor/github.com/pion/rtp/codecs/vp8_packet.go b/vendor/github.com/pion/rtp/codecs/vp8_packet.go index cd8692904..4ddd15bc8 100644 --- a/vendor/github.com/pion/rtp/codecs/vp8_packet.go +++ b/vendor/github.com/pion/rtp/codecs/vp8_packet.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package codecs // VP8Payloader payloads VP8 packets @@ -120,19 +123,18 @@ type VP8Packet struct { } // Unmarshal parses the passed byte slice and stores the result in the VP8Packet this method is called upon -func (p *VP8Packet) Unmarshal(payload []byte) ([]byte, error) { +func (p *VP8Packet) Unmarshal(payload []byte) ([]byte, error) { //nolint: gocognit if payload == nil { return nil, errNilPacket } payloadLen := len(payload) - if payloadLen < 4 { - return nil, errShortPacket - } - payloadIndex := 0 + if payloadIndex >= payloadLen { + return nil, errShortPacket + } p.X = (payload[payloadIndex] & 0x80) >> 7 p.N = (payload[payloadIndex] & 0x20) >> 5 p.S = (payload[payloadIndex] & 0x10) >> 4 @@ -141,57 +143,88 @@ func (p *VP8Packet) Unmarshal(payload []byte) ([]byte, error) { payloadIndex++ if p.X == 1 { + if payloadIndex >= payloadLen { + return nil, errShortPacket + } p.I = (payload[payloadIndex] & 0x80) >> 7 p.L = (payload[payloadIndex] & 0x40) >> 6 p.T = (payload[payloadIndex] & 0x20) >> 5 p.K = (payload[payloadIndex] & 0x10) >> 4 payloadIndex++ + } else { + p.I = 0 + p.L = 0 + p.T = 0 + p.K = 0 } if p.I == 1 { // PID present? + if payloadIndex >= payloadLen { + return nil, errShortPacket + } if payload[payloadIndex]&0x80 > 0 { // M == 1, PID is 16bit + if payloadIndex+1 >= payloadLen { + return nil, errShortPacket + } p.PictureID = (uint16(payload[payloadIndex]&0x7F) << 8) | uint16(payload[payloadIndex+1]) payloadIndex += 2 } else { p.PictureID = uint16(payload[payloadIndex]) payloadIndex++ } - } - - if payloadIndex >= payloadLen { - return nil, errShortPacket + } else { + p.PictureID = 0 } if p.L == 1 { + if payloadIndex >= payloadLen { + return nil, errShortPacket + } p.TL0PICIDX = payload[payloadIndex] payloadIndex++ - } - - if payloadIndex >= payloadLen { - return nil, errShortPacket + } else { + p.TL0PICIDX = 0 } if p.T == 1 || p.K == 1 { + if payloadIndex >= payloadLen { + return nil, errShortPacket + } if p.T == 1 { p.TID = payload[payloadIndex] >> 6 p.Y = (payload[payloadIndex] >> 5) & 0x1 + } else { + p.TID = 0 + p.Y = 0 } if p.K == 1 { p.KEYIDX = payload[payloadIndex] & 0x1F + } else { + p.KEYIDX = 0 } payloadIndex++ + } else { + p.TID = 0 + p.Y = 0 + p.KEYIDX = 0 } - if payloadIndex >= payloadLen { - return nil, errShortPacket - } p.Payload = payload[payloadIndex:] return p.Payload, nil } -// VP8PartitionHeadChecker is obsolete +// VP8PartitionHeadChecker checks VP8 partition head +// +// Deprecated: replaced by VP8Packet.IsPartitionHead() type VP8PartitionHeadChecker struct{} +// IsPartitionHead checks whether if this is a head of the VP8 partition. +// +// Deprecated: replaced by VP8Packet.IsPartitionHead() +func (*VP8PartitionHeadChecker) IsPartitionHead(packet []byte) bool { + return (&VP8Packet{}).IsPartitionHead(packet) +} + // IsPartitionHead checks whether if this is a head of the VP8 partition func (*VP8Packet) IsPartitionHead(payload []byte) bool { if len(payload) < 1 { diff --git a/vendor/github.com/pion/rtp/codecs/vp9_packet.go b/vendor/github.com/pion/rtp/codecs/vp9_packet.go index 917e630bb..6a6e0b0de 100644 --- a/vendor/github.com/pion/rtp/codecs/vp9_packet.go +++ b/vendor/github.com/pion/rtp/codecs/vp9_packet.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package codecs import ( @@ -206,13 +209,13 @@ func (p *VP9Packet) Unmarshal(packet []byte) ([]byte, error) { } // Picture ID: -// -// +-+-+-+-+-+-+-+-+ -// I: |M| PICTURE ID | M:0 => picture id is 7 bits. -// +-+-+-+-+-+-+-+-+ M:1 => picture id is 15 bits. -// M: | EXTENDED PID | -// +-+-+-+-+-+-+-+-+ -// +/* +* +-+-+-+-+-+-+-+-+ +* I: |M| PICTURE ID | M:0 => picture id is 7 bits. +* +-+-+-+-+-+-+-+-+ M:1 => picture id is 15 bits. +* M: | EXTENDED PID | +* +-+-+-+-+-+-+-+-+ +**/ func (p *VP9Packet) parsePictureID(packet []byte, pos int) (int, error) { if len(packet) <= pos { return pos, errShortPacket @@ -244,11 +247,11 @@ func (p *VP9Packet) parseLayerInfo(packet []byte, pos int) (int, error) { } // Layer indices (flexible mode): -// -// +-+-+-+-+-+-+-+-+ -// L: | T |U| S |D| -// +-+-+-+-+-+-+-+-+ -// +/* +* +-+-+-+-+-+-+-+-+ +* L: | T |U| S |D| +* +-+-+-+-+-+-+-+-+ +**/ func (p *VP9Packet) parseLayerInfoCommon(packet []byte, pos int) (int, error) { if len(packet) <= pos { return pos, errShortPacket @@ -268,13 +271,13 @@ func (p *VP9Packet) parseLayerInfoCommon(packet []byte, pos int) (int, error) { } // Layer indices (non-flexible mode): -// -// +-+-+-+-+-+-+-+-+ -// L: | T |U| S |D| -// +-+-+-+-+-+-+-+-+ -// | TL0PICIDX | -// +-+-+-+-+-+-+-+-+ -// +/* +* +-+-+-+-+-+-+-+-+ +* L: | T |U| S |D| +* +-+-+-+-+-+-+-+-+ +* | TL0PICIDX | +* +-+-+-+-+-+-+-+-+ +**/ func (p *VP9Packet) parseLayerInfoNonFlexibleMode(packet []byte, pos int) (int, error) { if len(packet) <= pos { return pos, errShortPacket @@ -286,12 +289,12 @@ func (p *VP9Packet) parseLayerInfoNonFlexibleMode(packet []byte, pos int) (int, } // Reference indices: -// -// +-+-+-+-+-+-+-+-+ P=1,F=1: At least one reference index -// P,F: | P_DIFF |N| up to 3 times has to be specified. -// +-+-+-+-+-+-+-+-+ N=1: An additional P_DIFF follows -// current P_DIFF. -// +/* +* +-+-+-+-+-+-+-+-+ P=1,F=1: At least one reference index +* P,F: | P_DIFF |N| up to 3 times has to be specified. +* +-+-+-+-+-+-+-+-+ N=1: An additional P_DIFF follows +* current P_DIFF. +**/ func (p *VP9Packet) parseRefIndices(packet []byte, pos int) (int, error) { for { if len(packet) <= pos { @@ -312,25 +315,25 @@ func (p *VP9Packet) parseRefIndices(packet []byte, pos int) (int, error) { } // Scalability structure (SS): -// -// +-+-+-+-+-+-+-+-+ -// V: | N_S |Y|G|-|-|-| -// +-+-+-+-+-+-+-+-+ -| -// Y: | WIDTH | (OPTIONAL) . -// + + . -// | | (OPTIONAL) . -// +-+-+-+-+-+-+-+-+ . N_S + 1 times -// | HEIGHT | (OPTIONAL) . -// + + . -// | | (OPTIONAL) . -// +-+-+-+-+-+-+-+-+ -| -// G: | N_G | (OPTIONAL) -// +-+-+-+-+-+-+-+-+ -| -// N_G: | T |U| R |-|-| (OPTIONAL) . -// +-+-+-+-+-+-+-+-+ -| . N_G times -// | P_DIFF | (OPTIONAL) . R times . -// +-+-+-+-+-+-+-+-+ -| -| -// +/* +* +-+-+-+-+-+-+-+-+ +* V: | N_S |Y|G|-|-|-| +* +-+-+-+-+-+-+-+-+ -| +* Y: | WIDTH | (OPTIONAL) . +* + . +* | | (OPTIONAL) . +* +-+-+-+-+-+-+-+-+ . N_S + 1 times +* | HEIGHT | (OPTIONAL) . +* + . +* | | (OPTIONAL) . +* +-+-+-+-+-+-+-+-+ -| +* G: | N_G | (OPTIONAL) +* +-+-+-+-+-+-+-+-+ -| +* N_G: | T |U| R |-|-| (OPTIONAL) . +* +-+-+-+-+-+-+-+-+ -| . N_G times +* | P_DIFF | (OPTIONAL) . R times . +* +-+-+-+-+-+-+-+-+ -| -| +**/ func (p *VP9Packet) parseSSData(packet []byte, pos int) (int, error) { if len(packet) <= pos { return pos, errShortPacket @@ -348,6 +351,10 @@ func (p *VP9Packet) parseSSData(packet []byte, pos int) (int, error) { p.Width = make([]uint16, NS) p.Height = make([]uint16, NS) for i := 0; i < int(NS); i++ { + if len(packet) <= (pos + 3) { + return pos, errShortPacket + } + p.Width[i] = uint16(packet[pos])<<8 | uint16(packet[pos+1]) pos += 2 p.Height[i] = uint16(packet[pos])<<8 | uint16(packet[pos+1]) @@ -356,17 +363,30 @@ func (p *VP9Packet) parseSSData(packet []byte, pos int) (int, error) { } if p.G { + if len(packet) <= pos { + return pos, errShortPacket + } + p.NG = packet[pos] pos++ } for i := 0; i < int(p.NG); i++ { + if len(packet) <= pos { + return pos, errShortPacket + } + p.PGTID = append(p.PGTID, packet[pos]>>5) p.PGU = append(p.PGU, packet[pos]&0x10 != 0) R := (packet[pos] >> 2) & 0x3 pos++ p.PGPDiff = append(p.PGPDiff, []uint8{}) + + if len(packet) <= (pos + int(R) - 1) { + return pos, errShortPacket + } + for j := 0; j < int(R); j++ { p.PGPDiff[i] = append(p.PGPDiff[i], packet[pos]) pos++ @@ -376,9 +396,18 @@ func (p *VP9Packet) parseSSData(packet []byte, pos int) (int, error) { return pos, nil } -// VP9PartitionHeadChecker is obsolete +// VP9PartitionHeadChecker checks VP9 partition head. +// +// Deprecated: replaced by VP9Packet.IsPartitionHead() type VP9PartitionHeadChecker struct{} +// IsPartitionHead checks whether if this is a head of the VP9 partition. +// +// Deprecated: replaced by VP9Packet.IsPartitionHead() +func (*VP9PartitionHeadChecker) IsPartitionHead(packet []byte) bool { + return (&VP9Packet{}).IsPartitionHead(packet) +} + // IsPartitionHead checks whether if this is a head of the VP9 partition func (*VP9Packet) IsPartitionHead(payload []byte) bool { if len(payload) < 1 { diff --git a/vendor/github.com/pion/rtp/depacketizer.go b/vendor/github.com/pion/rtp/depacketizer.go index c66d2e30c..d10ad89b8 100644 --- a/vendor/github.com/pion/rtp/depacketizer.go +++ b/vendor/github.com/pion/rtp/depacketizer.go @@ -1,12 +1,19 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtp // Depacketizer depacketizes a RTP payload, removing any RTP specific data from the payload type Depacketizer interface { + // Unmarshal parses the RTP payload and returns media. + // Metadata may be stored on the Depacketizer itself Unmarshal(packet []byte) ([]byte, error) + // Checks if the packet is at the beginning of a partition. This // should return false if the result could not be determined, in // which case the caller will detect timestamp discontinuities. IsPartitionHead(payload []byte) bool + // Checks if the packet is at the end of a partition. This should // return false if the result could not be determined. IsPartitionTail(marker bool, payload []byte) bool diff --git a/vendor/github.com/pion/rtp/error.go b/vendor/github.com/pion/rtp/error.go index 5458c6fa5..4df5d2a2d 100644 --- a/vendor/github.com/pion/rtp/error.go +++ b/vendor/github.com/pion/rtp/error.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtp import ( diff --git a/vendor/github.com/pion/rtp/header_extension.go b/vendor/github.com/pion/rtp/header_extension.go index c143ac119..fe542151e 100644 --- a/vendor/github.com/pion/rtp/header_extension.go +++ b/vendor/github.com/pion/rtp/header_extension.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtp import ( @@ -46,14 +49,14 @@ func (e *OneByteHeaderExtension) Set(id uint8, buf []byte) error { } extid := e.payload[n] >> 4 - len := int(e.payload[n]&^0xF0 + 1) + payloadLen := int(e.payload[n]&^0xF0 + 1) n++ if extid == id { - e.payload = append(e.payload[:n+1], append(buf, e.payload[n+1+len:]...)...) + e.payload = append(e.payload[:n+1], append(buf, e.payload[n+1+payloadLen:]...)...) return nil } - n += len + n += payloadLen } e.payload = append(e.payload, (id<<4 | uint8(len(buf)-1))) e.payload = append(e.payload, buf...) @@ -71,7 +74,7 @@ func (e *OneByteHeaderExtension) GetIDs() []uint8 { } extid := e.payload[n] >> 4 - len := int(e.payload[n]&^0xF0 + 1) + payloadLen := int(e.payload[n]&^0xF0 + 1) n++ if extid == headerExtensionIDReserved { @@ -79,7 +82,7 @@ func (e *OneByteHeaderExtension) GetIDs() []uint8 { } ids = append(ids, extid) - n += len + n += payloadLen } return ids } @@ -93,13 +96,13 @@ func (e *OneByteHeaderExtension) Get(id uint8) []byte { } extid := e.payload[n] >> 4 - len := int(e.payload[n]&^0xF0 + 1) + payloadLen := int(e.payload[n]&^0xF0 + 1) n++ if extid == id { - return e.payload[n : n+len] + return e.payload[n : n+payloadLen] } - n += len + n += payloadLen } return nil } @@ -113,13 +116,13 @@ func (e *OneByteHeaderExtension) Del(id uint8) error { } extid := e.payload[n] >> 4 - len := int(e.payload[n]&^0xF0 + 1) + payloadLen := int(e.payload[n]&^0xF0 + 1) if extid == id { - e.payload = append(e.payload[:n], e.payload[n+1+len:]...) + e.payload = append(e.payload[:n], e.payload[n+1+payloadLen:]...) return nil } - n += len + 1 + n += payloadLen + 1 } return errHeaderExtensionNotFound } @@ -176,14 +179,14 @@ func (e *TwoByteHeaderExtension) Set(id uint8, buf []byte) error { extid := e.payload[n] n++ - len := int(e.payload[n]) + payloadLen := int(e.payload[n]) n++ if extid == id { - e.payload = append(e.payload[:n+2], append(buf, e.payload[n+2+len:]...)...) + e.payload = append(e.payload[:n+2], append(buf, e.payload[n+2+payloadLen:]...)...) return nil } - n += len + n += payloadLen } e.payload = append(e.payload, id, uint8(len(buf))) e.payload = append(e.payload, buf...) @@ -203,11 +206,11 @@ func (e *TwoByteHeaderExtension) GetIDs() []uint8 { extid := e.payload[n] n++ - len := int(e.payload[n]) + payloadLen := int(e.payload[n]) n++ ids = append(ids, extid) - n += len + n += payloadLen } return ids } @@ -223,13 +226,13 @@ func (e *TwoByteHeaderExtension) Get(id uint8) []byte { extid := e.payload[n] n++ - len := int(e.payload[n]) + payloadLen := int(e.payload[n]) n++ if extid == id { - return e.payload[n : n+len] + return e.payload[n : n+payloadLen] } - n += len + n += payloadLen } return nil } @@ -244,13 +247,13 @@ func (e *TwoByteHeaderExtension) Del(id uint8) error { extid := e.payload[n] - len := int(e.payload[n+1]) + payloadLen := int(e.payload[n+1]) if extid == id { - e.payload = append(e.payload[:n], e.payload[n+2+len:]...) + e.payload = append(e.payload[:n], e.payload[n+2+payloadLen:]...) return nil } - n += len + 2 + n += payloadLen + 2 } return errHeaderExtensionNotFound } diff --git a/vendor/github.com/pion/rtp/packet.go b/vendor/github.com/pion/rtp/packet.go index b3ae12400..af88af3e9 100644 --- a/vendor/github.com/pion/rtp/packet.go +++ b/vendor/github.com/pion/rtp/packet.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtp import ( @@ -25,6 +28,9 @@ type Header struct { CSRC []uint32 ExtensionProfile uint16 Extensions []Extension + + // Deprecated: will be removed in a future version. + PayloadOffset int } // Packet represents an RTP Packet @@ -32,6 +38,9 @@ type Packet struct { Header Payload []byte PaddingSize byte + + // Deprecated: will be removed in a future version. + Raw []byte } const ( @@ -140,68 +149,60 @@ func (h *Header) Unmarshal(buf []byte) (n int, err error) { //nolint:gocognit n += 2 extensionLength := int(binary.BigEndian.Uint16(buf[n:])) * 4 n += 2 + extensionEnd := n + extensionLength - if expected := n + extensionLength; len(buf) < expected { - return n, fmt.Errorf("size %d < %d: %w", - len(buf), expected, - errHeaderSizeInsufficientForExtension, - ) + if len(buf) < extensionEnd { + return n, fmt.Errorf("size %d < %d: %w", len(buf), extensionEnd, errHeaderSizeInsufficientForExtension) } - switch h.ExtensionProfile { - // RFC 8285 RTP One Byte Header Extension - case extensionProfileOneByte: - end := n + extensionLength - for n < end { + if h.ExtensionProfile == extensionProfileOneByte || h.ExtensionProfile == extensionProfileTwoByte { + var ( + extid uint8 + payloadLen int + ) + + for n < extensionEnd { if buf[n] == 0x00 { // padding n++ continue } - extid := buf[n] >> 4 - len := int(buf[n]&^0xF0 + 1) - n++ - - if extid == extensionIDReserved { - break - } - - extension := Extension{id: extid, payload: buf[n : n+len]} - h.Extensions = append(h.Extensions, extension) - n += len - } - - // RFC 8285 RTP Two Byte Header Extension - case extensionProfileTwoByte: - end := n + extensionLength - for n < end { - if buf[n] == 0x00 { // padding + if h.ExtensionProfile == extensionProfileOneByte { + extid = buf[n] >> 4 + payloadLen = int(buf[n]&^0xF0 + 1) + n++ + + if extid == extensionIDReserved { + break + } + } else { + extid = buf[n] + n++ + + if len(buf) <= n { + return n, fmt.Errorf("size %d < %d: %w", len(buf), n, errHeaderSizeInsufficientForExtension) + } + + payloadLen = int(buf[n]) n++ - continue } - extid := buf[n] - n++ + if extensionPayloadEnd := n + payloadLen; len(buf) <= extensionPayloadEnd { + return n, fmt.Errorf("size %d < %d: %w", len(buf), extensionPayloadEnd, errHeaderSizeInsufficientForExtension) + } - len := int(buf[n]) - n++ - - extension := Extension{id: extid, payload: buf[n : n+len]} + extension := Extension{id: extid, payload: buf[n : n+payloadLen]} h.Extensions = append(h.Extensions, extension) - n += len + n += payloadLen } - - default: // RFC3550 Extension - if len(buf) < n+extensionLength { - return n, fmt.Errorf("%w: %d < %d", - errHeaderSizeInsufficientForExtension, len(buf), n+extensionLength) - } - - extension := Extension{id: 0, payload: buf[n : n+extensionLength]} + } else { + // RFC3550 Extension + extension := Extension{id: 0, payload: buf[n:extensionEnd]} h.Extensions = append(h.Extensions, extension) n += len(h.Extensions[0].payload) } } + return n, nil } @@ -211,6 +212,7 @@ func (p *Packet) Unmarshal(buf []byte) error { if err != nil { return err } + end := len(buf) if p.Header.Padding { p.PaddingSize = buf[end-1] @@ -219,7 +221,9 @@ func (p *Packet) Unmarshal(buf []byte) error { if end < n { return errTooSmall } + p.Payload = buf[n:end] + return nil } @@ -231,6 +235,7 @@ func (h Header) Marshal() (buf []byte, err error) { if err != nil { return nil, err } + return buf[:n], nil } @@ -401,10 +406,10 @@ func (h *Header) SetExtension(id uint8, payload []byte) error { //nolint:gocogni // No existing header extensions h.Extension = true - switch len := len(payload); { - case len <= 16: + switch payloadLen := len(payload); { + case payloadLen <= 16: h.ExtensionProfile = extensionProfileOneByte - case len > 16 && len < 256: + case payloadLen > 16 && payloadLen < 256: h.ExtensionProfile = extensionProfileTwoByte } @@ -469,8 +474,7 @@ func (p Packet) Marshal() (buf []byte, err error) { } // MarshalTo serializes the packet and writes to the buffer. -func (p Packet) MarshalTo(buf []byte) (n int, err error) { - p.Header.Padding = p.PaddingSize != 0 +func (p *Packet) MarshalTo(buf []byte) (n int, err error) { n, err = p.Header.MarshalTo(buf) if err != nil { return 0, err @@ -482,6 +486,7 @@ func (p Packet) MarshalTo(buf []byte) (n int, err error) { } m := copy(buf[n:], p.Payload) + if p.Header.Padding { buf[n+m+int(p.PaddingSize-1)] = p.PaddingSize } diff --git a/vendor/github.com/pion/rtp/packetizer.go b/vendor/github.com/pion/rtp/packetizer.go index 19f6c756d..7a6a46db3 100644 --- a/vendor/github.com/pion/rtp/packetizer.go +++ b/vendor/github.com/pion/rtp/packetizer.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtp import ( @@ -12,18 +15,22 @@ type Payloader interface { // Packetizer packetizes a payload type Packetizer interface { Packetize(payload []byte, samples uint32) []*Packet + GeneratePadding(samples uint32) []*Packet EnableAbsSendTime(value int) SkipSamples(skippedSamples uint32) } type packetizer struct { - MTU uint16 - PayloadType uint8 - SSRC uint32 - Payloader Payloader - Sequencer Sequencer - Timestamp uint32 - ClockRate uint32 + MTU uint16 + PayloadType uint8 + SSRC uint32 + Payloader Payloader + Sequencer Sequencer + Timestamp uint32 + + // Deprecated: will be removed in a future version. + ClockRate uint32 + extensionNumbers struct { // put extension numbers in here. If they're 0, the extension is disabled (0 is not a legal extension number) AbsSendTime int // http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time } @@ -69,6 +76,7 @@ func (p *packetizer) Packetize(payload []byte, samples uint32) []*Packet { SequenceNumber: p.Sequencer.NextSequenceNumber(), Timestamp: p.Timestamp, // Figure out how to do timestamps SSRC: p.SSRC, + CSRC: []uint32{}, }, Payload: pp, } @@ -91,6 +99,38 @@ func (p *packetizer) Packetize(payload []byte, samples uint32) []*Packet { return packets } +// GeneratePadding returns required padding-only packages +func (p *packetizer) GeneratePadding(samples uint32) []*Packet { + // Guard against an empty payload + if samples == 0 { + return nil + } + + packets := make([]*Packet, samples) + + for i := 0; i < int(samples); i++ { + pp := make([]byte, 255) + pp[254] = 255 + + packets[i] = &Packet{ + Header: Header{ + Version: 2, + Padding: true, + Extension: false, + Marker: false, + PayloadType: p.PayloadType, + SequenceNumber: p.Sequencer.NextSequenceNumber(), + Timestamp: p.Timestamp, // Use latest timestamp + SSRC: p.SSRC, + CSRC: []uint32{}, + }, + Payload: pp, + } + } + + return packets +} + // SkipSamples causes a gap in sample count between Packetize requests so the // RTP payloads produced have a gap in timestamps func (p *packetizer) SkipSamples(skippedSamples uint32) { diff --git a/vendor/github.com/pion/rtp/partitionheadchecker.go b/vendor/github.com/pion/rtp/partitionheadchecker.go index 6ec2a7631..6f05aa5a4 100644 --- a/vendor/github.com/pion/rtp/partitionheadchecker.go +++ b/vendor/github.com/pion/rtp/partitionheadchecker.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtp // PartitionHeadChecker is the interface that checks whether the packet is keyframe or not diff --git a/vendor/github.com/pion/rtp/payload_types.go b/vendor/github.com/pion/rtp/payload_types.go new file mode 100644 index 000000000..a9bf2272a --- /dev/null +++ b/vendor/github.com/pion/rtp/payload_types.go @@ -0,0 +1,68 @@ +// SPDX-FileCopyrightText: 2024 The Pion community +// SPDX-License-Identifier: MIT + +package rtp + +// https://www.iana.org/assignments/rtp-parameters/rtp-parameters.xhtml +// https://en.wikipedia.org/wiki/RTP_payload_formats + +// Audio Payload Types as defined in https://www.iana.org/assignments/rtp-parameters/rtp-parameters.xhtml +const ( + // PayloadTypePCMU is a payload type for ITU-T G.711 PCM μ-Law audio 64 kbit/s (RFC 3551). + PayloadTypePCMU = 0 + // PayloadTypeGSM is a payload type for European GSM Full Rate audio 13 kbit/s (GSM 06.10). + PayloadTypeGSM = 3 + // PayloadTypeG723 is a payload type for ITU-T G.723.1 audio (RFC 3551). + PayloadTypeG723 = 4 + // PayloadTypeDVI4_8000 is a payload type for IMA ADPCM audio 32 kbit/s (RFC 3551). + PayloadTypeDVI4_8000 = 5 + // PayloadTypeDVI4_16000 is a payload type for IMA ADPCM audio 64 kbit/s (RFC 3551). + PayloadTypeDVI4_16000 = 6 + // PayloadTypeLPC is a payload type for Experimental Linear Predictive Coding audio 5.6 kbit/s (RFC 3551). + PayloadTypeLPC = 7 + // PayloadTypePCMA is a payload type for ITU-T G.711 PCM A-Law audio 64 kbit/s (RFC 3551). + PayloadTypePCMA = 8 + // PayloadTypeG722 is a payload type for ITU-T G.722 audio 64 kbit/s (RFC 3551). + PayloadTypeG722 = 9 + // PayloadTypeL16Stereo is a payload type for Linear PCM 16-bit Stereo audio 1411.2 kbit/s, uncompressed (RFC 3551). + PayloadTypeL16Stereo = 10 + // PayloadTypeL16Mono is a payload type for Linear PCM 16-bit audio 705.6 kbit/s, uncompressed (RFC 3551). + PayloadTypeL16Mono = 11 + // PayloadTypeQCELP is a payload type for Qualcomm Code Excited Linear Prediction (RFC 2658, RFC 3551). + PayloadTypeQCELP = 12 + // PayloadTypeCN is a payload type for Comfort noise (RFC 3389). + PayloadTypeCN = 13 + // PayloadTypeMPA is a payload type for MPEG-1 or MPEG-2 audio only (RFC 3551, RFC 2250). + PayloadTypeMPA = 14 + // PayloadTypeG728 is a payload type for ITU-T G.728 audio 16 kbit/s (RFC 3551). + PayloadTypeG728 = 15 + // PayloadTypeDVI4_11025 is a payload type for IMA ADPCM audio 44.1 kbit/s (RFC 3551). + PayloadTypeDVI4_11025 = 16 + // PayloadTypeDVI4_22050 is a payload type for IMA ADPCM audio 88.2 kbit/s (RFC 3551). + PayloadTypeDVI4_22050 = 17 + // PayloadTypeG729 is a payload type for ITU-T G.729 and G.729a audio 8 kbit/s (RFC 3551, RFC 3555). + PayloadTypeG729 = 18 +) + +// Video Payload Types as defined in https://www.iana.org/assignments/rtp-parameters/rtp-parameters.xhtml +const ( + // PayloadTypeCELLB is a payload type for Sun CellB video (RFC 2029). + PayloadTypeCELLB = 25 + // PayloadTypeJPEG is a payload type for JPEG video (RFC 2435). + PayloadTypeJPEG = 26 + // PayloadTypeNV is a payload type for Xerox PARC's Network Video (nv, RFC 3551). + PayloadTypeNV = 28 + // PayloadTypeH261 is a payload type for ITU-T H.261 video (RFC 4587). + PayloadTypeH261 = 31 + // PayloadTypeMPV is a payload type for MPEG-1 and MPEG-2 video (RFC 2250). + PayloadTypeMPV = 32 + // PayloadTypeMP2T is a payload type for MPEG-2 transport stream (RFC 2250). + PayloadTypeMP2T = 33 + // PayloadTypeH263 is a payload type for H.263 video, first version (1996, RFC 3551, RFC 2190). + PayloadTypeH263 = 34 +) + +const ( + // PayloadTypeFirstDynamic is a first non-static payload type. + PayloadTypeFirstDynamic = 35 +) diff --git a/vendor/github.com/pion/rtp/playoutdelayextension.go b/vendor/github.com/pion/rtp/playoutdelayextension.go new file mode 100644 index 000000000..3882731a3 --- /dev/null +++ b/vendor/github.com/pion/rtp/playoutdelayextension.go @@ -0,0 +1,50 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package rtp + +import ( + "encoding/binary" + "errors" +) + +const ( + playoutDelayExtensionSize = 3 + playoutDelayMaxValue = (1 << 12) - 1 +) + +var errPlayoutDelayInvalidValue = errors.New("invalid playout delay value") + +// PlayoutDelayExtension is a extension payload format in +// http://www.webrtc.org/experiments/rtp-hdrext/playout-delay +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | ID | len=2 | MIN delay | MAX delay | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +type PlayoutDelayExtension struct { + minDelay, maxDelay uint16 +} + +// Marshal serializes the members to buffer +func (p PlayoutDelayExtension) Marshal() ([]byte, error) { + if p.minDelay > playoutDelayMaxValue || p.maxDelay > playoutDelayMaxValue { + return nil, errPlayoutDelayInvalidValue + } + + return []byte{ + byte(p.minDelay >> 4), + byte(p.minDelay<<4) | byte(p.maxDelay>>8), + byte(p.maxDelay), + }, nil +} + +// Unmarshal parses the passed byte slice and stores the result in the members +func (p *PlayoutDelayExtension) Unmarshal(rawData []byte) error { + if len(rawData) < playoutDelayExtensionSize { + return errTooSmall + } + p.minDelay = binary.BigEndian.Uint16(rawData[0:2]) >> 4 + p.maxDelay = binary.BigEndian.Uint16(rawData[1:3]) & 0x0FFF + return nil +} diff --git a/vendor/github.com/pion/rtp/rand.go b/vendor/github.com/pion/rtp/rand.go index ee8552356..3ddddd1bf 100644 --- a/vendor/github.com/pion/rtp/rand.go +++ b/vendor/github.com/pion/rtp/rand.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtp import ( diff --git a/vendor/github.com/pion/rtp/renovate.json b/vendor/github.com/pion/rtp/renovate.json index f1614058a..f1bb98c6a 100644 --- a/vendor/github.com/pion/rtp/renovate.json +++ b/vendor/github.com/pion/rtp/renovate.json @@ -1,27 +1,6 @@ { + "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ - "config:base", - ":disableDependencyDashboard" - ], - "postUpdateOptions": [ - "gomodTidy" - ], - "commitBody": "Generated by renovateBot", - "packageRules": [ - { - "matchUpdateTypes": ["minor", "patch", "pin", "digest"], - "automerge": true - }, - { - "packagePatterns": ["^golang.org/x/"], - "schedule": ["on the first day of the month"] - } - ], - "ignorePaths": [ - ".github/workflows/generate-authors.yml", - ".github/workflows/lint.yaml", - ".github/workflows/renovate-go-mod-fix.yaml", - ".github/workflows/test.yaml", - ".github/workflows/tidy-check.yaml" + "github>pion/renovate-config" ] } diff --git a/vendor/github.com/pion/rtp/rtp.go b/vendor/github.com/pion/rtp/rtp.go index b66b2e4b8..5487232e5 100644 --- a/vendor/github.com/pion/rtp/rtp.go +++ b/vendor/github.com/pion/rtp/rtp.go @@ -1,2 +1,5 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + // Package rtp provides RTP packetizer and depacketizer package rtp diff --git a/vendor/github.com/pion/rtp/sequencer.go b/vendor/github.com/pion/rtp/sequencer.go index 2b4a5072e..8ad2cfd7b 100644 --- a/vendor/github.com/pion/rtp/sequencer.go +++ b/vendor/github.com/pion/rtp/sequencer.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtp import ( diff --git a/vendor/github.com/pion/rtp/transportccextension.go b/vendor/github.com/pion/rtp/transportccextension.go index 236af056a..c2a998c89 100644 --- a/vendor/github.com/pion/rtp/transportccextension.go +++ b/vendor/github.com/pion/rtp/transportccextension.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package rtp import ( diff --git a/vendor/github.com/pion/rtp/vlaextension.go b/vendor/github.com/pion/rtp/vlaextension.go new file mode 100644 index 000000000..e10820a37 --- /dev/null +++ b/vendor/github.com/pion/rtp/vlaextension.go @@ -0,0 +1,360 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package rtp + +import ( + "encoding/binary" + "errors" + "fmt" + "strings" + + "github.com/pion/rtp/codecs/av1/obu" +) + +var ( + ErrVLATooShort = errors.New("VLA payload too short") // ErrVLATooShort is returned when payload is too short + ErrVLAInvalidStreamCount = errors.New("invalid RTP stream count in VLA") // ErrVLAInvalidStreamCount is returned when RTP stream count is invalid + ErrVLAInvalidStreamID = errors.New("invalid RTP stream ID in VLA") // ErrVLAInvalidStreamID is returned when RTP stream ID is invalid + ErrVLAInvalidSpatialID = errors.New("invalid spatial ID in VLA") // ErrVLAInvalidSpatialID is returned when spatial ID is invalid + ErrVLADuplicateSpatialID = errors.New("duplicate spatial ID in VLA") // ErrVLADuplicateSpatialID is returned when spatial ID is invalid + ErrVLAInvalidTemporalLayer = errors.New("invalid temporal layer in VLA") // ErrVLAInvalidTemporalLayer is returned when temporal layer is invalid +) + +// SpatialLayer is a spatial layer in VLA. +type SpatialLayer struct { + RTPStreamID int + SpatialID int + TargetBitrates []int // target bitrates per temporal layer + + // Following members are valid only when HasResolutionAndFramerate is true + Width int + Height int + Framerate int +} + +// VLA is a Video Layer Allocation (VLA) extension. +// See https://webrtc.googlesource.com/src/+/refs/heads/main/docs/native-code/rtp-hdrext/video-layers-allocation00 +type VLA struct { + RTPStreamID int // 0-origin RTP stream ID (RID) this allocation is sent on (0..3) + RTPStreamCount int // Number of RTP streams (1..4) + ActiveSpatialLayer []SpatialLayer + HasResolutionAndFramerate bool +} + +type vlaMarshalingContext struct { + slMBs [4]uint8 + sls [4][4]*SpatialLayer + commonSLBM uint8 + encodedTargetBitrates [][]byte + requiredLen int +} + +func (v VLA) preprocessForMashaling(ctx *vlaMarshalingContext) error { + for i := 0; i < len(v.ActiveSpatialLayer); i++ { + sl := v.ActiveSpatialLayer[i] + if sl.RTPStreamID < 0 || sl.RTPStreamID >= v.RTPStreamCount { + return fmt.Errorf("invalid RTP streamID %d:%w", sl.RTPStreamID, ErrVLAInvalidStreamID) + } + if sl.SpatialID < 0 || sl.SpatialID >= 4 { + return fmt.Errorf("invalid spatial ID %d: %w", sl.SpatialID, ErrVLAInvalidSpatialID) + } + if len(sl.TargetBitrates) == 0 || len(sl.TargetBitrates) > 4 { + return fmt.Errorf("invalid temporal layer count %d: %w", len(sl.TargetBitrates), ErrVLAInvalidTemporalLayer) + } + ctx.slMBs[sl.RTPStreamID] |= 1 << sl.SpatialID + if ctx.sls[sl.RTPStreamID][sl.SpatialID] != nil { + return fmt.Errorf("duplicate spatial layer: %w", ErrVLADuplicateSpatialID) + } + ctx.sls[sl.RTPStreamID][sl.SpatialID] = &sl + } + return nil +} + +func (v VLA) encodeTargetBitrates(ctx *vlaMarshalingContext) { + for rtpStreamID := 0; rtpStreamID < v.RTPStreamCount; rtpStreamID++ { + for spatialID := 0; spatialID < 4; spatialID++ { + if sl := ctx.sls[rtpStreamID][spatialID]; sl != nil { + for _, kbps := range sl.TargetBitrates { + leb128 := obu.WriteToLeb128(uint(kbps)) + ctx.encodedTargetBitrates = append(ctx.encodedTargetBitrates, leb128) + ctx.requiredLen += len(leb128) + } + } + } + } +} + +func (v VLA) analyzeVLAForMarshaling() (*vlaMarshalingContext, error) { + // Validate RTPStreamCount + if v.RTPStreamCount <= 0 || v.RTPStreamCount > 4 { + return nil, ErrVLAInvalidStreamCount + } + // Validate RTPStreamID + if v.RTPStreamID < 0 || v.RTPStreamID >= v.RTPStreamCount { + return nil, ErrVLAInvalidStreamID + } + + ctx := &vlaMarshalingContext{} + err := v.preprocessForMashaling(ctx) + if err != nil { + return nil, err + } + + ctx.commonSLBM = commonSLBMValues(ctx.slMBs[:]) + + // RID, NS, sl_bm fields + if ctx.commonSLBM != 0 { + ctx.requiredLen = 1 + } else { + ctx.requiredLen = 3 + } + + // #tl fields + ctx.requiredLen += (len(v.ActiveSpatialLayer)-1)/4 + 1 + + v.encodeTargetBitrates(ctx) + + if v.HasResolutionAndFramerate { + ctx.requiredLen += len(v.ActiveSpatialLayer) * 5 + } + + return ctx, nil +} + +// Marshal encodes VLA into a byte slice. +func (v VLA) Marshal() ([]byte, error) { + ctx, err := v.analyzeVLAForMarshaling() + if err != nil { + return nil, err + } + + payload := make([]byte, ctx.requiredLen) + offset := 0 + + // RID, NS, sl_bm fields + payload[offset] = byte(v.RTPStreamID<<6) | byte(v.RTPStreamCount-1)<<4 | ctx.commonSLBM + + if ctx.commonSLBM == 0 { + offset++ + for streamID := 0; streamID < v.RTPStreamCount; streamID++ { + if streamID%2 == 0 { + payload[offset+streamID/2] |= ctx.slMBs[streamID] << 4 + } else { + payload[offset+streamID/2] |= ctx.slMBs[streamID] + } + } + offset += (v.RTPStreamCount - 1) / 2 + } + + // #tl fields + offset++ + var temporalLayerIndex int + for rtpStreamID := 0; rtpStreamID < v.RTPStreamCount; rtpStreamID++ { + for spatialID := 0; spatialID < 4; spatialID++ { + if sl := ctx.sls[rtpStreamID][spatialID]; sl != nil { + if temporalLayerIndex >= 4 { + temporalLayerIndex = 0 + offset++ + } + payload[offset] |= byte(len(sl.TargetBitrates)-1) << (2 * (3 - temporalLayerIndex)) + temporalLayerIndex++ + } + } + } + + // Target bitrate fields + offset++ + for _, encodedKbps := range ctx.encodedTargetBitrates { + encodedSize := len(encodedKbps) + copy(payload[offset:], encodedKbps) + offset += encodedSize + } + + // Resolution & framerate fields + if v.HasResolutionAndFramerate { + for _, sl := range v.ActiveSpatialLayer { + binary.BigEndian.PutUint16(payload[offset+0:], uint16(sl.Width-1)) + binary.BigEndian.PutUint16(payload[offset+2:], uint16(sl.Height-1)) + payload[offset+4] = byte(sl.Framerate) + offset += 5 + } + } + + return payload, nil +} + +func commonSLBMValues(slMBs []uint8) uint8 { + var common uint8 + for i := 0; i < len(slMBs); i++ { + if slMBs[i] == 0 { + continue + } + if common == 0 { + common = slMBs[i] + continue + } + if slMBs[i] != common { + return 0 + } + } + return common +} + +type vlaUnmarshalingContext struct { + payload []byte + offset int + slBMField uint8 + slBMs [4]uint8 +} + +func (ctx *vlaUnmarshalingContext) checkRemainingLen(requiredLen int) bool { + return len(ctx.payload)-ctx.offset >= requiredLen +} + +func (v *VLA) unmarshalSpatialLayers(ctx *vlaUnmarshalingContext) error { + if !ctx.checkRemainingLen(1) { + return fmt.Errorf("failed to unmarshal VLA (offset=%d): %w", ctx.offset, ErrVLATooShort) + } + v.RTPStreamID = int(ctx.payload[ctx.offset] >> 6 & 0b11) + v.RTPStreamCount = int(ctx.payload[ctx.offset]>>4&0b11) + 1 + + // sl_bm fields + ctx.slBMField = ctx.payload[ctx.offset] & 0b1111 + ctx.offset++ + + if ctx.slBMField != 0 { + for streamID := 0; streamID < v.RTPStreamCount; streamID++ { + ctx.slBMs[streamID] = ctx.slBMField + } + } else { + if !ctx.checkRemainingLen((v.RTPStreamCount-1)/2 + 1) { + return fmt.Errorf("failed to unmarshal VLA (offset=%d): %w", ctx.offset, ErrVLATooShort) + } + // slX_bm fields + for streamID := 0; streamID < v.RTPStreamCount; streamID++ { + var bm uint8 + if streamID%2 == 0 { + bm = ctx.payload[ctx.offset+streamID/2] >> 4 & 0b1111 + } else { + bm = ctx.payload[ctx.offset+streamID/2] & 0b1111 + } + ctx.slBMs[streamID] = bm + } + ctx.offset += 1 + (v.RTPStreamCount-1)/2 + } + + return nil +} + +func (v *VLA) unmarshalTemporalLayers(ctx *vlaUnmarshalingContext) error { + if !ctx.checkRemainingLen(1) { + return fmt.Errorf("failed to unmarshal VLA (offset=%d): %w", ctx.offset, ErrVLATooShort) + } + + var temporalLayerIndex int + for streamID := 0; streamID < v.RTPStreamCount; streamID++ { + for spatialID := 0; spatialID < 4; spatialID++ { + if ctx.slBMs[streamID]&(1<= 4 { + temporalLayerIndex = 0 + ctx.offset++ + if !ctx.checkRemainingLen(1) { + return fmt.Errorf("failed to unmarshal VLA (offset=%d): %w", ctx.offset, ErrVLATooShort) + } + } + tlCount := int(ctx.payload[ctx.offset]>>(2*(3-temporalLayerIndex))&0b11) + 1 + temporalLayerIndex++ + sl := SpatialLayer{ + RTPStreamID: streamID, + SpatialID: spatialID, + TargetBitrates: make([]int, tlCount), + } + v.ActiveSpatialLayer = append(v.ActiveSpatialLayer, sl) + } + } + ctx.offset++ + + // target bitrates + for i, sl := range v.ActiveSpatialLayer { + for j := range sl.TargetBitrates { + kbps, n, err := obu.ReadLeb128(ctx.payload[ctx.offset:]) + if err != nil { + return err + } + if !ctx.checkRemainingLen(int(n)) { + return fmt.Errorf("failed to unmarshal VLA (offset=%d): %w", ctx.offset, ErrVLATooShort) + } + v.ActiveSpatialLayer[i].TargetBitrates[j] = int(kbps) + ctx.offset += int(n) + } + } + + return nil +} + +func (v *VLA) unmarshalResolutionAndFramerate(ctx *vlaUnmarshalingContext) error { + if !ctx.checkRemainingLen(len(v.ActiveSpatialLayer) * 5) { + return fmt.Errorf("failed to unmarshal VLA (offset=%d): %w", ctx.offset, ErrVLATooShort) + } + + v.HasResolutionAndFramerate = true + + for i := range v.ActiveSpatialLayer { + v.ActiveSpatialLayer[i].Width = int(binary.BigEndian.Uint16(ctx.payload[ctx.offset+0:])) + 1 + v.ActiveSpatialLayer[i].Height = int(binary.BigEndian.Uint16(ctx.payload[ctx.offset+2:])) + 1 + v.ActiveSpatialLayer[i].Framerate = int(ctx.payload[ctx.offset+4]) + ctx.offset += 5 + } + + return nil +} + +// Unmarshal decodes VLA from a byte slice. +func (v *VLA) Unmarshal(payload []byte) (int, error) { + ctx := &vlaUnmarshalingContext{ + payload: payload, + } + + err := v.unmarshalSpatialLayers(ctx) + if err != nil { + return ctx.offset, err + } + + // #tl fields (build the list ActiveSpatialLayer at the same time) + err = v.unmarshalTemporalLayers(ctx) + if err != nil { + return ctx.offset, err + } + + if len(ctx.payload) == ctx.offset { + return ctx.offset, nil + } + + // resolution & framerate (optional) + err = v.unmarshalResolutionAndFramerate(ctx) + if err != nil { + return ctx.offset, err + } + + return ctx.offset, nil +} + +// String makes VLA printable. +func (v VLA) String() string { + out := fmt.Sprintf("RID:%d,RTPStreamCount:%d", v.RTPStreamID, v.RTPStreamCount) + var slOut []string + for _, sl := range v.ActiveSpatialLayer { + out2 := fmt.Sprintf("RTPStreamID:%d", sl.RTPStreamID) + out2 += fmt.Sprintf(",TargetBitrates:%v", sl.TargetBitrates) + if v.HasResolutionAndFramerate { + out2 += fmt.Sprintf(",Resolution:(%d,%d)", sl.Width, sl.Height) + out2 += fmt.Sprintf(",Framerate:%d", sl.Framerate) + } + slOut = append(slOut, out2) + } + out += fmt.Sprintf(",ActiveSpatialLayers:{%s}", strings.Join(slOut, ",")) + return out +} diff --git a/vendor/github.com/pion/sctp/.gitignore b/vendor/github.com/pion/sctp/.gitignore index f977e7485..6e2f206a9 100644 --- a/vendor/github.com/pion/sctp/.gitignore +++ b/vendor/github.com/pion/sctp/.gitignore @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + ### JetBrains IDE ### ##################### .idea/ diff --git a/vendor/github.com/pion/sctp/.golangci.yml b/vendor/github.com/pion/sctp/.golangci.yml index 48696f16b..e06de4d3c 100644 --- a/vendor/github.com/pion/sctp/.golangci.yml +++ b/vendor/github.com/pion/sctp/.golangci.yml @@ -1,6 +1,10 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + linters-settings: govet: - check-shadowing: true + enable: + - shadow misspell: locale: US exhaustive: @@ -10,7 +14,14 @@ linters-settings: modules: - github.com/pkg/errors: recommendations: - - errors + - errors + forbidigo: + forbid: + - ^fmt.Print(f|ln)?$ + - ^log.(Panic|Fatal|Print)(f|ln)?$ + - ^os.Exit$ + - ^panic$ + - ^print(ln)?$ linters: enable: @@ -19,7 +30,6 @@ linters: - bodyclose # checks whether HTTP response body is closed successfully - contextcheck # check the function whether use a non-inherited context - decorder # check declaration order and count of types, constants, variables and functions - - depguard # Go linter that checks if package imports are in a list of acceptable packages - dogsled # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()) - dupl # Tool for code clone detection - durationcheck # check for two durations multiplied together @@ -29,6 +39,7 @@ linters: - errorlint # errorlint is a linter for that can be used to find code that will cause problems with the error wrapping scheme introduced in Go 1.13. - exhaustive # check exhaustiveness of enum switch statements - exportloopref # checks for pointers to enclosing loop variables + - forbidigo # Forbids identifiers - forcetypeassert # finds forced type assertions - gci # Gci control golang package import order and make it always deterministic. - gochecknoglobals # Checks that no globals are present in Go code @@ -52,7 +63,6 @@ linters: - importas # Enforces consistent import aliases - ineffassign # Detects when assignments to existing variables are not used - misspell # Finds commonly misspelled English words in comments - - nakedret # Finds naked returns in functions greater than a specified function length - nilerr # Finds the code that returns nil even if it checks that the error is not nil. - nilnil # Checks that there is no simultaneous return of `nil` error and an invalid value. - noctx # noctx finds sending http request without context.Context @@ -70,10 +80,10 @@ linters: - wastedassign # wastedassign finds wasted assignment statements - whitespace # Tool for detection of leading and trailing whitespace disable: + - depguard # Go linter that checks if package imports are in a list of acceptable packages - containedctx # containedctx is a linter that detects struct contained context.Context field - cyclop # checks function and package cyclomatic complexity - exhaustivestruct # Checks if all struct's fields are initialized - - forbidigo # Forbids identifiers - funlen # Tool for detection of long functions - gocyclo # Computes and checks the cyclomatic complexity of functions - godot # Check if comments end in a period @@ -84,6 +94,7 @@ linters: - maintidx # maintidx measures the maintainability index of each function. - makezero # Finds slice declarations with non-zero initial length - maligned # Tool to detect Go structs that would take less memory if their fields were sorted + - nakedret # Finds naked returns in functions greater than a specified function length - nestif # Reports deeply nested if statements - nlreturn # nlreturn checks for a new line before return and branch statements to increase code clarity - nolintlint # Reports ill-formed or insufficient nolint directives @@ -100,17 +111,15 @@ linters: issues: exclude-use-default: false + exclude-dirs-use-default: false exclude-rules: - # Allow complex tests, better to be self contained - - path: _test\.go + # Allow complex tests and examples, better to be self contained + - path: (examples|main\.go|_test\.go) linters: + - forbidigo - gocognit - # Allow complex main function in examples - - path: examples - text: "of func `main` is high" + # Allow forbidden identifiers in CLI commands + - path: cmd linters: - - gocognit - -run: - skip-dirs-use-default: false + - forbidigo diff --git a/vendor/github.com/pion/sctp/.goreleaser.yml b/vendor/github.com/pion/sctp/.goreleaser.yml index 2caa5fbd3..30093e9d6 100644 --- a/vendor/github.com/pion/sctp/.goreleaser.yml +++ b/vendor/github.com/pion/sctp/.goreleaser.yml @@ -1,2 +1,5 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + builds: - skip: true diff --git a/vendor/github.com/pion/sctp/AUTHORS.txt b/vendor/github.com/pion/sctp/AUTHORS.txt deleted file mode 100644 index ed95135c8..000000000 --- a/vendor/github.com/pion/sctp/AUTHORS.txt +++ /dev/null @@ -1,33 +0,0 @@ -# Thank you to everyone that made Pion possible. If you are interested in contributing -# we would love to have you https://github.com/pion/webrtc/wiki/Contributing -# -# This file is auto generated, using git to list all individuals contributors. -# see https://github.com/pion/.goassets/blob/master/scripts/generate-authors.sh for the scripting -Aaron France -Adrian Cable -Atsushi Watanabe -backkem -Cecylia Bocovich -chenkaiC4 -Eric Daniels -Hugo Arregui -Hugo Arregui -Jerko Steiner -Jerry Tao -John Bradley -Konstantin Itskov -Lukas Herman -Luke Curley -Michael MacDonald -ronan -Sam Lancia -Sean DuBois -Sean DuBois -Steffen Vogel -Teddy -Will Forcey -Yutaka Takeda -ZHENK - -# List of contributors not appearing in Git history - diff --git a/vendor/github.com/pion/sctp/LICENSE b/vendor/github.com/pion/sctp/LICENSE index ab602974d..491caf6b0 100644 --- a/vendor/github.com/pion/sctp/LICENSE +++ b/vendor/github.com/pion/sctp/LICENSE @@ -1,21 +1,9 @@ MIT License -Copyright (c) 2018 +Copyright (c) 2023 The Pion community -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/pion/sctp/README.md b/vendor/github.com/pion/sctp/README.md index 3ca234452..a407c46a4 100644 --- a/vendor/github.com/pion/sctp/README.md +++ b/vendor/github.com/pion/sctp/README.md @@ -28,7 +28,7 @@ We are always looking to support **your projects**. Please reach out if you have If you need commercial support or don't want to use public methods you can contact us at [team@pion.ly](mailto:team@pion.ly) ### Contributing -Check out the [contributing wiki](https://github.com/pion/webrtc/wiki/Contributing) to join the group of amazing people making this project possible: [AUTHORS.txt](./AUTHORS.txt) +Check out the [contributing wiki](https://github.com/pion/webrtc/wiki/Contributing) to join the group of amazing people making this project possible ### License MIT License - see [LICENSE](LICENSE) for full text diff --git a/vendor/github.com/pion/sctp/ack_timer.go b/vendor/github.com/pion/sctp/ack_timer.go index ba23d54d2..879e86df7 100644 --- a/vendor/github.com/pion/sctp/ack_timer.go +++ b/vendor/github.com/pion/sctp/ack_timer.go @@ -1,6 +1,10 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( + "math" "sync" "time" ) @@ -14,23 +18,37 @@ type ackTimerObserver interface { onAckTimeout() } +type ackTimerState int + +const ( + ackTimerStopped ackTimerState = iota + ackTimerStarted + ackTimerClosed +) + // ackTimer provides the retnransmission timer conforms with RFC 4960 Sec 6.3.1 type ackTimer struct { observer ackTimerObserver - interval time.Duration - stopFunc stopAckTimerLoop - closed bool mutex sync.RWMutex + state ackTimerState + timer *time.Timer } -type stopAckTimerLoop func() - // newAckTimer creates a new acknowledgement timer used to enable delayed ack. func newAckTimer(observer ackTimerObserver) *ackTimer { - return &ackTimer{ - observer: observer, - interval: ackInterval, + t := &ackTimer{observer: observer} + t.timer = time.AfterFunc(math.MaxInt64, t.timeout) + t.timer.Stop() + return t +} + +func (t *ackTimer) timeout() { + t.mutex.Lock() + if t.state == ackTimerStarted { + t.state = ackTimerStopped + defer t.observer.onAckTimeout() } + t.mutex.Unlock() } // start starts the timer. @@ -38,34 +56,13 @@ func (t *ackTimer) start() bool { t.mutex.Lock() defer t.mutex.Unlock() - // this timer is already closed - if t.closed { + // this timer is already closed or already running + if t.state != ackTimerStopped { return false } - // this is a noop if the timer is already running - if t.stopFunc != nil { - return false - } - - cancelCh := make(chan struct{}) - - go func() { - timer := time.NewTimer(t.interval) - - select { - case <-timer.C: - t.stop() - t.observer.onAckTimeout() - case <-cancelCh: - timer.Stop() - } - }() - - t.stopFunc = func() { - close(cancelCh) - } - + t.state = ackTimerStarted + t.timer.Reset(ackInterval) return true } @@ -75,9 +72,9 @@ func (t *ackTimer) stop() { t.mutex.Lock() defer t.mutex.Unlock() - if t.stopFunc != nil { - t.stopFunc() - t.stopFunc = nil + if t.state == ackTimerStarted { + t.timer.Stop() + t.state = ackTimerStopped } } @@ -87,12 +84,10 @@ func (t *ackTimer) close() { t.mutex.Lock() defer t.mutex.Unlock() - if t.stopFunc != nil { - t.stopFunc() - t.stopFunc = nil + if t.state == ackTimerStarted { + t.timer.Stop() } - - t.closed = true + t.state = ackTimerClosed } // isRunning tests if the timer is running. @@ -101,5 +96,5 @@ func (t *ackTimer) isRunning() bool { t.mutex.RLock() defer t.mutex.RUnlock() - return (t.stopFunc != nil) + return t.state == ackTimerStarted } diff --git a/vendor/github.com/pion/sctp/association.go b/vendor/github.com/pion/sctp/association.go index fb7fd38db..46881b1d9 100644 --- a/vendor/github.com/pion/sctp/association.go +++ b/vendor/github.com/pion/sctp/association.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( @@ -16,6 +19,12 @@ import ( "github.com/pion/randutil" ) +// Port 5000 shows up in examples for SDPs used by WebRTC. Since this implementation +// assumes it will be used by DTLS over UDP, the port is only meaningful for de-multiplexing +// but more-so verification. +// Example usage: https://www.rfc-editor.org/rfc/rfc8841.html#section-13.1-2 +const defaultSCTPSrcDstPort = 5000 + // Use global random generator to properly seed by crypto grade random. var globalMathRandomGenerator = randutil.NewMathRandomGenerator() // nolint:gochecknoglobals @@ -41,6 +50,7 @@ var ( ErrChunkTypeUnhandled = errors.New("unhandled chunk type") ErrHandshakeInitAck = errors.New("handshake failed (INIT ACK)") ErrHandshakeCookieEcho = errors.New("handshake failed (COOKIE ECHO)") + ErrTooManyReconfigRequests = errors.New("too many outstanding reconfig requests") ) const ( @@ -90,6 +100,19 @@ const ( // other constants const ( acceptChSize = 16 + // avgChunkSize is an estimate of the average chunk size. There is no theory behind + // this estimate. + avgChunkSize = 500 + // minTSNOffset is the minimum offset over the cummulative TSN that we will enqueue + // irrespective of the receive buffer size + // see Association.getMaxTSNOffset + minTSNOffset = 2000 + // maxTSNOffset is the maximum offset over the cummulative TSN that we will enqueue + // irrespective of the receive buffer size + // see Association.getMaxTSNOffset + maxTSNOffset = 40000 + // maxReconfigRequests is the maximum number of reconfig requests we will keep outstanding + maxReconfigRequests = 1000 ) func getAssociationStateString(a uint32) string { @@ -128,6 +151,8 @@ func getAssociationStateString(a uint32) string { // // Note: No "CLOSED" state is illustrated since if a // association is "CLOSED" its TCB SHOULD be removed. +// Note: By nature of an Association being constructed with one net.Conn, +// it is not a multi-home supporting implementation of SCTP. type Association struct { bytesReceived uint64 bytesSent uint64 @@ -139,6 +164,7 @@ type Association struct { peerVerificationTag uint32 myVerificationTag uint32 state uint32 + initialTSN uint32 myNextTSN uint32 // nextTSN peerLastTSN uint32 // lastRcvdTSN minTSN2MeasureRTT uint32 // for RTT measurement @@ -174,6 +200,8 @@ type Association struct { cumulativeTSNAckPoint uint32 advancedPeerTSNAckPoint uint32 useForwardTSN bool + sendZeroChecksum bool + recvZeroChecksum bool // Congestion control parameters maxReceiveBufferSize uint32 @@ -227,10 +255,14 @@ type Association struct { // Config collects the arguments to createAssociation construction into // a single structure type Config struct { + Name string NetConn net.Conn MaxReceiveBufferSize uint32 MaxMessageSize uint32 + EnableZeroChecksum bool LoggerFactory logging.LoggerFactory + // RTOMax is the maximum retransmission timeout in milliseconds + RTOMax float64 } // Server accepts a SCTP stream over a conn @@ -251,10 +283,18 @@ func Server(config Config) (*Association, error) { // Client opens a SCTP stream over a conn func Client(config Config) (*Association, error) { + return createClientWithContext(context.Background(), config) +} + +func createClientWithContext(ctx context.Context, config Config) (*Association, error) { a := createAssociation(config) a.init(true) select { + case <-ctx.Done(): + a.log.Errorf("[%s] client handshake canceled: state=%s", a.name, getAssociationStateString(a.getState())) + a.Close() // nolint:errcheck,gosec + return nil, ctx.Err() case err := <-a.handshakeCompletedCh: if err != nil { return nil, err @@ -282,11 +322,17 @@ func createAssociation(config Config) *Association { tsn := globalMathRandomGenerator.Uint32() a := &Association{ - netConn: config.NetConn, - maxReceiveBufferSize: maxReceiveBufferSize, - maxMessageSize: maxMessageSize, + netConn: config.NetConn, + maxReceiveBufferSize: maxReceiveBufferSize, + maxMessageSize: maxMessageSize, + + // These two max values have us not need to follow + // 5.1.1 where this peer may be incapable of supporting + // the requested amount of outbound streams from the other + // peer. myMaxNumOutboundStreams: math.MaxUint16, myMaxNumInboundStreams: math.MaxUint16, + payloadQueue: newPayloadQueue(), inflightQueue: newPayloadQueue(), pendingQueue: newPendingQueue(), @@ -294,11 +340,12 @@ func createAssociation(config Config) *Association { mtu: initialMTU, maxPayloadSize: initialMTU - (commonHeaderSize + dataChunkHeaderSize), myVerificationTag: globalMathRandomGenerator.Uint32(), + initialTSN: tsn, myNextTSN: tsn, myNextRSN: tsn, minTSN2MeasureRTT: tsn, state: closed, - rtoMgr: newRTOManager(), + rtoMgr: newRTOManager(config.RTOMax), streams: map[uint16]*Stream{}, reconfigs: map[uint32]*chunkReconfig{}, reconfigRequests: map[uint32]*paramOutgoingResetRequest{}, @@ -309,27 +356,31 @@ func createAssociation(config Config) *Association { handshakeCompletedCh: make(chan error), cumulativeTSNAckPoint: tsn - 1, advancedPeerTSNAckPoint: tsn - 1, + recvZeroChecksum: config.EnableZeroChecksum, silentError: ErrSilentlyDiscard, stats: &associationStats{}, log: config.LoggerFactory.NewLogger("sctp"), + name: config.Name, } - a.name = fmt.Sprintf("%p", a) + if a.name == "" { + a.name = fmt.Sprintf("%p", a) + } // RFC 4690 Sec 7.2.1 // o The initial cwnd before DATA transmission or after a sufficiently // long idle period MUST be set to min(4*MTU, max (2*MTU, 4380 // bytes)). - a.cwnd = min32(4*a.mtu, max32(2*a.mtu, 4380)) + a.setCWND(min32(4*a.MTU(), max32(2*a.MTU(), 4380))) a.log.Tracef("[%s] updated cwnd=%d ssthresh=%d inflight=%d (INI)", - a.name, a.cwnd, a.ssthresh, a.inflightQueue.getNumBytes()) + a.name, a.CWND(), a.ssthresh, a.inflightQueue.getNumBytes()) a.srtt.Store(float64(0)) - a.t1Init = newRTXTimer(timerT1Init, a, maxInitRetrans) - a.t1Cookie = newRTXTimer(timerT1Cookie, a, maxInitRetrans) - a.t2Shutdown = newRTXTimer(timerT2Shutdown, a, noMaxRetrans) // retransmit forever - a.t3RTX = newRTXTimer(timerT3RTX, a, noMaxRetrans) // retransmit forever - a.tReconfig = newRTXTimer(timerReconfig, a, noMaxRetrans) // retransmit forever + a.t1Init = newRTXTimer(timerT1Init, a, maxInitRetrans, config.RTOMax) + a.t1Cookie = newRTXTimer(timerT1Cookie, a, maxInitRetrans, config.RTOMax) + a.t2Shutdown = newRTXTimer(timerT2Shutdown, a, noMaxRetrans, config.RTOMax) + a.t3RTX = newRTXTimer(timerT3RTX, a, noMaxRetrans, config.RTOMax) + a.tReconfig = newRTXTimer(timerReconfig, a, noMaxRetrans, config.RTOMax) a.ackTimer = newAckTimer(a) return a @@ -343,7 +394,6 @@ func (a *Association) init(isClient bool) { go a.writeLoop() if isClient { - a.setState(cookieWait) init := &chunkInit{} init.initialTSN = a.myNextTSN init.numOutboundStreams = a.myMaxNumOutboundStreams @@ -351,6 +401,11 @@ func (a *Association) init(isClient bool) { init.initiateTag = a.myVerificationTag init.advertisedReceiverWindowCredit = a.maxReceiveBufferSize setSupportedExtensions(&init.chunkInitCommon) + + if a.recvZeroChecksum { + init.params = append(init.params, ¶mZeroChecksumAcceptable{edmid: dtlsErrorDetectionMethod}) + } + a.storedInit = init err := a.sendInit() @@ -358,6 +413,11 @@ func (a *Association) init(isClient bool) { a.log.Errorf("[%s] failed to send init: %s", a.name, err.Error()) } + // After sending the INIT chunk, "A" starts the T1-init timer and enters the COOKIE-WAIT state. + // Note: ideally we would set state after the timer starts but since we don't do this in an atomic + // set + timer-start, it's safer to just set the state first so that we don't have a timer expiration + // race. + a.setState(cookieWait) a.t1Init.start(a.rtoMgr.getRTO()) } } @@ -371,8 +431,8 @@ func (a *Association) sendInit() error { outbound := &packet{} outbound.verificationTag = a.peerVerificationTag - a.sourcePort = 5000 // Spec?? - a.destinationPort = 5000 // Spec?? + a.sourcePort = defaultSCTPSrcDstPort + a.destinationPort = defaultSCTPSrcDstPort outbound.sourcePort = a.sourcePort outbound.destinationPort = a.destinationPort @@ -448,8 +508,11 @@ func (a *Association) Close() error { <-a.readLoopCloseCh a.log.Debugf("[%s] association closed", a.name) + a.log.Debugf("[%s] stats nPackets (in) : %d", a.name, a.stats.getNumPacketsReceived()) + a.log.Debugf("[%s] stats nPackets (out) : %d", a.name, a.stats.getNumPacketsSent()) a.log.Debugf("[%s] stats nDATAs (in) : %d", a.name, a.stats.getNumDATAs()) - a.log.Debugf("[%s] stats nSACKs (in) : %d", a.name, a.stats.getNumSACKs()) + a.log.Debugf("[%s] stats nSACKs (in) : %d", a.name, a.stats.getNumSACKsReceived()) + a.log.Debugf("[%s] stats nSACKs (out) : %d\n", a.name, a.stats.getNumSACKsSent()) a.log.Debugf("[%s] stats nT3Timeouts : %d", a.name, a.stats.getNumT3Timeouts()) a.log.Debugf("[%s] stats nAckTimeouts: %d", a.name, a.stats.getNumAckTimeouts()) a.log.Debugf("[%s] stats nFastRetrans: %d", a.name, a.stats.getNumFastRetrans()) @@ -519,7 +582,7 @@ func (a *Association) readLoop() { a.log.Debugf("[%s] association closed", a.name) a.log.Debugf("[%s] stats nDATAs (in) : %d", a.name, a.stats.getNumDATAs()) - a.log.Debugf("[%s] stats nSACKs (in) : %d", a.name, a.stats.getNumSACKs()) + a.log.Debugf("[%s] stats nSACKs (in) : %d", a.name, a.stats.getNumSACKsReceived()) a.log.Debugf("[%s] stats nT3Timeouts : %d", a.name, a.stats.getNumT3Timeouts()) a.log.Debugf("[%s] stats nAckTimeouts: %d", a.name, a.stats.getNumAckTimeouts()) a.log.Debugf("[%s] stats nFastRetrans: %d", a.name, a.stats.getNumFastRetrans()) @@ -568,6 +631,7 @@ loop: break loop } atomic.AddUint64(&a.bytesSent, uint64(len(raw))) + a.stats.incPacketsSent() } if !ok { @@ -607,10 +671,32 @@ func (a *Association) unregisterStream(s *Stream, err error) { s.readNotifier.Broadcast() } +func chunkMandatoryChecksum(cc []chunk) bool { + for _, c := range cc { + switch c.(type) { + case *chunkInit, *chunkCookieEcho: + return true + } + } + return false +} + +func (a *Association) marshalPacket(p *packet) ([]byte, error) { + return p.marshal(!a.sendZeroChecksum || chunkMandatoryChecksum(p.chunks)) +} + +func (a *Association) unmarshalPacket(raw []byte) (*packet, error) { + p := &packet{} + if err := p.unmarshal(!a.recvZeroChecksum, raw); err != nil { + return nil, err + } + return p, nil +} + // handleInbound parses incoming raw packets func (a *Association) handleInbound(raw []byte) error { - p := &packet{} - if err := p.unmarshal(raw); err != nil { + p, err := a.unmarshalPacket(raw) + if err != nil { a.log.Warnf("[%s] unable to parse SCTP packet %s", a.name, err) return nil } @@ -620,7 +706,7 @@ func (a *Association) handleInbound(raw []byte) error { return nil } - a.handleChunkStart() + a.handleChunksStart() for _, c := range p.chunks { if err := a.handleChunk(p, c); err != nil { @@ -628,7 +714,7 @@ func (a *Association) handleInbound(raw []byte) error { } } - a.handleChunkEnd() + a.handleChunksEnd() return nil } @@ -636,7 +722,7 @@ func (a *Association) handleInbound(raw []byte) error { // The caller should hold the lock func (a *Association) gatherDataPacketsToRetransmit(rawPackets [][]byte) [][]byte { for _, p := range a.getDataPacketsToRetransmit() { - raw, err := p.marshal() + raw, err := a.marshalPacket(p) if err != nil { a.log.Warnf("[%s] failed to serialize a DATA packet to be retransmitted", a.name) continue @@ -657,7 +743,7 @@ func (a *Association) gatherOutboundDataAndReconfigPackets(rawPackets [][]byte) a.log.Tracef("[%s] T3-rtx timer start (pt1)", a.name) a.t3RTX.start(a.rtoMgr.getRTO()) for _, p := range a.bundleDataChunksIntoPackets(chunks) { - raw, err := p.marshal() + raw, err := a.marshalPacket(p) if err != nil { a.log.Warnf("[%s] failed to serialize a DATA packet", a.name) continue @@ -672,7 +758,7 @@ func (a *Association) gatherOutboundDataAndReconfigPackets(rawPackets [][]byte) a.log.Debugf("[%s] retransmit %d RECONFIG chunk(s)", a.name, len(a.reconfigs)) for _, c := range a.reconfigs { p := a.createPacket([]chunk{c}) - raw, err := p.marshal() + raw, err := a.marshalPacket(p) if err != nil { a.log.Warnf("[%s] failed to serialize a RECONFIG packet to be retransmitted", a.name) } else { @@ -695,7 +781,7 @@ func (a *Association) gatherOutboundDataAndReconfigPackets(rawPackets [][]byte) a.log.Debugf("[%s] sending RECONFIG: rsn=%d tsn=%d streams=%v", a.name, rsn, a.myNextTSN-1, sisToReset) p := a.createPacket([]chunk{c}) - raw, err := p.marshal() + raw, err := a.marshalPacket(p) if err != nil { a.log.Warnf("[%s] failed to serialize a RECONFIG packet to be transmitted", a.name) } else { @@ -744,7 +830,7 @@ func (a *Association) gatherOutboundFastRetransmissionPackets(rawPackets [][]byt // packet. dataChunkSize := dataChunkHeaderSize + uint32(len(c.userData)) - if a.mtu < fastRetransSize+dataChunkSize { + if a.MTU() < fastRetransSize+dataChunkSize { break } @@ -758,7 +844,7 @@ func (a *Association) gatherOutboundFastRetransmissionPackets(rawPackets [][]byt } if len(toFastRetrans) > 0 { - raw, err := a.createPacket(toFastRetrans).marshal() + raw, err := a.marshalPacket(a.createPacket(toFastRetrans)) if err != nil { a.log.Warnf("[%s] failed to serialize a DATA packet to be fast-retransmitted", a.name) } else { @@ -775,8 +861,9 @@ func (a *Association) gatherOutboundSackPackets(rawPackets [][]byte) [][]byte { if a.ackState == ackStateImmediate { a.ackState = ackStateIdle sack := a.createSelectiveAckChunk() + a.stats.incSACKsSent() a.log.Debugf("[%s] sending SACK: %s", a.name, sack) - raw, err := a.createPacket([]chunk{sack}).marshal() + raw, err := a.marshalPacket(a.createPacket([]chunk{sack})) if err != nil { a.log.Warnf("[%s] failed to serialize a SACK packet", a.name) } else { @@ -793,7 +880,7 @@ func (a *Association) gatherOutboundForwardTSNPackets(rawPackets [][]byte) [][]b a.willSendForwardTSN = false if sna32GT(a.advancedPeerTSNAckPoint, a.cumulativeTSNAckPoint) { fwdtsn := a.createForwardTSN() - raw, err := a.createPacket([]chunk{fwdtsn}).marshal() + raw, err := a.marshalPacket(a.createPacket([]chunk{fwdtsn})) if err != nil { a.log.Warnf("[%s] failed to serialize a Forward TSN packet", a.name) } else { @@ -816,7 +903,7 @@ func (a *Association) gatherOutboundShutdownPackets(rawPackets [][]byte) ([][]by cumulativeTSNAck: a.cumulativeTSNAckPoint, } - raw, err := a.createPacket([]chunk{shutdown}).marshal() + raw, err := a.marshalPacket(a.createPacket([]chunk{shutdown})) if err != nil { a.log.Warnf("[%s] failed to serialize a Shutdown packet", a.name) } else { @@ -828,7 +915,7 @@ func (a *Association) gatherOutboundShutdownPackets(rawPackets [][]byte) ([][]by shutdownAck := &chunkShutdownAck{} - raw, err := a.createPacket([]chunk{shutdownAck}).marshal() + raw, err := a.marshalPacket(a.createPacket([]chunk{shutdownAck})) if err != nil { a.log.Warnf("[%s] failed to serialize a ShutdownAck packet", a.name) } else { @@ -840,7 +927,7 @@ func (a *Association) gatherOutboundShutdownPackets(rawPackets [][]byte) ([][]by shutdownComplete := &chunkShutdownComplete{} - raw, err := a.createPacket([]chunk{shutdownComplete}).marshal() + raw, err := a.marshalPacket(a.createPacket([]chunk{shutdownComplete})) if err != nil { a.log.Warnf("[%s] failed to serialize a ShutdownComplete packet", a.name) } else { @@ -864,7 +951,7 @@ func (a *Association) gatherAbortPacket() ([]byte, error) { abort.errorCauses = []errorCause{cause} } - raw, err := a.createPacket([]chunk{abort}).marshal() + raw, err := a.marshalPacket(a.createPacket([]chunk{abort})) return raw, err } @@ -889,7 +976,7 @@ func (a *Association) gatherOutbound() ([][]byte, bool) { if a.controlQueue.size() > 0 { for _, p := range a.controlQueue.popAll() { - raw, err := p.marshal() + raw, err := a.marshalPacket(p) if err != nil { a.log.Warnf("[%s] failed to serialize a control packet", a.name) continue @@ -1021,16 +1108,41 @@ func (a *Association) CWND() uint32 { return atomic.LoadUint32(&a.cwnd) } +func (a *Association) setCWND(cwnd uint32) { + atomic.StoreUint32(&a.cwnd, cwnd) +} + // RWND returns the association's current receiver window (rwnd) func (a *Association) RWND() uint32 { return atomic.LoadUint32(&a.rwnd) } +func (a *Association) setRWND(rwnd uint32) { + atomic.StoreUint32(&a.rwnd, rwnd) +} + // SRTT returns the latest smoothed round-trip time (srrt) func (a *Association) SRTT() float64 { return a.srtt.Load().(float64) //nolint:forcetypeassert } +// getMaxTSNOffset returns the maximum offset over the current cummulative TSN that +// we are willing to enqueue. Limiting the maximum offset limits the number of +// tsns we have in the payloadQueue map. This ensures that we don't use too much space in +// the map itself. This also ensures that we keep the bytes utilized in the receive +// buffer within a small multiple of the user provided max receive buffer size. +func (a *Association) getMaxTSNOffset() uint32 { + // 4 is a magic number here. There is no theory behind this. + offset := (a.maxReceiveBufferSize * 4) / avgChunkSize + if offset < minTSNOffset { + offset = minTSNOffset + } + if offset > maxTSNOffset { + offset = maxTSNOffset + } + return offset +} + func setSupportedExtensions(init *chunkInitCommon) { // nolint:godox // TODO RFC5061 https://tools.ietf.org/html/rfc6525#section-5.2 @@ -1060,7 +1172,10 @@ func (a *Association) handleInit(p *packet, i *chunkInit) ([]*packet, error) { return nil, fmt.Errorf("%w: %s", ErrHandleInitState, getAssociationStateString(state)) } - // Should we be setting any of these permanently until we've ACKed further? + // NOTE: Setting these prior to a reception of a COOKIE ECHO chunk containing + // our cookie is not compliant with https://www.rfc-editor.org/rfc/rfc9260#section-5.1-2.2.3. + // It makes us more vulnerable to resource attacks, albeit minimally so. + // https://www.rfc-editor.org/rfc/rfc9260#sec_handle_stream_parameters a.myMaxNumInboundStreams = min16(i.numInboundStreams, a.myMaxNumInboundStreams) a.myMaxNumOutboundStreams = min16(i.numOutboundStreams, a.myMaxNumOutboundStreams) a.peerVerificationTag = i.initiateTag @@ -1082,8 +1197,11 @@ func (a *Association) handleInit(p *packet, i *chunkInit) ([]*packet, error) { a.useForwardTSN = true } } + case *paramZeroChecksumAcceptable: + a.sendZeroChecksum = v.edmid == dtlsErrorDetectionMethod } } + if !a.useForwardTSN { a.log.Warnf("[%s] not using ForwardTSN (on init)", a.name) } @@ -1094,6 +1212,7 @@ func (a *Association) handleInit(p *packet, i *chunkInit) ([]*packet, error) { outbound.destinationPort = a.destinationPort initAck := &chunkInitAck{} + a.log.Debug("sending INIT ACK") initAck.initialTSN = a.myNextTSN initAck.numOutboundStreams = a.myMaxNumOutboundStreams @@ -1103,6 +1222,8 @@ func (a *Association) handleInit(p *packet, i *chunkInit) ([]*packet, error) { if a.myCookie == nil { var err error + // NOTE: This generation process is not compliant with + // 5.1.3. Generating State Cookie (https://www.rfc-editor.org/rfc/rfc4960#section-5.1.3) if a.myCookie, err = newRandomStateCookie(); err != nil { return nil, err } @@ -1110,6 +1231,11 @@ func (a *Association) handleInit(p *packet, i *chunkInit) ([]*packet, error) { initAck.params = []param{a.myCookie} + if a.recvZeroChecksum { + initAck.params = append(initAck.params, ¶mZeroChecksumAcceptable{edmid: dtlsErrorDetectionMethod}) + } + a.log.Debugf("[%s] sendZeroChecksum=%t (on init)", a.name, a.sendZeroChecksum) + setSupportedExtensions(&initAck.chunkInitCommon) outbound.chunks = []chunk{initAck} @@ -1141,16 +1267,16 @@ func (a *Association) handleInitAck(p *packet, i *chunkInitAck) error { return nil } - a.rwnd = i.advertisedReceiverWindowCredit - a.log.Debugf("[%s] initial rwnd=%d", a.name, a.rwnd) + a.setRWND(i.advertisedReceiverWindowCredit) + a.log.Debugf("[%s] initial rwnd=%d", a.name, a.RWND()) // RFC 4690 Sec 7.2.1 // o The initial value of ssthresh MAY be arbitrarily high (for // example, implementations MAY use the size of the receiver // advertised window). - a.ssthresh = a.rwnd + a.ssthresh = a.RWND() a.log.Tracef("[%s] updated cwnd=%d ssthresh=%d inflight=%d (INI)", - a.name, a.cwnd, a.ssthresh, a.inflightQueue.getNumBytes()) + a.name, a.CWND(), a.ssthresh, a.inflightQueue.getNumBytes()) a.t1Init.stop() a.storedInit = nil @@ -1167,8 +1293,13 @@ func (a *Association) handleInitAck(p *packet, i *chunkInitAck) error { a.useForwardTSN = true } } + case *paramZeroChecksumAcceptable: + a.sendZeroChecksum = v.edmid == dtlsErrorDetectionMethod } } + + a.log.Debugf("[%s] sendZeroChecksum=%t (on initAck)", a.name, a.sendZeroChecksum) + if !a.useForwardTSN { a.log.Warnf("[%s] not using ForwardTSN (on initAck)", a.name) } @@ -1232,6 +1363,8 @@ func (a *Association) handleCookieEcho(c *chunkCookieEcho) []*packet { return nil } + // RFC wise, these do not seem to belong here, but removing them + // causes TestCookieEchoRetransmission to break a.t1Init.stop() a.storedInit = nil @@ -1239,6 +1372,7 @@ func (a *Association) handleCookieEcho(c *chunkCookieEcho) []*packet { a.storedCookieEcho = nil a.setState(established) + // Note: This is a future place where the user could be notified (COMMUNICATION UP) a.handshakeCompletedCh <- nil } @@ -1267,6 +1401,7 @@ func (a *Association) handleCookieAck() { a.storedCookieEcho = nil a.setState(established) + // Note: This is a future place where the user could be notified (COMMUNICATION UP) a.handshakeCompletedCh <- nil } @@ -1276,13 +1411,13 @@ func (a *Association) handleData(d *chunkPayloadData) []*packet { a.name, d.tsn, d.immediateSack, len(d.userData)) a.stats.incDATAs() - canPush := a.payloadQueue.canPush(d, a.peerLastTSN) + canPush := a.payloadQueue.canPush(d, a.peerLastTSN, a.getMaxTSNOffset()) if canPush { s := a.getOrCreateStream(d.streamIdentifier, true, PayloadTypeUnknown) if s == nil { - // silentely discard the data. (sender will retry on T3-rtx timeout) + // silently discard the data. (sender will retry on T3-rtx timeout) // see pion/sctp#30 - a.log.Debugf("discard %d", d.streamSequenceNumber) + a.log.Debugf("[%s] discard %d", a.name, d.streamSequenceNumber) return nil } @@ -1539,7 +1674,7 @@ func (a *Association) onCumulativeTSNAckPointAdvanced(totalBytesAcked int) { } // Update congestion control parameters - if a.cwnd <= a.ssthresh { + if a.CWND() <= a.ssthresh { // RFC 4096, sec 7.2.1. Slow-Start // o When cwnd is less than or equal to ssthresh, an SCTP endpoint MUST // use the slow-start algorithm to increase cwnd only if the current @@ -1553,13 +1688,13 @@ func (a *Association) onCumulativeTSNAckPointAdvanced(totalBytesAcked int) { // path MTU. if !a.inFastRecovery && a.pendingQueue.size() > 0 { - a.cwnd += min32(uint32(totalBytesAcked), a.cwnd) // TCP way - // a.cwnd += min32(uint32(totalBytesAcked), a.mtu) // SCTP way (slow) + a.setCWND(a.CWND() + min32(uint32(totalBytesAcked), a.CWND())) + // a.cwnd += min32(uint32(totalBytesAcked), a.MTU()) // SCTP way (slow) a.log.Tracef("[%s] updated cwnd=%d ssthresh=%d acked=%d (SS)", - a.name, a.cwnd, a.ssthresh, totalBytesAcked) + a.name, a.CWND(), a.ssthresh, totalBytesAcked) } else { a.log.Tracef("[%s] cwnd did not grow: cwnd=%d ssthresh=%d acked=%d FR=%v pending=%d", - a.name, a.cwnd, a.ssthresh, totalBytesAcked, a.inFastRecovery, a.pendingQueue.size()) + a.name, a.CWND(), a.ssthresh, totalBytesAcked, a.inFastRecovery, a.pendingQueue.size()) } } else { // RFC 4096, sec 7.2.2. Congestion Avoidance @@ -1575,11 +1710,11 @@ func (a *Association) onCumulativeTSNAckPointAdvanced(totalBytesAcked int) { // of data outstanding (i.e., before arrival of the SACK, flight size // was greater than or equal to cwnd), increase cwnd by MTU, and // reset partial_bytes_acked to (partial_bytes_acked - cwnd). - if a.partialBytesAcked >= a.cwnd && a.pendingQueue.size() > 0 { - a.partialBytesAcked -= a.cwnd - a.cwnd += a.mtu + if a.partialBytesAcked >= a.CWND() && a.pendingQueue.size() > 0 { + a.partialBytesAcked -= a.CWND() + a.setCWND(a.CWND() + a.MTU()) a.log.Tracef("[%s] updated cwnd=%d ssthresh=%d acked=%d (CA)", - a.name, a.cwnd, a.ssthresh, totalBytesAcked) + a.name, a.CWND(), a.ssthresh, totalBytesAcked) } } } @@ -1619,13 +1754,13 @@ func (a *Association) processFastRetransmission(cumTSNAckPoint, htna uint32, cum // last sent, according to the formula described in Section 7.2.3. a.inFastRecovery = true a.fastRecoverExitPoint = htna - a.ssthresh = max32(a.cwnd/2, 4*a.mtu) - a.cwnd = a.ssthresh + a.ssthresh = max32(a.CWND()/2, 4*a.MTU()) + a.setCWND(a.ssthresh) a.partialBytesAcked = 0 a.willRetransmitFast = true a.log.Tracef("[%s] updated cwnd=%d ssthresh=%d inflight=%d (FR)", - a.name, a.cwnd, a.ssthresh, a.inflightQueue.getNumBytes()) + a.name, a.CWND(), a.ssthresh, a.inflightQueue.getNumBytes()) } } } @@ -1647,7 +1782,7 @@ func (a *Association) handleSack(d *chunkSelectiveAck) error { return nil } - a.stats.incSACKs() + a.stats.incSACKsReceived() if sna32GT(a.cumulativeTSNAckPoint, d.cumulativeTSNAck) { // RFC 4960 sec 6.2.1. Processing a Received SACK @@ -1707,9 +1842,9 @@ func (a *Association) handleSack(d *chunkSelectiveAck) error { // bytes acked were already subtracted by markAsAcked() method bytesOutstanding := uint32(a.inflightQueue.getNumBytes()) if bytesOutstanding >= d.advertisedReceiverWindowCredit { - a.rwnd = 0 + a.setRWND(0) } else { - a.rwnd = d.advertisedReceiverWindowCredit - bytesOutstanding + a.setRWND(d.advertisedReceiverWindowCredit - bytesOutstanding) } err = a.processFastRetransmission(d.cumulativeTSNAck, htna, cumTSNAckPointAdvanced) @@ -2008,15 +2143,39 @@ func (a *Association) handleReconfigParam(raw param) (*packet, error) { switch p := raw.(type) { case *paramOutgoingResetRequest: a.log.Tracef("[%s] handleReconfigParam (OutgoingResetRequest)", a.name) + if a.peerLastTSN < p.senderLastTSN && len(a.reconfigRequests) >= maxReconfigRequests { + // We have too many reconfig requests outstanding. Drop the request and let + // the peer retransmit. A well behaved peer should only have 1 outstanding + // reconfig request. + // + // RFC 6525: https://www.rfc-editor.org/rfc/rfc6525.html#section-5.1.1 + // At any given time, there MUST NOT be more than one request in flight. + // So, if the Re-configuration Timer is running and the RE-CONFIG chunk + // contains at least one request parameter, the chunk MUST be buffered. + // chrome: https://chromium.googlesource.com/external/webrtc/+/refs/heads/main/net/dcsctp/socket/stream_reset_handler.cc#271 + return nil, fmt.Errorf("%w: %d", ErrTooManyReconfigRequests, len(a.reconfigRequests)) + } a.reconfigRequests[p.reconfigRequestSequenceNumber] = p resp := a.resetStreamsIfAny(p) if resp != nil { return resp, nil } return nil, nil //nolint:nilnil - case *paramReconfigResponse: a.log.Tracef("[%s] handleReconfigParam (ReconfigResponse)", a.name) + if p.result == reconfigResultInProgress { + // RFC 6525: https://www.rfc-editor.org/rfc/rfc6525.html#section-5.2.7 + // + // If the Result field indicates "In progress", the timer for the + // Re-configuration Request Sequence Number is started again. If + // the timer runs out, the RE-CONFIG chunk MUST be retransmitted + // but the corresponding error counters MUST NOT be incremented. + if _, ok := a.reconfigs[p.reconfigResponseSequenceNumber]; ok { + a.tReconfig.stop() + a.tReconfig.start(a.rtoMgr.getRTO()) + } + return nil, nil //nolint:nilnil + } delete(a.reconfigs, p.reconfigResponseSequenceNumber) if len(a.reconfigs) == 0 { a.tReconfig.stop() @@ -2117,7 +2276,7 @@ func (a *Association) popPendingDataChunksToSend() ([]*chunkPayloadData, []uint1 continue } - if uint32(a.inflightQueue.getNumBytes())+dataLen > a.cwnd { + if uint32(a.inflightQueue.getNumBytes())+dataLen > a.CWND() { break // would exceeds cwnd } @@ -2125,7 +2284,7 @@ func (a *Association) popPendingDataChunksToSend() ([]*chunkPayloadData, []uint1 break // no more rwnd } - a.rwnd -= dataLen + a.setRWND(a.RWND() - dataLen) a.movePendingDataChunkToInflightQueue(c) chunks = append(chunks, c) @@ -2160,14 +2319,15 @@ func (a *Association) bundleDataChunksIntoPackets(chunks []*chunkPayloadData) [] // single packet. Furthermore, DATA chunks being retransmitted MAY be // bundled with new DATA chunks, as long as the resulting packet size // does not exceed the path MTU. - if bytesInPacket+len(c.userData) > int(a.mtu) { + chunkSizeInPacket := int(dataChunkHeaderSize) + len(c.userData) + chunkSizeInPacket += getPadding(chunkSizeInPacket) + if bytesInPacket+chunkSizeInPacket > int(a.MTU()) { packets = append(packets, a.createPacket(chunksToSend)) chunksToSend = []chunk{} bytesInPacket = int(commonHeaderSize) } - chunksToSend = append(chunksToSend, c) - bytesInPacket += int(dataChunkHeaderSize) + len(c.userData) + bytesInPacket += chunkSizeInPacket } if len(chunksToSend) > 0 { @@ -2237,7 +2397,7 @@ func (a *Association) checkPartialReliabilityStatus(c *chunkPayloadData) { // that are not acked or abandoned yet. // The caller should hold the lock. func (a *Association) getDataPacketsToRetransmit() []*packet { - awnd := min32(a.cwnd, a.rwnd) + awnd := min32(a.CWND(), a.RWND()) chunks := []*chunkPayloadData{} var bytesToSend int var done bool @@ -2252,7 +2412,7 @@ func (a *Association) getDataPacketsToRetransmit() []*packet { continue } - if i == 0 && int(a.rwnd) < len(c.userData) { + if i == 0 && int(a.RWND()) < len(c.userData) { // Send it as a zero window probe done = true } else if bytesToSend+len(c.userData) > int(awnd) { @@ -2305,15 +2465,17 @@ func pack(p *packet) []*packet { return []*packet{p} } -func (a *Association) handleChunkStart() { +func (a *Association) handleChunksStart() { a.lock.Lock() defer a.lock.Unlock() + a.stats.incPacketsReceived() + a.delayedAckTriggered = false a.immediateAckTriggered = false } -func (a *Association) handleChunkEnd() { +func (a *Association) handleChunksEnd() { a.lock.Lock() defer a.lock.Unlock() @@ -2336,13 +2498,18 @@ func (a *Association) handleChunk(p *packet, c chunk) error { var err error if _, err = c.check(); err != nil { - a.log.Errorf("[ %s ] failed validating chunk: %s ", a.name, err) + a.log.Errorf("[%s] failed validating chunk: %s ", a.name, err) return nil } isAbort := false switch c := c.(type) { + // Note: We do not do the following for chunkInit, chunkInitAck, and chunkCookieEcho: + // If an endpoint receives an INIT, INIT ACK, or COOKIE ECHO chunk but decides not to establish the + // new association due to missing mandatory parameters in the received INIT or INIT ACK chunk, invalid + // parameter values, or lack of local resources, it SHOULD respond with an ABORT chunk. + case *chunkInit: packets, err = a.handleInit(p, c) @@ -2360,6 +2527,7 @@ func (a *Association) handleChunk(p *packet, c chunk) error { } a.log.Debugf("[%s] Error chunk, with following errors: %s", a.name, errStr) + // Note: chunkHeartbeatAck not handled? case *chunkHeartbeat: packets = a.handleHeartbeat(c) @@ -2414,6 +2582,12 @@ func (a *Association) onRetransmissionTimeout(id int, nRtos uint) { a.lock.Lock() defer a.lock.Unlock() + // TSN hasn't been incremented in 3 attempts. Speculatively + // toggle ZeroChecksum because old Pion versions had a broken implementation + if a.cumulativeTSNAckPoint+1 == a.initialTSN && nRtos%3 == 0 { + a.sendZeroChecksum = !a.sendZeroChecksum + } + if id == timerT1Init { err := a.sendInit() if err != nil { @@ -2457,10 +2631,10 @@ func (a *Association) onRetransmissionTimeout(id int, nRtos uint) { // ssthresh = max(cwnd/2, 4*MTU) // cwnd = 1*MTU - a.ssthresh = max32(a.cwnd/2, 4*a.mtu) - a.cwnd = a.mtu + a.ssthresh = max32(a.CWND()/2, 4*a.MTU()) + a.setCWND(a.MTU()) a.log.Tracef("[%s] updated cwnd=%d ssthresh=%d inflight=%d (RTO)", - a.name, a.cwnd, a.ssthresh, a.inflightQueue.getNumBytes()) + a.name, a.CWND(), a.ssthresh, a.inflightQueue.getNumBytes()) // RFC 3758 sec 3.5 // A5) Any time the T3-rtx timer expires, on any destination, the sender @@ -2485,7 +2659,7 @@ func (a *Association) onRetransmissionTimeout(id int, nRtos uint) { } } - a.log.Debugf("[%s] T3-rtx timed out: nRtos=%d cwnd=%d ssthresh=%d", a.name, nRtos, a.cwnd, a.ssthresh) + a.log.Debugf("[%s] T3-rtx timed out: nRtos=%d cwnd=%d ssthresh=%d", a.name, nRtos, a.CWND(), a.ssthresh) /* a.log.Debugf(" - advancedPeerTSNAckPoint=%d", a.advancedPeerTSNAckPoint) diff --git a/vendor/github.com/pion/sctp/association_stats.go b/vendor/github.com/pion/sctp/association_stats.go index 4ccb7be99..0e4e581ba 100644 --- a/vendor/github.com/pion/sctp/association_stats.go +++ b/vendor/github.com/pion/sctp/association_stats.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( @@ -5,11 +8,30 @@ import ( ) type associationStats struct { - nDATAs uint64 - nSACKs uint64 - nT3Timeouts uint64 - nAckTimeouts uint64 - nFastRetrans uint64 + nPacketsReceived uint64 + nPacketsSent uint64 + nDATAs uint64 + nSACKsReceived uint64 + nSACKsSent uint64 + nT3Timeouts uint64 + nAckTimeouts uint64 + nFastRetrans uint64 +} + +func (s *associationStats) incPacketsReceived() { + atomic.AddUint64(&s.nPacketsReceived, 1) +} + +func (s *associationStats) getNumPacketsReceived() uint64 { + return atomic.LoadUint64(&s.nPacketsReceived) +} + +func (s *associationStats) incPacketsSent() { + atomic.AddUint64(&s.nPacketsSent, 1) +} + +func (s *associationStats) getNumPacketsSent() uint64 { + return atomic.LoadUint64(&s.nPacketsSent) } func (s *associationStats) incDATAs() { @@ -20,12 +42,20 @@ func (s *associationStats) getNumDATAs() uint64 { return atomic.LoadUint64(&s.nDATAs) } -func (s *associationStats) incSACKs() { - atomic.AddUint64(&s.nSACKs, 1) +func (s *associationStats) incSACKsReceived() { + atomic.AddUint64(&s.nSACKsReceived, 1) } -func (s *associationStats) getNumSACKs() uint64 { - return atomic.LoadUint64(&s.nSACKs) +func (s *associationStats) getNumSACKsReceived() uint64 { + return atomic.LoadUint64(&s.nSACKsReceived) +} + +func (s *associationStats) incSACKsSent() { + atomic.AddUint64(&s.nSACKsSent, 1) +} + +func (s *associationStats) getNumSACKsSent() uint64 { + return atomic.LoadUint64(&s.nSACKsSent) } func (s *associationStats) incT3Timeouts() { @@ -53,8 +83,11 @@ func (s *associationStats) getNumFastRetrans() uint64 { } func (s *associationStats) reset() { + atomic.StoreUint64(&s.nPacketsReceived, 0) + atomic.StoreUint64(&s.nPacketsSent, 0) atomic.StoreUint64(&s.nDATAs, 0) - atomic.StoreUint64(&s.nSACKs, 0) + atomic.StoreUint64(&s.nSACKsReceived, 0) + atomic.StoreUint64(&s.nSACKsSent, 0) atomic.StoreUint64(&s.nT3Timeouts, 0) atomic.StoreUint64(&s.nAckTimeouts, 0) atomic.StoreUint64(&s.nFastRetrans, 0) diff --git a/vendor/github.com/pion/sctp/chunk.go b/vendor/github.com/pion/sctp/chunk.go index ec47da17a..50b8a2e4d 100644 --- a/vendor/github.com/pion/sctp/chunk.go +++ b/vendor/github.com/pion/sctp/chunk.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp type chunk interface { diff --git a/vendor/github.com/pion/sctp/chunk_abort.go b/vendor/github.com/pion/sctp/chunk_abort.go index eab64a4f4..eaed69785 100644 --- a/vendor/github.com/pion/sctp/chunk_abort.go +++ b/vendor/github.com/pion/sctp/chunk_abort.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp // nolint:dupl import ( diff --git a/vendor/github.com/pion/sctp/chunk_cookie_ack.go b/vendor/github.com/pion/sctp/chunk_cookie_ack.go index 5d63b1c48..814ed2ca4 100644 --- a/vendor/github.com/pion/sctp/chunk_cookie_ack.go +++ b/vendor/github.com/pion/sctp/chunk_cookie_ack.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( diff --git a/vendor/github.com/pion/sctp/chunk_cookie_echo.go b/vendor/github.com/pion/sctp/chunk_cookie_echo.go index 8eb956647..23a2fc26e 100644 --- a/vendor/github.com/pion/sctp/chunk_cookie_echo.go +++ b/vendor/github.com/pion/sctp/chunk_cookie_echo.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( diff --git a/vendor/github.com/pion/sctp/chunk_error.go b/vendor/github.com/pion/sctp/chunk_error.go index d2a2b2971..b62be3ae2 100644 --- a/vendor/github.com/pion/sctp/chunk_error.go +++ b/vendor/github.com/pion/sctp/chunk_error.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp // nolint:dupl import ( diff --git a/vendor/github.com/pion/sctp/chunk_forward_tsn.go b/vendor/github.com/pion/sctp/chunk_forward_tsn.go index 70b5079f0..b053e98e9 100644 --- a/vendor/github.com/pion/sctp/chunk_forward_tsn.go +++ b/vendor/github.com/pion/sctp/chunk_forward_tsn.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( diff --git a/vendor/github.com/pion/sctp/chunk_heartbeat.go b/vendor/github.com/pion/sctp/chunk_heartbeat.go index 3cfcd5ada..64914a360 100644 --- a/vendor/github.com/pion/sctp/chunk_heartbeat.go +++ b/vendor/github.com/pion/sctp/chunk_heartbeat.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( diff --git a/vendor/github.com/pion/sctp/chunk_heartbeat_ack.go b/vendor/github.com/pion/sctp/chunk_heartbeat_ack.go index 3d21b593d..6d825e00c 100644 --- a/vendor/github.com/pion/sctp/chunk_heartbeat_ack.go +++ b/vendor/github.com/pion/sctp/chunk_heartbeat_ack.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( diff --git a/vendor/github.com/pion/sctp/chunk_init.go b/vendor/github.com/pion/sctp/chunk_init.go index 8eab506b9..a6a3be319 100644 --- a/vendor/github.com/pion/sctp/chunk_init.go +++ b/vendor/github.com/pion/sctp/chunk_init.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp // nolint:dupl import ( @@ -35,6 +38,7 @@ var ( ErrInitInboundStreamRequestZero = errors.New("INIT ACK inbound stream request must be > 0") ErrInitOutboundStreamRequestZero = errors.New("INIT ACK outbound stream request must be > 0") ErrInitAdvertisedReceiver1500 = errors.New("INIT ACK Advertised Receiver Window Credit (a_rwnd) must be >= 1500") + ErrInitUnknownParam = errors.New("INIT with unknown param") ) func (i *chunkInit) unmarshal(raw []byte) error { @@ -86,8 +90,7 @@ func (i *chunkInit) check() (abort bool, err error) { // to be 0, the receiver MUST treat it as an error and close the // association by transmitting an ABORT. if i.initiateTag == 0 { - abort = true - return abort, ErrChunkTypeInitInitateTagZero + return true, ErrChunkTypeInitInitateTagZero } // Defines the maximum number of streams the sender of this INIT @@ -101,8 +104,7 @@ func (i *chunkInit) check() (abort bool, err error) { // Note: A receiver of an INIT with the MIS value of 0 SHOULD abort // the association. if i.numInboundStreams == 0 { - abort = true - return abort, ErrInitInboundStreamRequestZero + return true, ErrInitInboundStreamRequestZero } // Defines the number of outbound streams the sender of this INIT @@ -113,8 +115,7 @@ func (i *chunkInit) check() (abort bool, err error) { // abort the association. if i.numOutboundStreams == 0 { - abort = true - return abort, ErrInitOutboundStreamRequestZero + return true, ErrInitOutboundStreamRequestZero } // An SCTP receiver MUST be able to receive a minimum of 1500 bytes in @@ -122,8 +123,14 @@ func (i *chunkInit) check() (abort bool, err error) { // less than 1500 bytes in its initial a_rwnd sent in the INIT or INIT // ACK. if i.advertisedReceiverWindowCredit < 1500 { - abort = true - return abort, ErrInitAdvertisedReceiver1500 + return true, ErrInitAdvertisedReceiver1500 + } + + for _, p := range i.unrecognizedParams { + if p.unrecognizedAction == paramHeaderUnrecognizedActionStop || + p.unrecognizedAction == paramHeaderUnrecognizedActionStopAndReport { + return true, ErrInitUnknownParam + } } return false, nil diff --git a/vendor/github.com/pion/sctp/chunk_init_ack.go b/vendor/github.com/pion/sctp/chunk_init_ack.go index c34f1d6b6..ab790bd82 100644 --- a/vendor/github.com/pion/sctp/chunk_init_ack.go +++ b/vendor/github.com/pion/sctp/chunk_init_ack.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp // nolint:dupl import ( diff --git a/vendor/github.com/pion/sctp/chunk_init_common.go b/vendor/github.com/pion/sctp/chunk_init_common.go index c2ccfadc0..b3f8b8459 100644 --- a/vendor/github.com/pion/sctp/chunk_init_common.go +++ b/vendor/github.com/pion/sctp/chunk_init_common.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( @@ -46,6 +49,7 @@ type chunkInitCommon struct { numInboundStreams uint16 initialTSN uint32 params []param + unrecognizedParams []paramHeader } const ( @@ -56,7 +60,6 @@ const ( // Init chunk errors var ( ErrInitChunkParseParamTypeFailed = errors.New("failed to parse param type") - ErrInitChunkUnmarshalParam = errors.New("failed unmarshalling param in Init Chunk") ErrInitAckMarshalParam = errors.New("unable to marshal parameter for INIT/INITACK") ) @@ -88,18 +91,21 @@ func (i *chunkInitCommon) unmarshal(raw []byte) error { remaining := len(raw) - offset for remaining > 0 { if remaining > initOptionalVarHeaderLength { - pType, err := parseParamType(raw[offset:]) - if err != nil { + var pHeader paramHeader + if err := pHeader.unmarshal(raw[offset:]); err != nil { return fmt.Errorf("%w: %v", ErrInitChunkParseParamTypeFailed, err) //nolint:errorlint } - p, err := buildParam(pType, raw[offset:]) + + p, err := buildParam(pHeader.typ, raw[offset:]) if err != nil { - return fmt.Errorf("%w: %v", ErrInitChunkUnmarshalParam, err) //nolint:errorlint + i.unrecognizedParams = append(i.unrecognizedParams, pHeader) + } else { + i.params = append(i.params, p) } - i.params = append(i.params, p) - padding := getPadding(p.length()) - offset += p.length() + padding - remaining -= p.length() + padding + + padding := getPadding(pHeader.length()) + offset += pHeader.length() + padding + remaining -= pHeader.length() + padding } else { break } diff --git a/vendor/github.com/pion/sctp/chunk_payload_data.go b/vendor/github.com/pion/sctp/chunk_payload_data.go index 50554ac45..a6e50db93 100644 --- a/vendor/github.com/pion/sctp/chunk_payload_data.go +++ b/vendor/github.com/pion/sctp/chunk_payload_data.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( @@ -203,3 +206,7 @@ func (p *chunkPayloadData) setAllInflight() { } } } + +func (p *chunkPayloadData) isFragmented() bool { + return !(p.head == nil && p.beginningFragment && p.endingFragment) +} diff --git a/vendor/github.com/pion/sctp/chunk_reconfig.go b/vendor/github.com/pion/sctp/chunk_reconfig.go index 9b018b213..39cb1fbd5 100644 --- a/vendor/github.com/pion/sctp/chunk_reconfig.go +++ b/vendor/github.com/pion/sctp/chunk_reconfig.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( diff --git a/vendor/github.com/pion/sctp/chunk_selective_ack.go b/vendor/github.com/pion/sctp/chunk_selective_ack.go index 28223a920..0d60b6a27 100644 --- a/vendor/github.com/pion/sctp/chunk_selective_ack.go +++ b/vendor/github.com/pion/sctp/chunk_selective_ack.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( diff --git a/vendor/github.com/pion/sctp/chunk_shutdown.go b/vendor/github.com/pion/sctp/chunk_shutdown.go index bcd9fc155..9cc756c1d 100644 --- a/vendor/github.com/pion/sctp/chunk_shutdown.go +++ b/vendor/github.com/pion/sctp/chunk_shutdown.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( diff --git a/vendor/github.com/pion/sctp/chunk_shutdown_ack.go b/vendor/github.com/pion/sctp/chunk_shutdown_ack.go index a8bb8d0c2..87f417001 100644 --- a/vendor/github.com/pion/sctp/chunk_shutdown_ack.go +++ b/vendor/github.com/pion/sctp/chunk_shutdown_ack.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( diff --git a/vendor/github.com/pion/sctp/chunk_shutdown_complete.go b/vendor/github.com/pion/sctp/chunk_shutdown_complete.go index 4de045d62..9652f8878 100644 --- a/vendor/github.com/pion/sctp/chunk_shutdown_complete.go +++ b/vendor/github.com/pion/sctp/chunk_shutdown_complete.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( diff --git a/vendor/github.com/pion/sctp/chunkheader.go b/vendor/github.com/pion/sctp/chunkheader.go index 6e9a5e9d6..60b903b4b 100644 --- a/vendor/github.com/pion/sctp/chunkheader.go +++ b/vendor/github.com/pion/sctp/chunkheader.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( diff --git a/vendor/github.com/pion/sctp/chunktype.go b/vendor/github.com/pion/sctp/chunktype.go index 65b57a463..ed7e60cce 100644 --- a/vendor/github.com/pion/sctp/chunktype.go +++ b/vendor/github.com/pion/sctp/chunktype.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import "fmt" diff --git a/vendor/github.com/pion/sctp/codecov.yml b/vendor/github.com/pion/sctp/codecov.yml index 085200a48..263e4d45c 100644 --- a/vendor/github.com/pion/sctp/codecov.yml +++ b/vendor/github.com/pion/sctp/codecov.yml @@ -3,6 +3,8 @@ # # It is automatically copied from https://github.com/pion/.goassets repository. # +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT coverage: status: diff --git a/vendor/github.com/pion/sctp/control_queue.go b/vendor/github.com/pion/sctp/control_queue.go index 7e1346935..5c417bf01 100644 --- a/vendor/github.com/pion/sctp/control_queue.go +++ b/vendor/github.com/pion/sctp/control_queue.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp // control queue diff --git a/vendor/github.com/pion/sctp/error_cause.go b/vendor/github.com/pion/sctp/error_cause.go index 9e5e68d85..bb1c7c8c6 100644 --- a/vendor/github.com/pion/sctp/error_cause.go +++ b/vendor/github.com/pion/sctp/error_cause.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( diff --git a/vendor/github.com/pion/sctp/error_cause_header.go b/vendor/github.com/pion/sctp/error_cause_header.go index 1ad6e1da4..84ff209d2 100644 --- a/vendor/github.com/pion/sctp/error_cause_header.go +++ b/vendor/github.com/pion/sctp/error_cause_header.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( diff --git a/vendor/github.com/pion/sctp/error_cause_invalid_mandatory_parameter.go b/vendor/github.com/pion/sctp/error_cause_invalid_mandatory_parameter.go index 3da8b4783..e73774bfd 100644 --- a/vendor/github.com/pion/sctp/error_cause_invalid_mandatory_parameter.go +++ b/vendor/github.com/pion/sctp/error_cause_invalid_mandatory_parameter.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp // errorCauseInvalidMandatoryParameter represents an SCTP error cause diff --git a/vendor/github.com/pion/sctp/error_cause_protocol_violation.go b/vendor/github.com/pion/sctp/error_cause_protocol_violation.go index 5434e0e3e..5861aeddf 100644 --- a/vendor/github.com/pion/sctp/error_cause_protocol_violation.go +++ b/vendor/github.com/pion/sctp/error_cause_protocol_violation.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( diff --git a/vendor/github.com/pion/sctp/error_cause_unrecognized_chunk_type.go b/vendor/github.com/pion/sctp/error_cause_unrecognized_chunk_type.go index fee9a3603..84ea0e101 100644 --- a/vendor/github.com/pion/sctp/error_cause_unrecognized_chunk_type.go +++ b/vendor/github.com/pion/sctp/error_cause_unrecognized_chunk_type.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp // errorCauseUnrecognizedChunkType represents an SCTP error cause diff --git a/vendor/github.com/pion/sctp/error_cause_user_initiated_abort.go b/vendor/github.com/pion/sctp/error_cause_user_initiated_abort.go index 1dee93733..871460e24 100644 --- a/vendor/github.com/pion/sctp/error_cause_user_initiated_abort.go +++ b/vendor/github.com/pion/sctp/error_cause_user_initiated_abort.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( diff --git a/vendor/github.com/pion/sctp/packet.go b/vendor/github.com/pion/sctp/packet.go index 7bc22c82f..72660f3e9 100644 --- a/vendor/github.com/pion/sctp/packet.go +++ b/vendor/github.com/pion/sctp/packet.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( @@ -62,16 +65,35 @@ var ( ErrChecksumMismatch = errors.New("checksum mismatch theirs") ) -func (p *packet) unmarshal(raw []byte) error { +func (p *packet) unmarshal(doChecksum bool, raw []byte) error { if len(raw) < packetHeaderSize { return fmt.Errorf("%w: raw only %d bytes, %d is the minimum length", ErrPacketRawTooSmall, len(raw), packetHeaderSize) } + offset := packetHeaderSize + + // Check if doing CRC32c is required. + // Without having SCTP AUTH implemented, this depends only on the type + // og the first chunk. + if offset+chunkHeaderSize <= len(raw) { + switch chunkType(raw[offset]) { + case ctInit, ctCookieEcho: + doChecksum = true + default: + } + } + theirChecksum := binary.LittleEndian.Uint32(raw[8:]) + if theirChecksum != 0 || doChecksum { + ourChecksum := generatePacketChecksum(raw) + if theirChecksum != ourChecksum { + return fmt.Errorf("%w: %d ours: %d", ErrChecksumMismatch, theirChecksum, ourChecksum) + } + } + p.sourcePort = binary.BigEndian.Uint16(raw[0:]) p.destinationPort = binary.BigEndian.Uint16(raw[2:]) p.verificationTag = binary.BigEndian.Uint32(raw[4:]) - offset := packetHeaderSize for { // Exact match, no more chunks if offset == len(raw) { @@ -122,15 +144,11 @@ func (p *packet) unmarshal(raw []byte) error { chunkValuePadding := getPadding(c.valueLength()) offset += chunkHeaderSize + c.valueLength() + chunkValuePadding } - theirChecksum := binary.LittleEndian.Uint32(raw[8:]) - ourChecksum := generatePacketChecksum(raw) - if theirChecksum != ourChecksum { - return fmt.Errorf("%w: %d ours: %d", ErrChecksumMismatch, theirChecksum, ourChecksum) - } + return nil } -func (p *packet) marshal() ([]byte, error) { +func (p *packet) marshal(doChecksum bool) ([]byte, error) { raw := make([]byte, packetHeaderSize) // Populate static headers @@ -153,9 +171,16 @@ func (p *packet) marshal() ([]byte, error) { } } - // Checksum is already in BigEndian - // Using LittleEndian.PutUint32 stops it from being flipped - binary.LittleEndian.PutUint32(raw[8:], generatePacketChecksum(raw)) + if doChecksum { + // golang CRC32C uses reflected input and reflected output, the + // net result of this is to have the bytes flipped compared to + // the non reflected variant that the spec expects. + // + // Use LittleEndian.PutUint32 to avoid flipping the bytes in to + // the spec compliant checksum order + binary.LittleEndian.PutUint32(raw[8:], generatePacketChecksum(raw)) + } + return raw, nil } diff --git a/vendor/github.com/pion/sctp/param.go b/vendor/github.com/pion/sctp/param.go index a23935341..c28d7a5b7 100644 --- a/vendor/github.com/pion/sctp/param.go +++ b/vendor/github.com/pion/sctp/param.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( @@ -35,6 +38,8 @@ func buildParam(t paramType, rawParam []byte) (param, error) { return (¶mOutgoingResetRequest{}).unmarshal(rawParam) case reconfigResp: return (¶mReconfigResponse{}).unmarshal(rawParam) + case zeroChecksumAcceptable: + return (¶mZeroChecksumAcceptable{}).unmarshal(rawParam) default: return nil, fmt.Errorf("%w: %v", ErrParamTypeUnhandled, t) } diff --git a/vendor/github.com/pion/sctp/param_chunk_list.go b/vendor/github.com/pion/sctp/param_chunk_list.go index 4ea484c9f..fe8905208 100644 --- a/vendor/github.com/pion/sctp/param_chunk_list.go +++ b/vendor/github.com/pion/sctp/param_chunk_list.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp type paramChunkList struct { diff --git a/vendor/github.com/pion/sctp/param_ecn_capable.go b/vendor/github.com/pion/sctp/param_ecn_capable.go index 7845743fb..d6cd0d320 100644 --- a/vendor/github.com/pion/sctp/param_ecn_capable.go +++ b/vendor/github.com/pion/sctp/param_ecn_capable.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp type paramECNCapable struct { diff --git a/vendor/github.com/pion/sctp/param_forward_tsn_supported.go b/vendor/github.com/pion/sctp/param_forward_tsn_supported.go index 62de15570..655a93ff8 100644 --- a/vendor/github.com/pion/sctp/param_forward_tsn_supported.go +++ b/vendor/github.com/pion/sctp/param_forward_tsn_supported.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp // At the initialization of the association, the sender of the INIT or diff --git a/vendor/github.com/pion/sctp/param_heartbeat_info.go b/vendor/github.com/pion/sctp/param_heartbeat_info.go index 47f64eb87..06f70486d 100644 --- a/vendor/github.com/pion/sctp/param_heartbeat_info.go +++ b/vendor/github.com/pion/sctp/param_heartbeat_info.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp type paramHeartbeatInfo struct { diff --git a/vendor/github.com/pion/sctp/param_outgoing_reset_request.go b/vendor/github.com/pion/sctp/param_outgoing_reset_request.go index 8ec0bf6cc..45ee28f95 100644 --- a/vendor/github.com/pion/sctp/param_outgoing_reset_request.go +++ b/vendor/github.com/pion/sctp/param_outgoing_reset_request.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( diff --git a/vendor/github.com/pion/sctp/param_random.go b/vendor/github.com/pion/sctp/param_random.go index dc454b358..4a80aa01b 100644 --- a/vendor/github.com/pion/sctp/param_random.go +++ b/vendor/github.com/pion/sctp/param_random.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp type paramRandom struct { diff --git a/vendor/github.com/pion/sctp/param_reconfig_response.go b/vendor/github.com/pion/sctp/param_reconfig_response.go index e3bfab5a4..e35f16a15 100644 --- a/vendor/github.com/pion/sctp/param_reconfig_response.go +++ b/vendor/github.com/pion/sctp/param_reconfig_response.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( diff --git a/vendor/github.com/pion/sctp/param_requested_hmac_algorithm.go b/vendor/github.com/pion/sctp/param_requested_hmac_algorithm.go index d546af88a..ca9b01470 100644 --- a/vendor/github.com/pion/sctp/param_requested_hmac_algorithm.go +++ b/vendor/github.com/pion/sctp/param_requested_hmac_algorithm.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( diff --git a/vendor/github.com/pion/sctp/param_state_cookie.go b/vendor/github.com/pion/sctp/param_state_cookie.go index 9681267d5..dbf8992e7 100644 --- a/vendor/github.com/pion/sctp/param_state_cookie.go +++ b/vendor/github.com/pion/sctp/param_state_cookie.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( diff --git a/vendor/github.com/pion/sctp/param_supported_extensions.go b/vendor/github.com/pion/sctp/param_supported_extensions.go index 2935524ca..0441053a1 100644 --- a/vendor/github.com/pion/sctp/param_supported_extensions.go +++ b/vendor/github.com/pion/sctp/param_supported_extensions.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp type paramSupportedExtensions struct { diff --git a/vendor/github.com/pion/sctp/param_zero_checksum.go b/vendor/github.com/pion/sctp/param_zero_checksum.go new file mode 100644 index 000000000..ddf7c5af0 --- /dev/null +++ b/vendor/github.com/pion/sctp/param_zero_checksum.go @@ -0,0 +1,56 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "encoding/binary" + "errors" +) + +// This parameter is used to inform the receiver that a sender is willing to +// accept zero as checksum if some other error detection method is used +// instead. +// +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Type = 0x8001 (suggested) | Length = 8 | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Error Detection Method Identifier (EDMID) | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +type paramZeroChecksumAcceptable struct { + paramHeader + // The Error Detection Method Identifier (EDMID) specifies an alternate + // error detection method the sender of this parameter is willing to use for + // received packets. + edmid uint32 +} + +// Zero Checksum parameter error +var ( + ErrZeroChecksumParamTooShort = errors.New("zero checksum parameter too short") +) + +const ( + dtlsErrorDetectionMethod uint32 = 1 +) + +func (r *paramZeroChecksumAcceptable) marshal() ([]byte, error) { + r.typ = zeroChecksumAcceptable + r.raw = make([]byte, 4) + binary.BigEndian.PutUint32(r.raw, r.edmid) + return r.paramHeader.marshal() +} + +func (r *paramZeroChecksumAcceptable) unmarshal(raw []byte) (param, error) { + err := r.paramHeader.unmarshal(raw) + if err != nil { + return nil, err + } + if len(r.raw) < 4 { + return nil, ErrZeroChecksumParamTooShort + } + r.edmid = binary.BigEndian.Uint32(r.raw) + return r, nil +} diff --git a/vendor/github.com/pion/sctp/paramheader.go b/vendor/github.com/pion/sctp/paramheader.go index f3cbf74ca..5b694428e 100644 --- a/vendor/github.com/pion/sctp/paramheader.go +++ b/vendor/github.com/pion/sctp/paramheader.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( @@ -7,13 +10,40 @@ import ( "fmt" ) +type paramHeaderUnrecognizedAction byte + type paramHeader struct { - typ paramType - len int - raw []byte + typ paramType + unrecognizedAction paramHeaderUnrecognizedAction + len int + raw []byte } +/* + The Parameter Types are encoded such that the highest-order 2 bits specify + the action that is taken if the processing endpoint does not recognize the + Parameter Type. + + 00 - Stop processing this parameter and do not process any further parameters within this chunk. + + 01 - Stop processing this parameter, do not process any further parameters within this chunk, and + report the unrecognized parameter, as described in Section 3.2.2. + + 10 - Skip this parameter and continue processing. + + 11 - Skip this parameter and continue processing, but report the unrecognized + parameter, as described in Section 3.2.2. + + https://www.rfc-editor.org/rfc/rfc9260.html#section-3.2.1 +*/ + const ( + paramHeaderUnrecognizedActionMask = 0b11000000 + paramHeaderUnrecognizedActionStop paramHeaderUnrecognizedAction = 0b00000000 + paramHeaderUnrecognizedActionStopAndReport paramHeaderUnrecognizedAction = 0b01000000 + paramHeaderUnrecognizedActionSkip paramHeaderUnrecognizedAction = 0b10000000 + paramHeaderUnrecognizedActionSkipAndReport paramHeaderUnrecognizedAction = 0b11000000 + paramHeaderLength = 4 ) @@ -54,6 +84,7 @@ func (p *paramHeader) unmarshal(raw []byte) error { return fmt.Errorf("%w: %v", ErrParamHeaderParseFailed, err) //nolint:errorlint } p.typ = typ + p.unrecognizedAction = paramHeaderUnrecognizedAction(raw[0] & paramHeaderUnrecognizedActionMask) p.raw = raw[paramHeaderLength:paramLengthPlusHeader] p.len = int(paramLengthPlusHeader) diff --git a/vendor/github.com/pion/sctp/paramtype.go b/vendor/github.com/pion/sctp/paramtype.go index 2db73ddec..de1b3dd94 100644 --- a/vendor/github.com/pion/sctp/paramtype.go +++ b/vendor/github.com/pion/sctp/paramtype.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( @@ -10,33 +13,34 @@ import ( type paramType uint16 const ( - heartbeatInfo paramType = 1 // Heartbeat Info [RFC4960] - ipV4Addr paramType = 5 // IPv4 IP [RFC4960] - ipV6Addr paramType = 6 // IPv6 IP [RFC4960] - stateCookie paramType = 7 // State Cookie [RFC4960] - unrecognizedParam paramType = 8 // Unrecognized Parameters [RFC4960] - cookiePreservative paramType = 9 // Cookie Preservative [RFC4960] - hostNameAddr paramType = 11 // Host Name IP [RFC4960] - supportedAddrTypes paramType = 12 // Supported IP Types [RFC4960] - outSSNResetReq paramType = 13 // Outgoing SSN Reset Request Parameter [RFC6525] - incSSNResetReq paramType = 14 // Incoming SSN Reset Request Parameter [RFC6525] - ssnTSNResetReq paramType = 15 // SSN/TSN Reset Request Parameter [RFC6525] - reconfigResp paramType = 16 // Re-configuration Response Parameter [RFC6525] - addOutStreamsReq paramType = 17 // Add Outgoing Streams Request Parameter [RFC6525] - addIncStreamsReq paramType = 18 // Add Incoming Streams Request Parameter [RFC6525] - ecnCapable paramType = 32768 // ECN Capable (0x8000) [RFC2960] - random paramType = 32770 // Random (0x8002) [RFC4805] - chunkList paramType = 32771 // Chunk List (0x8003) [RFC4895] - reqHMACAlgo paramType = 32772 // Requested HMAC Algorithm Parameter (0x8004) [RFC4895] - padding paramType = 32773 // Padding (0x8005) - supportedExt paramType = 32776 // Supported Extensions (0x8008) [RFC5061] - forwardTSNSupp paramType = 49152 // Forward TSN supported (0xC000) [RFC3758] - addIPAddr paramType = 49153 // Add IP IP (0xC001) [RFC5061] - delIPAddr paramType = 49154 // Delete IP IP (0xC002) [RFC5061] - errClauseInd paramType = 49155 // Error Cause Indication (0xC003) [RFC5061] - setPriAddr paramType = 49156 // Set Primary IP (0xC004) [RFC5061] - successInd paramType = 49157 // Success Indication (0xC005) [RFC5061] - adaptLayerInd paramType = 49158 // Adaptation Layer Indication (0xC006) [RFC5061] + heartbeatInfo paramType = 1 // Heartbeat Info [RFC4960] + ipV4Addr paramType = 5 // IPv4 IP [RFC4960] + ipV6Addr paramType = 6 // IPv6 IP [RFC4960] + stateCookie paramType = 7 // State Cookie [RFC4960] + unrecognizedParam paramType = 8 // Unrecognized Parameters [RFC4960] + cookiePreservative paramType = 9 // Cookie Preservative [RFC4960] + hostNameAddr paramType = 11 // Host Name IP [RFC4960] + supportedAddrTypes paramType = 12 // Supported IP Types [RFC4960] + outSSNResetReq paramType = 13 // Outgoing SSN Reset Request Parameter [RFC6525] + incSSNResetReq paramType = 14 // Incoming SSN Reset Request Parameter [RFC6525] + ssnTSNResetReq paramType = 15 // SSN/TSN Reset Request Parameter [RFC6525] + reconfigResp paramType = 16 // Re-configuration Response Parameter [RFC6525] + addOutStreamsReq paramType = 17 // Add Outgoing Streams Request Parameter [RFC6525] + addIncStreamsReq paramType = 18 // Add Incoming Streams Request Parameter [RFC6525] + ecnCapable paramType = 32768 // ECN Capable (0x8000) [RFC2960] + zeroChecksumAcceptable paramType = 32769 // Zero Checksum Acceptable [draft-ietf-tsvwg-sctp-zero-checksum-00] + random paramType = 32770 // Random (0x8002) [RFC4805] + chunkList paramType = 32771 // Chunk List (0x8003) [RFC4895] + reqHMACAlgo paramType = 32772 // Requested HMAC Algorithm Parameter (0x8004) [RFC4895] + padding paramType = 32773 // Padding (0x8005) + supportedExt paramType = 32776 // Supported Extensions (0x8008) [RFC5061] + forwardTSNSupp paramType = 49152 // Forward TSN supported (0xC000) [RFC3758] + addIPAddr paramType = 49153 // Add IP IP (0xC001) [RFC5061] + delIPAddr paramType = 49154 // Delete IP IP (0xC002) [RFC5061] + errClauseInd paramType = 49155 // Error Cause Indication (0xC003) [RFC5061] + setPriAddr paramType = 49156 // Set Primary IP (0xC004) [RFC5061] + successInd paramType = 49157 // Success Indication (0xC005) [RFC5061] + adaptLayerInd paramType = 49158 // Adaptation Layer Indication (0xC006) [RFC5061] ) // Parameter packet errors @@ -83,6 +87,8 @@ func (p paramType) String() string { return "Add Incoming Streams Request Parameter" case ecnCapable: return "ECN Capable" + case zeroChecksumAcceptable: + return "Zero Checksum Acceptable" case random: return "Random" case chunkList: diff --git a/vendor/github.com/pion/sctp/payload_queue.go b/vendor/github.com/pion/sctp/payload_queue.go index 2d1a35a81..a0b1b26f3 100644 --- a/vendor/github.com/pion/sctp/payload_queue.go +++ b/vendor/github.com/pion/sctp/payload_queue.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( @@ -33,9 +36,9 @@ func (q *payloadQueue) updateSortedKeys() { }) } -func (q *payloadQueue) canPush(p *chunkPayloadData, cumulativeTSN uint32) bool { +func (q *payloadQueue) canPush(p *chunkPayloadData, cumulativeTSN uint32, maxTSNOffset uint32) bool { _, ok := q.chunkMap[p.tsn] - if ok || sna32LTE(p.tsn, cumulativeTSN) { + if ok || sna32LTE(p.tsn, cumulativeTSN) || sna32GTE(p.tsn, cumulativeTSN+maxTSNOffset) { return false } return true diff --git a/vendor/github.com/pion/sctp/pending_queue.go b/vendor/github.com/pion/sctp/pending_queue.go index 8082cf52f..6f70fea23 100644 --- a/vendor/github.com/pion/sctp/pending_queue.go +++ b/vendor/github.com/pion/sctp/pending_queue.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( diff --git a/vendor/github.com/pion/sctp/reassembly_queue.go b/vendor/github.com/pion/sctp/reassembly_queue.go index d00c046a9..e0d527c0c 100644 --- a/vendor/github.com/pion/sctp/reassembly_queue.go +++ b/vendor/github.com/pion/sctp/reassembly_queue.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( @@ -152,11 +155,22 @@ func (r *reassemblyQueue) push(chunk *chunkPayloadData) bool { return false } - // Check if a chunkSet with the SSN already exists - for _, set := range r.ordered { - if set.ssn == chunk.streamSequenceNumber { - cset = set - break + // Check if a fragmented chunkSet with the fragmented SSN already exists + if chunk.isFragmented() { + for _, set := range r.ordered { + // nolint:godox + // TODO: add caution around SSN wrapping here... this helps only a little bit + // by ensuring we don't add to an unfragmented cset (1 chunk). There's + // a case where if the SSN does wrap around, we may see the same SSN + // for a different chunk. + + // nolint:godox + // TODO: this slice can get pretty big; it may be worth maintaining a map + // for O(1) lookups at the cost of 2x memory. + if set.ssn == chunk.streamSequenceNumber && set.chunks[0].isFragmented() { + cset = set + break + } } } diff --git a/vendor/github.com/pion/sctp/rtx_timer.go b/vendor/github.com/pion/sctp/rtx_timer.go index 14bc39d77..354825b51 100644 --- a/vendor/github.com/pion/sctp/rtx_timer.go +++ b/vendor/github.com/pion/sctp/rtx_timer.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( @@ -7,14 +10,28 @@ import ( ) const ( - rtoInitial float64 = 3.0 * 1000 // msec - rtoMin float64 = 1.0 * 1000 // msec - rtoMax float64 = 60.0 * 1000 // msec - rtoAlpha float64 = 0.125 - rtoBeta float64 = 0.25 - maxInitRetrans uint = 8 - pathMaxRetrans uint = 5 - noMaxRetrans uint = 0 + // RTO.Initial in msec + rtoInitial float64 = 1.0 * 1000 + + // RTO.Min in msec + rtoMin float64 = 1.0 * 1000 + + // RTO.Max in msec + defaultRTOMax float64 = 60.0 * 1000 + + // RTO.Alpha + rtoAlpha float64 = 0.125 + + // RTO.Beta + rtoBeta float64 = 0.25 + + // Max.Init.Retransmits: + maxInitRetrans uint = 8 + + // Path.Max.Retrans + pathMaxRetrans uint = 5 + + noMaxRetrans uint = 0 ) // rtoManager manages Rtx timeout values. @@ -25,13 +42,19 @@ type rtoManager struct { rto float64 noUpdate bool mutex sync.RWMutex + rtoMax float64 } // newRTOManager creates a new rtoManager. -func newRTOManager() *rtoManager { - return &rtoManager{ - rto: rtoInitial, +func newRTOManager(rtoMax float64) *rtoManager { + mgr := rtoManager{ + rto: rtoInitial, + rtoMax: rtoMax, } + if mgr.rtoMax == 0 { + mgr.rtoMax = defaultRTOMax + } + return &mgr } // setNewRTT takes a newly measured RTT then adjust the RTO in msec. @@ -52,7 +75,7 @@ func (m *rtoManager) setNewRTT(rtt float64) float64 { m.rttvar = (1-rtoBeta)*m.rttvar + rtoBeta*(math.Abs(m.srtt-rtt)) m.srtt = (1-rtoAlpha)*m.srtt + rtoAlpha*rtt } - m.rto = math.Min(math.Max(m.srtt+4*m.rttvar, rtoMin), rtoMax) + m.rto = math.Min(math.Max(m.srtt+4*m.rttvar, rtoMin), m.rtoMax) return m.srtt } @@ -103,6 +126,7 @@ type rtxTimer struct { stopFunc stopTimerLoop closed bool mutex sync.RWMutex + rtoMax float64 } type stopTimerLoop func() @@ -110,12 +134,19 @@ type stopTimerLoop func() // newRTXTimer creates a new retransmission timer. // if maxRetrans is set to 0, it will keep retransmitting until stop() is called. // (it will never make onRetransmissionFailure() callback. -func newRTXTimer(id int, observer rtxTimerObserver, maxRetrans uint) *rtxTimer { - return &rtxTimer{ +func newRTXTimer(id int, observer rtxTimerObserver, maxRetrans uint, + rtoMax float64, +) *rtxTimer { + timer := rtxTimer{ id: id, observer: observer, maxRetrans: maxRetrans, + rtoMax: rtoMax, } + if timer.rtoMax == 0 { + timer.rtoMax = defaultRTOMax + } + return &timer } // start starts the timer. @@ -144,9 +175,12 @@ func (t *rtxTimer) start(rto float64) bool { go func() { canceling := false + timer := time.NewTimer(math.MaxInt64) + timer.Stop() + for !canceling { - timeout := calculateNextTimeout(rto, nRtos) - timer := time.NewTimer(time.Duration(timeout) * time.Millisecond) + timeout := calculateNextTimeout(rto, nRtos, t.rtoMax) + timer.Reset(time.Duration(timeout) * time.Millisecond) select { case <-timer.C: @@ -205,7 +239,7 @@ func (t *rtxTimer) isRunning() bool { return (t.stopFunc != nil) } -func calculateNextTimeout(rto float64, nRtos uint) float64 { +func calculateNextTimeout(rto float64, nRtos uint, rtoMax float64) float64 { // RFC 4096 sec 6.3.3. Handle T3-rtx Expiration // E2) For the destination address for which the timer expires, set RTO // <- RTO * 2 ("back off the timer"). The maximum value discussed diff --git a/vendor/github.com/pion/sctp/sctp.go b/vendor/github.com/pion/sctp/sctp.go index e60134293..2bf74fb38 100644 --- a/vendor/github.com/pion/sctp/sctp.go +++ b/vendor/github.com/pion/sctp/sctp.go @@ -1,2 +1,5 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + // Package sctp implements the SCTP spec package sctp diff --git a/vendor/github.com/pion/sctp/stream.go b/vendor/github.com/pion/sctp/stream.go index 43038ee1e..47e06f35a 100644 --- a/vendor/github.com/pion/sctp/stream.go +++ b/vendor/github.com/pion/sctp/stream.go @@ -1,10 +1,12 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp import ( "errors" "fmt" "io" - "math" "os" "sync" "sync/atomic" @@ -172,6 +174,11 @@ func (s *Stream) SetReadDeadline(deadline time.Time) error { t.Stop() return case <-t.C: + select { + case <-readTimeoutCancel: + return + default: + } s.lock.Lock() if s.readErr == nil { s.readErr = ErrReadDeadlineExceeded @@ -258,7 +265,7 @@ func (s *Stream) Write(p []byte) (n int, err error) { func (s *Stream) WriteSCTP(p []byte, ppi PayloadProtocolIdentifier) (int, error) { maxMessageSize := s.association.MaxMessageSize() if len(p) > int(maxMessageSize) { - return 0, fmt.Errorf("%w: %v", ErrOutboundPacketTooLarge, math.MaxUint16) + return 0, fmt.Errorf("%w: %v", ErrOutboundPacketTooLarge, maxMessageSize) } if s.State() != StreamStateOpen { diff --git a/vendor/github.com/pion/sctp/util.go b/vendor/github.com/pion/sctp/util.go index 9302e7126..b8afc1232 100644 --- a/vendor/github.com/pion/sctp/util.go +++ b/vendor/github.com/pion/sctp/util.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sctp const ( diff --git a/vendor/github.com/pion/sdp/v3/.gitignore b/vendor/github.com/pion/sdp/v3/.gitignore index f977e7485..6e2f206a9 100644 --- a/vendor/github.com/pion/sdp/v3/.gitignore +++ b/vendor/github.com/pion/sdp/v3/.gitignore @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + ### JetBrains IDE ### ##################### .idea/ diff --git a/vendor/github.com/pion/sdp/v3/.golangci.yml b/vendor/github.com/pion/sdp/v3/.golangci.yml index d7a88eca3..6dd80c805 100644 --- a/vendor/github.com/pion/sdp/v3/.golangci.yml +++ b/vendor/github.com/pion/sdp/v3/.golangci.yml @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + linters-settings: govet: check-shadowing: true @@ -10,7 +13,14 @@ linters-settings: modules: - github.com/pkg/errors: recommendations: - - errors + - errors + forbidigo: + forbid: + - ^fmt.Print(f|ln)?$ + - ^log.(Panic|Fatal|Print)(f|ln)?$ + - ^os.Exit$ + - ^panic$ + - ^print(ln)?$ linters: enable: @@ -18,9 +28,7 @@ linters: - bidichk # Checks for dangerous unicode character sequences - bodyclose # checks whether HTTP response body is closed successfully - contextcheck # check the function whether use a non-inherited context - - deadcode # Finds unused code - decorder # check declaration order and count of types, constants, variables and functions - - depguard # Go linter that checks if package imports are in a list of acceptable packages - dogsled # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()) - dupl # Tool for code clone detection - durationcheck # check for two durations multiplied together @@ -30,6 +38,7 @@ linters: - errorlint # errorlint is a linter for that can be used to find code that will cause problems with the error wrapping scheme introduced in Go 1.13. - exhaustive # check exhaustiveness of enum switch statements - exportloopref # checks for pointers to enclosing loop variables + - forbidigo # Forbids identifiers - forcetypeassert # finds forced type assertions - gci # Gci control golang package import order and make it always deterministic. - gochecknoglobals # Checks that no globals are present in Go code @@ -53,14 +62,12 @@ linters: - importas # Enforces consistent import aliases - ineffassign # Detects when assignments to existing variables are not used - misspell # Finds commonly misspelled English words in comments - - nakedret # Finds naked returns in functions greater than a specified function length - nilerr # Finds the code that returns nil even if it checks that the error is not nil. - nilnil # Checks that there is no simultaneous return of `nil` error and an invalid value. - noctx # noctx finds sending http request without context.Context - predeclared # find code that shadows one of Go's predeclared identifiers - revive # golint replacement, finds style mistakes - staticcheck # Staticcheck is a go vet on steroids, applying a ton of static analysis checks - - structcheck # Finds unused struct fields - stylecheck # Stylecheck is a replacement for golint - tagliatelle # Checks the struct tags. - tenv # tenv is analyzer that detects using os.Setenv instead of t.Setenv since Go1.17 @@ -69,14 +76,13 @@ linters: - unconvert # Remove unnecessary type conversions - unparam # Reports unused function parameters - unused # Checks Go code for unused constants, variables, functions and types - - varcheck # Finds unused global variables and constants - wastedassign # wastedassign finds wasted assignment statements - whitespace # Tool for detection of leading and trailing whitespace disable: + - depguard # Go linter that checks if package imports are in a list of acceptable packages - containedctx # containedctx is a linter that detects struct contained context.Context field - cyclop # checks function and package cyclomatic complexity - exhaustivestruct # Checks if all struct's fields are initialized - - forbidigo # Forbids identifiers - funlen # Tool for detection of long functions - gocyclo # Computes and checks the cyclomatic complexity of functions - godot # Check if comments end in a period @@ -87,6 +93,7 @@ linters: - maintidx # maintidx measures the maintainability index of each function. - makezero # Finds slice declarations with non-zero initial length - maligned # Tool to detect Go structs that would take less memory if their fields were sorted + - nakedret # Finds naked returns in functions greater than a specified function length - nestif # Reports deeply nested if statements - nlreturn # nlreturn checks for a new line before return and branch statements to increase code clarity - nolintlint # Reports ill-formed or insufficient nolint directives @@ -104,16 +111,16 @@ linters: issues: exclude-use-default: false exclude-rules: - # Allow complex tests, better to be self contained - - path: _test\.go + # Allow complex tests and examples, better to be self contained + - path: (examples|main\.go|_test\.go) linters: + - forbidigo - gocognit - # Allow complex main function in examples - - path: examples - text: "of func `main` is high" + # Allow forbidden identifiers in CLI commands + - path: cmd linters: - - gocognit + - forbidigo run: skip-dirs-use-default: false diff --git a/vendor/github.com/pion/sdp/v3/.goreleaser.yml b/vendor/github.com/pion/sdp/v3/.goreleaser.yml new file mode 100644 index 000000000..30093e9d6 --- /dev/null +++ b/vendor/github.com/pion/sdp/v3/.goreleaser.yml @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +builds: +- skip: true diff --git a/vendor/github.com/pion/sdp/v3/AUTHORS.txt b/vendor/github.com/pion/sdp/v3/AUTHORS.txt deleted file mode 100644 index 038e59911..000000000 --- a/vendor/github.com/pion/sdp/v3/AUTHORS.txt +++ /dev/null @@ -1,32 +0,0 @@ -# Thank you to everyone that made Pion possible. If you are interested in contributing -# we would love to have you https://github.com/pion/webrtc/wiki/Contributing -# -# This file is auto generated, using git to list all individuals contributors. -# see `.github/generate-authors.sh` for the scripting -adwpc -Atsushi Watanabe -backkem -Brendan Abolivier -chenkaiC4 -cnderrauber -Daniele Sluijters -Graham King -Guilherme -Hugo Arregui -Jason -Jerko Steiner -John Bradley -Konstantin Itskov -korymiller1489 -Luke S -Max Hawkins -Maxim Oransky -mchlrhw <4028654+mchlrhw@users.noreply.github.com> -Michael MacDonald -Mustafa Navruz -Roman Romanenko -Sean DuBois -Sean DuBois -tarrencev -Woodrow Douglass -ZHENK diff --git a/vendor/github.com/pion/sdp/v3/LICENSE b/vendor/github.com/pion/sdp/v3/LICENSE index ab602974d..491caf6b0 100644 --- a/vendor/github.com/pion/sdp/v3/LICENSE +++ b/vendor/github.com/pion/sdp/v3/LICENSE @@ -1,21 +1,9 @@ MIT License -Copyright (c) 2018 +Copyright (c) 2023 The Pion community -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/pion/sdp/v3/README.md b/vendor/github.com/pion/sdp/v3/README.md index c29c97f78..1cb8dbd21 100644 --- a/vendor/github.com/pion/sdp/v3/README.md +++ b/vendor/github.com/pion/sdp/v3/README.md @@ -9,27 +9,27 @@ Sourcegraph Widget Slack Widget
- Build Status - GoDoc + GitHub Workflow Status + Go Reference Coverage Status Go Report Card License: MIT


- ### Roadmap The library is used as a part of our WebRTC implementation. Please refer to that [roadmap](https://github.com/pion/webrtc/issues/9) to track our major milestones. ### Community -Pion has an active community on the [Golang Slack](https://invite.slack.golangbridge.org/). Sign up and join the **#pion** channel for discussions and support. You can also use [Pion mailing list](https://groups.google.com/forum/#!forum/pion). +Pion has an active community on the [Slack](https://pion.ly/slack). + +Follow the [Pion Twitter](https://twitter.com/_pion) for project updates and important WebRTC news. We are always looking to support **your projects**. Please reach out if you have something to build! - If you need commercial support or don't want to use public methods you can contact us at [team@pion.ly](mailto:team@pion.ly) ### Contributing -Check out the **[contributing wiki](https://github.com/pion/webrtc/wiki/Contributing)** to join the group of amazing people making this project possible: +Check out the [contributing wiki](https://github.com/pion/webrtc/wiki/Contributing) to join the group of amazing people making this project possible ### License -MIT License - see [LICENSE](LICENSE) for full text +MIT License - see [LICENSE](LICENSE) for full text \ No newline at end of file diff --git a/vendor/github.com/pion/sdp/v3/base_lexer.go b/vendor/github.com/pion/sdp/v3/base_lexer.go index f1f2ccd1a..edd532a5d 100644 --- a/vendor/github.com/pion/sdp/v3/base_lexer.go +++ b/vendor/github.com/pion/sdp/v3/base_lexer.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sdp import ( @@ -22,12 +25,12 @@ func (e syntaxError) Error() string { } type baseLexer struct { - value []byte + value string pos int } func (l baseLexer) syntaxError() error { - return syntaxError{s: string(l.value), i: l.pos - 1} + return syntaxError{s: l.value, i: l.pos - 1} } func (l *baseLexer) unreadByte() error { @@ -154,7 +157,7 @@ func (l *baseLexer) readField() (string, error) { break } } - return string(l.value[start:stop]), nil + return l.value[start:stop], nil } // Returns symbols until line end @@ -170,50 +173,32 @@ func (l *baseLexer) readLine() (string, error) { trim++ } if ch == '\n' { - return string(l.value[start : l.pos-trim]), nil + return l.value[start : l.pos-trim], nil } } } -func (l *baseLexer) readString(until byte) (string, error) { - start := l.pos +func (l *baseLexer) readType() (byte, error) { for { - ch, err := l.readByte() + firstByte, err := l.readByte() if err != nil { - return "", err - } - if ch == until { - return string(l.value[start:l.pos]), nil - } - } -} - -func (l *baseLexer) readType() (string, error) { - for { - b, err := l.readByte() - if err != nil { - return "", err + return 0, err } - if isNewline(b) { + if isNewline(firstByte) { continue } - err = l.unreadByte() + secondByte, err := l.readByte() if err != nil { - return "", err + return 0, err } - key, err := l.readString('=') - if err != nil { - return key, err + if secondByte != '=' { + return firstByte, l.syntaxError() } - if len(key) == 2 { - return key, nil - } - - return key, l.syntaxError() + return firstByte, nil } } diff --git a/vendor/github.com/pion/sdp/v3/codecov.yml b/vendor/github.com/pion/sdp/v3/codecov.yml index 085200a48..263e4d45c 100644 --- a/vendor/github.com/pion/sdp/v3/codecov.yml +++ b/vendor/github.com/pion/sdp/v3/codecov.yml @@ -3,6 +3,8 @@ # # It is automatically copied from https://github.com/pion/.goassets repository. # +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT coverage: status: diff --git a/vendor/github.com/pion/sdp/v3/common_description.go b/vendor/github.com/pion/sdp/v3/common_description.go index 1174be416..9db790360 100644 --- a/vendor/github.com/pion/sdp/v3/common_description.go +++ b/vendor/github.com/pion/sdp/v3/common_description.go @@ -1,8 +1,10 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sdp import ( "strconv" - "strings" ) // Information describes the "i=" field which provides textual information @@ -10,7 +12,15 @@ import ( type Information string func (i Information) String() string { - return string(i) + return stringFromMarshal(i.marshalInto, i.marshalSize) +} + +func (i Information) marshalInto(b []byte) []byte { + return append(b, i...) +} + +func (i Information) marshalSize() (size int) { + return len(i) } // ConnectionInformation defines the representation for the "c=" field @@ -22,11 +32,29 @@ type ConnectionInformation struct { } func (c ConnectionInformation) String() string { - parts := []string{c.NetworkType, c.AddressType} - if c.Address != nil && c.Address.String() != "" { - parts = append(parts, c.Address.String()) + return stringFromMarshal(c.marshalInto, c.marshalSize) +} + +func (c ConnectionInformation) marshalInto(b []byte) []byte { + b = append(append(b, c.NetworkType...), ' ') + b = append(b, c.AddressType...) + + if c.Address != nil { + b = append(b, ' ') + b = c.Address.marshalInto(b) } - return strings.Join(parts, " ") + + return b +} + +func (c ConnectionInformation) marshalSize() (size int) { + size = len(c.NetworkType) + size += 1 + len(c.AddressType) + if c.Address != nil { + size += 1 + c.Address.marshalSize() + } + + return } // Address desribes a structured address token from within the "c=" field. @@ -37,17 +65,33 @@ type Address struct { } func (c *Address) String() string { - var parts []string - parts = append(parts, c.Address) + return stringFromMarshal(c.marshalInto, c.marshalSize) +} + +func (c *Address) marshalInto(b []byte) []byte { + b = append(b, c.Address...) if c.TTL != nil { - parts = append(parts, strconv.Itoa(*c.TTL)) + b = append(b, '/') + b = strconv.AppendInt(b, int64(*c.TTL), 10) } - if c.Range != nil { - parts = append(parts, strconv.Itoa(*c.Range)) + b = append(b, '/') + b = strconv.AppendInt(b, int64(*c.Range), 10) } - return strings.Join(parts, "/") + return b +} + +func (c Address) marshalSize() (size int) { + size = len(c.Address) + if c.TTL != nil { + size += 1 + lenUint(uint64(*c.TTL)) + } + if c.Range != nil { + size += 1 + lenUint(uint64(*c.Range)) + } + + return } // Bandwidth describes an optional field which denotes the proposed bandwidth @@ -59,19 +103,39 @@ type Bandwidth struct { } func (b Bandwidth) String() string { - var output string + return stringFromMarshal(b.marshalInto, b.marshalSize) +} + +func (b Bandwidth) marshalInto(d []byte) []byte { if b.Experimental { - output += "X-" + d = append(d, "X-"...) } - output += b.Type + ":" + strconv.FormatUint(b.Bandwidth, 10) - return output + d = append(append(d, b.Type...), ':') + return strconv.AppendUint(d, b.Bandwidth, 10) +} + +func (b Bandwidth) marshalSize() (size int) { + if b.Experimental { + size += 2 + } + + size += len(b.Type) + 1 + lenUint(b.Bandwidth) + return } // EncryptionKey describes the "k=" which conveys encryption key information. type EncryptionKey string -func (s EncryptionKey) String() string { - return string(s) +func (e EncryptionKey) String() string { + return stringFromMarshal(e.marshalInto, e.marshalSize) +} + +func (e EncryptionKey) marshalInto(b []byte) []byte { + return append(b, e...) +} + +func (e EncryptionKey) marshalSize() (size int) { + return len(e) } // Attribute describes the "a=" field which represents the primary means for @@ -97,11 +161,25 @@ func NewAttribute(key, value string) Attribute { } func (a Attribute) String() string { - output := a.Key + return stringFromMarshal(a.marshalInto, a.marshalSize) +} + +func (a Attribute) marshalInto(b []byte) []byte { + b = append(b, a.Key...) if len(a.Value) > 0 { - output += ":" + a.Value + b = append(append(b, ':'), a.Value...) } - return output + + return b +} + +func (a Attribute) marshalSize() (size int) { + size = len(a.Key) + if len(a.Value) > 0 { + size += 1 + len(a.Value) + } + + return size } // IsICECandidate returns true if the attribute key equals "candidate". diff --git a/vendor/github.com/pion/sdp/v3/direction.go b/vendor/github.com/pion/sdp/v3/direction.go index 19ea92db7..936130ccf 100644 --- a/vendor/github.com/pion/sdp/v3/direction.go +++ b/vendor/github.com/pion/sdp/v3/direction.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sdp import "errors" diff --git a/vendor/github.com/pion/sdp/v3/extmap.go b/vendor/github.com/pion/sdp/v3/extmap.go index 1242a8cf0..f260c9be7 100644 --- a/vendor/github.com/pion/sdp/v3/extmap.go +++ b/vendor/github.com/pion/sdp/v3/extmap.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sdp import ( diff --git a/vendor/github.com/pion/sdp/v3/fuzz.go b/vendor/github.com/pion/sdp/v3/fuzz.go deleted file mode 100644 index f41ef78c6..000000000 --- a/vendor/github.com/pion/sdp/v3/fuzz.go +++ /dev/null @@ -1,31 +0,0 @@ -// +build gofuzz - -package sdp - -// Fuzz implements a randomized fuzz test of the sdp -// parser using go-fuzz. -// -// To run the fuzzer, first download go-fuzz: -// `go get github.com/dvyukov/go-fuzz/...` -// -// Then build the testing package: -// `go-fuzz-build` -// -// And run the fuzzer on the corpus: -// `go-fuzz` -func Fuzz(data []byte) int { - // Check that unmarshalling any byte slice does not panic. - var sd SessionDescription - if err := sd.Unmarshal(data); err != nil { - return 0 - } - // Check that we can marshal anything we unmarshalled. - _, err := sd.Marshal() - if err != nil { - panic("failed to marshal") // nolint - } - // It'd be nice to check that if we round trip Marshal then Unmarshal, - // we get the original back. Right now, though, we frequently don't, - // and we'd need to fix that first. - return 1 -} diff --git a/vendor/github.com/pion/sdp/v3/jsep.go b/vendor/github.com/pion/sdp/v3/jsep.go index de07d8f30..600acf567 100644 --- a/vendor/github.com/pion/sdp/v3/jsep.go +++ b/vendor/github.com/pion/sdp/v3/jsep.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sdp import ( @@ -56,8 +59,9 @@ func extMapURI() map[int]string { // some settings that are required by the JSEP spec. // // Note: Since v2.4.0, session ID has been fixed to use crypto random according to -// JSEP spec, so that NewJSEPSessionDescription now returns error as a second -// return value. +// +// JSEP spec, so that NewJSEPSessionDescription now returns error as a second +// return value. func NewJSEPSessionDescription(identity bool) (*SessionDescription, error) { sid, err := newSessionID() if err != nil { @@ -120,7 +124,7 @@ func (s *SessionDescription) WithMedia(md *MediaDescription) *SessionDescription // NewJSEPMediaDescription creates a new MediaName with // some settings that are required by the JSEP spec. -func NewJSEPMediaDescription(codecType string, codecPrefs []string) *MediaDescription { +func NewJSEPMediaDescription(codecType string, _ []string) *MediaDescription { return &MediaDescription{ MediaName: MediaName{ Media: codecType, diff --git a/vendor/github.com/pion/sdp/v3/marshal.go b/vendor/github.com/pion/sdp/v3/marshal.go index f029c4e99..43dd738bc 100644 --- a/vendor/github.com/pion/sdp/v3/marshal.go +++ b/vendor/github.com/pion/sdp/v3/marshal.go @@ -1,136 +1,240 @@ -package sdp +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT -import ( - "strings" -) +package sdp // Marshal takes a SDP struct to text // https://tools.ietf.org/html/rfc4566#section-5 // Session description -// v= (protocol version) -// o= (originator and session identifier) -// s= (session name) -// i=* (session information) -// u=* (URI of description) -// e=* (email address) -// p=* (phone number) -// c=* (connection information -- not required if included in -// all media) -// b=* (zero or more bandwidth information lines) -// One or more time descriptions ("t=" and "r=" lines; see below) -// z=* (time zone adjustments) -// k=* (encryption key) -// a=* (zero or more session attribute lines) -// Zero or more media descriptions +// +// v= (protocol version) +// o= (originator and session identifier) +// s= (session name) +// i=* (session information) +// u=* (URI of description) +// e=* (email address) +// p=* (phone number) +// c=* (connection information -- not required if included in +// all media) +// b=* (zero or more bandwidth information lines) +// One or more time descriptions ("t=" and "r=" lines; see below) +// z=* (time zone adjustments) +// k=* (encryption key) +// a=* (zero or more session attribute lines) +// Zero or more media descriptions // // Time description -// t= (time the session is active) -// r=* (zero or more repeat times) +// +// t= (time the session is active) +// r=* (zero or more repeat times) // // Media description, if present -// m= (media name and transport address) -// i=* (media title) -// c=* (connection information -- optional if included at -// session level) -// b=* (zero or more bandwidth information lines) -// k=* (encryption key) -// a=* (zero or more media attribute lines) +// +// m= (media name and transport address) +// i=* (media title) +// c=* (connection information -- optional if included at +// session level) +// b=* (zero or more bandwidth information lines) +// k=* (encryption key) +// a=* (zero or more media attribute lines) func (s *SessionDescription) Marshal() ([]byte, error) { - m := make(marshaller, 0, 1024) + m := make(marshaller, 0, s.MarshalSize()) - m.addKeyValue("v=", s.Version.String()) - m.addKeyValue("o=", s.Origin.String()) - m.addKeyValue("s=", s.SessionName.String()) + m.addKeyValue("v=", s.Version.marshalInto) + m.addKeyValue("o=", s.Origin.marshalInto) + m.addKeyValue("s=", s.SessionName.marshalInto) if s.SessionInformation != nil { - m.addKeyValue("i=", s.SessionInformation.String()) + m.addKeyValue("i=", s.SessionInformation.marshalInto) } if s.URI != nil { - m.addKeyValue("u=", s.URI.String()) + m = append(m, "u="...) + m = append(m, s.URI.String()...) + m = append(m, "\r\n"...) } if s.EmailAddress != nil { - m.addKeyValue("e=", s.EmailAddress.String()) + m.addKeyValue("e=", s.EmailAddress.marshalInto) } if s.PhoneNumber != nil { - m.addKeyValue("p=", s.PhoneNumber.String()) + m.addKeyValue("p=", s.PhoneNumber.marshalInto) } if s.ConnectionInformation != nil { - m.addKeyValue("c=", s.ConnectionInformation.String()) + m.addKeyValue("c=", s.ConnectionInformation.marshalInto) } for _, b := range s.Bandwidth { - m.addKeyValue("b=", b.String()) + m.addKeyValue("b=", b.marshalInto) } for _, td := range s.TimeDescriptions { - m.addKeyValue("t=", td.Timing.String()) + m.addKeyValue("t=", td.Timing.marshalInto) for _, r := range td.RepeatTimes { - m.addKeyValue("r=", r.String()) + m.addKeyValue("r=", r.marshalInto) } } if len(s.TimeZones) > 0 { - var b strings.Builder + m = append(m, "z="...) for i, z := range s.TimeZones { if i > 0 { - b.WriteString(" ") + m = append(m, ' ') } - b.WriteString(z.String()) + m = z.marshalInto(m) } - m.addKeyValue("z=", b.String()) + m = append(m, "\r\n"...) } if s.EncryptionKey != nil { - m.addKeyValue("k=", s.EncryptionKey.String()) + m.addKeyValue("k=", s.EncryptionKey.marshalInto) } for _, a := range s.Attributes { - m.addKeyValue("a=", a.String()) + m.addKeyValue("a=", a.marshalInto) } for _, md := range s.MediaDescriptions { - m.addKeyValue("m=", md.MediaName.String()) + m.addKeyValue("m=", md.MediaName.marshalInto) if md.MediaTitle != nil { - m.addKeyValue("i=", md.MediaTitle.String()) + m.addKeyValue("i=", md.MediaTitle.marshalInto) } if md.ConnectionInformation != nil { - m.addKeyValue("c=", md.ConnectionInformation.String()) + m.addKeyValue("c=", md.ConnectionInformation.marshalInto) } for _, b := range md.Bandwidth { - m.addKeyValue("b=", b.String()) + m.addKeyValue("b=", b.marshalInto) } if md.EncryptionKey != nil { - m.addKeyValue("k=", md.EncryptionKey.String()) + m.addKeyValue("k=", md.EncryptionKey.marshalInto) } for _, a := range md.Attributes { - m.addKeyValue("a=", a.String()) + m.addKeyValue("a=", a.marshalInto) } } - return m.bytes(), nil + return m, nil +} + +// `$type=` and CRLF size +const lineBaseSize = 4 + +// MarshalSize returns the size of the SessionDescription once marshaled. +func (s *SessionDescription) MarshalSize() (marshalSize int) { + marshalSize += lineBaseSize + s.Version.marshalSize() + marshalSize += lineBaseSize + s.Origin.marshalSize() + marshalSize += lineBaseSize + s.SessionName.marshalSize() + + if s.SessionInformation != nil { + marshalSize += lineBaseSize + s.SessionInformation.marshalSize() + } + + if s.URI != nil { + marshalSize += lineBaseSize + len(s.URI.String()) + } + + if s.EmailAddress != nil { + marshalSize += lineBaseSize + s.EmailAddress.marshalSize() + } + + if s.PhoneNumber != nil { + marshalSize += lineBaseSize + s.PhoneNumber.marshalSize() + } + + if s.ConnectionInformation != nil { + marshalSize += lineBaseSize + s.ConnectionInformation.marshalSize() + } + + for _, b := range s.Bandwidth { + marshalSize += lineBaseSize + b.marshalSize() + } + + for _, td := range s.TimeDescriptions { + marshalSize += lineBaseSize + td.Timing.marshalSize() + for _, r := range td.RepeatTimes { + marshalSize += lineBaseSize + r.marshalSize() + } + } + + if len(s.TimeZones) > 0 { + marshalSize += lineBaseSize + + for i, z := range s.TimeZones { + if i > 0 { + marshalSize++ + } + marshalSize += z.marshalSize() + } + } + + if s.EncryptionKey != nil { + marshalSize += lineBaseSize + s.EncryptionKey.marshalSize() + } + + for _, a := range s.Attributes { + marshalSize += lineBaseSize + a.marshalSize() + } + + for _, md := range s.MediaDescriptions { + marshalSize += lineBaseSize + md.MediaName.marshalSize() + if md.MediaTitle != nil { + marshalSize += lineBaseSize + md.MediaTitle.marshalSize() + } + if md.ConnectionInformation != nil { + marshalSize += lineBaseSize + md.ConnectionInformation.marshalSize() + } + + for _, b := range md.Bandwidth { + marshalSize += lineBaseSize + b.marshalSize() + } + + if md.EncryptionKey != nil { + marshalSize += lineBaseSize + md.EncryptionKey.marshalSize() + } + + for _, a := range md.Attributes { + marshalSize += lineBaseSize + a.marshalSize() + } + } + + return marshalSize } // marshaller contains state during marshaling. type marshaller []byte -func (m *marshaller) addKeyValue(key, value string) { - if value == "" { - return - } +func (m *marshaller) addKeyValue(key string, value func([]byte) []byte) { *m = append(*m, key...) - *m = append(*m, value...) + *m = value(*m) *m = append(*m, "\r\n"...) } -func (m *marshaller) bytes() []byte { - return *m +func lenUint(i uint64) (count int) { + if i == 0 { + return 1 + } + + for i != 0 { + i /= 10 + count++ + } + return +} + +func lenInt(i int64) (count int) { + if i < 0 { + return lenUint(uint64(-i)) + 1 + } + return lenUint(uint64(i)) +} + +func stringFromMarshal(marshalFunc func([]byte) []byte, sizeFunc func() int) string { + return string(marshalFunc(make([]byte, 0, sizeFunc()))) } diff --git a/vendor/github.com/pion/sdp/v3/media_description.go b/vendor/github.com/pion/sdp/v3/media_description.go index c08850704..d5d76e46c 100644 --- a/vendor/github.com/pion/sdp/v3/media_description.go +++ b/vendor/github.com/pion/sdp/v3/media_description.go @@ -1,8 +1,10 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sdp import ( "strconv" - "strings" ) // MediaDescription represents a media type. @@ -62,6 +64,24 @@ func (p *RangedPort) String() string { return output } +func (p RangedPort) marshalInto(b []byte) []byte { + b = strconv.AppendInt(b, int64(p.Value), 10) + if p.Range != nil { + b = append(b, '/') + b = strconv.AppendInt(b, int64(*p.Range), 10) + } + return b +} + +func (p RangedPort) marshalSize() (size int) { + size = lenInt(int64(p.Value)) + if p.Range != nil { + size += 1 + lenInt(int64(*p.Range)) + } + + return +} + // MediaName describes the "m=" field storage structure. type MediaName struct { Media string @@ -71,10 +91,38 @@ type MediaName struct { } func (m MediaName) String() string { - return strings.Join([]string{ - m.Media, - m.Port.String(), - strings.Join(m.Protos, "/"), - strings.Join(m.Formats, " "), - }, " ") + return stringFromMarshal(m.marshalInto, m.marshalSize) +} + +func (m MediaName) marshalInto(b []byte) []byte { + appendList := func(list []string, sep byte) { + for i, p := range list { + if i != 0 && i != len(list) { + b = append(b, sep) + } + b = append(b, p...) + } + } + + b = append(append(b, m.Media...), ' ') + b = append(m.Port.marshalInto(b), ' ') + appendList(m.Protos, '/') + b = append(b, ' ') + appendList(m.Formats, ' ') + return b +} + +func (m MediaName) marshalSize() (size int) { + listSize := func(list []string) { + for _, p := range list { + size += 1 + len(p) + } + } + + size = len(m.Media) + size += 1 + m.Port.marshalSize() + listSize(m.Protos) + listSize(m.Formats) + + return size } diff --git a/vendor/github.com/pion/sdp/v3/renovate.json b/vendor/github.com/pion/sdp/v3/renovate.json index f1614058a..f1bb98c6a 100644 --- a/vendor/github.com/pion/sdp/v3/renovate.json +++ b/vendor/github.com/pion/sdp/v3/renovate.json @@ -1,27 +1,6 @@ { + "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ - "config:base", - ":disableDependencyDashboard" - ], - "postUpdateOptions": [ - "gomodTidy" - ], - "commitBody": "Generated by renovateBot", - "packageRules": [ - { - "matchUpdateTypes": ["minor", "patch", "pin", "digest"], - "automerge": true - }, - { - "packagePatterns": ["^golang.org/x/"], - "schedule": ["on the first day of the month"] - } - ], - "ignorePaths": [ - ".github/workflows/generate-authors.yml", - ".github/workflows/lint.yaml", - ".github/workflows/renovate-go-mod-fix.yaml", - ".github/workflows/test.yaml", - ".github/workflows/tidy-check.yaml" + "github>pion/renovate-config" ] } diff --git a/vendor/github.com/pion/sdp/v3/sdp.go b/vendor/github.com/pion/sdp/v3/sdp.go index c92ac1a7f..a13e838f1 100644 --- a/vendor/github.com/pion/sdp/v3/sdp.go +++ b/vendor/github.com/pion/sdp/v3/sdp.go @@ -1,2 +1,5 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + // Package sdp implements Session Description Protocol (SDP) package sdp diff --git a/vendor/github.com/pion/sdp/v3/session_description.go b/vendor/github.com/pion/sdp/v3/session_description.go index c4aaf5f95..a9e25da0d 100644 --- a/vendor/github.com/pion/sdp/v3/session_description.go +++ b/vendor/github.com/pion/sdp/v3/session_description.go @@ -1,7 +1,9 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sdp import ( - "fmt" "net/url" "strconv" ) @@ -82,7 +84,15 @@ func (s *SessionDescription) Attribute(key string) (string, bool) { type Version int func (v Version) String() string { - return strconv.Itoa(int(v)) + return stringFromMarshal(v.marshalInto, v.marshalSize) +} + +func (v Version) marshalInto(b []byte) []byte { + return strconv.AppendInt(b, int64(v), 10) +} + +func (v Version) marshalSize() (size int) { + return lenInt(int64(v)) } // Origin defines the structure for the "o=" field which provides the @@ -97,15 +107,26 @@ type Origin struct { } func (o Origin) String() string { - return fmt.Sprintf( - "%v %d %d %v %v %v", - o.Username, - o.SessionID, - o.SessionVersion, - o.NetworkType, - o.AddressType, - o.UnicastAddress, - ) + return stringFromMarshal(o.marshalInto, o.marshalSize) +} + +func (o Origin) marshalInto(b []byte) []byte { + b = append(append(b, o.Username...), ' ') + b = append(strconv.AppendUint(b, o.SessionID, 10), ' ') + b = append(strconv.AppendUint(b, o.SessionVersion, 10), ' ') + b = append(append(b, o.NetworkType...), ' ') + b = append(append(b, o.AddressType...), ' ') + return append(b, o.UnicastAddress...) +} + +func (o Origin) marshalSize() (size int) { + return len(o.Username) + + lenUint(o.SessionID) + + lenUint(o.SessionVersion) + + len(o.NetworkType) + + len(o.AddressType) + + len(o.UnicastAddress) + + 5 } // SessionName describes a structured representations for the "s=" field @@ -113,7 +134,15 @@ func (o Origin) String() string { type SessionName string func (s SessionName) String() string { - return string(s) + return stringFromMarshal(s.marshalInto, s.marshalSize) +} + +func (s SessionName) marshalInto(b []byte) []byte { + return append(b, s...) +} + +func (s SessionName) marshalSize() (size int) { + return len(s) } // EmailAddress describes a structured representations for the "e=" line @@ -122,7 +151,15 @@ func (s SessionName) String() string { type EmailAddress string func (e EmailAddress) String() string { - return string(e) + return stringFromMarshal(e.marshalInto, e.marshalSize) +} + +func (e EmailAddress) marshalInto(b []byte) []byte { + return append(b, e...) +} + +func (e EmailAddress) marshalSize() (size int) { + return len(e) } // PhoneNumber describes a structured representations for the "p=" line @@ -131,7 +168,15 @@ func (e EmailAddress) String() string { type PhoneNumber string func (p PhoneNumber) String() string { - return string(p) + return stringFromMarshal(p.marshalInto, p.marshalSize) +} + +func (p PhoneNumber) marshalInto(b []byte) []byte { + return append(b, p...) +} + +func (p PhoneNumber) marshalSize() (size int) { + return len(p) } // TimeZone defines the structured object for "z=" line which describes @@ -142,5 +187,15 @@ type TimeZone struct { } func (z TimeZone) String() string { - return strconv.FormatUint(z.AdjustmentTime, 10) + " " + strconv.FormatInt(z.Offset, 10) + return stringFromMarshal(z.marshalInto, z.marshalSize) +} + +func (z TimeZone) marshalInto(b []byte) []byte { + b = strconv.AppendUint(b, z.AdjustmentTime, 10) + b = append(b, ' ') + return strconv.AppendInt(b, z.Offset, 10) +} + +func (z TimeZone) marshalSize() (size int) { + return lenUint(z.AdjustmentTime) + 1 + lenInt(z.Offset) } diff --git a/vendor/github.com/pion/sdp/v3/time_description.go b/vendor/github.com/pion/sdp/v3/time_description.go index 8b24e130d..0a5baa4e9 100644 --- a/vendor/github.com/pion/sdp/v3/time_description.go +++ b/vendor/github.com/pion/sdp/v3/time_description.go @@ -1,8 +1,10 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sdp import ( "strconv" - "strings" ) // TimeDescription describes "t=", "r=" fields of the session description @@ -26,9 +28,16 @@ type Timing struct { } func (t Timing) String() string { - output := strconv.FormatUint(t.StartTime, 10) - output += " " + strconv.FormatUint(t.StopTime, 10) - return output + return stringFromMarshal(t.marshalInto, t.marshalSize) +} + +func (t Timing) marshalInto(b []byte) []byte { + b = append(strconv.AppendUint(b, t.StartTime, 10), ' ') + return strconv.AppendUint(b, t.StopTime, 10) +} + +func (t Timing) marshalSize() (size int) { + return lenUint(t.StartTime) + 1 + lenUint(t.StopTime) } // RepeatTime describes the "r=" fields of the session description which @@ -40,12 +49,27 @@ type RepeatTime struct { } func (r RepeatTime) String() string { - fields := make([]string, 0) - fields = append(fields, strconv.FormatInt(r.Interval, 10)) - fields = append(fields, strconv.FormatInt(r.Duration, 10)) + return stringFromMarshal(r.marshalInto, r.marshalSize) +} + +func (r RepeatTime) marshalInto(b []byte) []byte { + b = strconv.AppendInt(b, r.Interval, 10) + b = append(b, ' ') + b = strconv.AppendInt(b, r.Duration, 10) for _, value := range r.Offsets { - fields = append(fields, strconv.FormatInt(value, 10)) + b = append(b, ' ') + b = strconv.AppendInt(b, value, 10) } - return strings.Join(fields, " ") + return b +} + +func (r RepeatTime) marshalSize() (size int) { + size = lenInt(r.Interval) + size += 1 + lenInt(r.Duration) + for _, o := range r.Offsets { + size += 1 + lenInt(o) + } + + return } diff --git a/vendor/github.com/pion/sdp/v3/unmarshal.go b/vendor/github.com/pion/sdp/v3/unmarshal.go index 59fcbe74c..3720d0def 100644 --- a/vendor/github.com/pion/sdp/v3/unmarshal.go +++ b/vendor/github.com/pion/sdp/v3/unmarshal.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sdp import ( @@ -6,6 +9,7 @@ import ( "net/url" "strconv" "strings" + "sync" ) var ( @@ -13,57 +17,72 @@ var ( errSDPInvalidNumericValue = errors.New("sdp: invalid numeric value") errSDPInvalidValue = errors.New("sdp: invalid value") errSDPInvalidPortValue = errors.New("sdp: invalid port value") + errSDPCacheInvalid = errors.New("sdp: invalid cache") + + //nolint: gochecknoglobals + unmarshalCachePool = sync.Pool{ + New: func() interface{} { + return &unmarshalCache{} + }, + } ) -// Unmarshal is the primary function that deserializes the session description +// UnmarshalString is the primary function that deserializes the session description // message and stores it inside of a structured SessionDescription object. // // The States Transition Table describes the computation flow between functions // (namely s1, s2, s3, ...) for a parsing procedure that complies with the // specifications laid out by the rfc4566#section-5 as well as by JavaScript // Session Establishment Protocol draft. Links: -// https://tools.ietf.org/html/rfc4566#section-5 -// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-24 +// +// https://tools.ietf.org/html/rfc4566#section-5 +// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-24 // // https://tools.ietf.org/html/rfc4566#section-5 // Session description -// v= (protocol version) -// o= (originator and session identifier) -// s= (session name) -// i=* (session information) -// u=* (URI of description) -// e=* (email address) -// p=* (phone number) -// c=* (connection information -- not required if included in -// all media) -// b=* (zero or more bandwidth information lines) -// One or more time descriptions ("t=" and "r=" lines; see below) -// z=* (time zone adjustments) -// k=* (encryption key) -// a=* (zero or more session attribute lines) -// Zero or more media descriptions +// +// v= (protocol version) +// o= (originator and session identifier) +// s= (session name) +// i=* (session information) +// u=* (URI of description) +// e=* (email address) +// p=* (phone number) +// c=* (connection information -- not required if included in +// all media) +// b=* (zero or more bandwidth information lines) +// One or more time descriptions ("t=" and "r=" lines; see below) +// z=* (time zone adjustments) +// k=* (encryption key) +// a=* (zero or more session attribute lines) +// Zero or more media descriptions // // Time description -// t= (time the session is active) -// r=* (zero or more repeat times) +// +// t= (time the session is active) +// r=* (zero or more repeat times) // // Media description, if present -// m= (media name and transport address) -// i=* (media title) -// c=* (connection information -- optional if included at -// session level) -// b=* (zero or more bandwidth information lines) -// k=* (encryption key) -// a=* (zero or more media attribute lines) +// +// m= (media name and transport address) +// i=* (media title) +// c=* (connection information -- optional if included at +// session level) +// b=* (zero or more bandwidth information lines) +// k=* (encryption key) +// a=* (zero or more media attribute lines) // // In order to generate the following state table and draw subsequent // deterministic finite-state automota ("DFA") the following regex was used to // derive the DFA: -// vosi?u?e?p?c?b*(tr*)+z?k?a*(mi?c?b*k?a*)* +// +// vosi?u?e?p?c?b*(tr*)+z?k?a*(mi?c?b*k?a*)* +// // possible place and state to exit: -// ** * * * ** * * * * -// 99 1 1 1 11 1 1 1 1 -// 3 1 1 26 5 5 4 4 +// +// ** * * * ** * * * * +// 99 1 1 1 11 1 1 1 1 +// 3 1 1 26 5 5 4 4 // // Please pay close attention to the `k`, and `a` parsing states. In the table // below in order to distinguish between the states belonging to the media @@ -89,10 +108,18 @@ var ( // | s15 | | 14 | | | 15 | | | | 12 | | | | | | | | | // | s16 | | 14 | | | | 15 | | | 12 | | | | | | | | | // +--------+----+-------+----+-----+----+-----+---+----+----+---+---+-----+---+---+----+---+----+ -func (s *SessionDescription) Unmarshal(value []byte) error { +func (s *SessionDescription) UnmarshalString(value string) error { + var ok bool l := new(lexer) + if l.cache, ok = unmarshalCachePool.Get().(*unmarshalCache); !ok { + return errSDPCacheInvalid + } + defer unmarshalCachePool.Put(l.cache) + + l.cache.reset() l.desc = s l.value = value + for state := s1; state != nil; { var err error state, err = state(l) @@ -100,12 +127,21 @@ func (s *SessionDescription) Unmarshal(value []byte) error { return err } } + + s.Attributes = l.cache.cloneSessionAttributes() + populateMediaAttributes(l.cache, l.desc) return nil } +// Unmarshal converts the value into a []byte and then calls UnmarshalString. +// Callers should use the more performant UnmarshalString +func (s *SessionDescription) Unmarshal(value []byte) error { + return s.UnmarshalString(string(value)) +} + func s1(l *lexer) (stateFn, error) { - return l.handleType(func(key string) stateFn { - if key == "v=" { + return l.handleType(func(key byte) stateFn { + if key == 'v' { return unmarshalProtocolVersion } return nil @@ -113,8 +149,8 @@ func s1(l *lexer) (stateFn, error) { } func s2(l *lexer) (stateFn, error) { - return l.handleType(func(key string) stateFn { - if key == "o=" { + return l.handleType(func(key byte) stateFn { + if key == 'o' { return unmarshalOrigin } return nil @@ -122,8 +158,8 @@ func s2(l *lexer) (stateFn, error) { } func s3(l *lexer) (stateFn, error) { - return l.handleType(func(key string) stateFn { - if key == "s=" { + return l.handleType(func(key byte) stateFn { + if key == 's' { return unmarshalSessionName } return nil @@ -131,21 +167,21 @@ func s3(l *lexer) (stateFn, error) { } func s4(l *lexer) (stateFn, error) { - return l.handleType(func(key string) stateFn { + return l.handleType(func(key byte) stateFn { switch key { - case "i=": + case 'i': return unmarshalSessionInformation - case "u=": + case 'u': return unmarshalURI - case "e=": + case 'e': return unmarshalEmail - case "p=": + case 'p': return unmarshalPhone - case "c=": + case 'c': return unmarshalSessionConnectionInformation - case "b=": + case 'b': return unmarshalSessionBandwidth - case "t=": + case 't': return unmarshalTiming } return nil @@ -153,11 +189,11 @@ func s4(l *lexer) (stateFn, error) { } func s5(l *lexer) (stateFn, error) { - return l.handleType(func(key string) stateFn { + return l.handleType(func(key byte) stateFn { switch key { - case "b=": + case 'b': return unmarshalSessionBandwidth - case "t=": + case 't': return unmarshalTiming } return nil @@ -165,15 +201,15 @@ func s5(l *lexer) (stateFn, error) { } func s6(l *lexer) (stateFn, error) { - return l.handleType(func(key string) stateFn { + return l.handleType(func(key byte) stateFn { switch key { - case "p=": + case 'p': return unmarshalPhone - case "c=": + case 'c': return unmarshalSessionConnectionInformation - case "b=": + case 'b': return unmarshalSessionBandwidth - case "t=": + case 't': return unmarshalTiming } return nil @@ -181,19 +217,19 @@ func s6(l *lexer) (stateFn, error) { } func s7(l *lexer) (stateFn, error) { - return l.handleType(func(key string) stateFn { + return l.handleType(func(key byte) stateFn { switch key { - case "u=": + case 'u': return unmarshalURI - case "e=": + case 'e': return unmarshalEmail - case "p=": + case 'p': return unmarshalPhone - case "c=": + case 'c': return unmarshalSessionConnectionInformation - case "b=": + case 'b': return unmarshalSessionBandwidth - case "t=": + case 't': return unmarshalTiming } return nil @@ -201,13 +237,13 @@ func s7(l *lexer) (stateFn, error) { } func s8(l *lexer) (stateFn, error) { - return l.handleType(func(key string) stateFn { + return l.handleType(func(key byte) stateFn { switch key { - case "c=": + case 'c': return unmarshalSessionConnectionInformation - case "b=": + case 'b': return unmarshalSessionBandwidth - case "t=": + case 't': return unmarshalTiming } return nil @@ -215,19 +251,19 @@ func s8(l *lexer) (stateFn, error) { } func s9(l *lexer) (stateFn, error) { - return l.handleType(func(key string) stateFn { + return l.handleType(func(key byte) stateFn { switch key { - case "z=": + case 'z': return unmarshalTimeZones - case "k=": + case 'k': return unmarshalSessionEncryptionKey - case "a=": + case 'a': return unmarshalSessionAttribute - case "r=": + case 'r': return unmarshalRepeatTimes - case "t=": + case 't': return unmarshalTiming - case "m=": + case 'm': return unmarshalMediaDescription } return nil @@ -235,17 +271,17 @@ func s9(l *lexer) (stateFn, error) { } func s10(l *lexer) (stateFn, error) { - return l.handleType(func(key string) stateFn { + return l.handleType(func(key byte) stateFn { switch key { - case "e=": + case 'e': return unmarshalEmail - case "p=": + case 'p': return unmarshalPhone - case "c=": + case 'c': return unmarshalSessionConnectionInformation - case "b=": + case 'b': return unmarshalSessionBandwidth - case "t=": + case 't': return unmarshalTiming } return nil @@ -253,11 +289,11 @@ func s10(l *lexer) (stateFn, error) { } func s11(l *lexer) (stateFn, error) { - return l.handleType(func(key string) stateFn { + return l.handleType(func(key byte) stateFn { switch key { - case "a=": + case 'a': return unmarshalSessionAttribute - case "m=": + case 'm': return unmarshalMediaDescription } return nil @@ -265,19 +301,19 @@ func s11(l *lexer) (stateFn, error) { } func s12(l *lexer) (stateFn, error) { - return l.handleType(func(key string) stateFn { + return l.handleType(func(key byte) stateFn { switch key { - case "a=": + case 'a': return unmarshalMediaAttribute - case "k=": + case 'k': return unmarshalMediaEncryptionKey - case "b=": + case 'b': return unmarshalMediaBandwidth - case "c=": + case 'c': return unmarshalMediaConnectionInformation - case "i=": + case 'i': return unmarshalMediaTitle - case "m=": + case 'm': return unmarshalMediaDescription } return nil @@ -285,13 +321,13 @@ func s12(l *lexer) (stateFn, error) { } func s13(l *lexer) (stateFn, error) { - return l.handleType(func(key string) stateFn { + return l.handleType(func(key byte) stateFn { switch key { - case "a=": + case 'a': return unmarshalSessionAttribute - case "k=": + case 'k': return unmarshalSessionEncryptionKey - case "m=": + case 'm': return unmarshalMediaDescription } return nil @@ -299,23 +335,23 @@ func s13(l *lexer) (stateFn, error) { } func s14(l *lexer) (stateFn, error) { - return l.handleType(func(key string) stateFn { + return l.handleType(func(key byte) stateFn { switch key { - case "a=": + case 'a': return unmarshalMediaAttribute - case "k=": + case 'k': // Non-spec ordering return unmarshalMediaEncryptionKey - case "b=": + case 'b': // Non-spec ordering return unmarshalMediaBandwidth - case "c=": + case 'c': // Non-spec ordering return unmarshalMediaConnectionInformation - case "i=": + case 'i': // Non-spec ordering return unmarshalMediaTitle - case "m=": + case 'm': return unmarshalMediaDescription } return nil @@ -323,20 +359,20 @@ func s14(l *lexer) (stateFn, error) { } func s15(l *lexer) (stateFn, error) { - return l.handleType(func(key string) stateFn { + return l.handleType(func(key byte) stateFn { switch key { - case "a=": + case 'a': return unmarshalMediaAttribute - case "k=": + case 'k': return unmarshalMediaEncryptionKey - case "b=": + case 'b': return unmarshalMediaBandwidth - case "c=": + case 'c': return unmarshalMediaConnectionInformation - case "i=": + case 'i': // Non-spec ordering return unmarshalMediaTitle - case "m=": + case 'm': return unmarshalMediaDescription } return nil @@ -344,20 +380,20 @@ func s15(l *lexer) (stateFn, error) { } func s16(l *lexer) (stateFn, error) { - return l.handleType(func(key string) stateFn { + return l.handleType(func(key byte) stateFn { switch key { - case "a=": + case 'a': return unmarshalMediaAttribute - case "k=": + case 'k': return unmarshalMediaEncryptionKey - case "c=": + case 'c': return unmarshalMediaConnectionInformation - case "b=": + case 'b': return unmarshalMediaBandwidth - case "i=": + case 'i': // Non-spec ordering return unmarshalMediaTitle - case "m=": + case 'm': return unmarshalMediaDescription } return nil @@ -714,18 +750,19 @@ func unmarshalSessionAttribute(l *lexer) (stateFn, error) { } i := strings.IndexRune(value, ':') - var a Attribute + a := l.cache.getSessionAttribute() if i > 0 { - a = NewAttribute(value[:i], value[i+1:]) + a.Key = value[:i] + a.Value = value[i+1:] } else { - a = NewPropertyAttribute(value) + a.Key = value } - l.desc.Attributes = append(l.desc.Attributes, a) return s11, nil } func unmarshalMediaDescription(l *lexer) (stateFn, error) { + populateMediaAttributes(l.cache, l.desc) var newMediaDesc MediaDescription // @@ -771,7 +808,7 @@ func unmarshalMediaDescription(l *lexer) (stateFn, error) { // https://tools.ietf.org/html/rfc4566#section-5.14 // https://tools.ietf.org/html/rfc4975#section-8.1 for _, proto := range strings.Split(field, "/") { - if !anyOf(proto, "UDP", "RTP", "AVP", "SAVP", "SAVPF", "TLS", "DTLS", "SCTP", "AVPF", "TCP", "MSRP") { + if !anyOf(proto, "UDP", "RTP", "AVP", "SAVP", "SAVPF", "TLS", "DTLS", "SCTP", "AVPF", "TCP", "MSRP", "BFCP", "UDT", "IX") { return nil, fmt.Errorf("%w `%v`", errSDPInvalidNumericValue, field) } newMediaDesc.MediaName.Protos = append(newMediaDesc.MediaName.Protos, proto) @@ -853,19 +890,21 @@ func unmarshalMediaAttribute(l *lexer) (stateFn, error) { } i := strings.IndexRune(value, ':') - var a Attribute + a := l.cache.getMediaAttribute() if i > 0 { - a = NewAttribute(value[:i], value[i+1:]) + a.Key = value[:i] + a.Value = value[i+1:] } else { - a = NewPropertyAttribute(value) + a.Key = value } - latestMediaDesc := l.desc.MediaDescriptions[len(l.desc.MediaDescriptions)-1] - latestMediaDesc.Attributes = append(latestMediaDesc.Attributes, a) return s14, nil } func parseTimeUnits(value string) (num int64, err error) { + if len(value) == 0 { + return 0, fmt.Errorf("%w `%v`", errSDPInvalidValue, value) + } k := timeShorthand(value[len(value)-1]) if k > 0 { num, err = strconv.ParseInt(value[:len(value)-1], 10, 64) @@ -908,3 +947,10 @@ func parsePort(value string) (int, error) { return port, nil } + +func populateMediaAttributes(c *unmarshalCache, s *SessionDescription) { + if len(s.MediaDescriptions) != 0 { + lastMediaDesc := s.MediaDescriptions[len(s.MediaDescriptions)-1] + lastMediaDesc.Attributes = c.cloneMediaAttributes() + } +} diff --git a/vendor/github.com/pion/sdp/v3/unmarshal_cache.go b/vendor/github.com/pion/sdp/v3/unmarshal_cache.go new file mode 100644 index 000000000..728b30515 --- /dev/null +++ b/vendor/github.com/pion/sdp/v3/unmarshal_cache.go @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sdp + +type unmarshalCache struct { + sessionAttributes []Attribute + mediaAttributes []Attribute +} + +func (c *unmarshalCache) reset() { + c.sessionAttributes = c.sessionAttributes[:0] + c.mediaAttributes = c.mediaAttributes[:0] +} + +func (c *unmarshalCache) getSessionAttribute() *Attribute { + c.sessionAttributes = append(c.sessionAttributes, Attribute{}) + return &c.sessionAttributes[len(c.sessionAttributes)-1] +} + +func (c *unmarshalCache) cloneSessionAttributes() []Attribute { + if len(c.sessionAttributes) == 0 { + return nil + } + s := make([]Attribute, len(c.sessionAttributes)) + copy(s, c.sessionAttributes) + c.sessionAttributes = c.sessionAttributes[:0] + return s +} + +func (c *unmarshalCache) getMediaAttribute() *Attribute { + c.mediaAttributes = append(c.mediaAttributes, Attribute{}) + return &c.mediaAttributes[len(c.mediaAttributes)-1] +} + +func (c *unmarshalCache) cloneMediaAttributes() []Attribute { + if len(c.mediaAttributes) == 0 { + return nil + } + s := make([]Attribute, len(c.mediaAttributes)) + copy(s, c.mediaAttributes) + c.mediaAttributes = c.mediaAttributes[:0] + return s +} diff --git a/vendor/github.com/pion/sdp/v3/util.go b/vendor/github.com/pion/sdp/v3/util.go index 84cba7f7d..0f14f15ce 100644 --- a/vendor/github.com/pion/sdp/v3/util.go +++ b/vendor/github.com/pion/sdp/v3/util.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package sdp import ( @@ -83,6 +86,16 @@ func (c Codec) String() string { return fmt.Sprintf("%d %s/%d/%s (%s) [%s]", c.PayloadType, c.Name, c.ClockRate, c.EncodingParameters, c.Fmtp, strings.Join(c.RTCPFeedback, ", ")) } +func (c *Codec) appendRTCPFeedback(rtcpFeedback string) { + for _, existingRTCPFeedback := range c.RTCPFeedback { + if existingRTCPFeedback == rtcpFeedback { + return + } + } + + c.RTCPFeedback = append(c.RTCPFeedback, rtcpFeedback) +} + func parseRtpmap(rtpmap string) (Codec, error) { var codec Codec parsingFailed := errExtractCodecRtpmap @@ -150,30 +163,33 @@ func parseFmtp(fmtp string) (Codec, error) { return codec, nil } -func parseRtcpFb(rtcpFb string) (Codec, error) { - var codec Codec - parsingFailed := errExtractCodecRtcpFb +func parseRtcpFb(rtcpFb string) (codec Codec, isWildcard bool, err error) { + var ptInt uint64 + err = errExtractCodecRtcpFb // a=ftcp-fb: [] split := strings.SplitN(rtcpFb, " ", 2) if len(split) != 2 { - return codec, parsingFailed + return } ptSplit := strings.Split(split[0], ":") if len(ptSplit) != 2 { - return codec, parsingFailed + return } - ptInt, err := strconv.ParseUint(ptSplit[1], 10, 8) - if err != nil { - return codec, parsingFailed + isWildcard = ptSplit[1] == "*" + if !isWildcard { + ptInt, err = strconv.ParseUint(ptSplit[1], 10, 8) + if err != nil { + return + } + + codec.PayloadType = uint8(ptInt) } - codec.PayloadType = uint8(ptInt) codec.RTCPFeedback = append(codec.RTCPFeedback, split[1]) - - return codec, nil + return codec, isWildcard, nil } func mergeCodecs(codec Codec, codecs map[uint8]Codec) { @@ -200,8 +216,21 @@ func mergeCodecs(codec Codec, codecs map[uint8]Codec) { } func (s *SessionDescription) buildCodecMap() map[uint8]Codec { - codecs := make(map[uint8]Codec) + codecs := map[uint8]Codec{ + // static codecs that do not require a rtpmap + 0: { + PayloadType: 0, + Name: "PCMU", + ClockRate: 8000, + }, + 8: { + PayloadType: 8, + Name: "PCMA", + ClockRate: 8000, + }, + } + wildcardRTCPFeedback := []string{} for _, m := range s.MediaDescriptions { for _, a := range m.Attributes { attr := a.String() @@ -217,14 +246,26 @@ func (s *SessionDescription) buildCodecMap() map[uint8]Codec { mergeCodecs(codec, codecs) } case strings.HasPrefix(attr, "rtcp-fb:"): - codec, err := parseRtcpFb(attr) - if err == nil { + codec, isWildcard, err := parseRtcpFb(attr) + switch { + case err != nil: + case isWildcard: + wildcardRTCPFeedback = append(wildcardRTCPFeedback, codec.RTCPFeedback...) + default: mergeCodecs(codec, codecs) } } } } + for i, codec := range codecs { + for _, newRTCPFeedback := range wildcardRTCPFeedback { + codec.appendRTCPFeedback(newRTCPFeedback) + } + + codecs[i] = codec + } + return codecs } @@ -296,15 +337,16 @@ func (s *SessionDescription) GetPayloadTypeForCodec(wanted Codec) (uint8, error) type stateFn func(*lexer) (stateFn, error) type lexer struct { - desc *SessionDescription + desc *SessionDescription + cache *unmarshalCache baseLexer } -type keyToState func(key string) stateFn +type keyToState func(key byte) stateFn func (l *lexer) handleType(fn keyToState) (stateFn, error) { key, err := l.readType() - if errors.Is(err, io.EOF) && key == "" { + if errors.Is(err, io.EOF) && key == 0 { return nil, nil //nolint:nilnil } else if err != nil { return nil, err diff --git a/vendor/github.com/pion/srtp/v2/AUTHORS.txt b/vendor/github.com/pion/srtp/v2/AUTHORS.txt index daca101e1..73cea1e8a 100644 --- a/vendor/github.com/pion/srtp/v2/AUTHORS.txt +++ b/vendor/github.com/pion/srtp/v2/AUTHORS.txt @@ -11,6 +11,7 @@ Atsushi Watanabe backkem chenkaiC4 Chris Hiszpanski +cnderrauber cszdlt Hugo Arregui Jerko Steiner diff --git a/vendor/github.com/pion/srtp/v2/option.go b/vendor/github.com/pion/srtp/v2/option.go index 7e2618e38..0c75096a2 100644 --- a/vendor/github.com/pion/srtp/v2/option.go +++ b/vendor/github.com/pion/srtp/v2/option.go @@ -50,6 +50,22 @@ func SRTCPNoReplayProtection() ContextOption { } } +// SRTPReplayDetectorFactory sets custom SRTP replay detector. +func SRTPReplayDetectorFactory(fn func() replaydetector.ReplayDetector) ContextOption { // nolint:revive + return func(c *Context) error { + c.newSRTPReplayDetector = fn + return nil + } +} + +// SRTCPReplayDetectorFactory sets custom SRTCP replay detector. +func SRTCPReplayDetectorFactory(fn func() replaydetector.ReplayDetector) ContextOption { + return func(c *Context) error { + c.newSRTCPReplayDetector = fn + return nil + } +} + type nopReplayDetector struct{} func (s *nopReplayDetector) Check(uint64) (func(), bool) { diff --git a/vendor/github.com/pion/transport/v2/AUTHORS.txt b/vendor/github.com/pion/transport/v2/AUTHORS.txt index 35bbec396..b595c41c5 100644 --- a/vendor/github.com/pion/transport/v2/AUTHORS.txt +++ b/vendor/github.com/pion/transport/v2/AUTHORS.txt @@ -7,6 +7,7 @@ Adrian Cable Atsushi Watanabe backkem cnderrauber +Daniel Mangum Hugo Arregui Jeremiah Millay Jozef Kralik diff --git a/vendor/github.com/pion/transport/v2/connctx/connctx.go b/vendor/github.com/pion/transport/v2/connctx/connctx.go index 0bdd59509..4869b9c2e 100644 --- a/vendor/github.com/pion/transport/v2/connctx/connctx.go +++ b/vendor/github.com/pion/transport/v2/connctx/connctx.go @@ -2,6 +2,8 @@ // SPDX-License-Identifier: MIT // Package connctx wraps net.Conn using context.Context. +// +// Deprecated: use netctx instead. package connctx import ( diff --git a/vendor/github.com/pion/transport/v2/deadline/deadline.go b/vendor/github.com/pion/transport/v2/deadline/deadline.go index abd39f06d..f49b908db 100644 --- a/vendor/github.com/pion/transport/v2/deadline/deadline.go +++ b/vendor/github.com/pion/transport/v2/deadline/deadline.go @@ -11,25 +11,46 @@ import ( "time" ) +type deadlineState uint8 + +const ( + deadlineStopped deadlineState = iota + deadlineStarted + deadlineExceeded +) + +var _ context.Context = (*Deadline)(nil) + // Deadline signals updatable deadline timer. // Also, it implements context.Context. type Deadline struct { - exceeded chan struct{} - stop chan struct{} - stopped chan bool - deadline time.Time mu sync.RWMutex + timer timer + done chan struct{} + deadline time.Time + state deadlineState + pending uint8 } // New creates new deadline timer. func New() *Deadline { - d := &Deadline{ - exceeded: make(chan struct{}), - stop: make(chan struct{}), - stopped: make(chan bool, 1), + return &Deadline{ + done: make(chan struct{}), } - d.stopped <- true - return d +} + +func (d *Deadline) timeout() { + d.mu.Lock() + if d.pending--; d.pending != 0 || d.state != deadlineStarted { + d.mu.Unlock() + return + } + + d.state = deadlineExceeded + done := d.done + d.mu.Unlock() + + close(done) } // Set new deadline. Zero value means no deadline. @@ -37,55 +58,43 @@ func (d *Deadline) Set(t time.Time) { d.mu.Lock() defer d.mu.Unlock() - d.deadline = t - - close(d.stop) - - select { - case <-d.exceeded: - d.exceeded = make(chan struct{}) - default: - stopped := <-d.stopped - if !stopped { - d.exceeded = make(chan struct{}) - } + if d.state == deadlineStarted && d.timer.Stop() { + d.pending-- + } + + d.deadline = t + d.pending++ + + if d.state == deadlineExceeded { + d.done = make(chan struct{}) } - d.stop = make(chan struct{}) - d.stopped = make(chan bool, 1) if t.IsZero() { - d.stopped <- true + d.pending-- + d.state = deadlineStopped return } if dur := time.Until(t); dur > 0 { - exceeded := d.exceeded - stopped := d.stopped - go func() { - timer := time.NewTimer(dur) - select { - case <-timer.C: - close(exceeded) - stopped <- false - case <-d.stop: - if !timer.Stop() { - <-timer.C - } - stopped <- true - } - }() + d.state = deadlineStarted + if d.timer == nil { + d.timer = afterFunc(dur, d.timeout) + } else { + d.timer.Reset(dur) + } return } - close(d.exceeded) - d.stopped <- false + d.pending-- + d.state = deadlineExceeded + close(d.done) } // Done receives deadline signal. func (d *Deadline) Done() <-chan struct{} { d.mu.RLock() defer d.mu.RUnlock() - return d.exceeded + return d.done } // Err returns context.DeadlineExceeded if the deadline is exceeded. @@ -93,12 +102,10 @@ func (d *Deadline) Done() <-chan struct{} { func (d *Deadline) Err() error { d.mu.RLock() defer d.mu.RUnlock() - select { - case <-d.exceeded: + if d.state == deadlineExceeded { return context.DeadlineExceeded - default: - return nil } + return nil } // Deadline returns current deadline. diff --git a/vendor/github.com/pion/transport/v2/deadline/timer.go b/vendor/github.com/pion/transport/v2/deadline/timer.go new file mode 100644 index 000000000..5a3972478 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/deadline/timer.go @@ -0,0 +1,13 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package deadline + +import ( + "time" +) + +type timer interface { + Stop() bool + Reset(time.Duration) bool +} diff --git a/vendor/github.com/pion/transport/v2/deadline/timer_generic.go b/vendor/github.com/pion/transport/v2/deadline/timer_generic.go new file mode 100644 index 000000000..0c8f87ca0 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/deadline/timer_generic.go @@ -0,0 +1,15 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +//go:build !js +// +build !js + +package deadline + +import ( + "time" +) + +func afterFunc(d time.Duration, f func()) timer { + return time.AfterFunc(d, f) +} diff --git a/vendor/github.com/pion/transport/v2/deadline/timer_js.go b/vendor/github.com/pion/transport/v2/deadline/timer_js.go new file mode 100644 index 000000000..b77e31e09 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/deadline/timer_js.go @@ -0,0 +1,67 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +//go:build js +// +build js + +package deadline + +import ( + "sync" + "time" +) + +// jsTimer is a timer utility for wasm with a working Reset function. +type jsTimer struct { + f func() + mu sync.Mutex + timer *time.Timer + version uint64 + started bool +} + +func afterFunc(d time.Duration, f func()) timer { + t := &jsTimer{f: f} + t.Reset(d) + return t +} + +func (t *jsTimer) Stop() bool { + t.mu.Lock() + defer t.mu.Unlock() + + t.version++ + t.timer.Stop() + + started := t.started + t.started = false + return started +} + +func (t *jsTimer) Reset(d time.Duration) bool { + t.mu.Lock() + defer t.mu.Unlock() + + if t.timer != nil { + t.timer.Stop() + } + + t.version++ + version := t.version + t.timer = time.AfterFunc(d, func() { + t.mu.Lock() + if version != t.version { + t.mu.Unlock() + return + } + + t.started = false + t.mu.Unlock() + + t.f() + }) + + started := t.started + t.started = true + return started +} diff --git a/vendor/github.com/pion/transport/v2/packetio/buffer.go b/vendor/github.com/pion/transport/v2/packetio/buffer.go index 2d46d796a..b487457be 100644 --- a/vendor/github.com/pion/transport/v2/packetio/buffer.go +++ b/vendor/github.com/pion/transport/v2/packetio/buffer.go @@ -38,8 +38,9 @@ type Buffer struct { data []byte head, tail int - notify chan struct{} // non-nil when we have blocked readers - closed bool + notify chan struct{} + waiting bool + closed bool count int limitCount, limitSize int @@ -56,6 +57,7 @@ const ( // NewBuffer creates a new Buffer. func NewBuffer() *Buffer { return &Buffer{ + notify: make(chan struct{}, 1), readDeadline: deadline.New(), } } @@ -149,14 +151,6 @@ func (b *Buffer) Write(packet []byte) (int, error) { } } - var notify chan struct{} - if b.notify != nil { - // Prepare to notify readers, but only - // actually do it after we release the lock. - notify = b.notify - b.notify = nil - } - // store the length of the packet b.data[b.tail] = uint8(len(packet) >> 8) b.tail++ @@ -178,10 +172,17 @@ func (b *Buffer) Write(packet []byte) (int, error) { b.tail = m } b.count++ + + waiting := b.waiting + b.waiting = false + b.mutex.Unlock() - if notify != nil { - close(notify) + if waiting { + select { + case b.notify <- struct{}{}: + default: + } } return len(packet), nil @@ -244,7 +245,7 @@ func (b *Buffer) Read(packet []byte) (n int, err error) { //nolint:gocognit } b.count-- - + b.waiting = false b.mutex.Unlock() if copied < count { @@ -258,16 +259,13 @@ func (b *Buffer) Read(packet []byte) (n int, err error) { //nolint:gocognit return 0, io.EOF } - if b.notify == nil { - b.notify = make(chan struct{}) - } - notify := b.notify + b.waiting = true b.mutex.Unlock() select { case <-b.readDeadline.Done(): return 0, &netError{ErrTimeout, true, true} - case <-notify: + case <-b.notify: } } } @@ -282,14 +280,17 @@ func (b *Buffer) Close() (err error) { return nil } - notify := b.notify - b.notify = nil + waiting := b.waiting + b.waiting = false b.closed = true b.mutex.Unlock() - if notify != nil { - close(notify) + if waiting { + select { + case b.notify <- struct{}{}: + default: + } } return nil diff --git a/vendor/github.com/pion/transport/v2/udp/batchconn.go b/vendor/github.com/pion/transport/v2/udp/batchconn.go new file mode 100644 index 000000000..54bdab65f --- /dev/null +++ b/vendor/github.com/pion/transport/v2/udp/batchconn.go @@ -0,0 +1,170 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package udp + +import ( + "io" + "net" + "runtime" + "sync" + "sync/atomic" + "time" + + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +// BatchWriter represents conn can write messages in batch +type BatchWriter interface { + WriteBatch(ms []ipv4.Message, flags int) (int, error) +} + +// BatchReader represents conn can read messages in batch +type BatchReader interface { + ReadBatch(msg []ipv4.Message, flags int) (int, error) +} + +// BatchPacketConn represents conn can read/write messages in batch +type BatchPacketConn interface { + BatchWriter + BatchReader + io.Closer +} + +// BatchConn uses ipv4/v6.NewPacketConn to wrap a net.PacketConn to write/read messages in batch, +// only available in linux. In other platform, it will use single Write/Read as same as net.Conn. +type BatchConn struct { + net.PacketConn + + batchConn BatchPacketConn + + batchWriteMutex sync.Mutex + batchWriteMessages []ipv4.Message + batchWritePos int + batchWriteLast time.Time + + batchWriteSize int + batchWriteInterval time.Duration + + closed int32 +} + +// NewBatchConn creates a *BatchConn from net.PacketConn with batch configs. +func NewBatchConn(conn net.PacketConn, batchWriteSize int, batchWriteInterval time.Duration) *BatchConn { + bc := &BatchConn{ + PacketConn: conn, + batchWriteLast: time.Now(), + batchWriteInterval: batchWriteInterval, + batchWriteSize: batchWriteSize, + batchWriteMessages: make([]ipv4.Message, batchWriteSize), + } + for i := range bc.batchWriteMessages { + bc.batchWriteMessages[i].Buffers = [][]byte{make([]byte, sendMTU)} + } + + // batch write only supports linux + if runtime.GOOS == "linux" { + if pc4 := ipv4.NewPacketConn(conn); pc4 != nil { + bc.batchConn = pc4 + } else if pc6 := ipv6.NewPacketConn(conn); pc6 != nil { + bc.batchConn = pc6 + } + } + + if bc.batchConn != nil { + go func() { + writeTicker := time.NewTicker(batchWriteInterval / 2) + defer writeTicker.Stop() + for atomic.LoadInt32(&bc.closed) != 1 { + <-writeTicker.C + bc.batchWriteMutex.Lock() + if bc.batchWritePos > 0 && time.Since(bc.batchWriteLast) >= bc.batchWriteInterval { + _ = bc.flush() + } + bc.batchWriteMutex.Unlock() + } + }() + } + + return bc +} + +// Close batchConn and the underlying PacketConn +func (c *BatchConn) Close() error { + atomic.StoreInt32(&c.closed, 1) + c.batchWriteMutex.Lock() + if c.batchWritePos > 0 { + _ = c.flush() + } + c.batchWriteMutex.Unlock() + if c.batchConn != nil { + return c.batchConn.Close() + } + return c.PacketConn.Close() +} + +// WriteTo write message to an UDPAddr, addr should be nil if it is a connected socket. +func (c *BatchConn) WriteTo(b []byte, addr net.Addr) (int, error) { + if c.batchConn == nil { + return c.PacketConn.WriteTo(b, addr) + } + return c.enqueueMessage(b, addr) +} + +func (c *BatchConn) enqueueMessage(buf []byte, raddr net.Addr) (int, error) { + var err error + c.batchWriteMutex.Lock() + defer c.batchWriteMutex.Unlock() + + msg := &c.batchWriteMessages[c.batchWritePos] + // reset buffers + msg.Buffers = msg.Buffers[:1] + msg.Buffers[0] = msg.Buffers[0][:cap(msg.Buffers[0])] + + c.batchWritePos++ + if raddr != nil { + msg.Addr = raddr + } + if n := copy(msg.Buffers[0], buf); n < len(buf) { + extraBuffer := make([]byte, len(buf)-n) + copy(extraBuffer, buf[n:]) + msg.Buffers = append(msg.Buffers, extraBuffer) + } else { + msg.Buffers[0] = msg.Buffers[0][:n] + } + if c.batchWritePos == c.batchWriteSize { + err = c.flush() + } + return len(buf), err +} + +// ReadBatch reads messages in batch, return length of message readed and error. +func (c *BatchConn) ReadBatch(msgs []ipv4.Message, flags int) (int, error) { + if c.batchConn == nil { + n, addr, err := c.PacketConn.ReadFrom(msgs[0].Buffers[0]) + if err == nil { + msgs[0].N = n + msgs[0].Addr = addr + return 1, nil + } + return 0, err + } + return c.batchConn.ReadBatch(msgs, flags) +} + +func (c *BatchConn) flush() error { + var writeErr error + var txN int + for txN < c.batchWritePos { + n, err := c.batchConn.WriteBatch(c.batchWriteMessages[txN:c.batchWritePos], 0) + if err != nil { + writeErr = err + break + } + txN += n + } + c.batchWritePos = 0 + c.batchWriteLast = time.Now() + return writeErr +} diff --git a/vendor/github.com/pion/transport/v2/udp/conn.go b/vendor/github.com/pion/transport/v2/udp/conn.go index 2b57174a3..c2f257eaf 100644 --- a/vendor/github.com/pion/transport/v2/udp/conn.go +++ b/vendor/github.com/pion/transport/v2/udp/conn.go @@ -12,12 +12,15 @@ import ( "sync/atomic" "time" + "github.com/pion/logging" "github.com/pion/transport/v2/deadline" "github.com/pion/transport/v2/packetio" + "golang.org/x/net/ipv4" ) const ( receiveMTU = 8192 + sendMTU = 1500 defaultListenBacklog = 128 // same as Linux default ) @@ -25,19 +28,20 @@ const ( var ( ErrClosedListener = errors.New("udp: listener closed") ErrListenQueueExceeded = errors.New("udp: listen queue exceeded") - ErrReadBufferFailed = errors.New("udp: failed to get read buffer from pool") + ErrInvalidBatchConfig = errors.New("udp: invalid batch config") ) // listener augments a connection-oriented Listener over a UDP PacketConn type listener struct { - pConn *net.UDPConn + pConn net.PacketConn - accepting atomic.Value // bool - acceptCh chan *Conn - doneCh chan struct{} - doneOnce sync.Once - acceptFilter func([]byte) bool - readBufferPool *sync.Pool + readBatchSize int + + accepting atomic.Value // bool + acceptCh chan *Conn + doneCh chan struct{} + doneOnce sync.Once + acceptFilter func([]byte) bool connLock sync.Mutex conns map[string]*Conn @@ -48,6 +52,8 @@ type listener struct { readDoneCh chan struct{} errRead atomic.Value // error + + logger logging.LeveledLogger } // Accept waits for and returns the next connection to the listener. @@ -111,6 +117,20 @@ func (l *listener) Addr() net.Addr { return l.pConn.LocalAddr() } +// BatchIOConfig indicates config to batch read/write packets, +// it will use ReadBatch/WriteBatch to improve throughput for UDP. +type BatchIOConfig struct { + Enable bool + // ReadBatchSize indicates the maximum number of packets to be read in one batch, a batch size less than 2 means + // disable read batch. + ReadBatchSize int + // WriteBatchSize indicates the maximum number of packets to be written in one batch + WriteBatchSize int + // WriteBatchInterval indicates the maximum interval to wait before writing packets in one batch + // small interval will reduce latency/jitter, but increase the io count. + WriteBatchInterval time.Duration +} + // ListenConfig stores options for listening to an address. type ListenConfig struct { // Backlog defines the maximum length of the queue of pending @@ -124,6 +144,18 @@ type ListenConfig struct { // AcceptFilter determines whether the new conn should be made for // the incoming packet. If not set, any packet creates new conn. AcceptFilter func([]byte) bool + + // ReadBufferSize sets the size of the operating system's + // receive buffer associated with the listener. + ReadBufferSize int + + // WriteBufferSize sets the size of the operating system's + // send buffer associated with the connection. + WriteBufferSize int + + Batch BatchIOConfig + + LoggerFactory logging.LoggerFactory } // Listen creates a new listener based on the ListenConfig. @@ -132,25 +164,43 @@ func (lc *ListenConfig) Listen(network string, laddr *net.UDPAddr) (net.Listener lc.Backlog = defaultListenBacklog } + if lc.Batch.Enable && (lc.Batch.WriteBatchSize <= 0 || lc.Batch.WriteBatchInterval <= 0) { + return nil, ErrInvalidBatchConfig + } + conn, err := net.ListenUDP(network, laddr) if err != nil { return nil, err } + if lc.ReadBufferSize > 0 { + _ = conn.SetReadBuffer(lc.ReadBufferSize) + } + if lc.WriteBufferSize > 0 { + _ = conn.SetWriteBuffer(lc.WriteBufferSize) + } + + loggerFactory := lc.LoggerFactory + if loggerFactory == nil { + loggerFactory = logging.NewDefaultLoggerFactory() + } + + logger := loggerFactory.NewLogger("transport") + l := &listener{ pConn: conn, acceptCh: make(chan *Conn, lc.Backlog), conns: make(map[string]*Conn), doneCh: make(chan struct{}), acceptFilter: lc.AcceptFilter, - readBufferPool: &sync.Pool{ - New: func() interface{} { - buf := make([]byte, receiveMTU) - return &buf - }, - }, - connWG: &sync.WaitGroup{}, - readDoneCh: make(chan struct{}), + connWG: &sync.WaitGroup{}, + readDoneCh: make(chan struct{}), + logger: logger, + } + + if lc.Batch.Enable { + l.pConn = NewBatchConn(conn, lc.Batch.WriteBatchSize, lc.Batch.WriteBatchInterval) + l.readBatchSize = lc.Batch.ReadBatchSize } l.accepting.Store(true) @@ -182,25 +232,54 @@ func (l *listener) readLoop() { defer l.readWG.Done() defer close(l.readDoneCh) - buf, ok := l.readBufferPool.Get().(*[]byte) - if !ok { - l.errRead.Store(ErrReadBufferFailed) - return + if br, ok := l.pConn.(BatchReader); ok && l.readBatchSize > 1 { + l.readBatch(br) + } else { + l.read() } - defer l.readBufferPool.Put(buf) +} +func (l *listener) readBatch(br BatchReader) { + msgs := make([]ipv4.Message, l.readBatchSize) + for i := range msgs { + msg := &msgs[i] + msg.Buffers = [][]byte{make([]byte, receiveMTU)} + msg.OOB = make([]byte, 40) + } for { - n, raddr, err := l.pConn.ReadFrom(*buf) + n, err := br.ReadBatch(msgs, 0) if err != nil { l.errRead.Store(err) return } - conn, ok, err := l.getConn(raddr, (*buf)[:n]) - if err != nil { - continue + for i := 0; i < n; i++ { + l.dispatchMsg(msgs[i].Addr, msgs[i].Buffers[0][:msgs[i].N]) } - if ok { - _, _ = conn.buffer.Write((*buf)[:n]) + } +} + +func (l *listener) read() { + buf := make([]byte, receiveMTU) + for { + n, raddr, err := l.pConn.ReadFrom(buf) + if err != nil { + l.errRead.Store(err) + l.logger.Tracef("error reading from connection err=%v", err) + return + } + l.dispatchMsg(raddr, buf[:n]) + } +} + +func (l *listener) dispatchMsg(addr net.Addr, buf []byte) { + conn, ok, err := l.getConn(addr, buf) + if err != nil { + return + } + if ok { + _, err := conn.buffer.Write(buf) + if err != nil { + l.logger.Tracef("error dispatching message addr=%v err=%v", addr, err) } } } diff --git a/vendor/github.com/pion/turn/v2/.gitignore b/vendor/github.com/pion/turn/v2/.gitignore index f977e7485..6e2f206a9 100644 --- a/vendor/github.com/pion/turn/v2/.gitignore +++ b/vendor/github.com/pion/turn/v2/.gitignore @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + ### JetBrains IDE ### ##################### .idea/ diff --git a/vendor/github.com/pion/turn/v2/.golangci.yml b/vendor/github.com/pion/turn/v2/.golangci.yml index 48696f16b..4e3eddf42 100644 --- a/vendor/github.com/pion/turn/v2/.golangci.yml +++ b/vendor/github.com/pion/turn/v2/.golangci.yml @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + linters-settings: govet: check-shadowing: true @@ -10,7 +13,14 @@ linters-settings: modules: - github.com/pkg/errors: recommendations: - - errors + - errors + forbidigo: + forbid: + - ^fmt.Print(f|ln)?$ + - ^log.(Panic|Fatal|Print)(f|ln)?$ + - ^os.Exit$ + - ^panic$ + - ^print(ln)?$ linters: enable: @@ -29,6 +39,7 @@ linters: - errorlint # errorlint is a linter for that can be used to find code that will cause problems with the error wrapping scheme introduced in Go 1.13. - exhaustive # check exhaustiveness of enum switch statements - exportloopref # checks for pointers to enclosing loop variables + - forbidigo # Forbids identifiers - forcetypeassert # finds forced type assertions - gci # Gci control golang package import order and make it always deterministic. - gochecknoglobals # Checks that no globals are present in Go code @@ -73,7 +84,6 @@ linters: - containedctx # containedctx is a linter that detects struct contained context.Context field - cyclop # checks function and package cyclomatic complexity - exhaustivestruct # Checks if all struct's fields are initialized - - forbidigo # Forbids identifiers - funlen # Tool for detection of long functions - gocyclo # Computes and checks the cyclomatic complexity of functions - godot # Check if comments end in a period @@ -105,12 +115,23 @@ issues: - path: _test\.go linters: - gocognit + - forbidigo # Allow complex main function in examples - path: examples text: "of func `main` is high" linters: - gocognit + + # Allow forbidden identifiers in examples + - path: examples + linters: + - forbidigo + + # Allow forbidden identifiers in CLI commands + - path: cmd + linters: + - forbidigo run: skip-dirs-use-default: false diff --git a/vendor/github.com/pion/turn/v2/.goreleaser.yml b/vendor/github.com/pion/turn/v2/.goreleaser.yml index 2caa5fbd3..30093e9d6 100644 --- a/vendor/github.com/pion/turn/v2/.goreleaser.yml +++ b/vendor/github.com/pion/turn/v2/.goreleaser.yml @@ -1,2 +1,5 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + builds: - skip: true diff --git a/vendor/github.com/pion/turn/v2/AUTHORS.txt b/vendor/github.com/pion/turn/v2/AUTHORS.txt index 3b38a5c1f..ea984983e 100644 --- a/vendor/github.com/pion/turn/v2/AUTHORS.txt +++ b/vendor/github.com/pion/turn/v2/AUTHORS.txt @@ -5,14 +5,19 @@ # see https://github.com/pion/.goassets/blob/master/scripts/generate-authors.sh for the scripting Aaron France Aleksandr Razumov +anastasia andrefsp +Andy Yan Antonio Sorrentino +Artem Yarovenko Atsushi Watanabe backkem +boks1971 Caleb Phillips cnderrauber David Colburn Gabor Retvari +Harold Thetiot Herman Banken Hugo Arregui Igor German diff --git a/vendor/github.com/pion/turn/v2/DESIGN.md b/vendor/github.com/pion/turn/v2/DESIGN.md deleted file mode 100644 index 2c5246693..000000000 --- a/vendor/github.com/pion/turn/v2/DESIGN.md +++ /dev/null @@ -1,31 +0,0 @@ -# Why Pion TURN -TURN servers aren't exactly a hot technology, they are usually an after thought when building something. Most of the time -beginners build an interesting WebRTC application, but at the very end realize they need a TURN server. It is really frustrating when you -want to share your cool new project, only to realize you have to run another service. - -Then you find yourself building from source, fighting with config files and making changes you don't fully understand. Pion TURN was born -hoping to solve these frustrations. These are the guiding principals/features that define pion-turn. - -## Easy setup -simple-turn is a statically built TURN server, configured by environment variables. The entire install setup is 5 commands, on any platform! -The goal is that anyone should be able to run a TURN server on any platform. - -## Integration first -pion-turn makes no assumptions about how you authenticate users, how you log, or even your topology! Instead of running a dedicated TURN server you -can inherit from github.com/pion/turn and set whatever logger you want. - -## Embeddable -You can add this to an existing service. This means all your config files stay homogeneous instead of having the mismatch that makes it harder to manage your services. -For small setups it is usually an overkill to deploy dedicated TURN servers, this makes it easier to solve the problems you care about. - -## Safe -Golang provides a great foundation to build safe network services. Especially when running a networked service that is highly concurrent bugs can be devastating. - -## Readable -All network interaction is commented with a link to the spec. This makes learning and debugging easier, the TURN server was written to also serve as a guide for others. - -## Tested -Every commit is tested via travis-ci Go provides fantastic facilities for testing, and more will be added as time goes on. - -## Shared libraries -Every pion product is built using shared libraries, allowing others to build things using existing tested STUN and TURN tools. diff --git a/vendor/github.com/pion/turn/v2/FAQ.md b/vendor/github.com/pion/turn/v2/FAQ.md deleted file mode 100644 index a8ffd6491..000000000 --- a/vendor/github.com/pion/turn/v2/FAQ.md +++ /dev/null @@ -1,17 +0,0 @@ - - -## FAQ - -Q: Will pion/turn also act as a STUN server? - -A: Yes. - -Q: How do I implement token-based authentication? - -A: Replace the username with a token in the [AuthHandler](https://github.com/pion/turn/blob/6d0ff435910870eb9024b18321b93b61844fcfec/examples/turn-server/simple/main.go#L49). -The password sent by the client can be any non-empty string, as long as it matches that used by the [GenerateAuthKey](https://github.com/pion/turn/blob/6d0ff435910870eb9024b18321b93b61844fcfec/examples/turn-server/simple/main.go#L41) -function. - -Q: Will WebRTC prioritize using STUN over TURN? - -A: Yes. \ No newline at end of file diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/security/tls/LICENSE.md b/vendor/github.com/pion/turn/v2/LICENSE similarity index 93% rename from vendor/github.com/libp2p/go-libp2p/p2p/security/tls/LICENSE.md rename to vendor/github.com/pion/turn/v2/LICENSE index a94e82cce..491caf6b0 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/security/tls/LICENSE.md +++ b/vendor/github.com/pion/turn/v2/LICENSE @@ -1,4 +1,6 @@ -Copyright 2018 Marten Seemann +MIT License + +Copyright (c) 2023 The Pion community Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/vendor/github.com/pion/turn/v2/LICENSE.md b/vendor/github.com/pion/turn/v2/LICENSE.md deleted file mode 100644 index 5cc9cbdc5..000000000 --- a/vendor/github.com/pion/turn/v2/LICENSE.md +++ /dev/null @@ -1,7 +0,0 @@ -Copyright 2018 Pion LLC - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/pion/turn/v2/README.md b/vendor/github.com/pion/turn/v2/README.md index b8901fd30..5adcfe7df 100644 --- a/vendor/github.com/pion/turn/v2/README.md +++ b/vendor/github.com/pion/turn/v2/README.md @@ -10,8 +10,8 @@ Slack Widget
- Build Status - GoDoc + GitHub Workflow Status + Go Reference Coverage Status Go Report Card License: MIT @@ -28,7 +28,7 @@ Pion TURN is a Go toolkit for building TURN servers and clients. We wrote it to * **Safe** - Stability and safety is important for network services. Go provides everything we need. * **Scalable** - Create allocations and mutate state at runtime. Designed to make scaling easy. -# Using +### Using `pion/turn` is an API for building STUN/TURN clients and servers, not a binary you deploy then configure. It may require copying our examples and making minor modifications to fit your need, no knowledge of Go is required however. You may be able to download the pre-made binaries of our examples if you wish to get started quickly. @@ -37,7 +37,7 @@ The advantage of this is that you don't need to deal with complicated config fil After you instantiate an instance of a Pion TURN server or client you interact with it like any library. The quickest way to get started is to look at the [examples](examples) or [GoDoc](https://godoc.org/github.com/pion/turn) -# Examples +### Examples We try to cover most common use cases in [examples](examples). If more examples could be helpful please file an issue, we are always looking to expand and improve `pion/turn` to make it easier for developers. @@ -46,24 +46,48 @@ It is also very easy to [cross compile](https://dave.cheney.net/2015/08/22/cross You can also see `pion/turn` usage in [pion/ice](https://github.com/pion/ice) -# [FAQ](https://github.com/pion/webrtc/wiki/FAQ) +### FAQ + +Also take a look at the [Pion WebRTC FAQ](https://github.com/pion/webrtc/wiki/FAQ) + +#### Will pion/turn also act as a STUN server? +Yes. + +#### How do I implement token-based authentication? +Replace the username with a token in the [AuthHandler](https://github.com/pion/turn/blob/6d0ff435910870eb9024b18321b93b61844fcfec/examples/turn-server/simple/main.go#L49). +The password sent by the client can be any non-empty string, as long as it matches that used by the [GenerateAuthKey](https://github.com/pion/turn/blob/6d0ff435910870eb9024b18321b93b61844fcfec/examples/turn-server/simple/main.go#L41) +function. + +#### Will WebRTC prioritize using STUN over TURN? +Yes. ### RFCs #### Implemented -* [RFC 5389: Session Traversal Utilities for NAT (STUN)](https://tools.ietf.org/html/rfc5389) -* [RFC 5766: Traversal Using Relays around NAT (TURN)](https://tools.ietf.org/html/rfc5766) +* **RFC 5389**: [Session Traversal Utilities for NAT (STUN)][rfc5389] +* **RFC 5766**: [Traversal Using Relays around NAT (TURN): Relay Extensions to Session Traversal Utilities for NAT (STUN)][rfc5766] #### Planned -* [RFC 6062: Traversal Using Relays around NAT (TURN) Extensions for TCP Allocations](https://tools.ietf.org/html/rfc6062) -* [RFC 6156: Traversal Using Relays around NAT (TURN) Extension for IPv6](https://tools.ietf.org/html/rfc6156) +* **RFC 6062**: [Traversal Using Relays around NAT (TURN) Extensions for TCP Allocations][rfc6062] +* **RFC 6156**: [Traversal Using Relays around NAT (TURN) Extension for IPv6][rfc6156] + +[rfc5389]: https://tools.ietf.org/html/rfc5389 +[rfc5766]: https://tools.ietf.org/html/rfc5766 +[rfc6062]: https://tools.ietf.org/html/rfc6062 +[rfc6156]: https://tools.ietf.org/html/rfc6156 + +### Roadmap +The library is used as a part of our WebRTC implementation. Please refer to that [roadmap](https://github.com/pion/webrtc/issues/9) to track our major milestones. ### Community -Pion has an active community on the [Golang Slack](https://pion.ly/slack). Sign up and join the **#pion** channel for discussions and support. +Pion has an active community on the [Slack](https://pion.ly/slack). + +Follow the [Pion Twitter](https://twitter.com/_pion) for project updates and important WebRTC news. We are always looking to support **your projects**. Please reach out if you have something to build! +If you need commercial support or don't want to use public methods you can contact us at [team@pion.ly](mailto:team@pion.ly) ### Contributing -Check out the **[contributing wiki](https://github.com/pion/webrtc/wiki/Contributing)** to join the group of amazing people making this project possible. +Check out the [contributing wiki](https://github.com/pion/webrtc/wiki/Contributing) to join the group of amazing people making this project possible: [AUTHORS.txt](./AUTHORS.txt) ### License -MIT License - see [LICENSE.md](LICENSE.md) for full text +MIT License - see [LICENSE](LICENSE) for full text diff --git a/vendor/github.com/pion/turn/v2/client.go b/vendor/github.com/pion/turn/v2/client.go index 5e675fd36..350715c63 100644 --- a/vendor/github.com/pion/turn/v2/client.go +++ b/vendor/github.com/pion/turn/v2/client.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package turn import ( @@ -12,15 +15,14 @@ import ( "github.com/pion/stun" "github.com/pion/transport/v2" "github.com/pion/transport/v2/stdnet" - "github.com/pion/transport/v2/vnet" "github.com/pion/turn/v2/internal/client" "github.com/pion/turn/v2/internal/proto" ) const ( defaultRTO = 200 * time.Millisecond - maxRtxCount = 7 // total 7 requests (Rc) - maxDataBufferSize = math.MaxUint16 // message size limit for Chromium + maxRtxCount = 7 // Total 7 requests (Rc) + maxDataBufferSize = math.MaxUint16 // Message size limit for Chromium ) // interval [msec] @@ -43,31 +45,31 @@ type ClientConfig struct { Software string RTO time.Duration Conn net.PacketConn // Listening socket (net.PacketConn) - LoggerFactory logging.LoggerFactory Net transport.Net + LoggerFactory logging.LoggerFactory } // Client is a STUN server client type Client struct { - conn net.PacketConn // read-only - stunServ net.Addr // read-only - turnServ net.Addr // read-only - stunServStr string // read-only, used for de-multiplexing - turnServStr string // read-only, used for de-multiplexing - username stun.Username // read-only - password string // read-only - realm stun.Realm // read-only - integrity stun.MessageIntegrity // read-only - software stun.Software // read-only - trMap *client.TransactionMap // thread-safe - rto time.Duration // read-only - relayedConn *client.UDPConn // protected by mutex *** - allocTryLock client.TryLock // thread-safe - listenTryLock client.TryLock // thread-safe - net transport.Net // read-only - mutex sync.RWMutex // thread-safe - mutexTrMap sync.Mutex // thread-safe - log logging.LeveledLogger // read-only + conn net.PacketConn // Read-only + net transport.Net // Read-only + stunServerAddr net.Addr // Read-only + turnServerAddr net.Addr // Read-only + + username stun.Username // Read-only + password string // Read-only + realm stun.Realm // Read-only + integrity stun.MessageIntegrity // Read-only + software stun.Software // Read-only + trMap *client.TransactionMap // Thread-safe + rto time.Duration // Read-only + relayedConn *client.UDPConn // Protected by mutex *** + tcpAllocation *client.TCPAllocation // Protected by mutex *** + allocTryLock client.TryLock // Thread-safe + listenTryLock client.TryLock // Thread-safe + mutex sync.RWMutex // Thread-safe + mutexTrMap sync.Mutex // Thread-safe + log logging.LeveledLogger // Read-only } // NewClient returns a new Client instance. listeningAddress is the address and port to listen on, default "0.0.0.0:0" @@ -83,56 +85,52 @@ func NewClient(config *ClientConfig) (*Client, error) { return nil, errNilConn } - var err error - if config.Net == nil { - config.Net, err = stdnet.NewNet() // defaults to native operation - if err != nil { - return nil, err - } - } else if _, ok := config.Net.(*vnet.Net); ok { - log.Warn("Virtual network is enabled") - } - - var stunServ, turnServ net.Addr - var stunServStr, turnServStr string - if len(config.STUNServerAddr) > 0 { - log.Debugf("resolving %s", config.STUNServerAddr) - stunServ, err = config.Net.ResolveUDPAddr("udp4", config.STUNServerAddr) - if err != nil { - return nil, err - } - stunServStr = stunServ.String() - log.Debugf("stunServ: %s", stunServStr) - } - if len(config.TURNServerAddr) > 0 { - log.Debugf("resolving %s", config.TURNServerAddr) - turnServ, err = config.Net.ResolveUDPAddr("udp4", config.TURNServerAddr) - if err != nil { - return nil, err - } - turnServStr = turnServ.String() - log.Debugf("turnServ: %s", turnServStr) - } - rto := defaultRTO if config.RTO > 0 { rto = config.RTO } + if config.Net == nil { + n, err := stdnet.NewNet() + if err != nil { + return nil, err + } + config.Net = n + } + + var stunServ, turnServ net.Addr + var err error + + if len(config.STUNServerAddr) > 0 { + stunServ, err = config.Net.ResolveUDPAddr("udp4", config.STUNServerAddr) + if err != nil { + return nil, err + } + + log.Debugf("Resolved STUN server %s to %s", config.STUNServerAddr, stunServ) + } + + if len(config.TURNServerAddr) > 0 { + turnServ, err = config.Net.ResolveUDPAddr("udp4", config.TURNServerAddr) + if err != nil { + return nil, err + } + + log.Debugf("Resolved TURN server %s to %s", config.TURNServerAddr, turnServ) + } + c := &Client{ - conn: config.Conn, - stunServ: stunServ, - turnServ: turnServ, - stunServStr: stunServStr, - turnServStr: turnServStr, - username: stun.NewUsername(config.Username), - password: config.Password, - realm: stun.NewRealm(config.Realm), - software: stun.NewSoftware(config.Software), - net: config.Net, - trMap: client.NewTransactionMap(), - rto: rto, - log: log, + conn: config.Conn, + stunServerAddr: stunServ, + turnServerAddr: turnServ, + username: stun.NewUsername(config.Username), + password: config.Password, + realm: stun.NewRealm(config.Realm), + software: stun.NewSoftware(config.Software), + trMap: client.NewTransactionMap(), + net: config.Net, + rto: rto, + log: log, } return c, nil @@ -140,12 +138,12 @@ func NewClient(config *ClientConfig) (*Client, error) { // TURNServerAddr return the TURN server address func (c *Client) TURNServerAddr() net.Addr { - return c.turnServ + return c.turnServerAddr } // STUNServerAddr return the STUN server address func (c *Client) STUNServerAddr() net.Addr { - return c.stunServ + return c.stunServerAddr } // Username returns username @@ -176,13 +174,13 @@ func (c *Client) Listen() error { for { n, from, err := c.conn.ReadFrom(buf) if err != nil { - c.log.Debugf("exiting read loop: %s", err.Error()) + c.log.Debugf("Failed to read: %s. Exiting loop", err) break } _, err = c.HandleInbound(buf[:n], from) if err != nil { - c.log.Debugf("exiting read loop: %s", err.Error()) + c.log.Debugf("Failed to handle inbound message: %s. Exiting loop", err) break } } @@ -232,10 +230,84 @@ func (c *Client) SendBindingRequestTo(to net.Addr) (net.Addr, error) { // SendBindingRequest sends a new STUN request to the STUN server func (c *Client) SendBindingRequest() (net.Addr, error) { - if c.stunServ == nil { + if c.stunServerAddr == nil { return nil, errSTUNServerAddressNotSet } - return c.SendBindingRequestTo(c.stunServ) + return c.SendBindingRequestTo(c.stunServerAddr) +} + +func (c *Client) sendAllocateRequest(protocol proto.Protocol) (proto.RelayedAddress, proto.Lifetime, stun.Nonce, error) { + var relayed proto.RelayedAddress + var lifetime proto.Lifetime + var nonce stun.Nonce + + msg, err := stun.Build( + stun.TransactionID, + stun.NewType(stun.MethodAllocate, stun.ClassRequest), + proto.RequestedTransport{Protocol: protocol}, + stun.Fingerprint, + ) + if err != nil { + return relayed, lifetime, nonce, err + } + + trRes, err := c.PerformTransaction(msg, c.turnServerAddr, false) + if err != nil { + return relayed, lifetime, nonce, err + } + + res := trRes.Msg + + // Anonymous allocate failed, trying to authenticate. + if err = nonce.GetFrom(res); err != nil { + return relayed, lifetime, nonce, err + } + if err = c.realm.GetFrom(res); err != nil { + return relayed, lifetime, nonce, err + } + c.realm = append([]byte(nil), c.realm...) + c.integrity = stun.NewLongTermIntegrity( + c.username.String(), c.realm.String(), c.password, + ) + // Trying to authorize. + msg, err = stun.Build( + stun.TransactionID, + stun.NewType(stun.MethodAllocate, stun.ClassRequest), + proto.RequestedTransport{Protocol: protocol}, + &c.username, + &c.realm, + &nonce, + &c.integrity, + stun.Fingerprint, + ) + if err != nil { + return relayed, lifetime, nonce, err + } + + trRes, err = c.PerformTransaction(msg, c.turnServerAddr, false) + if err != nil { + return relayed, lifetime, nonce, err + } + res = trRes.Msg + + if res.Type.Class == stun.ClassErrorResponse { + var code stun.ErrorCodeAttribute + if err = code.GetFrom(res); err == nil { + return relayed, lifetime, nonce, fmt.Errorf("%s (error %s)", res.Type, code) //nolint:goerr113 + } + return relayed, lifetime, nonce, fmt.Errorf("%s", res.Type) //nolint:goerr113 + } + + // Getting relayed addresses from response. + if err := relayed.GetFrom(res); err != nil { + return relayed, lifetime, nonce, err + } + + // Getting lifetime from response + if err := lifetime.GetFrom(res); err != nil { + return relayed, lifetime, nonce, err + } + return relayed, lifetime, nonce, nil } // Allocate sends a TURN allocation request to the given transport address @@ -250,98 +322,88 @@ func (c *Client) Allocate() (net.PacketConn, error) { return nil, fmt.Errorf("%w: %s", errAlreadyAllocated, relayedConn.LocalAddr().String()) } - msg, err := stun.Build( - stun.TransactionID, - stun.NewType(stun.MethodAllocate, stun.ClassRequest), - proto.RequestedTransport{Protocol: proto.ProtoUDP}, - stun.Fingerprint, - ) + relayed, lifetime, nonce, err := c.sendAllocateRequest(proto.ProtoUDP) if err != nil { return nil, err } - trRes, err := c.PerformTransaction(msg, c.turnServ, false) - if err != nil { - return nil, err - } - - res := trRes.Msg - - // Anonymous allocate failed, trying to authenticate. - var nonce stun.Nonce - if err = nonce.GetFrom(res); err != nil { - return nil, err - } - if err = c.realm.GetFrom(res); err != nil { - return nil, err - } - c.realm = append([]byte(nil), c.realm...) - c.integrity = stun.NewLongTermIntegrity( - c.username.String(), c.realm.String(), c.password, - ) - // Trying to authorize. - msg, err = stun.Build( - stun.TransactionID, - stun.NewType(stun.MethodAllocate, stun.ClassRequest), - proto.RequestedTransport{Protocol: proto.ProtoUDP}, - &c.username, - &c.realm, - &nonce, - &c.integrity, - stun.Fingerprint, - ) - if err != nil { - return nil, err - } - - trRes, err = c.PerformTransaction(msg, c.turnServ, false) - if err != nil { - return nil, err - } - res = trRes.Msg - - if res.Type.Class == stun.ClassErrorResponse { - var code stun.ErrorCodeAttribute - if err = code.GetFrom(res); err == nil { - return nil, fmt.Errorf("%s (error %s)", res.Type, code) //nolint:goerr113 - } - return nil, fmt.Errorf("%s", res.Type) //nolint:goerr113 - } - - // Getting relayed addresses from response. - var relayed proto.RelayedAddress - if err := relayed.GetFrom(res); err != nil { - return nil, err - } relayedAddr := &net.UDPAddr{ IP: relayed.IP, Port: relayed.Port, } - // Getting lifetime from response - var lifetime proto.Lifetime - if err := lifetime.GetFrom(res); err != nil { - return nil, err - } - - relayedConn = client.NewUDPConn(&client.UDPConnConfig{ - Observer: c, + relayedConn = client.NewUDPConn(&client.AllocationConfig{ + Client: c, RelayedAddr: relayedAddr, + ServerAddr: c.turnServerAddr, + Realm: c.realm, + Username: c.username, Integrity: c.integrity, Nonce: nonce, Lifetime: lifetime.Duration, + Net: c.net, Log: c.log, }) - c.setRelayedUDPConn(relayedConn) return relayedConn, nil } +// AllocateTCP creates a new TCP allocation at the TURN server. +func (c *Client) AllocateTCP() (*client.TCPAllocation, error) { + if err := c.allocTryLock.Lock(); err != nil { + return nil, fmt.Errorf("%w: %s", errOneAllocateOnly, err.Error()) + } + defer c.allocTryLock.Unlock() + + allocation := c.getTCPAllocation() + if allocation != nil { + return nil, fmt.Errorf("%w: %s", errAlreadyAllocated, allocation.Addr()) + } + + relayed, lifetime, nonce, err := c.sendAllocateRequest(proto.ProtoTCP) + if err != nil { + return nil, err + } + + relayedAddr := &net.TCPAddr{ + IP: relayed.IP, + Port: relayed.Port, + } + + allocation = client.NewTCPAllocation(&client.AllocationConfig{ + Client: c, + RelayedAddr: relayedAddr, + ServerAddr: c.turnServerAddr, + Realm: c.realm, + Username: c.username, + Integrity: c.integrity, + Nonce: nonce, + Lifetime: lifetime.Duration, + Net: c.net, + Log: c.log, + }) + + c.setTCPAllocation(allocation) + + return allocation, nil +} + // CreatePermission Issues a CreatePermission request for the supplied addresses // as described in https://datatracker.ietf.org/doc/html/rfc5766#section-9 func (c *Client) CreatePermission(addrs ...net.Addr) error { - return c.relayedUDPConn().CreatePermissions(addrs...) + if conn := c.relayedUDPConn(); conn != nil { + if err := conn.CreatePermissions(addrs...); err != nil { + return err + } + } + + if allocation := c.getTCPAllocation(); allocation != nil { + if err := allocation.CreatePermissions(addrs...); err != nil { + return err + } + } + return nil } // PerformTransaction performs STUN transaction @@ -363,7 +425,7 @@ func (c *Client) PerformTransaction(msg *stun.Message, to net.Addr, ignoreResult c.trMap.Insert(trKey, tr) - c.log.Tracef("start %s transaction %s to %s", msg.Type, trKey, tr.To.String()) + c.log.Tracef("Start %s transaction %s to %s", msg.Type, trKey, tr.To) _, err := c.conn.WriteTo(tr.Raw, to) if err != nil { return client.TransactionResult{}, err @@ -371,7 +433,7 @@ func (c *Client) PerformTransaction(msg *stun.Message, to net.Addr, ignoreResult tr.StartRtxTimer(c.onRtxTimeout) - // If dontWait is true, get the transaction going and return immediately + // If ignoreResult is true, get the transaction going and return immediately if ignoreResult { return client.TransactionResult{}, nil } @@ -385,8 +447,9 @@ func (c *Client) PerformTransaction(msg *stun.Message, to net.Addr, ignoreResult // OnDeallocated is called when de-allocation of relay address has been complete. // (Called by UDPConn) -func (c *Client) OnDeallocated(relayedAddr net.Addr) { +func (c *Client) OnDeallocated(net.Addr) { c.setRelayedUDPConn(nil) + c.setTCPAllocation(nil) } // HandleInbound handles data received. @@ -420,12 +483,12 @@ func (c *Client) HandleInbound(data []byte, from net.Addr) (bool, error) { return true, c.handleSTUNMessage(data, from) case proto.IsChannelData(data): return true, c.handleChannelData(data) - case len(c.stunServStr) != 0 && from.String() == c.stunServStr: - // received from STUN server but it is not a STUN message + case c.stunServerAddr != nil && from.String() == c.stunServerAddr.String(): + // Received from STUN server but it is not a STUN message return true, errNonSTUNMessage default: - // assume, this is an application data - c.log.Tracef("non-STUN/TURN packet, unhandled") + // Assume, this is an application data + c.log.Tracef("Ignoring non-STUN/TURN packet") } return false, nil @@ -445,7 +508,8 @@ func (c *Client) handleSTUNMessage(data []byte, from net.Addr) error { } if msg.Type.Class == stun.ClassIndication { - if msg.Type.Method == stun.MethodData { + switch msg.Type.Method { + case stun.MethodData: var peerAddr proto.PeerAddress if err := peerAddr.GetFrom(msg); err != nil { return err @@ -460,15 +524,41 @@ func (c *Client) handleSTUNMessage(data []byte, from net.Addr) error { return err } - c.log.Debugf("data indication received from %s", from.String()) + c.log.Tracef("Data indication received from %s", from) relayedConn := c.relayedUDPConn() if relayedConn == nil { - c.log.Debug("no relayed conn allocated") - return nil // silently discard + c.log.Debug("No relayed conn allocated") + return nil // Silently discard + } + relayedConn.HandleInbound(data, from) + case stun.MethodConnectionAttempt: + var peerAddr proto.PeerAddress + if err := peerAddr.GetFrom(msg); err != nil { + return err } - relayedConn.HandleInbound(data, from) + addr := &net.TCPAddr{ + IP: peerAddr.IP, + Port: peerAddr.Port, + } + + var cid proto.ConnectionID + if err := cid.GetFrom(msg); err != nil { + return err + } + + c.log.Debugf("Connection attempt from %s", addr) + + allocation := c.getTCPAllocation() + if allocation == nil { + c.log.Debug("No TCP allocation exists") + return nil // Silently discard + } + + allocation.HandleConnectionAttempt(addr, cid) + default: + c.log.Debug("Received unsupported STUN method") } return nil } @@ -484,8 +574,8 @@ func (c *Client) handleSTUNMessage(data []byte, from net.Addr) error { tr, ok := c.trMap.Find(trKey) if !ok { c.mutexTrMap.Unlock() - // silently discard - c.log.Debugf("no transaction for %s", msg.String()) + // Silently discard + c.log.Debugf("No transaction for %s", msg) return nil } @@ -499,7 +589,7 @@ func (c *Client) handleSTUNMessage(data []byte, from net.Addr) error { From: from, Retries: tr.Retries(), }) { - c.log.Debugf("no listener for %s", msg.String()) + c.log.Debugf("No listener for %s", msg) } return nil @@ -516,8 +606,8 @@ func (c *Client) handleChannelData(data []byte) error { relayedConn := c.relayedUDPConn() if relayedConn == nil { - c.log.Debug("no relayed conn allocated") - return nil // silently discard + c.log.Debug("No relayed conn allocated") + return nil // Silently discard } addr, ok := relayedConn.FindAddrByChannelNumber(uint16(chData.Number)) @@ -525,7 +615,7 @@ func (c *Client) handleChannelData(data []byte) error { return fmt.Errorf("%w: %d", errChannelBindNotFound, int(chData.Number)) } - c.log.Tracef("channel data received from %s (ch=%d)", addr.String(), int(chData.Number)) + c.log.Tracef("Channel data received from %s (ch=%d)", addr.String(), int(chData.Number)) relayedConn.HandleInbound(chData.Data, addr) return nil @@ -537,21 +627,21 @@ func (c *Client) onRtxTimeout(trKey string, nRtx int) { tr, ok := c.trMap.Find(trKey) if !ok { - return // already gone + return // Already gone } if nRtx == maxRtxCount { - // all retransmissions failed + // All retransmissions failed c.trMap.Delete(trKey) if !tr.WriteResult(client.TransactionResult{ Err: fmt.Errorf("%w %s", errAllRetransmissionsFailed, trKey), }) { - c.log.Debug("no listener for transaction") + c.log.Debug("No listener for transaction") } return } - c.log.Tracef("retransmitting transaction %s to %s (nRtx=%d)", + c.log.Tracef("Retransmitting transaction %s to %s (nRtx=%d)", trKey, tr.To.String(), nRtx) _, err := c.conn.WriteTo(tr.Raw, tr.To) if err != nil { @@ -559,7 +649,7 @@ func (c *Client) onRtxTimeout(trKey string, nRtx int) { if !tr.WriteResult(client.TransactionResult{ Err: fmt.Errorf("%w %s", errFailedToRetransmitTransaction, trKey), }) { - c.log.Debug("no listener for transaction") + c.log.Debug("No listener for transaction") } return } @@ -579,3 +669,17 @@ func (c *Client) relayedUDPConn() *client.UDPConn { return c.relayedConn } + +func (c *Client) setTCPAllocation(alloc *client.TCPAllocation) { + c.mutex.Lock() + defer c.mutex.Unlock() + + c.tcpAllocation = alloc +} + +func (c *Client) getTCPAllocation() *client.TCPAllocation { + c.mutex.RLock() + defer c.mutex.RUnlock() + + return c.tcpAllocation +} diff --git a/vendor/github.com/pion/turn/v2/codecov.yml b/vendor/github.com/pion/turn/v2/codecov.yml index 085200a48..263e4d45c 100644 --- a/vendor/github.com/pion/turn/v2/codecov.yml +++ b/vendor/github.com/pion/turn/v2/codecov.yml @@ -3,6 +3,8 @@ # # It is automatically copied from https://github.com/pion/.goassets repository. # +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT coverage: status: diff --git a/vendor/github.com/pion/turn/v2/errors.go b/vendor/github.com/pion/turn/v2/errors.go index 12d5e0e86..50065e27b 100644 --- a/vendor/github.com/pion/turn/v2/errors.go +++ b/vendor/github.com/pion/turn/v2/errors.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package turn import "errors" diff --git a/vendor/github.com/pion/turn/v2/internal/allocation/allocation.go b/vendor/github.com/pion/turn/v2/internal/allocation/allocation.go index 7a3ce1ddf..9bfd91053 100644 --- a/vendor/github.com/pion/turn/v2/internal/allocation/allocation.go +++ b/vendor/github.com/pion/turn/v2/internal/allocation/allocation.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + // Package allocation contains all CRUD operations for allocations package allocation @@ -34,23 +37,13 @@ type Allocation struct { closed chan interface{} log logging.LeveledLogger - // some clients (Firefox or others using resiprocate's nICE lib) may retry allocation + // Some clients (Firefox or others using resiprocate's nICE lib) may retry allocation // with same 5 tuple when received 413, for compatible with these clients, // cache for response lost and client retry to implement 'stateless stack approach' - // https://datatracker.ietf.org/doc/html/rfc5766#section-6.2 + // See: https://datatracker.ietf.org/doc/html/rfc5766#section-6.2 responseCache atomic.Value // *allocationResponse } -func addr2IPFingerprint(addr net.Addr) string { - switch a := addr.(type) { - case *net.UDPAddr: - return a.IP.String() - case *net.TCPAddr: // Do we really need this case? - return a.IP.String() - } - return "" // should never happen -} - // NewAllocation creates a new instance of NewAllocation. func NewAllocation(turnSocket net.PacketConn, fiveTuple *FiveTuple, log logging.LeveledLogger) *Allocation { return &Allocation{ @@ -67,12 +60,12 @@ func (a *Allocation) GetPermission(addr net.Addr) *Permission { a.permissionsLock.RLock() defer a.permissionsLock.RUnlock() - return a.permissions[addr2IPFingerprint(addr)] + return a.permissions[ipnet.FingerprintAddr(addr)] } // AddPermission adds a new permission to the allocation func (a *Allocation) AddPermission(p *Permission) { - fingerprint := addr2IPFingerprint(p.Addr) + fingerprint := ipnet.FingerprintAddr(p.Addr) a.permissionsLock.RLock() existedPermission, ok := a.permissions[fingerprint] @@ -95,7 +88,7 @@ func (a *Allocation) AddPermission(p *Permission) { func (a *Allocation) RemovePermission(addr net.Addr) { a.permissionsLock.Lock() defer a.permissionsLock.Unlock() - delete(a.permissions, addr2IPFingerprint(addr)) + delete(a.permissions, ipnet.FingerprintAddr(addr)) } // AddChannelBind adds a new ChannelBind to the allocation, it also updates the @@ -250,10 +243,10 @@ func (a *Allocation) packetHandler(m *Manager) { return } - a.log.Debugf("relay socket %s received %d bytes from %s", - a.RelaySocket.LocalAddr().String(), + a.log.Debugf("Relay socket %s received %d bytes from %s", + a.RelaySocket.LocalAddr(), n, - srcAddr.String()) + srcAddr) if channel := a.GetChannelByAddr(srcAddr); channel != nil { channelData := &proto.ChannelData{ @@ -280,14 +273,14 @@ func (a *Allocation) packetHandler(m *Manager) { a.log.Errorf("Failed to send DataIndication from allocation %v %v", srcAddr, err) return } - a.log.Debugf("relaying message from %s to client at %s", - srcAddr.String(), - a.fiveTuple.SrcAddr.String()) + a.log.Debugf("Relaying message from %s to client at %s", + srcAddr, + a.fiveTuple.SrcAddr) if _, err = a.TurnSocket.WriteTo(msg.Raw, a.fiveTuple.SrcAddr); err != nil { a.log.Errorf("Failed to send DataIndication from allocation %v %v", srcAddr, err) } } else { - a.log.Infof("No Permission or Channel exists for %v on allocation %v", srcAddr, a.RelayAddr.String()) + a.log.Infof("No Permission or Channel exists for %v on allocation %v", srcAddr, a.RelayAddr) } } } diff --git a/vendor/github.com/pion/turn/v2/internal/allocation/allocation_manager.go b/vendor/github.com/pion/turn/v2/internal/allocation/allocation_manager.go index 5e924ac64..2b7659212 100644 --- a/vendor/github.com/pion/turn/v2/internal/allocation/allocation_manager.go +++ b/vendor/github.com/pion/turn/v2/internal/allocation/allocation_manager.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package allocation import ( @@ -27,7 +30,7 @@ type Manager struct { lock sync.RWMutex log logging.LeveledLogger - allocations map[string]*Allocation + allocations map[FiveTupleFingerprint]*Allocation reservations []*reservation allocatePacketConn func(network string, requestedPort int) (net.PacketConn, net.Addr, error) @@ -48,7 +51,7 @@ func NewManager(config ManagerConfig) (*Manager, error) { return &Manager{ log: config.LeveledLogger, - allocations: make(map[string]*Allocation, 64), + allocations: make(map[FiveTupleFingerprint]*Allocation, 64), allocatePacketConn: config.AllocatePacketConn, allocateConn: config.AllocateConn, permissionHandler: config.PermissionHandler, @@ -110,7 +113,7 @@ func (m *Manager) CreateAllocation(fiveTuple *FiveTuple, turnSocket net.PacketCo a.RelaySocket = conn a.RelayAddr = relayAddr - m.log.Debugf("listening on relay addr: %s", a.RelayAddr.String()) + m.log.Debugf("Listening on relay address: %s", a.RelayAddr) a.lifetimeTimer = time.AfterFunc(lifetime, func() { m.DeleteAllocation(a.fiveTuple) @@ -202,7 +205,7 @@ func (m *Manager) GetRandomEvenPort() (int, error) { // GrantPermission handles permission requests by calling the permission handler callback // associated with the TURN server listener socket func (m *Manager) GrantPermission(sourceAddr net.Addr, peerIP net.IP) error { - // no permission handler: open + // No permission handler: open if m.permissionHandler == nil { return nil } diff --git a/vendor/github.com/pion/turn/v2/internal/allocation/channel_bind.go b/vendor/github.com/pion/turn/v2/internal/allocation/channel_bind.go index 6216369d7..d38de3514 100644 --- a/vendor/github.com/pion/turn/v2/internal/allocation/channel_bind.go +++ b/vendor/github.com/pion/turn/v2/internal/allocation/channel_bind.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package allocation import ( @@ -9,7 +12,7 @@ import ( ) // ChannelBind represents a TURN Channel -// https://tools.ietf.org/html/rfc5766#section-2.5 +// See: https://tools.ietf.org/html/rfc5766#section-2.5 type ChannelBind struct { Peer net.Addr Number proto.ChannelNumber diff --git a/vendor/github.com/pion/turn/v2/internal/allocation/errors.go b/vendor/github.com/pion/turn/v2/internal/allocation/errors.go index b9677e11a..584073c93 100644 --- a/vendor/github.com/pion/turn/v2/internal/allocation/errors.go +++ b/vendor/github.com/pion/turn/v2/internal/allocation/errors.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package allocation import "errors" diff --git a/vendor/github.com/pion/turn/v2/internal/allocation/five_tuple.go b/vendor/github.com/pion/turn/v2/internal/allocation/five_tuple.go index 1f2b3b5b6..6d812caf7 100644 --- a/vendor/github.com/pion/turn/v2/internal/allocation/five_tuple.go +++ b/vendor/github.com/pion/turn/v2/internal/allocation/five_tuple.go @@ -1,7 +1,9 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package allocation import ( - "fmt" "net" ) @@ -30,7 +32,32 @@ func (f *FiveTuple) Equal(b *FiveTuple) bool { return f.Fingerprint() == b.Fingerprint() } -// Fingerprint is the identity of a FiveTuple -func (f *FiveTuple) Fingerprint() string { - return fmt.Sprintf("%d_%s_%s", f.Protocol, f.SrcAddr.String(), f.DstAddr.String()) +// FiveTupleFingerprint is a comparable representation of a FiveTuple +type FiveTupleFingerprint struct { + srcIP, dstIP [16]byte + srcPort, dstPort uint16 + protocol Protocol +} + +// Fingerprint is the identity of a FiveTuple +func (f *FiveTuple) Fingerprint() (fp FiveTupleFingerprint) { + srcIP, srcPort := netAddrIPAndPort(f.SrcAddr) + copy(fp.srcIP[:], srcIP) + fp.srcPort = srcPort + dstIP, dstPort := netAddrIPAndPort(f.DstAddr) + copy(fp.dstIP[:], dstIP) + fp.dstPort = dstPort + fp.protocol = f.Protocol + return +} + +func netAddrIPAndPort(addr net.Addr) (net.IP, uint16) { + switch a := addr.(type) { + case *net.UDPAddr: + return a.IP.To16(), uint16(a.Port) + case *net.TCPAddr: + return a.IP.To16(), uint16(a.Port) + default: + return nil, 0 + } } diff --git a/vendor/github.com/pion/turn/v2/internal/allocation/permission.go b/vendor/github.com/pion/turn/v2/internal/allocation/permission.go index 03538eb5b..a774f2ceb 100644 --- a/vendor/github.com/pion/turn/v2/internal/allocation/permission.go +++ b/vendor/github.com/pion/turn/v2/internal/allocation/permission.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package allocation import ( @@ -11,7 +14,7 @@ const permissionTimeout = time.Duration(5) * time.Minute // Permission represents a TURN permission. TURN permissions mimic the address-restricted // filtering mechanism of NATs that comply with [RFC4787]. -// https://tools.ietf.org/html/rfc5766#section-2.3 +// See: https://tools.ietf.org/html/rfc5766#section-2.3 type Permission struct { Addr net.Addr allocation *Allocation diff --git a/vendor/github.com/pion/turn/v2/internal/client/allocation.go b/vendor/github.com/pion/turn/v2/internal/client/allocation.go new file mode 100644 index 000000000..f61452b71 --- /dev/null +++ b/vendor/github.com/pion/turn/v2/internal/client/allocation.go @@ -0,0 +1,189 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package client + +import ( + "errors" + "fmt" + "net" + "sync" + "time" + + "github.com/pion/logging" + "github.com/pion/stun" + "github.com/pion/transport/v2" + "github.com/pion/turn/v2/internal/proto" +) + +// AllocationConfig is a set of configuration params use by NewUDPConn and NewTCPAllocation +type AllocationConfig struct { + Client Client + RelayedAddr net.Addr + ServerAddr net.Addr + Integrity stun.MessageIntegrity + Nonce stun.Nonce + Username stun.Username + Realm stun.Realm + Lifetime time.Duration + Net transport.Net + Log logging.LeveledLogger +} + +type allocation struct { + client Client // Read-only + relayedAddr net.Addr // Read-only + serverAddr net.Addr // Read-only + permMap *permissionMap // Thread-safe + integrity stun.MessageIntegrity // Read-only + username stun.Username // Read-only + realm stun.Realm // Read-only + _nonce stun.Nonce // Needs mutex x + _lifetime time.Duration // Needs mutex x + net transport.Net // Thread-safe + refreshAllocTimer *PeriodicTimer // Thread-safe + refreshPermsTimer *PeriodicTimer // Thread-safe + readTimer *time.Timer // Thread-safe + mutex sync.RWMutex // Thread-safe + log logging.LeveledLogger // Read-only +} + +func (a *allocation) setNonceFromMsg(msg *stun.Message) { + // Update nonce + var nonce stun.Nonce + if err := nonce.GetFrom(msg); err == nil { + a.setNonce(nonce) + a.log.Debug("Refresh allocation: 438, got new nonce.") + } else { + a.log.Warn("Refresh allocation: 438 but no nonce.") + } +} + +func (a *allocation) refreshAllocation(lifetime time.Duration, dontWait bool) error { + msg, err := stun.Build( + stun.TransactionID, + stun.NewType(stun.MethodRefresh, stun.ClassRequest), + proto.Lifetime{Duration: lifetime}, + a.username, + a.realm, + a.nonce(), + a.integrity, + stun.Fingerprint, + ) + if err != nil { + return fmt.Errorf("%w: %s", errFailedToBuildRefreshRequest, err.Error()) + } + + a.log.Debugf("Send refresh request (dontWait=%v)", dontWait) + trRes, err := a.client.PerformTransaction(msg, a.serverAddr, dontWait) + if err != nil { + return fmt.Errorf("%w: %s", errFailedToRefreshAllocation, err.Error()) + } + + if dontWait { + a.log.Debug("Refresh request sent") + return nil + } + + a.log.Debug("Refresh request sent, and waiting response") + + res := trRes.Msg + if res.Type.Class == stun.ClassErrorResponse { + var code stun.ErrorCodeAttribute + if err = code.GetFrom(res); err == nil { + if code.Code == stun.CodeStaleNonce { + a.setNonceFromMsg(res) + return errTryAgain + } + return err + } + return fmt.Errorf("%s", res.Type) //nolint:goerr113 + } + + // Getting lifetime from response + var updatedLifetime proto.Lifetime + if err := updatedLifetime.GetFrom(res); err != nil { + return fmt.Errorf("%w: %s", errFailedToGetLifetime, err.Error()) + } + + a.setLifetime(updatedLifetime.Duration) + a.log.Debugf("Updated lifetime: %d seconds", int(a.lifetime().Seconds())) + return nil +} + +func (a *allocation) refreshPermissions() error { + addrs := a.permMap.addrs() + if len(addrs) == 0 { + a.log.Debug("No permission to refresh") + return nil + } + if err := a.CreatePermissions(addrs...); err != nil { + if errors.Is(err, errTryAgain) { + return errTryAgain + } + a.log.Errorf("Fail to refresh permissions: %s", err) + return err + } + a.log.Debug("Refresh permissions successful") + return nil +} + +func (a *allocation) onRefreshTimers(id int) { + a.log.Debugf("Refresh timer %d expired", id) + switch id { + case timerIDRefreshAlloc: + var err error + lifetime := a.lifetime() + // Limit the max retries on errTryAgain to 3 + // when stale nonce returns, sencond retry should succeed + for i := 0; i < maxRetryAttempts; i++ { + err = a.refreshAllocation(lifetime, false) + if !errors.Is(err, errTryAgain) { + break + } + } + if err != nil { + a.log.Warnf("Failed to refresh allocation: %s", err) + } + case timerIDRefreshPerms: + var err error + for i := 0; i < maxRetryAttempts; i++ { + err = a.refreshPermissions() + if !errors.Is(err, errTryAgain) { + break + } + } + if err != nil { + a.log.Warnf("Failed to refresh permissions: %s", err) + } + } +} + +func (a *allocation) nonce() stun.Nonce { + a.mutex.RLock() + defer a.mutex.RUnlock() + + return a._nonce +} + +func (a *allocation) setNonce(nonce stun.Nonce) { + a.mutex.Lock() + defer a.mutex.Unlock() + + a.log.Debugf("Set new nonce with %d bytes", len(nonce)) + a._nonce = nonce +} + +func (a *allocation) lifetime() time.Duration { + a.mutex.RLock() + defer a.mutex.RUnlock() + + return a._lifetime +} + +func (a *allocation) setLifetime(lifetime time.Duration) { + a.mutex.Lock() + defer a.mutex.Unlock() + + a._lifetime = lifetime +} diff --git a/vendor/github.com/pion/turn/v2/internal/client/binding.go b/vendor/github.com/pion/turn/v2/internal/client/binding.go index f4d6fa2b4..a0217476e 100644 --- a/vendor/github.com/pion/turn/v2/internal/client/binding.go +++ b/vendor/github.com/pion/turn/v2/internal/client/binding.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package client import ( @@ -27,13 +30,13 @@ const ( ) type binding struct { - number uint16 // read-only - st bindingState // thread-safe (atomic op) - addr net.Addr // read-only - mgr *bindingManager // read-only - muBind sync.Mutex // thread-safe, for ChannelBind ops - _refreshedAt time.Time // protected by mutex - mutex sync.RWMutex // thread-safe + number uint16 // Read-only + st bindingState // Thread-safe (atomic op) + addr net.Addr // Read-only + mgr *bindingManager // Read-only + muBind sync.Mutex // Thread-safe, for ChannelBind ops + _refreshedAt time.Time // Protected by mutex + mutex sync.RWMutex // Thread-safe } func (b *binding) setState(state bindingState) { diff --git a/vendor/github.com/pion/turn/v2/internal/client/client.go b/vendor/github.com/pion/turn/v2/internal/client/client.go new file mode 100644 index 000000000..7c22858f1 --- /dev/null +++ b/vendor/github.com/pion/turn/v2/internal/client/client.go @@ -0,0 +1,18 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package client implements the API for a TURN client +package client + +import ( + "net" + + "github.com/pion/stun" +) + +// Client is an interface for the public turn.Client in order to break cyclic dependencies +type Client interface { + WriteTo(data []byte, to net.Addr) (int, error) + PerformTransaction(msg *stun.Message, to net.Addr, dontWait bool) (TransactionResult, error) + OnDeallocated(relayedAddr net.Addr) +} diff --git a/vendor/github.com/pion/turn/v2/internal/client/errors.go b/vendor/github.com/pion/turn/v2/internal/client/errors.go index 7fc816fd0..ff40d2e8a 100644 --- a/vendor/github.com/pion/turn/v2/internal/client/errors.go +++ b/vendor/github.com/pion/turn/v2/internal/client/errors.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package client import ( @@ -8,7 +11,8 @@ var ( errFake = errors.New("fake error") errTryAgain = errors.New("try again") errClosed = errors.New("use of closed network connection") - errUDPAddrCast = errors.New("addr is not a net.UDPAddr") + errTCPAddrCast = errors.New("addr is not a TCP address") + errUDPAddrCast = errors.New("addr is not a UDP address") errAlreadyClosed = errors.New("already closed") errDoubleLock = errors.New("try-lock is already locked") errTransactionClosed = errors.New("transaction closed") @@ -16,6 +20,8 @@ var ( errFailedToBuildRefreshRequest = errors.New("failed to build refresh request") errFailedToRefreshAllocation = errors.New("failed to refresh allocation") errFailedToGetLifetime = errors.New("failed to get lifetime from refresh response") + errInvalidTURNAddress = errors.New("invalid TURN server address") + errUnexpectedSTUNRequestMessage = errors.New("unexpected STUN request message") ) type timeoutError struct { diff --git a/vendor/github.com/pion/turn/v2/internal/client/periodic_timer.go b/vendor/github.com/pion/turn/v2/internal/client/periodic_timer.go index fcd567870..5660bc45e 100644 --- a/vendor/github.com/pion/turn/v2/internal/client/periodic_timer.go +++ b/vendor/github.com/pion/turn/v2/internal/client/periodic_timer.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package client import ( @@ -31,7 +34,7 @@ func (t *PeriodicTimer) Start() bool { t.mutex.Lock() defer t.mutex.Unlock() - // this is a noop if the timer is always running + // This is a noop if the timer is always running if t.stopFunc != nil { return false } diff --git a/vendor/github.com/pion/turn/v2/internal/client/permission.go b/vendor/github.com/pion/turn/v2/internal/client/permission.go index 5546a22e2..f5df0ccf8 100644 --- a/vendor/github.com/pion/turn/v2/internal/client/permission.go +++ b/vendor/github.com/pion/turn/v2/internal/client/permission.go @@ -1,9 +1,14 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package client import ( "net" "sync" "sync/atomic" + + "github.com/pion/turn/v2/internal/ipnet" ) type permState int32 @@ -14,8 +19,9 @@ const ( ) type permission struct { - st permState // thread-safe (atomic op) - mutex sync.RWMutex // thread-safe + addr net.Addr + st permState // Thread-safe (atomic op) + mutex sync.RWMutex // Thread-safe } func (p *permission) setState(state permState) { @@ -35,39 +41,22 @@ type permissionMap struct { func (m *permissionMap) insert(addr net.Addr, p *permission) bool { m.mutex.Lock() defer m.mutex.Unlock() - - udpAddr, ok := addr.(*net.UDPAddr) - if !ok { - return false - } - - m.permMap[udpAddr.IP.String()] = p + p.addr = addr + m.permMap[ipnet.FingerprintAddr(addr)] = p return true } func (m *permissionMap) find(addr net.Addr) (*permission, bool) { m.mutex.RLock() defer m.mutex.RUnlock() - - udpAddr, ok := addr.(*net.UDPAddr) - if !ok { - return nil, false - } - - p, ok := m.permMap[udpAddr.IP.String()] + p, ok := m.permMap[ipnet.FingerprintAddr(addr)] return p, ok } func (m *permissionMap) delete(addr net.Addr) { m.mutex.Lock() defer m.mutex.Unlock() - - udpAddr, ok := addr.(*net.UDPAddr) - if !ok { - return - } - - delete(m.permMap, udpAddr.IP.String()) + delete(m.permMap, ipnet.FingerprintAddr(addr)) } func (m *permissionMap) addrs() []net.Addr { @@ -75,10 +64,8 @@ func (m *permissionMap) addrs() []net.Addr { defer m.mutex.RUnlock() addrs := []net.Addr{} - for k := range m.permMap { - addrs = append(addrs, &net.UDPAddr{ - IP: net.ParseIP(k), - }) + for _, p := range m.permMap { + addrs = append(addrs, p.addr) } return addrs } diff --git a/vendor/github.com/pion/turn/v2/internal/client/tcp_alloc.go b/vendor/github.com/pion/turn/v2/internal/client/tcp_alloc.go new file mode 100644 index 000000000..3d6838b31 --- /dev/null +++ b/vendor/github.com/pion/turn/v2/internal/client/tcp_alloc.go @@ -0,0 +1,371 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package client + +import ( + "encoding/binary" + "errors" + "fmt" + "math" + "net" + "time" + + "github.com/pion/stun" + "github.com/pion/transport/v2" + "github.com/pion/turn/v2/internal/proto" +) + +var ( + _ transport.TCPListener = (*TCPAllocation)(nil) // Includes type check for net.Listener + _ transport.Dialer = (*TCPAllocation)(nil) +) + +func noDeadline() time.Time { + return time.Time{} +} + +// TCPAllocation is an active TCP allocation on the TURN server +// as specified by RFC 6062. +// The allocation can be used to Dial/Accept relayed outgoing/incoming TCP connections. +type TCPAllocation struct { + connAttemptCh chan *connectionAttempt + acceptTimer *time.Timer + allocation +} + +// NewTCPAllocation creates a new instance of TCPConn +func NewTCPAllocation(config *AllocationConfig) *TCPAllocation { + a := &TCPAllocation{ + connAttemptCh: make(chan *connectionAttempt, 10), + acceptTimer: time.NewTimer(time.Duration(math.MaxInt64)), + allocation: allocation{ + client: config.Client, + relayedAddr: config.RelayedAddr, + serverAddr: config.ServerAddr, + username: config.Username, + realm: config.Realm, + permMap: newPermissionMap(), + integrity: config.Integrity, + _nonce: config.Nonce, + _lifetime: config.Lifetime, + net: config.Net, + log: config.Log, + }, + } + + a.log.Debugf("Initial lifetime: %d seconds", int(a.lifetime().Seconds())) + + a.refreshAllocTimer = NewPeriodicTimer( + timerIDRefreshAlloc, + a.onRefreshTimers, + a.lifetime()/2, + ) + + a.refreshPermsTimer = NewPeriodicTimer( + timerIDRefreshPerms, + a.onRefreshTimers, + permRefreshInterval, + ) + + if a.refreshAllocTimer.Start() { + a.log.Debug("Started refreshAllocTimer") + } + if a.refreshPermsTimer.Start() { + a.log.Debug("Started refreshPermsTimer") + } + + return a +} + +// Connect sends a Connect request to the turn server and returns a chosen connection ID +func (a *TCPAllocation) Connect(peer net.Addr) (proto.ConnectionID, error) { + setters := []stun.Setter{ + stun.TransactionID, + stun.NewType(stun.MethodConnect, stun.ClassRequest), + addr2PeerAddress(peer), + a.username, + a.realm, + a.nonce(), + a.integrity, + stun.Fingerprint, + } + + msg, err := stun.Build(setters...) + if err != nil { + return 0, err + } + + a.log.Debugf("Send connect request (peer=%v)", peer) + trRes, err := a.client.PerformTransaction(msg, a.serverAddr, false) + if err != nil { + return 0, err + } + + res := trRes.Msg + + if res.Type.Class == stun.ClassErrorResponse { + var code stun.ErrorCodeAttribute + if err = code.GetFrom(res); err == nil { + return 0, fmt.Errorf("%s (error %s)", res.Type, code) //nolint:goerr113 + } + + return 0, fmt.Errorf("%s", res.Type) //nolint:goerr113 + } + + var cid proto.ConnectionID + if err := cid.GetFrom(res); err != nil { + return 0, err + } + + a.log.Debugf("Connect request successful (cid=%v)", cid) + return cid, nil +} + +// Dial connects to the address on the named network. +func (a *TCPAllocation) Dial(network, rAddrStr string) (net.Conn, error) { + rAddr, err := net.ResolveTCPAddr(network, rAddrStr) + if err != nil { + return nil, err + } + + return a.DialTCP(network, nil, rAddr) +} + +// DialWithConn connects to the address on the named network with an already existing connection. +// The provided connection must be an already connected TCP connection to the TURN server. +func (a *TCPAllocation) DialWithConn(conn net.Conn, network, rAddrStr string) (*TCPConn, error) { + rAddr, err := net.ResolveTCPAddr(network, rAddrStr) + if err != nil { + return nil, err + } + + return a.DialTCPWithConn(conn, network, rAddr) +} + +// DialTCP acts like Dial for TCP networks. +func (a *TCPAllocation) DialTCP(network string, lAddr, rAddr *net.TCPAddr) (*TCPConn, error) { + var rAddrServer *net.TCPAddr + if addr, ok := a.serverAddr.(*net.TCPAddr); ok { + rAddrServer = &net.TCPAddr{ + IP: addr.IP, + Port: addr.Port, + } + } else { + return nil, errInvalidTURNAddress + } + + conn, err := a.net.DialTCP(network, lAddr, rAddrServer) + if err != nil { + return nil, err + } + + dataConn, err := a.DialTCPWithConn(conn, network, rAddr) + if err != nil { + conn.Close() //nolint:errcheck,gosec + } + + return dataConn, err +} + +// DialTCPWithConn acts like DialWithConn for TCP networks. +func (a *TCPAllocation) DialTCPWithConn(conn net.Conn, _ string, rAddr *net.TCPAddr) (*TCPConn, error) { + var err error + + // Check if we have a permission for the destination IP addr + perm, ok := a.permMap.find(rAddr) + if !ok { + perm = &permission{} + a.permMap.insert(rAddr, perm) + } + + for i := 0; i < maxRetryAttempts; i++ { + if err = a.createPermission(perm, rAddr); !errors.Is(err, errTryAgain) { + break + } + } + if err != nil { + return nil, err + } + + // Send connect request if haven't done so. + cid, err := a.Connect(rAddr) + if err != nil { + return nil, err + } + + tcpConn, ok := conn.(transport.TCPConn) + if !ok { + return nil, errTCPAddrCast + } + + dataConn := &TCPConn{ + TCPConn: tcpConn, + ConnectionID: cid, + remoteAddress: rAddr, + allocation: a, + } + + if err := a.BindConnection(dataConn, cid); err != nil { + return nil, fmt.Errorf("failed to bind connection: %w", err) + } + + return dataConn, nil +} + +// BindConnection associates the provided connection +func (a *TCPAllocation) BindConnection(dataConn *TCPConn, cid proto.ConnectionID) error { + msg, err := stun.Build( + stun.TransactionID, + stun.NewType(stun.MethodConnectionBind, stun.ClassRequest), + cid, + a.username, + a.realm, + a.nonce(), + a.integrity, + stun.Fingerprint, + ) + if err != nil { + return err + } + + a.log.Debugf("Send connectionBind request (cid=%v)", cid) + + _, err = dataConn.Write(msg.Raw) + if err != nil { + return err + } + + // Read exactly one STUN message, any data after belongs to the user + b := make([]byte, stunHeaderSize) + n, err := dataConn.Read(b) + if n != stunHeaderSize { + return errIncompleteTURNFrame + } else if err != nil { + return err + } + + if !stun.IsMessage(b) { + return errInvalidTURNFrame + } + + datagramSize := binary.BigEndian.Uint16(b[2:4]) + stunHeaderSize + raw := make([]byte, datagramSize) + copy(raw, b) + _, err = dataConn.Read(raw[stunHeaderSize:]) + if err != nil { + return err + } + res := &stun.Message{Raw: raw} + if err = res.Decode(); err != nil { + return fmt.Errorf("failed to decode STUN message: %w", err) + } + + switch res.Type.Class { + case stun.ClassErrorResponse: + var code stun.ErrorCodeAttribute + if err = code.GetFrom(res); err == nil { + return fmt.Errorf("%s (error %s)", res.Type, code) //nolint:goerr113 + } + return fmt.Errorf("%s", res.Type) //nolint:goerr113 + case stun.ClassSuccessResponse: + a.log.Debug("Successful connectionBind request") + return nil + default: + return fmt.Errorf("%w: %s", errUnexpectedSTUNRequestMessage, res.String()) + } +} + +// Accept waits for and returns the next connection to the listener. +func (a *TCPAllocation) Accept() (net.Conn, error) { + return a.AcceptTCP() +} + +// AcceptTCP accepts the next incoming call and returns the new connection. +func (a *TCPAllocation) AcceptTCP() (transport.TCPConn, error) { + addr, err := net.ResolveTCPAddr("tcp4", a.serverAddr.String()) + if err != nil { + return nil, err + } + + tcpConn, err := a.net.DialTCP("tcp", nil, addr) + if err != nil { + return nil, err + } + + dataConn, err := a.AcceptTCPWithConn(tcpConn) + if err != nil { + tcpConn.Close() //nolint:errcheck,gosec + } + + return dataConn, err +} + +// AcceptTCPWithConn accepts the next incoming call and returns the new connection. +func (a *TCPAllocation) AcceptTCPWithConn(conn net.Conn) (*TCPConn, error) { + select { + case attempt := <-a.connAttemptCh: + + tcpConn, ok := conn.(transport.TCPConn) + if !ok { + return nil, errTCPAddrCast + } + + dataConn := &TCPConn{ + TCPConn: tcpConn, + ConnectionID: attempt.cid, + remoteAddress: attempt.from, + allocation: a, + } + + if err := a.BindConnection(dataConn, attempt.cid); err != nil { + return nil, fmt.Errorf("failed to bind connection: %w", err) + } + + return dataConn, nil + case <-a.acceptTimer.C: + return nil, &net.OpError{ + Op: "accept", + Net: a.Addr().Network(), + Addr: a.Addr(), + Err: newTimeoutError("i/o timeout"), + } + } +} + +// SetDeadline sets the deadline associated with the listener. A zero time value disables the deadline. +func (a *TCPAllocation) SetDeadline(t time.Time) error { + var d time.Duration + if t == noDeadline() { + d = time.Duration(math.MaxInt64) + } else { + d = time.Until(t) + } + a.acceptTimer.Reset(d) + return nil +} + +// Close releases the allocation +// Any blocked Accept operations will be unblocked and return errors. +// Any opened connection via Dial/Accept will be closed. +func (a *TCPAllocation) Close() error { + a.refreshAllocTimer.Stop() + a.refreshPermsTimer.Stop() + + a.client.OnDeallocated(a.relayedAddr) + return a.refreshAllocation(0, true /* dontWait=true */) +} + +// Addr returns the relayed address of the allocation +func (a *TCPAllocation) Addr() net.Addr { + return a.relayedAddr +} + +// HandleConnectionAttempt is called by the TURN client +// when it receives a ConnectionAttempt indication. +func (a *TCPAllocation) HandleConnectionAttempt(from *net.TCPAddr, cid proto.ConnectionID) { + a.connAttemptCh <- &connectionAttempt{ + from: from, + cid: cid, + } +} diff --git a/vendor/github.com/pion/turn/v2/internal/client/tcp_conn.go b/vendor/github.com/pion/turn/v2/internal/client/tcp_conn.go new file mode 100644 index 000000000..06d50eb26 --- /dev/null +++ b/vendor/github.com/pion/turn/v2/internal/client/tcp_conn.go @@ -0,0 +1,49 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package client + +import ( + "errors" + "net" + + "github.com/pion/transport/v2" + "github.com/pion/turn/v2/internal/proto" +) + +var ( + errInvalidTURNFrame = errors.New("data is not a valid TURN frame, no STUN or ChannelData found") + errIncompleteTURNFrame = errors.New("data contains incomplete STUN or TURN frame") +) + +const ( + stunHeaderSize = 20 +) + +var _ transport.TCPConn = (*TCPConn)(nil) // Includes type check for net.Conn + +// TCPConn wraps a transport.TCPConn and returns the allocations relayed +// transport address in response to TCPConn.LocalAddress() +type TCPConn struct { + transport.TCPConn + remoteAddress *net.TCPAddr + allocation *TCPAllocation + ConnectionID proto.ConnectionID +} + +type connectionAttempt struct { + from *net.TCPAddr + cid proto.ConnectionID +} + +// LocalAddr returns the local network address. +// The Addr returned is shared by all invocations of LocalAddr, so do not modify it. +func (c *TCPConn) LocalAddr() net.Addr { + return c.allocation.Addr() +} + +// RemoteAddr returns the remote network address. +// The Addr returned is shared by all invocations of RemoteAddr, so do not modify it. +func (c *TCPConn) RemoteAddr() net.Addr { + return c.remoteAddress +} diff --git a/vendor/github.com/pion/turn/v2/internal/client/transaction.go b/vendor/github.com/pion/turn/v2/internal/client/transaction.go index 54024b447..e44755324 100644 --- a/vendor/github.com/pion/turn/v2/internal/client/transaction.go +++ b/vendor/github.com/pion/turn/v2/internal/client/transaction.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package client import ( @@ -26,18 +29,18 @@ type TransactionConfig struct { Raw []byte To net.Addr Interval time.Duration - IgnoreResult bool // true to throw away the result of this transaction (it will not be readable using WaitForResult) + IgnoreResult bool // True to throw away the result of this transaction (it will not be readable using WaitForResult) } // Transaction represents a transaction type Transaction struct { - Key string // read-only - Raw []byte // read-only - To net.Addr // read-only - nRtx int // modified only by the timer thread - interval time.Duration // modified only by the timer thread - timer *time.Timer // thread-safe, set only by the creator, and stopper - resultCh chan TransactionResult // thread-safe + Key string // Read-only + Raw []byte // Read-only + To net.Addr // Read-only + nRtx int // Modified only by the timer thread + interval time.Duration // Modified only by the timer thread + timer *time.Timer // Thread-safe, set only by the creator, and stopper + resultCh chan TransactionResult // Thread-safe mutex sync.RWMutex } @@ -49,11 +52,11 @@ func NewTransaction(config *TransactionConfig) *Transaction { } return &Transaction{ - Key: config.Key, // read-only - Raw: config.Raw, // read-only - To: config.To, // read-only - interval: config.Interval, // modified only by the timer thread - resultCh: resultCh, // thread-safe + Key: config.Key, // Read-only + Raw: config.Raw, // Read-only + To: config.To, // Read-only + interval: config.Interval, // Modified only by the timer thread + resultCh: resultCh, // Thread-safe } } diff --git a/vendor/github.com/pion/turn/v2/internal/client/trylock.go b/vendor/github.com/pion/turn/v2/internal/client/trylock.go index 2d11a2d3c..6bfe6ff31 100644 --- a/vendor/github.com/pion/turn/v2/internal/client/trylock.go +++ b/vendor/github.com/pion/turn/v2/internal/client/trylock.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package client import ( diff --git a/vendor/github.com/pion/turn/v2/internal/client/conn.go b/vendor/github.com/pion/turn/v2/internal/client/udp_conn.go similarity index 56% rename from vendor/github.com/pion/turn/v2/internal/client/conn.go rename to vendor/github.com/pion/turn/v2/internal/client/udp_conn.go index 8aeb742c3..f73bf5b17 100644 --- a/vendor/github.com/pion/turn/v2/internal/client/conn.go +++ b/vendor/github.com/pion/turn/v2/internal/client/udp_conn.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + // Package client implements the API for a TURN client package client @@ -7,10 +10,8 @@ import ( "io" "math" "net" - "sync" "time" - "github.com/pion/logging" "github.com/pion/stun" "github.com/pion/turn/v2/internal/proto" ) @@ -26,71 +27,43 @@ const ( timerIDRefreshPerms ) -func noDeadline() time.Time { - return time.Time{} -} - type inboundData struct { data []byte from net.Addr } -// UDPConnObserver is an interface to UDPConn observer -type UDPConnObserver interface { - TURNServerAddr() net.Addr - Username() stun.Username - Realm() stun.Realm - WriteTo(data []byte, to net.Addr) (int, error) - PerformTransaction(msg *stun.Message, to net.Addr, dontWait bool) (TransactionResult, error) - OnDeallocated(relayedAddr net.Addr) -} - -// UDPConnConfig is a set of configuration params use by NewUDPConn -type UDPConnConfig struct { - Observer UDPConnObserver - RelayedAddr net.Addr - Integrity stun.MessageIntegrity - Nonce stun.Nonce - Lifetime time.Duration - Log logging.LeveledLogger -} - // UDPConn is the implementation of the Conn and PacketConn interfaces for UDP network connections. -// comatible with net.PacketConn and net.Conn +// compatible with net.PacketConn and net.Conn type UDPConn struct { - obs UDPConnObserver // read-only - relayedAddr net.Addr // read-only - permMap *permissionMap // thread-safe - bindingMgr *bindingManager // thread-safe - integrity stun.MessageIntegrity // read-only - _nonce stun.Nonce // needs mutex x - _lifetime time.Duration // needs mutex x - readCh chan *inboundData // thread-safe - closeCh chan struct{} // thread-safe - readTimer *time.Timer // thread-safe - refreshAllocTimer *PeriodicTimer // thread-safe - refreshPermsTimer *PeriodicTimer // thread-safe - mutex sync.RWMutex // thread-safe - log logging.LeveledLogger // read-only + bindingMgr *bindingManager // Thread-safe + readCh chan *inboundData // Thread-safe + closeCh chan struct{} // Thread-safe + allocation } // NewUDPConn creates a new instance of UDPConn -func NewUDPConn(config *UDPConnConfig) *UDPConn { +func NewUDPConn(config *AllocationConfig) *UDPConn { c := &UDPConn{ - obs: config.Observer, - relayedAddr: config.RelayedAddr, - permMap: newPermissionMap(), - bindingMgr: newBindingManager(), - integrity: config.Integrity, - _nonce: config.Nonce, - _lifetime: config.Lifetime, - readCh: make(chan *inboundData, maxReadQueueSize), - closeCh: make(chan struct{}), - readTimer: time.NewTimer(time.Duration(math.MaxInt64)), - log: config.Log, + bindingMgr: newBindingManager(), + readCh: make(chan *inboundData, maxReadQueueSize), + closeCh: make(chan struct{}), + allocation: allocation{ + client: config.Client, + relayedAddr: config.RelayedAddr, + serverAddr: config.ServerAddr, + readTimer: time.NewTimer(time.Duration(math.MaxInt64)), + permMap: newPermissionMap(), + username: config.Username, + realm: config.Realm, + integrity: config.Integrity, + _nonce: config.Nonce, + _lifetime: config.Lifetime, + net: config.Net, + log: config.Log, + }, } - c.log.Debugf("initial lifetime: %d seconds", int(c.lifetime().Seconds())) + c.log.Debugf("Initial lifetime: %d seconds", int(c.lifetime().Seconds())) c.refreshAllocTimer = NewPeriodicTimer( timerIDRefreshAlloc, @@ -105,10 +78,10 @@ func NewUDPConn(config *UDPConnConfig) *UDPConn { ) if c.refreshAllocTimer.Start() { - c.log.Debugf("refreshAllocTimer started") + c.log.Debugf("Started refresh allocation timer") } if c.refreshPermsTimer.Start() { - c.log.Debugf("refreshPermsTimer started") + c.log.Debugf("Started refresh permission timer") } return c @@ -153,14 +126,14 @@ func (c *UDPConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) { } } -func (c *UDPConn) createPermission(perm *permission, addr net.Addr) error { +func (a *allocation) createPermission(perm *permission, addr net.Addr) error { perm.mutex.Lock() defer perm.mutex.Unlock() if perm.state() == permStateIdle { - // punch a hole! (this would block a bit..) - if err := c.CreatePermissions(addr); err != nil { - c.permMap.delete(addr) + // Punch a hole! (this would block a bit..) + if err := a.CreatePermissions(addr); err != nil { + a.permMap.delete(addr) return err } perm.setState(permStatePermitted) @@ -180,7 +153,7 @@ func (c *UDPConn) WriteTo(p []byte, addr net.Addr) (int, error) { //nolint: goco return 0, errUDPAddrCast } - // check if we have a permission for the destination IP addr + // Check if we have a permission for the destination IP addr perm, ok := c.permMap.find(addr) if !ok { perm = &permission{} @@ -203,7 +176,7 @@ func (c *UDPConn) WriteTo(p []byte, addr net.Addr) (int, error) { //nolint: goco return 0, err } - // bind channel + // Bind channel b, ok := c.bindingMgr.findByAddr(addr) if !ok { b = c.bindingMgr.create(addr) @@ -213,20 +186,20 @@ func (c *UDPConn) WriteTo(p []byte, addr net.Addr) (int, error) { //nolint: goco if bindSt == bindingStateIdle || bindSt == bindingStateRequest || bindSt == bindingStateFailed { func() { - // block only callers with the same binding until + // Block only callers with the same binding until // the binding transaction has been complete b.muBind.Lock() defer b.muBind.Unlock() - // binding state may have been changed while waiting. check again. + // Binding state may have been changed while waiting. check again. if b.state() == bindingStateIdle { b.setState(bindingStateRequest) go func() { err2 := c.bind(b) if err2 != nil { - c.log.Warnf("bind() failed: %s", err2.Error()) + c.log.Warnf("Failed to bind bind(): %s", err2) b.setState(bindingStateFailed) - // keep going... + // Keep going... } else { b.setState(bindingStateReady) } @@ -234,7 +207,7 @@ func (c *UDPConn) WriteTo(p []byte, addr net.Addr) (int, error) { //nolint: goco } }() - // send data using SendIndication + // Send data using SendIndication peerAddr := addr2PeerAddress(addr) var msg *stun.Message msg, err = stun.Build( @@ -248,14 +221,14 @@ func (c *UDPConn) WriteTo(p []byte, addr net.Addr) (int, error) { //nolint: goco return 0, err } - // indication has no transaction (fire-and-forget) + // Indication has no transaction (fire-and-forget) - return c.obs.WriteTo(msg.Raw, c.obs.TURNServerAddr()) + return c.client.WriteTo(msg.Raw, c.serverAddr) } - // binding is either ready + // Binding is either ready - // check if the binding needs a refresh + // Check if the binding needs a refresh func() { b.muBind.Lock() defer b.muBind.Unlock() @@ -265,9 +238,9 @@ func (c *UDPConn) WriteTo(p []byte, addr net.Addr) (int, error) { //nolint: goco go func() { err = c.bind(b) if err != nil { - c.log.Warnf("bind() for refresh failed: %s", err.Error()) + c.log.Warnf("Failed to bind() for refresh: %s", err) b.setState(bindingStateFailed) - // keep going... + // Keep going... } else { b.setRefreshedAt(time.Now()) b.setState(bindingStateReady) @@ -276,7 +249,7 @@ func (c *UDPConn) WriteTo(p []byte, addr net.Addr) (int, error) { //nolint: goco } }() - // send via ChannelData + // Send via ChannelData _, err = c.sendChannelData(p, b.number) if err != nil { return 0, err @@ -297,7 +270,7 @@ func (c *UDPConn) Close() error { close(c.closeCh) } - c.obs.OnDeallocated(c.relayedAddr) + c.client.OnDeallocated(c.relayedAddr) return c.refreshAllocation(0, true /* dontWait=true */) } @@ -344,7 +317,7 @@ func (c *UDPConn) SetReadDeadline(t time.Time) error { // Even if write times out, it may return n > 0, indicating that // some of the data was successfully written. // A zero value for t means WriteTo will not time out. -func (c *UDPConn) SetWriteDeadline(t time.Time) error { +func (c *UDPConn) SetWriteDeadline(time.Time) error { // Write never blocks. return nil } @@ -365,7 +338,7 @@ func addr2PeerAddress(addr net.Addr) proto.PeerAddress { // CreatePermissions Issues a CreatePermission request for the supplied addresses // as described in https://datatracker.ietf.org/doc/html/rfc5766#section-9 -func (c *UDPConn) CreatePermissions(addrs ...net.Addr) error { +func (a *allocation) CreatePermissions(addrs ...net.Addr) error { setters := []stun.Setter{ stun.TransactionID, stun.NewType(stun.MethodCreatePermission, stun.ClassRequest), @@ -376,10 +349,10 @@ func (c *UDPConn) CreatePermissions(addrs ...net.Addr) error { } setters = append(setters, - c.obs.Username(), - c.obs.Realm(), - c.nonce(), - c.integrity, + a.username, + a.realm, + a.nonce(), + a.integrity, stun.Fingerprint) msg, err := stun.Build(setters...) @@ -387,7 +360,7 @@ func (c *UDPConn) CreatePermissions(addrs ...net.Addr) error { return err } - trRes, err := c.obs.PerformTransaction(msg, c.obs.TURNServerAddr(), false) + trRes, err := a.client.PerformTransaction(msg, a.serverAddr, false) if err != nil { return err } @@ -398,12 +371,11 @@ func (c *UDPConn) CreatePermissions(addrs ...net.Addr) error { var code stun.ErrorCodeAttribute if err = code.GetFrom(res); err == nil { if code.Code == stun.CodeStaleNonce { - c.setNonceFromMsg(res) + a.setNonceFromMsg(res) return errTryAgain } return fmt.Errorf("%s (error %s)", res.Type, code) //nolint:goerr113 } - return fmt.Errorf("%s", res.Type) //nolint:goerr113 } @@ -412,14 +384,14 @@ func (c *UDPConn) CreatePermissions(addrs ...net.Addr) error { // HandleInbound passes inbound data in UDPConn func (c *UDPConn) HandleInbound(data []byte, from net.Addr) { - // copy data + // Copy data copied := make([]byte, len(data)) copy(copied, data) select { case c.readCh <- &inboundData{data: copied, from: from}: default: - c.log.Warnf("receive buffer full") + c.log.Warnf("Receive buffer full") } } @@ -433,94 +405,14 @@ func (c *UDPConn) FindAddrByChannelNumber(chNum uint16) (net.Addr, bool) { return b.addr, true } -func (c *UDPConn) setNonceFromMsg(msg *stun.Message) { - // Update nonce - var nonce stun.Nonce - if err := nonce.GetFrom(msg); err == nil { - c.setNonce(nonce) - c.log.Debug("refresh allocation: 438, got new nonce.") - } else { - c.log.Warn("refresh allocation: 438 but no nonce.") - } -} - -func (c *UDPConn) refreshAllocation(lifetime time.Duration, dontWait bool) error { - msg, err := stun.Build( - stun.TransactionID, - stun.NewType(stun.MethodRefresh, stun.ClassRequest), - proto.Lifetime{Duration: lifetime}, - c.obs.Username(), - c.obs.Realm(), - c.nonce(), - c.integrity, - stun.Fingerprint, - ) - if err != nil { - return fmt.Errorf("%w: %s", errFailedToBuildRefreshRequest, err.Error()) - } - - c.log.Debugf("send refresh request (dontWait=%v)", dontWait) - trRes, err := c.obs.PerformTransaction(msg, c.obs.TURNServerAddr(), dontWait) - if err != nil { - return fmt.Errorf("%w: %s", errFailedToRefreshAllocation, err.Error()) - } - - if dontWait { - c.log.Debug("refresh request sent") - return nil - } - - c.log.Debug("refresh request sent, and waiting response") - - res := trRes.Msg - if res.Type.Class == stun.ClassErrorResponse { - var code stun.ErrorCodeAttribute - if err = code.GetFrom(res); err == nil { - if code.Code == stun.CodeStaleNonce { - c.setNonceFromMsg(res) - return errTryAgain - } - return err - } - return fmt.Errorf("%s", res.Type) //nolint:goerr113 - } - - // Getting lifetime from response - var updatedLifetime proto.Lifetime - if err := updatedLifetime.GetFrom(res); err != nil { - return fmt.Errorf("%w: %s", errFailedToGetLifetime, err.Error()) - } - - c.setLifetime(updatedLifetime.Duration) - c.log.Debugf("updated lifetime: %d seconds", int(c.lifetime().Seconds())) - return nil -} - -func (c *UDPConn) refreshPermissions() error { - addrs := c.permMap.addrs() - if len(addrs) == 0 { - c.log.Debug("no permission to refresh") - return nil - } - if err := c.CreatePermissions(addrs...); err != nil { - if errors.Is(err, errTryAgain) { - return errTryAgain - } - c.log.Errorf("fail to refresh permissions: %s", err.Error()) - return err - } - c.log.Debug("refresh permissions successful") - return nil -} - func (c *UDPConn) bind(b *binding) error { setters := []stun.Setter{ stun.TransactionID, stun.NewType(stun.MethodChannelBind, stun.ClassRequest), addr2PeerAddress(b.addr), proto.ChannelNumber(b.number), - c.obs.Username(), - c.obs.Realm(), + c.username, + c.realm, c.nonce(), c.integrity, stun.Fingerprint, @@ -531,7 +423,7 @@ func (c *UDPConn) bind(b *binding) error { return err } - trRes, err := c.obs.PerformTransaction(msg, c.obs.TURNServerAddr(), false) + trRes, err := c.client.PerformTransaction(msg, c.serverAddr, false) if err != nil { c.bindingMgr.deleteByAddr(b.addr) return err @@ -543,7 +435,7 @@ func (c *UDPConn) bind(b *binding) error { return fmt.Errorf("unexpected response type %s", res.Type) //nolint:goerr113 } - c.log.Debugf("channel binding successful: %s %d", b.addr.String(), b.number) + c.log.Debugf("Channel binding successful: %s %d", b.addr, b.number) // Success. return nil @@ -555,69 +447,9 @@ func (c *UDPConn) sendChannelData(data []byte, chNum uint16) (int, error) { Number: proto.ChannelNumber(chNum), } chData.Encode() - _, err := c.obs.WriteTo(chData.Raw, c.obs.TURNServerAddr()) + _, err := c.client.WriteTo(chData.Raw, c.serverAddr) if err != nil { return 0, err } return len(data), nil } - -func (c *UDPConn) onRefreshTimers(id int) { - c.log.Debugf("refresh timer %d expired", id) - switch id { - case timerIDRefreshAlloc: - var err error - lifetime := c.lifetime() - // limit the max retries on errTryAgain to 3 - // when stale nonce returns, sencond retry should succeed - for i := 0; i < maxRetryAttempts; i++ { - err = c.refreshAllocation(lifetime, false) - if !errors.Is(err, errTryAgain) { - break - } - } - if err != nil { - c.log.Warnf("refresh allocation failed") - } - case timerIDRefreshPerms: - var err error - for i := 0; i < maxRetryAttempts; i++ { - err = c.refreshPermissions() - if !errors.Is(err, errTryAgain) { - break - } - } - if err != nil { - c.log.Warnf("refresh permissions failed") - } - } -} - -func (c *UDPConn) nonce() stun.Nonce { - c.mutex.RLock() - defer c.mutex.RUnlock() - - return c._nonce -} - -func (c *UDPConn) setNonce(nonce stun.Nonce) { - c.mutex.Lock() - defer c.mutex.Unlock() - - c.log.Debugf("set new nonce with %d bytes", len(nonce)) - c._nonce = nonce -} - -func (c *UDPConn) lifetime() time.Duration { - c.mutex.RLock() - defer c.mutex.RUnlock() - - return c._lifetime -} - -func (c *UDPConn) setLifetime(lifetime time.Duration) { - c.mutex.Lock() - defer c.mutex.Unlock() - - c._lifetime = lifetime -} diff --git a/vendor/github.com/pion/turn/v2/internal/ipnet/util.go b/vendor/github.com/pion/turn/v2/internal/ipnet/util.go index 24256b0a0..c3a5b32f3 100644 --- a/vendor/github.com/pion/turn/v2/internal/ipnet/util.go +++ b/vendor/github.com/pion/turn/v2/internal/ipnet/util.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + // Package ipnet contains helper functions around net and IP package ipnet @@ -38,3 +41,15 @@ func AddrEqual(a, b net.Addr) bool { return aUDP.IP.Equal(bUDP.IP) && aUDP.Port == bUDP.Port } + +// FingerprintAddr generates a fingerprint from net.UDPAddr or net.TCPAddr's +// which can be used for indexing maps. +func FingerprintAddr(addr net.Addr) string { + switch a := addr.(type) { + case *net.UDPAddr: + return a.IP.String() + case *net.TCPAddr: // Do we really need this case? + return a.IP.String() + } + return "" // Should never happen +} diff --git a/vendor/github.com/pion/turn/v2/internal/proto/addr.go b/vendor/github.com/pion/turn/v2/internal/proto/addr.go index b1d654d9e..7d4db8bf7 100644 --- a/vendor/github.com/pion/turn/v2/internal/proto/addr.go +++ b/vendor/github.com/pion/turn/v2/internal/proto/addr.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package proto import ( diff --git a/vendor/github.com/pion/turn/v2/internal/proto/chandata.go b/vendor/github.com/pion/turn/v2/internal/proto/chandata.go index 6f023e088..df9371193 100644 --- a/vendor/github.com/pion/turn/v2/internal/proto/chandata.go +++ b/vendor/github.com/pion/turn/v2/internal/proto/chandata.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package proto import ( @@ -11,8 +14,8 @@ import ( // // See RFC 5766 Section 11.4 type ChannelData struct { - Data []byte // can be sub slice of Raw - Length int // ignored while encoding, len(Data) is used + Data []byte // Can be sub slice of Raw + Length int // Ignored while encoding, len(Data) is used Number ChannelNumber Raw []byte } @@ -34,7 +37,7 @@ func (c *ChannelData) Equal(b *ChannelData) bool { return bytes.Equal(c.Data, b.Data) } -// grow ensures that internal buffer will fit v more bytes and +// Grow ensures that internal buffer will fit v more bytes and // increases it capacity if necessary. // // Similar to stun.Message.grow method. diff --git a/vendor/github.com/pion/turn/v2/internal/proto/chann.go b/vendor/github.com/pion/turn/v2/internal/proto/chann.go index d64ef73f4..f85c6a170 100644 --- a/vendor/github.com/pion/turn/v2/internal/proto/chann.go +++ b/vendor/github.com/pion/turn/v2/internal/proto/chann.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package proto import ( @@ -13,7 +16,7 @@ import ( // The CHANNEL-NUMBER attribute contains the number of the channel. // // RFC 5766 Section 14.1 -type ChannelNumber uint16 // encoded as uint16 +type ChannelNumber uint16 // Encoded as uint16 func (n ChannelNumber) String() string { return strconv.Itoa(int(n)) } @@ -38,7 +41,7 @@ func (n *ChannelNumber) GetFrom(m *stun.Message) error { if err = stun.CheckSize(stun.AttrChannelNumber, len(v), channelNumberSize); err != nil { return err } - _ = v[channelNumberSize-1] // asserting length + _ = v[channelNumberSize-1] // Asserting length *n = ChannelNumber(binary.BigEndian.Uint16(v[:2])) // v[2:4] is RFFU and equals to 0. return nil diff --git a/vendor/github.com/pion/turn/v2/internal/proto/connection_id.go b/vendor/github.com/pion/turn/v2/internal/proto/connection_id.go index 4984b474b..8827da6b3 100644 --- a/vendor/github.com/pion/turn/v2/internal/proto/connection_id.go +++ b/vendor/github.com/pion/turn/v2/internal/proto/connection_id.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package proto import ( @@ -33,7 +36,7 @@ func (c *ConnectionID) GetFrom(m *stun.Message) error { if err = stun.CheckSize(stun.AttrConnectionID, len(v), connectionIDSize); err != nil { return err } - _ = v[connectionIDSize-1] // asserting length + _ = v[connectionIDSize-1] // Asserting length *(*uint32)(c) = binary.BigEndian.Uint32(v) return nil } diff --git a/vendor/github.com/pion/turn/v2/internal/proto/data.go b/vendor/github.com/pion/turn/v2/internal/proto/data.go index 64243e0c5..d3cf31300 100644 --- a/vendor/github.com/pion/turn/v2/internal/proto/data.go +++ b/vendor/github.com/pion/turn/v2/internal/proto/data.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package proto import "github.com/pion/stun" diff --git a/vendor/github.com/pion/turn/v2/internal/proto/dontfrag.go b/vendor/github.com/pion/turn/v2/internal/proto/dontfrag.go index ac52b2b51..317938cb9 100644 --- a/vendor/github.com/pion/turn/v2/internal/proto/dontfrag.go +++ b/vendor/github.com/pion/turn/v2/internal/proto/dontfrag.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package proto import ( @@ -32,10 +35,7 @@ func (d *DontFragment) GetFrom(m *stun.Message) error { if err != nil { return err } - if err = stun.CheckSize(stun.AttrDontFragment, len(v), dontFragmentSize); err != nil { - return err - } - return nil + return stun.CheckSize(stun.AttrDontFragment, len(v), dontFragmentSize) } // IsSet returns true if DONT-FRAGMENT attribute is set. diff --git a/vendor/github.com/pion/turn/v2/internal/proto/evenport.go b/vendor/github.com/pion/turn/v2/internal/proto/evenport.go index a5a388258..c41df3296 100644 --- a/vendor/github.com/pion/turn/v2/internal/proto/evenport.go +++ b/vendor/github.com/pion/turn/v2/internal/proto/evenport.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package proto import "github.com/pion/stun" diff --git a/vendor/github.com/pion/turn/v2/internal/proto/lifetime.go b/vendor/github.com/pion/turn/v2/internal/proto/lifetime.go index b78169660..4405c77aa 100644 --- a/vendor/github.com/pion/turn/v2/internal/proto/lifetime.go +++ b/vendor/github.com/pion/turn/v2/internal/proto/lifetime.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package proto import ( @@ -25,7 +28,7 @@ type Lifetime struct { time.Duration } -// uint32 seconds +// Seconds in uint32 const lifetimeSize = 4 // 4 bytes, 32 bits // AddTo adds LIFETIME to message. @@ -45,7 +48,7 @@ func (l *Lifetime) GetFrom(m *stun.Message) error { if err = stun.CheckSize(stun.AttrLifetime, len(v), lifetimeSize); err != nil { return err } - _ = v[lifetimeSize-1] // asserting length + _ = v[lifetimeSize-1] // Asserting length seconds := binary.BigEndian.Uint32(v) l.Duration = time.Second * time.Duration(seconds) return nil diff --git a/vendor/github.com/pion/turn/v2/internal/proto/peeraddr.go b/vendor/github.com/pion/turn/v2/internal/proto/peeraddr.go index b357b823e..a562d5a11 100644 --- a/vendor/github.com/pion/turn/v2/internal/proto/peeraddr.go +++ b/vendor/github.com/pion/turn/v2/internal/proto/peeraddr.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package proto import ( diff --git a/vendor/github.com/pion/turn/v2/internal/proto/proto.go b/vendor/github.com/pion/turn/v2/internal/proto/proto.go index 4b08c7620..e5842687f 100644 --- a/vendor/github.com/pion/turn/v2/internal/proto/proto.go +++ b/vendor/github.com/pion/turn/v2/internal/proto/proto.go @@ -1,6 +1,7 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + // Package proto implements RFC 5766 Traversal Using Relays around NAT. -// -// Merged from gortc/turn v0.80. package proto import ( diff --git a/vendor/github.com/pion/turn/v2/internal/proto/relayedaddr.go b/vendor/github.com/pion/turn/v2/internal/proto/relayedaddr.go index 2169cb756..d4dcc7535 100644 --- a/vendor/github.com/pion/turn/v2/internal/proto/relayedaddr.go +++ b/vendor/github.com/pion/turn/v2/internal/proto/relayedaddr.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package proto import ( diff --git a/vendor/github.com/pion/turn/v2/internal/proto/reqfamily.go b/vendor/github.com/pion/turn/v2/internal/proto/reqfamily.go index e83d6bba4..8c18f9d52 100644 --- a/vendor/github.com/pion/turn/v2/internal/proto/reqfamily.go +++ b/vendor/github.com/pion/turn/v2/internal/proto/reqfamily.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package proto import ( diff --git a/vendor/github.com/pion/turn/v2/internal/proto/reqtrans.go b/vendor/github.com/pion/turn/v2/internal/proto/reqtrans.go index cc73a4713..5dd446d3a 100644 --- a/vendor/github.com/pion/turn/v2/internal/proto/reqtrans.go +++ b/vendor/github.com/pion/turn/v2/internal/proto/reqtrans.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package proto import ( @@ -10,12 +13,16 @@ import ( type Protocol byte const ( + // ProtoTCP is IANA assigned protocol number for TCP. + ProtoTCP Protocol = 6 // ProtoUDP is IANA assigned protocol number for UDP. ProtoUDP Protocol = 17 ) func (p Protocol) String() string { switch p { + case ProtoTCP: + return "TCP" case ProtoUDP: return "UDP" default: diff --git a/vendor/github.com/pion/turn/v2/internal/proto/rsrvtoken.go b/vendor/github.com/pion/turn/v2/internal/proto/rsrvtoken.go index 6e2ed4d80..ec72fc7cf 100644 --- a/vendor/github.com/pion/turn/v2/internal/proto/rsrvtoken.go +++ b/vendor/github.com/pion/turn/v2/internal/proto/rsrvtoken.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package proto import "github.com/pion/stun" diff --git a/vendor/github.com/pion/turn/v2/internal/server/errors.go b/vendor/github.com/pion/turn/v2/internal/server/errors.go index 13f8ee1a3..ea6da834c 100644 --- a/vendor/github.com/pion/turn/v2/internal/server/errors.go +++ b/vendor/github.com/pion/turn/v2/internal/server/errors.go @@ -1,11 +1,14 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package server import "errors" var ( errFailedToGenerateNonce = errors.New("failed to generate nonce") + errInvalidNonce = errors.New("invalid nonce") errFailedToSendError = errors.New("failed to send error message") - errDuplicatedNonce = errors.New("duplicated Nonce generated, discarding request") errNoSuchUser = errors.New("no such user exists") errUnexpectedClass = errors.New("unexpected class") errUnexpectedMethod = errors.New("unexpected method") @@ -15,7 +18,7 @@ var ( errFailedToCreateSTUNPacket = errors.New("failed to create stun message from packet") errFailedToCreateChannelData = errors.New("failed to create channel data from packet") errRelayAlreadyAllocatedForFiveTuple = errors.New("relay already allocated for 5-TUPLE") - errRequestedTransportMustBeUDP = errors.New("RequestedTransport must be UDP") + errUnsupportedTransportProtocol = errors.New("RequestedTransport must be UDP or TCP") errNoDontFragmentSupport = errors.New("no support for DONT-FRAGMENT") errRequestWithReservationTokenAndEvenPort = errors.New("Request must not contain RESERVATION-TOKEN and EVEN-PORT") errNoAllocationFound = errors.New("no allocation found") diff --git a/vendor/github.com/pion/turn/v2/internal/server/nonce.go b/vendor/github.com/pion/turn/v2/internal/server/nonce.go new file mode 100644 index 000000000..b3f3131e8 --- /dev/null +++ b/vendor/github.com/pion/turn/v2/internal/server/nonce.go @@ -0,0 +1,71 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package server + +import ( + "crypto/hmac" + "crypto/rand" + "crypto/sha256" + "encoding/binary" + "encoding/hex" + "fmt" + "time" +) + +const ( + nonceLifetime = time.Hour // See: https://tools.ietf.org/html/rfc5766#section-4 + nonceLength = 40 + nonceKeyLength = 64 +) + +// NewNonceHash creates a NonceHash +func NewNonceHash() (*NonceHash, error) { + key := make([]byte, nonceKeyLength) + if _, err := rand.Read(key); err != nil { + return nil, err + } + + return &NonceHash{key}, nil +} + +// NonceHash is used to create and verify nonces +type NonceHash struct { + key []byte +} + +// Generate a nonce +func (n *NonceHash) Generate() (string, error) { + nonce := make([]byte, 8, nonceLength) + binary.BigEndian.PutUint64(nonce, uint64(time.Now().UnixMilli())) + + hash := hmac.New(sha256.New, n.key) + if _, err := hash.Write(nonce[:8]); err != nil { + return "", fmt.Errorf("%w: %v", errFailedToGenerateNonce, err) //nolint:errorlint + } + nonce = hash.Sum(nonce) + + return hex.EncodeToString(nonce), nil +} + +// Validate checks that nonce is signed and is not expired +func (n *NonceHash) Validate(nonce string) error { + b, err := hex.DecodeString(nonce) + if err != nil || len(b) != nonceLength { + return fmt.Errorf("%w: %v", errInvalidNonce, err) //nolint:errorlint + } + + if ts := time.UnixMilli(int64(binary.BigEndian.Uint64(b))); time.Since(ts) > nonceLifetime { + return errInvalidNonce + } + + hash := hmac.New(sha256.New, n.key) + if _, err = hash.Write(b[:8]); err != nil { + return fmt.Errorf("%w: %v", errInvalidNonce, err) //nolint:errorlint + } + if !hmac.Equal(b[8:], hash.Sum(nil)) { + return errInvalidNonce + } + + return nil +} diff --git a/vendor/github.com/pion/turn/v2/internal/server/server.go b/vendor/github.com/pion/turn/v2/internal/server/server.go index 27f375839..097cb9f05 100644 --- a/vendor/github.com/pion/turn/v2/internal/server/server.go +++ b/vendor/github.com/pion/turn/v2/internal/server/server.go @@ -1,10 +1,12 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + // Package server implements the private API to implement a TURN server package server import ( "fmt" "net" - "sync" "time" "github.com/pion/logging" @@ -22,7 +24,7 @@ type Request struct { // Server State AllocationManager *allocation.Manager - Nonces *sync.Map + NonceHash *NonceHash // User Configuration AuthHandler func(username string, realm string, srcAddr net.Addr) (key []byte, ok bool) @@ -33,7 +35,7 @@ type Request struct { // HandleRequest processes the give Request func HandleRequest(r Request) error { - r.Log.Debugf("received %d bytes of udp from %s on %s", len(r.Buff), r.SrcAddr.String(), r.Conn.LocalAddr().String()) + r.Log.Debugf("Received %d bytes of udp from %s on %s", len(r.Buff), r.SrcAddr, r.Conn.LocalAddr()) if proto.IsChannelData(r.Buff) { return handleDataPacket(r) @@ -43,35 +45,35 @@ func HandleRequest(r Request) error { } func handleDataPacket(r Request) error { - r.Log.Debugf("received DataPacket from %s", r.SrcAddr.String()) + r.Log.Debugf("Received DataPacket from %s", r.SrcAddr.String()) c := proto.ChannelData{Raw: r.Buff} if err := c.Decode(); err != nil { - return fmt.Errorf("%w: %v", errFailedToCreateChannelData, err) + return fmt.Errorf("%w: %v", errFailedToCreateChannelData, err) //nolint:errorlint } err := handleChannelData(r, &c) if err != nil { - err = fmt.Errorf("%w from %v: %v", errUnableToHandleChannelData, r.SrcAddr, err) + err = fmt.Errorf("%w from %v: %v", errUnableToHandleChannelData, r.SrcAddr, err) //nolint:errorlint } return err } func handleTURNPacket(r Request) error { - r.Log.Debug("handleTURNPacket") + r.Log.Debug("Handling TURN packet") m := &stun.Message{Raw: append([]byte{}, r.Buff...)} if err := m.Decode(); err != nil { - return fmt.Errorf("%w: %v", errFailedToCreateSTUNPacket, err) + return fmt.Errorf("%w: %v", errFailedToCreateSTUNPacket, err) //nolint:errorlint } h, err := getMessageHandler(m.Type.Class, m.Type.Method) if err != nil { - return fmt.Errorf("%w %v-%v from %v: %v", errUnhandledSTUNPacket, m.Type.Method, m.Type.Class, r.SrcAddr, err) + return fmt.Errorf("%w %v-%v from %v: %v", errUnhandledSTUNPacket, m.Type.Method, m.Type.Class, r.SrcAddr, err) //nolint:errorlint } err = h(r, m) if err != nil { - return fmt.Errorf("%w %v-%v from %v: %v", errFailedToHandle, m.Type.Method, m.Type.Class, r.SrcAddr, err) + return fmt.Errorf("%w %v-%v from %v: %v", errFailedToHandle, m.Type.Method, m.Type.Class, r.SrcAddr, err) //nolint:errorlint } return nil diff --git a/vendor/github.com/pion/turn/v2/internal/server/stun.go b/vendor/github.com/pion/turn/v2/internal/server/stun.go index 673e99f62..b8596d129 100644 --- a/vendor/github.com/pion/turn/v2/internal/server/stun.go +++ b/vendor/github.com/pion/turn/v2/internal/server/stun.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package server import ( @@ -6,7 +9,7 @@ import ( ) func handleBindingRequest(r Request, m *stun.Message) error { - r.Log.Debugf("received BindingRequest from %s", r.SrcAddr.String()) + r.Log.Debugf("Received BindingRequest from %s", r.SrcAddr) ip, port, err := ipnet.AddrIPPort(r.SrcAddr) if err != nil { diff --git a/vendor/github.com/pion/turn/v2/internal/server/turn.go b/vendor/github.com/pion/turn/v2/internal/server/turn.go index 4e7d25db0..cd84834c9 100644 --- a/vendor/github.com/pion/turn/v2/internal/server/turn.go +++ b/vendor/github.com/pion/turn/v2/internal/server/turn.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package server import ( @@ -10,9 +13,9 @@ import ( "github.com/pion/turn/v2/internal/proto" ) -// // https://tools.ietf.org/html/rfc5766#section-6.2 +// See: https://tools.ietf.org/html/rfc5766#section-6.2 func handleAllocateRequest(r Request, m *stun.Message) error { - r.Log.Debugf("received AllocateRequest from %s", r.SrcAddr.String()) + r.Log.Debugf("Received AllocateRequest from %s", r.SrcAddr) // 1. The server MUST require that the request be authenticated. This // authentication MUST be done using the long-term credential @@ -44,7 +47,7 @@ func handleAllocateRequest(r Request, m *stun.Message) error { msg := buildMsg(m.TransactionID, stun.NewType(stun.MethodAllocate, stun.ClassErrorResponse), &stun.ErrorCodeAttribute{Code: stun.CodeAllocMismatch}) return buildAndSendErr(r.Conn, r.SrcAddr, errRelayAlreadyAllocatedForFiveTuple, msg...) } - // a retry allocation + // A retry allocation msg := buildMsg(m.TransactionID, stun.NewType(stun.MethodAllocate, stun.ClassSuccessResponse), append(attrs, messageIntegrity)...) return buildAndSend(r.Conn, r.SrcAddr, msg...) } @@ -53,14 +56,14 @@ func handleAllocateRequest(r Request, m *stun.Message) error { // attribute. If the REQUESTED-TRANSPORT attribute is not included // or is malformed, the server rejects the request with a 400 (Bad // Request) error. Otherwise, if the attribute is included but - // specifies a protocol other that UDP, the server rejects the + // specifies a protocol other that UDP/TCP, the server rejects the // request with a 442 (Unsupported Transport Protocol) error. var requestedTransport proto.RequestedTransport if err = requestedTransport.GetFrom(m); err != nil { return buildAndSendErr(r.Conn, r.SrcAddr, err, badRequestMsg...) - } else if requestedTransport.Protocol != proto.ProtoUDP { + } else if requestedTransport.Protocol != proto.ProtoUDP && requestedTransport.Protocol != proto.ProtoTCP { msg := buildMsg(m.TransactionID, stun.NewType(stun.MethodAllocate, stun.ClassErrorResponse), &stun.ErrorCodeAttribute{Code: stun.CodeUnsupportedTransProto}) - return buildAndSendErr(r.Conn, r.SrcAddr, errRequestedTransportMustBeUDP, msg...) + return buildAndSendErr(r.Conn, r.SrcAddr, errUnsupportedTransportProtocol, msg...) } // 4. The request may contain a DONT-FRAGMENT attribute. If it does, @@ -128,7 +131,8 @@ func handleAllocateRequest(r Request, m *stun.Message) error { } // Once the allocation is created, the server replies with a success - // response. The success response contains: + // response. + // The success response contains: // * An XOR-RELAYED-ADDRESS attribute containing the relayed transport // address. // * A LIFETIME attribute containing the current value of the time-to- @@ -173,7 +177,7 @@ func handleAllocateRequest(r Request, m *stun.Message) error { } func handleRefreshRequest(r Request, m *stun.Message) error { - r.Log.Debugf("received RefreshRequest from %s", r.SrcAddr.String()) + r.Log.Debugf("Received RefreshRequest from %s", r.SrcAddr) messageIntegrity, hasAuth, err := authenticateRequest(r, m, stun.MethodRefresh) if !hasAuth { @@ -207,7 +211,7 @@ func handleRefreshRequest(r Request, m *stun.Message) error { } func handleCreatePermissionRequest(r Request, m *stun.Message) error { - r.Log.Debugf("received CreatePermission from %s", r.SrcAddr.String()) + r.Log.Debugf("Received CreatePermission from %s", r.SrcAddr) a := r.AllocationManager.GetAllocation(&allocation.FiveTuple{ SrcAddr: r.SrcAddr, @@ -232,13 +236,12 @@ func handleCreatePermissionRequest(r Request, m *stun.Message) error { } if err := r.AllocationManager.GrantPermission(r.SrcAddr, peerAddress.IP); err != nil { - r.Log.Infof("permission denied for client %s to peer %s", r.SrcAddr.String(), - peerAddress.IP.String()) + r.Log.Infof("permission denied for client %s to peer %s", r.SrcAddr, peerAddress.IP) return err } - r.Log.Debugf("adding permission for %s", fmt.Sprintf("%s:%d", - peerAddress.IP.String(), peerAddress.Port)) + r.Log.Debugf("Adding permission for %s", fmt.Sprintf("%s:%d", + peerAddress.IP, peerAddress.Port)) a.AddPermission(allocation.NewPermission( &net.UDPAddr{ @@ -262,7 +265,7 @@ func handleCreatePermissionRequest(r Request, m *stun.Message) error { } func handleSendIndication(r Request, m *stun.Message) error { - r.Log.Debugf("received SendIndication from %s", r.SrcAddr.String()) + r.Log.Debugf("Received SendIndication from %s", r.SrcAddr) a := r.AllocationManager.GetAllocation(&allocation.FiveTuple{ SrcAddr: r.SrcAddr, DstAddr: r.Conn.LocalAddr(), @@ -289,13 +292,13 @@ func handleSendIndication(r Request, m *stun.Message) error { l, err := a.RelaySocket.WriteTo(dataAttr, msgDst) if l != len(dataAttr) { - return fmt.Errorf("%w %d != %d (expected) err: %v", errShortWrite, l, len(dataAttr), err) + return fmt.Errorf("%w %d != %d (expected) err: %v", errShortWrite, l, len(dataAttr), err) //nolint:errorlint } return err } func handleChannelBindRequest(r Request, m *stun.Message) error { - r.Log.Debugf("received ChannelBindRequest from %s", r.SrcAddr.String()) + r.Log.Debugf("Received ChannelBindRequest from %s", r.SrcAddr) a := r.AllocationManager.GetAllocation(&allocation.FiveTuple{ SrcAddr: r.SrcAddr, @@ -324,8 +327,7 @@ func handleChannelBindRequest(r Request, m *stun.Message) error { } if err = r.AllocationManager.GrantPermission(r.SrcAddr, peerAddr.IP); err != nil { - r.Log.Infof("permission denied for client %s to peer %s", r.SrcAddr.String(), - peerAddr.IP.String()) + r.Log.Infof("permission denied for client %s to peer %s", r.SrcAddr, peerAddr.IP) unauthorizedRequestMsg := buildMsg(m.TransactionID, stun.NewType(stun.MethodChannelBind, stun.ClassErrorResponse), @@ -333,9 +335,7 @@ func handleChannelBindRequest(r Request, m *stun.Message) error { return buildAndSendErr(r.Conn, r.SrcAddr, err, unauthorizedRequestMsg...) } - r.Log.Debugf("binding channel %d to %s", - channel, - fmt.Sprintf("%s:%d", peerAddr.IP.String(), peerAddr.Port)) + r.Log.Debugf("Binding channel %d to %s", channel, peerAddr) err = a.AddChannelBind(allocation.NewChannelBind( channel, &net.UDPAddr{IP: peerAddr.IP, Port: peerAddr.Port}, @@ -349,7 +349,7 @@ func handleChannelBindRequest(r Request, m *stun.Message) error { } func handleChannelData(r Request, c *proto.ChannelData) error { - r.Log.Debugf("received ChannelData from %s", r.SrcAddr.String()) + r.Log.Debugf("Received ChannelData from %s", r.SrcAddr) a := r.AllocationManager.GetAllocation(&allocation.FiveTuple{ SrcAddr: r.SrcAddr, diff --git a/vendor/github.com/pion/turn/v2/internal/server/util.go b/vendor/github.com/pion/turn/v2/internal/server/util.go index c9a339213..caa46e302 100644 --- a/vendor/github.com/pion/turn/v2/internal/server/util.go +++ b/vendor/github.com/pion/turn/v2/internal/server/util.go @@ -1,12 +1,13 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package server import ( - "crypto/md5" //nolint:gosec,gci + "errors" "fmt" - "io" "math/rand" "net" - "strconv" "time" "github.com/pion/stun" @@ -14,9 +15,7 @@ import ( ) const ( - maximumAllocationLifetime = time.Hour // https://tools.ietf.org/html/rfc5766#section-6.2 defines 3600 seconds recommendation - nonceLifetime = time.Hour // https://tools.ietf.org/html/rfc5766#section-4 - + maximumAllocationLifetime = time.Hour // See: https://tools.ietf.org/html/rfc5766#section-6.2 defines 3600 seconds recommendation ) func randSeq(n int) string { @@ -28,31 +27,23 @@ func randSeq(n int) string { return string(b) } -func buildNonce() (string, error) { - /* #nosec */ - h := md5.New() - if _, err := io.WriteString(h, strconv.FormatInt(time.Now().Unix(), 10)); err != nil { - return "", fmt.Errorf("%w: %v", errFailedToGenerateNonce, err) - } - if _, err := io.WriteString(h, strconv.FormatInt(rand.Int63(), 10)); err != nil { //nolint:gosec - return "", fmt.Errorf("%w: %v", errFailedToGenerateNonce, err) - } - return fmt.Sprintf("%x", h.Sum(nil)), nil -} - func buildAndSend(conn net.PacketConn, dst net.Addr, attrs ...stun.Setter) error { msg, err := stun.Build(attrs...) if err != nil { return err } _, err = conn.WriteTo(msg.Raw, dst) + if errors.Is(err, net.ErrClosed) { + return nil + } + return err } // Send a STUN packet and return the original error to the caller func buildAndSendErr(conn net.PacketConn, dst net.Addr, err error, attrs ...stun.Setter) error { if sendErr := buildAndSend(conn, dst, attrs...); sendErr != nil { - err = fmt.Errorf("%w %v %v", errFailedToSendError, sendErr, err) + err = fmt.Errorf("%w %v %v", errFailedToSendError, sendErr, err) //nolint:errorlint } return err } @@ -63,16 +54,11 @@ func buildMsg(transactionID [stun.TransactionIDSize]byte, msgType stun.MessageTy func authenticateRequest(r Request, m *stun.Message, callingMethod stun.Method) (stun.MessageIntegrity, bool, error) { respondWithNonce := func(responseCode stun.ErrorCode) (stun.MessageIntegrity, bool, error) { - nonce, err := buildNonce() + nonce, err := r.NonceHash.Generate() if err != nil { return nil, false, err } - // Nonce has already been taken - if _, keyCollision := r.Nonces.LoadOrStore(nonce, time.Now()); keyCollision { - return nil, false, errDuplicatedNonce - } - return nil, false, buildAndSend(r.Conn, r.SrcAddr, buildMsg(m.TransactionID, stun.NewType(callingMethod, stun.ClassErrorResponse), &stun.ErrorCodeAttribute{Code: responseCode}, @@ -94,15 +80,8 @@ func authenticateRequest(r Request, m *stun.Message, callingMethod stun.Method) return nil, false, buildAndSendErr(r.Conn, r.SrcAddr, err, badRequestMsg...) } - // Assert Nonce exists and is not expired - nonceCreationTime, nonceFound := r.Nonces.Load(string(*nonceAttr)) - if !nonceFound { - r.Nonces.Delete(nonceAttr) - return respondWithNonce(stun.CodeStaleNonce) - } - - if timeValue, ok := nonceCreationTime.(time.Time); !ok || time.Since(timeValue) >= nonceLifetime { - r.Nonces.Delete(nonceAttr) + // Assert Nonce is signed and is not expired + if err := r.NonceHash.Validate(nonceAttr.String()); err != nil { return respondWithNonce(stun.CodeStaleNonce) } diff --git a/vendor/github.com/pion/turn/v2/lt_cred.go b/vendor/github.com/pion/turn/v2/lt_cred.go index d4e9ab565..4308ed905 100644 --- a/vendor/github.com/pion/turn/v2/lt_cred.go +++ b/vendor/github.com/pion/turn/v2/lt_cred.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package turn import ( //nolint:gci @@ -30,7 +33,7 @@ func longTermCredentials(username string, sharedSecret string) (string, error) { } // NewLongTermAuthHandler returns a turn.AuthAuthHandler used with Long Term (or Time Windowed) Credentials. -// https://tools.ietf.org/search/rfc5389#section-10.2 +// See: https://tools.ietf.org/search/rfc5389#section-10.2 func NewLongTermAuthHandler(sharedSecret string, l logging.LeveledLogger) AuthHandler { if l == nil { l = logging.NewDefaultLoggerFactory().NewLogger("turn") diff --git a/vendor/github.com/pion/turn/v2/relay_address_generator_none.go b/vendor/github.com/pion/turn/v2/relay_address_generator_none.go index f453d0994..3df38135a 100644 --- a/vendor/github.com/pion/turn/v2/relay_address_generator_none.go +++ b/vendor/github.com/pion/turn/v2/relay_address_generator_none.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package turn import ( @@ -46,6 +49,6 @@ func (r *RelayAddressGeneratorNone) AllocatePacketConn(network string, requested } // AllocateConn generates a new Conn to receive traffic on and the IP/Port to populate the allocation response with -func (r *RelayAddressGeneratorNone) AllocateConn(network string, requestedPort int) (net.Conn, net.Addr, error) { +func (r *RelayAddressGeneratorNone) AllocateConn(string, int) (net.Conn, net.Addr, error) { return nil, nil, errTODO } diff --git a/vendor/github.com/pion/turn/v2/relay_address_generator_range.go b/vendor/github.com/pion/turn/v2/relay_address_generator_range.go index 48a0f2bbc..9df62ccad 100644 --- a/vendor/github.com/pion/turn/v2/relay_address_generator_range.go +++ b/vendor/github.com/pion/turn/v2/relay_address_generator_range.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package turn import ( @@ -100,6 +103,6 @@ func (r *RelayAddressGeneratorPortRange) AllocatePacketConn(network string, requ } // AllocateConn generates a new Conn to receive traffic on and the IP/Port to populate the allocation response with -func (r *RelayAddressGeneratorPortRange) AllocateConn(network string, requestedPort int) (net.Conn, net.Addr, error) { +func (r *RelayAddressGeneratorPortRange) AllocateConn(string, int) (net.Conn, net.Addr, error) { return nil, nil, errTODO } diff --git a/vendor/github.com/pion/turn/v2/relay_address_generator_static.go b/vendor/github.com/pion/turn/v2/relay_address_generator_static.go index ba2be9fd3..6988714e0 100644 --- a/vendor/github.com/pion/turn/v2/relay_address_generator_static.go +++ b/vendor/github.com/pion/turn/v2/relay_address_generator_static.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package turn import ( @@ -60,6 +63,6 @@ func (r *RelayAddressGeneratorStatic) AllocatePacketConn(network string, request } // AllocateConn generates a new Conn to receive traffic on and the IP/Port to populate the allocation response with -func (r *RelayAddressGeneratorStatic) AllocateConn(network string, requestedPort int) (net.Conn, net.Addr, error) { +func (r *RelayAddressGeneratorStatic) AllocateConn(string, int) (net.Conn, net.Addr, error) { return nil, nil, errTODO } diff --git a/vendor/github.com/pion/turn/v2/server.go b/vendor/github.com/pion/turn/v2/server.go index 3f57f9db0..ea8e04de5 100644 --- a/vendor/github.com/pion/turn/v2/server.go +++ b/vendor/github.com/pion/turn/v2/server.go @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + // Package turn contains the public API for pion/turn, a toolkit for building TURN clients and servers package turn import ( + "errors" "fmt" "net" - "sync" "time" "github.com/pion/logging" @@ -23,7 +26,7 @@ type Server struct { authHandler AuthHandler realm string channelBindTimeout time.Duration - nonces *sync.Map + nonceHash *server.NonceHash packetConnConfigs []PacketConnConfig listenerConfigs []ListenerConfig @@ -49,6 +52,11 @@ func NewServer(config ServerConfig) (*Server, error) { mtu = config.InboundMTU } + nonceHash, err := server.NewNonceHash() + if err != nil { + return nil, err + } + s := &Server{ log: loggerFactory.NewLogger("turn"), authHandler: config.AuthHandler, @@ -56,7 +64,7 @@ func NewServer(config ServerConfig) (*Server, error) { channelBindTimeout: config.ChannelBindTimeout, packetConnConfigs: config.PacketConnConfigs, listenerConfigs: config.ListenerConfigs, - nonces: &sync.Map{}, + nonceHash: nonceHash, inboundMTU: mtu, } @@ -70,7 +78,13 @@ func NewServer(config ServerConfig) (*Server, error) { return nil, fmt.Errorf("failed to create AllocationManager: %w", err) } - go s.readPacketConn(cfg, am) + go func(cfg PacketConnConfig, am *allocation.Manager) { + s.readLoop(cfg.PacketConn, am) + + if err := am.Close(); err != nil { + s.log.Errorf("Failed to close AllocationManager: %s", err) + } + }(cfg, am) } for _, cfg := range s.listenerConfigs { @@ -79,7 +93,13 @@ func NewServer(config ServerConfig) (*Server, error) { return nil, fmt.Errorf("failed to create AllocationManager: %w", err) } - go s.readListener(cfg, am) + go func(cfg ListenerConfig, am *allocation.Manager) { + s.readListener(cfg.Listener, am) + + if err := am.Close(); err != nil { + s.log.Errorf("Failed to close AllocationManager: %s", err) + } + }(cfg, am) } return s, nil @@ -116,35 +136,27 @@ func (s *Server) Close() error { err := errFailedToClose for _, e := range errors { - err = fmt.Errorf("%s; close error (%w) ", err, e) + err = fmt.Errorf("%s; close error (%w) ", err, e) //nolint:errorlint } return err } -func (s *Server) readPacketConn(p PacketConnConfig, am *allocation.Manager) { - s.readLoop(p.PacketConn, am) - - if err := am.Close(); err != nil { - s.log.Errorf("Failed to close AllocationManager: %s", err) - } -} - -func (s *Server) readListener(l ListenerConfig, am *allocation.Manager) { - defer func() { - if err := am.Close(); err != nil { - s.log.Errorf("Failed to close AllocationManager: %s", err) - } - }() - +func (s *Server) readListener(l net.Listener, am *allocation.Manager) { for { - conn, err := l.Listener.Accept() + conn, err := l.Accept() if err != nil { s.log.Debugf("Failed to accept: %s", err) return } - go s.readLoop(NewSTUNConn(conn), am) + go func() { + s.readLoop(NewSTUNConn(conn), am) + + if err := conn.Close(); err != nil && !errors.Is(err, net.ErrClosed) { + s.log.Errorf("Failed to close conn: %s", err) + } + }() } } @@ -174,10 +186,11 @@ func (s *Server) readLoop(p net.PacketConn, allocationManager *allocation.Manage n, addr, err := p.ReadFrom(buf) switch { case err != nil: - s.log.Debugf("exit read loop on error: %s", err.Error()) + s.log.Debugf("Exit read loop on error: %s", err) return case n >= s.inboundMTU: s.log.Debugf("Read bytes exceeded MTU, packet is possibly truncated") + continue } if err := server.HandleRequest(server.Request{ @@ -189,9 +202,9 @@ func (s *Server) readLoop(p net.PacketConn, allocationManager *allocation.Manage Realm: s.realm, AllocationManager: allocationManager, ChannelBindTimeout: s.channelBindTimeout, - Nonces: s.nonces, + NonceHash: s.nonceHash, }); err != nil { - s.log.Errorf("error when handling datagram: %v", err) + s.log.Errorf("Failed to handle datagram: %v", err) } } } diff --git a/vendor/github.com/pion/turn/v2/server_config.go b/vendor/github.com/pion/turn/v2/server_config.go index 5487900db..ee808fe93 100644 --- a/vendor/github.com/pion/turn/v2/server_config.go +++ b/vendor/github.com/pion/turn/v2/server_config.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package turn import ( @@ -32,7 +35,7 @@ type RelayAddressGenerator interface { type PermissionHandler func(clientAddr net.Addr, peerIP net.IP) (ok bool) // DefaultPermissionHandler is convince function that grants permission to all peers -func DefaultPermissionHandler(clientAddr net.Addr, peerIP net.IP) (ok bool) { +func DefaultPermissionHandler(net.Addr, net.IP) (ok bool) { return true } diff --git a/vendor/github.com/pion/turn/v2/stun_conn.go b/vendor/github.com/pion/turn/v2/stun_conn.go index ca911ee4c..cb062f815 100644 --- a/vendor/github.com/pion/turn/v2/stun_conn.go +++ b/vendor/github.com/pion/turn/v2/stun_conn.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + package turn import ( @@ -89,7 +92,7 @@ func (s *STUNConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) { } // WriteTo implements WriteTo from net.PacketConn -func (s *STUNConn) WriteTo(p []byte, addr net.Addr) (n int, err error) { +func (s *STUNConn) WriteTo(p []byte, _ net.Addr) (n int, err error) { return s.nextConn.Write(p) } diff --git a/vendor/github.com/pion/webrtc/v3/AUTHORS.txt b/vendor/github.com/pion/webrtc/v3/AUTHORS.txt index 4ebd9a22f..799ddfc2b 100644 --- a/vendor/github.com/pion/webrtc/v3/AUTHORS.txt +++ b/vendor/github.com/pion/webrtc/v3/AUTHORS.txt @@ -12,6 +12,7 @@ Adrian Cable adwpc aggresss akil +Aleksandr Alekseev Aleksandr Razumov aler9 <46489434+aler9@users.noreply.github.com> Alex Browne @@ -51,6 +52,7 @@ Clayton McCray cnderrauber cyannuk Daniele Sluijters +David David Hamilton David Zhao David Zhao @@ -59,11 +61,13 @@ Dean Sheather decanus <7621705+decanus@users.noreply.github.com> Denis digitalix +do-hyung-kim donotanswer earle Egon Elbre Eric Daniels Eric Fontaine +Evan Sonderegger feixiao Forest Johnson frank @@ -71,7 +75,10 @@ funvit Gabor Pongracz Gareth Hayes Guilherme +Guillaume Denis Hanjun Kim +Hans Gylling +Hao Hendrik Hofstadt Henry Hongchao Ma @@ -99,11 +106,14 @@ juberti Juliusz Chroboczek Justin Okamoto Justin Okamoto +Kevin Kevin Staunton-Lambert Kevin Wang Konstantin Chugalinskiy Konstantin Itskov krishna chiatanya +Kunal +Kunal Singh Kuzmin Vladimir lawl Len @@ -133,6 +143,7 @@ mr-shitij <21.shitijagrawal@gmail.com> mxmCherry Nam V. Do Nick Mykins +Nicolas Menard nindolabs <6729798+nindolabs@users.noreply.github.com> Norman Rasmussen notedit @@ -165,14 +176,17 @@ ronan Ryan Shumate salmān aljammāz Sam Lancia +Sean Sean DuBois Sean DuBois Sean DuBois +Sean DuBois Sean DuBois Sean DuBois Sean Knight Sebastian Waisbrot Sidney San Martín +Simon Cousineau Simon Eisenmann simonacca-fotokite <47634061+simonacca-fotokite@users.noreply.github.com> Simone Gotti @@ -206,6 +220,7 @@ Yuki Igarashi yusuke Yutaka Takeda ZHENK +zhngs zigazeljko Štefan Uram 박종훈 diff --git a/vendor/github.com/pion/webrtc/v3/constants.go b/vendor/github.com/pion/webrtc/v3/constants.go index 94ba78494..c8ebb7bf5 100644 --- a/vendor/github.com/pion/webrtc/v3/constants.go +++ b/vendor/github.com/pion/webrtc/v3/constants.go @@ -27,6 +27,8 @@ const ( sdpAttributeRid = "rid" + sdpAttributeSimulcast = "simulcast" + rtpOutboundMTU = 1200 rtpPayloadTypeBitmask = 0x7F @@ -36,6 +38,13 @@ const ( generatedCertificateOrigin = "WebRTC" sdesRepairRTPStreamIDURI = "urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id" + + // AttributeRtxPayloadType is the interceptor attribute added when Read() returns an RTX packet containing the RTX stream payload type + AttributeRtxPayloadType = "rtx_payload_type" + // AttributeRtxSsrc is the interceptor attribute added when Read() returns an RTX packet containing the RTX stream SSRC + AttributeRtxSsrc = "rtx_ssrc" + // AttributeRtxSequenceNumber is the interceptor attribute added when Read() returns an RTX packet containing the RTX stream sequence number + AttributeRtxSequenceNumber = "rtx_sequence_number" ) func defaultSrtpProtectionProfiles() []dtls.SRTPProtectionProfile { diff --git a/vendor/github.com/pion/webrtc/v3/datachannel.go b/vendor/github.com/pion/webrtc/v3/datachannel.go index 9c9154c8c..f7c9511b3 100644 --- a/vendor/github.com/pion/webrtc/v3/datachannel.go +++ b/vendor/github.com/pion/webrtc/v3/datachannel.go @@ -303,6 +303,8 @@ func (d *DataChannel) onMessage(msg DataChannelMessage) { func (d *DataChannel) handleOpen(dc *datachannel.DataChannel, isRemote, isAlreadyNegotiated bool) { d.mu.Lock() d.dataChannel = dc + bufferedAmountLowThreshold := d.bufferedAmountLowThreshold + onBufferedAmountLow := d.onBufferedAmountLow d.mu.Unlock() d.setReadyState(DataChannelStateOpen) @@ -312,8 +314,8 @@ func (d *DataChannel) handleOpen(dc *datachannel.DataChannel, isRemote, isAlread // * already negotiated datachannels should fire OnOpened if d.api.settingEngine.detach.DataChannels || isRemote || isAlreadyNegotiated { // bufferedAmountLowThreshold and onBufferedAmountLow might be set earlier - d.dataChannel.SetBufferedAmountLowThreshold(d.bufferedAmountLowThreshold) - d.dataChannel.OnBufferedAmountLow(d.onBufferedAmountLow) + d.dataChannel.SetBufferedAmountLowThreshold(bufferedAmountLowThreshold) + d.dataChannel.OnBufferedAmountLow(onBufferedAmountLow) d.onOpen() } else { dc.OnOpen(func() { diff --git a/vendor/github.com/pion/webrtc/v3/datachannelstate.go b/vendor/github.com/pion/webrtc/v3/datachannelstate.go index b2a85aaeb..55dc916e9 100644 --- a/vendor/github.com/pion/webrtc/v3/datachannelstate.go +++ b/vendor/github.com/pion/webrtc/v3/datachannelstate.go @@ -62,3 +62,14 @@ func (t DataChannelState) String() string { return ErrUnknownType.Error() } } + +// MarshalText implements encoding.TextMarshaler +func (t DataChannelState) MarshalText() ([]byte, error) { + return []byte(t.String()), nil +} + +// UnmarshalText implements encoding.TextUnmarshaler +func (t *DataChannelState) UnmarshalText(b []byte) error { + *t = newDataChannelState(string(b)) + return nil +} diff --git a/vendor/github.com/pion/webrtc/v3/dtlstransport.go b/vendor/github.com/pion/webrtc/v3/dtlstransport.go index df3472cf2..0267ca591 100644 --- a/vendor/github.com/pion/webrtc/v3/dtlstransport.go +++ b/vendor/github.com/pion/webrtc/v3/dtlstransport.go @@ -342,6 +342,7 @@ func (t *DTLSTransport) Start(remoteParameters DTLSParameters) error { dtlsConfig.ExtendedMasterSecret = t.api.settingEngine.dtls.extendedMasterSecret dtlsConfig.ClientCAs = t.api.settingEngine.dtls.clientCAs dtlsConfig.RootCAs = t.api.settingEngine.dtls.rootCAs + dtlsConfig.KeyLogWriter = t.api.settingEngine.dtls.keyLogWriter // Connect as DTLS Client/Server, function is blocking and we // must not hold the DTLSTransport lock @@ -504,7 +505,7 @@ func (t *DTLSTransport) streamsForSSRC(ssrc SSRC, streamInfo interceptor.StreamI return nil, nil, nil, nil, err } - rtcpInterceptor := t.api.interceptor.BindRTCPReader(interceptor.RTPReaderFunc(func(in []byte, a interceptor.Attributes) (n int, attributes interceptor.Attributes, err error) { + rtcpInterceptor := t.api.interceptor.BindRTCPReader(interceptor.RTCPReaderFunc(func(in []byte, a interceptor.Attributes) (n int, attributes interceptor.Attributes, err error) { n, err = rtcpReadStream.Read(in) return n, a, err })) diff --git a/vendor/github.com/pion/webrtc/v3/dtlstransportstate.go b/vendor/github.com/pion/webrtc/v3/dtlstransportstate.go index f986e22cb..573dd4bf0 100644 --- a/vendor/github.com/pion/webrtc/v3/dtlstransportstate.go +++ b/vendor/github.com/pion/webrtc/v3/dtlstransportstate.go @@ -72,3 +72,14 @@ func (t DTLSTransportState) String() string { return ErrUnknownType.Error() } } + +// MarshalText implements encoding.TextMarshaler +func (t DTLSTransportState) MarshalText() ([]byte, error) { + return []byte(t.String()), nil +} + +// UnmarshalText implements encoding.TextUnmarshaler +func (t *DTLSTransportState) UnmarshalText(b []byte) error { + *t = newDTLSTransportState(string(b)) + return nil +} diff --git a/vendor/github.com/pion/webrtc/v3/icecandidatetype.go b/vendor/github.com/pion/webrtc/v3/icecandidatetype.go index a274c45db..5bef825b3 100644 --- a/vendor/github.com/pion/webrtc/v3/icecandidatetype.go +++ b/vendor/github.com/pion/webrtc/v3/icecandidatetype.go @@ -95,3 +95,15 @@ func getCandidateType(candidateType ice.CandidateType) (ICECandidateType, error) return ICECandidateType(Unknown), err } } + +// MarshalText implements the encoding.TextMarshaler interface. +func (t ICECandidateType) MarshalText() ([]byte, error) { + return []byte(t.String()), nil +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface. +func (t *ICECandidateType) UnmarshalText(b []byte) error { + var err error + *t, err = NewICECandidateType(string(b)) + return err +} diff --git a/vendor/github.com/pion/webrtc/v3/icegatherer.go b/vendor/github.com/pion/webrtc/v3/icegatherer.go index cf12b4206..d01ecc134 100644 --- a/vendor/github.com/pion/webrtc/v3/icegatherer.go +++ b/vendor/github.com/pion/webrtc/v3/icegatherer.go @@ -121,6 +121,8 @@ func (g *ICEGatherer) createAgent() error { TCPMux: g.api.settingEngine.iceTCPMux, UDPMux: g.api.settingEngine.iceUDPMux, ProxyDialer: g.api.settingEngine.iceProxyDialer, + DisableActiveTCP: g.api.settingEngine.iceDisableActiveTCP, + BindingRequestHandler: g.api.settingEngine.iceBindingRequestHandler, } requestedNetworkTypes := g.api.settingEngine.candidates.ICENetworkTypes @@ -346,7 +348,6 @@ func (g *ICEGatherer) collectStats(collector *statsReportCollector) { Timestamp: statsTimestampFrom(candidateStats.Timestamp), ID: candidateStats.ID, Type: StatsTypeLocalCandidate, - NetworkType: networkType, IP: candidateStats.IP, Port: int32(candidateStats.Port), Protocol: networkType.Protocol(), @@ -375,7 +376,6 @@ func (g *ICEGatherer) collectStats(collector *statsReportCollector) { Timestamp: statsTimestampFrom(candidateStats.Timestamp), ID: candidateStats.ID, Type: StatsTypeRemoteCandidate, - NetworkType: networkType, IP: candidateStats.IP, Port: int32(candidateStats.Port), Protocol: networkType.Protocol(), diff --git a/vendor/github.com/pion/webrtc/v3/icerole.go b/vendor/github.com/pion/webrtc/v3/icerole.go index 99268bace..a46b45590 100644 --- a/vendor/github.com/pion/webrtc/v3/icerole.go +++ b/vendor/github.com/pion/webrtc/v3/icerole.go @@ -46,3 +46,14 @@ func (t ICERole) String() string { return ErrUnknownType.Error() } } + +// MarshalText implements encoding.TextMarshaler +func (t ICERole) MarshalText() ([]byte, error) { + return []byte(t.String()), nil +} + +// UnmarshalText implements encoding.TextUnmarshaler +func (t *ICERole) UnmarshalText(b []byte) error { + *t = newICERole(string(b)) + return nil +} diff --git a/vendor/github.com/pion/webrtc/v3/icetransport.go b/vendor/github.com/pion/webrtc/v3/icetransport.go index f3b6925c8..469aafbd4 100644 --- a/vendor/github.com/pion/webrtc/v3/icetransport.go +++ b/vendor/github.com/pion/webrtc/v3/icetransport.go @@ -303,6 +303,16 @@ func (t *ICETransport) State() ICETransportState { return ICETransportState(0) } +// GetLocalParameters returns an IceParameters object which provides information +// uniquely identifying the local peer for the duration of the ICE session. +func (t *ICETransport) GetLocalParameters() (ICEParameters, error) { + if err := t.ensureGatherer(); err != nil { + return ICEParameters{}, err + } + + return t.gatherer.GetLocalParameters() +} + func (t *ICETransport) setState(i ICETransportState) { t.state.Store(i) } diff --git a/vendor/github.com/pion/webrtc/v3/mediaengine.go b/vendor/github.com/pion/webrtc/v3/mediaengine.go index c824d1ed4..7abb8c3a7 100644 --- a/vendor/github.com/pion/webrtc/v3/mediaengine.go +++ b/vendor/github.com/pion/webrtc/v3/mediaengine.go @@ -110,48 +110,30 @@ func (m *MediaEngine) RegisterDefaultCodecs() error { PayloadType: 97, }, - { - RTPCodecCapability: RTPCodecCapability{MimeTypeVP9, 90000, 0, "profile-id=0", videoRTCPFeedback}, - PayloadType: 98, - }, - { - RTPCodecCapability: RTPCodecCapability{"video/rtx", 90000, 0, "apt=98", nil}, - PayloadType: 99, - }, - - { - RTPCodecCapability: RTPCodecCapability{MimeTypeVP9, 90000, 0, "profile-id=1", videoRTCPFeedback}, - PayloadType: 100, - }, - { - RTPCodecCapability: RTPCodecCapability{"video/rtx", 90000, 0, "apt=100", nil}, - PayloadType: 101, - }, - { RTPCodecCapability: RTPCodecCapability{MimeTypeH264, 90000, 0, "level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f", videoRTCPFeedback}, PayloadType: 102, }, { RTPCodecCapability: RTPCodecCapability{"video/rtx", 90000, 0, "apt=102", nil}, - PayloadType: 121, + PayloadType: 103, }, { RTPCodecCapability: RTPCodecCapability{MimeTypeH264, 90000, 0, "level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f", videoRTCPFeedback}, - PayloadType: 127, + PayloadType: 104, }, { - RTPCodecCapability: RTPCodecCapability{"video/rtx", 90000, 0, "apt=127", nil}, - PayloadType: 120, + RTPCodecCapability: RTPCodecCapability{"video/rtx", 90000, 0, "apt=104", nil}, + PayloadType: 105, }, { RTPCodecCapability: RTPCodecCapability{MimeTypeH264, 90000, 0, "level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f", videoRTCPFeedback}, - PayloadType: 125, + PayloadType: 106, }, { - RTPCodecCapability: RTPCodecCapability{"video/rtx", 90000, 0, "apt=125", nil}, + RTPCodecCapability: RTPCodecCapability{"video/rtx", 90000, 0, "apt=106", nil}, PayloadType: 107, }, @@ -165,26 +147,57 @@ func (m *MediaEngine) RegisterDefaultCodecs() error { }, { - RTPCodecCapability: RTPCodecCapability{MimeTypeH264, 90000, 0, "level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f", videoRTCPFeedback}, + RTPCodecCapability: RTPCodecCapability{MimeTypeH264, 90000, 0, "level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d001f", videoRTCPFeedback}, PayloadType: 127, }, { RTPCodecCapability: RTPCodecCapability{"video/rtx", 90000, 0, "apt=127", nil}, - PayloadType: 120, + PayloadType: 125, }, { - RTPCodecCapability: RTPCodecCapability{MimeTypeH264, 90000, 0, "level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640032", videoRTCPFeedback}, - PayloadType: 123, + RTPCodecCapability: RTPCodecCapability{MimeTypeH264, 90000, 0, "level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=4d001f", videoRTCPFeedback}, + PayloadType: 39, }, { - RTPCodecCapability: RTPCodecCapability{"video/rtx", 90000, 0, "apt=123", nil}, - PayloadType: 118, + RTPCodecCapability: RTPCodecCapability{"video/rtx", 90000, 0, "apt=39", nil}, + PayloadType: 40, }, { - RTPCodecCapability: RTPCodecCapability{"video/ulpfec", 90000, 0, "", nil}, - PayloadType: 116, + RTPCodecCapability: RTPCodecCapability{MimeTypeAV1, 90000, 0, "", videoRTCPFeedback}, + PayloadType: 45, + }, + { + RTPCodecCapability: RTPCodecCapability{"video/rtx", 90000, 0, "apt=45", nil}, + PayloadType: 46, + }, + + { + RTPCodecCapability: RTPCodecCapability{MimeTypeVP9, 90000, 0, "profile-id=0", videoRTCPFeedback}, + PayloadType: 98, + }, + { + RTPCodecCapability: RTPCodecCapability{"video/rtx", 90000, 0, "apt=98", nil}, + PayloadType: 99, + }, + + { + RTPCodecCapability: RTPCodecCapability{MimeTypeVP9, 90000, 0, "profile-id=2", videoRTCPFeedback}, + PayloadType: 100, + }, + { + RTPCodecCapability: RTPCodecCapability{"video/rtx", 90000, 0, "apt=100", nil}, + PayloadType: 101, + }, + + { + RTPCodecCapability: RTPCodecCapability{MimeTypeH264, 90000, 0, "level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=64001f", videoRTCPFeedback}, + PayloadType: 112, + }, + { + RTPCodecCapability: RTPCodecCapability{"video/rtx", 90000, 0, "apt=112", nil}, + PayloadType: 113, }, } { if err := m.RegisterCodec(codec, RTPCodecTypeVideo); err != nil { @@ -402,9 +415,11 @@ func (m *MediaEngine) matchRemoteCodec(remoteCodec RTPCodecParameters, typ RTPCo } aptMatch := codecMatchNone + var aptCodec RTPCodecParameters for _, codec := range exactMatches { if codec.PayloadType == PayloadType(payloadType) { aptMatch = codecMatchExact + aptCodec = codec break } } @@ -413,6 +428,7 @@ func (m *MediaEngine) matchRemoteCodec(remoteCodec RTPCodecParameters, typ RTPCo for _, codec := range partialMatches { if codec.PayloadType == PayloadType(payloadType) { aptMatch = codecMatchPartial + aptCodec = codec break } } @@ -422,8 +438,14 @@ func (m *MediaEngine) matchRemoteCodec(remoteCodec RTPCodecParameters, typ RTPCo return codecMatchNone, nil // not an error, we just ignore this codec we don't support } + // replace the apt value with the original codec's payload type + toMatchCodec := remoteCodec + if aptMatched, mt := codecParametersFuzzySearch(aptCodec, codecs); mt == aptMatch { + toMatchCodec.SDPFmtpLine = strings.Replace(toMatchCodec.SDPFmtpLine, fmt.Sprintf("apt=%d", payloadType), fmt.Sprintf("apt=%d", aptMatched.PayloadType), 1) + } + // if apt's media codec is partial match, then apt codec must be partial match too - _, matchType := codecParametersFuzzySearch(remoteCodec, codecs) + _, matchType := codecParametersFuzzySearch(toMatchCodec, codecs) if matchType == codecMatchExact && aptMatch == codecMatchPartial { matchType = codecMatchPartial } diff --git a/vendor/github.com/pion/webrtc/v3/peerconnection.go b/vendor/github.com/pion/webrtc/v3/peerconnection.go index b3c0ef427..1f0a7d159 100644 --- a/vendor/github.com/pion/webrtc/v3/peerconnection.go +++ b/vendor/github.com/pion/webrtc/v3/peerconnection.go @@ -826,7 +826,7 @@ func (pc *PeerConnection) CreateAnswer(*AnswerOptions) (SessionDescription, erro if connectionRole == sdp.ConnectionRole(0) { connectionRole = connectionRoleFromDtlsRole(defaultDtlsRoleAnswer) - // If one of the agents is lite and the other one is not, the lite agent must be the controlling agent. + // If one of the agents is lite and the other one is not, the lite agent must be the controlled agent. // If both or neither agents are lite the offering agent is controlling. // RFC 8445 S6.1.1 if isIceLiteSet(remoteDesc.parsed) && !pc.api.settingEngine.candidates.ICELite { @@ -994,7 +994,7 @@ func (pc *PeerConnection) SetLocalDescription(desc SessionDescription) error { } desc.parsed = &sdp.SessionDescription{} - if err := desc.parsed.Unmarshal([]byte(desc.SDP)); err != nil { + if err := desc.parsed.UnmarshalString(desc.SDP); err != nil { return err } if err := pc.setDescription(&desc, stateChangeOpSetLocal); err != nil { @@ -1039,7 +1039,7 @@ func (pc *PeerConnection) SetRemoteDescription(desc SessionDescription) error { return &rtcerr.InvalidStateError{Err: ErrConnectionClosed} } - isRenegotation := pc.currentRemoteDescription != nil + isRenegotiation := pc.currentRemoteDescription != nil if _, err := desc.Unmarshal(); err != nil { return err @@ -1142,7 +1142,7 @@ func (pc *PeerConnection) SetRemoteDescription(desc SessionDescription) error { return err } - if isRenegotation && pc.iceTransport.haveRemoteCredentialsChange(remoteUfrag, remotePwd) { + if isRenegotiation && pc.iceTransport.haveRemoteCredentialsChange(remoteUfrag, remotePwd) { // An ICE Restart only happens implicitly for a SetRemoteDescription of type offer if !weOffer { if err = pc.iceTransport.restart(); err != nil { @@ -1163,7 +1163,7 @@ func (pc *PeerConnection) SetRemoteDescription(desc SessionDescription) error { currentTransceivers := append([]*RTPTransceiver{}, pc.GetTransceivers()...) - if isRenegotation { + if isRenegotiation { if weOffer { _ = setRTPTransceiverCurrentDirection(&desc, currentTransceivers, true) if err = pc.startRTPSenders(currentTransceivers); err != nil { @@ -1185,7 +1185,7 @@ func (pc *PeerConnection) SetRemoteDescription(desc SessionDescription) error { } iceRole := ICERoleControlled - // If one of the agents is lite and the other one is not, the lite agent must be the controlling agent. + // If one of the agents is lite and the other one is not, the lite agent must be the controlled agent. // If both or neither agents are lite the offering agent is controlling. // RFC 8445 S6.1.1 if (weOffer && remoteIsLite == pc.api.settingEngine.candidates.ICELite) || (remoteIsLite && !pc.api.settingEngine.candidates.ICELite) { @@ -1576,12 +1576,11 @@ func (pc *PeerConnection) handleIncomingSSRC(rtpStream io.Reader, ssrc SSRC) err return err } - var mid, rid, rsid string - payloadType, err := handleUnknownRTPPacket(b[:i], uint8(midExtensionID), uint8(streamIDExtensionID), uint8(repairStreamIDExtensionID), &mid, &rid, &rsid) - if err != nil { - return err + if i < 4 { + return errRTPTooShort } + payloadType := PayloadType(b[1] & 0x7f) params, err := pc.api.mediaEngine.getRTPParametersByPayloadType(payloadType) if err != nil { return err @@ -1593,14 +1592,21 @@ func (pc *PeerConnection) handleIncomingSSRC(rtpStream io.Reader, ssrc SSRC) err return err } + var mid, rid, rsid string + var paddingOnly bool for readCount := 0; readCount <= simulcastProbeCount; readCount++ { if mid == "" || (rid == "" && rsid == "") { + // skip padding only packets for probing + if paddingOnly { + readCount-- + } + i, _, err := interceptor.Read(b, nil) if err != nil { return err } - if _, err = handleUnknownRTPPacket(b[:i], uint8(midExtensionID), uint8(streamIDExtensionID), uint8(repairStreamIDExtensionID), &mid, &rid, &rsid); err != nil { + if _, paddingOnly, err = handleUnknownRTPPacket(b[:i], uint8(midExtensionID), uint8(streamIDExtensionID), uint8(repairStreamIDExtensionID), &mid, &rid, &rsid); err != nil { return err } @@ -1660,17 +1666,17 @@ func (pc *PeerConnection) undeclaredRTPMediaProcessor() { continue } + pc.dtlsTransport.storeSimulcastStream(stream) + if atomic.AddUint64(&simulcastRoutineCount, 1) >= simulcastMaxProbeRoutines { atomic.AddUint64(&simulcastRoutineCount, ^uint64(0)) pc.log.Warn(ErrSimulcastProbeOverflow.Error()) - pc.dtlsTransport.storeSimulcastStream(stream) continue } go func(rtpStream io.Reader, ssrc SSRC) { if err := pc.handleIncomingSSRC(rtpStream, ssrc); err != nil { pc.log.Errorf(incomingUnhandledRTPSsrc, ssrc, err) - pc.dtlsTransport.storeSimulcastStream(stream) } atomic.AddUint64(&simulcastRoutineCount, ^uint64(0)) }(stream, SSRC(ssrc)) @@ -2292,6 +2298,7 @@ func (pc *PeerConnection) generateUnmatchedSDP(transceivers []*RTPTransceiver, u if err != nil { return nil, err } + d.Attributes = append(d.Attributes, sdp.Attribute{Key: sdp.AttrKeyMsidSemantic, Value: "WMS*"}) iceParams, err := pc.iceGatherer.GetLocalParameters() if err != nil { @@ -2353,7 +2360,7 @@ func (pc *PeerConnection) generateUnmatchedSDP(transceivers []*RTPTransceiver, u return nil, err } - return populateSDP(d, isPlanB, dtlsFingerprints, pc.api.settingEngine.sdpMediaLevelFingerprints, pc.api.settingEngine.candidates.ICELite, true, pc.api.mediaEngine, connectionRoleFromDtlsRole(defaultDtlsRoleOffer), candidates, iceParams, mediaSections, pc.ICEGatheringState()) + return populateSDP(d, isPlanB, dtlsFingerprints, pc.api.settingEngine.sdpMediaLevelFingerprints, pc.api.settingEngine.candidates.ICELite, true, pc.api.mediaEngine, connectionRoleFromDtlsRole(defaultDtlsRoleOffer), candidates, iceParams, mediaSections, pc.ICEGatheringState(), nil) } // generateMatchedSDP generates a SDP and takes the remote state into account @@ -2364,6 +2371,7 @@ func (pc *PeerConnection) generateMatchedSDP(transceivers []*RTPTransceiver, use if err != nil { return nil, err } + d.Attributes = append(d.Attributes, sdp.Attribute{Key: sdp.AttrKeyMsidSemantic, Value: "WMS*"}) iceParams, err := pc.iceGatherer.GetLocalParameters() if err != nil { @@ -2451,6 +2459,7 @@ func (pc *PeerConnection) generateMatchedSDP(transceivers []*RTPTransceiver, use } } + var bundleGroup *string // If we are offering also include unmatched local transceivers if includeUnmatched { if !detectedPlanB { @@ -2469,6 +2478,10 @@ func (pc *PeerConnection) generateMatchedSDP(transceivers []*RTPTransceiver, use mediaSections = append(mediaSections, mediaSection{id: strconv.Itoa(len(mediaSections)), data: true}) } } + } else if remoteDescription != nil { + groupValue, _ := remoteDescription.parsed.Attribute(sdp.AttrKeyGroup) + groupValue = strings.TrimLeft(groupValue, "BUNDLE") + bundleGroup = &groupValue } if pc.configuration.SDPSemantics == SDPSemanticsUnifiedPlanWithFallback && detectedPlanB { @@ -2480,7 +2493,7 @@ func (pc *PeerConnection) generateMatchedSDP(transceivers []*RTPTransceiver, use return nil, err } - return populateSDP(d, detectedPlanB, dtlsFingerprints, pc.api.settingEngine.sdpMediaLevelFingerprints, pc.api.settingEngine.candidates.ICELite, isExtmapAllowMixed, pc.api.mediaEngine, connectionRole, candidates, iceParams, mediaSections, pc.ICEGatheringState()) + return populateSDP(d, detectedPlanB, dtlsFingerprints, pc.api.settingEngine.sdpMediaLevelFingerprints, pc.api.settingEngine.candidates.ICELite, isExtmapAllowMixed, pc.api.mediaEngine, connectionRole, candidates, iceParams, mediaSections, pc.ICEGatheringState(), bundleGroup) } func (pc *PeerConnection) setGatherCompleteHandler(handler func()) { diff --git a/vendor/github.com/pion/webrtc/v3/pkg/media/media.go b/vendor/github.com/pion/webrtc/v3/pkg/media/media.go index 2ed5573f8..386e65de3 100644 --- a/vendor/github.com/pion/webrtc/v3/pkg/media/media.go +++ b/vendor/github.com/pion/webrtc/v3/pkg/media/media.go @@ -17,6 +17,7 @@ type Sample struct { Duration time.Duration PacketTimestamp uint32 PrevDroppedPackets uint16 + Metadata interface{} } // Writer defines an interface to handle diff --git a/vendor/github.com/pion/webrtc/v3/rtpcodec.go b/vendor/github.com/pion/webrtc/v3/rtpcodec.go index 5692d5f56..4b8f81c4e 100644 --- a/vendor/github.com/pion/webrtc/v3/rtpcodec.go +++ b/vendor/github.com/pion/webrtc/v3/rtpcodec.go @@ -24,7 +24,7 @@ const ( func (t RTPCodecType) String() string { switch t { case RTPCodecTypeAudio: - return "audio" + return "audio" //nolint: goconst case RTPCodecTypeVideo: return "video" //nolint: goconst default: diff --git a/vendor/github.com/pion/webrtc/v3/rtpreceiver.go b/vendor/github.com/pion/webrtc/v3/rtpreceiver.go index dac154be6..ec7c79bce 100644 --- a/vendor/github.com/pion/webrtc/v3/rtpreceiver.go +++ b/vendor/github.com/pion/webrtc/v3/rtpreceiver.go @@ -7,6 +7,7 @@ package webrtc import ( + "encoding/binary" "fmt" "io" "sync" @@ -31,13 +32,28 @@ type trackStreams struct { rtcpReadStream *srtp.ReadStreamSRTCP rtcpInterceptor interceptor.RTCPReader - repairReadStream *srtp.ReadStreamSRTP - repairInterceptor interceptor.RTPReader + repairReadStream *srtp.ReadStreamSRTP + repairInterceptor interceptor.RTPReader + repairStreamChannel chan rtxPacketWithAttributes repairRtcpReadStream *srtp.ReadStreamSRTCP repairRtcpInterceptor interceptor.RTCPReader } +type rtxPacketWithAttributes struct { + pkt []byte + attributes interceptor.Attributes + pool *sync.Pool +} + +func (p *rtxPacketWithAttributes) release() { + if p.pkt != nil { + b := p.pkt[:cap(p.pkt)] + p.pool.Put(b) // nolint:staticcheck + p.pkt = nil + } +} + // RTPReceiver allows an application to inspect the receipt of a TrackRemote type RTPReceiver struct { kind RTPCodecType @@ -52,6 +68,8 @@ type RTPReceiver struct { // A reference to the associated api object api *API + + rtxPool sync.Pool } // NewRTPReceiver constructs a new RTPReceiver @@ -67,6 +85,9 @@ func (api *API) NewRTPReceiver(kind RTPCodecType, transport *DTLSTransport) (*RT closed: make(chan interface{}), received: make(chan interface{}), tracks: []trackStreams{}, + rtxPool: sync.Pool{New: func() interface{} { + return make([]byte, api.settingEngine.getReceiveMTU()) + }}, } return r, nil @@ -126,6 +147,15 @@ func (r *RTPReceiver) Tracks() []*TrackRemote { return tracks } +// RTPTransceiver returns the RTPTransceiver this +// RTPReceiver belongs too, or nil if none +func (r *RTPReceiver) RTPTransceiver() *RTPTransceiver { + r.mu.Lock() + defer r.mu.Unlock() + + return r.tr +} + // configureReceive initialize the track func (r *RTPReceiver) configureReceive(parameters RTPReceiveParameters) { r.mu.Lock() @@ -136,6 +166,7 @@ func (r *RTPReceiver) configureReceive(parameters RTPReceiveParameters) { track: newTrackRemote( r.kind, parameters.Encodings[i].SSRC, + parameters.Encodings[i].RTX.SSRC, parameters.Encodings[i].RID, r, ), @@ -370,8 +401,6 @@ func (r *RTPReceiver) receiveForRid(rid string, params RTPParameters, streamInfo } // receiveForRtx starts a routine that processes the repair stream -// These packets aren't exposed to the user yet, but we need to process them for -// TWCC func (r *RTPReceiver) receiveForRtx(ssrc SSRC, rsid string, streamInfo *interceptor.StreamInfo, rtpReadStream *srtp.ReadStreamSRTP, rtpInterceptor interceptor.RTPReader, rtcpReadStream *srtp.ReadStreamSRTCP, rtcpInterceptor interceptor.RTCPReader) error { var track *trackStreams if ssrc != 0 && len(r.tracks) == 1 { @@ -380,6 +409,10 @@ func (r *RTPReceiver) receiveForRtx(ssrc SSRC, rsid string, streamInfo *intercep for i := range r.tracks { if r.tracks[i].track.RID() == rsid { track = &r.tracks[i] + if track.track.RtxSSRC() == 0 { + track.track.setRtxSSRC(SSRC(streamInfo.SSRC)) + } + break } } } @@ -393,13 +426,57 @@ func (r *RTPReceiver) receiveForRtx(ssrc SSRC, rsid string, streamInfo *intercep track.repairInterceptor = rtpInterceptor track.repairRtcpReadStream = rtcpReadStream track.repairRtcpInterceptor = rtcpInterceptor + track.repairStreamChannel = make(chan rtxPacketWithAttributes) go func() { - b := make([]byte, r.api.settingEngine.getReceiveMTU()) for { - if _, _, readErr := track.repairInterceptor.Read(b, nil); readErr != nil { + b := r.rtxPool.Get().([]byte) // nolint:forcetypeassert + i, attributes, err := track.repairInterceptor.Read(b, nil) + if err != nil { + r.rtxPool.Put(b) // nolint:staticcheck return } + + // RTX packets have a different payload format. Move the OSN in the payload to the RTP header and rewrite the + // payload type and SSRC, so that we can return RTX packets to the caller 'transparently' i.e. in the same format + // as non-RTX RTP packets + hasExtension := b[0]&0b10000 > 0 + hasPadding := b[0]&0b100000 > 0 + csrcCount := b[0] & 0b1111 + headerLength := uint16(12 + (4 * csrcCount)) + paddingLength := 0 + if hasExtension { + headerLength += 4 * (1 + binary.BigEndian.Uint16(b[headerLength+2:headerLength+4])) + } + if hasPadding { + paddingLength = int(b[i-1]) + } + + if i-int(headerLength)-paddingLength < 2 { + // BWE probe packet, ignore + r.rtxPool.Put(b) // nolint:staticcheck + continue + } + + if attributes == nil { + attributes = make(interceptor.Attributes) + } + attributes.Set(AttributeRtxPayloadType, b[1]&0x7F) + attributes.Set(AttributeRtxSequenceNumber, binary.BigEndian.Uint16(b[2:4])) + attributes.Set(AttributeRtxSsrc, binary.BigEndian.Uint32(b[8:12])) + + b[1] = (b[1] & 0x80) | uint8(track.track.PayloadType()) + b[2] = b[headerLength] + b[3] = b[headerLength+1] + binary.BigEndian.PutUint32(b[8:12], uint32(track.track.SSRC())) + copy(b[headerLength:i-2], b[headerLength+2:i]) + + select { + case <-r.closed: + r.rtxPool.Put(b) // nolint:staticcheck + return + case track.repairStreamChannel <- rtxPacketWithAttributes{pkt: b[:i-2], attributes: attributes, pool: &r.rtxPool}: + } } }() return nil @@ -437,3 +514,25 @@ func (r *RTPReceiver) setRTPReadDeadline(deadline time.Time, reader *TrackRemote } return fmt.Errorf("%w: %d", errRTPReceiverWithSSRCTrackStreamNotFound, reader.SSRC()) } + +// readRTX returns an RTX packet if one is available on the RTX track, otherwise returns nil +func (r *RTPReceiver) readRTX(reader *TrackRemote) *rtxPacketWithAttributes { + if !reader.HasRTX() { + return nil + } + + select { + case <-r.received: + default: + return nil + } + + if t := r.streamsForTrack(reader); t != nil { + select { + case rtxPacketReceived := <-t.repairStreamChannel: + return &rtxPacketReceived + default: + } + } + return nil +} diff --git a/vendor/github.com/pion/webrtc/v3/rtpsender.go b/vendor/github.com/pion/webrtc/v3/rtpsender.go index 49ae4e82e..0c0e867ec 100644 --- a/vendor/github.com/pion/webrtc/v3/rtpsender.go +++ b/vendor/github.com/pion/webrtc/v3/rtpsender.go @@ -27,7 +27,7 @@ type trackEncoding struct { rtcpInterceptor interceptor.RTCPReader streamInfo interceptor.StreamInfo - context TrackLocalContext + context *baseTrackLocalContext ssrc SSRC } @@ -204,7 +204,7 @@ func (r *RTPSender) addEncoding(track TrackLocal) { } trackEncoding.srtpStream.rtpSender = r trackEncoding.rtcpInterceptor = r.api.interceptor.BindRTCPReader( - interceptor.RTPReaderFunc(func(in []byte, a interceptor.Attributes) (n int, attributes interceptor.Attributes, err error) { + interceptor.RTCPReaderFunc(func(in []byte, a interceptor.Attributes) (n int, attributes interceptor.Attributes, err error) { n, err = trackEncoding.srtpStream.Read(in) return n, a, err }), @@ -242,32 +242,37 @@ func (r *RTPSender) ReplaceTrack(track TrackLocal) error { } var replacedTrack TrackLocal - var context *TrackLocalContext - if len(r.trackEncodings) != 0 { - replacedTrack = r.trackEncodings[0].track - context = &r.trackEncodings[0].context - } - if r.hasSent() && replacedTrack != nil { - if err := replacedTrack.Unbind(*context); err != nil { - return err + var context *baseTrackLocalContext + for _, e := range r.trackEncodings { + replacedTrack = e.track + context = e.context + + if r.hasSent() && replacedTrack != nil { + if err := replacedTrack.Unbind(context); err != nil { + return err + } + } + + if !r.hasSent() || track == nil { + e.track = track } } if !r.hasSent() || track == nil { - r.trackEncodings[0].track = track return nil } - codec, err := track.Bind(TrackLocalContext{ - id: context.id, + // If we reach this point in the routine, there is only 1 track encoding + codec, err := track.Bind(&baseTrackLocalContext{ + id: context.ID(), params: r.api.mediaEngine.getRTPParametersByKind(track.Kind(), []RTPTransceiverDirection{RTPTransceiverDirectionSendonly}), - ssrc: context.ssrc, - writeStream: context.writeStream, - rtcpInterceptor: context.rtcpInterceptor, + ssrc: context.SSRC(), + writeStream: context.WriteStream(), + rtcpInterceptor: context.RTCPReader(), }) if err != nil { // Re-bind the original track - if _, reBindErr := replacedTrack.Bind(*context); reBindErr != nil { + if _, reBindErr := replacedTrack.Bind(context); reBindErr != nil { return reBindErr } @@ -280,6 +285,7 @@ func (r *RTPSender) ReplaceTrack(track TrackLocal) error { } r.trackEncodings[0].track = track + return nil } @@ -297,7 +303,7 @@ func (r *RTPSender) Send(parameters RTPSendParameters) error { for idx, trackEncoding := range r.trackEncodings { writeStream := &interceptorToTrackLocalWriter{} - trackEncoding.context = TrackLocalContext{ + trackEncoding.context = &baseTrackLocalContext{ id: r.id, params: r.api.mediaEngine.getRTPParametersByKind(trackEncoding.track.Kind(), []RTPTransceiverDirection{RTPTransceiverDirectionSendonly}), ssrc: parameters.Encodings[idx].SSRC, diff --git a/vendor/github.com/pion/webrtc/v3/rtptransceiver.go b/vendor/github.com/pion/webrtc/v3/rtptransceiver.go index 02ddf7924..f601a4102 100644 --- a/vendor/github.com/pion/webrtc/v3/rtptransceiver.go +++ b/vendor/github.com/pion/webrtc/v3/rtptransceiver.go @@ -266,12 +266,16 @@ func satisfyTypeAndDirection(remoteKind RTPCodecType, remoteDirection RTPTransce // handleUnknownRTPPacket consumes a single RTP Packet and returns information that is helpful // for demuxing and handling an unknown SSRC (usually for Simulcast) -func handleUnknownRTPPacket(buf []byte, midExtensionID, streamIDExtensionID, repairStreamIDExtensionID uint8, mid, rid, rsid *string) (payloadType PayloadType, err error) { +func handleUnknownRTPPacket(buf []byte, midExtensionID, streamIDExtensionID, repairStreamIDExtensionID uint8, mid, rid, rsid *string) (payloadType PayloadType, paddingOnly bool, err error) { rp := &rtp.Packet{} if err = rp.Unmarshal(buf); err != nil { return } + if rp.Padding && len(rp.Payload) == 0 { + paddingOnly = true + } + if !rp.Header.Extension { return } diff --git a/vendor/github.com/pion/webrtc/v3/sctptransport.go b/vendor/github.com/pion/webrtc/v3/sctptransport.go index c96fd173f..a468cbc98 100644 --- a/vendor/github.com/pion/webrtc/v3/sctptransport.go +++ b/vendor/github.com/pion/webrtc/v3/sctptransport.go @@ -109,6 +109,7 @@ func (r *SCTPTransport) Start(SCTPCapabilities) error { sctpAssociation, err := sctp.Client(sctp.Config{ NetConn: dtlsTransport.conn, MaxReceiveBufferSize: r.api.settingEngine.sctp.maxReceiveBufferSize, + EnableZeroChecksum: r.api.settingEngine.sctp.enableZeroChecksum, LoggerFactory: r.api.settingEngine.LoggerFactory, }) if err != nil { @@ -362,9 +363,9 @@ func (r *SCTPTransport) State() SCTPTransportState { func (r *SCTPTransport) collectStats(collector *statsReportCollector) { collector.Collecting() - stats := TransportStats{ + stats := SCTPTransportStats{ Timestamp: statsTimestampFrom(time.Now()), - Type: StatsTypeTransport, + Type: StatsTypeSCTPTransport, ID: "sctpTransport", } @@ -372,6 +373,10 @@ func (r *SCTPTransport) collectStats(collector *statsReportCollector) { if association != nil { stats.BytesSent = association.BytesSent() stats.BytesReceived = association.BytesReceived() + stats.SmoothedRoundTripTime = association.SRTT() * 0.001 // convert milliseconds to seconds + stats.CongestionWindow = association.CWND() + stats.ReceiverWindow = association.RWND() + stats.MTU = association.MTU() } collector.Collect(stats.ID, stats) diff --git a/vendor/github.com/pion/webrtc/v3/sdp.go b/vendor/github.com/pion/webrtc/v3/sdp.go index a1c8daaba..560fc7884 100644 --- a/vendor/github.com/pion/webrtc/v3/sdp.go +++ b/vendor/github.com/pion/webrtc/v3/sdp.go @@ -128,6 +128,12 @@ func trackDetailsFromSDP(log logging.LeveledLogger, s *sdp.SessionDescription) ( } rtxRepairFlows[rtxRepairFlow] = baseSsrc tracksInMediaSection = filterTrackWithSSRC(tracksInMediaSection, SSRC(rtxRepairFlow)) // Remove if rtx was added as track before + for i := range tracksInMediaSection { + if tracksInMediaSection[i].ssrcs[0] == SSRC(baseSsrc) { + repairSsrc := SSRC(rtxRepairFlow) + tracksInMediaSection[i].repairSsrc = &repairSsrc + } + } } } @@ -232,12 +238,30 @@ func trackDetailsToRTPReceiveParameters(t *trackDetails) RTPReceiveParameters { return RTPReceiveParameters{Encodings: encodings} } -func getRids(media *sdp.MediaDescription) map[string]string { - rids := map[string]string{} +func getRids(media *sdp.MediaDescription) map[string]*simulcastRid { + rids := map[string]*simulcastRid{} + var simulcastAttr string for _, attr := range media.Attributes { if attr.Key == sdpAttributeRid { split := strings.Split(attr.Value, " ") - rids[split[0]] = attr.Value + rids[split[0]] = &simulcastRid{attrValue: attr.Value} + } else if attr.Key == sdpAttributeSimulcast { + simulcastAttr = attr.Value + } + } + // process paused stream like "a=simulcast:send 1;~2;~3" + if simulcastAttr != "" { + if space := strings.Index(simulcastAttr, " "); space > 0 { + simulcastAttr = simulcastAttr[space+1:] + } + ridStates := strings.Split(simulcastAttr, ";") + for _, ridState := range ridStates { + if ridState[:1] == "~" { + rid := ridState[1:] + if r, ok := rids[rid]; ok { + r.paused = true + } + } } } return rids @@ -379,7 +403,7 @@ func addSenderSDP( sendRids = append(sendRids, encoding.RID) } // Simulcast - media.WithValueAttribute("simulcast", "send "+strings.Join(sendRids, ";")) + media.WithValueAttribute(sdpAttributeSimulcast, "send "+strings.Join(sendRids, ";")) } if !isPlanB { @@ -475,10 +499,13 @@ func addTransceiverSDP( for rid := range mediaSection.ridMap { media.WithValueAttribute(sdpAttributeRid, rid+" recv") + if mediaSection.ridMap[rid].paused { + rid = "~" + rid + } recvRids = append(recvRids, rid) } // Simulcast - media.WithValueAttribute("simulcast", "recv "+strings.Join(recvRids, ";")) + media.WithValueAttribute(sdpAttributeSimulcast, "recv "+strings.Join(recvRids, ";")) } addSenderSDP(mediaSection, isPlanB, media) @@ -500,15 +527,51 @@ func addTransceiverSDP( return true, nil } +type simulcastRid struct { + attrValue string + paused bool +} + type mediaSection struct { id string transceivers []*RTPTransceiver data bool - ridMap map[string]string + ridMap map[string]*simulcastRid +} + +func bundleMatchFromRemote(matchBundleGroup *string) func(mid string) bool { + if matchBundleGroup == nil { + return func(midValue string) bool { + return true + } + } + bundleTags := strings.Split(*matchBundleGroup, " ") + return func(midValue string) bool { + for _, tag := range bundleTags { + if tag == midValue { + return true + } + } + return false + } } // populateSDP serializes a PeerConnections state into an SDP -func populateSDP(d *sdp.SessionDescription, isPlanB bool, dtlsFingerprints []DTLSFingerprint, mediaDescriptionFingerprint bool, isICELite bool, isExtmapAllowMixed bool, mediaEngine *MediaEngine, connectionRole sdp.ConnectionRole, candidates []ICECandidate, iceParams ICEParameters, mediaSections []mediaSection, iceGatheringState ICEGatheringState) (*sdp.SessionDescription, error) { +func populateSDP( + d *sdp.SessionDescription, + isPlanB bool, + dtlsFingerprints []DTLSFingerprint, + mediaDescriptionFingerprint bool, + isICELite bool, + isExtmapAllowMixed bool, + mediaEngine *MediaEngine, + connectionRole sdp.ConnectionRole, + candidates []ICECandidate, + iceParams ICEParameters, + mediaSections []mediaSection, + iceGatheringState ICEGatheringState, + matchBundleGroup *string, +) (*sdp.SessionDescription, error) { var err error mediaDtlsFingerprints := []DTLSFingerprint{} @@ -518,6 +581,8 @@ func populateSDP(d *sdp.SessionDescription, isPlanB bool, dtlsFingerprints []DTL bundleValue := "BUNDLE" bundleCount := 0 + + bundleMatch := bundleMatchFromRemote(matchBundleGroup) appendBundle := func(midValue string) { bundleValue += " " + midValue bundleCount++ @@ -544,7 +609,11 @@ func populateSDP(d *sdp.SessionDescription, isPlanB bool, dtlsFingerprints []DTL } if shouldAddID { - appendBundle(m.id) + if bundleMatch(m.id) { + appendBundle(m.id) + } else { + d.MediaDescriptions[len(d.MediaDescriptions)-1].MediaName.Port = sdp.RangedPort{Value: 0} + } } } @@ -563,7 +632,10 @@ func populateSDP(d *sdp.SessionDescription, isPlanB bool, dtlsFingerprints []DTL d = d.WithPropertyAttribute(sdp.AttrKeyExtMapAllowMixed) } - return d.WithValueAttribute(sdp.AttrKeyGroup, bundleValue), nil + if bundleCount > 0 { + d = d.WithValueAttribute(sdp.AttrKeyGroup, bundleValue) + } + return d, nil } func getMidValue(media *sdp.MediaDescription) string { diff --git a/vendor/github.com/pion/webrtc/v3/sessiondescription.go b/vendor/github.com/pion/webrtc/v3/sessiondescription.go index 12cdf0dd6..91e22a911 100644 --- a/vendor/github.com/pion/webrtc/v3/sessiondescription.go +++ b/vendor/github.com/pion/webrtc/v3/sessiondescription.go @@ -19,6 +19,6 @@ type SessionDescription struct { // Unmarshal is a helper to deserialize the sdp func (sd *SessionDescription) Unmarshal() (*sdp.SessionDescription, error) { sd.parsed = &sdp.SessionDescription{} - err := sd.parsed.Unmarshal([]byte(sd.SDP)) + err := sd.parsed.UnmarshalString(sd.SDP) return sd.parsed, err } diff --git a/vendor/github.com/pion/webrtc/v3/settingengine.go b/vendor/github.com/pion/webrtc/v3/settingengine.go index b11c625e4..38dbe5b0d 100644 --- a/vendor/github.com/pion/webrtc/v3/settingengine.go +++ b/vendor/github.com/pion/webrtc/v3/settingengine.go @@ -17,6 +17,7 @@ import ( dtlsElliptic "github.com/pion/dtls/v2/pkg/crypto/elliptic" "github.com/pion/ice/v2" "github.com/pion/logging" + "github.com/pion/stun" "github.com/pion/transport/v2" "github.com/pion/transport/v2/packetio" "github.com/pion/transport/v2/vnet" @@ -71,9 +72,11 @@ type SettingEngine struct { clientAuth *dtls.ClientAuthType clientCAs *x509.CertPool rootCAs *x509.CertPool + keyLogWriter io.Writer } sctp struct { maxReceiveBufferSize uint32 + enableZeroChecksum bool } sdpMediaLevelFingerprints bool answeringDTLSRole DTLSRole @@ -86,6 +89,8 @@ type SettingEngine struct { iceTCPMux ice.TCPMux iceUDPMux ice.UDPMux iceProxyDialer proxy.Dialer + iceDisableActiveTCP bool + iceBindingRequestHandler func(m *stun.Message, local, remote ice.Candidate, pair *ice.CandidatePair) bool disableMediaEngineCopy bool srtpProtectionProfiles []dtls.SRTPProtectionProfile receiveMTU uint @@ -348,6 +353,11 @@ func (e *SettingEngine) SetICEProxyDialer(d proxy.Dialer) { e.iceProxyDialer = d } +// DisableActiveTCP disables using active TCP for ICE. Active TCP is enabled by default +func (e *SettingEngine) DisableActiveTCP(isDisabled bool) { + e.iceDisableActiveTCP = isDisabled +} + // DisableMediaEngineCopy stops the MediaEngine from being copied. This allows a user to modify // the MediaEngine after the PeerConnection has been constructed. This is useful if you wish to // modify codecs after signaling. Make sure not to share MediaEngines between PeerConnections. @@ -416,8 +426,30 @@ func (e *SettingEngine) SetDTLSRootCAs(rootCAs *x509.CertPool) { e.dtls.rootCAs = rootCAs } +// SetDTLSKeyLogWriter sets the destination of the TLS key material for debugging. +// Logging key material compromises security and should only be use for debugging. +func (e *SettingEngine) SetDTLSKeyLogWriter(writer io.Writer) { + e.dtls.keyLogWriter = writer +} + // SetSCTPMaxReceiveBufferSize sets the maximum receive buffer size. // Leave this 0 for the default maxReceiveBufferSize. func (e *SettingEngine) SetSCTPMaxReceiveBufferSize(maxReceiveBufferSize uint32) { e.sctp.maxReceiveBufferSize = maxReceiveBufferSize } + +// SetSCTPZeroChecksum enables the zero checksum feature in SCTP. +// This removes the need to checksum every incoming/outgoing packet and will reduce +// latency and CPU usage. This feature is not backwards compatible so is disabled by default +func (e *SettingEngine) EnableSCTPZeroChecksum(isEnabled bool) { + e.sctp.enableZeroChecksum = isEnabled +} + +// SetICEBindingRequestHandler sets a callback that is fired on a STUN BindingRequest +// This allows users to do things like +// - Log incoming Binding Requests for debugging +// - Implement draft-thatcher-ice-renomination +// - Implement custom CandidatePair switching logic +func (e *SettingEngine) SetICEBindingRequestHandler(bindingRequestHandler func(m *stun.Message, local, remote ice.Candidate, pair *ice.CandidatePair) bool) { + e.iceBindingRequestHandler = bindingRequestHandler +} diff --git a/vendor/github.com/pion/webrtc/v3/stats.go b/vendor/github.com/pion/webrtc/v3/stats.go index 5a43cb722..35cbea5bd 100644 --- a/vendor/github.com/pion/webrtc/v3/stats.go +++ b/vendor/github.com/pion/webrtc/v3/stats.go @@ -4,6 +4,7 @@ package webrtc import ( + "encoding/json" "fmt" "sync" "time" @@ -13,7 +14,65 @@ import ( // A Stats object contains a set of statistics copies out of a monitored component // of the WebRTC stack at a specific time. -type Stats interface{} +type Stats interface { + statsMarker() +} + +// UnmarshalStatsJSON unmarshals a Stats object from JSON +func UnmarshalStatsJSON(b []byte) (Stats, error) { + type typeJSON struct { + Type StatsType `json:"type"` + } + typeHolder := typeJSON{} + + err := json.Unmarshal(b, &typeHolder) + if err != nil { + return nil, fmt.Errorf("unmarshal json type: %w", err) + } + + switch typeHolder.Type { + case StatsTypeCodec: + return unmarshalCodecStats(b) + case StatsTypeInboundRTP: + return unmarshalInboundRTPStreamStats(b) + case StatsTypeOutboundRTP: + return unmarshalOutboundRTPStreamStats(b) + case StatsTypeRemoteInboundRTP: + return unmarshalRemoteInboundRTPStreamStats(b) + case StatsTypeRemoteOutboundRTP: + return unmarshalRemoteOutboundRTPStreamStats(b) + case StatsTypeCSRC: + return unmarshalCSRCStats(b) + case StatsTypeMediaSource: + return unmarshalMediaSourceStats(b) + case StatsTypeMediaPlayout: + return unmarshalMediaPlayoutStats(b) + case StatsTypePeerConnection: + return unmarshalPeerConnectionStats(b) + case StatsTypeDataChannel: + return unmarshalDataChannelStats(b) + case StatsTypeStream: + return unmarshalStreamStats(b) + case StatsTypeTrack: + return unmarshalTrackStats(b) + case StatsTypeSender: + return unmarshalSenderStats(b) + case StatsTypeReceiver: + return unmarshalReceiverStats(b) + case StatsTypeTransport: + return unmarshalTransportStats(b) + case StatsTypeCandidatePair: + return unmarshalICECandidatePairStats(b) + case StatsTypeLocalCandidate, StatsTypeRemoteCandidate: + return unmarshalICECandidateStats(b) + case StatsTypeCertificate: + return unmarshalCertificateStats(b) + case StatsTypeSCTPTransport: + return unmarshalSCTPTransportStats(b) + default: + return nil, fmt.Errorf("type: %w", ErrUnknownType) + } +} // StatsType indicates the type of the object that a Stats object represents. type StatsType string @@ -37,6 +96,12 @@ const ( // StatsTypeCSRC is used by RTPContributingSourceStats. StatsTypeCSRC StatsType = "csrc" + // StatsTypeMediaSource is used by AudioSourceStats or VideoSourceStats depending on kind. + StatsTypeMediaSource = "media-source" + + // StatsTypeMediaPlayout is used by AudioPlayoutStats. + StatsTypeMediaPlayout StatsType = "media-playout" + // StatsTypePeerConnection used by PeerConnectionStats. StatsTypePeerConnection StatsType = "peer-connection" @@ -46,10 +111,10 @@ const ( // StatsTypeStream is used by MediaStreamStats. StatsTypeStream StatsType = "stream" - // StatsTypeTrack is used by SenderVideoTrackAttachmentStats and SenderAudioTrackAttachmentStats. + // StatsTypeTrack is used by SenderVideoTrackAttachmentStats and SenderAudioTrackAttachmentStats depending on kind. StatsTypeTrack StatsType = "track" - // StatsTypeSender is used by by the AudioSenderStats or VideoSenderStats depending on kind. + // StatsTypeSender is used by the AudioSenderStats or VideoSenderStats depending on kind. StatsTypeSender StatsType = "sender" // StatsTypeReceiver is used by the AudioReceiverStats or VideoReceiverStats depending on kind. @@ -69,6 +134,19 @@ const ( // StatsTypeCertificate is used by CertificateStats. StatsTypeCertificate StatsType = "certificate" + + // StatsTypeSCTPTransport is used by SCTPTransportStats + StatsTypeSCTPTransport StatsType = "sctp-transport" +) + +// MediaKind indicates the kind of media (audio or video) +type MediaKind string + +const ( + // MediaKindAudio indicates this is audio stats + MediaKindAudio MediaKind = "audio" + // MediaKindVideo indicates this is video stats + MediaKindVideo MediaKind = "video" ) // StatsTimestamp is a timestamp represented by the floating point number of @@ -183,6 +261,17 @@ type CodecStats struct { Implementation string `json:"implementation"` } +func (s CodecStats) statsMarker() {} + +func unmarshalCodecStats(b []byte) (CodecStats, error) { + var codecStats CodecStats + err := json.Unmarshal(b, &codecStats) + if err != nil { + return CodecStats{}, fmt.Errorf("unmarshal codec stats: %w", err) + } + return codecStats, nil +} + // InboundRTPStreamStats contains statistics for an inbound RTP stream that is // currently received with this PeerConnection object. type InboundRTPStreamStats struct { @@ -332,6 +421,17 @@ type InboundRTPStreamStats struct { PerDSCPPacketsReceived map[string]uint32 `json:"perDscpPacketsReceived"` } +func (s InboundRTPStreamStats) statsMarker() {} + +func unmarshalInboundRTPStreamStats(b []byte) (InboundRTPStreamStats, error) { + var inboundRTPStreamStats InboundRTPStreamStats + err := json.Unmarshal(b, &inboundRTPStreamStats) + if err != nil { + return InboundRTPStreamStats{}, fmt.Errorf("unmarshal inbound rtp stream stats: %w", err) + } + return inboundRTPStreamStats, nil +} + // QualityLimitationReason lists the reason for limiting the resolution and/or framerate. // Only valid for video. type QualityLimitationReason string @@ -477,6 +577,17 @@ type OutboundRTPStreamStats struct { PerDSCPPacketsSent map[string]uint32 `json:"perDscpPacketsSent"` } +func (s OutboundRTPStreamStats) statsMarker() {} + +func unmarshalOutboundRTPStreamStats(b []byte) (OutboundRTPStreamStats, error) { + var outboundRTPStreamStats OutboundRTPStreamStats + err := json.Unmarshal(b, &outboundRTPStreamStats) + if err != nil { + return OutboundRTPStreamStats{}, fmt.Errorf("unmarshal outbound rtp stream stats: %w", err) + } + return outboundRTPStreamStats, nil +} + // RemoteInboundRTPStreamStats contains statistics for the remote endpoint's inbound // RTP stream corresponding to an outbound stream that is currently sent with this // PeerConnection object. It is measured at the remote endpoint and reported in an RTCP @@ -581,10 +692,21 @@ type RemoteInboundRTPStreamStats struct { // RTCP timestamps in the RTCP Receiver Report (RR) and measured in seconds. RoundTripTime float64 `json:"roundTripTime"` - // FractionLost is the the fraction packet loss reported for this SSRC. + // FractionLost is the fraction packet loss reported for this SSRC. FractionLost float64 `json:"fractionLost"` } +func (s RemoteInboundRTPStreamStats) statsMarker() {} + +func unmarshalRemoteInboundRTPStreamStats(b []byte) (RemoteInboundRTPStreamStats, error) { + var remoteInboundRTPStreamStats RemoteInboundRTPStreamStats + err := json.Unmarshal(b, &remoteInboundRTPStreamStats) + if err != nil { + return RemoteInboundRTPStreamStats{}, fmt.Errorf("unmarshal remote inbound rtp stream stats: %w", err) + } + return remoteInboundRTPStreamStats, nil +} + // RemoteOutboundRTPStreamStats contains statistics for the remote endpoint's outbound // RTP stream corresponding to an inbound stream that is currently received with this // PeerConnection object. It is measured at the remote endpoint and reported in an @@ -671,6 +793,17 @@ type RemoteOutboundRTPStreamStats struct { RemoteTimestamp StatsTimestamp `json:"remoteTimestamp"` } +func (s RemoteOutboundRTPStreamStats) statsMarker() {} + +func unmarshalRemoteOutboundRTPStreamStats(b []byte) (RemoteOutboundRTPStreamStats, error) { + var remoteOutboundRTPStreamStats RemoteOutboundRTPStreamStats + err := json.Unmarshal(b, &remoteOutboundRTPStreamStats) + if err != nil { + return RemoteOutboundRTPStreamStats{}, fmt.Errorf("unmarshal remote outbound rtp stream stats: %w", err) + } + return remoteOutboundRTPStreamStats, nil +} + // RTPContributingSourceStats contains statistics for a contributing source (CSRC) that contributed // to an inbound RTP stream. type RTPContributingSourceStats struct { @@ -707,6 +840,211 @@ type RTPContributingSourceStats struct { AudioLevel float64 `json:"audioLevel"` } +func (s RTPContributingSourceStats) statsMarker() {} + +func unmarshalCSRCStats(b []byte) (RTPContributingSourceStats, error) { + var csrcStats RTPContributingSourceStats + err := json.Unmarshal(b, &csrcStats) + if err != nil { + return RTPContributingSourceStats{}, fmt.Errorf("unmarshal csrc stats: %w", err) + } + return csrcStats, nil +} + +// AudioSourceStats represents an audio track that is attached to one or more senders. +type AudioSourceStats struct { + // Timestamp is the timestamp associated with this object. + Timestamp StatsTimestamp `json:"timestamp"` + + // Type is the object's StatsType + Type StatsType `json:"type"` + + // ID is a unique id that is associated with the component inspected to produce + // this Stats object. Two Stats objects will have the same ID if they were produced + // by inspecting the same underlying object. + ID string `json:"id"` + + // TrackIdentifier represents the id property of the track. + TrackIdentifier string `json:"trackIdentifier"` + + // Kind is "audio" + Kind string `json:"kind"` + + // AudioLevel represents the output audio level of the track. + // + // The value is a value between 0..1 (linear), where 1.0 represents 0 dBov, + // 0 represents silence, and 0.5 represents approximately 6 dBSPL change in + // the sound pressure level from 0 dBov. + // + // If the track is sourced from an Receiver, does no audio processing, has a + // constant level, and has a volume setting of 1.0, the audio level is expected + // to be the same as the audio level of the source SSRC, while if the volume setting + // is 0.5, the AudioLevel is expected to be half that value. + AudioLevel float64 `json:"audioLevel"` + + // TotalAudioEnergy is the total energy of all the audio samples sent/received + // for this object, calculated by duration * Math.pow(energy/maxEnergy, 2) for + // each audio sample seen. + TotalAudioEnergy float64 `json:"totalAudioEnergy"` + + // TotalSamplesDuration represents the total duration in seconds of all samples + // that have sent or received (and thus counted by TotalSamplesSent or TotalSamplesReceived). + // Can be used with TotalAudioEnergy to compute an average audio level over different intervals. + TotalSamplesDuration float64 `json:"totalSamplesDuration"` + + // EchoReturnLoss is only present while the sender is sending a track sourced from + // a microphone where echo cancellation is applied. Calculated in decibels. + EchoReturnLoss float64 `json:"echoReturnLoss"` + + // EchoReturnLossEnhancement is only present while the sender is sending a track + // sourced from a microphone where echo cancellation is applied. Calculated in decibels. + EchoReturnLossEnhancement float64 `json:"echoReturnLossEnhancement"` + + // DroppedSamplesDuration represents the total duration, in seconds, of samples produced by the device that got + // dropped before reaching the media source. Only applicable if this media source is backed by an audio capture device. + DroppedSamplesDuration float64 `json:"droppedSamplesDuration"` + + // DroppedSamplesEvents is the number of dropped samples events. This counter increases every time a sample is + // dropped after a non-dropped sample. That is, multiple consecutive dropped samples will increase + // droppedSamplesDuration multiple times but is a single dropped samples event. + DroppedSamplesEvents uint64 `json:"droppedSamplesEvents"` + + // TotalCaptureDelay is the total delay, in seconds, for each audio sample between the time the sample was emitted + // by the capture device and the sample reaching the source. This can be used together with totalSamplesCaptured to + // calculate the average capture delay per sample. Only applicable if the audio source represents an audio capture device. + TotalCaptureDelay float64 `json:"totalCaptureDelay"` + + // TotalSamplesCaptured is the total number of captured samples reaching the audio source, i.e. that were not dropped + // by the capture pipeline. The frequency of the media source is not necessarily the same as the frequency of encoders + // later in the pipeline. Only applicable if the audio source represents an audio capture device. + TotalSamplesCaptured uint64 `json:"totalSamplesCaptured"` +} + +func (s AudioSourceStats) statsMarker() {} + +// VideoSourceStats represents a video track that is attached to one or more senders. +type VideoSourceStats struct { + // Timestamp is the timestamp associated with this object. + Timestamp StatsTimestamp `json:"timestamp"` + + // Type is the object's StatsType + Type StatsType `json:"type"` + + // ID is a unique id that is associated with the component inspected to produce + // this Stats object. Two Stats objects will have the same ID if they were produced + // by inspecting the same underlying object. + ID string `json:"id"` + + // TrackIdentifier represents the id property of the track. + TrackIdentifier string `json:"trackIdentifier"` + + // Kind is "video" + Kind string `json:"kind"` + + // Width is width of the last frame originating from this source in pixels. + Width uint32 `json:"width"` + + // Height is height of the last frame originating from this source in pixels. + Height uint32 `json:"height"` + + // Frames is the total number of frames originating from this source. + Frames uint32 `json:"frames"` + + // FramesPerSecond is the number of frames originating from this source, measured during the last second. + FramesPerSecond float64 `json:"framesPerSecond"` +} + +func (s VideoSourceStats) statsMarker() {} + +func unmarshalMediaSourceStats(b []byte) (Stats, error) { + type kindJSON struct { + Kind string `json:"kind"` + } + kindHolder := kindJSON{} + + err := json.Unmarshal(b, &kindHolder) + if err != nil { + return nil, fmt.Errorf("unmarshal json kind: %w", err) + } + + switch MediaKind(kindHolder.Kind) { + case MediaKindAudio: + var mediaSourceStats AudioSourceStats + err := json.Unmarshal(b, &mediaSourceStats) + if err != nil { + return nil, fmt.Errorf("unmarshal audio source stats: %w", err) + } + return mediaSourceStats, nil + case MediaKindVideo: + var mediaSourceStats VideoSourceStats + err := json.Unmarshal(b, &mediaSourceStats) + if err != nil { + return nil, fmt.Errorf("unmarshal video source stats: %w", err) + } + return mediaSourceStats, nil + default: + return nil, fmt.Errorf("kind: %w", ErrUnknownType) + } +} + +// AudioPlayoutStats represents one playout path - if the same playout stats object is referenced by multiple +// RTCInboundRtpStreamStats this is an indication that audio mixing is happening in which case sample counters in this +// stats object refer to the samples after mixing. Only applicable if the playout path represents an audio device. +type AudioPlayoutStats struct { + // Timestamp is the timestamp associated with this object. + Timestamp StatsTimestamp `json:"timestamp"` + + // Type is the object's StatsType + Type StatsType `json:"type"` + + // ID is a unique id that is associated with the component inspected to produce + // this Stats object. Two Stats objects will have the same ID if they were produced + // by inspecting the same underlying object. + ID string `json:"id"` + + // Kind is "audio" + Kind string `json:"kind"` + + // SynthesizedSamplesDuration is measured in seconds and is incremented each time an audio sample is synthesized by + // this playout path. This metric can be used together with totalSamplesDuration to calculate the percentage of played + // out media being synthesized. If the playout path is unable to produce audio samples on time for device playout, + // samples are synthesized to be playout out instead. Synthesization typically only happens if the pipeline is + // underperforming. Samples synthesized by the RTCInboundRtpStreamStats are not counted for here, but in + // InboundRtpStreamStats.concealedSamples. + SynthesizedSamplesDuration float64 `json:"synthesizedSamplesDuration"` + + // SynthesizedSamplesEvents is the number of synthesized samples events. This counter increases every time a sample + // is synthesized after a non-synthesized sample. That is, multiple consecutive synthesized samples will increase + // synthesizedSamplesDuration multiple times but is a single synthesization samples event. + SynthesizedSamplesEvents uint64 `json:"synthesizedSamplesEvents"` + + // TotalSamplesDuration represents the total duration in seconds of all samples + // that have sent or received (and thus counted by TotalSamplesSent or TotalSamplesReceived). + // Can be used with TotalAudioEnergy to compute an average audio level over different intervals. + TotalSamplesDuration float64 `json:"totalSamplesDuration"` + + // When audio samples are pulled by the playout device, this counter is incremented with the estimated delay of the + // playout path for that audio sample. The playout delay includes the delay from being emitted to the actual time of + // playout on the device. This metric can be used together with totalSamplesCount to calculate the average + // playout delay per sample. + TotalPlayoutDelay float64 `json:"totalPlayoutDelay"` + + // When audio samples are pulled by the playout device, this counter is incremented with the number of samples + // emitted for playout. + TotalSamplesCount uint64 `json:"totalSamplesCount"` +} + +func (s AudioPlayoutStats) statsMarker() {} + +func unmarshalMediaPlayoutStats(b []byte) (Stats, error) { + var audioPlayoutStats AudioPlayoutStats + err := json.Unmarshal(b, &audioPlayoutStats) + if err != nil { + return nil, fmt.Errorf("unmarshal audio playout stats: %w", err) + } + return audioPlayoutStats, nil +} + // PeerConnectionStats contains statistics related to the PeerConnection object. type PeerConnectionStats struct { // Timestamp is the timestamp associated with this object. @@ -741,6 +1079,17 @@ type PeerConnectionStats struct { DataChannelsAccepted uint32 `json:"dataChannelsAccepted"` } +func (s PeerConnectionStats) statsMarker() {} + +func unmarshalPeerConnectionStats(b []byte) (PeerConnectionStats, error) { + var pcStats PeerConnectionStats + err := json.Unmarshal(b, &pcStats) + if err != nil { + return PeerConnectionStats{}, fmt.Errorf("unmarshal pc stats: %w", err) + } + return pcStats, nil +} + // DataChannelStats contains statistics related to each DataChannel ID. type DataChannelStats struct { // Timestamp is the timestamp associated with this object. @@ -784,6 +1133,17 @@ type DataChannelStats struct { BytesReceived uint64 `json:"bytesReceived"` } +func (s DataChannelStats) statsMarker() {} + +func unmarshalDataChannelStats(b []byte) (DataChannelStats, error) { + var dataChannelStats DataChannelStats + err := json.Unmarshal(b, &dataChannelStats) + if err != nil { + return DataChannelStats{}, fmt.Errorf("unmarshal data channel stats: %w", err) + } + return dataChannelStats, nil +} + // MediaStreamStats contains statistics related to a specific MediaStream. type MediaStreamStats struct { // Timestamp is the timestamp associated with this object. @@ -805,6 +1165,17 @@ type MediaStreamStats struct { TrackIDs []string `json:"trackIds"` } +func (s MediaStreamStats) statsMarker() {} + +func unmarshalStreamStats(b []byte) (MediaStreamStats, error) { + var streamStats MediaStreamStats + err := json.Unmarshal(b, &streamStats) + if err != nil { + return MediaStreamStats{}, fmt.Errorf("unmarshal stream stats: %w", err) + } + return streamStats, nil +} + // AudioSenderStats represents the stats about one audio sender of a PeerConnection // object for which one calls GetStats. // @@ -832,7 +1203,7 @@ type AudioSenderStats struct { // Ended reflects the "ended" state of the track. Ended bool `json:"ended"` - // Kind is either "audio" or "video". This reflects the "kind" attribute of the MediaStreamTrack. + // Kind is "audio" Kind string `json:"kind"` // AudioLevel represents the output audio level of the track. @@ -879,6 +1250,8 @@ type AudioSenderStats struct { TotalSamplesSent uint64 `json:"totalSamplesSent"` } +func (s AudioSenderStats) statsMarker() {} + // SenderAudioTrackAttachmentStats object represents the stats about one attachment // of an audio MediaStreamTrack to the PeerConnection object for which one calls GetStats. // @@ -893,6 +1266,8 @@ type AudioSenderStats struct { // it continues to appear, but with the "ObjectDeleted" member set to true. type SenderAudioTrackAttachmentStats AudioSenderStats +func (s SenderAudioTrackAttachmentStats) statsMarker() {} + // VideoSenderStats represents the stats about one video sender of a PeerConnection // object for which one calls GetStats. // @@ -910,6 +1285,9 @@ type VideoSenderStats struct { // by inspecting the same underlying object. ID string `json:"id"` + // Kind is "video" + Kind string `json:"kind"` + // FramesCaptured represents the total number of frames captured, before encoding, // for this RTPSender (or for this MediaStreamTrack, if type is "track"). For example, // if type is "sender" and this sender's track represents a camera, then this is the @@ -940,6 +1318,8 @@ type VideoSenderStats struct { KeyFramesSent uint32 `json:"keyFramesSent"` } +func (s VideoSenderStats) statsMarker() {} + // SenderVideoTrackAttachmentStats represents the stats about one attachment of a // video MediaStreamTrack to the PeerConnection object for which one calls GetStats. // @@ -954,6 +1334,70 @@ type VideoSenderStats struct { // it continues to appear, but with the "ObjectDeleted" member set to true. type SenderVideoTrackAttachmentStats VideoSenderStats +func (s SenderVideoTrackAttachmentStats) statsMarker() {} + +func unmarshalSenderStats(b []byte) (Stats, error) { + type kindJSON struct { + Kind string `json:"kind"` + } + kindHolder := kindJSON{} + + err := json.Unmarshal(b, &kindHolder) + if err != nil { + return nil, fmt.Errorf("unmarshal json kind: %w", err) + } + + switch MediaKind(kindHolder.Kind) { + case MediaKindAudio: + var senderStats AudioSenderStats + err := json.Unmarshal(b, &senderStats) + if err != nil { + return nil, fmt.Errorf("unmarshal audio sender stats: %w", err) + } + return senderStats, nil + case MediaKindVideo: + var senderStats VideoSenderStats + err := json.Unmarshal(b, &senderStats) + if err != nil { + return nil, fmt.Errorf("unmarshal video sender stats: %w", err) + } + return senderStats, nil + default: + return nil, fmt.Errorf("kind: %w", ErrUnknownType) + } +} + +func unmarshalTrackStats(b []byte) (Stats, error) { + type kindJSON struct { + Kind string `json:"kind"` + } + kindHolder := kindJSON{} + + err := json.Unmarshal(b, &kindHolder) + if err != nil { + return nil, fmt.Errorf("unmarshal json kind: %w", err) + } + + switch MediaKind(kindHolder.Kind) { + case MediaKindAudio: + var trackStats SenderAudioTrackAttachmentStats + err := json.Unmarshal(b, &trackStats) + if err != nil { + return nil, fmt.Errorf("unmarshal audio track stats: %w", err) + } + return trackStats, nil + case MediaKindVideo: + var trackStats SenderVideoTrackAttachmentStats + err := json.Unmarshal(b, &trackStats) + if err != nil { + return nil, fmt.Errorf("unmarshal video track stats: %w", err) + } + return trackStats, nil + default: + return nil, fmt.Errorf("kind: %w", ErrUnknownType) + } +} + // AudioReceiverStats contains audio metrics related to a specific receiver. type AudioReceiverStats struct { // Timestamp is the timestamp associated with this object. @@ -967,6 +1411,9 @@ type AudioReceiverStats struct { // by inspecting the same underlying object. ID string `json:"id"` + // Kind is "audio" + Kind string `json:"kind"` + // AudioLevel represents the output audio level of the track. // // The value is a value between 0..1 (linear), where 1.0 represents 0 dBov, @@ -1038,6 +1485,8 @@ type AudioReceiverStats struct { ConcealmentEvents uint64 `json:"concealmentEvents"` } +func (s AudioReceiverStats) statsMarker() {} + // VideoReceiverStats contains video metrics related to a specific receiver. type VideoReceiverStats struct { // Timestamp is the timestamp associated with this object. @@ -1051,6 +1500,9 @@ type VideoReceiverStats struct { // by inspecting the same underlying object. ID string `json:"id"` + // Kind is "video" + Kind string `json:"kind"` + // FrameWidth represents the width of the last processed frame for this track. // Before the first frame is processed this attribute is missing. FrameWidth uint32 `json:"frameWidth"` @@ -1118,6 +1570,39 @@ type VideoReceiverStats struct { FullFramesLost uint32 `json:"fullFramesLost"` } +func (s VideoReceiverStats) statsMarker() {} + +func unmarshalReceiverStats(b []byte) (Stats, error) { + type kindJSON struct { + Kind string `json:"kind"` + } + kindHolder := kindJSON{} + + err := json.Unmarshal(b, &kindHolder) + if err != nil { + return nil, fmt.Errorf("unmarshal json kind: %w", err) + } + + switch MediaKind(kindHolder.Kind) { + case MediaKindAudio: + var receiverStats AudioReceiverStats + err := json.Unmarshal(b, &receiverStats) + if err != nil { + return nil, fmt.Errorf("unmarshal audio receiver stats: %w", err) + } + return receiverStats, nil + case MediaKindVideo: + var receiverStats VideoReceiverStats + err := json.Unmarshal(b, &receiverStats) + if err != nil { + return nil, fmt.Errorf("unmarshal video receiver stats: %w", err) + } + return receiverStats, nil + default: + return nil, fmt.Errorf("kind: %w", ErrUnknownType) + } +} + // TransportStats contains transport statistics related to the PeerConnection object. type TransportStats struct { // Timestamp is the timestamp associated with this object. @@ -1179,6 +1664,17 @@ type TransportStats struct { SRTPCipher string `json:"srtpCipher"` } +func (s TransportStats) statsMarker() {} + +func unmarshalTransportStats(b []byte) (TransportStats, error) { + var transportStats TransportStats + err := json.Unmarshal(b, &transportStats) + if err != nil { + return TransportStats{}, fmt.Errorf("unmarshal transport stats: %w", err) + } + return transportStats, nil +} + // StatsICECandidatePairState is the state of an ICE candidate pair used in the // ICECandidatePairStats object. type StatsICECandidatePairState string @@ -1363,6 +1859,17 @@ type ICECandidatePairStats struct { ConsentExpiredTimestamp StatsTimestamp `json:"consentExpiredTimestamp"` } +func (s ICECandidatePairStats) statsMarker() {} + +func unmarshalICECandidatePairStats(b []byte) (ICECandidatePairStats, error) { + var iceCandidatePairStats ICECandidatePairStats + err := json.Unmarshal(b, &iceCandidatePairStats) + if err != nil { + return ICECandidatePairStats{}, fmt.Errorf("unmarshal ice candidate pair stats: %w", err) + } + return iceCandidatePairStats, nil +} + // ICECandidateStats contains ICE candidate statistics related to the ICETransport objects. type ICECandidateStats struct { // Timestamp is the timestamp associated with this object. @@ -1390,7 +1897,10 @@ type ICECandidateStats struct { // it's possible that a connection will be bottlenecked by another type of network. // For example, when using Wi-Fi tethering, the networkType of the relevant candidate // would be "wifi", even when the next hop is over a cellular connection. - NetworkType NetworkType `json:"networkType"` + // + // DEPRECATED. Although it may still work in some browsers, the networkType property was deprecated for + // preserving privacy. + NetworkType NetworkType `json:"networkType,omitempty"` // IP is the IP address of the candidate, allowing for IPv4 addresses and // IPv6 addresses, but fully qualified domain names (FQDNs) are not allowed. @@ -1426,6 +1936,17 @@ type ICECandidateStats struct { Deleted bool `json:"deleted"` } +func (s ICECandidateStats) statsMarker() {} + +func unmarshalICECandidateStats(b []byte) (ICECandidateStats, error) { + var iceCandidateStats ICECandidateStats + err := json.Unmarshal(b, &iceCandidateStats) + if err != nil { + return ICECandidateStats{}, fmt.Errorf("unmarshal ice candidate stats: %w", err) + } + return iceCandidateStats, nil +} + // CertificateStats contains information about a certificate used by an ICETransport. type CertificateStats struct { // Timestamp is the timestamp associated with this object. @@ -1453,3 +1974,64 @@ type CertificateStats struct { // (i.e. a self-signed certificate), this will not be set. IssuerCertificateID string `json:"issuerCertificateId"` } + +func (s CertificateStats) statsMarker() {} + +func unmarshalCertificateStats(b []byte) (CertificateStats, error) { + var certificateStats CertificateStats + err := json.Unmarshal(b, &certificateStats) + if err != nil { + return CertificateStats{}, fmt.Errorf("unmarshal certificate stats: %w", err) + } + return certificateStats, nil +} + +// SCTPTransportStats contains information about a certificate used by an SCTPTransport. +type SCTPTransportStats struct { + // Timestamp is the timestamp associated with this object. + Timestamp StatsTimestamp `json:"timestamp"` + + // Type is the object's StatsType + Type StatsType `json:"type"` + + // ID is a unique id that is associated with the component inspected to produce + // this Stats object. Two Stats objects will have the same ID if they were produced + // by inspecting the same underlying object. + ID string `json:"id"` + + // TransportID is the identifier of the object that was inspected to produce the + // RTCTransportStats for the DTLSTransport and ICETransport supporting the SCTP transport. + TransportID string `json:"transportId"` + + // SmoothedRoundTripTime is the latest smoothed round-trip time value, corresponding to spinfo_srtt defined in [RFC6458] + // but converted to seconds. If there has been no round-trip time measurements yet, this value is undefined. + SmoothedRoundTripTime float64 `json:"smoothedRoundTripTime"` + + // CongestionWindow is the latest congestion window, corresponding to spinfo_cwnd defined in [RFC6458]. + CongestionWindow uint32 `json:"congestionWindow"` + + // ReceiverWindow is the latest receiver window, corresponding to sstat_rwnd defined in [RFC6458]. + ReceiverWindow uint32 `json:"receiverWindow"` + + // MTU is the latest maximum transmission unit, corresponding to spinfo_mtu defined in [RFC6458]. + MTU uint32 `json:"mtu"` + + // UNACKData is the number of unacknowledged DATA chunks, corresponding to sstat_unackdata defined in [RFC6458]. + UNACKData uint32 `json:"unackData"` + + // BytesSent represents the total number of bytes sent on this SCTPTransport + BytesSent uint64 `json:"bytesSent"` + + // BytesReceived represents the total number of bytes received on this SCTPTransport + BytesReceived uint64 `json:"bytesReceived"` +} + +func (s SCTPTransportStats) statsMarker() {} + +func unmarshalSCTPTransportStats(b []byte) (SCTPTransportStats, error) { + var sctpTransportStats SCTPTransportStats + if err := json.Unmarshal(b, &sctpTransportStats); err != nil { + return SCTPTransportStats{}, fmt.Errorf("unmarshal sctp transport stats: %w", err) + } + return sctpTransportStats, nil +} diff --git a/vendor/github.com/pion/webrtc/v3/track_local.go b/vendor/github.com/pion/webrtc/v3/track_local.go index a2e6599a5..21131c811 100644 --- a/vendor/github.com/pion/webrtc/v3/track_local.go +++ b/vendor/github.com/pion/webrtc/v3/track_local.go @@ -19,7 +19,31 @@ type TrackLocalWriter interface { // TrackLocalContext is the Context passed when a TrackLocal has been Binded/Unbinded from a PeerConnection, and used // in Interceptors. -type TrackLocalContext struct { +type TrackLocalContext interface { + // CodecParameters returns the negotiated RTPCodecParameters. These are the codecs supported by both + // PeerConnections and the SSRC/PayloadTypes + CodecParameters() []RTPCodecParameters + + // HeaderExtensions returns the negotiated RTPHeaderExtensionParameters. These are the header extensions supported by + // both PeerConnections and the SSRC/PayloadTypes + HeaderExtensions() []RTPHeaderExtensionParameter + + // SSRC requires the negotiated SSRC of this track + // This track may have multiple if RTX is enabled + SSRC() SSRC + + // WriteStream returns the WriteStream for this TrackLocal. The implementer writes the outbound + // media packets to it + WriteStream() TrackLocalWriter + + // ID is a unique identifier that is used for both Bind/Unbind + ID() string + + // RTCPReader returns the RTCP interceptor for this TrackLocal. Used to read RTCP of this TrackLocal. + RTCPReader() interceptor.RTCPReader +} + +type baseTrackLocalContext struct { id string params RTPParameters ssrc SSRC @@ -29,35 +53,35 @@ type TrackLocalContext struct { // CodecParameters returns the negotiated RTPCodecParameters. These are the codecs supported by both // PeerConnections and the SSRC/PayloadTypes -func (t *TrackLocalContext) CodecParameters() []RTPCodecParameters { +func (t *baseTrackLocalContext) CodecParameters() []RTPCodecParameters { return t.params.Codecs } // HeaderExtensions returns the negotiated RTPHeaderExtensionParameters. These are the header extensions supported by // both PeerConnections and the SSRC/PayloadTypes -func (t *TrackLocalContext) HeaderExtensions() []RTPHeaderExtensionParameter { +func (t *baseTrackLocalContext) HeaderExtensions() []RTPHeaderExtensionParameter { return t.params.HeaderExtensions } // SSRC requires the negotiated SSRC of this track // This track may have multiple if RTX is enabled -func (t *TrackLocalContext) SSRC() SSRC { +func (t *baseTrackLocalContext) SSRC() SSRC { return t.ssrc } // WriteStream returns the WriteStream for this TrackLocal. The implementer writes the outbound // media packets to it -func (t *TrackLocalContext) WriteStream() TrackLocalWriter { +func (t *baseTrackLocalContext) WriteStream() TrackLocalWriter { return t.writeStream } // ID is a unique identifier that is used for both Bind/Unbind -func (t *TrackLocalContext) ID() string { +func (t *baseTrackLocalContext) ID() string { return t.id } // RTCPReader returns the RTCP interceptor for this TrackLocal. Used to read RTCP of this TrackLocal. -func (t *TrackLocalContext) RTCPReader() interceptor.RTCPReader { +func (t *baseTrackLocalContext) RTCPReader() interceptor.RTCPReader { return t.rtcpInterceptor } diff --git a/vendor/github.com/pion/webrtc/v3/track_local_static.go b/vendor/github.com/pion/webrtc/v3/track_local_static.go index 17ce0587a..1c06feba9 100644 --- a/vendor/github.com/pion/webrtc/v3/track_local_static.go +++ b/vendor/github.com/pion/webrtc/v3/track_local_static.go @@ -304,3 +304,28 @@ func (s *TrackLocalStaticSample) WriteSample(sample media.Sample) error { return util.FlattenErrs(writeErrs) } + +// GeneratePadding writes padding-only samples to the TrackLocalStaticSample +// If one PeerConnection fails the packets will still be sent to +// all PeerConnections. The error message will contain the ID of the failed +// PeerConnections so you can remove them +func (s *TrackLocalStaticSample) GeneratePadding(samples uint32) error { + s.rtpTrack.mu.RLock() + p := s.packetizer + s.rtpTrack.mu.RUnlock() + + if p == nil { + return nil + } + + packets := p.GeneratePadding(samples) + + writeErrs := []error{} + for _, p := range packets { + if err := s.rtpTrack.WriteRTP(p); err != nil { + writeErrs = append(writeErrs, err) + } + } + + return util.FlattenErrs(writeErrs) +} diff --git a/vendor/github.com/pion/webrtc/v3/track_remote.go b/vendor/github.com/pion/webrtc/v3/track_remote.go index 150b91bc9..e2d8d70df 100644 --- a/vendor/github.com/pion/webrtc/v3/track_remote.go +++ b/vendor/github.com/pion/webrtc/v3/track_remote.go @@ -24,6 +24,7 @@ type TrackRemote struct { payloadType PayloadType kind RTPCodecType ssrc SSRC + rtxSsrc SSRC codec RTPCodecParameters params RTPParameters rid string @@ -33,10 +34,11 @@ type TrackRemote struct { peekedAttributes interceptor.Attributes } -func newTrackRemote(kind RTPCodecType, ssrc SSRC, rid string, receiver *RTPReceiver) *TrackRemote { +func newTrackRemote(kind RTPCodecType, ssrc, rtxSsrc SSRC, rid string, receiver *RTPReceiver) *TrackRemote { return &TrackRemote{ kind: kind, ssrc: ssrc, + rtxSsrc: rtxSsrc, rid: rid, receiver: receiver, } @@ -125,13 +127,23 @@ func (t *TrackRemote) Read(b []byte) (n int, attributes interceptor.Attributes, } } - n, attributes, err = r.readRTP(b, t) - if err != nil { - return + // If there's a separate RTX track and an RTX packet is available, return that + if rtxPacketReceived := r.readRTX(t); rtxPacketReceived != nil { + n = copy(b, rtxPacketReceived.pkt) + attributes = rtxPacketReceived.attributes + rtxPacketReceived.release() + err = nil + } else { + // If there's no separate RTX track (or there's a separate RTX track but no RTX packet waiting), wait for and return + // a packet from the main track + n, attributes, err = r.readRTP(b, t) + if err != nil { + return + } + err = t.checkAndUpdateTrack(b) } - err = t.checkAndUpdateTrack(b) - return + return n, attributes, err } // checkAndUpdateTrack checks payloadType for every incoming packet @@ -197,3 +209,23 @@ func (t *TrackRemote) peek(b []byte) (n int, a interceptor.Attributes, err error func (t *TrackRemote) SetReadDeadline(deadline time.Time) error { return t.receiver.setRTPReadDeadline(deadline, t) } + +// RtxSSRC returns the RTX SSRC for a track, or 0 if track does not have a separate RTX stream +func (t *TrackRemote) RtxSSRC() SSRC { + t.mu.RLock() + defer t.mu.RUnlock() + return t.rtxSsrc +} + +// HasRTX returns true if the track has a separate RTX stream +func (t *TrackRemote) HasRTX() bool { + t.mu.RLock() + defer t.mu.RUnlock() + return t.rtxSsrc != 0 +} + +func (t *TrackRemote) setRtxSSRC(ssrc SSRC) { + t.mu.Lock() + defer t.mu.Unlock() + t.rtxSsrc = ssrc +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/counter.go b/vendor/github.com/prometheus/client_golang/prometheus/counter.go index 62de4dc59..4ce84e7a8 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/counter.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/counter.go @@ -20,6 +20,7 @@ import ( "time" dto "github.com/prometheus/client_model/go" + "google.golang.org/protobuf/types/known/timestamppb" ) // Counter is a Metric that represents a single numerical value that only ever @@ -66,7 +67,7 @@ type CounterVecOpts struct { CounterOpts // VariableLabels are used to partition the metric vector by the given set - // of labels. Each label value will be constrained with the optional Contraint + // of labels. Each label value will be constrained with the optional Constraint // function, if provided. VariableLabels ConstrainableLabels } @@ -90,8 +91,12 @@ func NewCounter(opts CounterOpts) Counter { nil, opts.ConstLabels, ) - result := &counter{desc: desc, labelPairs: desc.constLabelPairs, now: time.Now} + if opts.now == nil { + opts.now = time.Now + } + result := &counter{desc: desc, labelPairs: desc.constLabelPairs, now: opts.now} result.init(result) // Init self-collection. + result.createdTs = timestamppb.New(opts.now()) return result } @@ -106,10 +111,12 @@ type counter struct { selfCollector desc *Desc + createdTs *timestamppb.Timestamp labelPairs []*dto.LabelPair exemplar atomic.Value // Containing nil or a *dto.Exemplar. - now func() time.Time // To mock out time.Now() for testing. + // now is for testing purposes, by default it's time.Now. + now func() time.Time } func (c *counter) Desc() *Desc { @@ -159,8 +166,7 @@ func (c *counter) Write(out *dto.Metric) error { exemplar = e.(*dto.Exemplar) } val := c.get() - - return populateMetric(CounterValue, val, c.labelPairs, exemplar, out) + return populateMetric(CounterValue, val, c.labelPairs, exemplar, out, c.createdTs) } func (c *counter) updateExemplar(v float64, l Labels) { @@ -200,13 +206,17 @@ func (v2) NewCounterVec(opts CounterVecOpts) *CounterVec { opts.VariableLabels, opts.ConstLabels, ) + if opts.now == nil { + opts.now = time.Now + } return &CounterVec{ MetricVec: NewMetricVec(desc, func(lvs ...string) Metric { - if len(lvs) != len(desc.variableLabels) { - panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.labelNames(), lvs)) + if len(lvs) != len(desc.variableLabels.names) { + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.names, lvs)) } - result := &counter{desc: desc, labelPairs: MakeLabelPairs(desc, lvs), now: time.Now} + result := &counter{desc: desc, labelPairs: MakeLabelPairs(desc, lvs), now: opts.now} result.init(result) // Init self-collection. + result.createdTs = timestamppb.New(opts.now()) return result }), } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/desc.go b/vendor/github.com/prometheus/client_golang/prometheus/desc.go index deedc2dfb..68ffe3c24 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/desc.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/desc.go @@ -52,7 +52,7 @@ type Desc struct { constLabelPairs []*dto.LabelPair // variableLabels contains names of labels and normalization function for // which the metric maintains variable values. - variableLabels ConstrainedLabels + variableLabels *compiledLabels // id is a hash of the values of the ConstLabels and fqName. This // must be unique among all registered descriptors and can therefore be // used as an identifier of the descriptor. @@ -93,7 +93,7 @@ func (v2) NewDesc(fqName, help string, variableLabels ConstrainableLabels, const d := &Desc{ fqName: fqName, help: help, - variableLabels: variableLabels.constrainedLabels(), + variableLabels: variableLabels.compile(), } if !model.IsValidMetricName(model.LabelValue(fqName)) { d.err = fmt.Errorf("%q is not a valid metric name", fqName) @@ -103,7 +103,7 @@ func (v2) NewDesc(fqName, help string, variableLabels ConstrainableLabels, const // their sorted label names) plus the fqName (at position 0). labelValues := make([]string, 1, len(constLabels)+1) labelValues[0] = fqName - labelNames := make([]string, 0, len(constLabels)+len(d.variableLabels)) + labelNames := make([]string, 0, len(constLabels)+len(d.variableLabels.names)) labelNameSet := map[string]struct{}{} // First add only the const label names and sort them... for labelName := range constLabels { @@ -128,13 +128,13 @@ func (v2) NewDesc(fqName, help string, variableLabels ConstrainableLabels, const // Now add the variable label names, but prefix them with something that // cannot be in a regular label name. That prevents matching the label // dimension with a different mix between preset and variable labels. - for _, label := range d.variableLabels { - if !checkLabelName(label.Name) { - d.err = fmt.Errorf("%q is not a valid label name for metric %q", label.Name, fqName) + for _, label := range d.variableLabels.names { + if !checkLabelName(label) { + d.err = fmt.Errorf("%q is not a valid label name for metric %q", label, fqName) return d } - labelNames = append(labelNames, "$"+label.Name) - labelNameSet[label.Name] = struct{}{} + labelNames = append(labelNames, "$"+label) + labelNameSet[label] = struct{}{} } if len(labelNames) != len(labelNameSet) { d.err = fmt.Errorf("duplicate label names in constant and variable labels for metric %q", fqName) @@ -189,11 +189,19 @@ func (d *Desc) String() string { fmt.Sprintf("%s=%q", lp.GetName(), lp.GetValue()), ) } + vlStrings := make([]string, 0, len(d.variableLabels.names)) + for _, vl := range d.variableLabels.names { + if fn, ok := d.variableLabels.labelConstraints[vl]; ok && fn != nil { + vlStrings = append(vlStrings, fmt.Sprintf("c(%s)", vl)) + } else { + vlStrings = append(vlStrings, vl) + } + } return fmt.Sprintf( - "Desc{fqName: %q, help: %q, constLabels: {%s}, variableLabels: %v}", + "Desc{fqName: %q, help: %q, constLabels: {%s}, variableLabels: {%s}}", d.fqName, d.help, strings.Join(lpStrings, ","), - d.variableLabels, + strings.Join(vlStrings, ","), ) } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go b/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go index c41ab37f3..de5a85629 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go @@ -48,7 +48,7 @@ func (e *expvarCollector) Collect(ch chan<- Metric) { continue } var v interface{} - labels := make([]string, len(desc.variableLabels)) + labels := make([]string, len(desc.variableLabels.names)) if err := json.Unmarshal([]byte(expVar.String()), &v); err != nil { ch <- NewInvalidMetric(desc, err) continue diff --git a/vendor/github.com/prometheus/client_golang/prometheus/gauge.go b/vendor/github.com/prometheus/client_golang/prometheus/gauge.go index f1ea6c76f..dd2eac940 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/gauge.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/gauge.go @@ -62,7 +62,7 @@ type GaugeVecOpts struct { GaugeOpts // VariableLabels are used to partition the metric vector by the given set - // of labels. Each label value will be constrained with the optional Contraint + // of labels. Each label value will be constrained with the optional Constraint // function, if provided. VariableLabels ConstrainableLabels } @@ -135,7 +135,7 @@ func (g *gauge) Sub(val float64) { func (g *gauge) Write(out *dto.Metric) error { val := math.Float64frombits(atomic.LoadUint64(&g.valBits)) - return populateMetric(GaugeValue, val, g.labelPairs, nil, out) + return populateMetric(GaugeValue, val, g.labelPairs, nil, out, nil) } // GaugeVec is a Collector that bundles a set of Gauges that all share the same @@ -166,8 +166,8 @@ func (v2) NewGaugeVec(opts GaugeVecOpts) *GaugeVec { ) return &GaugeVec{ MetricVec: NewMetricVec(desc, func(lvs ...string) Metric { - if len(lvs) != len(desc.variableLabels) { - panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.labelNames(), lvs)) + if len(lvs) != len(desc.variableLabels.names) { + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.names, lvs)) } result := &gauge{desc: desc, labelPairs: MakeLabelPairs(desc, lvs)} result.init(result) // Init self-collection. diff --git a/vendor/github.com/prometheus/client_golang/prometheus/histogram.go b/vendor/github.com/prometheus/client_golang/prometheus/histogram.go index 8d818afe9..b5c8bcb39 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/histogram.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/histogram.go @@ -25,6 +25,7 @@ import ( dto "github.com/prometheus/client_model/go" "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/timestamppb" ) // nativeHistogramBounds for the frac of observed values. Only relevant for @@ -391,7 +392,7 @@ type HistogramOpts struct { // zero, it is replaced by default buckets. The default buckets are // DefBuckets if no buckets for a native histogram (see below) are used, // otherwise the default is no buckets. (In other words, if you want to - // use both reguler buckets and buckets for a native histogram, you have + // use both regular buckets and buckets for a native histogram, you have // to define the regular buckets here explicitly.) Buckets []float64 @@ -413,8 +414,8 @@ type HistogramOpts struct { // and 2, same as between 2 and 4, and 4 and 8, etc.). // // Details about the actually used factor: The factor is calculated as - // 2^(2^n), where n is an integer number between (and including) -8 and - // 4. n is chosen so that the resulting factor is the largest that is + // 2^(2^-n), where n is an integer number between (and including) -4 and + // 8. n is chosen so that the resulting factor is the largest that is // still smaller or equal to NativeHistogramBucketFactor. Note that the // smallest possible factor is therefore approx. 1.00271 (i.e. 2^(2^-8) // ). If NativeHistogramBucketFactor is greater than 1 but smaller than @@ -428,12 +429,12 @@ type HistogramOpts struct { // a major version bump. NativeHistogramBucketFactor float64 // All observations with an absolute value of less or equal - // NativeHistogramZeroThreshold are accumulated into a “zero” - // bucket. For best results, this should be close to a bucket - // boundary. This is usually the case if picking a power of two. If + // NativeHistogramZeroThreshold are accumulated into a “zero” bucket. + // For best results, this should be close to a bucket boundary. This is + // usually the case if picking a power of two. If // NativeHistogramZeroThreshold is left at zero, - // DefNativeHistogramZeroThreshold is used as the threshold. To configure - // a zero bucket with an actual threshold of zero (i.e. only + // DefNativeHistogramZeroThreshold is used as the threshold. To + // configure a zero bucket with an actual threshold of zero (i.e. only // observations of precisely zero will go into the zero bucket), set // NativeHistogramZeroThreshold to the NativeHistogramZeroThresholdZero // constant (or any negative float value). @@ -446,26 +447,37 @@ type HistogramOpts struct { // Histogram are sufficiently wide-spread. In particular, this could be // used as a DoS attack vector. Where the observed values depend on // external inputs, it is highly recommended to set a - // NativeHistogramMaxBucketNumber.) Once the set + // NativeHistogramMaxBucketNumber.) Once the set // NativeHistogramMaxBucketNumber is exceeded, the following strategy is - // enacted: First, if the last reset (or the creation) of the histogram - // is at least NativeHistogramMinResetDuration ago, then the whole - // histogram is reset to its initial state (including regular - // buckets). If less time has passed, or if - // NativeHistogramMinResetDuration is zero, no reset is - // performed. Instead, the zero threshold is increased sufficiently to - // reduce the number of buckets to or below - // NativeHistogramMaxBucketNumber, but not to more than - // NativeHistogramMaxZeroThreshold. Thus, if - // NativeHistogramMaxZeroThreshold is already at or below the current - // zero threshold, nothing happens at this step. After that, if the - // number of buckets still exceeds NativeHistogramMaxBucketNumber, the - // resolution of the histogram is reduced by doubling the width of the - // sparse buckets (up to a growth factor between one bucket to the next - // of 2^(2^4) = 65536, see above). + // enacted: + // - First, if the last reset (or the creation) of the histogram is at + // least NativeHistogramMinResetDuration ago, then the whole + // histogram is reset to its initial state (including regular + // buckets). + // - If less time has passed, or if NativeHistogramMinResetDuration is + // zero, no reset is performed. Instead, the zero threshold is + // increased sufficiently to reduce the number of buckets to or below + // NativeHistogramMaxBucketNumber, but not to more than + // NativeHistogramMaxZeroThreshold. Thus, if + // NativeHistogramMaxZeroThreshold is already at or below the current + // zero threshold, nothing happens at this step. + // - After that, if the number of buckets still exceeds + // NativeHistogramMaxBucketNumber, the resolution of the histogram is + // reduced by doubling the width of the sparse buckets (up to a + // growth factor between one bucket to the next of 2^(2^4) = 65536, + // see above). + // - Any increased zero threshold or reduced resolution is reset back + // to their original values once NativeHistogramMinResetDuration has + // passed (since the last reset or the creation of the histogram). NativeHistogramMaxBucketNumber uint32 NativeHistogramMinResetDuration time.Duration NativeHistogramMaxZeroThreshold float64 + + // now is for testing purposes, by default it's time.Now. + now func() time.Time + + // afterFunc is for testing purposes, by default it's time.AfterFunc. + afterFunc func(time.Duration, func()) *time.Timer } // HistogramVecOpts bundles the options to create a HistogramVec metric. @@ -475,7 +487,7 @@ type HistogramVecOpts struct { HistogramOpts // VariableLabels are used to partition the metric vector by the given set - // of labels. Each label value will be constrained with the optional Contraint + // of labels. Each label value will be constrained with the optional Constraint // function, if provided. VariableLabels ConstrainableLabels } @@ -499,12 +511,12 @@ func NewHistogram(opts HistogramOpts) Histogram { } func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogram { - if len(desc.variableLabels) != len(labelValues) { - panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.labelNames(), labelValues)) + if len(desc.variableLabels.names) != len(labelValues) { + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.names, labelValues)) } - for _, n := range desc.variableLabels { - if n.Name == bucketLabel { + for _, n := range desc.variableLabels.names { + if n == bucketLabel { panic(errBucketLabelNotAllowed) } } @@ -514,6 +526,12 @@ func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogr } } + if opts.now == nil { + opts.now = time.Now + } + if opts.afterFunc == nil { + opts.afterFunc = time.AfterFunc + } h := &histogram{ desc: desc, upperBounds: opts.Buckets, @@ -521,8 +539,9 @@ func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogr nativeHistogramMaxBuckets: opts.NativeHistogramMaxBucketNumber, nativeHistogramMaxZeroThreshold: opts.NativeHistogramMaxZeroThreshold, nativeHistogramMinResetDuration: opts.NativeHistogramMinResetDuration, - lastResetTime: time.Now(), - now: time.Now, + lastResetTime: opts.now(), + now: opts.now, + afterFunc: opts.afterFunc, } if len(h.upperBounds) == 0 && opts.NativeHistogramBucketFactor <= 1 { h.upperBounds = DefBuckets @@ -701,9 +720,18 @@ type histogram struct { nativeHistogramMaxZeroThreshold float64 nativeHistogramMaxBuckets uint32 nativeHistogramMinResetDuration time.Duration - lastResetTime time.Time // Protected by mtx. + // lastResetTime is protected by mtx. It is also used as created timestamp. + lastResetTime time.Time + // resetScheduled is protected by mtx. It is true if a reset is + // scheduled for a later time (when nativeHistogramMinResetDuration has + // passed). + resetScheduled bool - now func() time.Time // To mock out time.Now() for testing. + // now is for testing purposes, by default it's time.Now. + now func() time.Time + + // afterFunc is for testing purposes, by default it's time.AfterFunc. + afterFunc func(time.Duration, func()) *time.Timer } func (h *histogram) Desc() *Desc { @@ -742,9 +770,10 @@ func (h *histogram) Write(out *dto.Metric) error { waitForCooldown(count, coldCounts) his := &dto.Histogram{ - Bucket: make([]*dto.Bucket, len(h.upperBounds)), - SampleCount: proto.Uint64(count), - SampleSum: proto.Float64(math.Float64frombits(atomic.LoadUint64(&coldCounts.sumBits))), + Bucket: make([]*dto.Bucket, len(h.upperBounds)), + SampleCount: proto.Uint64(count), + SampleSum: proto.Float64(math.Float64frombits(atomic.LoadUint64(&coldCounts.sumBits))), + CreatedTimestamp: timestamppb.New(h.lastResetTime), } out.Histogram = his out.Label = h.labelPairs @@ -782,6 +811,16 @@ func (h *histogram) Write(out *dto.Metric) error { his.ZeroCount = proto.Uint64(zeroBucket) his.NegativeSpan, his.NegativeDelta = makeBuckets(&coldCounts.nativeHistogramBucketsNegative) his.PositiveSpan, his.PositiveDelta = makeBuckets(&coldCounts.nativeHistogramBucketsPositive) + + // Add a no-op span to a histogram without observations and with + // a zero threshold of zero. Otherwise, a native histogram would + // look like a classic histogram to scrapers. + if *his.ZeroThreshold == 0 && *his.ZeroCount == 0 && len(his.PositiveSpan) == 0 && len(his.NegativeSpan) == 0 { + his.PositiveSpan = []*dto.BucketSpan{{ + Offset: proto.Int32(0), + Length: proto.Uint32(0), + }} + } } addAndResetCounts(hotCounts, coldCounts) return nil @@ -848,26 +887,39 @@ func (h *histogram) limitBuckets(counts *histogramCounts, value float64, bucket if h.maybeReset(hotCounts, coldCounts, coldIdx, value, bucket) { return } + // One of the other strategies will happen. To undo what they will do as + // soon as enough time has passed to satisfy + // h.nativeHistogramMinResetDuration, schedule a reset at the right time + // if we haven't done so already. + if h.nativeHistogramMinResetDuration > 0 && !h.resetScheduled { + h.resetScheduled = true + h.afterFunc(h.nativeHistogramMinResetDuration-h.now().Sub(h.lastResetTime), h.reset) + } + if h.maybeWidenZeroBucket(hotCounts, coldCounts) { return } h.doubleBucketWidth(hotCounts, coldCounts) } -// maybeReset resests the whole histogram if at least h.nativeHistogramMinResetDuration -// has been passed. It returns true if the histogram has been reset. The caller -// must have locked h.mtx. -func (h *histogram) maybeReset(hot, cold *histogramCounts, coldIdx uint64, value float64, bucket int) bool { +// maybeReset resets the whole histogram if at least +// h.nativeHistogramMinResetDuration has been passed. It returns true if the +// histogram has been reset. The caller must have locked h.mtx. +func (h *histogram) maybeReset( + hot, cold *histogramCounts, coldIdx uint64, value float64, bucket int, +) bool { // We are using the possibly mocked h.now() rather than // time.Since(h.lastResetTime) to enable testing. - if h.nativeHistogramMinResetDuration == 0 || h.now().Sub(h.lastResetTime) < h.nativeHistogramMinResetDuration { + if h.nativeHistogramMinResetDuration == 0 || // No reset configured. + h.resetScheduled || // Do not interefere if a reset is already scheduled. + h.now().Sub(h.lastResetTime) < h.nativeHistogramMinResetDuration { return false } // Completely reset coldCounts. h.resetCounts(cold) // Repeat the latest observation to not lose it completely. cold.observe(value, bucket, true) - // Make coldCounts the new hot counts while ressetting countAndHotIdx. + // Make coldCounts the new hot counts while resetting countAndHotIdx. n := atomic.SwapUint64(&h.countAndHotIdx, (coldIdx<<63)+1) count := n & ((1 << 63) - 1) waitForCooldown(count, hot) @@ -877,6 +929,29 @@ func (h *histogram) maybeReset(hot, cold *histogramCounts, coldIdx uint64, value return true } +// reset resets the whole histogram. It locks h.mtx itself, i.e. it has to be +// called without having locked h.mtx. +func (h *histogram) reset() { + h.mtx.Lock() + defer h.mtx.Unlock() + + n := atomic.LoadUint64(&h.countAndHotIdx) + hotIdx := n >> 63 + coldIdx := (^n) >> 63 + hot := h.counts[hotIdx] + cold := h.counts[coldIdx] + // Completely reset coldCounts. + h.resetCounts(cold) + // Make coldCounts the new hot counts while resetting countAndHotIdx. + n = atomic.SwapUint64(&h.countAndHotIdx, coldIdx<<63) + count := n & ((1 << 63) - 1) + waitForCooldown(count, hot) + // Finally, reset the formerly hot counts, too. + h.resetCounts(hot) + h.lastResetTime = h.now() + h.resetScheduled = false +} + // maybeWidenZeroBucket widens the zero bucket until it includes the existing // buckets closest to the zero bucket (which could be two, if an equidistant // negative and a positive bucket exists, but usually it's only one bucket to be @@ -1176,6 +1251,7 @@ type constHistogram struct { sum float64 buckets map[float64]uint64 labelPairs []*dto.LabelPair + createdTs *timestamppb.Timestamp } func (h *constHistogram) Desc() *Desc { @@ -1183,7 +1259,9 @@ func (h *constHistogram) Desc() *Desc { } func (h *constHistogram) Write(out *dto.Metric) error { - his := &dto.Histogram{} + his := &dto.Histogram{ + CreatedTimestamp: h.createdTs, + } buckets := make([]*dto.Bucket, 0, len(h.buckets)) @@ -1230,7 +1308,7 @@ func NewConstHistogram( if desc.err != nil { return nil, desc.err } - if err := validateLabelValues(labelValues, len(desc.variableLabels)); err != nil { + if err := validateLabelValues(labelValues, len(desc.variableLabels.names)); err != nil { return nil, err } return &constHistogram{ @@ -1324,7 +1402,7 @@ func makeBuckets(buckets *sync.Map) ([]*dto.BucketSpan, []int64) { // Multiple spans with only small gaps in between are probably // encoded more efficiently as one larger span with a few empty // buckets. Needs some research to find the sweet spot. For now, - // we assume that gaps of one ore two buckets should not create + // we assume that gaps of one or two buckets should not create // a new span. iDelta := int32(i - nextI) if n == 0 || iDelta > 2 { diff --git a/vendor/github.com/prometheus/client_golang/prometheus/internal/difflib.go b/vendor/github.com/prometheus/client_golang/prometheus/internal/difflib.go index fd0750f2c..a595a2036 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/internal/difflib.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/internal/difflib.go @@ -14,7 +14,7 @@ // It provides tools to compare sequences of strings and generate textual diffs. // // Maintaining `GetUnifiedDiffString` here because original repository -// (https://github.com/pmezard/go-difflib) is no loger maintained. +// (https://github.com/pmezard/go-difflib) is no longer maintained. package internal import ( diff --git a/vendor/github.com/prometheus/client_golang/prometheus/labels.go b/vendor/github.com/prometheus/client_golang/prometheus/labels.go index 63ff8683c..c21911f29 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/labels.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/labels.go @@ -32,19 +32,15 @@ import ( // create a Desc. type Labels map[string]string +// LabelConstraint normalizes label values. +type LabelConstraint func(string) string + // ConstrainedLabels represents a label name and its constrain function // to normalize label values. This type is commonly used when constructing // metric vector Collectors. type ConstrainedLabel struct { Name string - Constraint func(string) string -} - -func (cl ConstrainedLabel) Constrain(v string) string { - if cl.Constraint == nil { - return v - } - return cl.Constraint(v) + Constraint LabelConstraint } // ConstrainableLabels is an interface that allows creating of labels that can @@ -58,7 +54,7 @@ func (cl ConstrainedLabel) Constrain(v string) string { // }, // }) type ConstrainableLabels interface { - constrainedLabels() ConstrainedLabels + compile() *compiledLabels labelNames() []string } @@ -67,8 +63,20 @@ type ConstrainableLabels interface { // metric vector Collectors. type ConstrainedLabels []ConstrainedLabel -func (cls ConstrainedLabels) constrainedLabels() ConstrainedLabels { - return cls +func (cls ConstrainedLabels) compile() *compiledLabels { + compiled := &compiledLabels{ + names: make([]string, len(cls)), + labelConstraints: map[string]LabelConstraint{}, + } + + for i, label := range cls { + compiled.names[i] = label.Name + if label.Constraint != nil { + compiled.labelConstraints[label.Name] = label.Constraint + } + } + + return compiled } func (cls ConstrainedLabels) labelNames() []string { @@ -92,18 +100,36 @@ func (cls ConstrainedLabels) labelNames() []string { // } type UnconstrainedLabels []string -func (uls UnconstrainedLabels) constrainedLabels() ConstrainedLabels { - constrainedLabels := make([]ConstrainedLabel, len(uls)) - for i, l := range uls { - constrainedLabels[i] = ConstrainedLabel{Name: l} +func (uls UnconstrainedLabels) compile() *compiledLabels { + return &compiledLabels{ + names: uls, } - return constrainedLabels } func (uls UnconstrainedLabels) labelNames() []string { return uls } +type compiledLabels struct { + names []string + labelConstraints map[string]LabelConstraint +} + +func (cls *compiledLabels) compile() *compiledLabels { + return cls +} + +func (cls *compiledLabels) labelNames() []string { + return cls.names +} + +func (cls *compiledLabels) constrain(labelName, value string) string { + if fn, ok := cls.labelConstraints[labelName]; ok && fn != nil { + return fn(value) + } + return value +} + // reservedLabelPrefix is a prefix which is not legal in user-supplied // label names. const reservedLabelPrefix = "__" @@ -139,6 +165,8 @@ func validateValuesInLabels(labels Labels, expectedNumberOfValues int) error { func validateLabelValues(vals []string, expectedNumberOfValues int) error { if len(vals) != expectedNumberOfValues { + // The call below makes vals escape, copy them to avoid that. + vals := append([]string(nil), vals...) return fmt.Errorf( "%w: expected %d label values but got %d in %#v", errInconsistentCardinality, expectedNumberOfValues, diff --git a/vendor/github.com/prometheus/client_golang/prometheus/metric.go b/vendor/github.com/prometheus/client_golang/prometheus/metric.go index 07bbc9d76..f018e5723 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/metric.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/metric.go @@ -92,6 +92,9 @@ type Opts struct { // machine_role metric). See also // https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels-not-static-scraped-labels ConstLabels Labels + + // now is for testing purposes, by default it's time.Now. + now func() time.Time } // BuildFQName joins the given three name components by "_". Empty name diff --git a/vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go b/vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go index c0152cdb6..8c1136cee 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go @@ -11,8 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build !windows && !js -// +build !windows,!js +//go:build !windows && !js && !wasip1 +// +build !windows,!js,!wasip1 package prometheus diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go b/vendor/github.com/prometheus/client_golang/prometheus/process_collector_wasip1.go similarity index 63% rename from vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go rename to vendor/github.com/prometheus/client_golang/prometheus/process_collector_wasip1.go index c318385cb..d8d9a6d7a 100644 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/process_collector_wasip1.go @@ -1,10 +1,9 @@ -// Copyright 2013 Matt T. Proud -// +// Copyright 2023 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, @@ -12,5 +11,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Package pbutil provides record length-delimited Protocol Buffer streaming. -package pbutil +//go:build wasip1 +// +build wasip1 + +package prometheus + +func canCollectProcess() bool { + return false +} + +func (*processCollector) processCollect(chan<- Metric) { + // noop on this platform + return +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go index 3793036ad..356edb786 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go @@ -389,16 +389,13 @@ func isLabelCurried(c prometheus.Collector, label string) bool { return true } -// emptyLabels is a one-time allocation for non-partitioned metrics to avoid -// unnecessary allocations on each request. -var emptyLabels = prometheus.Labels{} - func labels(code, method bool, reqMethod string, status int, extraMethods ...string) prometheus.Labels { - if !(code || method) { - return emptyLabels - } labels := prometheus.Labels{} + if !(code || method) { + return labels + } + if code { labels["code"] = sanitizeCode(status) } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/registry.go b/vendor/github.com/prometheus/client_golang/prometheus/registry.go index 44da9433b..5e2ced25a 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/registry.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/registry.go @@ -548,7 +548,7 @@ func (r *Registry) Gather() ([]*dto.MetricFamily, error) { goroutineBudget-- runtime.Gosched() } - // Once both checkedMetricChan and uncheckdMetricChan are closed + // Once both checkedMetricChan and uncheckedMetricChan are closed // and drained, the contraption above will nil out cmc and umc, // and then we can leave the collect loop here. if cmc == nil && umc == nil { @@ -963,9 +963,9 @@ func checkDescConsistency( // Is the desc consistent with the content of the metric? lpsFromDesc := make([]*dto.LabelPair, len(desc.constLabelPairs), len(dtoMetric.Label)) copy(lpsFromDesc, desc.constLabelPairs) - for _, l := range desc.variableLabels { + for _, l := range desc.variableLabels.names { lpsFromDesc = append(lpsFromDesc, &dto.LabelPair{ - Name: proto.String(l.Name), + Name: proto.String(l), }) } if len(lpsFromDesc) != len(dtoMetric.Label) { diff --git a/vendor/github.com/prometheus/client_golang/prometheus/summary.go b/vendor/github.com/prometheus/client_golang/prometheus/summary.go index dd359264e..146270444 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/summary.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/summary.go @@ -26,6 +26,7 @@ import ( "github.com/beorn7/perks/quantile" "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/timestamppb" ) // quantileLabel is used for the label that defines the quantile in a @@ -145,6 +146,9 @@ type SummaryOpts struct { // is the internal buffer size of the underlying package // "github.com/bmizerany/perks/quantile"). BufCap uint32 + + // now is for testing purposes, by default it's time.Now. + now func() time.Time } // SummaryVecOpts bundles the options to create a SummaryVec metric. @@ -154,7 +158,7 @@ type SummaryVecOpts struct { SummaryOpts // VariableLabels are used to partition the metric vector by the given set - // of labels. Each label value will be constrained with the optional Contraint + // of labels. Each label value will be constrained with the optional Constraint // function, if provided. VariableLabels ConstrainableLabels } @@ -188,12 +192,12 @@ func NewSummary(opts SummaryOpts) Summary { } func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { - if len(desc.variableLabels) != len(labelValues) { - panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.labelNames(), labelValues)) + if len(desc.variableLabels.names) != len(labelValues) { + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.names, labelValues)) } - for _, n := range desc.variableLabels { - if n.Name == quantileLabel { + for _, n := range desc.variableLabels.names { + if n == quantileLabel { panic(errQuantileLabelNotAllowed) } } @@ -222,6 +226,9 @@ func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { opts.BufCap = DefBufCap } + if opts.now == nil { + opts.now = time.Now + } if len(opts.Objectives) == 0 { // Use the lock-free implementation of a Summary without objectives. s := &noObjectivesSummary{ @@ -230,6 +237,7 @@ func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { counts: [2]*summaryCounts{{}, {}}, } s.init(s) // Init self-collection. + s.createdTs = timestamppb.New(opts.now()) return s } @@ -245,7 +253,7 @@ func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { coldBuf: make([]float64, 0, opts.BufCap), streamDuration: opts.MaxAge / time.Duration(opts.AgeBuckets), } - s.headStreamExpTime = time.Now().Add(s.streamDuration) + s.headStreamExpTime = opts.now().Add(s.streamDuration) s.hotBufExpTime = s.headStreamExpTime for i := uint32(0); i < opts.AgeBuckets; i++ { @@ -259,6 +267,7 @@ func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { sort.Float64s(s.sortedObjectives) s.init(s) // Init self-collection. + s.createdTs = timestamppb.New(opts.now()) return s } @@ -286,6 +295,8 @@ type summary struct { headStream *quantile.Stream headStreamIdx int headStreamExpTime, hotBufExpTime time.Time + + createdTs *timestamppb.Timestamp } func (s *summary) Desc() *Desc { @@ -307,7 +318,9 @@ func (s *summary) Observe(v float64) { } func (s *summary) Write(out *dto.Metric) error { - sum := &dto.Summary{} + sum := &dto.Summary{ + CreatedTimestamp: s.createdTs, + } qs := make([]*dto.Quantile, 0, len(s.objectives)) s.bufMtx.Lock() @@ -440,6 +453,8 @@ type noObjectivesSummary struct { counts [2]*summaryCounts labelPairs []*dto.LabelPair + + createdTs *timestamppb.Timestamp } func (s *noObjectivesSummary) Desc() *Desc { @@ -490,8 +505,9 @@ func (s *noObjectivesSummary) Write(out *dto.Metric) error { } sum := &dto.Summary{ - SampleCount: proto.Uint64(count), - SampleSum: proto.Float64(math.Float64frombits(atomic.LoadUint64(&coldCounts.sumBits))), + SampleCount: proto.Uint64(count), + SampleSum: proto.Float64(math.Float64frombits(atomic.LoadUint64(&coldCounts.sumBits))), + CreatedTimestamp: s.createdTs, } out.Summary = sum @@ -681,6 +697,7 @@ type constSummary struct { sum float64 quantiles map[float64]float64 labelPairs []*dto.LabelPair + createdTs *timestamppb.Timestamp } func (s *constSummary) Desc() *Desc { @@ -688,7 +705,9 @@ func (s *constSummary) Desc() *Desc { } func (s *constSummary) Write(out *dto.Metric) error { - sum := &dto.Summary{} + sum := &dto.Summary{ + CreatedTimestamp: s.createdTs, + } qs := make([]*dto.Quantile, 0, len(s.quantiles)) sum.SampleCount = proto.Uint64(s.count) @@ -737,7 +756,7 @@ func NewConstSummary( if desc.err != nil { return nil, desc.err } - if err := validateLabelValues(labelValues, len(desc.variableLabels)); err != nil { + if err := validateLabelValues(labelValues, len(desc.variableLabels.names)); err != nil { return nil, err } return &constSummary{ diff --git a/vendor/github.com/prometheus/client_golang/prometheus/value.go b/vendor/github.com/prometheus/client_golang/prometheus/value.go index 5f6bb8001..cc23011fa 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/value.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/value.go @@ -14,6 +14,7 @@ package prometheus import ( + "errors" "fmt" "sort" "time" @@ -91,7 +92,7 @@ func (v *valueFunc) Desc() *Desc { } func (v *valueFunc) Write(out *dto.Metric) error { - return populateMetric(v.valType, v.function(), v.labelPairs, nil, out) + return populateMetric(v.valType, v.function(), v.labelPairs, nil, out, nil) } // NewConstMetric returns a metric with one fixed value that cannot be @@ -105,12 +106,12 @@ func NewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues if desc.err != nil { return nil, desc.err } - if err := validateLabelValues(labelValues, len(desc.variableLabels)); err != nil { + if err := validateLabelValues(labelValues, len(desc.variableLabels.names)); err != nil { return nil, err } metric := &dto.Metric{} - if err := populateMetric(valueType, value, MakeLabelPairs(desc, labelValues), nil, metric); err != nil { + if err := populateMetric(valueType, value, MakeLabelPairs(desc, labelValues), nil, metric, nil); err != nil { return nil, err } @@ -130,6 +131,43 @@ func MustNewConstMetric(desc *Desc, valueType ValueType, value float64, labelVal return m } +// NewConstMetricWithCreatedTimestamp does the same thing as NewConstMetric, but generates Counters +// with created timestamp set and returns an error for other metric types. +func NewConstMetricWithCreatedTimestamp(desc *Desc, valueType ValueType, value float64, ct time.Time, labelValues ...string) (Metric, error) { + if desc.err != nil { + return nil, desc.err + } + if err := validateLabelValues(labelValues, len(desc.variableLabels.names)); err != nil { + return nil, err + } + switch valueType { + case CounterValue: + break + default: + return nil, errors.New("created timestamps are only supported for counters") + } + + metric := &dto.Metric{} + if err := populateMetric(valueType, value, MakeLabelPairs(desc, labelValues), nil, metric, timestamppb.New(ct)); err != nil { + return nil, err + } + + return &constMetric{ + desc: desc, + metric: metric, + }, nil +} + +// MustNewConstMetricWithCreatedTimestamp is a version of NewConstMetricWithCreatedTimestamp that panics where +// NewConstMetricWithCreatedTimestamp would have returned an error. +func MustNewConstMetricWithCreatedTimestamp(desc *Desc, valueType ValueType, value float64, ct time.Time, labelValues ...string) Metric { + m, err := NewConstMetricWithCreatedTimestamp(desc, valueType, value, ct, labelValues...) + if err != nil { + panic(err) + } + return m +} + type constMetric struct { desc *Desc metric *dto.Metric @@ -153,11 +191,12 @@ func populateMetric( labelPairs []*dto.LabelPair, e *dto.Exemplar, m *dto.Metric, + ct *timestamppb.Timestamp, ) error { m.Label = labelPairs switch t { case CounterValue: - m.Counter = &dto.Counter{Value: proto.Float64(v), Exemplar: e} + m.Counter = &dto.Counter{Value: proto.Float64(v), Exemplar: e, CreatedTimestamp: ct} case GaugeValue: m.Gauge = &dto.Gauge{Value: proto.Float64(v)} case UntypedValue: @@ -176,19 +215,19 @@ func populateMetric( // This function is only needed for custom Metric implementations. See MetricVec // example. func MakeLabelPairs(desc *Desc, labelValues []string) []*dto.LabelPair { - totalLen := len(desc.variableLabels) + len(desc.constLabelPairs) + totalLen := len(desc.variableLabels.names) + len(desc.constLabelPairs) if totalLen == 0 { // Super fast path. return nil } - if len(desc.variableLabels) == 0 { + if len(desc.variableLabels.names) == 0 { // Moderately fast path. return desc.constLabelPairs } labelPairs := make([]*dto.LabelPair, 0, totalLen) - for i, l := range desc.variableLabels { + for i, l := range desc.variableLabels.names { labelPairs = append(labelPairs, &dto.LabelPair{ - Name: proto.String(l.Name), + Name: proto.String(l), Value: proto.String(labelValues[i]), }) } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/vec.go b/vendor/github.com/prometheus/client_golang/prometheus/vec.go index f0d0015a0..955cfd59f 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/vec.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/vec.go @@ -20,24 +20,6 @@ import ( "github.com/prometheus/common/model" ) -var labelsPool = &sync.Pool{ - New: func() interface{} { - return make(Labels) - }, -} - -func getLabelsFromPool() Labels { - return labelsPool.Get().(Labels) -} - -func putLabelsToPool(labels Labels) { - for k := range labels { - delete(labels, k) - } - - labelsPool.Put(labels) -} - // MetricVec is a Collector to bundle metrics of the same name that differ in // their label values. MetricVec is not used directly but as a building block // for implementations of vectors of a given metric type, like GaugeVec, @@ -91,6 +73,7 @@ func NewMetricVec(desc *Desc, newMetric func(lvs ...string) Metric) *MetricVec { // See also the CounterVec example. func (m *MetricVec) DeleteLabelValues(lvs ...string) bool { lvs = constrainLabelValues(m.desc, lvs, m.curry) + h, err := m.hashLabelValues(lvs) if err != nil { return false @@ -110,8 +93,8 @@ func (m *MetricVec) DeleteLabelValues(lvs ...string) bool { // This method is used for the same purpose as DeleteLabelValues(...string). See // there for pros and cons of the two methods. func (m *MetricVec) Delete(labels Labels) bool { - labels = constrainLabels(m.desc, labels) - defer putLabelsToPool(labels) + labels, closer := constrainLabels(m.desc, labels) + defer closer() h, err := m.hashLabels(labels) if err != nil { @@ -128,8 +111,8 @@ func (m *MetricVec) Delete(labels Labels) bool { // Note that curried labels will never be matched if deleting from the curried vector. // To match curried labels with DeletePartialMatch, it must be called on the base vector. func (m *MetricVec) DeletePartialMatch(labels Labels) int { - labels = constrainLabels(m.desc, labels) - defer putLabelsToPool(labels) + labels, closer := constrainLabels(m.desc, labels) + defer closer() return m.metricMap.deleteByLabels(labels, m.curry) } @@ -169,11 +152,11 @@ func (m *MetricVec) CurryWith(labels Labels) (*MetricVec, error) { oldCurry = m.curry iCurry int ) - for i, label := range m.desc.variableLabels { - val, ok := labels[label.Name] + for i, labelName := range m.desc.variableLabels.names { + val, ok := labels[labelName] if iCurry < len(oldCurry) && oldCurry[iCurry].index == i { if ok { - return nil, fmt.Errorf("label name %q is already curried", label.Name) + return nil, fmt.Errorf("label name %q is already curried", labelName) } newCurry = append(newCurry, oldCurry[iCurry]) iCurry++ @@ -181,7 +164,10 @@ func (m *MetricVec) CurryWith(labels Labels) (*MetricVec, error) { if !ok { continue // Label stays uncurried. } - newCurry = append(newCurry, curriedLabelValue{i, label.Constrain(val)}) + newCurry = append(newCurry, curriedLabelValue{ + i, + m.desc.variableLabels.constrain(labelName, val), + }) } } if l := len(oldCurry) + len(labels) - len(newCurry); l > 0 { @@ -250,8 +236,8 @@ func (m *MetricVec) GetMetricWithLabelValues(lvs ...string) (Metric, error) { // around MetricVec, implementing a vector for a specific Metric implementation, // for example GaugeVec. func (m *MetricVec) GetMetricWith(labels Labels) (Metric, error) { - labels = constrainLabels(m.desc, labels) - defer putLabelsToPool(labels) + labels, closer := constrainLabels(m.desc, labels) + defer closer() h, err := m.hashLabels(labels) if err != nil { @@ -262,7 +248,7 @@ func (m *MetricVec) GetMetricWith(labels Labels) (Metric, error) { } func (m *MetricVec) hashLabelValues(vals []string) (uint64, error) { - if err := validateLabelValues(vals, len(m.desc.variableLabels)-len(m.curry)); err != nil { + if err := validateLabelValues(vals, len(m.desc.variableLabels.names)-len(m.curry)); err != nil { return 0, err } @@ -271,7 +257,7 @@ func (m *MetricVec) hashLabelValues(vals []string) (uint64, error) { curry = m.curry iVals, iCurry int ) - for i := 0; i < len(m.desc.variableLabels); i++ { + for i := 0; i < len(m.desc.variableLabels.names); i++ { if iCurry < len(curry) && curry[iCurry].index == i { h = m.hashAdd(h, curry[iCurry].value) iCurry++ @@ -285,7 +271,7 @@ func (m *MetricVec) hashLabelValues(vals []string) (uint64, error) { } func (m *MetricVec) hashLabels(labels Labels) (uint64, error) { - if err := validateValuesInLabels(labels, len(m.desc.variableLabels)-len(m.curry)); err != nil { + if err := validateValuesInLabels(labels, len(m.desc.variableLabels.names)-len(m.curry)); err != nil { return 0, err } @@ -294,17 +280,17 @@ func (m *MetricVec) hashLabels(labels Labels) (uint64, error) { curry = m.curry iCurry int ) - for i, label := range m.desc.variableLabels { - val, ok := labels[label.Name] + for i, labelName := range m.desc.variableLabels.names { + val, ok := labels[labelName] if iCurry < len(curry) && curry[iCurry].index == i { if ok { - return 0, fmt.Errorf("label name %q is already curried", label.Name) + return 0, fmt.Errorf("label name %q is already curried", labelName) } h = m.hashAdd(h, curry[iCurry].value) iCurry++ } else { if !ok { - return 0, fmt.Errorf("label name %q missing in label map", label.Name) + return 0, fmt.Errorf("label name %q missing in label map", labelName) } h = m.hashAdd(h, val) } @@ -482,7 +468,7 @@ func valueMatchesVariableOrCurriedValue(targetValue string, index int, values [] func matchPartialLabels(desc *Desc, values []string, labels Labels, curry []curriedLabelValue) bool { for l, v := range labels { // Check if the target label exists in our metrics and get the index. - varLabelIndex, validLabel := indexOf(l, desc.variableLabels.labelNames()) + varLabelIndex, validLabel := indexOf(l, desc.variableLabels.names) if validLabel { // Check the value of that label against the target value. // We don't consider curried values in partial matches. @@ -626,7 +612,7 @@ func matchLabels(desc *Desc, values []string, labels Labels, curry []curriedLabe return false } iCurry := 0 - for i, k := range desc.variableLabels { + for i, k := range desc.variableLabels.names { if iCurry < len(curry) && curry[iCurry].index == i { if values[i] != curry[iCurry].value { return false @@ -634,7 +620,7 @@ func matchLabels(desc *Desc, values []string, labels Labels, curry []curriedLabe iCurry++ continue } - if values[i] != labels[k.Name] { + if values[i] != labels[k] { return false } } @@ -644,13 +630,13 @@ func matchLabels(desc *Desc, values []string, labels Labels, curry []curriedLabe func extractLabelValues(desc *Desc, labels Labels, curry []curriedLabelValue) []string { labelValues := make([]string, len(labels)+len(curry)) iCurry := 0 - for i, k := range desc.variableLabels { + for i, k := range desc.variableLabels.names { if iCurry < len(curry) && curry[iCurry].index == i { labelValues[i] = curry[iCurry].value iCurry++ continue } - labelValues[i] = labels[k.Name] + labelValues[i] = labels[k] } return labelValues } @@ -670,20 +656,37 @@ func inlineLabelValues(lvs []string, curry []curriedLabelValue) []string { return labelValues } -func constrainLabels(desc *Desc, labels Labels) Labels { - constrainedLabels := getLabelsFromPool() - for l, v := range labels { - if i, ok := indexOf(l, desc.variableLabels.labelNames()); ok { - v = desc.variableLabels[i].Constrain(v) - } +var labelsPool = &sync.Pool{ + New: func() interface{} { + return make(Labels) + }, +} - constrainedLabels[l] = v +func constrainLabels(desc *Desc, labels Labels) (Labels, func()) { + if len(desc.variableLabels.labelConstraints) == 0 { + // Fast path when there's no constraints + return labels, func() {} } - return constrainedLabels + constrainedLabels := labelsPool.Get().(Labels) + for l, v := range labels { + constrainedLabels[l] = desc.variableLabels.constrain(l, v) + } + + return constrainedLabels, func() { + for k := range constrainedLabels { + delete(constrainedLabels, k) + } + labelsPool.Put(constrainedLabels) + } } func constrainLabelValues(desc *Desc, lvs []string, curry []curriedLabelValue) []string { + if len(desc.variableLabels.labelConstraints) == 0 { + // Fast path when there's no constraints + return lvs + } + constrainedValues := make([]string, len(lvs)) var iCurry, iLVs int for i := 0; i < len(lvs)+len(curry); i++ { @@ -692,8 +695,11 @@ func constrainLabelValues(desc *Desc, lvs []string, curry []curriedLabelValue) [ continue } - if i < len(desc.variableLabels) { - constrainedValues[iLVs] = desc.variableLabels[i].Constrain(lvs[iLVs]) + if i < len(desc.variableLabels.names) { + constrainedValues[iLVs] = desc.variableLabels.constrain( + desc.variableLabels.names[i], + lvs[iLVs], + ) } else { constrainedValues[iLVs] = lvs[iLVs] } diff --git a/vendor/github.com/prometheus/client_model/go/metrics.pb.go b/vendor/github.com/prometheus/client_model/go/metrics.pb.go index 2b5bca4b9..2f1549075 100644 --- a/vendor/github.com/prometheus/client_model/go/metrics.pb.go +++ b/vendor/github.com/prometheus/client_model/go/metrics.pb.go @@ -215,8 +215,9 @@ type Counter struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` - Exemplar *Exemplar `protobuf:"bytes,2,opt,name=exemplar" json:"exemplar,omitempty"` + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + Exemplar *Exemplar `protobuf:"bytes,2,opt,name=exemplar" json:"exemplar,omitempty"` + CreatedTimestamp *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=created_timestamp,json=createdTimestamp" json:"created_timestamp,omitempty"` } func (x *Counter) Reset() { @@ -265,6 +266,13 @@ func (x *Counter) GetExemplar() *Exemplar { return nil } +func (x *Counter) GetCreatedTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.CreatedTimestamp + } + return nil +} + type Quantile struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -325,9 +333,10 @@ type Summary struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count,json=sampleCount" json:"sample_count,omitempty"` - SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum,json=sampleSum" json:"sample_sum,omitempty"` - Quantile []*Quantile `protobuf:"bytes,3,rep,name=quantile" json:"quantile,omitempty"` + SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count,json=sampleCount" json:"sample_count,omitempty"` + SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum,json=sampleSum" json:"sample_sum,omitempty"` + Quantile []*Quantile `protobuf:"bytes,3,rep,name=quantile" json:"quantile,omitempty"` + CreatedTimestamp *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=created_timestamp,json=createdTimestamp" json:"created_timestamp,omitempty"` } func (x *Summary) Reset() { @@ -383,6 +392,13 @@ func (x *Summary) GetQuantile() []*Quantile { return nil } +func (x *Summary) GetCreatedTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.CreatedTimestamp + } + return nil +} + type Untyped struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -439,7 +455,8 @@ type Histogram struct { SampleCountFloat *float64 `protobuf:"fixed64,4,opt,name=sample_count_float,json=sampleCountFloat" json:"sample_count_float,omitempty"` // Overrides sample_count if > 0. SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum,json=sampleSum" json:"sample_sum,omitempty"` // Buckets for the conventional histogram. - Bucket []*Bucket `protobuf:"bytes,3,rep,name=bucket" json:"bucket,omitempty"` // Ordered in increasing order of upper_bound, +Inf bucket is optional. + Bucket []*Bucket `protobuf:"bytes,3,rep,name=bucket" json:"bucket,omitempty"` // Ordered in increasing order of upper_bound, +Inf bucket is optional. + CreatedTimestamp *timestamppb.Timestamp `protobuf:"bytes,15,opt,name=created_timestamp,json=createdTimestamp" json:"created_timestamp,omitempty"` // schema defines the bucket schema. Currently, valid numbers are -4 <= n <= 8. // They are all for base-2 bucket schemas, where 1 is a bucket boundary in each case, and // then each power of two is divided into 2^n logarithmic buckets. @@ -457,12 +474,17 @@ type Histogram struct { NegativeDelta []int64 `protobuf:"zigzag64,10,rep,name=negative_delta,json=negativeDelta" json:"negative_delta,omitempty"` // Count delta of each bucket compared to previous one (or to zero for 1st bucket). NegativeCount []float64 `protobuf:"fixed64,11,rep,name=negative_count,json=negativeCount" json:"negative_count,omitempty"` // Absolute count of each bucket. // Positive buckets for the native histogram. + // Use a no-op span (offset 0, length 0) for a native histogram without any + // observations yet and with a zero_threshold of 0. Otherwise, it would be + // indistinguishable from a classic histogram. PositiveSpan []*BucketSpan `protobuf:"bytes,12,rep,name=positive_span,json=positiveSpan" json:"positive_span,omitempty"` // Use either "positive_delta" or "positive_count", the former for // regular histograms with integer counts, the latter for float // histograms. PositiveDelta []int64 `protobuf:"zigzag64,13,rep,name=positive_delta,json=positiveDelta" json:"positive_delta,omitempty"` // Count delta of each bucket compared to previous one (or to zero for 1st bucket). PositiveCount []float64 `protobuf:"fixed64,14,rep,name=positive_count,json=positiveCount" json:"positive_count,omitempty"` // Absolute count of each bucket. + // Only used for native histograms. These exemplars MUST have a timestamp. + Exemplars []*Exemplar `protobuf:"bytes,16,rep,name=exemplars" json:"exemplars,omitempty"` } func (x *Histogram) Reset() { @@ -525,6 +547,13 @@ func (x *Histogram) GetBucket() []*Bucket { return nil } +func (x *Histogram) GetCreatedTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.CreatedTimestamp + } + return nil +} + func (x *Histogram) GetSchema() int32 { if x != nil && x.Schema != nil { return *x.Schema @@ -595,6 +624,13 @@ func (x *Histogram) GetPositiveCount() []float64 { return nil } +func (x *Histogram) GetExemplars() []*Exemplar { + if x != nil { + return x.Exemplars + } + return nil +} + // A Bucket of a conventional histogram, each of which is treated as // an individual counter-like time series by Prometheus. type Bucket struct { @@ -896,6 +932,7 @@ type MetricFamily struct { Help *string `protobuf:"bytes,2,opt,name=help" json:"help,omitempty"` Type *MetricType `protobuf:"varint,3,opt,name=type,enum=io.prometheus.client.MetricType" json:"type,omitempty"` Metric []*Metric `protobuf:"bytes,4,rep,name=metric" json:"metric,omitempty"` + Unit *string `protobuf:"bytes,5,opt,name=unit" json:"unit,omitempty"` } func (x *MetricFamily) Reset() { @@ -958,6 +995,13 @@ func (x *MetricFamily) GetMetric() []*Metric { return nil } +func (x *MetricFamily) GetUnit() string { + if x != nil && x.Unit != nil { + return *x.Unit + } + return "" +} + var File_io_prometheus_client_metrics_proto protoreflect.FileDescriptor var file_io_prometheus_client_metrics_proto_rawDesc = []byte{ @@ -972,137 +1016,156 @@ var file_io_prometheus_client_metrics_proto_rawDesc = []byte{ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x1d, 0x0a, 0x05, 0x47, 0x61, 0x75, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0x5b, 0x0a, 0x07, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, - 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x72, 0x52, 0x08, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x22, 0x3c, - 0x0a, 0x08, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x71, 0x75, - 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x71, 0x75, - 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x87, 0x01, 0x0a, - 0x07, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x61, 0x6d, 0x70, + 0x65, 0x22, 0xa4, 0x01, 0x0a, 0x07, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, + 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x52, 0x08, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x12, + 0x47, 0x0a, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3c, 0x0a, 0x08, 0x51, 0x75, 0x61, 0x6e, + 0x74, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xd0, 0x01, 0x0a, 0x07, 0x53, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, + 0x73, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x73, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x53, 0x75, 0x6d, 0x12, 0x3a, 0x0a, 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, + 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x75, + 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x12, 0x47, 0x0a, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x1f, 0x0a, 0x07, 0x55, 0x6e, 0x74, + 0x79, 0x70, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xea, 0x05, 0x0a, 0x09, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, - 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x09, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x3a, 0x0a, 0x08, 0x71, 0x75, - 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, - 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x71, 0x75, - 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x22, 0x1f, 0x0a, 0x07, 0x55, 0x6e, 0x74, 0x79, 0x70, 0x65, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xe3, 0x04, 0x0a, 0x09, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x73, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x61, 0x6d, 0x70, - 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, - 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x73, 0x61, 0x6d, 0x70, - 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x34, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, - 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x11, 0x52, 0x06, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x74, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x7a, 0x65, 0x72, - 0x6f, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x7a, 0x65, - 0x72, 0x6f, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, - 0x7a, 0x65, 0x72, 0x6f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x7a, 0x65, 0x72, - 0x6f, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x0e, 0x7a, 0x65, 0x72, 0x6f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x6c, - 0x6f, 0x61, 0x74, 0x12, 0x45, 0x0a, 0x0d, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, - 0x73, 0x70, 0x61, 0x6e, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6f, 0x2e, - 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x52, 0x0c, 0x6e, 0x65, - 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x65, - 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x03, - 0x28, 0x12, 0x52, 0x0d, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x6c, 0x74, - 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x01, 0x52, 0x0d, 0x6e, 0x65, 0x67, 0x61, 0x74, - 0x69, 0x76, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x0d, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x6e, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x70, 0x61, - 0x6e, 0x52, 0x0c, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x12, - 0x25, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x74, - 0x61, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x12, 0x52, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, - 0x65, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x01, 0x52, 0x0d, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xc6, 0x01, - 0x0a, 0x06, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x75, 0x6d, 0x75, - 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0f, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, - 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x70, - 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, - 0x75, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x78, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, - 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x52, 0x08, 0x65, 0x78, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x22, 0x3c, 0x0a, 0x0a, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x53, 0x70, 0x61, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x11, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6c, 0x65, - 0x6e, 0x67, 0x74, 0x68, 0x22, 0x91, 0x01, 0x0a, 0x08, 0x45, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x72, 0x12, 0x35, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x50, 0x61, 0x69, - 0x72, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x38, - 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xff, 0x02, 0x0a, 0x06, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x12, 0x35, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, - 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x50, - 0x61, 0x69, 0x72, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x31, 0x0a, 0x05, 0x67, 0x61, - 0x75, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6f, 0x2e, 0x70, - 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x2e, 0x47, 0x61, 0x75, 0x67, 0x65, 0x52, 0x05, 0x67, 0x61, 0x75, 0x67, 0x65, 0x12, 0x37, 0x0a, - 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, - 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x53, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, - 0x37, 0x0a, 0x07, 0x75, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x52, - 0x07, 0x75, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x09, 0x68, 0x69, 0x73, 0x74, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6f, + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x73, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x73, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x34, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, + 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, + 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x47, + 0x0a, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x11, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, + 0x25, 0x0a, 0x0e, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x7a, 0x65, 0x72, 0x6f, 0x54, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x7a, 0x65, 0x72, 0x6f, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x0e, 0x7a, 0x65, 0x72, 0x6f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, + 0x45, 0x0a, 0x0d, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x6e, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, + 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x52, 0x0c, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x12, 0x52, 0x0d, + 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x25, 0x0a, + 0x0e, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x0b, 0x20, 0x03, 0x28, 0x01, 0x52, 0x0d, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, + 0x5f, 0x73, 0x70, 0x61, 0x6e, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x09, 0x68, 0x69, - 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4d, 0x73, 0x22, 0xa2, 0x01, 0x0a, 0x0c, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x68, 0x65, 0x6c, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, - 0x65, 0x6c, 0x70, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, - 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x70, - 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x2a, - 0x62, 0x0a, 0x0a, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, - 0x07, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x41, - 0x55, 0x47, 0x45, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x4d, 0x4d, 0x41, 0x52, 0x59, - 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x44, 0x10, 0x03, 0x12, - 0x0d, 0x0a, 0x09, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x10, 0x04, 0x12, 0x13, - 0x0a, 0x0f, 0x47, 0x41, 0x55, 0x47, 0x45, 0x5f, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x47, 0x52, 0x41, - 0x4d, 0x10, 0x05, 0x42, 0x52, 0x0a, 0x14, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, - 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5a, 0x3a, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, - 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2f, - 0x67, 0x6f, 0x3b, 0x69, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, - 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x6e, 0x74, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x52, 0x0c, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x0d, 0x20, + 0x03, 0x28, 0x12, 0x52, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x6c, + 0x74, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x01, 0x52, 0x0d, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x09, 0x65, 0x78, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, + 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x52, 0x09, 0x65, 0x78, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x73, 0x22, 0xc6, 0x01, 0x0a, 0x06, 0x42, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x63, 0x75, + 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, + 0x16, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, + 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x6c, + 0x6f, 0x61, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x75, 0x70, 0x70, 0x65, 0x72, 0x42, + 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, + 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x52, 0x08, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, + 0x22, 0x3c, 0x0a, 0x0a, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x12, 0x16, + 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x11, 0x52, 0x06, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x91, + 0x01, 0x0a, 0x08, 0x45, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x12, 0x35, 0x0a, 0x05, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, + 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x50, 0x61, 0x69, 0x72, 0x52, 0x05, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x22, 0xff, 0x02, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x35, 0x0a, + 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, + 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x50, 0x61, 0x69, 0x72, 0x52, 0x05, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x12, 0x31, 0x0a, 0x05, 0x67, 0x61, 0x75, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, + 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x61, 0x75, 0x67, 0x65, + 0x52, 0x05, 0x67, 0x61, 0x75, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, + 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x12, 0x37, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, + 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x37, 0x0a, 0x07, 0x75, 0x6e, 0x74, + 0x79, 0x70, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, + 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x2e, 0x55, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x52, 0x07, 0x75, 0x6e, 0x74, 0x79, 0x70, + 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x09, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, + 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x09, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x6d, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x4d, 0x73, 0x22, 0xb6, 0x01, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x46, + 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x65, 0x6c, + 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x65, 0x6c, 0x70, 0x12, 0x34, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6f, + 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, + 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x6e, 0x69, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x2a, 0x62, 0x0a, + 0x0a, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x43, + 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x41, 0x55, 0x47, + 0x45, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x4d, 0x4d, 0x41, 0x52, 0x59, 0x10, 0x02, + 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0d, 0x0a, + 0x09, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, + 0x47, 0x41, 0x55, 0x47, 0x45, 0x5f, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x10, + 0x05, 0x42, 0x52, 0x0a, 0x14, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, + 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, + 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2f, 0x67, 0x6f, + 0x3b, 0x69, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x5f, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, } var ( @@ -1137,26 +1200,30 @@ var file_io_prometheus_client_metrics_proto_goTypes = []interface{}{ } var file_io_prometheus_client_metrics_proto_depIdxs = []int32{ 10, // 0: io.prometheus.client.Counter.exemplar:type_name -> io.prometheus.client.Exemplar - 4, // 1: io.prometheus.client.Summary.quantile:type_name -> io.prometheus.client.Quantile - 8, // 2: io.prometheus.client.Histogram.bucket:type_name -> io.prometheus.client.Bucket - 9, // 3: io.prometheus.client.Histogram.negative_span:type_name -> io.prometheus.client.BucketSpan - 9, // 4: io.prometheus.client.Histogram.positive_span:type_name -> io.prometheus.client.BucketSpan - 10, // 5: io.prometheus.client.Bucket.exemplar:type_name -> io.prometheus.client.Exemplar - 1, // 6: io.prometheus.client.Exemplar.label:type_name -> io.prometheus.client.LabelPair - 13, // 7: io.prometheus.client.Exemplar.timestamp:type_name -> google.protobuf.Timestamp - 1, // 8: io.prometheus.client.Metric.label:type_name -> io.prometheus.client.LabelPair - 2, // 9: io.prometheus.client.Metric.gauge:type_name -> io.prometheus.client.Gauge - 3, // 10: io.prometheus.client.Metric.counter:type_name -> io.prometheus.client.Counter - 5, // 11: io.prometheus.client.Metric.summary:type_name -> io.prometheus.client.Summary - 6, // 12: io.prometheus.client.Metric.untyped:type_name -> io.prometheus.client.Untyped - 7, // 13: io.prometheus.client.Metric.histogram:type_name -> io.prometheus.client.Histogram - 0, // 14: io.prometheus.client.MetricFamily.type:type_name -> io.prometheus.client.MetricType - 11, // 15: io.prometheus.client.MetricFamily.metric:type_name -> io.prometheus.client.Metric - 16, // [16:16] is the sub-list for method output_type - 16, // [16:16] is the sub-list for method input_type - 16, // [16:16] is the sub-list for extension type_name - 16, // [16:16] is the sub-list for extension extendee - 0, // [0:16] is the sub-list for field type_name + 13, // 1: io.prometheus.client.Counter.created_timestamp:type_name -> google.protobuf.Timestamp + 4, // 2: io.prometheus.client.Summary.quantile:type_name -> io.prometheus.client.Quantile + 13, // 3: io.prometheus.client.Summary.created_timestamp:type_name -> google.protobuf.Timestamp + 8, // 4: io.prometheus.client.Histogram.bucket:type_name -> io.prometheus.client.Bucket + 13, // 5: io.prometheus.client.Histogram.created_timestamp:type_name -> google.protobuf.Timestamp + 9, // 6: io.prometheus.client.Histogram.negative_span:type_name -> io.prometheus.client.BucketSpan + 9, // 7: io.prometheus.client.Histogram.positive_span:type_name -> io.prometheus.client.BucketSpan + 10, // 8: io.prometheus.client.Histogram.exemplars:type_name -> io.prometheus.client.Exemplar + 10, // 9: io.prometheus.client.Bucket.exemplar:type_name -> io.prometheus.client.Exemplar + 1, // 10: io.prometheus.client.Exemplar.label:type_name -> io.prometheus.client.LabelPair + 13, // 11: io.prometheus.client.Exemplar.timestamp:type_name -> google.protobuf.Timestamp + 1, // 12: io.prometheus.client.Metric.label:type_name -> io.prometheus.client.LabelPair + 2, // 13: io.prometheus.client.Metric.gauge:type_name -> io.prometheus.client.Gauge + 3, // 14: io.prometheus.client.Metric.counter:type_name -> io.prometheus.client.Counter + 5, // 15: io.prometheus.client.Metric.summary:type_name -> io.prometheus.client.Summary + 6, // 16: io.prometheus.client.Metric.untyped:type_name -> io.prometheus.client.Untyped + 7, // 17: io.prometheus.client.Metric.histogram:type_name -> io.prometheus.client.Histogram + 0, // 18: io.prometheus.client.MetricFamily.type:type_name -> io.prometheus.client.MetricType + 11, // 19: io.prometheus.client.MetricFamily.metric:type_name -> io.prometheus.client.Metric + 20, // [20:20] is the sub-list for method output_type + 20, // [20:20] is the sub-list for method input_type + 20, // [20:20] is the sub-list for extension type_name + 20, // [20:20] is the sub-list for extension extendee + 0, // [0:20] is the sub-list for field type_name } func init() { file_io_prometheus_client_metrics_proto_init() } diff --git a/vendor/github.com/prometheus/common/expfmt/decode.go b/vendor/github.com/prometheus/common/expfmt/decode.go index f4fc88455..b2b89b017 100644 --- a/vendor/github.com/prometheus/common/expfmt/decode.go +++ b/vendor/github.com/prometheus/common/expfmt/decode.go @@ -14,6 +14,7 @@ package expfmt import ( + "bufio" "fmt" "io" "math" @@ -21,8 +22,8 @@ import ( "net/http" dto "github.com/prometheus/client_model/go" + "google.golang.org/protobuf/encoding/protodelim" - "github.com/matttproud/golang_protobuf_extensions/pbutil" "github.com/prometheus/common/model" ) @@ -44,7 +45,7 @@ func ResponseFormat(h http.Header) Format { mediatype, params, err := mime.ParseMediaType(ct) if err != nil { - return FmtUnknown + return fmtUnknown } const textType = "text/plain" @@ -52,28 +53,28 @@ func ResponseFormat(h http.Header) Format { switch mediatype { case ProtoType: if p, ok := params["proto"]; ok && p != ProtoProtocol { - return FmtUnknown + return fmtUnknown } if e, ok := params["encoding"]; ok && e != "delimited" { - return FmtUnknown + return fmtUnknown } - return FmtProtoDelim + return fmtProtoDelim case textType: if v, ok := params["version"]; ok && v != TextVersion { - return FmtUnknown + return fmtUnknown } - return FmtText + return fmtText } - return FmtUnknown + return fmtUnknown } // NewDecoder returns a new decoder based on the given input format. // If the input format does not imply otherwise, a text format decoder is returned. func NewDecoder(r io.Reader, format Format) Decoder { - switch format { - case FmtProtoDelim: + switch format.FormatType() { + case TypeProtoDelim: return &protoDecoder{r: r} } return &textDecoder{r: r} @@ -86,8 +87,10 @@ type protoDecoder struct { // Decode implements the Decoder interface. func (d *protoDecoder) Decode(v *dto.MetricFamily) error { - _, err := pbutil.ReadDelimited(d.r, v) - if err != nil { + opts := protodelim.UnmarshalOptions{ + MaxSize: -1, + } + if err := opts.UnmarshalFrom(bufio.NewReader(d.r), v); err != nil { return err } if !model.IsValidMetricName(model.LabelValue(v.GetName())) { @@ -132,7 +135,10 @@ func (d *textDecoder) Decode(v *dto.MetricFamily) error { } // Pick off one MetricFamily per Decode until there's nothing left. for key, fam := range d.fams { - *v = *fam + v.Name = fam.Name + v.Help = fam.Help + v.Type = fam.Type + v.Metric = fam.Metric delete(d.fams, key) return nil } diff --git a/vendor/github.com/prometheus/common/expfmt/encode.go b/vendor/github.com/prometheus/common/expfmt/encode.go index 64dc0eb40..8fd806184 100644 --- a/vendor/github.com/prometheus/common/expfmt/encode.go +++ b/vendor/github.com/prometheus/common/expfmt/encode.go @@ -18,9 +18,11 @@ import ( "io" "net/http" - "github.com/golang/protobuf/proto" //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. - "github.com/matttproud/golang_protobuf_extensions/pbutil" + "google.golang.org/protobuf/encoding/protodelim" + "google.golang.org/protobuf/encoding/prototext" + "github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg" + "github.com/prometheus/common/model" dto "github.com/prometheus/client_model/go" ) @@ -60,23 +62,32 @@ func (ec encoderCloser) Close() error { // as the support is still experimental. To include the option to negotiate // FmtOpenMetrics, use NegotiateOpenMetrics. func Negotiate(h http.Header) Format { + escapingScheme := Format(fmt.Sprintf("; escaping=%s", Format(model.NameEscapingScheme.String()))) for _, ac := range goautoneg.ParseAccept(h.Get(hdrAccept)) { + if escapeParam := ac.Params[model.EscapingKey]; escapeParam != "" { + switch Format(escapeParam) { + case model.AllowUTF8, model.EscapeUnderscores, model.EscapeDots, model.EscapeValues: + escapingScheme = Format(fmt.Sprintf("; escaping=%s", escapeParam)) + default: + // If the escaping parameter is unknown, ignore it. + } + } ver := ac.Params["version"] if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol { switch ac.Params["encoding"] { case "delimited": - return FmtProtoDelim + return fmtProtoDelim + escapingScheme case "text": - return FmtProtoText + return fmtProtoText + escapingScheme case "compact-text": - return FmtProtoCompact + return fmtProtoCompact + escapingScheme } } if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") { - return FmtText + return fmtText + escapingScheme } } - return FmtText + return fmtText + escapingScheme } // NegotiateIncludingOpenMetrics works like Negotiate but includes @@ -84,26 +95,40 @@ func Negotiate(h http.Header) Format { // temporary and will disappear once FmtOpenMetrics is fully supported and as // such may be negotiated by the normal Negotiate function. func NegotiateIncludingOpenMetrics(h http.Header) Format { + escapingScheme := Format(fmt.Sprintf("; escaping=%s", Format(model.NameEscapingScheme.String()))) for _, ac := range goautoneg.ParseAccept(h.Get(hdrAccept)) { + if escapeParam := ac.Params[model.EscapingKey]; escapeParam != "" { + switch Format(escapeParam) { + case model.AllowUTF8, model.EscapeUnderscores, model.EscapeDots, model.EscapeValues: + escapingScheme = Format(fmt.Sprintf("; escaping=%s", escapeParam)) + default: + // If the escaping parameter is unknown, ignore it. + } + } ver := ac.Params["version"] if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol { switch ac.Params["encoding"] { case "delimited": - return FmtProtoDelim + return fmtProtoDelim + escapingScheme case "text": - return FmtProtoText + return fmtProtoText + escapingScheme case "compact-text": - return FmtProtoCompact + return fmtProtoCompact + escapingScheme } } if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") { - return FmtText + return fmtText + escapingScheme } - if ac.Type+"/"+ac.SubType == OpenMetricsType && (ver == OpenMetricsVersion || ver == "") { - return FmtOpenMetrics + if ac.Type+"/"+ac.SubType == OpenMetricsType && (ver == OpenMetricsVersion_0_0_1 || ver == OpenMetricsVersion_1_0_0 || ver == "") { + switch ver { + case OpenMetricsVersion_1_0_0: + return fmtOpenMetrics_1_0_0 + escapingScheme + default: + return fmtOpenMetrics_0_0_1 + escapingScheme + } } } - return FmtText + return fmtText + escapingScheme } // NewEncoder returns a new encoder based on content type negotiation. All @@ -112,44 +137,48 @@ func NegotiateIncludingOpenMetrics(h http.Header) Format { // for FmtOpenMetrics, but a future (breaking) release will add the Close method // to the Encoder interface directly. The current version of the Encoder // interface is kept for backwards compatibility. +// In cases where the Format does not allow for UTF-8 names, the global +// NameEscapingScheme will be applied. func NewEncoder(w io.Writer, format Format) Encoder { - switch format { - case FmtProtoDelim: + escapingScheme := format.ToEscapingScheme() + + switch format.FormatType() { + case TypeProtoDelim: return encoderCloser{ encode: func(v *dto.MetricFamily) error { - _, err := pbutil.WriteDelimited(w, v) + _, err := protodelim.MarshalTo(w, v) return err }, close: func() error { return nil }, } - case FmtProtoCompact: + case TypeProtoCompact: return encoderCloser{ encode: func(v *dto.MetricFamily) error { - _, err := fmt.Fprintln(w, v.String()) + _, err := fmt.Fprintln(w, model.EscapeMetricFamily(v, escapingScheme).String()) return err }, close: func() error { return nil }, } - case FmtProtoText: + case TypeProtoText: return encoderCloser{ encode: func(v *dto.MetricFamily) error { - _, err := fmt.Fprintln(w, proto.MarshalTextString(v)) + _, err := fmt.Fprintln(w, prototext.Format(model.EscapeMetricFamily(v, escapingScheme))) return err }, close: func() error { return nil }, } - case FmtText: + case TypeTextPlain: return encoderCloser{ encode: func(v *dto.MetricFamily) error { - _, err := MetricFamilyToText(w, v) + _, err := MetricFamilyToText(w, model.EscapeMetricFamily(v, escapingScheme)) return err }, close: func() error { return nil }, } - case FmtOpenMetrics: + case TypeOpenMetrics: return encoderCloser{ encode: func(v *dto.MetricFamily) error { - _, err := MetricFamilyToOpenMetrics(w, v) + _, err := MetricFamilyToOpenMetrics(w, model.EscapeMetricFamily(v, escapingScheme)) return err }, close: func() error { diff --git a/vendor/github.com/prometheus/common/expfmt/expfmt.go b/vendor/github.com/prometheus/common/expfmt/expfmt.go index 0f176fa64..6fc9555e3 100644 --- a/vendor/github.com/prometheus/common/expfmt/expfmt.go +++ b/vendor/github.com/prometheus/common/expfmt/expfmt.go @@ -14,28 +14,154 @@ // Package expfmt contains tools for reading and writing Prometheus metrics. package expfmt +import ( + "strings" + + "github.com/prometheus/common/model" +) + // Format specifies the HTTP content type of the different wire protocols. type Format string -// Constants to assemble the Content-Type values for the different wire protocols. +// Constants to assemble the Content-Type values for the different wire +// protocols. The Content-Type strings here are all for the legacy exposition +// formats, where valid characters for metric names and label names are limited. +// Support for arbitrary UTF-8 characters in those names is already partially +// implemented in this module (see model.ValidationScheme), but to actually use +// it on the wire, new content-type strings will have to be agreed upon and +// added here. const ( - TextVersion = "0.0.4" - ProtoType = `application/vnd.google.protobuf` - ProtoProtocol = `io.prometheus.client.MetricFamily` - ProtoFmt = ProtoType + "; proto=" + ProtoProtocol + ";" - OpenMetricsType = `application/openmetrics-text` - OpenMetricsVersion = "0.0.1" + TextVersion = "0.0.4" + ProtoType = `application/vnd.google.protobuf` + ProtoProtocol = `io.prometheus.client.MetricFamily` + protoFmt = ProtoType + "; proto=" + ProtoProtocol + ";" + OpenMetricsType = `application/openmetrics-text` + OpenMetricsVersion_0_0_1 = "0.0.1" + OpenMetricsVersion_1_0_0 = "1.0.0" - // The Content-Type values for the different wire protocols. - FmtUnknown Format = `` - FmtText Format = `text/plain; version=` + TextVersion + `; charset=utf-8` - FmtProtoDelim Format = ProtoFmt + ` encoding=delimited` - FmtProtoText Format = ProtoFmt + ` encoding=text` - FmtProtoCompact Format = ProtoFmt + ` encoding=compact-text` - FmtOpenMetrics Format = OpenMetricsType + `; version=` + OpenMetricsVersion + `; charset=utf-8` + // The Content-Type values for the different wire protocols. Note that these + // values are now unexported. If code was relying on comparisons to these + // constants, instead use FormatType(). + fmtUnknown Format = `` + fmtText Format = `text/plain; version=` + TextVersion + `; charset=utf-8` + fmtProtoDelim Format = protoFmt + ` encoding=delimited` + fmtProtoText Format = protoFmt + ` encoding=text` + fmtProtoCompact Format = protoFmt + ` encoding=compact-text` + fmtOpenMetrics_1_0_0 Format = OpenMetricsType + `; version=` + OpenMetricsVersion_1_0_0 + `; charset=utf-8` + fmtOpenMetrics_0_0_1 Format = OpenMetricsType + `; version=` + OpenMetricsVersion_0_0_1 + `; charset=utf-8` ) const ( hdrContentType = "Content-Type" hdrAccept = "Accept" ) + +// FormatType is a Go enum representing the overall category for the given +// Format. As the number of Format permutations increases, doing basic string +// comparisons are not feasible, so this enum captures the most useful +// high-level attribute of the Format string. +type FormatType int + +const ( + TypeUnknown = iota + TypeProtoCompact + TypeProtoDelim + TypeProtoText + TypeTextPlain + TypeOpenMetrics +) + +// NewFormat generates a new Format from the type provided. Mostly used for +// tests, most Formats should be generated as part of content negotiation in +// encode.go. +func NewFormat(t FormatType) Format { + switch t { + case TypeProtoCompact: + return fmtProtoCompact + case TypeProtoDelim: + return fmtProtoDelim + case TypeProtoText: + return fmtProtoText + case TypeTextPlain: + return fmtText + case TypeOpenMetrics: + return fmtOpenMetrics_1_0_0 + default: + return fmtUnknown + } +} + +// FormatType deduces an overall FormatType for the given format. +func (f Format) FormatType() FormatType { + toks := strings.Split(string(f), ";") + if len(toks) < 2 { + return TypeUnknown + } + + params := make(map[string]string) + for i, t := range toks { + if i == 0 { + continue + } + args := strings.Split(t, "=") + if len(args) != 2 { + continue + } + params[strings.TrimSpace(args[0])] = strings.TrimSpace(args[1]) + } + + switch strings.TrimSpace(toks[0]) { + case ProtoType: + if params["proto"] != ProtoProtocol { + return TypeUnknown + } + switch params["encoding"] { + case "delimited": + return TypeProtoDelim + case "text": + return TypeProtoText + case "compact-text": + return TypeProtoCompact + default: + return TypeUnknown + } + case OpenMetricsType: + if params["charset"] != "utf-8" { + return TypeUnknown + } + return TypeOpenMetrics + case "text/plain": + v, ok := params["version"] + if !ok { + return TypeTextPlain + } + if v == TextVersion { + return TypeTextPlain + } + return TypeUnknown + default: + return TypeUnknown + } +} + +// ToEscapingScheme returns an EscapingScheme depending on the Format. Iff the +// Format contains a escaping=allow-utf-8 term, it will select NoEscaping. If a valid +// "escaping" term exists, that will be used. Otherwise, the global default will +// be returned. +func (format Format) ToEscapingScheme() model.EscapingScheme { + for _, p := range strings.Split(string(format), ";") { + toks := strings.Split(p, "=") + if len(toks) != 2 { + continue + } + key, value := strings.TrimSpace(toks[0]), strings.TrimSpace(toks[1]) + if key == model.EscapingKey { + scheme, err := model.ToEscapingScheme(value) + if err != nil { + return model.NameEscapingScheme + } + return scheme + } + } + return model.NameEscapingScheme +} diff --git a/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go b/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go index 21cdddcf0..5622578ed 100644 --- a/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go +++ b/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go @@ -35,6 +35,18 @@ import ( // sanity checks. If the input contains duplicate metrics or invalid metric or // label names, the conversion will result in invalid text format output. // +// If metric names conform to the legacy validation pattern, they will be placed +// outside the brackets in the traditional way, like `foo{}`. If the metric name +// fails the legacy validation check, it will be placed quoted inside the +// brackets: `{"foo"}`. As stated above, the input is assumed to be santized and +// no error will be thrown in this case. +// +// Similar to metric names, if label names conform to the legacy validation +// pattern, they will be unquoted as normal, like `foo{bar="baz"}`. If the label +// name fails the legacy validation check, it will be quoted: +// `foo{"bar"="baz"}`. As stated above, the input is assumed to be santized and +// no error will be thrown in this case. +// // This function fulfills the type 'expfmt.encoder'. // // Note that OpenMetrics requires a final `# EOF` line. Since this function acts @@ -98,7 +110,7 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily) (written int if err != nil { return } - n, err = w.WriteString(shortName) + n, err = writeName(w, shortName) written += n if err != nil { return @@ -124,7 +136,7 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily) (written int if err != nil { return } - n, err = w.WriteString(shortName) + n, err = writeName(w, shortName) written += n if err != nil { return @@ -303,21 +315,9 @@ func writeOpenMetricsSample( floatValue float64, intValue uint64, useIntValue bool, exemplar *dto.Exemplar, ) (int, error) { - var written int - n, err := w.WriteString(name) - written += n - if err != nil { - return written, err - } - if suffix != "" { - n, err = w.WriteString(suffix) - written += n - if err != nil { - return written, err - } - } - n, err = writeOpenMetricsLabelPairs( - w, metric.Label, additionalLabelName, additionalLabelValue, + written := 0 + n, err := writeOpenMetricsNameAndLabelPairs( + w, name+suffix, metric.Label, additionalLabelName, additionalLabelValue, ) written += n if err != nil { @@ -365,27 +365,58 @@ func writeOpenMetricsSample( return written, nil } -// writeOpenMetricsLabelPairs works like writeOpenMetrics but formats the float -// in OpenMetrics style. -func writeOpenMetricsLabelPairs( +// writeOpenMetricsNameAndLabelPairs works like writeOpenMetricsSample but +// formats the float in OpenMetrics style. +func writeOpenMetricsNameAndLabelPairs( w enhancedWriter, + name string, in []*dto.LabelPair, additionalLabelName string, additionalLabelValue float64, ) (int, error) { - if len(in) == 0 && additionalLabelName == "" { - return 0, nil - } var ( - written int - separator byte = '{' + written int + separator byte = '{' + metricInsideBraces = false ) + + if name != "" { + // If the name does not pass the legacy validity check, we must put the + // metric name inside the braces, quoted. + if !model.IsValidLegacyMetricName(model.LabelValue(name)) { + metricInsideBraces = true + err := w.WriteByte(separator) + written++ + if err != nil { + return written, err + } + separator = ',' + } + + n, err := writeName(w, name) + written += n + if err != nil { + return written, err + } + } + + if len(in) == 0 && additionalLabelName == "" { + if metricInsideBraces { + err := w.WriteByte('}') + written++ + if err != nil { + return written, err + } + } + return written, nil + } + for _, lp := range in { err := w.WriteByte(separator) written++ if err != nil { return written, err } - n, err := w.WriteString(lp.GetName()) + n, err := writeName(w, lp.GetName()) written += n if err != nil { return written, err @@ -451,7 +482,7 @@ func writeExemplar(w enhancedWriter, e *dto.Exemplar) (int, error) { if err != nil { return written, err } - n, err = writeOpenMetricsLabelPairs(w, e.Label, "", 0) + n, err = writeOpenMetricsNameAndLabelPairs(w, "", e.Label, "", 0) written += n if err != nil { return written, err diff --git a/vendor/github.com/prometheus/common/expfmt/text_create.go b/vendor/github.com/prometheus/common/expfmt/text_create.go index 2946b8f1a..f9b8265a9 100644 --- a/vendor/github.com/prometheus/common/expfmt/text_create.go +++ b/vendor/github.com/prometheus/common/expfmt/text_create.go @@ -62,6 +62,18 @@ var ( // contains duplicate metrics or invalid metric or label names, the conversion // will result in invalid text format output. // +// If metric names conform to the legacy validation pattern, they will be placed +// outside the brackets in the traditional way, like `foo{}`. If the metric name +// fails the legacy validation check, it will be placed quoted inside the +// brackets: `{"foo"}`. As stated above, the input is assumed to be santized and +// no error will be thrown in this case. +// +// Similar to metric names, if label names conform to the legacy validation +// pattern, they will be unquoted as normal, like `foo{bar="baz"}`. If the label +// name fails the legacy validation check, it will be quoted: +// `foo{"bar"="baz"}`. As stated above, the input is assumed to be santized and +// no error will be thrown in this case. +// // This method fulfills the type 'prometheus.encoder'. func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err error) { // Fail-fast checks. @@ -98,7 +110,7 @@ func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err e if err != nil { return } - n, err = w.WriteString(name) + n, err = writeName(w, name) written += n if err != nil { return @@ -124,7 +136,7 @@ func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err e if err != nil { return } - n, err = w.WriteString(name) + n, err = writeName(w, name) written += n if err != nil { return @@ -280,21 +292,9 @@ func writeSample( additionalLabelName string, additionalLabelValue float64, value float64, ) (int, error) { - var written int - n, err := w.WriteString(name) - written += n - if err != nil { - return written, err - } - if suffix != "" { - n, err = w.WriteString(suffix) - written += n - if err != nil { - return written, err - } - } - n, err = writeLabelPairs( - w, metric.Label, additionalLabelName, additionalLabelValue, + written := 0 + n, err := writeNameAndLabelPairs( + w, name+suffix, metric.Label, additionalLabelName, additionalLabelValue, ) written += n if err != nil { @@ -330,32 +330,64 @@ func writeSample( return written, nil } -// writeLabelPairs converts a slice of LabelPair proto messages plus the -// explicitly given additional label pair into text formatted as required by the -// text format and writes it to 'w'. An empty slice in combination with an empty -// string 'additionalLabelName' results in nothing being written. Otherwise, the -// label pairs are written, escaped as required by the text format, and enclosed -// in '{...}'. The function returns the number of bytes written and any error -// encountered. -func writeLabelPairs( +// writeNameAndLabelPairs converts a slice of LabelPair proto messages plus the +// explicitly given metric name and additional label pair into text formatted as +// required by the text format and writes it to 'w'. An empty slice in +// combination with an empty string 'additionalLabelName' results in nothing +// being written. Otherwise, the label pairs are written, escaped as required by +// the text format, and enclosed in '{...}'. The function returns the number of +// bytes written and any error encountered. If the metric name is not +// legacy-valid, it will be put inside the brackets as well. Legacy-invalid +// label names will also be quoted. +func writeNameAndLabelPairs( w enhancedWriter, + name string, in []*dto.LabelPair, additionalLabelName string, additionalLabelValue float64, ) (int, error) { - if len(in) == 0 && additionalLabelName == "" { - return 0, nil - } var ( - written int - separator byte = '{' + written int + separator byte = '{' + metricInsideBraces = false ) + + if name != "" { + // If the name does not pass the legacy validity check, we must put the + // metric name inside the braces. + if !model.IsValidLegacyMetricName(model.LabelValue(name)) { + metricInsideBraces = true + err := w.WriteByte(separator) + written++ + if err != nil { + return written, err + } + separator = ',' + } + n, err := writeName(w, name) + written += n + if err != nil { + return written, err + } + } + + if len(in) == 0 && additionalLabelName == "" { + if metricInsideBraces { + err := w.WriteByte('}') + written++ + if err != nil { + return written, err + } + } + return written, nil + } + for _, lp := range in { err := w.WriteByte(separator) written++ if err != nil { return written, err } - n, err := w.WriteString(lp.GetName()) + n, err := writeName(w, lp.GetName()) written += n if err != nil { return written, err @@ -462,3 +494,27 @@ func writeInt(w enhancedWriter, i int64) (int, error) { numBufPool.Put(bp) return written, err } + +// writeName writes a string as-is if it complies with the legacy naming +// scheme, or escapes it in double quotes if not. +func writeName(w enhancedWriter, name string) (int, error) { + if model.IsValidLegacyMetricName(model.LabelValue(name)) { + return w.WriteString(name) + } + var written int + var err error + err = w.WriteByte('"') + written++ + if err != nil { + return written, err + } + var n int + n, err = writeEscapedString(w, name, true) + written += n + if err != nil { + return written, err + } + err = w.WriteByte('"') + written++ + return written, err +} diff --git a/vendor/github.com/prometheus/common/expfmt/text_parse.go b/vendor/github.com/prometheus/common/expfmt/text_parse.go index ac2482782..26490211a 100644 --- a/vendor/github.com/prometheus/common/expfmt/text_parse.go +++ b/vendor/github.com/prometheus/common/expfmt/text_parse.go @@ -16,6 +16,7 @@ package expfmt import ( "bufio" "bytes" + "errors" "fmt" "io" "math" @@ -24,7 +25,8 @@ import ( dto "github.com/prometheus/client_model/go" - "github.com/golang/protobuf/proto" //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. + "google.golang.org/protobuf/proto" + "github.com/prometheus/common/model" ) @@ -112,7 +114,7 @@ func (p *TextParser) TextToMetricFamilies(in io.Reader) (map[string]*dto.MetricF // stream. Turn this error into something nicer and more // meaningful. (io.EOF is often used as a signal for the legitimate end // of an input stream.) - if p.err == io.EOF { + if p.err != nil && errors.Is(p.err, io.EOF) { p.parseError("unexpected end of input stream") } return p.metricFamiliesByName, p.err @@ -146,7 +148,7 @@ func (p *TextParser) startOfLine() stateFn { // which is not an error but the signal that we are done. // Any other error that happens to align with the start of // a line is still an error. - if p.err == io.EOF { + if errors.Is(p.err, io.EOF) { p.err = nil } return nil diff --git a/vendor/github.com/prometheus/common/model/alert.go b/vendor/github.com/prometheus/common/model/alert.go index 35e739c7a..178fdbaf6 100644 --- a/vendor/github.com/prometheus/common/model/alert.go +++ b/vendor/github.com/prometheus/common/model/alert.go @@ -90,13 +90,13 @@ func (a *Alert) Validate() error { return fmt.Errorf("start time must be before end time") } if err := a.Labels.Validate(); err != nil { - return fmt.Errorf("invalid label set: %s", err) + return fmt.Errorf("invalid label set: %w", err) } if len(a.Labels) == 0 { return fmt.Errorf("at least one label pair required") } if err := a.Annotations.Validate(); err != nil { - return fmt.Errorf("invalid annotations: %s", err) + return fmt.Errorf("invalid annotations: %w", err) } return nil } diff --git a/vendor/github.com/prometheus/common/model/labels.go b/vendor/github.com/prometheus/common/model/labels.go index ef8956335..3317ce22f 100644 --- a/vendor/github.com/prometheus/common/model/labels.go +++ b/vendor/github.com/prometheus/common/model/labels.go @@ -97,17 +97,25 @@ var LabelNameRE = regexp.MustCompile("^[a-zA-Z_][a-zA-Z0-9_]*$") // therewith. type LabelName string -// IsValid is true iff the label name matches the pattern of LabelNameRE. This -// method, however, does not use LabelNameRE for the check but a much faster -// hardcoded implementation. +// IsValid returns true iff name matches the pattern of LabelNameRE for legacy +// names, and iff it's valid UTF-8 if NameValidationScheme is set to +// UTF8Validation. For the legacy matching, it does not use LabelNameRE for the +// check but a much faster hardcoded implementation. func (ln LabelName) IsValid() bool { if len(ln) == 0 { return false } - for i, b := range ln { - if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || (b >= '0' && b <= '9' && i > 0)) { - return false + switch NameValidationScheme { + case LegacyValidation: + for i, b := range ln { + if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || (b >= '0' && b <= '9' && i > 0)) { + return false + } } + case UTF8Validation: + return utf8.ValidString(string(ln)) + default: + panic(fmt.Sprintf("Invalid name validation scheme requested: %d", NameValidationScheme)) } return true } @@ -164,7 +172,7 @@ func (l LabelNames) String() string { // A LabelValue is an associated value for a LabelName. type LabelValue string -// IsValid returns true iff the string is a valid UTF8. +// IsValid returns true iff the string is a valid UTF-8. func (lv LabelValue) IsValid() bool { return utf8.ValidString(string(lv)) } diff --git a/vendor/github.com/prometheus/common/model/metadata.go b/vendor/github.com/prometheus/common/model/metadata.go new file mode 100644 index 000000000..447ab8ad6 --- /dev/null +++ b/vendor/github.com/prometheus/common/model/metadata.go @@ -0,0 +1,28 @@ +// Copyright 2023 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +// MetricType represents metric type values. +type MetricType string + +const ( + MetricTypeCounter = MetricType("counter") + MetricTypeGauge = MetricType("gauge") + MetricTypeHistogram = MetricType("histogram") + MetricTypeGaugeHistogram = MetricType("gaugehistogram") + MetricTypeSummary = MetricType("summary") + MetricTypeInfo = MetricType("info") + MetricTypeStateset = MetricType("stateset") + MetricTypeUnknown = MetricType("unknown") +) diff --git a/vendor/github.com/prometheus/common/model/metric.go b/vendor/github.com/prometheus/common/model/metric.go index 00804b7fe..0bd29b3a3 100644 --- a/vendor/github.com/prometheus/common/model/metric.go +++ b/vendor/github.com/prometheus/common/model/metric.go @@ -18,15 +18,84 @@ import ( "regexp" "sort" "strings" + "unicode/utf8" + + dto "github.com/prometheus/client_model/go" + "google.golang.org/protobuf/proto" ) var ( - // MetricNameRE is a regular expression matching valid metric - // names. Note that the IsValidMetricName function performs the same - // check but faster than a match with this regular expression. - MetricNameRE = regexp.MustCompile(`^[a-zA-Z_:][a-zA-Z0-9_:]*$`) + // NameValidationScheme determines the method of name validation to be used by + // all calls to IsValidMetricName() and LabelName IsValid(). Setting UTF-8 mode + // in isolation from other components that don't support UTF-8 may result in + // bugs or other undefined behavior. This value is intended to be set by + // UTF-8-aware binaries as part of their startup. To avoid need for locking, + // this value should be set once, ideally in an init(), before multiple + // goroutines are started. + NameValidationScheme = LegacyValidation + + // NameEscapingScheme defines the default way that names will be + // escaped when presented to systems that do not support UTF-8 names. If the + // Content-Type "escaping" term is specified, that will override this value. + NameEscapingScheme = ValueEncodingEscaping ) +// ValidationScheme is a Go enum for determining how metric and label names will +// be validated by this library. +type ValidationScheme int + +const ( + // LegacyValidation is a setting that requirets that metric and label names + // conform to the original Prometheus character requirements described by + // MetricNameRE and LabelNameRE. + LegacyValidation ValidationScheme = iota + + // UTF8Validation only requires that metric and label names be valid UTF-8 + // strings. + UTF8Validation +) + +type EscapingScheme int + +const ( + // NoEscaping indicates that a name will not be escaped. Unescaped names that + // do not conform to the legacy validity check will use a new exposition + // format syntax that will be officially standardized in future versions. + NoEscaping EscapingScheme = iota + + // UnderscoreEscaping replaces all legacy-invalid characters with underscores. + UnderscoreEscaping + + // DotsEscaping is similar to UnderscoreEscaping, except that dots are + // converted to `_dot_` and pre-existing underscores are converted to `__`. + DotsEscaping + + // ValueEncodingEscaping prepends the name with `U__` and replaces all invalid + // characters with the unicode value, surrounded by underscores. Single + // underscores are replaced with double underscores. + ValueEncodingEscaping +) + +const ( + // EscapingKey is the key in an Accept or Content-Type header that defines how + // metric and label names that do not conform to the legacy character + // requirements should be escaped when being scraped by a legacy prometheus + // system. If a system does not explicitly pass an escaping parameter in the + // Accept header, the default NameEscapingScheme will be used. + EscapingKey = "escaping" + + // Possible values for Escaping Key: + AllowUTF8 = "allow-utf-8" // No escaping required. + EscapeUnderscores = "underscores" + EscapeDots = "dots" + EscapeValues = "values" +) + +// MetricNameRE is a regular expression matching valid metric +// names. Note that the IsValidMetricName function performs the same +// check but faster than a match with this regular expression. +var MetricNameRE = regexp.MustCompile(`^[a-zA-Z_:][a-zA-Z0-9_:]*$`) + // A Metric is similar to a LabelSet, but the key difference is that a Metric is // a singleton and refers to one and only one stream of samples. type Metric LabelSet @@ -86,17 +155,302 @@ func (m Metric) FastFingerprint() Fingerprint { return LabelSet(m).FastFingerprint() } -// IsValidMetricName returns true iff name matches the pattern of MetricNameRE. +// IsValidMetricName returns true iff name matches the pattern of MetricNameRE +// for legacy names, and iff it's valid UTF-8 if the UTF8Validation scheme is +// selected. +func IsValidMetricName(n LabelValue) bool { + switch NameValidationScheme { + case LegacyValidation: + return IsValidLegacyMetricName(n) + case UTF8Validation: + if len(n) == 0 { + return false + } + return utf8.ValidString(string(n)) + default: + panic(fmt.Sprintf("Invalid name validation scheme requested: %d", NameValidationScheme)) + } +} + +// IsValidLegacyMetricName is similar to IsValidMetricName but always uses the +// legacy validation scheme regardless of the value of NameValidationScheme. // This function, however, does not use MetricNameRE for the check but a much // faster hardcoded implementation. -func IsValidMetricName(n LabelValue) bool { +func IsValidLegacyMetricName(n LabelValue) bool { if len(n) == 0 { return false } for i, b := range n { - if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || b == ':' || (b >= '0' && b <= '9' && i > 0)) { + if !isValidLegacyRune(b, i) { return false } } return true } + +// EscapeMetricFamily escapes the given metric names and labels with the given +// escaping scheme. Returns a new object that uses the same pointers to fields +// when possible and creates new escaped versions so as not to mutate the +// input. +func EscapeMetricFamily(v *dto.MetricFamily, scheme EscapingScheme) *dto.MetricFamily { + if v == nil { + return nil + } + + if scheme == NoEscaping { + return v + } + + out := &dto.MetricFamily{ + Help: v.Help, + Type: v.Type, + } + + // If the name is nil, copy as-is, don't try to escape. + if v.Name == nil || IsValidLegacyMetricName(LabelValue(v.GetName())) { + out.Name = v.Name + } else { + out.Name = proto.String(EscapeName(v.GetName(), scheme)) + } + for _, m := range v.Metric { + if !metricNeedsEscaping(m) { + out.Metric = append(out.Metric, m) + continue + } + + escaped := &dto.Metric{ + Gauge: m.Gauge, + Counter: m.Counter, + Summary: m.Summary, + Untyped: m.Untyped, + Histogram: m.Histogram, + TimestampMs: m.TimestampMs, + } + + for _, l := range m.Label { + if l.GetName() == MetricNameLabel { + if l.Value == nil || IsValidLegacyMetricName(LabelValue(l.GetValue())) { + escaped.Label = append(escaped.Label, l) + continue + } + escaped.Label = append(escaped.Label, &dto.LabelPair{ + Name: proto.String(MetricNameLabel), + Value: proto.String(EscapeName(l.GetValue(), scheme)), + }) + continue + } + if l.Name == nil || IsValidLegacyMetricName(LabelValue(l.GetName())) { + escaped.Label = append(escaped.Label, l) + continue + } + escaped.Label = append(escaped.Label, &dto.LabelPair{ + Name: proto.String(EscapeName(l.GetName(), scheme)), + Value: l.Value, + }) + } + out.Metric = append(out.Metric, escaped) + } + return out +} + +func metricNeedsEscaping(m *dto.Metric) bool { + for _, l := range m.Label { + if l.GetName() == MetricNameLabel && !IsValidLegacyMetricName(LabelValue(l.GetValue())) { + return true + } + if !IsValidLegacyMetricName(LabelValue(l.GetName())) { + return true + } + } + return false +} + +const ( + lowerhex = "0123456789abcdef" +) + +// EscapeName escapes the incoming name according to the provided escaping +// scheme. Depending on the rules of escaping, this may cause no change in the +// string that is returned. (Especially NoEscaping, which by definition is a +// noop). This function does not do any validation of the name. +func EscapeName(name string, scheme EscapingScheme) string { + if len(name) == 0 { + return name + } + var escaped strings.Builder + switch scheme { + case NoEscaping: + return name + case UnderscoreEscaping: + if IsValidLegacyMetricName(LabelValue(name)) { + return name + } + for i, b := range name { + if isValidLegacyRune(b, i) { + escaped.WriteRune(b) + } else { + escaped.WriteRune('_') + } + } + return escaped.String() + case DotsEscaping: + // Do not early return for legacy valid names, we still escape underscores. + for i, b := range name { + if b == '_' { + escaped.WriteString("__") + } else if b == '.' { + escaped.WriteString("_dot_") + } else if isValidLegacyRune(b, i) { + escaped.WriteRune(b) + } else { + escaped.WriteRune('_') + } + } + return escaped.String() + case ValueEncodingEscaping: + if IsValidLegacyMetricName(LabelValue(name)) { + return name + } + escaped.WriteString("U__") + for i, b := range name { + if isValidLegacyRune(b, i) { + escaped.WriteRune(b) + } else if !utf8.ValidRune(b) { + escaped.WriteString("_FFFD_") + } else if b < 0x100 { + escaped.WriteRune('_') + for s := 4; s >= 0; s -= 4 { + escaped.WriteByte(lowerhex[b>>uint(s)&0xF]) + } + escaped.WriteRune('_') + } else if b < 0x10000 { + escaped.WriteRune('_') + for s := 12; s >= 0; s -= 4 { + escaped.WriteByte(lowerhex[b>>uint(s)&0xF]) + } + escaped.WriteRune('_') + } + } + return escaped.String() + default: + panic(fmt.Sprintf("invalid escaping scheme %d", scheme)) + } +} + +// lower function taken from strconv.atoi +func lower(c byte) byte { + return c | ('x' - 'X') +} + +// UnescapeName unescapes the incoming name according to the provided escaping +// scheme if possible. Some schemes are partially or totally non-roundtripable. +// If any error is enountered, returns the original input. +func UnescapeName(name string, scheme EscapingScheme) string { + if len(name) == 0 { + return name + } + switch scheme { + case NoEscaping: + return name + case UnderscoreEscaping: + // It is not possible to unescape from underscore replacement. + return name + case DotsEscaping: + name = strings.ReplaceAll(name, "_dot_", ".") + name = strings.ReplaceAll(name, "__", "_") + return name + case ValueEncodingEscaping: + escapedName, found := strings.CutPrefix(name, "U__") + if !found { + return name + } + + var unescaped strings.Builder + TOP: + for i := 0; i < len(escapedName); i++ { + // All non-underscores are treated normally. + if escapedName[i] != '_' { + unescaped.WriteByte(escapedName[i]) + continue + } + i++ + if i >= len(escapedName) { + return name + } + // A double underscore is a single underscore. + if escapedName[i] == '_' { + unescaped.WriteByte('_') + continue + } + // We think we are in a UTF-8 code, process it. + var utf8Val uint + for j := 0; i < len(escapedName); j++ { + // This is too many characters for a utf8 value. + if j > 4 { + return name + } + // Found a closing underscore, convert to a rune, check validity, and append. + if escapedName[i] == '_' { + utf8Rune := rune(utf8Val) + if !utf8.ValidRune(utf8Rune) { + return name + } + unescaped.WriteRune(utf8Rune) + continue TOP + } + r := lower(escapedName[i]) + utf8Val *= 16 + if r >= '0' && r <= '9' { + utf8Val += uint(r) - '0' + } else if r >= 'a' && r <= 'f' { + utf8Val += uint(r) - 'a' + 10 + } else { + return name + } + i++ + } + // Didn't find closing underscore, invalid. + return name + } + return unescaped.String() + default: + panic(fmt.Sprintf("invalid escaping scheme %d", scheme)) + } +} + +func isValidLegacyRune(b rune, i int) bool { + return (b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || b == ':' || (b >= '0' && b <= '9' && i > 0) +} + +func (e EscapingScheme) String() string { + switch e { + case NoEscaping: + return AllowUTF8 + case UnderscoreEscaping: + return EscapeUnderscores + case DotsEscaping: + return EscapeDots + case ValueEncodingEscaping: + return EscapeValues + default: + panic(fmt.Sprintf("unknown format scheme %d", e)) + } +} + +func ToEscapingScheme(s string) (EscapingScheme, error) { + if s == "" { + return NoEscaping, fmt.Errorf("got empty string instead of escaping scheme") + } + switch s { + case AllowUTF8: + return NoEscaping, nil + case EscapeUnderscores: + return UnderscoreEscaping, nil + case EscapeDots: + return DotsEscaping, nil + case EscapeValues: + return ValueEncodingEscaping, nil + default: + return NoEscaping, fmt.Errorf("unknown format scheme " + s) + } +} diff --git a/vendor/github.com/prometheus/common/model/signature.go b/vendor/github.com/prometheus/common/model/signature.go index 8762b13c6..dc8a0026c 100644 --- a/vendor/github.com/prometheus/common/model/signature.go +++ b/vendor/github.com/prometheus/common/model/signature.go @@ -22,10 +22,8 @@ import ( // when calculating their combined hash value (aka signature aka fingerprint). const SeparatorByte byte = 255 -var ( - // cache the signature of an empty label set. - emptyLabelSignature = hashNew() -) +// cache the signature of an empty label set. +var emptyLabelSignature = hashNew() // LabelsToSignature returns a quasi-unique signature (i.e., fingerprint) for a // given label set. (Collisions are possible but unlikely if the number of label diff --git a/vendor/github.com/prometheus/common/model/silence.go b/vendor/github.com/prometheus/common/model/silence.go index bb99889d2..910b0b71f 100644 --- a/vendor/github.com/prometheus/common/model/silence.go +++ b/vendor/github.com/prometheus/common/model/silence.go @@ -81,7 +81,7 @@ func (s *Silence) Validate() error { } for _, m := range s.Matchers { if err := m.Validate(); err != nil { - return fmt.Errorf("invalid matcher: %s", err) + return fmt.Errorf("invalid matcher: %w", err) } } if s.StartsAt.IsZero() { diff --git a/vendor/github.com/prometheus/common/model/value.go b/vendor/github.com/prometheus/common/model/value.go index 9eb440413..8050637d8 100644 --- a/vendor/github.com/prometheus/common/model/value.go +++ b/vendor/github.com/prometheus/common/model/value.go @@ -21,14 +21,12 @@ import ( "strings" ) -var ( - // ZeroSample is the pseudo zero-value of Sample used to signal a - // non-existing sample. It is a Sample with timestamp Earliest, value 0.0, - // and metric nil. Note that the natural zero value of Sample has a timestamp - // of 0, which is possible to appear in a real Sample and thus not suitable - // to signal a non-existing Sample. - ZeroSample = Sample{Timestamp: Earliest} -) +// ZeroSample is the pseudo zero-value of Sample used to signal a +// non-existing sample. It is a Sample with timestamp Earliest, value 0.0, +// and metric nil. Note that the natural zero value of Sample has a timestamp +// of 0, which is possible to appear in a real Sample and thus not suitable +// to signal a non-existing Sample. +var ZeroSample = Sample{Timestamp: Earliest} // Sample is a sample pair associated with a metric. A single sample must either // define Value or Histogram but not both. Histogram == nil implies the Value @@ -274,7 +272,7 @@ func (s *Scalar) UnmarshalJSON(b []byte) error { value, err := strconv.ParseFloat(f, 64) if err != nil { - return fmt.Errorf("error parsing sample value: %s", err) + return fmt.Errorf("error parsing sample value: %w", err) } s.Value = SampleValue(value) return nil diff --git a/vendor/github.com/prometheus/common/model/value_float.go b/vendor/github.com/prometheus/common/model/value_float.go index 0f615a705..ae35cc2ab 100644 --- a/vendor/github.com/prometheus/common/model/value_float.go +++ b/vendor/github.com/prometheus/common/model/value_float.go @@ -20,14 +20,12 @@ import ( "strconv" ) -var ( - // ZeroSamplePair is the pseudo zero-value of SamplePair used to signal a - // non-existing sample pair. It is a SamplePair with timestamp Earliest and - // value 0.0. Note that the natural zero value of SamplePair has a timestamp - // of 0, which is possible to appear in a real SamplePair and thus not - // suitable to signal a non-existing SamplePair. - ZeroSamplePair = SamplePair{Timestamp: Earliest} -) +// ZeroSamplePair is the pseudo zero-value of SamplePair used to signal a +// non-existing sample pair. It is a SamplePair with timestamp Earliest and +// value 0.0. Note that the natural zero value of SamplePair has a timestamp +// of 0, which is possible to appear in a real SamplePair and thus not +// suitable to signal a non-existing SamplePair. +var ZeroSamplePair = SamplePair{Timestamp: Earliest} // A SampleValue is a representation of a value for a given sample at a given // time. diff --git a/vendor/github.com/prometheus/procfs/.golangci.yml b/vendor/github.com/prometheus/procfs/.golangci.yml index a197699a1..c24864a92 100644 --- a/vendor/github.com/prometheus/procfs/.golangci.yml +++ b/vendor/github.com/prometheus/procfs/.golangci.yml @@ -2,6 +2,7 @@ linters: enable: - godot + - misspell - revive linter-settings: @@ -10,3 +11,5 @@ linter-settings: exclude: # Ignore "See: URL" - 'See:' + misspell: + locale: US diff --git a/vendor/github.com/prometheus/procfs/Makefile.common b/vendor/github.com/prometheus/procfs/Makefile.common index b111d2562..062a28185 100644 --- a/vendor/github.com/prometheus/procfs/Makefile.common +++ b/vendor/github.com/prometheus/procfs/Makefile.common @@ -49,19 +49,19 @@ endif GOTEST := $(GO) test GOTEST_DIR := ifneq ($(CIRCLE_JOB),) -ifneq ($(shell which gotestsum),) +ifneq ($(shell command -v gotestsum > /dev/null),) GOTEST_DIR := test-results GOTEST := gotestsum --junitfile $(GOTEST_DIR)/unit-tests.xml -- endif endif -PROMU_VERSION ?= 0.14.0 +PROMU_VERSION ?= 0.15.0 PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz SKIP_GOLANGCI_LINT := GOLANGCI_LINT := GOLANGCI_LINT_OPTS ?= -GOLANGCI_LINT_VERSION ?= v1.51.2 +GOLANGCI_LINT_VERSION ?= v1.54.2 # golangci-lint only supports linux, darwin and windows platforms on i386/amd64. # windows isn't included here because of the path separator being different. ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin)) @@ -178,7 +178,7 @@ endif .PHONY: common-yamllint common-yamllint: @echo ">> running yamllint on all YAML files in the repository" -ifeq (, $(shell which yamllint)) +ifeq (, $(shell command -v yamllint > /dev/null)) @echo "yamllint not installed so skipping" else yamllint . diff --git a/vendor/github.com/prometheus/procfs/README.md b/vendor/github.com/prometheus/procfs/README.md index 43c37735a..1224816c2 100644 --- a/vendor/github.com/prometheus/procfs/README.md +++ b/vendor/github.com/prometheus/procfs/README.md @@ -51,11 +51,11 @@ ensure the `fixtures` directory is up to date by removing the existing directory extracting the ttar file using `make fixtures/.unpacked` or just `make test`. ```bash -rm -rf fixtures +rm -rf testdata/fixtures make test ``` Next, make the required changes to the extracted files in the `fixtures` directory. When the changes are complete, run `make update_fixtures` to create a new `fixtures.ttar` file based on the updated `fixtures` directory. And finally, verify the changes using -`git diff fixtures.ttar`. +`git diff testdata/fixtures.ttar`. diff --git a/vendor/github.com/prometheus/procfs/arp.go b/vendor/github.com/prometheus/procfs/arp.go index 68f36e888..28783e2dd 100644 --- a/vendor/github.com/prometheus/procfs/arp.go +++ b/vendor/github.com/prometheus/procfs/arp.go @@ -55,7 +55,7 @@ type ARPEntry struct { func (fs FS) GatherARPEntries() ([]ARPEntry, error) { data, err := os.ReadFile(fs.proc.Path("net/arp")) if err != nil { - return nil, fmt.Errorf("error reading arp %q: %w", fs.proc.Path("net/arp"), err) + return nil, fmt.Errorf("%s: error reading arp %s: %w", ErrFileRead, fs.proc.Path("net/arp"), err) } return parseARPEntries(data) @@ -78,11 +78,11 @@ func parseARPEntries(data []byte) ([]ARPEntry, error) { } else if width == expectedDataWidth { entry, err := parseARPEntry(columns) if err != nil { - return []ARPEntry{}, fmt.Errorf("failed to parse ARP entry: %w", err) + return []ARPEntry{}, fmt.Errorf("%s: Failed to parse ARP entry: %v: %w", ErrFileParse, entry, err) } entries = append(entries, entry) } else { - return []ARPEntry{}, fmt.Errorf("%d columns were detected, but %d were expected", width, expectedDataWidth) + return []ARPEntry{}, fmt.Errorf("%s: %d columns found, but expected %d: %w", ErrFileParse, width, expectedDataWidth, err) } } diff --git a/vendor/github.com/prometheus/procfs/buddyinfo.go b/vendor/github.com/prometheus/procfs/buddyinfo.go index f5b7939b2..4a173636c 100644 --- a/vendor/github.com/prometheus/procfs/buddyinfo.go +++ b/vendor/github.com/prometheus/procfs/buddyinfo.go @@ -55,7 +55,7 @@ func parseBuddyInfo(r io.Reader) ([]BuddyInfo, error) { parts := strings.Fields(line) if len(parts) < 4 { - return nil, fmt.Errorf("invalid number of fields when parsing buddyinfo") + return nil, fmt.Errorf("%w: Invalid number of fields, found: %v", ErrFileParse, parts) } node := strings.TrimRight(parts[1], ",") @@ -66,7 +66,7 @@ func parseBuddyInfo(r io.Reader) ([]BuddyInfo, error) { bucketCount = arraySize } else { if bucketCount != arraySize { - return nil, fmt.Errorf("mismatch in number of buddyinfo buckets, previous count %d, new count %d", bucketCount, arraySize) + return nil, fmt.Errorf("%w: mismatch in number of buddyinfo buckets, previous count %d, new count %d", ErrFileParse, bucketCount, arraySize) } } @@ -74,7 +74,7 @@ func parseBuddyInfo(r io.Reader) ([]BuddyInfo, error) { for i := 0; i < arraySize; i++ { sizes[i], err = strconv.ParseFloat(parts[i+4], 64) if err != nil { - return nil, fmt.Errorf("invalid value in buddyinfo: %w", err) + return nil, fmt.Errorf("%s: Invalid valid in buddyinfo: %f: %w", ErrFileParse, sizes[i], err) } } diff --git a/vendor/github.com/prometheus/procfs/cpuinfo.go b/vendor/github.com/prometheus/procfs/cpuinfo.go index 06968ca2e..f4f5501c6 100644 --- a/vendor/github.com/prometheus/procfs/cpuinfo.go +++ b/vendor/github.com/prometheus/procfs/cpuinfo.go @@ -79,7 +79,7 @@ func parseCPUInfoX86(info []byte) ([]CPUInfo, error) { // find the first "processor" line firstLine := firstNonEmptyLine(scanner) if !strings.HasPrefix(firstLine, "processor") || !strings.Contains(firstLine, ":") { - return nil, fmt.Errorf("invalid cpuinfo file: %q", firstLine) + return nil, fmt.Errorf("%w: Cannot parse line: %q", ErrFileParse, firstLine) } field := strings.SplitN(firstLine, ": ", 2) v, err := strconv.ParseUint(field[1], 0, 32) @@ -192,9 +192,10 @@ func parseCPUInfoARM(info []byte) ([]CPUInfo, error) { scanner := bufio.NewScanner(bytes.NewReader(info)) firstLine := firstNonEmptyLine(scanner) - match, _ := regexp.MatchString("^[Pp]rocessor", firstLine) + match, err := regexp.MatchString("^[Pp]rocessor", firstLine) if !match || !strings.Contains(firstLine, ":") { - return nil, fmt.Errorf("invalid cpuinfo file: %q", firstLine) + return nil, fmt.Errorf("%s: Cannot parse line: %q: %w", ErrFileParse, firstLine, err) + } field := strings.SplitN(firstLine, ": ", 2) cpuinfo := []CPUInfo{} @@ -258,7 +259,7 @@ func parseCPUInfoS390X(info []byte) ([]CPUInfo, error) { firstLine := firstNonEmptyLine(scanner) if !strings.HasPrefix(firstLine, "vendor_id") || !strings.Contains(firstLine, ":") { - return nil, fmt.Errorf("invalid cpuinfo file: %q", firstLine) + return nil, fmt.Errorf("%w: Cannot parse line: %q", ErrFileParse, firstLine) } field := strings.SplitN(firstLine, ": ", 2) cpuinfo := []CPUInfo{} @@ -283,7 +284,7 @@ func parseCPUInfoS390X(info []byte) ([]CPUInfo, error) { if strings.HasPrefix(line, "processor") { match := cpuinfoS390XProcessorRegexp.FindStringSubmatch(line) if len(match) < 2 { - return nil, fmt.Errorf("invalid cpuinfo file: %q", firstLine) + return nil, fmt.Errorf("%w: %q", ErrFileParse, firstLine) } cpu := commonCPUInfo v, err := strconv.ParseUint(match[1], 0, 32) @@ -343,7 +344,7 @@ func parseCPUInfoMips(info []byte) ([]CPUInfo, error) { // find the first "processor" line firstLine := firstNonEmptyLine(scanner) if !strings.HasPrefix(firstLine, "system type") || !strings.Contains(firstLine, ":") { - return nil, fmt.Errorf("invalid cpuinfo file: %q", firstLine) + return nil, fmt.Errorf("%w: %q", ErrFileParse, firstLine) } field := strings.SplitN(firstLine, ": ", 2) cpuinfo := []CPUInfo{} @@ -421,7 +422,7 @@ func parseCPUInfoPPC(info []byte) ([]CPUInfo, error) { firstLine := firstNonEmptyLine(scanner) if !strings.HasPrefix(firstLine, "processor") || !strings.Contains(firstLine, ":") { - return nil, fmt.Errorf("invalid cpuinfo file: %q", firstLine) + return nil, fmt.Errorf("%w: %q", ErrFileParse, firstLine) } field := strings.SplitN(firstLine, ": ", 2) v, err := strconv.ParseUint(field[1], 0, 32) @@ -466,7 +467,7 @@ func parseCPUInfoRISCV(info []byte) ([]CPUInfo, error) { firstLine := firstNonEmptyLine(scanner) if !strings.HasPrefix(firstLine, "processor") || !strings.Contains(firstLine, ":") { - return nil, fmt.Errorf("invalid cpuinfo file: %q", firstLine) + return nil, fmt.Errorf("%w: %q", ErrFileParse, firstLine) } field := strings.SplitN(firstLine, ": ", 2) v, err := strconv.ParseUint(field[1], 0, 32) diff --git a/vendor/github.com/prometheus/procfs/crypto.go b/vendor/github.com/prometheus/procfs/crypto.go index 5048ad1f2..9a73e2639 100644 --- a/vendor/github.com/prometheus/procfs/crypto.go +++ b/vendor/github.com/prometheus/procfs/crypto.go @@ -55,12 +55,13 @@ func (fs FS) Crypto() ([]Crypto, error) { path := fs.proc.Path("crypto") b, err := util.ReadFileNoStat(path) if err != nil { - return nil, fmt.Errorf("error reading crypto %q: %w", path, err) + return nil, fmt.Errorf("%s: Cannot read file %v: %w", ErrFileRead, b, err) + } crypto, err := parseCrypto(bytes.NewReader(b)) if err != nil { - return nil, fmt.Errorf("error parsing crypto %q: %w", path, err) + return nil, fmt.Errorf("%s: Cannot parse %v: %w", ErrFileParse, crypto, err) } return crypto, nil @@ -83,7 +84,7 @@ func parseCrypto(r io.Reader) ([]Crypto, error) { kv := strings.Split(text, ":") if len(kv) != 2 { - return nil, fmt.Errorf("malformed crypto line: %q", text) + return nil, fmt.Errorf("%w: Cannot parae line: %q", ErrFileParse, text) } k := strings.TrimSpace(kv[0]) diff --git a/vendor/github.com/prometheus/procfs/fs.go b/vendor/github.com/prometheus/procfs/fs.go index 60c551e02..4980c875b 100644 --- a/vendor/github.com/prometheus/procfs/fs.go +++ b/vendor/github.com/prometheus/procfs/fs.go @@ -20,8 +20,8 @@ import ( // FS represents the pseudo-filesystem sys, which provides an interface to // kernel data structures. type FS struct { - proc fs.FS - real bool + proc fs.FS + isReal bool } // DefaultMountPoint is the common mount point of the proc filesystem. @@ -41,10 +41,10 @@ func NewFS(mountPoint string) (FS, error) { return FS{}, err } - real, err := isRealProc(mountPoint) + isReal, err := isRealProc(mountPoint) if err != nil { return FS{}, err } - return FS{fs, real}, nil + return FS{fs, isReal}, nil } diff --git a/vendor/github.com/prometheus/procfs/fs_statfs_notype.go b/vendor/github.com/prometheus/procfs/fs_statfs_notype.go index 800576968..134767d69 100644 --- a/vendor/github.com/prometheus/procfs/fs_statfs_notype.go +++ b/vendor/github.com/prometheus/procfs/fs_statfs_notype.go @@ -11,8 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build netbsd || openbsd || solaris || windows -// +build netbsd openbsd solaris windows +//go:build !freebsd && !linux +// +build !freebsd,!linux package procfs diff --git a/vendor/github.com/prometheus/procfs/fs_statfs_type.go b/vendor/github.com/prometheus/procfs/fs_statfs_type.go index 6233217ad..80df79c31 100644 --- a/vendor/github.com/prometheus/procfs/fs_statfs_type.go +++ b/vendor/github.com/prometheus/procfs/fs_statfs_type.go @@ -11,8 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build !netbsd && !openbsd && !solaris && !windows -// +build !netbsd,!openbsd,!solaris,!windows +//go:build freebsd || linux +// +build freebsd linux package procfs diff --git a/vendor/github.com/prometheus/procfs/fscache.go b/vendor/github.com/prometheus/procfs/fscache.go index f8070e6e2..f560a8db3 100644 --- a/vendor/github.com/prometheus/procfs/fscache.go +++ b/vendor/github.com/prometheus/procfs/fscache.go @@ -236,7 +236,7 @@ func (fs FS) Fscacheinfo() (Fscacheinfo, error) { m, err := parseFscacheinfo(bytes.NewReader(b)) if err != nil { - return Fscacheinfo{}, fmt.Errorf("failed to parse Fscacheinfo: %w", err) + return Fscacheinfo{}, fmt.Errorf("%s: Cannot parse %v: %w", ErrFileParse, m, err) } return *m, nil @@ -245,7 +245,7 @@ func (fs FS) Fscacheinfo() (Fscacheinfo, error) { func setFSCacheFields(fields []string, setFields ...*uint64) error { var err error if len(fields) < len(setFields) { - return fmt.Errorf("Insufficient number of fields, expected %v, got %v", len(setFields), len(fields)) + return fmt.Errorf("%s: Expected %d, but got %d: %w", ErrFileParse, len(setFields), len(fields), err) } for i := range setFields { @@ -263,7 +263,7 @@ func parseFscacheinfo(r io.Reader) (*Fscacheinfo, error) { for s.Scan() { fields := strings.Fields(s.Text()) if len(fields) < 2 { - return nil, fmt.Errorf("malformed Fscacheinfo line: %q", s.Text()) + return nil, fmt.Errorf("%w: malformed Fscacheinfo line: %q", ErrFileParse, s.Text()) } switch fields[0] { diff --git a/vendor/github.com/prometheus/procfs/ipvs.go b/vendor/github.com/prometheus/procfs/ipvs.go index 391c07957..5a145bbfe 100644 --- a/vendor/github.com/prometheus/procfs/ipvs.go +++ b/vendor/github.com/prometheus/procfs/ipvs.go @@ -221,15 +221,16 @@ func parseIPPort(s string) (net.IP, uint16, error) { case 46: ip = net.ParseIP(s[1:40]) if ip == nil { - return nil, 0, fmt.Errorf("invalid IPv6 address: %s", s[1:40]) + return nil, 0, fmt.Errorf("%s: Invalid IPv6 addr %s: %w", ErrFileParse, s[1:40], err) } default: - return nil, 0, fmt.Errorf("unexpected IP:Port: %s", s) + return nil, 0, fmt.Errorf("%s: Unexpected IP:Port %s: %w", ErrFileParse, s, err) } portString := s[len(s)-4:] if len(portString) != 4 { - return nil, 0, fmt.Errorf("unexpected port string format: %s", portString) + return nil, 0, + fmt.Errorf("%s: Unexpected port string format %s: %w", ErrFileParse, portString, err) } port, err := strconv.ParseUint(portString, 16, 16) if err != nil { diff --git a/vendor/github.com/prometheus/procfs/loadavg.go b/vendor/github.com/prometheus/procfs/loadavg.go index 0096cafbd..59465c5bb 100644 --- a/vendor/github.com/prometheus/procfs/loadavg.go +++ b/vendor/github.com/prometheus/procfs/loadavg.go @@ -44,14 +44,14 @@ func parseLoad(loadavgBytes []byte) (*LoadAvg, error) { loads := make([]float64, 3) parts := strings.Fields(string(loadavgBytes)) if len(parts) < 3 { - return nil, fmt.Errorf("malformed loadavg line: too few fields in loadavg string: %q", string(loadavgBytes)) + return nil, fmt.Errorf("%w: Malformed line %q", ErrFileParse, string(loadavgBytes)) } var err error for i, load := range parts[0:3] { loads[i], err = strconv.ParseFloat(load, 64) if err != nil { - return nil, fmt.Errorf("could not parse load %q: %w", load, err) + return nil, fmt.Errorf("%s: Cannot parse load: %f: %w", ErrFileParse, loads[i], err) } } return &LoadAvg{ diff --git a/vendor/github.com/prometheus/procfs/mdstat.go b/vendor/github.com/prometheus/procfs/mdstat.go index a95c889cb..fdd4b9544 100644 --- a/vendor/github.com/prometheus/procfs/mdstat.go +++ b/vendor/github.com/prometheus/procfs/mdstat.go @@ -70,7 +70,7 @@ func (fs FS) MDStat() ([]MDStat, error) { } mdstat, err := parseMDStat(data) if err != nil { - return nil, fmt.Errorf("error parsing mdstat %q: %w", fs.proc.Path("mdstat"), err) + return nil, fmt.Errorf("%s: Cannot parse %v: %w", ErrFileParse, fs.proc.Path("mdstat"), err) } return mdstat, nil } @@ -90,13 +90,13 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) { deviceFields := strings.Fields(line) if len(deviceFields) < 3 { - return nil, fmt.Errorf("not enough fields in mdline (expected at least 3): %s", line) + return nil, fmt.Errorf("%s: Expected 3+ lines, got %q", ErrFileParse, line) } mdName := deviceFields[0] // mdx state := deviceFields[2] // active or inactive if len(lines) <= i+3 { - return nil, fmt.Errorf("error parsing %q: too few lines for md device", mdName) + return nil, fmt.Errorf("%w: Too few lines for md device: %q", ErrFileParse, mdName) } // Failed disks have the suffix (F) & Spare disks have the suffix (S). @@ -105,7 +105,7 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) { active, total, down, size, err := evalStatusLine(lines[i], lines[i+1]) if err != nil { - return nil, fmt.Errorf("error parsing md device lines: %w", err) + return nil, fmt.Errorf("%s: Cannot parse md device lines: %v: %w", ErrFileParse, active, err) } syncLineIdx := i + 2 @@ -140,7 +140,7 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) { } else { syncedBlocks, pct, finish, speed, err = evalRecoveryLine(lines[syncLineIdx]) if err != nil { - return nil, fmt.Errorf("error parsing sync line in md device %q: %w", mdName, err) + return nil, fmt.Errorf("%s: Cannot parse sync line in md device: %q: %w", ErrFileParse, mdName, err) } } } @@ -168,13 +168,13 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) { func evalStatusLine(deviceLine, statusLine string) (active, total, down, size int64, err error) { statusFields := strings.Fields(statusLine) if len(statusFields) < 1 { - return 0, 0, 0, 0, fmt.Errorf("unexpected statusLine %q", statusLine) + return 0, 0, 0, 0, fmt.Errorf("%s: Unexpected statusline %q: %w", ErrFileParse, statusLine, err) } sizeStr := statusFields[0] size, err = strconv.ParseInt(sizeStr, 10, 64) if err != nil { - return 0, 0, 0, 0, fmt.Errorf("unexpected statusLine %q: %w", statusLine, err) + return 0, 0, 0, 0, fmt.Errorf("%s: Unexpected statusline %q: %w", ErrFileParse, statusLine, err) } if strings.Contains(deviceLine, "raid0") || strings.Contains(deviceLine, "linear") { @@ -189,17 +189,17 @@ func evalStatusLine(deviceLine, statusLine string) (active, total, down, size in matches := statusLineRE.FindStringSubmatch(statusLine) if len(matches) != 5 { - return 0, 0, 0, 0, fmt.Errorf("couldn't find all the substring matches: %s", statusLine) + return 0, 0, 0, 0, fmt.Errorf("%s: Could not fild all substring matches %s: %w", ErrFileParse, statusLine, err) } total, err = strconv.ParseInt(matches[2], 10, 64) if err != nil { - return 0, 0, 0, 0, fmt.Errorf("unexpected statusLine %q: %w", statusLine, err) + return 0, 0, 0, 0, fmt.Errorf("%s: Unexpected statusline %q: %w", ErrFileParse, statusLine, err) } active, err = strconv.ParseInt(matches[3], 10, 64) if err != nil { - return 0, 0, 0, 0, fmt.Errorf("unexpected statusLine %q: %w", statusLine, err) + return 0, 0, 0, 0, fmt.Errorf("%s: Unexpected active %d: %w", ErrFileParse, active, err) } down = int64(strings.Count(matches[4], "_")) @@ -209,42 +209,42 @@ func evalStatusLine(deviceLine, statusLine string) (active, total, down, size in func evalRecoveryLine(recoveryLine string) (syncedBlocks int64, pct float64, finish float64, speed float64, err error) { matches := recoveryLineBlocksRE.FindStringSubmatch(recoveryLine) if len(matches) != 2 { - return 0, 0, 0, 0, fmt.Errorf("unexpected recoveryLine: %s", recoveryLine) + return 0, 0, 0, 0, fmt.Errorf("%s: Unexpected recoveryLine %s: %w", ErrFileParse, recoveryLine, err) } syncedBlocks, err = strconv.ParseInt(matches[1], 10, 64) if err != nil { - return 0, 0, 0, 0, fmt.Errorf("error parsing int from recoveryLine %q: %w", recoveryLine, err) + return 0, 0, 0, 0, fmt.Errorf("%s: Unexpected parsing of recoveryLine %q: %w", ErrFileParse, recoveryLine, err) } // Get percentage complete matches = recoveryLinePctRE.FindStringSubmatch(recoveryLine) if len(matches) != 2 { - return syncedBlocks, 0, 0, 0, fmt.Errorf("unexpected recoveryLine matching percentage: %s", recoveryLine) + return syncedBlocks, 0, 0, 0, fmt.Errorf("%w: Unexpected recoveryLine matching percentage %s", ErrFileParse, recoveryLine) } pct, err = strconv.ParseFloat(strings.TrimSpace(matches[1]), 64) if err != nil { - return syncedBlocks, 0, 0, 0, fmt.Errorf("error parsing float from recoveryLine %q: %w", recoveryLine, err) + return syncedBlocks, 0, 0, 0, fmt.Errorf("%w: Error parsing float from recoveryLine %q", ErrFileParse, recoveryLine) } // Get time expected left to complete matches = recoveryLineFinishRE.FindStringSubmatch(recoveryLine) if len(matches) != 2 { - return syncedBlocks, pct, 0, 0, fmt.Errorf("unexpected recoveryLine matching est. finish time: %s", recoveryLine) + return syncedBlocks, pct, 0, 0, fmt.Errorf("%w: Unexpected recoveryLine matching est. finish time: %s", ErrFileParse, recoveryLine) } finish, err = strconv.ParseFloat(matches[1], 64) if err != nil { - return syncedBlocks, pct, 0, 0, fmt.Errorf("error parsing float from recoveryLine %q: %w", recoveryLine, err) + return syncedBlocks, pct, 0, 0, fmt.Errorf("%w: Unable to parse float from recoveryLine: %q", ErrFileParse, recoveryLine) } // Get recovery speed matches = recoveryLineSpeedRE.FindStringSubmatch(recoveryLine) if len(matches) != 2 { - return syncedBlocks, pct, finish, 0, fmt.Errorf("unexpected recoveryLine matching speed: %s", recoveryLine) + return syncedBlocks, pct, finish, 0, fmt.Errorf("%w: Unexpected recoveryLine value: %s", ErrFileParse, recoveryLine) } speed, err = strconv.ParseFloat(matches[1], 64) if err != nil { - return syncedBlocks, pct, finish, 0, fmt.Errorf("error parsing float from recoveryLine %q: %w", recoveryLine, err) + return syncedBlocks, pct, finish, 0, fmt.Errorf("%s: Error parsing float from recoveryLine: %q: %w", ErrFileParse, recoveryLine, err) } return syncedBlocks, pct, finish, speed, nil diff --git a/vendor/github.com/prometheus/procfs/meminfo.go b/vendor/github.com/prometheus/procfs/meminfo.go index f65e174e5..eaf00e224 100644 --- a/vendor/github.com/prometheus/procfs/meminfo.go +++ b/vendor/github.com/prometheus/procfs/meminfo.go @@ -152,7 +152,7 @@ func (fs FS) Meminfo() (Meminfo, error) { m, err := parseMemInfo(bytes.NewReader(b)) if err != nil { - return Meminfo{}, fmt.Errorf("failed to parse meminfo: %w", err) + return Meminfo{}, fmt.Errorf("%s: %w", ErrFileParse, err) } return *m, nil @@ -165,7 +165,7 @@ func parseMemInfo(r io.Reader) (*Meminfo, error) { // Each line has at least a name and value; we ignore the unit. fields := strings.Fields(s.Text()) if len(fields) < 2 { - return nil, fmt.Errorf("malformed meminfo line: %q", s.Text()) + return nil, fmt.Errorf("%w: Malformed line %q", ErrFileParse, s.Text()) } v, err := strconv.ParseUint(fields[1], 0, 64) diff --git a/vendor/github.com/prometheus/procfs/mountinfo.go b/vendor/github.com/prometheus/procfs/mountinfo.go index 59f4d5055..388ebf396 100644 --- a/vendor/github.com/prometheus/procfs/mountinfo.go +++ b/vendor/github.com/prometheus/procfs/mountinfo.go @@ -78,11 +78,11 @@ func parseMountInfoString(mountString string) (*MountInfo, error) { mountInfo := strings.Split(mountString, " ") mountInfoLength := len(mountInfo) if mountInfoLength < 10 { - return nil, fmt.Errorf("couldn't find enough fields in mount string: %s", mountString) + return nil, fmt.Errorf("%w: Too few fields in mount string: %s", ErrFileParse, mountString) } if mountInfo[mountInfoLength-4] != "-" { - return nil, fmt.Errorf("couldn't find separator in expected field: %s", mountInfo[mountInfoLength-4]) + return nil, fmt.Errorf("%w: couldn't find separator in expected field: %s", ErrFileParse, mountInfo[mountInfoLength-4]) } mount := &MountInfo{ @@ -98,18 +98,18 @@ func parseMountInfoString(mountString string) (*MountInfo, error) { mount.MountID, err = strconv.Atoi(mountInfo[0]) if err != nil { - return nil, fmt.Errorf("failed to parse mount ID") + return nil, fmt.Errorf("%w: mount ID: %q", ErrFileParse, mount.MountID) } mount.ParentID, err = strconv.Atoi(mountInfo[1]) if err != nil { - return nil, fmt.Errorf("failed to parse parent ID") + return nil, fmt.Errorf("%w: parent ID: %q", ErrFileParse, mount.ParentID) } // Has optional fields, which is a space separated list of values. // Example: shared:2 master:7 if mountInfo[6] != "" { mount.OptionalFields, err = mountOptionsParseOptionalFields(mountInfo[6 : mountInfoLength-4]) if err != nil { - return nil, err + return nil, fmt.Errorf("%s: %w", ErrFileParse, err) } } return mount, nil diff --git a/vendor/github.com/prometheus/procfs/mountstats.go b/vendor/github.com/prometheus/procfs/mountstats.go index 7f68890cf..9d8af6db7 100644 --- a/vendor/github.com/prometheus/procfs/mountstats.go +++ b/vendor/github.com/prometheus/procfs/mountstats.go @@ -44,6 +44,14 @@ const ( fieldTransport11TCPLen = 13 fieldTransport11UDPLen = 10 + + // kernel version >= 4.14 MaxLen + // See: https://elixir.bootlin.com/linux/v6.4.8/source/net/sunrpc/xprtrdma/xprt_rdma.h#L393 + fieldTransport11RDMAMaxLen = 28 + + // kernel version <= 4.2 MinLen + // See: https://elixir.bootlin.com/linux/v4.2.8/source/net/sunrpc/xprtrdma/xprt_rdma.h#L331 + fieldTransport11RDMAMinLen = 20 ) // A Mount is a device mount parsed from /proc/[pid]/mountstats. @@ -233,6 +241,33 @@ type NFSTransportStats struct { // A running counter, incremented on each request as the current size of the // pending queue. CumulativePendingQueue uint64 + + // Stats below only available with stat version 1.1. + // Transport over RDMA + + // accessed when sending a call + ReadChunkCount uint64 + WriteChunkCount uint64 + ReplyChunkCount uint64 + TotalRdmaRequest uint64 + + // rarely accessed error counters + PullupCopyCount uint64 + HardwayRegisterCount uint64 + FailedMarshalCount uint64 + BadReplyCount uint64 + MrsRecovered uint64 + MrsOrphaned uint64 + MrsAllocated uint64 + EmptySendctxQ uint64 + + // accessed when receiving a reply + TotalRdmaReply uint64 + FixupCopyCount uint64 + ReplyWaitsForSend uint64 + LocalInvNeeded uint64 + NomsgCallCount uint64 + BcallCount uint64 } // parseMountStats parses a /proc/[pid]/mountstats file and returns a slice @@ -266,7 +301,7 @@ func parseMountStats(r io.Reader) ([]*Mount, error) { if len(ss) > deviceEntryLen { // Only NFSv3 and v4 are supported for parsing statistics if m.Type != nfs3Type && m.Type != nfs4Type { - return nil, fmt.Errorf("cannot parse MountStats for fstype %q", m.Type) + return nil, fmt.Errorf("%w: Cannot parse MountStats for %q", ErrFileParse, m.Type) } statVersion := strings.TrimPrefix(ss[8], statVersionPrefix) @@ -290,7 +325,7 @@ func parseMountStats(r io.Reader) ([]*Mount, error) { // device [device] mounted on [mount] with fstype [type] func parseMount(ss []string) (*Mount, error) { if len(ss) < deviceEntryLen { - return nil, fmt.Errorf("invalid device entry: %v", ss) + return nil, fmt.Errorf("%w: Invalid device %q", ErrFileParse, ss) } // Check for specific words appearing at specific indices to ensure @@ -308,7 +343,7 @@ func parseMount(ss []string) (*Mount, error) { for _, f := range format { if ss[f.i] != f.s { - return nil, fmt.Errorf("invalid device entry: %v", ss) + return nil, fmt.Errorf("%w: Invalid device %q", ErrFileParse, ss) } } @@ -345,7 +380,7 @@ func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, e switch ss[0] { case fieldOpts: if len(ss) < 2 { - return nil, fmt.Errorf("not enough information for NFS stats: %v", ss) + return nil, fmt.Errorf("%w: Incomplete information for NFS stats: %v", ErrFileParse, ss) } if stats.Opts == nil { stats.Opts = map[string]string{} @@ -360,7 +395,7 @@ func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, e } case fieldAge: if len(ss) < 2 { - return nil, fmt.Errorf("not enough information for NFS stats: %v", ss) + return nil, fmt.Errorf("%w: Incomplete information for NFS stats: %v", ErrFileParse, ss) } // Age integer is in seconds d, err := time.ParseDuration(ss[1] + "s") @@ -371,7 +406,7 @@ func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, e stats.Age = d case fieldBytes: if len(ss) < 2 { - return nil, fmt.Errorf("not enough information for NFS stats: %v", ss) + return nil, fmt.Errorf("%w: Incomplete information for NFS stats: %v", ErrFileParse, ss) } bstats, err := parseNFSBytesStats(ss[1:]) if err != nil { @@ -381,7 +416,7 @@ func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, e stats.Bytes = *bstats case fieldEvents: if len(ss) < 2 { - return nil, fmt.Errorf("not enough information for NFS stats: %v", ss) + return nil, fmt.Errorf("%w: Incomplete information for NFS events: %v", ErrFileParse, ss) } estats, err := parseNFSEventsStats(ss[1:]) if err != nil { @@ -391,7 +426,7 @@ func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, e stats.Events = *estats case fieldTransport: if len(ss) < 3 { - return nil, fmt.Errorf("not enough information for NFS transport stats: %v", ss) + return nil, fmt.Errorf("%w: Incomplete information for NFS transport stats: %v", ErrFileParse, ss) } tstats, err := parseNFSTransportStats(ss[1:], statVersion) @@ -430,7 +465,7 @@ func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, e // integer fields. func parseNFSBytesStats(ss []string) (*NFSBytesStats, error) { if len(ss) != fieldBytesLen { - return nil, fmt.Errorf("invalid NFS bytes stats: %v", ss) + return nil, fmt.Errorf("%w: Invalid NFS bytes stats: %v", ErrFileParse, ss) } ns := make([]uint64, 0, fieldBytesLen) @@ -459,7 +494,7 @@ func parseNFSBytesStats(ss []string) (*NFSBytesStats, error) { // integer fields. func parseNFSEventsStats(ss []string) (*NFSEventsStats, error) { if len(ss) != fieldEventsLen { - return nil, fmt.Errorf("invalid NFS events stats: %v", ss) + return nil, fmt.Errorf("%w: invalid NFS events stats: %v", ErrFileParse, ss) } ns := make([]uint64, 0, fieldEventsLen) @@ -523,7 +558,7 @@ func parseNFSOperationStats(s *bufio.Scanner) ([]NFSOperationStats, error) { } if len(ss) < minFields { - return nil, fmt.Errorf("invalid NFS per-operations stats: %v", ss) + return nil, fmt.Errorf("%w: invalid NFS per-operations stats: %v", ErrFileParse, ss) } // Skip string operation name for integers @@ -576,10 +611,10 @@ func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats } else if protocol == "udp" { expectedLength = fieldTransport10UDPLen } else { - return nil, fmt.Errorf("invalid NFS protocol \"%s\" in stats 1.0 statement: %v", protocol, ss) + return nil, fmt.Errorf("%w: Invalid NFS protocol \"%s\" in stats 1.0 statement: %v", ErrFileParse, protocol, ss) } if len(ss) != expectedLength { - return nil, fmt.Errorf("invalid NFS transport stats 1.0 statement: %v", ss) + return nil, fmt.Errorf("%w: Invalid NFS transport stats 1.0 statement: %v", ErrFileParse, ss) } case statVersion11: var expectedLength int @@ -587,14 +622,17 @@ func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats expectedLength = fieldTransport11TCPLen } else if protocol == "udp" { expectedLength = fieldTransport11UDPLen + } else if protocol == "rdma" { + expectedLength = fieldTransport11RDMAMinLen } else { - return nil, fmt.Errorf("invalid NFS protocol \"%s\" in stats 1.1 statement: %v", protocol, ss) + return nil, fmt.Errorf("%w: invalid NFS protocol \"%s\" in stats 1.1 statement: %v", ErrFileParse, protocol, ss) } - if len(ss) != expectedLength { - return nil, fmt.Errorf("invalid NFS transport stats 1.1 statement: %v", ss) + if (len(ss) != expectedLength && (protocol == "tcp" || protocol == "udp")) || + (protocol == "rdma" && len(ss) < expectedLength) { + return nil, fmt.Errorf("%w: invalid NFS transport stats 1.1 statement: %v, protocol: %v", ErrFileParse, ss, protocol) } default: - return nil, fmt.Errorf("unrecognized NFS transport stats version: %q", statVersion) + return nil, fmt.Errorf("%s: Unrecognized NFS transport stats version: %q, protocol: %v", ErrFileParse, statVersion, protocol) } // Allocate enough for v1.1 stats since zero value for v1.1 stats will be okay @@ -604,7 +642,9 @@ func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats // Note: slice length must be set to length of v1.1 stats to avoid a panic when // only v1.0 stats are present. // See: https://github.com/prometheus/node_exporter/issues/571. - ns := make([]uint64, fieldTransport11TCPLen) + // + // Note: NFS Over RDMA slice length is fieldTransport11RDMAMaxLen + ns := make([]uint64, fieldTransport11RDMAMaxLen+3) for i, s := range ss { n, err := strconv.ParseUint(s, 10, 64) if err != nil { @@ -622,9 +662,14 @@ func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats // we set them to 0 here. if protocol == "udp" { ns = append(ns[:2], append(make([]uint64, 3), ns[2:]...)...) + } else if protocol == "tcp" { + ns = append(ns[:fieldTransport11TCPLen], make([]uint64, fieldTransport11RDMAMaxLen-fieldTransport11TCPLen+3)...) + } else if protocol == "rdma" { + ns = append(ns[:fieldTransport10TCPLen], append(make([]uint64, 3), ns[fieldTransport10TCPLen:]...)...) } return &NFSTransportStats{ + // NFS xprt over tcp or udp Protocol: protocol, Port: ns[0], Bind: ns[1], @@ -636,8 +681,32 @@ func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats BadTransactionIDs: ns[7], CumulativeActiveRequests: ns[8], CumulativeBacklog: ns[9], - MaximumRPCSlotsUsed: ns[10], - CumulativeSendingQueue: ns[11], - CumulativePendingQueue: ns[12], + + // NFS xprt over tcp or udp + // And statVersion 1.1 + MaximumRPCSlotsUsed: ns[10], + CumulativeSendingQueue: ns[11], + CumulativePendingQueue: ns[12], + + // NFS xprt over rdma + // And stat Version 1.1 + ReadChunkCount: ns[13], + WriteChunkCount: ns[14], + ReplyChunkCount: ns[15], + TotalRdmaRequest: ns[16], + PullupCopyCount: ns[17], + HardwayRegisterCount: ns[18], + FailedMarshalCount: ns[19], + BadReplyCount: ns[20], + MrsRecovered: ns[21], + MrsOrphaned: ns[22], + MrsAllocated: ns[23], + EmptySendctxQ: ns[24], + TotalRdmaReply: ns[25], + FixupCopyCount: ns[26], + ReplyWaitsForSend: ns[27], + LocalInvNeeded: ns[28], + NomsgCallCount: ns[29], + BcallCount: ns[30], }, nil } diff --git a/vendor/github.com/prometheus/procfs/net_conntrackstat.go b/vendor/github.com/prometheus/procfs/net_conntrackstat.go index 64a0e9460..fdfa45611 100644 --- a/vendor/github.com/prometheus/procfs/net_conntrackstat.go +++ b/vendor/github.com/prometheus/procfs/net_conntrackstat.go @@ -58,7 +58,7 @@ func readConntrackStat(path string) ([]ConntrackStatEntry, error) { stat, err := parseConntrackStat(bytes.NewReader(b)) if err != nil { - return nil, fmt.Errorf("failed to read conntrack stats from %q: %w", path, err) + return nil, fmt.Errorf("%s: Cannot read file: %v: %w", ErrFileRead, path, err) } return stat, nil @@ -86,11 +86,12 @@ func parseConntrackStat(r io.Reader) ([]ConntrackStatEntry, error) { func parseConntrackStatEntry(fields []string) (*ConntrackStatEntry, error) { entries, err := util.ParseHexUint64s(fields) if err != nil { - return nil, fmt.Errorf("invalid conntrackstat entry, couldn't parse fields: %s", err) + return nil, fmt.Errorf("%s: Cannot parse entry: %d: %w", ErrFileParse, entries, err) } numEntries := len(entries) if numEntries < 16 || numEntries > 17 { - return nil, fmt.Errorf("invalid conntrackstat entry, invalid number of fields: %d", numEntries) + return nil, + fmt.Errorf("%w: invalid conntrackstat entry, invalid number of fields: %d", ErrFileParse, numEntries) } stats := &ConntrackStatEntry{ diff --git a/vendor/github.com/prometheus/procfs/net_ip_socket.go b/vendor/github.com/prometheus/procfs/net_ip_socket.go index 7fd57d7f4..4da81ea57 100644 --- a/vendor/github.com/prometheus/procfs/net_ip_socket.go +++ b/vendor/github.com/prometheus/procfs/net_ip_socket.go @@ -130,7 +130,7 @@ func parseIP(hexIP string) (net.IP, error) { var byteIP []byte byteIP, err := hex.DecodeString(hexIP) if err != nil { - return nil, fmt.Errorf("cannot parse address field in socket line %q", hexIP) + return nil, fmt.Errorf("%s: Cannot parse socket field in %q: %w", ErrFileParse, hexIP, err) } switch len(byteIP) { case 4: @@ -144,7 +144,7 @@ func parseIP(hexIP string) (net.IP, error) { } return i, nil default: - return nil, fmt.Errorf("Unable to parse IP %s", hexIP) + return nil, fmt.Errorf("%s: Unable to parse IP %s: %w", ErrFileParse, hexIP, nil) } } @@ -153,7 +153,8 @@ func parseNetIPSocketLine(fields []string) (*netIPSocketLine, error) { line := &netIPSocketLine{} if len(fields) < 10 { return nil, fmt.Errorf( - "cannot parse net socket line as it has less then 10 columns %q", + "%w: Less than 10 columns found %q", + ErrFileParse, strings.Join(fields, " "), ) } @@ -162,64 +163,65 @@ func parseNetIPSocketLine(fields []string) (*netIPSocketLine, error) { // sl s := strings.Split(fields[0], ":") if len(s) != 2 { - return nil, fmt.Errorf("cannot parse sl field in socket line %q", fields[0]) + return nil, fmt.Errorf("%w: Unable to parse sl field in line %q", ErrFileParse, fields[0]) } if line.Sl, err = strconv.ParseUint(s[0], 0, 64); err != nil { - return nil, fmt.Errorf("cannot parse sl value in socket line: %w", err) + return nil, fmt.Errorf("%s: Unable to parse sl field in %q: %w", ErrFileParse, line.Sl, err) } // local_address l := strings.Split(fields[1], ":") if len(l) != 2 { - return nil, fmt.Errorf("cannot parse local_address field in socket line %q", fields[1]) + return nil, fmt.Errorf("%w: Unable to parse local_address field in %q", ErrFileParse, fields[1]) } if line.LocalAddr, err = parseIP(l[0]); err != nil { return nil, err } if line.LocalPort, err = strconv.ParseUint(l[1], 16, 64); err != nil { - return nil, fmt.Errorf("cannot parse local_address port value in socket line: %w", err) + return nil, fmt.Errorf("%s: Unable to parse local_address port value line %q: %w", ErrFileParse, line.LocalPort, err) } // remote_address r := strings.Split(fields[2], ":") if len(r) != 2 { - return nil, fmt.Errorf("cannot parse rem_address field in socket line %q", fields[1]) + return nil, fmt.Errorf("%w: Unable to parse rem_address field in %q", ErrFileParse, fields[1]) } if line.RemAddr, err = parseIP(r[0]); err != nil { return nil, err } if line.RemPort, err = strconv.ParseUint(r[1], 16, 64); err != nil { - return nil, fmt.Errorf("cannot parse rem_address port value in socket line: %w", err) + return nil, fmt.Errorf("%s: Cannot parse rem_address port value in %q: %w", ErrFileParse, line.RemPort, err) } // st if line.St, err = strconv.ParseUint(fields[3], 16, 64); err != nil { - return nil, fmt.Errorf("cannot parse st value in socket line: %w", err) + return nil, fmt.Errorf("%s: Cannot parse st value in %q: %w", ErrFileParse, line.St, err) } // tx_queue and rx_queue q := strings.Split(fields[4], ":") if len(q) != 2 { return nil, fmt.Errorf( - "cannot parse tx/rx queues in socket line as it has a missing colon %q", + "%w: Missing colon for tx/rx queues in socket line %q", + ErrFileParse, fields[4], ) } if line.TxQueue, err = strconv.ParseUint(q[0], 16, 64); err != nil { - return nil, fmt.Errorf("cannot parse tx_queue value in socket line: %w", err) + return nil, fmt.Errorf("%s: Cannot parse tx_queue value in %q: %w", ErrFileParse, line.TxQueue, err) } if line.RxQueue, err = strconv.ParseUint(q[1], 16, 64); err != nil { - return nil, fmt.Errorf("cannot parse rx_queue value in socket line: %w", err) + return nil, fmt.Errorf("%s: Cannot parse trx_queue value in %q: %w", ErrFileParse, line.RxQueue, err) } // uid if line.UID, err = strconv.ParseUint(fields[7], 0, 64); err != nil { - return nil, fmt.Errorf("cannot parse uid value in socket line: %w", err) + return nil, fmt.Errorf("%s: Cannot parse UID value in %q: %w", ErrFileParse, line.UID, err) } // inode if line.Inode, err = strconv.ParseUint(fields[9], 0, 64); err != nil { - return nil, fmt.Errorf("cannot parse inode value in socket line: %w", err) + return nil, fmt.Errorf("%s: Cannot parse inode value in %q: %w", ErrFileParse, line.Inode, err) } return line, nil diff --git a/vendor/github.com/prometheus/procfs/net_protocols.go b/vendor/github.com/prometheus/procfs/net_protocols.go index 374b6f73f..b6c77b709 100644 --- a/vendor/github.com/prometheus/procfs/net_protocols.go +++ b/vendor/github.com/prometheus/procfs/net_protocols.go @@ -131,7 +131,7 @@ func (ps NetProtocolStats) parseLine(rawLine string) (*NetProtocolStatLine, erro } else if fields[6] == disabled { line.Slab = false } else { - return nil, fmt.Errorf("unable to parse capability for protocol: %s", line.Name) + return nil, fmt.Errorf("%w: capability for protocol: %s", ErrFileParse, line.Name) } line.ModuleName = fields[7] @@ -173,7 +173,7 @@ func (pc *NetProtocolCapabilities) parseCapabilities(capabilities []string) erro } else if capabilities[i] == "n" { *capabilityFields[i] = false } else { - return fmt.Errorf("unable to parse capability block for protocol: position %d", i) + return fmt.Errorf("%w: capability block for protocol: position %d", ErrFileParse, i) } } return nil diff --git a/vendor/github.com/prometheus/procfs/net_route.go b/vendor/github.com/prometheus/procfs/net_route.go new file mode 100644 index 000000000..deb7029fe --- /dev/null +++ b/vendor/github.com/prometheus/procfs/net_route.go @@ -0,0 +1,143 @@ +// Copyright 2023 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +const ( + blackholeRepresentation string = "*" + blackholeIfaceName string = "blackhole" + routeLineColumns int = 11 +) + +// A NetRouteLine represents one line from net/route. +type NetRouteLine struct { + Iface string + Destination uint32 + Gateway uint32 + Flags uint32 + RefCnt uint32 + Use uint32 + Metric uint32 + Mask uint32 + MTU uint32 + Window uint32 + IRTT uint32 +} + +func (fs FS) NetRoute() ([]NetRouteLine, error) { + return readNetRoute(fs.proc.Path("net", "route")) +} + +func readNetRoute(path string) ([]NetRouteLine, error) { + b, err := util.ReadFileNoStat(path) + if err != nil { + return nil, err + } + + routelines, err := parseNetRoute(bytes.NewReader(b)) + if err != nil { + return nil, fmt.Errorf("failed to read net route from %s: %w", path, err) + } + return routelines, nil +} + +func parseNetRoute(r io.Reader) ([]NetRouteLine, error) { + var routelines []NetRouteLine + + scanner := bufio.NewScanner(r) + scanner.Scan() + for scanner.Scan() { + fields := strings.Fields(scanner.Text()) + routeline, err := parseNetRouteLine(fields) + if err != nil { + return nil, err + } + routelines = append(routelines, *routeline) + } + return routelines, nil +} + +func parseNetRouteLine(fields []string) (*NetRouteLine, error) { + if len(fields) != routeLineColumns { + return nil, fmt.Errorf("invalid routeline, num of digits: %d", len(fields)) + } + iface := fields[0] + if iface == blackholeRepresentation { + iface = blackholeIfaceName + } + destination, err := strconv.ParseUint(fields[1], 16, 32) + if err != nil { + return nil, err + } + gateway, err := strconv.ParseUint(fields[2], 16, 32) + if err != nil { + return nil, err + } + flags, err := strconv.ParseUint(fields[3], 10, 32) + if err != nil { + return nil, err + } + refcnt, err := strconv.ParseUint(fields[4], 10, 32) + if err != nil { + return nil, err + } + use, err := strconv.ParseUint(fields[5], 10, 32) + if err != nil { + return nil, err + } + metric, err := strconv.ParseUint(fields[6], 10, 32) + if err != nil { + return nil, err + } + mask, err := strconv.ParseUint(fields[7], 16, 32) + if err != nil { + return nil, err + } + mtu, err := strconv.ParseUint(fields[8], 10, 32) + if err != nil { + return nil, err + } + window, err := strconv.ParseUint(fields[9], 10, 32) + if err != nil { + return nil, err + } + irtt, err := strconv.ParseUint(fields[10], 10, 32) + if err != nil { + return nil, err + } + routeline := &NetRouteLine{ + Iface: iface, + Destination: uint32(destination), + Gateway: uint32(gateway), + Flags: uint32(flags), + RefCnt: uint32(refcnt), + Use: uint32(use), + Metric: uint32(metric), + Mask: uint32(mask), + MTU: uint32(mtu), + Window: uint32(window), + IRTT: uint32(irtt), + } + return routeline, nil +} diff --git a/vendor/github.com/prometheus/procfs/net_sockstat.go b/vendor/github.com/prometheus/procfs/net_sockstat.go index e36f4872d..360e36af7 100644 --- a/vendor/github.com/prometheus/procfs/net_sockstat.go +++ b/vendor/github.com/prometheus/procfs/net_sockstat.go @@ -16,7 +16,6 @@ package procfs import ( "bufio" "bytes" - "errors" "fmt" "io" "strings" @@ -70,7 +69,7 @@ func readSockstat(name string) (*NetSockstat, error) { stat, err := parseSockstat(bytes.NewReader(b)) if err != nil { - return nil, fmt.Errorf("failed to read sockstats from %q: %w", name, err) + return nil, fmt.Errorf("%s: sockstats from %q: %w", ErrFileRead, name, err) } return stat, nil @@ -84,13 +83,13 @@ func parseSockstat(r io.Reader) (*NetSockstat, error) { // Expect a minimum of a protocol and one key/value pair. fields := strings.Split(s.Text(), " ") if len(fields) < 3 { - return nil, fmt.Errorf("malformed sockstat line: %q", s.Text()) + return nil, fmt.Errorf("%w: Malformed sockstat line: %q", ErrFileParse, s.Text()) } // The remaining fields are key/value pairs. kvs, err := parseSockstatKVs(fields[1:]) if err != nil { - return nil, fmt.Errorf("error parsing sockstat key/value pairs from %q: %w", s.Text(), err) + return nil, fmt.Errorf("%s: sockstat key/value pairs from %q: %w", ErrFileParse, s.Text(), err) } // The first field is the protocol. We must trim its colon suffix. @@ -119,7 +118,7 @@ func parseSockstat(r io.Reader) (*NetSockstat, error) { // parseSockstatKVs parses a string slice into a map of key/value pairs. func parseSockstatKVs(kvs []string) (map[string]int, error) { if len(kvs)%2 != 0 { - return nil, errors.New("odd number of fields in key/value pairs") + return nil, fmt.Errorf("%w:: Odd number of fields in key/value pairs %q", ErrFileParse, kvs) } // Iterate two values at a time to gather key/value pairs. diff --git a/vendor/github.com/prometheus/procfs/net_softnet.go b/vendor/github.com/prometheus/procfs/net_softnet.go index 540cea52c..c77085291 100644 --- a/vendor/github.com/prometheus/procfs/net_softnet.go +++ b/vendor/github.com/prometheus/procfs/net_softnet.go @@ -64,7 +64,7 @@ func (fs FS) NetSoftnetStat() ([]SoftnetStat, error) { entries, err := parseSoftnet(bytes.NewReader(b)) if err != nil { - return nil, fmt.Errorf("failed to parse /proc/net/softnet_stat: %w", err) + return nil, fmt.Errorf("%s: /proc/net/softnet_stat: %w", ErrFileParse, err) } return entries, nil @@ -83,7 +83,7 @@ func parseSoftnet(r io.Reader) ([]SoftnetStat, error) { softnetStat := SoftnetStat{} if width < minColumns { - return nil, fmt.Errorf("%d columns were detected, but at least %d were expected", width, minColumns) + return nil, fmt.Errorf("%w: detected %d columns, but expected at least %d", ErrFileParse, width, minColumns) } // Linux 2.6.23 https://elixir.bootlin.com/linux/v2.6.23/source/net/core/dev.c#L2347 diff --git a/vendor/github.com/prometheus/procfs/net_unix.go b/vendor/github.com/prometheus/procfs/net_unix.go index 98aa8e1c3..acbbc57ea 100644 --- a/vendor/github.com/prometheus/procfs/net_unix.go +++ b/vendor/github.com/prometheus/procfs/net_unix.go @@ -108,14 +108,14 @@ func parseNetUNIX(r io.Reader) (*NetUNIX, error) { line := s.Text() item, err := nu.parseLine(line, hasInode, minFields) if err != nil { - return nil, fmt.Errorf("failed to parse /proc/net/unix data %q: %w", line, err) + return nil, fmt.Errorf("%s: /proc/net/unix encountered data %q: %w", ErrFileParse, line, err) } nu.Rows = append(nu.Rows, item) } if err := s.Err(); err != nil { - return nil, fmt.Errorf("failed to scan /proc/net/unix data: %w", err) + return nil, fmt.Errorf("%s: /proc/net/unix encountered data: %w", ErrFileParse, err) } return &nu, nil @@ -126,7 +126,7 @@ func (u *NetUNIX) parseLine(line string, hasInode bool, min int) (*NetUNIXLine, l := len(fields) if l < min { - return nil, fmt.Errorf("expected at least %d fields but got %d", min, l) + return nil, fmt.Errorf("%w: expected at least %d fields but got %d", ErrFileParse, min, l) } // Field offsets are as follows: @@ -136,29 +136,29 @@ func (u *NetUNIX) parseLine(line string, hasInode bool, min int) (*NetUNIXLine, users, err := u.parseUsers(fields[1]) if err != nil { - return nil, fmt.Errorf("failed to parse ref count %q: %w", fields[1], err) + return nil, fmt.Errorf("%s: ref count %q: %w", ErrFileParse, fields[1], err) } flags, err := u.parseFlags(fields[3]) if err != nil { - return nil, fmt.Errorf("failed to parse flags %q: %w", fields[3], err) + return nil, fmt.Errorf("%s: Unable to parse flags %q: %w", ErrFileParse, fields[3], err) } typ, err := u.parseType(fields[4]) if err != nil { - return nil, fmt.Errorf("failed to parse type %q: %w", fields[4], err) + return nil, fmt.Errorf("%s: Failed to parse type %q: %w", ErrFileParse, fields[4], err) } state, err := u.parseState(fields[5]) if err != nil { - return nil, fmt.Errorf("failed to parse state %q: %w", fields[5], err) + return nil, fmt.Errorf("%s: Failed to parse state %q: %w", ErrFileParse, fields[5], err) } var inode uint64 if hasInode { inode, err = u.parseInode(fields[6]) if err != nil { - return nil, fmt.Errorf("failed to parse inode %q: %w", fields[6], err) + return nil, fmt.Errorf("%s failed to parse inode %q: %w", ErrFileParse, fields[6], err) } } diff --git a/vendor/github.com/prometheus/procfs/net_wireless.go b/vendor/github.com/prometheus/procfs/net_wireless.go index c80fb1542..7443edca9 100644 --- a/vendor/github.com/prometheus/procfs/net_wireless.go +++ b/vendor/github.com/prometheus/procfs/net_wireless.go @@ -68,7 +68,7 @@ func (fs FS) Wireless() ([]*Wireless, error) { m, err := parseWireless(bytes.NewReader(b)) if err != nil { - return nil, fmt.Errorf("failed to parse wireless: %w", err) + return nil, fmt.Errorf("%s: wireless: %w", ErrFileParse, err) } return m, nil @@ -97,64 +97,64 @@ func parseWireless(r io.Reader) ([]*Wireless, error) { parts := strings.Split(line, ":") if len(parts) != 2 { - return nil, fmt.Errorf("expected 2 parts after splitting line by ':', got %d for line %q", len(parts), line) + return nil, fmt.Errorf("%w: expected 2 parts after splitting line by ':', got %d for line %q", ErrFileParse, len(parts), line) } name := strings.TrimSpace(parts[0]) stats := strings.Fields(parts[1]) if len(stats) < 10 { - return nil, fmt.Errorf("invalid number of fields in line %d, expected at least 10, got %d: %q", n, len(stats), line) + return nil, fmt.Errorf("%w: invalid number of fields in line %d, expected 10+, got %d: %q", ErrFileParse, n, len(stats), line) } status, err := strconv.ParseUint(stats[0], 16, 16) if err != nil { - return nil, fmt.Errorf("invalid status in line %d: %q", n, line) + return nil, fmt.Errorf("%w: invalid status in line %d: %q", ErrFileParse, n, line) } qlink, err := strconv.Atoi(strings.TrimSuffix(stats[1], ".")) if err != nil { - return nil, fmt.Errorf("failed to parse Quality:link as integer %q: %w", qlink, err) + return nil, fmt.Errorf("%s: parse Quality:link as integer %q: %w", ErrFileParse, qlink, err) } qlevel, err := strconv.Atoi(strings.TrimSuffix(stats[2], ".")) if err != nil { - return nil, fmt.Errorf("failed to parse Quality:level as integer %q: %w", qlevel, err) + return nil, fmt.Errorf("%s: Quality:level as integer %q: %w", ErrFileParse, qlevel, err) } qnoise, err := strconv.Atoi(strings.TrimSuffix(stats[3], ".")) if err != nil { - return nil, fmt.Errorf("failed to parse Quality:noise as integer %q: %w", qnoise, err) + return nil, fmt.Errorf("%s: Quality:noise as integer %q: %w", ErrFileParse, qnoise, err) } dnwid, err := strconv.Atoi(stats[4]) if err != nil { - return nil, fmt.Errorf("failed to parse Discarded:nwid as integer %q: %w", dnwid, err) + return nil, fmt.Errorf("%s: Discarded:nwid as integer %q: %w", ErrFileParse, dnwid, err) } dcrypt, err := strconv.Atoi(stats[5]) if err != nil { - return nil, fmt.Errorf("failed to parse Discarded:crypt as integer %q: %w", dcrypt, err) + return nil, fmt.Errorf("%s: Discarded:crypt as integer %q: %w", ErrFileParse, dcrypt, err) } dfrag, err := strconv.Atoi(stats[6]) if err != nil { - return nil, fmt.Errorf("failed to parse Discarded:frag as integer %q: %w", dfrag, err) + return nil, fmt.Errorf("%s: Discarded:frag as integer %q: %w", ErrFileParse, dfrag, err) } dretry, err := strconv.Atoi(stats[7]) if err != nil { - return nil, fmt.Errorf("failed to parse Discarded:retry as integer %q: %w", dretry, err) + return nil, fmt.Errorf("%s: Discarded:retry as integer %q: %w", ErrFileParse, dretry, err) } dmisc, err := strconv.Atoi(stats[8]) if err != nil { - return nil, fmt.Errorf("failed to parse Discarded:misc as integer %q: %w", dmisc, err) + return nil, fmt.Errorf("%s: Discarded:misc as integer %q: %w", ErrFileParse, dmisc, err) } mbeacon, err := strconv.Atoi(stats[9]) if err != nil { - return nil, fmt.Errorf("failed to parse Missed:beacon as integer %q: %w", mbeacon, err) + return nil, fmt.Errorf("%s: Missed:beacon as integer %q: %w", ErrFileParse, mbeacon, err) } w := &Wireless{ @@ -175,7 +175,7 @@ func parseWireless(r io.Reader) ([]*Wireless, error) { } if err := scanner.Err(); err != nil { - return nil, fmt.Errorf("failed to scan /proc/net/wireless: %w", err) + return nil, fmt.Errorf("%s: Failed to scan /proc/net/wireless: %w", ErrFileRead, err) } return interfaces, nil diff --git a/vendor/github.com/prometheus/procfs/net_xfrm.go b/vendor/github.com/prometheus/procfs/net_xfrm.go index f9d9d243d..932ef2046 100644 --- a/vendor/github.com/prometheus/procfs/net_xfrm.go +++ b/vendor/github.com/prometheus/procfs/net_xfrm.go @@ -115,7 +115,7 @@ func (fs FS) NewXfrmStat() (XfrmStat, error) { fields := strings.Fields(s.Text()) if len(fields) != 2 { - return XfrmStat{}, fmt.Errorf("couldn't parse %q line %q", file.Name(), s.Text()) + return XfrmStat{}, fmt.Errorf("%w: %q line %q", ErrFileParse, file.Name(), s.Text()) } name := fields[0] diff --git a/vendor/github.com/prometheus/procfs/proc.go b/vendor/github.com/prometheus/procfs/proc.go index 48f39dafd..d1f71caa5 100644 --- a/vendor/github.com/prometheus/procfs/proc.go +++ b/vendor/github.com/prometheus/procfs/proc.go @@ -15,6 +15,7 @@ package procfs import ( "bytes" + "errors" "fmt" "io" "os" @@ -35,6 +36,12 @@ type Proc struct { // Procs represents a list of Proc structs. type Procs []Proc +var ( + ErrFileParse = errors.New("Error Parsing File") + ErrFileRead = errors.New("Error Reading File") + ErrMountPoint = errors.New("Error Accessing Mount point") +) + func (p Procs) Len() int { return len(p) } func (p Procs) Swap(i, j int) { p[i], p[j] = p[j], p[i] } func (p Procs) Less(i, j int) bool { return p[i].PID < p[j].PID } @@ -42,7 +49,7 @@ func (p Procs) Less(i, j int) bool { return p[i].PID < p[j].PID } // Self returns a process for the current process read via /proc/self. func Self() (Proc, error) { fs, err := NewFS(DefaultMountPoint) - if err != nil { + if err != nil || errors.Unwrap(err) == ErrMountPoint { return Proc{}, err } return fs.Self() @@ -104,7 +111,7 @@ func (fs FS) AllProcs() (Procs, error) { names, err := d.Readdirnames(-1) if err != nil { - return Procs{}, fmt.Errorf("could not read %q: %w", d.Name(), err) + return Procs{}, fmt.Errorf("%s: Cannot read file: %v: %w", ErrFileRead, names, err) } p := Procs{} @@ -205,7 +212,7 @@ func (p Proc) FileDescriptors() ([]uintptr, error) { for i, n := range names { fd, err := strconv.ParseInt(n, 10, 32) if err != nil { - return nil, fmt.Errorf("could not parse fd %q: %w", n, err) + return nil, fmt.Errorf("%s: Cannot parse line: %v: %w", ErrFileParse, i, err) } fds[i] = uintptr(fd) } @@ -237,7 +244,7 @@ func (p Proc) FileDescriptorTargets() ([]string, error) { // a process. func (p Proc) FileDescriptorsLen() (int, error) { // Use fast path if available (Linux v6.2): https://github.com/torvalds/linux/commit/f1f1f2569901 - if p.fs.real { + if p.fs.isReal { stat, err := os.Stat(p.path("fd")) if err != nil { return 0, err @@ -290,7 +297,7 @@ func (p Proc) fileDescriptors() ([]string, error) { names, err := d.Readdirnames(-1) if err != nil { - return nil, fmt.Errorf("could not read %q: %w", d.Name(), err) + return nil, fmt.Errorf("%s: Cannot read file: %v: %w", ErrFileRead, names, err) } return names, nil diff --git a/vendor/github.com/prometheus/procfs/proc_cgroup.go b/vendor/github.com/prometheus/procfs/proc_cgroup.go index ea83a75ff..daeed7f57 100644 --- a/vendor/github.com/prometheus/procfs/proc_cgroup.go +++ b/vendor/github.com/prometheus/procfs/proc_cgroup.go @@ -51,7 +51,7 @@ func parseCgroupString(cgroupStr string) (*Cgroup, error) { fields := strings.SplitN(cgroupStr, ":", 3) if len(fields) < 3 { - return nil, fmt.Errorf("at least 3 fields required, found %d fields in cgroup string: %s", len(fields), cgroupStr) + return nil, fmt.Errorf("%w: 3+ fields required, found %d fields in cgroup string: %s", ErrFileParse, len(fields), cgroupStr) } cgroup := &Cgroup{ @@ -60,7 +60,7 @@ func parseCgroupString(cgroupStr string) (*Cgroup, error) { } cgroup.HierarchyID, err = strconv.Atoi(fields[0]) if err != nil { - return nil, fmt.Errorf("failed to parse hierarchy ID") + return nil, fmt.Errorf("%w: hierarchy ID: %q", ErrFileParse, cgroup.HierarchyID) } if fields[1] != "" { ssNames := strings.Split(fields[1], ",") diff --git a/vendor/github.com/prometheus/procfs/proc_cgroups.go b/vendor/github.com/prometheus/procfs/proc_cgroups.go index 24d4dce9c..5dd493899 100644 --- a/vendor/github.com/prometheus/procfs/proc_cgroups.go +++ b/vendor/github.com/prometheus/procfs/proc_cgroups.go @@ -46,7 +46,7 @@ func parseCgroupSummaryString(CgroupSummaryStr string) (*CgroupSummary, error) { fields := strings.Fields(CgroupSummaryStr) // require at least 4 fields if len(fields) < 4 { - return nil, fmt.Errorf("at least 4 fields required, found %d fields in cgroup info string: %s", len(fields), CgroupSummaryStr) + return nil, fmt.Errorf("%w: 4+ fields required, found %d fields in cgroup info string: %s", ErrFileParse, len(fields), CgroupSummaryStr) } CgroupSummary := &CgroupSummary{ @@ -54,15 +54,15 @@ func parseCgroupSummaryString(CgroupSummaryStr string) (*CgroupSummary, error) { } CgroupSummary.Hierarchy, err = strconv.Atoi(fields[1]) if err != nil { - return nil, fmt.Errorf("failed to parse hierarchy ID") + return nil, fmt.Errorf("%w: Unable to parse hierarchy ID from %q", ErrFileParse, fields[1]) } CgroupSummary.Cgroups, err = strconv.Atoi(fields[2]) if err != nil { - return nil, fmt.Errorf("failed to parse Cgroup Num") + return nil, fmt.Errorf("%w: Unable to parse Cgroup Num from %q", ErrFileParse, fields[2]) } CgroupSummary.Enabled, err = strconv.Atoi(fields[3]) if err != nil { - return nil, fmt.Errorf("failed to parse Enabled") + return nil, fmt.Errorf("%w: Unable to parse Enabled from %q", ErrFileParse, fields[3]) } return CgroupSummary, nil } diff --git a/vendor/github.com/prometheus/procfs/proc_fdinfo.go b/vendor/github.com/prometheus/procfs/proc_fdinfo.go index 1bbdd4a8e..fa761b352 100644 --- a/vendor/github.com/prometheus/procfs/proc_fdinfo.go +++ b/vendor/github.com/prometheus/procfs/proc_fdinfo.go @@ -26,6 +26,7 @@ var ( rPos = regexp.MustCompile(`^pos:\s+(\d+)$`) rFlags = regexp.MustCompile(`^flags:\s+(\d+)$`) rMntID = regexp.MustCompile(`^mnt_id:\s+(\d+)$`) + rIno = regexp.MustCompile(`^ino:\s+(\d+)$`) rInotify = regexp.MustCompile(`^inotify`) rInotifyParts = regexp.MustCompile(`^inotify\s+wd:([0-9a-f]+)\s+ino:([0-9a-f]+)\s+sdev:([0-9a-f]+)(?:\s+mask:([0-9a-f]+))?`) ) @@ -40,6 +41,8 @@ type ProcFDInfo struct { Flags string // Mount point ID MntID string + // Inode number + Ino string // List of inotify lines (structured) in the fdinfo file (kernel 3.8+ only) InotifyInfos []InotifyInfo } @@ -51,7 +54,7 @@ func (p Proc) FDInfo(fd string) (*ProcFDInfo, error) { return nil, err } - var text, pos, flags, mntid string + var text, pos, flags, mntid, ino string var inotify []InotifyInfo scanner := bufio.NewScanner(bytes.NewReader(data)) @@ -63,6 +66,8 @@ func (p Proc) FDInfo(fd string) (*ProcFDInfo, error) { flags = rFlags.FindStringSubmatch(text)[1] } else if rMntID.MatchString(text) { mntid = rMntID.FindStringSubmatch(text)[1] + } else if rIno.MatchString(text) { + ino = rIno.FindStringSubmatch(text)[1] } else if rInotify.MatchString(text) { newInotify, err := parseInotifyInfo(text) if err != nil { @@ -77,6 +82,7 @@ func (p Proc) FDInfo(fd string) (*ProcFDInfo, error) { Pos: pos, Flags: flags, MntID: mntid, + Ino: ino, InotifyInfos: inotify, } @@ -111,7 +117,7 @@ func parseInotifyInfo(line string) (*InotifyInfo, error) { } return i, nil } - return nil, fmt.Errorf("invalid inode entry: %q", line) + return nil, fmt.Errorf("%w: invalid inode entry: %q", ErrFileParse, line) } // ProcFDInfos represents a list of ProcFDInfo structs. diff --git a/vendor/github.com/prometheus/procfs/proc_interrupts.go b/vendor/github.com/prometheus/procfs/proc_interrupts.go index 9df79c237..86b4b4524 100644 --- a/vendor/github.com/prometheus/procfs/proc_interrupts.go +++ b/vendor/github.com/prometheus/procfs/proc_interrupts.go @@ -66,7 +66,7 @@ func parseInterrupts(r io.Reader) (Interrupts, error) { continue } if len(parts) < 2 { - return nil, fmt.Errorf("not enough fields in interrupts (expected at least 2 fields but got %d): %s", len(parts), parts) + return nil, fmt.Errorf("%w: Not enough fields in interrupts (expected 2+ fields but got %d): %s", ErrFileParse, len(parts), parts) } intName := parts[0][:len(parts[0])-1] // remove trailing : diff --git a/vendor/github.com/prometheus/procfs/proc_limits.go b/vendor/github.com/prometheus/procfs/proc_limits.go index 7a1388185..c86d815d7 100644 --- a/vendor/github.com/prometheus/procfs/proc_limits.go +++ b/vendor/github.com/prometheus/procfs/proc_limits.go @@ -103,7 +103,7 @@ func (p Proc) Limits() (ProcLimits, error) { //fields := limitsMatch.Split(s.Text(), limitsFields) fields := limitsMatch.FindStringSubmatch(s.Text()) if len(fields) != limitsFields { - return ProcLimits{}, fmt.Errorf("couldn't parse %q line %q", f.Name(), s.Text()) + return ProcLimits{}, fmt.Errorf("%w: couldn't parse %q line %q", ErrFileParse, f.Name(), s.Text()) } switch fields[1] { @@ -154,7 +154,7 @@ func parseUint(s string) (uint64, error) { } i, err := strconv.ParseUint(s, 10, 64) if err != nil { - return 0, fmt.Errorf("couldn't parse value %q: %w", s, err) + return 0, fmt.Errorf("%s: couldn't parse value %q: %w", ErrFileParse, s, err) } return i, nil } diff --git a/vendor/github.com/prometheus/procfs/proc_maps.go b/vendor/github.com/prometheus/procfs/proc_maps.go index f1bcbf32b..7e75c286b 100644 --- a/vendor/github.com/prometheus/procfs/proc_maps.go +++ b/vendor/github.com/prometheus/procfs/proc_maps.go @@ -63,17 +63,17 @@ type ProcMap struct { // parseDevice parses the device token of a line and converts it to a dev_t // (mkdev) like structure. func parseDevice(s string) (uint64, error) { - toks := strings.Split(s, ":") - if len(toks) < 2 { - return 0, fmt.Errorf("unexpected number of fields") + i := strings.Index(s, ":") + if i == -1 { + return 0, fmt.Errorf("%w: expected separator `:` in %s", ErrFileParse, s) } - major, err := strconv.ParseUint(toks[0], 16, 0) + major, err := strconv.ParseUint(s[0:i], 16, 0) if err != nil { return 0, err } - minor, err := strconv.ParseUint(toks[1], 16, 0) + minor, err := strconv.ParseUint(s[i+1:], 16, 0) if err != nil { return 0, err } @@ -93,17 +93,17 @@ func parseAddress(s string) (uintptr, error) { // parseAddresses parses the start-end address. func parseAddresses(s string) (uintptr, uintptr, error) { - toks := strings.Split(s, "-") - if len(toks) < 2 { - return 0, 0, fmt.Errorf("invalid address") + idx := strings.Index(s, "-") + if idx == -1 { + return 0, 0, fmt.Errorf("%w: expected separator `-` in %s", ErrFileParse, s) } - saddr, err := parseAddress(toks[0]) + saddr, err := parseAddress(s[0:idx]) if err != nil { return 0, 0, err } - eaddr, err := parseAddress(toks[1]) + eaddr, err := parseAddress(s[idx+1:]) if err != nil { return 0, 0, err } @@ -114,7 +114,7 @@ func parseAddresses(s string) (uintptr, uintptr, error) { // parsePermissions parses a token and returns any that are set. func parsePermissions(s string) (*ProcMapPermissions, error) { if len(s) < 4 { - return nil, fmt.Errorf("invalid permissions token") + return nil, fmt.Errorf("%w: invalid permissions token", ErrFileParse) } perms := ProcMapPermissions{} @@ -141,7 +141,7 @@ func parsePermissions(s string) (*ProcMapPermissions, error) { func parseProcMap(text string) (*ProcMap, error) { fields := strings.Fields(text) if len(fields) < 5 { - return nil, fmt.Errorf("truncated procmap entry") + return nil, fmt.Errorf("%w: truncated procmap entry", ErrFileParse) } saddr, eaddr, err := parseAddresses(fields[0]) diff --git a/vendor/github.com/prometheus/procfs/proc_netstat.go b/vendor/github.com/prometheus/procfs/proc_netstat.go index 6a43bb245..8e3ff4d79 100644 --- a/vendor/github.com/prometheus/procfs/proc_netstat.go +++ b/vendor/github.com/prometheus/procfs/proc_netstat.go @@ -195,8 +195,8 @@ func parseProcNetstat(r io.Reader, fileName string) (ProcNetstat, error) { // Remove trailing :. protocol := strings.TrimSuffix(nameParts[0], ":") if len(nameParts) != len(valueParts) { - return procNetstat, fmt.Errorf("mismatch field count mismatch in %s: %s", - fileName, protocol) + return procNetstat, fmt.Errorf("%w: mismatch field count mismatch in %s: %s", + ErrFileParse, fileName, protocol) } for i := 1; i < len(nameParts); i++ { value, err := strconv.ParseFloat(valueParts[i], 64) diff --git a/vendor/github.com/prometheus/procfs/proc_ns.go b/vendor/github.com/prometheus/procfs/proc_ns.go index 391b4cbd1..c22666750 100644 --- a/vendor/github.com/prometheus/procfs/proc_ns.go +++ b/vendor/github.com/prometheus/procfs/proc_ns.go @@ -40,7 +40,7 @@ func (p Proc) Namespaces() (Namespaces, error) { names, err := d.Readdirnames(-1) if err != nil { - return nil, fmt.Errorf("failed to read contents of ns dir: %w", err) + return nil, fmt.Errorf("%s: failed to read contents of ns dir: %w", ErrFileRead, err) } ns := make(Namespaces, len(names)) @@ -52,13 +52,13 @@ func (p Proc) Namespaces() (Namespaces, error) { fields := strings.SplitN(target, ":", 2) if len(fields) != 2 { - return nil, fmt.Errorf("failed to parse namespace type and inode from %q", target) + return nil, fmt.Errorf("%w: namespace type and inode from %q", ErrFileParse, target) } typ := fields[0] inode, err := strconv.ParseUint(strings.Trim(fields[1], "[]"), 10, 32) if err != nil { - return nil, fmt.Errorf("failed to parse inode from %q: %w", fields[1], err) + return nil, fmt.Errorf("%s: inode from %q: %w", ErrFileParse, fields[1], err) } ns[name] = Namespace{typ, uint32(inode)} diff --git a/vendor/github.com/prometheus/procfs/proc_psi.go b/vendor/github.com/prometheus/procfs/proc_psi.go index a68fe1529..fe9dbb425 100644 --- a/vendor/github.com/prometheus/procfs/proc_psi.go +++ b/vendor/github.com/prometheus/procfs/proc_psi.go @@ -61,14 +61,14 @@ type PSIStats struct { func (fs FS) PSIStatsForResource(resource string) (PSIStats, error) { data, err := util.ReadFileNoStat(fs.proc.Path(fmt.Sprintf("%s/%s", "pressure", resource))) if err != nil { - return PSIStats{}, fmt.Errorf("psi_stats: unavailable for %q: %w", resource, err) + return PSIStats{}, fmt.Errorf("%s: psi_stats: unavailable for %q: %w", ErrFileRead, resource, err) } - return parsePSIStats(resource, bytes.NewReader(data)) + return parsePSIStats(bytes.NewReader(data)) } // parsePSIStats parses the specified file for pressure stall information. -func parsePSIStats(resource string, r io.Reader) (PSIStats, error) { +func parsePSIStats(r io.Reader) (PSIStats, error) { psiStats := PSIStats{} scanner := bufio.NewScanner(r) diff --git a/vendor/github.com/prometheus/procfs/proc_smaps.go b/vendor/github.com/prometheus/procfs/proc_smaps.go index 0e97d9957..ad8785a40 100644 --- a/vendor/github.com/prometheus/procfs/proc_smaps.go +++ b/vendor/github.com/prometheus/procfs/proc_smaps.go @@ -135,12 +135,12 @@ func (s *ProcSMapsRollup) parseLine(line string) error { } vBytes := vKBytes * 1024 - s.addValue(k, v, vKBytes, vBytes) + s.addValue(k, vBytes) return nil } -func (s *ProcSMapsRollup) addValue(k string, vString string, vUint uint64, vUintBytes uint64) { +func (s *ProcSMapsRollup) addValue(k string, vUintBytes uint64) { switch k { case "Rss": s.Rss += vUintBytes diff --git a/vendor/github.com/prometheus/procfs/proc_snmp.go b/vendor/github.com/prometheus/procfs/proc_snmp.go index 6c46b7188..b9d2cf642 100644 --- a/vendor/github.com/prometheus/procfs/proc_snmp.go +++ b/vendor/github.com/prometheus/procfs/proc_snmp.go @@ -159,8 +159,8 @@ func parseSnmp(r io.Reader, fileName string) (ProcSnmp, error) { // Remove trailing :. protocol := strings.TrimSuffix(nameParts[0], ":") if len(nameParts) != len(valueParts) { - return procSnmp, fmt.Errorf("mismatch field count mismatch in %s: %s", - fileName, protocol) + return procSnmp, fmt.Errorf("%w: mismatch field count mismatch in %s: %s", + ErrFileParse, fileName, protocol) } for i := 1; i < len(nameParts); i++ { value, err := strconv.ParseFloat(valueParts[i], 64) diff --git a/vendor/github.com/prometheus/procfs/proc_stat.go b/vendor/github.com/prometheus/procfs/proc_stat.go index 14b249f4f..923e55005 100644 --- a/vendor/github.com/prometheus/procfs/proc_stat.go +++ b/vendor/github.com/prometheus/procfs/proc_stat.go @@ -138,7 +138,7 @@ func (p Proc) Stat() (ProcStat, error) { ) if l < 0 || r < 0 { - return ProcStat{}, fmt.Errorf("unexpected format, couldn't extract comm %q", data) + return ProcStat{}, fmt.Errorf("%w: unexpected format, couldn't extract comm %q", ErrFileParse, data) } s.Comm = string(data[l+1 : r]) diff --git a/vendor/github.com/prometheus/procfs/proc_status.go b/vendor/github.com/prometheus/procfs/proc_status.go index c055d075d..46307f572 100644 --- a/vendor/github.com/prometheus/procfs/proc_status.go +++ b/vendor/github.com/prometheus/procfs/proc_status.go @@ -23,7 +23,7 @@ import ( ) // ProcStatus provides status information about the process, -// read from /proc/[pid]/stat. +// read from /proc/[pid]/status. type ProcStatus struct { // The process ID. PID int @@ -32,6 +32,8 @@ type ProcStatus struct { // Thread group ID. TGID int + // List of Pid namespace. + NSpids []uint64 // Peak virtual memory size. VmPeak uint64 // nolint:revive @@ -127,6 +129,8 @@ func (s *ProcStatus) fillStatus(k string, vString string, vUint uint64, vUintByt copy(s.UIDs[:], strings.Split(vString, "\t")) case "Gid": copy(s.GIDs[:], strings.Split(vString, "\t")) + case "NSpid": + s.NSpids = calcNSPidsList(vString) case "VmPeak": s.VmPeak = vUintBytes case "VmSize": @@ -200,3 +204,18 @@ func calcCpusAllowedList(cpuString string) []uint64 { sort.Slice(g, func(i, j int) bool { return g[i] < g[j] }) return g } + +func calcNSPidsList(nspidsString string) []uint64 { + s := strings.Split(nspidsString, " ") + var nspids []uint64 + + for _, nspid := range s { + nspid, _ := strconv.ParseUint(nspid, 10, 64) + if nspid == 0 { + continue + } + nspids = append(nspids, nspid) + } + + return nspids +} diff --git a/vendor/github.com/prometheus/procfs/proc_sys.go b/vendor/github.com/prometheus/procfs/proc_sys.go index d46533ebf..12c5bf05b 100644 --- a/vendor/github.com/prometheus/procfs/proc_sys.go +++ b/vendor/github.com/prometheus/procfs/proc_sys.go @@ -44,7 +44,7 @@ func (fs FS) SysctlInts(sysctl string) ([]int, error) { vp := util.NewValueParser(f) values[i] = vp.Int() if err := vp.Err(); err != nil { - return nil, fmt.Errorf("field %d in sysctl %s is not a valid int: %w", i, sysctl, err) + return nil, fmt.Errorf("%s: field %d in sysctl %s is not a valid int: %w", ErrFileParse, i, sysctl, err) } } return values, nil diff --git a/vendor/github.com/prometheus/procfs/slab.go b/vendor/github.com/prometheus/procfs/slab.go index bc9aaf5c2..8611c9017 100644 --- a/vendor/github.com/prometheus/procfs/slab.go +++ b/vendor/github.com/prometheus/procfs/slab.go @@ -68,7 +68,7 @@ func parseV21SlabEntry(line string) (*Slab, error) { l := slabSpace.ReplaceAllString(line, " ") s := strings.Split(l, " ") if len(s) != 16 { - return nil, fmt.Errorf("unable to parse: %q", line) + return nil, fmt.Errorf("%w: unable to parse: %q", ErrFileParse, line) } var err error i := &Slab{Name: s[0]} diff --git a/vendor/github.com/prometheus/procfs/softirqs.go b/vendor/github.com/prometheus/procfs/softirqs.go index 559129cbc..b8fad677d 100644 --- a/vendor/github.com/prometheus/procfs/softirqs.go +++ b/vendor/github.com/prometheus/procfs/softirqs.go @@ -57,7 +57,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) { ) if !scanner.Scan() { - return Softirqs{}, fmt.Errorf("softirqs empty") + return Softirqs{}, fmt.Errorf("%w: softirqs empty", ErrFileRead) } for scanner.Scan() { @@ -74,7 +74,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) { softirqs.Hi = make([]uint64, len(perCPU)) for i, count := range perCPU { if softirqs.Hi[i], err = strconv.ParseUint(count, 10, 64); err != nil { - return Softirqs{}, fmt.Errorf("couldn't parse %q (HI%d): %w", count, i, err) + return Softirqs{}, fmt.Errorf("%s: couldn't parse %q (HI%d): %w", ErrFileParse, count, i, err) } } case parts[0] == "TIMER:": @@ -82,7 +82,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) { softirqs.Timer = make([]uint64, len(perCPU)) for i, count := range perCPU { if softirqs.Timer[i], err = strconv.ParseUint(count, 10, 64); err != nil { - return Softirqs{}, fmt.Errorf("couldn't parse %q (TIMER%d): %w", count, i, err) + return Softirqs{}, fmt.Errorf("%s: couldn't parse %q (TIMER%d): %w", ErrFileParse, count, i, err) } } case parts[0] == "NET_TX:": @@ -90,7 +90,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) { softirqs.NetTx = make([]uint64, len(perCPU)) for i, count := range perCPU { if softirqs.NetTx[i], err = strconv.ParseUint(count, 10, 64); err != nil { - return Softirqs{}, fmt.Errorf("couldn't parse %q (NET_TX%d): %w", count, i, err) + return Softirqs{}, fmt.Errorf("%s: couldn't parse %q (NET_TX%d): %w", ErrFileParse, count, i, err) } } case parts[0] == "NET_RX:": @@ -98,7 +98,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) { softirqs.NetRx = make([]uint64, len(perCPU)) for i, count := range perCPU { if softirqs.NetRx[i], err = strconv.ParseUint(count, 10, 64); err != nil { - return Softirqs{}, fmt.Errorf("couldn't parse %q (NET_RX%d): %w", count, i, err) + return Softirqs{}, fmt.Errorf("%s: couldn't parse %q (NET_RX%d): %w", ErrFileParse, count, i, err) } } case parts[0] == "BLOCK:": @@ -106,7 +106,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) { softirqs.Block = make([]uint64, len(perCPU)) for i, count := range perCPU { if softirqs.Block[i], err = strconv.ParseUint(count, 10, 64); err != nil { - return Softirqs{}, fmt.Errorf("couldn't parse %q (BLOCK%d): %w", count, i, err) + return Softirqs{}, fmt.Errorf("%s: couldn't parse %q (BLOCK%d): %w", ErrFileParse, count, i, err) } } case parts[0] == "IRQ_POLL:": @@ -114,7 +114,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) { softirqs.IRQPoll = make([]uint64, len(perCPU)) for i, count := range perCPU { if softirqs.IRQPoll[i], err = strconv.ParseUint(count, 10, 64); err != nil { - return Softirqs{}, fmt.Errorf("couldn't parse %q (IRQ_POLL%d): %w", count, i, err) + return Softirqs{}, fmt.Errorf("%s: couldn't parse %q (IRQ_POLL%d): %w", ErrFileParse, count, i, err) } } case parts[0] == "TASKLET:": @@ -122,7 +122,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) { softirqs.Tasklet = make([]uint64, len(perCPU)) for i, count := range perCPU { if softirqs.Tasklet[i], err = strconv.ParseUint(count, 10, 64); err != nil { - return Softirqs{}, fmt.Errorf("couldn't parse %q (TASKLET%d): %w", count, i, err) + return Softirqs{}, fmt.Errorf("%s: couldn't parse %q (TASKLET%d): %w", ErrFileParse, count, i, err) } } case parts[0] == "SCHED:": @@ -130,7 +130,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) { softirqs.Sched = make([]uint64, len(perCPU)) for i, count := range perCPU { if softirqs.Sched[i], err = strconv.ParseUint(count, 10, 64); err != nil { - return Softirqs{}, fmt.Errorf("couldn't parse %q (SCHED%d): %w", count, i, err) + return Softirqs{}, fmt.Errorf("%s: couldn't parse %q (SCHED%d): %w", ErrFileParse, count, i, err) } } case parts[0] == "HRTIMER:": @@ -138,7 +138,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) { softirqs.HRTimer = make([]uint64, len(perCPU)) for i, count := range perCPU { if softirqs.HRTimer[i], err = strconv.ParseUint(count, 10, 64); err != nil { - return Softirqs{}, fmt.Errorf("couldn't parse %q (HRTIMER%d): %w", count, i, err) + return Softirqs{}, fmt.Errorf("%s: couldn't parse %q (HRTIMER%d): %w", ErrFileParse, count, i, err) } } case parts[0] == "RCU:": @@ -146,14 +146,14 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) { softirqs.RCU = make([]uint64, len(perCPU)) for i, count := range perCPU { if softirqs.RCU[i], err = strconv.ParseUint(count, 10, 64); err != nil { - return Softirqs{}, fmt.Errorf("couldn't parse %q (RCU%d): %w", count, i, err) + return Softirqs{}, fmt.Errorf("%s: couldn't parse %q (RCU%d): %w", ErrFileParse, count, i, err) } } } } if err := scanner.Err(); err != nil { - return Softirqs{}, fmt.Errorf("couldn't parse softirqs: %w", err) + return Softirqs{}, fmt.Errorf("%s: couldn't parse softirqs: %w", ErrFileParse, err) } return softirqs, scanner.Err() diff --git a/vendor/github.com/prometheus/procfs/stat.go b/vendor/github.com/prometheus/procfs/stat.go index 586af48af..34fc3ee21 100644 --- a/vendor/github.com/prometheus/procfs/stat.go +++ b/vendor/github.com/prometheus/procfs/stat.go @@ -93,10 +93,10 @@ func parseCPUStat(line string) (CPUStat, int64, error) { &cpuStat.Guest, &cpuStat.GuestNice) if err != nil && err != io.EOF { - return CPUStat{}, -1, fmt.Errorf("couldn't parse %q (cpu): %w", line, err) + return CPUStat{}, -1, fmt.Errorf("%s: couldn't parse %q (cpu): %w", ErrFileParse, line, err) } if count == 0 { - return CPUStat{}, -1, fmt.Errorf("couldn't parse %q (cpu): 0 elements parsed", line) + return CPUStat{}, -1, fmt.Errorf("%w: couldn't parse %q (cpu): 0 elements parsed", ErrFileParse, line) } cpuStat.User /= userHZ @@ -116,7 +116,7 @@ func parseCPUStat(line string) (CPUStat, int64, error) { cpuID, err := strconv.ParseInt(cpu[3:], 10, 64) if err != nil { - return CPUStat{}, -1, fmt.Errorf("couldn't parse %q (cpu/cpuid): %w", line, err) + return CPUStat{}, -1, fmt.Errorf("%s: couldn't parse %q (cpu/cpuid): %w", ErrFileParse, line, err) } return cpuStat, cpuID, nil @@ -136,7 +136,7 @@ func parseSoftIRQStat(line string) (SoftIRQStat, uint64, error) { &softIRQStat.Hrtimer, &softIRQStat.Rcu) if err != nil { - return SoftIRQStat{}, 0, fmt.Errorf("couldn't parse %q (softirq): %w", line, err) + return SoftIRQStat{}, 0, fmt.Errorf("%s: couldn't parse %q (softirq): %w", ErrFileParse, line, err) } return softIRQStat, total, nil @@ -187,6 +187,10 @@ func parseStat(r io.Reader, fileName string) (Stat, error) { err error ) + // Increase default scanner buffer to handle very long `intr` lines. + buf := make([]byte, 0, 8*1024) + scanner.Buffer(buf, 1024*1024) + for scanner.Scan() { line := scanner.Text() parts := strings.Fields(scanner.Text()) @@ -197,34 +201,34 @@ func parseStat(r io.Reader, fileName string) (Stat, error) { switch { case parts[0] == "btime": if stat.BootTime, err = strconv.ParseUint(parts[1], 10, 64); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %q (btime): %w", parts[1], err) + return Stat{}, fmt.Errorf("%s: couldn't parse %q (btime): %w", ErrFileParse, parts[1], err) } case parts[0] == "intr": if stat.IRQTotal, err = strconv.ParseUint(parts[1], 10, 64); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %q (intr): %w", parts[1], err) + return Stat{}, fmt.Errorf("%s: couldn't parse %q (intr): %w", ErrFileParse, parts[1], err) } numberedIRQs := parts[2:] stat.IRQ = make([]uint64, len(numberedIRQs)) for i, count := range numberedIRQs { if stat.IRQ[i], err = strconv.ParseUint(count, 10, 64); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %q (intr%d): %w", count, i, err) + return Stat{}, fmt.Errorf("%s: couldn't parse %q (intr%d): %w", ErrFileParse, count, i, err) } } case parts[0] == "ctxt": if stat.ContextSwitches, err = strconv.ParseUint(parts[1], 10, 64); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %q (ctxt): %w", parts[1], err) + return Stat{}, fmt.Errorf("%s: couldn't parse %q (ctxt): %w", ErrFileParse, parts[1], err) } case parts[0] == "processes": if stat.ProcessCreated, err = strconv.ParseUint(parts[1], 10, 64); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %q (processes): %w", parts[1], err) + return Stat{}, fmt.Errorf("%s: couldn't parse %q (processes): %w", ErrFileParse, parts[1], err) } case parts[0] == "procs_running": if stat.ProcessesRunning, err = strconv.ParseUint(parts[1], 10, 64); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %q (procs_running): %w", parts[1], err) + return Stat{}, fmt.Errorf("%s: couldn't parse %q (procs_running): %w", ErrFileParse, parts[1], err) } case parts[0] == "procs_blocked": if stat.ProcessesBlocked, err = strconv.ParseUint(parts[1], 10, 64); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %q (procs_blocked): %w", parts[1], err) + return Stat{}, fmt.Errorf("%s: couldn't parse %q (procs_blocked): %w", ErrFileParse, parts[1], err) } case parts[0] == "softirq": softIRQStats, total, err := parseSoftIRQStat(line) @@ -247,7 +251,7 @@ func parseStat(r io.Reader, fileName string) (Stat, error) { } if err := scanner.Err(); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %q: %w", fileName, err) + return Stat{}, fmt.Errorf("%s: couldn't parse %q: %w", ErrFileParse, fileName, err) } return stat, nil diff --git a/vendor/github.com/prometheus/procfs/swaps.go b/vendor/github.com/prometheus/procfs/swaps.go index 15edc2212..fa00f555d 100644 --- a/vendor/github.com/prometheus/procfs/swaps.go +++ b/vendor/github.com/prometheus/procfs/swaps.go @@ -64,7 +64,7 @@ func parseSwapString(swapString string) (*Swap, error) { swapFields := strings.Fields(swapString) swapLength := len(swapFields) if swapLength < 5 { - return nil, fmt.Errorf("too few fields in swap string: %s", swapString) + return nil, fmt.Errorf("%w: too few fields in swap string: %s", ErrFileParse, swapString) } swap := &Swap{ @@ -74,15 +74,15 @@ func parseSwapString(swapString string) (*Swap, error) { swap.Size, err = strconv.Atoi(swapFields[2]) if err != nil { - return nil, fmt.Errorf("invalid swap size: %s", swapFields[2]) + return nil, fmt.Errorf("%s: invalid swap size: %s: %w", ErrFileParse, swapFields[2], err) } swap.Used, err = strconv.Atoi(swapFields[3]) if err != nil { - return nil, fmt.Errorf("invalid swap used: %s", swapFields[3]) + return nil, fmt.Errorf("%s: invalid swap used: %s: %w", ErrFileParse, swapFields[3], err) } swap.Priority, err = strconv.Atoi(swapFields[4]) if err != nil { - return nil, fmt.Errorf("invalid swap priority: %s", swapFields[4]) + return nil, fmt.Errorf("%s: invalid swap priority: %s: %w", ErrFileParse, swapFields[4], err) } return swap, nil diff --git a/vendor/github.com/prometheus/procfs/thread.go b/vendor/github.com/prometheus/procfs/thread.go index 490c14708..df2215ece 100644 --- a/vendor/github.com/prometheus/procfs/thread.go +++ b/vendor/github.com/prometheus/procfs/thread.go @@ -45,7 +45,7 @@ func (fs FS) AllThreads(pid int) (Procs, error) { names, err := d.Readdirnames(-1) if err != nil { - return Procs{}, fmt.Errorf("could not read %q: %w", d.Name(), err) + return Procs{}, fmt.Errorf("%s: could not read %q: %w", ErrFileRead, d.Name(), err) } t := Procs{} @@ -55,7 +55,7 @@ func (fs FS) AllThreads(pid int) (Procs, error) { continue } - t = append(t, Proc{PID: int(tid), fs: FS{fsi.FS(taskPath), fs.real}}) + t = append(t, Proc{PID: int(tid), fs: FS{fsi.FS(taskPath), fs.isReal}}) } return t, nil @@ -67,12 +67,12 @@ func (fs FS) Thread(pid, tid int) (Proc, error) { if _, err := os.Stat(taskPath); err != nil { return Proc{}, err } - return Proc{PID: tid, fs: FS{fsi.FS(taskPath), fs.real}}, nil + return Proc{PID: tid, fs: FS{fsi.FS(taskPath), fs.isReal}}, nil } // Thread returns a process for a given TID of Proc. func (proc Proc) Thread(tid int) (Proc, error) { - tfs := FS{fsi.FS(proc.path("task")), proc.fs.real} + tfs := FS{fsi.FS(proc.path("task")), proc.fs.isReal} if _, err := os.Stat(tfs.proc.Path(strconv.Itoa(tid))); err != nil { return Proc{}, err } diff --git a/vendor/github.com/prometheus/procfs/vm.go b/vendor/github.com/prometheus/procfs/vm.go index cdedcae99..51c49d89e 100644 --- a/vendor/github.com/prometheus/procfs/vm.go +++ b/vendor/github.com/prometheus/procfs/vm.go @@ -86,7 +86,7 @@ func (fs FS) VM() (*VM, error) { return nil, err } if !file.Mode().IsDir() { - return nil, fmt.Errorf("%s is not a directory", path) + return nil, fmt.Errorf("%w: %s is not a directory", ErrFileRead, path) } files, err := os.ReadDir(path) diff --git a/vendor/github.com/prometheus/procfs/zoneinfo.go b/vendor/github.com/prometheus/procfs/zoneinfo.go index c745a4c04..ce5fefa5b 100644 --- a/vendor/github.com/prometheus/procfs/zoneinfo.go +++ b/vendor/github.com/prometheus/procfs/zoneinfo.go @@ -75,11 +75,11 @@ var nodeZoneRE = regexp.MustCompile(`(\d+), zone\s+(\w+)`) func (fs FS) Zoneinfo() ([]Zoneinfo, error) { data, err := os.ReadFile(fs.proc.Path("zoneinfo")) if err != nil { - return nil, fmt.Errorf("error reading zoneinfo %q: %w", fs.proc.Path("zoneinfo"), err) + return nil, fmt.Errorf("%s: error reading zoneinfo %q: %w", ErrFileRead, fs.proc.Path("zoneinfo"), err) } zoneinfo, err := parseZoneinfo(data) if err != nil { - return nil, fmt.Errorf("error parsing zoneinfo %q: %w", fs.proc.Path("zoneinfo"), err) + return nil, fmt.Errorf("%s: error parsing zoneinfo %q: %w", ErrFileParse, fs.proc.Path("zoneinfo"), err) } return zoneinfo, nil } diff --git a/vendor/github.com/quic-go/qtls-go1-20/LICENSE b/vendor/github.com/quic-go/qtls-go1-20/LICENSE deleted file mode 100644 index 6a66aea5e..000000000 --- a/vendor/github.com/quic-go/qtls-go1-20/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/quic-go/qtls-go1-20/README.md b/vendor/github.com/quic-go/qtls-go1-20/README.md deleted file mode 100644 index 2beaa2f23..000000000 --- a/vendor/github.com/quic-go/qtls-go1-20/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# qtls - -[![Go Reference](https://pkg.go.dev/badge/github.com/quic-go/qtls-go1-20.svg)](https://pkg.go.dev/github.com/quic-go/qtls-go1-20) -[![.github/workflows/go-test.yml](https://github.com/quic-go/qtls-go1-20/actions/workflows/go-test.yml/badge.svg)](https://github.com/quic-go/qtls-go1-20/actions/workflows/go-test.yml) - -This repository contains a modified version of the standard library's TLS implementation, modified for the QUIC protocol. It is used by [quic-go](https://github.com/quic-go/quic-go). diff --git a/vendor/github.com/quic-go/qtls-go1-20/alert.go b/vendor/github.com/quic-go/qtls-go1-20/alert.go deleted file mode 100644 index 687ada843..000000000 --- a/vendor/github.com/quic-go/qtls-go1-20/alert.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package qtls - -import "strconv" - -// An AlertError is a TLS alert. -// -// When using a QUIC transport, QUICConn methods will return an error -// which wraps AlertError rather than sending a TLS alert. -type AlertError uint8 - -func (e AlertError) Error() string { - return alert(e).String() -} - -type alert uint8 - -const ( - // alert level - alertLevelWarning = 1 - alertLevelError = 2 -) - -const ( - alertCloseNotify alert = 0 - alertUnexpectedMessage alert = 10 - alertBadRecordMAC alert = 20 - alertDecryptionFailed alert = 21 - alertRecordOverflow alert = 22 - alertDecompressionFailure alert = 30 - alertHandshakeFailure alert = 40 - alertBadCertificate alert = 42 - alertUnsupportedCertificate alert = 43 - alertCertificateRevoked alert = 44 - alertCertificateExpired alert = 45 - alertCertificateUnknown alert = 46 - alertIllegalParameter alert = 47 - alertUnknownCA alert = 48 - alertAccessDenied alert = 49 - alertDecodeError alert = 50 - alertDecryptError alert = 51 - alertExportRestriction alert = 60 - alertProtocolVersion alert = 70 - alertInsufficientSecurity alert = 71 - alertInternalError alert = 80 - alertInappropriateFallback alert = 86 - alertUserCanceled alert = 90 - alertNoRenegotiation alert = 100 - alertMissingExtension alert = 109 - alertUnsupportedExtension alert = 110 - alertCertificateUnobtainable alert = 111 - alertUnrecognizedName alert = 112 - alertBadCertificateStatusResponse alert = 113 - alertBadCertificateHashValue alert = 114 - alertUnknownPSKIdentity alert = 115 - alertCertificateRequired alert = 116 - alertNoApplicationProtocol alert = 120 -) - -var alertText = map[alert]string{ - alertCloseNotify: "close notify", - alertUnexpectedMessage: "unexpected message", - alertBadRecordMAC: "bad record MAC", - alertDecryptionFailed: "decryption failed", - alertRecordOverflow: "record overflow", - alertDecompressionFailure: "decompression failure", - alertHandshakeFailure: "handshake failure", - alertBadCertificate: "bad certificate", - alertUnsupportedCertificate: "unsupported certificate", - alertCertificateRevoked: "revoked certificate", - alertCertificateExpired: "expired certificate", - alertCertificateUnknown: "unknown certificate", - alertIllegalParameter: "illegal parameter", - alertUnknownCA: "unknown certificate authority", - alertAccessDenied: "access denied", - alertDecodeError: "error decoding message", - alertDecryptError: "error decrypting message", - alertExportRestriction: "export restriction", - alertProtocolVersion: "protocol version not supported", - alertInsufficientSecurity: "insufficient security level", - alertInternalError: "internal error", - alertInappropriateFallback: "inappropriate fallback", - alertUserCanceled: "user canceled", - alertNoRenegotiation: "no renegotiation", - alertMissingExtension: "missing extension", - alertUnsupportedExtension: "unsupported extension", - alertCertificateUnobtainable: "certificate unobtainable", - alertUnrecognizedName: "unrecognized name", - alertBadCertificateStatusResponse: "bad certificate status response", - alertBadCertificateHashValue: "bad certificate hash value", - alertUnknownPSKIdentity: "unknown PSK identity", - alertCertificateRequired: "certificate required", - alertNoApplicationProtocol: "no application protocol", -} - -func (e alert) String() string { - s, ok := alertText[e] - if ok { - return "tls: " + s - } - return "tls: alert(" + strconv.Itoa(int(e)) + ")" -} - -func (e alert) Error() string { - return e.String() -} diff --git a/vendor/github.com/quic-go/qtls-go1-20/auth.go b/vendor/github.com/quic-go/qtls-go1-20/auth.go deleted file mode 100644 index effc9aced..000000000 --- a/vendor/github.com/quic-go/qtls-go1-20/auth.go +++ /dev/null @@ -1,293 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package qtls - -import ( - "bytes" - "crypto" - "crypto/ecdsa" - "crypto/ed25519" - "crypto/elliptic" - "crypto/rsa" - "errors" - "fmt" - "hash" - "io" -) - -// verifyHandshakeSignature verifies a signature against pre-hashed -// (if required) handshake contents. -func verifyHandshakeSignature(sigType uint8, pubkey crypto.PublicKey, hashFunc crypto.Hash, signed, sig []byte) error { - switch sigType { - case signatureECDSA: - pubKey, ok := pubkey.(*ecdsa.PublicKey) - if !ok { - return fmt.Errorf("expected an ECDSA public key, got %T", pubkey) - } - if !ecdsa.VerifyASN1(pubKey, signed, sig) { - return errors.New("ECDSA verification failure") - } - case signatureEd25519: - pubKey, ok := pubkey.(ed25519.PublicKey) - if !ok { - return fmt.Errorf("expected an Ed25519 public key, got %T", pubkey) - } - if !ed25519.Verify(pubKey, signed, sig) { - return errors.New("Ed25519 verification failure") - } - case signaturePKCS1v15: - pubKey, ok := pubkey.(*rsa.PublicKey) - if !ok { - return fmt.Errorf("expected an RSA public key, got %T", pubkey) - } - if err := rsa.VerifyPKCS1v15(pubKey, hashFunc, signed, sig); err != nil { - return err - } - case signatureRSAPSS: - pubKey, ok := pubkey.(*rsa.PublicKey) - if !ok { - return fmt.Errorf("expected an RSA public key, got %T", pubkey) - } - signOpts := &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash} - if err := rsa.VerifyPSS(pubKey, hashFunc, signed, sig, signOpts); err != nil { - return err - } - default: - return errors.New("internal error: unknown signature type") - } - return nil -} - -const ( - serverSignatureContext = "TLS 1.3, server CertificateVerify\x00" - clientSignatureContext = "TLS 1.3, client CertificateVerify\x00" -) - -var signaturePadding = []byte{ - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -} - -// signedMessage returns the pre-hashed (if necessary) message to be signed by -// certificate keys in TLS 1.3. See RFC 8446, Section 4.4.3. -func signedMessage(sigHash crypto.Hash, context string, transcript hash.Hash) []byte { - if sigHash == directSigning { - b := &bytes.Buffer{} - b.Write(signaturePadding) - io.WriteString(b, context) - b.Write(transcript.Sum(nil)) - return b.Bytes() - } - h := sigHash.New() - h.Write(signaturePadding) - io.WriteString(h, context) - h.Write(transcript.Sum(nil)) - return h.Sum(nil) -} - -// typeAndHashFromSignatureScheme returns the corresponding signature type and -// crypto.Hash for a given TLS SignatureScheme. -func typeAndHashFromSignatureScheme(signatureAlgorithm SignatureScheme) (sigType uint8, hash crypto.Hash, err error) { - switch signatureAlgorithm { - case PKCS1WithSHA1, PKCS1WithSHA256, PKCS1WithSHA384, PKCS1WithSHA512: - sigType = signaturePKCS1v15 - case PSSWithSHA256, PSSWithSHA384, PSSWithSHA512: - sigType = signatureRSAPSS - case ECDSAWithSHA1, ECDSAWithP256AndSHA256, ECDSAWithP384AndSHA384, ECDSAWithP521AndSHA512: - sigType = signatureECDSA - case Ed25519: - sigType = signatureEd25519 - default: - return 0, 0, fmt.Errorf("unsupported signature algorithm: %v", signatureAlgorithm) - } - switch signatureAlgorithm { - case PKCS1WithSHA1, ECDSAWithSHA1: - hash = crypto.SHA1 - case PKCS1WithSHA256, PSSWithSHA256, ECDSAWithP256AndSHA256: - hash = crypto.SHA256 - case PKCS1WithSHA384, PSSWithSHA384, ECDSAWithP384AndSHA384: - hash = crypto.SHA384 - case PKCS1WithSHA512, PSSWithSHA512, ECDSAWithP521AndSHA512: - hash = crypto.SHA512 - case Ed25519: - hash = directSigning - default: - return 0, 0, fmt.Errorf("unsupported signature algorithm: %v", signatureAlgorithm) - } - return sigType, hash, nil -} - -// legacyTypeAndHashFromPublicKey returns the fixed signature type and crypto.Hash for -// a given public key used with TLS 1.0 and 1.1, before the introduction of -// signature algorithm negotiation. -func legacyTypeAndHashFromPublicKey(pub crypto.PublicKey) (sigType uint8, hash crypto.Hash, err error) { - switch pub.(type) { - case *rsa.PublicKey: - return signaturePKCS1v15, crypto.MD5SHA1, nil - case *ecdsa.PublicKey: - return signatureECDSA, crypto.SHA1, nil - case ed25519.PublicKey: - // RFC 8422 specifies support for Ed25519 in TLS 1.0 and 1.1, - // but it requires holding on to a handshake transcript to do a - // full signature, and not even OpenSSL bothers with the - // complexity, so we can't even test it properly. - return 0, 0, fmt.Errorf("tls: Ed25519 public keys are not supported before TLS 1.2") - default: - return 0, 0, fmt.Errorf("tls: unsupported public key: %T", pub) - } -} - -var rsaSignatureSchemes = []struct { - scheme SignatureScheme - minModulusBytes int - maxVersion uint16 -}{ - // RSA-PSS is used with PSSSaltLengthEqualsHash, and requires - // emLen >= hLen + sLen + 2 - {PSSWithSHA256, crypto.SHA256.Size()*2 + 2, VersionTLS13}, - {PSSWithSHA384, crypto.SHA384.Size()*2 + 2, VersionTLS13}, - {PSSWithSHA512, crypto.SHA512.Size()*2 + 2, VersionTLS13}, - // PKCS #1 v1.5 uses prefixes from hashPrefixes in crypto/rsa, and requires - // emLen >= len(prefix) + hLen + 11 - // TLS 1.3 dropped support for PKCS #1 v1.5 in favor of RSA-PSS. - {PKCS1WithSHA256, 19 + crypto.SHA256.Size() + 11, VersionTLS12}, - {PKCS1WithSHA384, 19 + crypto.SHA384.Size() + 11, VersionTLS12}, - {PKCS1WithSHA512, 19 + crypto.SHA512.Size() + 11, VersionTLS12}, - {PKCS1WithSHA1, 15 + crypto.SHA1.Size() + 11, VersionTLS12}, -} - -// signatureSchemesForCertificate returns the list of supported SignatureSchemes -// for a given certificate, based on the public key and the protocol version, -// and optionally filtered by its explicit SupportedSignatureAlgorithms. -// -// This function must be kept in sync with supportedSignatureAlgorithms. -// FIPS filtering is applied in the caller, selectSignatureScheme. -func signatureSchemesForCertificate(version uint16, cert *Certificate) []SignatureScheme { - priv, ok := cert.PrivateKey.(crypto.Signer) - if !ok { - return nil - } - - var sigAlgs []SignatureScheme - switch pub := priv.Public().(type) { - case *ecdsa.PublicKey: - if version != VersionTLS13 { - // In TLS 1.2 and earlier, ECDSA algorithms are not - // constrained to a single curve. - sigAlgs = []SignatureScheme{ - ECDSAWithP256AndSHA256, - ECDSAWithP384AndSHA384, - ECDSAWithP521AndSHA512, - ECDSAWithSHA1, - } - break - } - switch pub.Curve { - case elliptic.P256(): - sigAlgs = []SignatureScheme{ECDSAWithP256AndSHA256} - case elliptic.P384(): - sigAlgs = []SignatureScheme{ECDSAWithP384AndSHA384} - case elliptic.P521(): - sigAlgs = []SignatureScheme{ECDSAWithP521AndSHA512} - default: - return nil - } - case *rsa.PublicKey: - size := pub.Size() - sigAlgs = make([]SignatureScheme, 0, len(rsaSignatureSchemes)) - for _, candidate := range rsaSignatureSchemes { - if size >= candidate.minModulusBytes && version <= candidate.maxVersion { - sigAlgs = append(sigAlgs, candidate.scheme) - } - } - case ed25519.PublicKey: - sigAlgs = []SignatureScheme{Ed25519} - default: - return nil - } - - if cert.SupportedSignatureAlgorithms != nil { - var filteredSigAlgs []SignatureScheme - for _, sigAlg := range sigAlgs { - if isSupportedSignatureAlgorithm(sigAlg, cert.SupportedSignatureAlgorithms) { - filteredSigAlgs = append(filteredSigAlgs, sigAlg) - } - } - return filteredSigAlgs - } - return sigAlgs -} - -// selectSignatureScheme picks a SignatureScheme from the peer's preference list -// that works with the selected certificate. It's only called for protocol -// versions that support signature algorithms, so TLS 1.2 and 1.3. -func selectSignatureScheme(vers uint16, c *Certificate, peerAlgs []SignatureScheme) (SignatureScheme, error) { - supportedAlgs := signatureSchemesForCertificate(vers, c) - if len(supportedAlgs) == 0 { - return 0, unsupportedCertificateError(c) - } - if len(peerAlgs) == 0 && vers == VersionTLS12 { - // For TLS 1.2, if the client didn't send signature_algorithms then we - // can assume that it supports SHA1. See RFC 5246, Section 7.4.1.4.1. - peerAlgs = []SignatureScheme{PKCS1WithSHA1, ECDSAWithSHA1} - } - // Pick signature scheme in the peer's preference order, as our - // preference order is not configurable. - for _, preferredAlg := range peerAlgs { - if needFIPS() && !isSupportedSignatureAlgorithm(preferredAlg, fipsSupportedSignatureAlgorithms) { - continue - } - if isSupportedSignatureAlgorithm(preferredAlg, supportedAlgs) { - return preferredAlg, nil - } - } - return 0, errors.New("tls: peer doesn't support any of the certificate's signature algorithms") -} - -// unsupportedCertificateError returns a helpful error for certificates with -// an unsupported private key. -func unsupportedCertificateError(cert *Certificate) error { - switch cert.PrivateKey.(type) { - case rsa.PrivateKey, ecdsa.PrivateKey: - return fmt.Errorf("tls: unsupported certificate: private key is %T, expected *%T", - cert.PrivateKey, cert.PrivateKey) - case *ed25519.PrivateKey: - return fmt.Errorf("tls: unsupported certificate: private key is *ed25519.PrivateKey, expected ed25519.PrivateKey") - } - - signer, ok := cert.PrivateKey.(crypto.Signer) - if !ok { - return fmt.Errorf("tls: certificate private key (%T) does not implement crypto.Signer", - cert.PrivateKey) - } - - switch pub := signer.Public().(type) { - case *ecdsa.PublicKey: - switch pub.Curve { - case elliptic.P256(): - case elliptic.P384(): - case elliptic.P521(): - default: - return fmt.Errorf("tls: unsupported certificate curve (%s)", pub.Curve.Params().Name) - } - case *rsa.PublicKey: - return fmt.Errorf("tls: certificate RSA key size too small for supported signature algorithms") - case ed25519.PublicKey: - default: - return fmt.Errorf("tls: unsupported certificate key (%T)", pub) - } - - if cert.SupportedSignatureAlgorithms != nil { - return fmt.Errorf("tls: peer doesn't support the certificate custom signature algorithms") - } - - return fmt.Errorf("tls: internal error: unsupported key (%T)", cert.PrivateKey) -} diff --git a/vendor/github.com/quic-go/qtls-go1-20/cache.go b/vendor/github.com/quic-go/qtls-go1-20/cache.go deleted file mode 100644 index 99e0c5fb8..000000000 --- a/vendor/github.com/quic-go/qtls-go1-20/cache.go +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package qtls - -import ( - "crypto/x509" - "runtime" - "sync" - "sync/atomic" -) - -type cacheEntry struct { - refs atomic.Int64 - cert *x509.Certificate -} - -// certCache implements an intern table for reference counted x509.Certificates, -// implemented in a similar fashion to BoringSSL's CRYPTO_BUFFER_POOL. This -// allows for a single x509.Certificate to be kept in memory and referenced from -// multiple Conns. Returned references should not be mutated by callers. Certificates -// are still safe to use after they are removed from the cache. -// -// Certificates are returned wrapped in a activeCert struct that should be held by -// the caller. When references to the activeCert are freed, the number of references -// to the certificate in the cache is decremented. Once the number of references -// reaches zero, the entry is evicted from the cache. -// -// The main difference between this implementation and CRYPTO_BUFFER_POOL is that -// CRYPTO_BUFFER_POOL is a more generic structure which supports blobs of data, -// rather than specific structures. Since we only care about x509.Certificates, -// certCache is implemented as a specific cache, rather than a generic one. -// -// See https://boringssl.googlesource.com/boringssl/+/master/include/openssl/pool.h -// and https://boringssl.googlesource.com/boringssl/+/master/crypto/pool/pool.c -// for the BoringSSL reference. -type certCache struct { - sync.Map -} - -var clientCertCache = new(certCache) - -// activeCert is a handle to a certificate held in the cache. Once there are -// no alive activeCerts for a given certificate, the certificate is removed -// from the cache by a finalizer. -type activeCert struct { - cert *x509.Certificate -} - -// active increments the number of references to the entry, wraps the -// certificate in the entry in a activeCert, and sets the finalizer. -// -// Note that there is a race between active and the finalizer set on the -// returned activeCert, triggered if active is called after the ref count is -// decremented such that refs may be > 0 when evict is called. We consider this -// safe, since the caller holding an activeCert for an entry that is no longer -// in the cache is fine, with the only side effect being the memory overhead of -// there being more than one distinct reference to a certificate alive at once. -func (cc *certCache) active(e *cacheEntry) *activeCert { - e.refs.Add(1) - a := &activeCert{e.cert} - runtime.SetFinalizer(a, func(_ *activeCert) { - if e.refs.Add(-1) == 0 { - cc.evict(e) - } - }) - return a -} - -// evict removes a cacheEntry from the cache. -func (cc *certCache) evict(e *cacheEntry) { - cc.Delete(string(e.cert.Raw)) -} - -// newCert returns a x509.Certificate parsed from der. If there is already a copy -// of the certificate in the cache, a reference to the existing certificate will -// be returned. Otherwise, a fresh certificate will be added to the cache, and -// the reference returned. The returned reference should not be mutated. -func (cc *certCache) newCert(der []byte) (*activeCert, error) { - if entry, ok := cc.Load(string(der)); ok { - return cc.active(entry.(*cacheEntry)), nil - } - - cert, err := x509.ParseCertificate(der) - if err != nil { - return nil, err - } - - entry := &cacheEntry{cert: cert} - if entry, loaded := cc.LoadOrStore(string(der), entry); loaded { - return cc.active(entry.(*cacheEntry)), nil - } - return cc.active(entry), nil -} diff --git a/vendor/github.com/quic-go/qtls-go1-20/cipher_suites.go b/vendor/github.com/quic-go/qtls-go1-20/cipher_suites.go deleted file mode 100644 index 2946ffb32..000000000 --- a/vendor/github.com/quic-go/qtls-go1-20/cipher_suites.go +++ /dev/null @@ -1,691 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package qtls - -import ( - "crypto" - "crypto/aes" - "crypto/cipher" - "crypto/des" - "crypto/hmac" - "crypto/rc4" - "crypto/sha1" - "crypto/sha256" - "fmt" - "hash" - "runtime" - - "golang.org/x/crypto/chacha20poly1305" - "golang.org/x/sys/cpu" -) - -// CipherSuite is a TLS cipher suite. Note that most functions in this package -// accept and expose cipher suite IDs instead of this type. -type CipherSuite struct { - ID uint16 - Name string - - // Supported versions is the list of TLS protocol versions that can - // negotiate this cipher suite. - SupportedVersions []uint16 - - // Insecure is true if the cipher suite has known security issues - // due to its primitives, design, or implementation. - Insecure bool -} - -var ( - supportedUpToTLS12 = []uint16{VersionTLS10, VersionTLS11, VersionTLS12} - supportedOnlyTLS12 = []uint16{VersionTLS12} - supportedOnlyTLS13 = []uint16{VersionTLS13} -) - -// CipherSuites returns a list of cipher suites currently implemented by this -// package, excluding those with security issues, which are returned by -// InsecureCipherSuites. -// -// The list is sorted by ID. Note that the default cipher suites selected by -// this package might depend on logic that can't be captured by a static list, -// and might not match those returned by this function. -func CipherSuites() []*CipherSuite { - return []*CipherSuite{ - {TLS_RSA_WITH_AES_128_CBC_SHA, "TLS_RSA_WITH_AES_128_CBC_SHA", supportedUpToTLS12, false}, - {TLS_RSA_WITH_AES_256_CBC_SHA, "TLS_RSA_WITH_AES_256_CBC_SHA", supportedUpToTLS12, false}, - {TLS_RSA_WITH_AES_128_GCM_SHA256, "TLS_RSA_WITH_AES_128_GCM_SHA256", supportedOnlyTLS12, false}, - {TLS_RSA_WITH_AES_256_GCM_SHA384, "TLS_RSA_WITH_AES_256_GCM_SHA384", supportedOnlyTLS12, false}, - - {TLS_AES_128_GCM_SHA256, "TLS_AES_128_GCM_SHA256", supportedOnlyTLS13, false}, - {TLS_AES_256_GCM_SHA384, "TLS_AES_256_GCM_SHA384", supportedOnlyTLS13, false}, - {TLS_CHACHA20_POLY1305_SHA256, "TLS_CHACHA20_POLY1305_SHA256", supportedOnlyTLS13, false}, - - {TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", supportedUpToTLS12, false}, - {TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", supportedUpToTLS12, false}, - {TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", supportedUpToTLS12, false}, - {TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", supportedUpToTLS12, false}, - {TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", supportedOnlyTLS12, false}, - {TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", supportedOnlyTLS12, false}, - {TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", supportedOnlyTLS12, false}, - {TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", supportedOnlyTLS12, false}, - {TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256", supportedOnlyTLS12, false}, - {TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256", supportedOnlyTLS12, false}, - } -} - -// InsecureCipherSuites returns a list of cipher suites currently implemented by -// this package and which have security issues. -// -// Most applications should not use the cipher suites in this list, and should -// only use those returned by CipherSuites. -func InsecureCipherSuites() []*CipherSuite { - // This list includes RC4, CBC_SHA256, and 3DES cipher suites. See - // cipherSuitesPreferenceOrder for details. - return []*CipherSuite{ - {TLS_RSA_WITH_RC4_128_SHA, "TLS_RSA_WITH_RC4_128_SHA", supportedUpToTLS12, true}, - {TLS_RSA_WITH_3DES_EDE_CBC_SHA, "TLS_RSA_WITH_3DES_EDE_CBC_SHA", supportedUpToTLS12, true}, - {TLS_RSA_WITH_AES_128_CBC_SHA256, "TLS_RSA_WITH_AES_128_CBC_SHA256", supportedOnlyTLS12, true}, - {TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", supportedUpToTLS12, true}, - {TLS_ECDHE_RSA_WITH_RC4_128_SHA, "TLS_ECDHE_RSA_WITH_RC4_128_SHA", supportedUpToTLS12, true}, - {TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", supportedUpToTLS12, true}, - {TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", supportedOnlyTLS12, true}, - {TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", supportedOnlyTLS12, true}, - } -} - -// CipherSuiteName returns the standard name for the passed cipher suite ID -// (e.g. "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"), or a fallback representation -// of the ID value if the cipher suite is not implemented by this package. -func CipherSuiteName(id uint16) string { - for _, c := range CipherSuites() { - if c.ID == id { - return c.Name - } - } - for _, c := range InsecureCipherSuites() { - if c.ID == id { - return c.Name - } - } - return fmt.Sprintf("0x%04X", id) -} - -const ( - // suiteECDHE indicates that the cipher suite involves elliptic curve - // Diffie-Hellman. This means that it should only be selected when the - // client indicates that it supports ECC with a curve and point format - // that we're happy with. - suiteECDHE = 1 << iota - // suiteECSign indicates that the cipher suite involves an ECDSA or - // EdDSA signature and therefore may only be selected when the server's - // certificate is ECDSA or EdDSA. If this is not set then the cipher suite - // is RSA based. - suiteECSign - // suiteTLS12 indicates that the cipher suite should only be advertised - // and accepted when using TLS 1.2. - suiteTLS12 - // suiteSHA384 indicates that the cipher suite uses SHA384 as the - // handshake hash. - suiteSHA384 -) - -// A cipherSuite is a TLS 1.0–1.2 cipher suite, and defines the key exchange -// mechanism, as well as the cipher+MAC pair or the AEAD. -type cipherSuite struct { - id uint16 - // the lengths, in bytes, of the key material needed for each component. - keyLen int - macLen int - ivLen int - ka func(version uint16) keyAgreement - // flags is a bitmask of the suite* values, above. - flags int - cipher func(key, iv []byte, isRead bool) any - mac func(key []byte) hash.Hash - aead func(key, fixedNonce []byte) aead -} - -var cipherSuites = []*cipherSuite{ // TODO: replace with a map, since the order doesn't matter. - {TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, 32, 0, 12, ecdheRSAKA, suiteECDHE | suiteTLS12, nil, nil, aeadChaCha20Poly1305}, - {TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, 32, 0, 12, ecdheECDSAKA, suiteECDHE | suiteECSign | suiteTLS12, nil, nil, aeadChaCha20Poly1305}, - {TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 16, 0, 4, ecdheRSAKA, suiteECDHE | suiteTLS12, nil, nil, aeadAESGCM}, - {TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 16, 0, 4, ecdheECDSAKA, suiteECDHE | suiteECSign | suiteTLS12, nil, nil, aeadAESGCM}, - {TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, 32, 0, 4, ecdheRSAKA, suiteECDHE | suiteTLS12 | suiteSHA384, nil, nil, aeadAESGCM}, - {TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, 32, 0, 4, ecdheECDSAKA, suiteECDHE | suiteECSign | suiteTLS12 | suiteSHA384, nil, nil, aeadAESGCM}, - {TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, 16, 32, 16, ecdheRSAKA, suiteECDHE | suiteTLS12, cipherAES, macSHA256, nil}, - {TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, 16, 20, 16, ecdheRSAKA, suiteECDHE, cipherAES, macSHA1, nil}, - {TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, 16, 32, 16, ecdheECDSAKA, suiteECDHE | suiteECSign | suiteTLS12, cipherAES, macSHA256, nil}, - {TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, 16, 20, 16, ecdheECDSAKA, suiteECDHE | suiteECSign, cipherAES, macSHA1, nil}, - {TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, 32, 20, 16, ecdheRSAKA, suiteECDHE, cipherAES, macSHA1, nil}, - {TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, 32, 20, 16, ecdheECDSAKA, suiteECDHE | suiteECSign, cipherAES, macSHA1, nil}, - {TLS_RSA_WITH_AES_128_GCM_SHA256, 16, 0, 4, rsaKA, suiteTLS12, nil, nil, aeadAESGCM}, - {TLS_RSA_WITH_AES_256_GCM_SHA384, 32, 0, 4, rsaKA, suiteTLS12 | suiteSHA384, nil, nil, aeadAESGCM}, - {TLS_RSA_WITH_AES_128_CBC_SHA256, 16, 32, 16, rsaKA, suiteTLS12, cipherAES, macSHA256, nil}, - {TLS_RSA_WITH_AES_128_CBC_SHA, 16, 20, 16, rsaKA, 0, cipherAES, macSHA1, nil}, - {TLS_RSA_WITH_AES_256_CBC_SHA, 32, 20, 16, rsaKA, 0, cipherAES, macSHA1, nil}, - {TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, 24, 20, 8, ecdheRSAKA, suiteECDHE, cipher3DES, macSHA1, nil}, - {TLS_RSA_WITH_3DES_EDE_CBC_SHA, 24, 20, 8, rsaKA, 0, cipher3DES, macSHA1, nil}, - {TLS_RSA_WITH_RC4_128_SHA, 16, 20, 0, rsaKA, 0, cipherRC4, macSHA1, nil}, - {TLS_ECDHE_RSA_WITH_RC4_128_SHA, 16, 20, 0, ecdheRSAKA, suiteECDHE, cipherRC4, macSHA1, nil}, - {TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, 16, 20, 0, ecdheECDSAKA, suiteECDHE | suiteECSign, cipherRC4, macSHA1, nil}, -} - -// selectCipherSuite returns the first TLS 1.0–1.2 cipher suite from ids which -// is also in supportedIDs and passes the ok filter. -func selectCipherSuite(ids, supportedIDs []uint16, ok func(*cipherSuite) bool) *cipherSuite { - for _, id := range ids { - candidate := cipherSuiteByID(id) - if candidate == nil || !ok(candidate) { - continue - } - - for _, suppID := range supportedIDs { - if id == suppID { - return candidate - } - } - } - return nil -} - -// A cipherSuiteTLS13 defines only the pair of the AEAD algorithm and hash -// algorithm to be used with HKDF. See RFC 8446, Appendix B.4. -type cipherSuiteTLS13 struct { - id uint16 - keyLen int - aead func(key, fixedNonce []byte) aead - hash crypto.Hash -} - -var cipherSuitesTLS13 = []*cipherSuiteTLS13{ // TODO: replace with a map. - {TLS_AES_128_GCM_SHA256, 16, aeadAESGCMTLS13, crypto.SHA256}, - {TLS_CHACHA20_POLY1305_SHA256, 32, aeadChaCha20Poly1305, crypto.SHA256}, - {TLS_AES_256_GCM_SHA384, 32, aeadAESGCMTLS13, crypto.SHA384}, -} - -// cipherSuitesPreferenceOrder is the order in which we'll select (on the -// server) or advertise (on the client) TLS 1.0–1.2 cipher suites. -// -// Cipher suites are filtered but not reordered based on the application and -// peer's preferences, meaning we'll never select a suite lower in this list if -// any higher one is available. This makes it more defensible to keep weaker -// cipher suites enabled, especially on the server side where we get the last -// word, since there are no known downgrade attacks on cipher suites selection. -// -// The list is sorted by applying the following priority rules, stopping at the -// first (most important) applicable one: -// -// - Anything else comes before RC4 -// -// RC4 has practically exploitable biases. See https://www.rc4nomore.com. -// -// - Anything else comes before CBC_SHA256 -// -// SHA-256 variants of the CBC ciphersuites don't implement any Lucky13 -// countermeasures. See http://www.isg.rhul.ac.uk/tls/Lucky13.html and -// https://www.imperialviolet.org/2013/02/04/luckythirteen.html. -// -// - Anything else comes before 3DES -// -// 3DES has 64-bit blocks, which makes it fundamentally susceptible to -// birthday attacks. See https://sweet32.info. -// -// - ECDHE comes before anything else -// -// Once we got the broken stuff out of the way, the most important -// property a cipher suite can have is forward secrecy. We don't -// implement FFDHE, so that means ECDHE. -// -// - AEADs come before CBC ciphers -// -// Even with Lucky13 countermeasures, MAC-then-Encrypt CBC cipher suites -// are fundamentally fragile, and suffered from an endless sequence of -// padding oracle attacks. See https://eprint.iacr.org/2015/1129, -// https://www.imperialviolet.org/2014/12/08/poodleagain.html, and -// https://blog.cloudflare.com/yet-another-padding-oracle-in-openssl-cbc-ciphersuites/. -// -// - AES comes before ChaCha20 -// -// When AES hardware is available, AES-128-GCM and AES-256-GCM are faster -// than ChaCha20Poly1305. -// -// When AES hardware is not available, AES-128-GCM is one or more of: much -// slower, way more complex, and less safe (because not constant time) -// than ChaCha20Poly1305. -// -// We use this list if we think both peers have AES hardware, and -// cipherSuitesPreferenceOrderNoAES otherwise. -// -// - AES-128 comes before AES-256 -// -// The only potential advantages of AES-256 are better multi-target -// margins, and hypothetical post-quantum properties. Neither apply to -// TLS, and AES-256 is slower due to its four extra rounds (which don't -// contribute to the advantages above). -// -// - ECDSA comes before RSA -// -// The relative order of ECDSA and RSA cipher suites doesn't matter, -// as they depend on the certificate. Pick one to get a stable order. -var cipherSuitesPreferenceOrder = []uint16{ - // AEADs w/ ECDHE - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, - - // CBC w/ ECDHE - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, - TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, - - // AEADs w/o ECDHE - TLS_RSA_WITH_AES_128_GCM_SHA256, - TLS_RSA_WITH_AES_256_GCM_SHA384, - - // CBC w/o ECDHE - TLS_RSA_WITH_AES_128_CBC_SHA, - TLS_RSA_WITH_AES_256_CBC_SHA, - - // 3DES - TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, - TLS_RSA_WITH_3DES_EDE_CBC_SHA, - - // CBC_SHA256 - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, - TLS_RSA_WITH_AES_128_CBC_SHA256, - - // RC4 - TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_RC4_128_SHA, - TLS_RSA_WITH_RC4_128_SHA, -} - -var cipherSuitesPreferenceOrderNoAES = []uint16{ - // ChaCha20Poly1305 - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, - - // AES-GCM w/ ECDHE - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, - - // The rest of cipherSuitesPreferenceOrder. - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, - TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, - TLS_RSA_WITH_AES_128_GCM_SHA256, - TLS_RSA_WITH_AES_256_GCM_SHA384, - TLS_RSA_WITH_AES_128_CBC_SHA, - TLS_RSA_WITH_AES_256_CBC_SHA, - TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, - TLS_RSA_WITH_3DES_EDE_CBC_SHA, - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, - TLS_RSA_WITH_AES_128_CBC_SHA256, - TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_RC4_128_SHA, - TLS_RSA_WITH_RC4_128_SHA, -} - -// disabledCipherSuites are not used unless explicitly listed in -// Config.CipherSuites. They MUST be at the end of cipherSuitesPreferenceOrder. -var disabledCipherSuites = []uint16{ - // CBC_SHA256 - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, - TLS_RSA_WITH_AES_128_CBC_SHA256, - - // RC4 - TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_RC4_128_SHA, - TLS_RSA_WITH_RC4_128_SHA, -} - -var ( - defaultCipherSuitesLen = len(cipherSuitesPreferenceOrder) - len(disabledCipherSuites) - defaultCipherSuites = cipherSuitesPreferenceOrder[:defaultCipherSuitesLen] -) - -// defaultCipherSuitesTLS13 is also the preference order, since there are no -// disabled by default TLS 1.3 cipher suites. The same AES vs ChaCha20 logic as -// cipherSuitesPreferenceOrder applies. -var defaultCipherSuitesTLS13 = []uint16{ - TLS_AES_128_GCM_SHA256, - TLS_AES_256_GCM_SHA384, - TLS_CHACHA20_POLY1305_SHA256, -} - -var defaultCipherSuitesTLS13NoAES = []uint16{ - TLS_CHACHA20_POLY1305_SHA256, - TLS_AES_128_GCM_SHA256, - TLS_AES_256_GCM_SHA384, -} - -var ( - hasGCMAsmAMD64 = cpu.X86.HasAES && cpu.X86.HasPCLMULQDQ - hasGCMAsmARM64 = cpu.ARM64.HasAES && cpu.ARM64.HasPMULL - // Keep in sync with crypto/aes/cipher_s390x.go. - hasGCMAsmS390X = cpu.S390X.HasAES && cpu.S390X.HasAESCBC && cpu.S390X.HasAESCTR && - (cpu.S390X.HasGHASH || cpu.S390X.HasAESGCM) - - hasAESGCMHardwareSupport = runtime.GOARCH == "amd64" && hasGCMAsmAMD64 || - runtime.GOARCH == "arm64" && hasGCMAsmARM64 || - runtime.GOARCH == "s390x" && hasGCMAsmS390X -) - -var aesgcmCiphers = map[uint16]bool{ - // TLS 1.2 - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256: true, - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384: true, - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256: true, - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384: true, - // TLS 1.3 - TLS_AES_128_GCM_SHA256: true, - TLS_AES_256_GCM_SHA384: true, -} - -var nonAESGCMAEADCiphers = map[uint16]bool{ - // TLS 1.2 - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305: true, - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305: true, - // TLS 1.3 - TLS_CHACHA20_POLY1305_SHA256: true, -} - -// aesgcmPreferred returns whether the first known cipher in the preference list -// is an AES-GCM cipher, implying the peer has hardware support for it. -func aesgcmPreferred(ciphers []uint16) bool { - for _, cID := range ciphers { - if c := cipherSuiteByID(cID); c != nil { - return aesgcmCiphers[cID] - } - if c := cipherSuiteTLS13ByID(cID); c != nil { - return aesgcmCiphers[cID] - } - } - return false -} - -func cipherRC4(key, iv []byte, isRead bool) any { - cipher, _ := rc4.NewCipher(key) - return cipher -} - -func cipher3DES(key, iv []byte, isRead bool) any { - block, _ := des.NewTripleDESCipher(key) - if isRead { - return cipher.NewCBCDecrypter(block, iv) - } - return cipher.NewCBCEncrypter(block, iv) -} - -func cipherAES(key, iv []byte, isRead bool) any { - block, _ := aes.NewCipher(key) - if isRead { - return cipher.NewCBCDecrypter(block, iv) - } - return cipher.NewCBCEncrypter(block, iv) -} - -// macSHA1 returns a SHA-1 based constant time MAC. -func macSHA1(key []byte) hash.Hash { - h := sha1.New - h = newConstantTimeHash(h) - return hmac.New(h, key) -} - -// macSHA256 returns a SHA-256 based MAC. This is only supported in TLS 1.2 and -// is currently only used in disabled-by-default cipher suites. -func macSHA256(key []byte) hash.Hash { - return hmac.New(sha256.New, key) -} - -type aead interface { - cipher.AEAD - - // explicitNonceLen returns the number of bytes of explicit nonce - // included in each record. This is eight for older AEADs and - // zero for modern ones. - explicitNonceLen() int -} - -const ( - aeadNonceLength = 12 - noncePrefixLength = 4 -) - -// prefixNonceAEAD wraps an AEAD and prefixes a fixed portion of the nonce to -// each call. -type prefixNonceAEAD struct { - // nonce contains the fixed part of the nonce in the first four bytes. - nonce [aeadNonceLength]byte - aead cipher.AEAD -} - -func (f *prefixNonceAEAD) NonceSize() int { return aeadNonceLength - noncePrefixLength } -func (f *prefixNonceAEAD) Overhead() int { return f.aead.Overhead() } -func (f *prefixNonceAEAD) explicitNonceLen() int { return f.NonceSize() } - -func (f *prefixNonceAEAD) Seal(out, nonce, plaintext, additionalData []byte) []byte { - copy(f.nonce[4:], nonce) - return f.aead.Seal(out, f.nonce[:], plaintext, additionalData) -} - -func (f *prefixNonceAEAD) Open(out, nonce, ciphertext, additionalData []byte) ([]byte, error) { - copy(f.nonce[4:], nonce) - return f.aead.Open(out, f.nonce[:], ciphertext, additionalData) -} - -// xorNonceAEAD wraps an AEAD by XORing in a fixed pattern to the nonce -// before each call. -type xorNonceAEAD struct { - nonceMask [aeadNonceLength]byte - aead cipher.AEAD -} - -func (f *xorNonceAEAD) NonceSize() int { return 8 } // 64-bit sequence number -func (f *xorNonceAEAD) Overhead() int { return f.aead.Overhead() } -func (f *xorNonceAEAD) explicitNonceLen() int { return 0 } - -func (f *xorNonceAEAD) Seal(out, nonce, plaintext, additionalData []byte) []byte { - for i, b := range nonce { - f.nonceMask[4+i] ^= b - } - result := f.aead.Seal(out, f.nonceMask[:], plaintext, additionalData) - for i, b := range nonce { - f.nonceMask[4+i] ^= b - } - - return result -} - -func (f *xorNonceAEAD) Open(out, nonce, ciphertext, additionalData []byte) ([]byte, error) { - for i, b := range nonce { - f.nonceMask[4+i] ^= b - } - result, err := f.aead.Open(out, f.nonceMask[:], ciphertext, additionalData) - for i, b := range nonce { - f.nonceMask[4+i] ^= b - } - - return result, err -} - -func aeadAESGCM(key, noncePrefix []byte) aead { - if len(noncePrefix) != noncePrefixLength { - panic("tls: internal error: wrong nonce length") - } - aes, err := aes.NewCipher(key) - if err != nil { - panic(err) - } - var aead cipher.AEAD - aead, err = cipher.NewGCM(aes) - if err != nil { - panic(err) - } - - ret := &prefixNonceAEAD{aead: aead} - copy(ret.nonce[:], noncePrefix) - return ret -} - -func aeadAESGCMTLS13(key, nonceMask []byte) aead { - if len(nonceMask) != aeadNonceLength { - panic("tls: internal error: wrong nonce length") - } - aes, err := aes.NewCipher(key) - if err != nil { - panic(err) - } - aead, err := cipher.NewGCM(aes) - if err != nil { - panic(err) - } - - ret := &xorNonceAEAD{aead: aead} - copy(ret.nonceMask[:], nonceMask) - return ret -} - -func aeadChaCha20Poly1305(key, nonceMask []byte) aead { - if len(nonceMask) != aeadNonceLength { - panic("tls: internal error: wrong nonce length") - } - aead, err := chacha20poly1305.New(key) - if err != nil { - panic(err) - } - - ret := &xorNonceAEAD{aead: aead} - copy(ret.nonceMask[:], nonceMask) - return ret -} - -type constantTimeHash interface { - hash.Hash - ConstantTimeSum(b []byte) []byte -} - -// cthWrapper wraps any hash.Hash that implements ConstantTimeSum, and replaces -// with that all calls to Sum. It's used to obtain a ConstantTimeSum-based HMAC. -type cthWrapper struct { - h constantTimeHash -} - -func (c *cthWrapper) Size() int { return c.h.Size() } -func (c *cthWrapper) BlockSize() int { return c.h.BlockSize() } -func (c *cthWrapper) Reset() { c.h.Reset() } -func (c *cthWrapper) Write(p []byte) (int, error) { return c.h.Write(p) } -func (c *cthWrapper) Sum(b []byte) []byte { return c.h.ConstantTimeSum(b) } - -func newConstantTimeHash(h func() hash.Hash) func() hash.Hash { - return func() hash.Hash { - return &cthWrapper{h().(constantTimeHash)} - } -} - -// tls10MAC implements the TLS 1.0 MAC function. RFC 2246, Section 6.2.3. -func tls10MAC(h hash.Hash, out, seq, header, data, extra []byte) []byte { - h.Reset() - h.Write(seq) - h.Write(header) - h.Write(data) - res := h.Sum(out) - if extra != nil { - h.Write(extra) - } - return res -} - -func rsaKA(version uint16) keyAgreement { - return rsaKeyAgreement{} -} - -func ecdheECDSAKA(version uint16) keyAgreement { - return &ecdheKeyAgreement{ - isRSA: false, - version: version, - } -} - -func ecdheRSAKA(version uint16) keyAgreement { - return &ecdheKeyAgreement{ - isRSA: true, - version: version, - } -} - -// mutualCipherSuite returns a cipherSuite given a list of supported -// ciphersuites and the id requested by the peer. -func mutualCipherSuite(have []uint16, want uint16) *cipherSuite { - for _, id := range have { - if id == want { - return cipherSuiteByID(id) - } - } - return nil -} - -func cipherSuiteByID(id uint16) *cipherSuite { - for _, cipherSuite := range cipherSuites { - if cipherSuite.id == id { - return cipherSuite - } - } - return nil -} - -func mutualCipherSuiteTLS13(have []uint16, want uint16) *cipherSuiteTLS13 { - for _, id := range have { - if id == want { - return cipherSuiteTLS13ByID(id) - } - } - return nil -} - -func cipherSuiteTLS13ByID(id uint16) *cipherSuiteTLS13 { - for _, cipherSuite := range cipherSuitesTLS13 { - if cipherSuite.id == id { - return cipherSuite - } - } - return nil -} - -// A list of cipher suite IDs that are, or have been, implemented by this -// package. -// -// See https://www.iana.org/assignments/tls-parameters/tls-parameters.xml -const ( - // TLS 1.0 - 1.2 cipher suites. - TLS_RSA_WITH_RC4_128_SHA uint16 = 0x0005 - TLS_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0x000a - TLS_RSA_WITH_AES_128_CBC_SHA uint16 = 0x002f - TLS_RSA_WITH_AES_256_CBC_SHA uint16 = 0x0035 - TLS_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0x003c - TLS_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0x009c - TLS_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0x009d - TLS_ECDHE_ECDSA_WITH_RC4_128_SHA uint16 = 0xc007 - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA uint16 = 0xc009 - TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA uint16 = 0xc00a - TLS_ECDHE_RSA_WITH_RC4_128_SHA uint16 = 0xc011 - TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0xc012 - TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA uint16 = 0xc013 - TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA uint16 = 0xc014 - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 uint16 = 0xc023 - TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0xc027 - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0xc02f - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 uint16 = 0xc02b - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0xc030 - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 uint16 = 0xc02c - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xcca8 - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xcca9 - - // TLS 1.3 cipher suites. - TLS_AES_128_GCM_SHA256 uint16 = 0x1301 - TLS_AES_256_GCM_SHA384 uint16 = 0x1302 - TLS_CHACHA20_POLY1305_SHA256 uint16 = 0x1303 - - // TLS_FALLBACK_SCSV isn't a standard cipher suite but an indicator - // that the client is doing version fallback. See RFC 7507. - TLS_FALLBACK_SCSV uint16 = 0x5600 - - // Legacy names for the corresponding cipher suites with the correct _SHA256 - // suffix, retained for backward compatibility. - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 = TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 = TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 -) diff --git a/vendor/github.com/quic-go/qtls-go1-20/common.go b/vendor/github.com/quic-go/qtls-go1-20/common.go deleted file mode 100644 index 841c1a44b..000000000 --- a/vendor/github.com/quic-go/qtls-go1-20/common.go +++ /dev/null @@ -1,1454 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package qtls - -import ( - "bytes" - "container/list" - "context" - "crypto" - "crypto/ecdsa" - "crypto/ed25519" - "crypto/elliptic" - "crypto/rand" - "crypto/rsa" - "crypto/sha512" - "crypto/tls" - "crypto/x509" - "errors" - "fmt" - "io" - "net" - "strings" - "sync" - "time" -) - -const ( - VersionTLS10 = 0x0301 - VersionTLS11 = 0x0302 - VersionTLS12 = 0x0303 - VersionTLS13 = 0x0304 - - // Deprecated: SSLv3 is cryptographically broken, and is no longer - // supported by this package. See golang.org/issue/32716. - VersionSSL30 = 0x0300 -) - -const ( - maxPlaintext = 16384 // maximum plaintext payload length - maxCiphertext = 16384 + 2048 // maximum ciphertext payload length - maxCiphertextTLS13 = 16384 + 256 // maximum ciphertext length in TLS 1.3 - recordHeaderLen = 5 // record header length - maxHandshake = 65536 // maximum handshake we support (protocol max is 16 MB) - maxUselessRecords = 16 // maximum number of consecutive non-advancing records -) - -// TLS record types. -type recordType uint8 - -const ( - recordTypeChangeCipherSpec recordType = 20 - recordTypeAlert recordType = 21 - recordTypeHandshake recordType = 22 - recordTypeApplicationData recordType = 23 -) - -// TLS handshake message types. -const ( - typeHelloRequest uint8 = 0 - typeClientHello uint8 = 1 - typeServerHello uint8 = 2 - typeNewSessionTicket uint8 = 4 - typeEndOfEarlyData uint8 = 5 - typeEncryptedExtensions uint8 = 8 - typeCertificate uint8 = 11 - typeServerKeyExchange uint8 = 12 - typeCertificateRequest uint8 = 13 - typeServerHelloDone uint8 = 14 - typeCertificateVerify uint8 = 15 - typeClientKeyExchange uint8 = 16 - typeFinished uint8 = 20 - typeCertificateStatus uint8 = 22 - typeKeyUpdate uint8 = 24 - typeNextProtocol uint8 = 67 // Not IANA assigned - typeMessageHash uint8 = 254 // synthetic message -) - -// TLS compression types. -const ( - compressionNone uint8 = 0 -) - -// TLS extension numbers -const ( - extensionServerName uint16 = 0 - extensionStatusRequest uint16 = 5 - extensionSupportedCurves uint16 = 10 // supported_groups in TLS 1.3, see RFC 8446, Section 4.2.7 - extensionSupportedPoints uint16 = 11 - extensionSignatureAlgorithms uint16 = 13 - extensionALPN uint16 = 16 - extensionSCT uint16 = 18 - extensionSessionTicket uint16 = 35 - extensionPreSharedKey uint16 = 41 - extensionEarlyData uint16 = 42 - extensionSupportedVersions uint16 = 43 - extensionCookie uint16 = 44 - extensionPSKModes uint16 = 45 - extensionCertificateAuthorities uint16 = 47 - extensionSignatureAlgorithmsCert uint16 = 50 - extensionKeyShare uint16 = 51 - extensionQUICTransportParameters uint16 = 57 - extensionRenegotiationInfo uint16 = 0xff01 -) - -// TLS signaling cipher suite values -const ( - scsvRenegotiation uint16 = 0x00ff -) - -// CurveID is a tls.CurveID -type CurveID = tls.CurveID - -const ( - CurveP256 CurveID = 23 - CurveP384 CurveID = 24 - CurveP521 CurveID = 25 - X25519 CurveID = 29 -) - -// TLS 1.3 Key Share. See RFC 8446, Section 4.2.8. -type keyShare struct { - group CurveID - data []byte -} - -// TLS 1.3 PSK Key Exchange Modes. See RFC 8446, Section 4.2.9. -const ( - pskModePlain uint8 = 0 - pskModeDHE uint8 = 1 -) - -// TLS 1.3 PSK Identity. Can be a Session Ticket, or a reference to a saved -// session. See RFC 8446, Section 4.2.11. -type pskIdentity struct { - label []byte - obfuscatedTicketAge uint32 -} - -// TLS Elliptic Curve Point Formats -// https://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-9 -const ( - pointFormatUncompressed uint8 = 0 -) - -// TLS CertificateStatusType (RFC 3546) -const ( - statusTypeOCSP uint8 = 1 -) - -// Certificate types (for certificateRequestMsg) -const ( - certTypeRSASign = 1 - certTypeECDSASign = 64 // ECDSA or EdDSA keys, see RFC 8422, Section 3. -) - -// Signature algorithms (for internal signaling use). Starting at 225 to avoid overlap with -// TLS 1.2 codepoints (RFC 5246, Appendix A.4.1), with which these have nothing to do. -const ( - signaturePKCS1v15 uint8 = iota + 225 - signatureRSAPSS - signatureECDSA - signatureEd25519 -) - -// directSigning is a standard Hash value that signals that no pre-hashing -// should be performed, and that the input should be signed directly. It is the -// hash function associated with the Ed25519 signature scheme. -var directSigning crypto.Hash = 0 - -// defaultSupportedSignatureAlgorithms contains the signature and hash algorithms that -// the code advertises as supported in a TLS 1.2+ ClientHello and in a TLS 1.2+ -// CertificateRequest. The two fields are merged to match with TLS 1.3. -// Note that in TLS 1.2, the ECDSA algorithms are not constrained to P-256, etc. -var defaultSupportedSignatureAlgorithms = []SignatureScheme{ - PSSWithSHA256, - ECDSAWithP256AndSHA256, - Ed25519, - PSSWithSHA384, - PSSWithSHA512, - PKCS1WithSHA256, - PKCS1WithSHA384, - PKCS1WithSHA512, - ECDSAWithP384AndSHA384, - ECDSAWithP521AndSHA512, - PKCS1WithSHA1, - ECDSAWithSHA1, -} - -// helloRetryRequestRandom is set as the Random value of a ServerHello -// to signal that the message is actually a HelloRetryRequest. -var helloRetryRequestRandom = []byte{ // See RFC 8446, Section 4.1.3. - 0xCF, 0x21, 0xAD, 0x74, 0xE5, 0x9A, 0x61, 0x11, - 0xBE, 0x1D, 0x8C, 0x02, 0x1E, 0x65, 0xB8, 0x91, - 0xC2, 0xA2, 0x11, 0x16, 0x7A, 0xBB, 0x8C, 0x5E, - 0x07, 0x9E, 0x09, 0xE2, 0xC8, 0xA8, 0x33, 0x9C, -} - -const ( - // downgradeCanaryTLS12 or downgradeCanaryTLS11 is embedded in the server - // random as a downgrade protection if the server would be capable of - // negotiating a higher version. See RFC 8446, Section 4.1.3. - downgradeCanaryTLS12 = "DOWNGRD\x01" - downgradeCanaryTLS11 = "DOWNGRD\x00" -) - -// testingOnlyForceDowngradeCanary is set in tests to force the server side to -// include downgrade canaries even if it's using its highers supported version. -var testingOnlyForceDowngradeCanary bool - -type ConnectionState = tls.ConnectionState - -// ConnectionState records basic TLS details about the connection. -type connectionState struct { - // Version is the TLS version used by the connection (e.g. VersionTLS12). - Version uint16 - - // HandshakeComplete is true if the handshake has concluded. - HandshakeComplete bool - - // DidResume is true if this connection was successfully resumed from a - // previous session with a session ticket or similar mechanism. - DidResume bool - - // CipherSuite is the cipher suite negotiated for the connection (e.g. - // TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_AES_128_GCM_SHA256). - CipherSuite uint16 - - // NegotiatedProtocol is the application protocol negotiated with ALPN. - NegotiatedProtocol string - - // NegotiatedProtocolIsMutual used to indicate a mutual NPN negotiation. - // - // Deprecated: this value is always true. - NegotiatedProtocolIsMutual bool - - // ServerName is the value of the Server Name Indication extension sent by - // the client. It's available both on the server and on the client side. - ServerName string - - // PeerCertificates are the parsed certificates sent by the peer, in the - // order in which they were sent. The first element is the leaf certificate - // that the connection is verified against. - // - // On the client side, it can't be empty. On the server side, it can be - // empty if Config.ClientAuth is not RequireAnyClientCert or - // RequireAndVerifyClientCert. - // - // PeerCertificates and its contents should not be modified. - PeerCertificates []*x509.Certificate - - // VerifiedChains is a list of one or more chains where the first element is - // PeerCertificates[0] and the last element is from Config.RootCAs (on the - // client side) or Config.ClientCAs (on the server side). - // - // On the client side, it's set if Config.InsecureSkipVerify is false. On - // the server side, it's set if Config.ClientAuth is VerifyClientCertIfGiven - // (and the peer provided a certificate) or RequireAndVerifyClientCert. - // - // VerifiedChains and its contents should not be modified. - VerifiedChains [][]*x509.Certificate - - // SignedCertificateTimestamps is a list of SCTs provided by the peer - // through the TLS handshake for the leaf certificate, if any. - SignedCertificateTimestamps [][]byte - - // OCSPResponse is a stapled Online Certificate Status Protocol (OCSP) - // response provided by the peer for the leaf certificate, if any. - OCSPResponse []byte - - // TLSUnique contains the "tls-unique" channel binding value (see RFC 5929, - // Section 3). This value will be nil for TLS 1.3 connections and for all - // resumed connections. - // - // Deprecated: there are conditions in which this value might not be unique - // to a connection. See the Security Considerations sections of RFC 5705 and - // RFC 7627, and https://mitls.org/pages/attacks/3SHAKE#channelbindings. - TLSUnique []byte - - // ekm is a closure exposed via ExportKeyingMaterial. - ekm func(label string, context []byte, length int) ([]byte, error) -} - -// ClientAuthType is tls.ClientAuthType -type ClientAuthType = tls.ClientAuthType - -const ( - NoClientCert = tls.NoClientCert - RequestClientCert = tls.RequestClientCert - RequireAnyClientCert = tls.RequireAnyClientCert - VerifyClientCertIfGiven = tls.VerifyClientCertIfGiven - RequireAndVerifyClientCert = tls.RequireAndVerifyClientCert -) - -// requiresClientCert reports whether the ClientAuthType requires a client -// certificate to be provided. -func requiresClientCert(c ClientAuthType) bool { - switch c { - case RequireAnyClientCert, RequireAndVerifyClientCert: - return true - default: - return false - } -} - -// ClientSessionState contains the state needed by clients to resume TLS -// sessions. -type ClientSessionState = tls.ClientSessionState - -type clientSessionState struct { - sessionTicket []uint8 // Encrypted ticket used for session resumption with server - vers uint16 // TLS version negotiated for the session - cipherSuite uint16 // Ciphersuite negotiated for the session - masterSecret []byte // Full handshake MasterSecret, or TLS 1.3 resumption_master_secret - serverCertificates []*x509.Certificate // Certificate chain presented by the server - verifiedChains [][]*x509.Certificate // Certificate chains we built for verification - receivedAt time.Time // When the session ticket was received from the server - ocspResponse []byte // Stapled OCSP response presented by the server - scts [][]byte // SCTs presented by the server - - // TLS 1.3 fields. - nonce []byte // Ticket nonce sent by the server, to derive PSK - useBy time.Time // Expiration of the ticket lifetime as set by the server - ageAdd uint32 // Random obfuscation factor for sending the ticket age -} - -// ClientSessionCache is a cache of ClientSessionState objects that can be used -// by a client to resume a TLS session with a given server. ClientSessionCache -// implementations should expect to be called concurrently from different -// goroutines. Up to TLS 1.2, only ticket-based resumption is supported, not -// SessionID-based resumption. In TLS 1.3 they were merged into PSK modes, which -// are supported via this interface. -type ClientSessionCache = tls.ClientSessionCache - -// SignatureScheme is a tls.SignatureScheme -type SignatureScheme = tls.SignatureScheme - -const ( - // RSASSA-PKCS1-v1_5 algorithms. - PKCS1WithSHA256 SignatureScheme = 0x0401 - PKCS1WithSHA384 SignatureScheme = 0x0501 - PKCS1WithSHA512 SignatureScheme = 0x0601 - - // RSASSA-PSS algorithms with public key OID rsaEncryption. - PSSWithSHA256 SignatureScheme = 0x0804 - PSSWithSHA384 SignatureScheme = 0x0805 - PSSWithSHA512 SignatureScheme = 0x0806 - - // ECDSA algorithms. Only constrained to a specific curve in TLS 1.3. - ECDSAWithP256AndSHA256 SignatureScheme = 0x0403 - ECDSAWithP384AndSHA384 SignatureScheme = 0x0503 - ECDSAWithP521AndSHA512 SignatureScheme = 0x0603 - - // EdDSA algorithms. - Ed25519 SignatureScheme = 0x0807 - - // Legacy signature and hash algorithms for TLS 1.2. - PKCS1WithSHA1 SignatureScheme = 0x0201 - ECDSAWithSHA1 SignatureScheme = 0x0203 -) - -// ClientHelloInfo contains information from a ClientHello message in order to -// guide application logic in the GetCertificate and GetConfigForClient callbacks. -type ClientHelloInfo = tls.ClientHelloInfo - -type clientHelloInfo struct { - // CipherSuites lists the CipherSuites supported by the client (e.g. - // TLS_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256). - CipherSuites []uint16 - - // ServerName indicates the name of the server requested by the client - // in order to support virtual hosting. ServerName is only set if the - // client is using SNI (see RFC 4366, Section 3.1). - ServerName string - - // SupportedCurves lists the elliptic curves supported by the client. - // SupportedCurves is set only if the Supported Elliptic Curves - // Extension is being used (see RFC 4492, Section 5.1.1). - SupportedCurves []CurveID - - // SupportedPoints lists the point formats supported by the client. - // SupportedPoints is set only if the Supported Point Formats Extension - // is being used (see RFC 4492, Section 5.1.2). - SupportedPoints []uint8 - - // SignatureSchemes lists the signature and hash schemes that the client - // is willing to verify. SignatureSchemes is set only if the Signature - // Algorithms Extension is being used (see RFC 5246, Section 7.4.1.4.1). - SignatureSchemes []SignatureScheme - - // SupportedProtos lists the application protocols supported by the client. - // SupportedProtos is set only if the Application-Layer Protocol - // Negotiation Extension is being used (see RFC 7301, Section 3.1). - // - // Servers can select a protocol by setting Config.NextProtos in a - // GetConfigForClient return value. - SupportedProtos []string - - // SupportedVersions lists the TLS versions supported by the client. - // For TLS versions less than 1.3, this is extrapolated from the max - // version advertised by the client, so values other than the greatest - // might be rejected if used. - SupportedVersions []uint16 - - // Conn is the underlying net.Conn for the connection. Do not read - // from, or write to, this connection; that will cause the TLS - // connection to fail. - Conn net.Conn - - // config is embedded by the GetCertificate or GetConfigForClient caller, - // for use with SupportsCertificate. - config *Config - - // ctx is the context of the handshake that is in progress. - ctx context.Context -} - -// Context returns the context of the handshake that is in progress. -// This context is a child of the context passed to HandshakeContext, -// if any, and is canceled when the handshake concludes. -func (c *clientHelloInfo) Context() context.Context { - return c.ctx -} - -// CertificateRequestInfo contains information from a server's -// CertificateRequest message, which is used to demand a certificate and proof -// of control from a client. -type CertificateRequestInfo = tls.CertificateRequestInfo - -type certificateRequestInfo struct { - // AcceptableCAs contains zero or more, DER-encoded, X.501 - // Distinguished Names. These are the names of root or intermediate CAs - // that the server wishes the returned certificate to be signed by. An - // empty slice indicates that the server has no preference. - AcceptableCAs [][]byte - - // SignatureSchemes lists the signature schemes that the server is - // willing to verify. - SignatureSchemes []SignatureScheme - - // Version is the TLS version that was negotiated for this connection. - Version uint16 - - // ctx is the context of the handshake that is in progress. - ctx context.Context -} - -// Context returns the context of the handshake that is in progress. -// This context is a child of the context passed to HandshakeContext, -// if any, and is canceled when the handshake concludes. -func (c *certificateRequestInfo) Context() context.Context { - return c.ctx -} - -// RenegotiationSupport enumerates the different levels of support for TLS -// renegotiation. TLS renegotiation is the act of performing subsequent -// handshakes on a connection after the first. This significantly complicates -// the state machine and has been the source of numerous, subtle security -// issues. Initiating a renegotiation is not supported, but support for -// accepting renegotiation requests may be enabled. -// -// Even when enabled, the server may not change its identity between handshakes -// (i.e. the leaf certificate must be the same). Additionally, concurrent -// handshake and application data flow is not permitted so renegotiation can -// only be used with protocols that synchronise with the renegotiation, such as -// HTTPS. -// -// Renegotiation is not defined in TLS 1.3. -type RenegotiationSupport = tls.RenegotiationSupport - -const ( - // RenegotiateNever disables renegotiation. - RenegotiateNever = tls.RenegotiateNever - - // RenegotiateOnceAsClient allows a remote server to request - // renegotiation once per connection. - RenegotiateOnceAsClient = tls.RenegotiateOnceAsClient - - // RenegotiateFreelyAsClient allows a remote server to repeatedly - // request renegotiation. - RenegotiateFreelyAsClient = tls.RenegotiateFreelyAsClient -) - -// A Config structure is used to configure a TLS client or server. -// After one has been passed to a TLS function it must not be -// modified. A Config may be reused; the tls package will also not -// modify it. -type Config = tls.Config - -type config struct { - // Rand provides the source of entropy for nonces and RSA blinding. - // If Rand is nil, TLS uses the cryptographic random reader in package - // crypto/rand. - // The Reader must be safe for use by multiple goroutines. - Rand io.Reader - - // Time returns the current time as the number of seconds since the epoch. - // If Time is nil, TLS uses time.Now. - Time func() time.Time - - // Certificates contains one or more certificate chains to present to the - // other side of the connection. The first certificate compatible with the - // peer's requirements is selected automatically. - // - // Server configurations must set one of Certificates, GetCertificate or - // GetConfigForClient. Clients doing client-authentication may set either - // Certificates or GetClientCertificate. - // - // Note: if there are multiple Certificates, and they don't have the - // optional field Leaf set, certificate selection will incur a significant - // per-handshake performance cost. - Certificates []Certificate - - // NameToCertificate maps from a certificate name to an element of - // Certificates. Note that a certificate name can be of the form - // '*.example.com' and so doesn't have to be a domain name as such. - // - // Deprecated: NameToCertificate only allows associating a single - // certificate with a given name. Leave this field nil to let the library - // select the first compatible chain from Certificates. - NameToCertificate map[string]*Certificate - - // GetCertificate returns a Certificate based on the given - // ClientHelloInfo. It will only be called if the client supplies SNI - // information or if Certificates is empty. - // - // If GetCertificate is nil or returns nil, then the certificate is - // retrieved from NameToCertificate. If NameToCertificate is nil, the - // best element of Certificates will be used. - // - // Once a Certificate is returned it should not be modified. - GetCertificate func(*ClientHelloInfo) (*Certificate, error) - - // GetClientCertificate, if not nil, is called when a server requests a - // certificate from a client. If set, the contents of Certificates will - // be ignored. - // - // If GetClientCertificate returns an error, the handshake will be - // aborted and that error will be returned. Otherwise - // GetClientCertificate must return a non-nil Certificate. If - // Certificate.Certificate is empty then no certificate will be sent to - // the server. If this is unacceptable to the server then it may abort - // the handshake. - // - // GetClientCertificate may be called multiple times for the same - // connection if renegotiation occurs or if TLS 1.3 is in use. - // - // Once a Certificate is returned it should not be modified. - GetClientCertificate func(*CertificateRequestInfo) (*Certificate, error) - - // GetConfigForClient, if not nil, is called after a ClientHello is - // received from a client. It may return a non-nil Config in order to - // change the Config that will be used to handle this connection. If - // the returned Config is nil, the original Config will be used. The - // Config returned by this callback may not be subsequently modified. - // - // If GetConfigForClient is nil, the Config passed to Server() will be - // used for all connections. - // - // If SessionTicketKey was explicitly set on the returned Config, or if - // SetSessionTicketKeys was called on the returned Config, those keys will - // be used. Otherwise, the original Config keys will be used (and possibly - // rotated if they are automatically managed). - GetConfigForClient func(*ClientHelloInfo) (*Config, error) - - // VerifyPeerCertificate, if not nil, is called after normal - // certificate verification by either a TLS client or server. It - // receives the raw ASN.1 certificates provided by the peer and also - // any verified chains that normal processing found. If it returns a - // non-nil error, the handshake is aborted and that error results. - // - // If normal verification fails then the handshake will abort before - // considering this callback. If normal verification is disabled by - // setting InsecureSkipVerify, or (for a server) when ClientAuth is - // RequestClientCert or RequireAnyClientCert, then this callback will - // be considered but the verifiedChains argument will always be nil. - // - // verifiedChains and its contents should not be modified. - VerifyPeerCertificate func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error - - // VerifyConnection, if not nil, is called after normal certificate - // verification and after VerifyPeerCertificate by either a TLS client - // or server. If it returns a non-nil error, the handshake is aborted - // and that error results. - // - // If normal verification fails then the handshake will abort before - // considering this callback. This callback will run for all connections - // regardless of InsecureSkipVerify or ClientAuth settings. - VerifyConnection func(ConnectionState) error - - // RootCAs defines the set of root certificate authorities - // that clients use when verifying server certificates. - // If RootCAs is nil, TLS uses the host's root CA set. - RootCAs *x509.CertPool - - // NextProtos is a list of supported application level protocols, in - // order of preference. If both peers support ALPN, the selected - // protocol will be one from this list, and the connection will fail - // if there is no mutually supported protocol. If NextProtos is empty - // or the peer doesn't support ALPN, the connection will succeed and - // ConnectionState.NegotiatedProtocol will be empty. - NextProtos []string - - // ServerName is used to verify the hostname on the returned - // certificates unless InsecureSkipVerify is given. It is also included - // in the client's handshake to support virtual hosting unless it is - // an IP address. - ServerName string - - // ClientAuth determines the server's policy for - // TLS Client Authentication. The default is NoClientCert. - ClientAuth ClientAuthType - - // ClientCAs defines the set of root certificate authorities - // that servers use if required to verify a client certificate - // by the policy in ClientAuth. - ClientCAs *x509.CertPool - - // InsecureSkipVerify controls whether a client verifies the server's - // certificate chain and host name. If InsecureSkipVerify is true, crypto/tls - // accepts any certificate presented by the server and any host name in that - // certificate. In this mode, TLS is susceptible to machine-in-the-middle - // attacks unless custom verification is used. This should be used only for - // testing or in combination with VerifyConnection or VerifyPeerCertificate. - InsecureSkipVerify bool - - // CipherSuites is a list of enabled TLS 1.0–1.2 cipher suites. The order of - // the list is ignored. Note that TLS 1.3 ciphersuites are not configurable. - // - // If CipherSuites is nil, a safe default list is used. The default cipher - // suites might change over time. - CipherSuites []uint16 - - // PreferServerCipherSuites is a legacy field and has no effect. - // - // It used to control whether the server would follow the client's or the - // server's preference. Servers now select the best mutually supported - // cipher suite based on logic that takes into account inferred client - // hardware, server hardware, and security. - // - // Deprecated: PreferServerCipherSuites is ignored. - PreferServerCipherSuites bool - - // SessionTicketsDisabled may be set to true to disable session ticket and - // PSK (resumption) support. Note that on clients, session ticket support is - // also disabled if ClientSessionCache is nil. - SessionTicketsDisabled bool - - // SessionTicketKey is used by TLS servers to provide session resumption. - // See RFC 5077 and the PSK mode of RFC 8446. If zero, it will be filled - // with random data before the first server handshake. - // - // Deprecated: if this field is left at zero, session ticket keys will be - // automatically rotated every day and dropped after seven days. For - // customizing the rotation schedule or synchronizing servers that are - // terminating connections for the same host, use SetSessionTicketKeys. - SessionTicketKey [32]byte - - // ClientSessionCache is a cache of ClientSessionState entries for TLS - // session resumption. It is only used by clients. - ClientSessionCache ClientSessionCache - - // MinVersion contains the minimum TLS version that is acceptable. - // - // By default, TLS 1.2 is currently used as the minimum when acting as a - // client, and TLS 1.0 when acting as a server. TLS 1.0 is the minimum - // supported by this package, both as a client and as a server. - // - // The client-side default can temporarily be reverted to TLS 1.0 by - // including the value "x509sha1=1" in the GODEBUG environment variable. - // Note that this option will be removed in Go 1.19 (but it will still be - // possible to set this field to VersionTLS10 explicitly). - MinVersion uint16 - - // MaxVersion contains the maximum TLS version that is acceptable. - // - // By default, the maximum version supported by this package is used, - // which is currently TLS 1.3. - MaxVersion uint16 - - // CurvePreferences contains the elliptic curves that will be used in - // an ECDHE handshake, in preference order. If empty, the default will - // be used. The client will use the first preference as the type for - // its key share in TLS 1.3. This may change in the future. - CurvePreferences []CurveID - - // DynamicRecordSizingDisabled disables adaptive sizing of TLS records. - // When true, the largest possible TLS record size is always used. When - // false, the size of TLS records may be adjusted in an attempt to - // improve latency. - DynamicRecordSizingDisabled bool - - // Renegotiation controls what types of renegotiation are supported. - // The default, none, is correct for the vast majority of applications. - Renegotiation RenegotiationSupport - - // KeyLogWriter optionally specifies a destination for TLS master secrets - // in NSS key log format that can be used to allow external programs - // such as Wireshark to decrypt TLS connections. - // See https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format. - // Use of KeyLogWriter compromises security and should only be - // used for debugging. - KeyLogWriter io.Writer - - // mutex protects sessionTicketKeys and autoSessionTicketKeys. - mutex sync.RWMutex - // sessionTicketKeys contains zero or more ticket keys. If set, it means - // the keys were set with SessionTicketKey or SetSessionTicketKeys. The - // first key is used for new tickets and any subsequent keys can be used to - // decrypt old tickets. The slice contents are not protected by the mutex - // and are immutable. - sessionTicketKeys []ticketKey - // autoSessionTicketKeys is like sessionTicketKeys but is owned by the - // auto-rotation logic. See Config.ticketKeys. - autoSessionTicketKeys []ticketKey -} - -type ExtraConfig struct { - // If Enable0RTT is enabled, the client will be allowed to send early data when resuming a session. - // - // It has no meaning on the client. - Enable0RTT bool - - // GetAppDataForSessionTicket requests application data to be sent with a session ticket. - // - // It has no meaning on the client. - GetAppDataForSessionTicket func() []byte - - // The Accept0RTT callback is called when the client offers 0-RTT. - // The server then has to decide if it wants to accept or reject 0-RTT. - // It is only used for servers. - Accept0RTT func(appData []byte) bool - - // Is called when the client saves a session ticket to the session ticket. - // This gives the application the opportunity to save some data along with the ticket, - // which can be restored when the session ticket is used. - GetAppDataForSessionState func() []byte - - // Is called when the client uses a session ticket. - // Restores the application data that was saved earlier on GetAppDataForSessionTicket. - SetAppDataFromSessionState func([]byte) -} - -// Clone clones. -func (c *ExtraConfig) Clone() *ExtraConfig { - return &ExtraConfig{ - Enable0RTT: c.Enable0RTT, - GetAppDataForSessionTicket: c.GetAppDataForSessionTicket, - Accept0RTT: c.Accept0RTT, - GetAppDataForSessionState: c.GetAppDataForSessionState, - SetAppDataFromSessionState: c.SetAppDataFromSessionState, - } -} - -const ( - // ticketKeyNameLen is the number of bytes of identifier that is prepended to - // an encrypted session ticket in order to identify the key used to encrypt it. - ticketKeyNameLen = 16 - - // ticketKeyLifetime is how long a ticket key remains valid and can be used to - // resume a client connection. - ticketKeyLifetime = 7 * 24 * time.Hour // 7 days - - // ticketKeyRotation is how often the server should rotate the session ticket key - // that is used for new tickets. - ticketKeyRotation = 24 * time.Hour -) - -// ticketKey is the internal representation of a session ticket key. -type ticketKey struct { - // keyName is an opaque byte string that serves to identify the session - // ticket key. It's exposed as plaintext in every session ticket. - keyName [ticketKeyNameLen]byte - aesKey [16]byte - hmacKey [16]byte - // created is the time at which this ticket key was created. See Config.ticketKeys. - created time.Time -} - -// ticketKeyFromBytes converts from the external representation of a session -// ticket key to a ticketKey. Externally, session ticket keys are 32 random -// bytes and this function expands that into sufficient name and key material. -func (c *config) ticketKeyFromBytes(b [32]byte) (key ticketKey) { - hashed := sha512.Sum512(b[:]) - copy(key.keyName[:], hashed[:ticketKeyNameLen]) - copy(key.aesKey[:], hashed[ticketKeyNameLen:ticketKeyNameLen+16]) - copy(key.hmacKey[:], hashed[ticketKeyNameLen+16:ticketKeyNameLen+32]) - key.created = c.time() - return key -} - -// maxSessionTicketLifetime is the maximum allowed lifetime of a TLS 1.3 session -// ticket, and the lifetime we set for tickets we send. -const maxSessionTicketLifetime = 7 * 24 * time.Hour - -// Clone returns a shallow clone of c or nil if c is nil. It is safe to clone a Config that is -// being used concurrently by a TLS client or server. -func (c *config) Clone() *config { - if c == nil { - return nil - } - c.mutex.RLock() - defer c.mutex.RUnlock() - return &config{ - Rand: c.Rand, - Time: c.Time, - Certificates: c.Certificates, - NameToCertificate: c.NameToCertificate, - GetCertificate: c.GetCertificate, - GetClientCertificate: c.GetClientCertificate, - GetConfigForClient: c.GetConfigForClient, - VerifyPeerCertificate: c.VerifyPeerCertificate, - VerifyConnection: c.VerifyConnection, - RootCAs: c.RootCAs, - NextProtos: c.NextProtos, - ServerName: c.ServerName, - ClientAuth: c.ClientAuth, - ClientCAs: c.ClientCAs, - InsecureSkipVerify: c.InsecureSkipVerify, - CipherSuites: c.CipherSuites, - PreferServerCipherSuites: c.PreferServerCipherSuites, - SessionTicketsDisabled: c.SessionTicketsDisabled, - SessionTicketKey: c.SessionTicketKey, - ClientSessionCache: c.ClientSessionCache, - MinVersion: c.MinVersion, - MaxVersion: c.MaxVersion, - CurvePreferences: c.CurvePreferences, - DynamicRecordSizingDisabled: c.DynamicRecordSizingDisabled, - Renegotiation: c.Renegotiation, - KeyLogWriter: c.KeyLogWriter, - sessionTicketKeys: c.sessionTicketKeys, - autoSessionTicketKeys: c.autoSessionTicketKeys, - } -} - -// deprecatedSessionTicketKey is set as the prefix of SessionTicketKey if it was -// randomized for backwards compatibility but is not in use. -var deprecatedSessionTicketKey = []byte("DEPRECATED") - -// initLegacySessionTicketKeyRLocked ensures the legacy SessionTicketKey field is -// randomized if empty, and that sessionTicketKeys is populated from it otherwise. -func (c *config) initLegacySessionTicketKeyRLocked() { - // Don't write if SessionTicketKey is already defined as our deprecated string, - // or if it is defined by the user but sessionTicketKeys is already set. - if c.SessionTicketKey != [32]byte{} && - (bytes.HasPrefix(c.SessionTicketKey[:], deprecatedSessionTicketKey) || len(c.sessionTicketKeys) > 0) { - return - } - - // We need to write some data, so get an exclusive lock and re-check any conditions. - c.mutex.RUnlock() - defer c.mutex.RLock() - c.mutex.Lock() - defer c.mutex.Unlock() - if c.SessionTicketKey == [32]byte{} { - if _, err := io.ReadFull(c.rand(), c.SessionTicketKey[:]); err != nil { - panic(fmt.Sprintf("tls: unable to generate random session ticket key: %v", err)) - } - // Write the deprecated prefix at the beginning so we know we created - // it. This key with the DEPRECATED prefix isn't used as an actual - // session ticket key, and is only randomized in case the application - // reuses it for some reason. - copy(c.SessionTicketKey[:], deprecatedSessionTicketKey) - } else if !bytes.HasPrefix(c.SessionTicketKey[:], deprecatedSessionTicketKey) && len(c.sessionTicketKeys) == 0 { - c.sessionTicketKeys = []ticketKey{c.ticketKeyFromBytes(c.SessionTicketKey)} - } - -} - -// ticketKeys returns the ticketKeys for this connection. -// If configForClient has explicitly set keys, those will -// be returned. Otherwise, the keys on c will be used and -// may be rotated if auto-managed. -// During rotation, any expired session ticket keys are deleted from -// c.sessionTicketKeys. If the session ticket key that is currently -// encrypting tickets (ie. the first ticketKey in c.sessionTicketKeys) -// is not fresh, then a new session ticket key will be -// created and prepended to c.sessionTicketKeys. -func (c *config) ticketKeys(configForClient *config) []ticketKey { - // If the ConfigForClient callback returned a Config with explicitly set - // keys, use those, otherwise just use the original Config. - if configForClient != nil { - configForClient.mutex.RLock() - if configForClient.SessionTicketsDisabled { - return nil - } - configForClient.initLegacySessionTicketKeyRLocked() - if len(configForClient.sessionTicketKeys) != 0 { - ret := configForClient.sessionTicketKeys - configForClient.mutex.RUnlock() - return ret - } - configForClient.mutex.RUnlock() - } - - c.mutex.RLock() - defer c.mutex.RUnlock() - if c.SessionTicketsDisabled { - return nil - } - c.initLegacySessionTicketKeyRLocked() - if len(c.sessionTicketKeys) != 0 { - return c.sessionTicketKeys - } - // Fast path for the common case where the key is fresh enough. - if len(c.autoSessionTicketKeys) > 0 && c.time().Sub(c.autoSessionTicketKeys[0].created) < ticketKeyRotation { - return c.autoSessionTicketKeys - } - - // autoSessionTicketKeys are managed by auto-rotation. - c.mutex.RUnlock() - defer c.mutex.RLock() - c.mutex.Lock() - defer c.mutex.Unlock() - // Re-check the condition in case it changed since obtaining the new lock. - if len(c.autoSessionTicketKeys) == 0 || c.time().Sub(c.autoSessionTicketKeys[0].created) >= ticketKeyRotation { - var newKey [32]byte - if _, err := io.ReadFull(c.rand(), newKey[:]); err != nil { - panic(fmt.Sprintf("unable to generate random session ticket key: %v", err)) - } - valid := make([]ticketKey, 0, len(c.autoSessionTicketKeys)+1) - valid = append(valid, c.ticketKeyFromBytes(newKey)) - for _, k := range c.autoSessionTicketKeys { - // While rotating the current key, also remove any expired ones. - if c.time().Sub(k.created) < ticketKeyLifetime { - valid = append(valid, k) - } - } - c.autoSessionTicketKeys = valid - } - return c.autoSessionTicketKeys -} - -// SetSessionTicketKeys updates the session ticket keys for a server. -// -// The first key will be used when creating new tickets, while all keys can be -// used for decrypting tickets. It is safe to call this function while the -// server is running in order to rotate the session ticket keys. The function -// will panic if keys is empty. -// -// Calling this function will turn off automatic session ticket key rotation. -// -// If multiple servers are terminating connections for the same host they should -// all have the same session ticket keys. If the session ticket keys leaks, -// previously recorded and future TLS connections using those keys might be -// compromised. -func (c *config) SetSessionTicketKeys(keys [][32]byte) { - if len(keys) == 0 { - panic("tls: keys must have at least one key") - } - - newKeys := make([]ticketKey, len(keys)) - for i, bytes := range keys { - newKeys[i] = c.ticketKeyFromBytes(bytes) - } - - c.mutex.Lock() - c.sessionTicketKeys = newKeys - c.mutex.Unlock() -} - -func (c *config) rand() io.Reader { - r := c.Rand - if r == nil { - return rand.Reader - } - return r -} - -func (c *config) time() time.Time { - t := c.Time - if t == nil { - t = time.Now - } - return t() -} - -func (c *config) cipherSuites() []uint16 { - if needFIPS() { - return fipsCipherSuites(c) - } - if c.CipherSuites != nil { - return c.CipherSuites - } - return defaultCipherSuites -} - -var supportedVersions = []uint16{ - VersionTLS13, - VersionTLS12, - VersionTLS11, - VersionTLS10, -} - -// roleClient and roleServer are meant to call supportedVersions and parents -// with more readability at the callsite. -const roleClient = true -const roleServer = false - -func (c *config) supportedVersions(isClient bool) []uint16 { - versions := make([]uint16, 0, len(supportedVersions)) - for _, v := range supportedVersions { - if needFIPS() && (v < fipsMinVersion(c) || v > fipsMaxVersion(c)) { - continue - } - if (c == nil || c.MinVersion == 0) && - isClient && v < VersionTLS12 { - continue - } - if c != nil && c.MinVersion != 0 && v < c.MinVersion { - continue - } - if c != nil && c.MaxVersion != 0 && v > c.MaxVersion { - continue - } - versions = append(versions, v) - } - return versions -} - -func (c *config) maxSupportedVersion(isClient bool) uint16 { - supportedVersions := c.supportedVersions(isClient) - if len(supportedVersions) == 0 { - return 0 - } - return supportedVersions[0] -} - -// supportedVersionsFromMax returns a list of supported versions derived from a -// legacy maximum version value. Note that only versions supported by this -// library are returned. Any newer peer will use supportedVersions anyway. -func supportedVersionsFromMax(maxVersion uint16) []uint16 { - versions := make([]uint16, 0, len(supportedVersions)) - for _, v := range supportedVersions { - if v > maxVersion { - continue - } - versions = append(versions, v) - } - return versions -} - -var defaultCurvePreferences = []CurveID{X25519, CurveP256, CurveP384, CurveP521} - -func (c *config) curvePreferences() []CurveID { - if needFIPS() { - return fipsCurvePreferences(c) - } - if c == nil || len(c.CurvePreferences) == 0 { - return defaultCurvePreferences - } - return c.CurvePreferences -} - -func (c *config) supportsCurve(curve CurveID) bool { - for _, cc := range c.curvePreferences() { - if cc == curve { - return true - } - } - return false -} - -// mutualVersion returns the protocol version to use given the advertised -// versions of the peer. Priority is given to the peer preference order. -func (c *config) mutualVersion(isClient bool, peerVersions []uint16) (uint16, bool) { - supportedVersions := c.supportedVersions(isClient) - for _, peerVersion := range peerVersions { - for _, v := range supportedVersions { - if v == peerVersion { - return v, true - } - } - } - return 0, false -} - -var errNoCertificates = errors.New("tls: no certificates configured") - -// getCertificate returns the best certificate for the given ClientHelloInfo, -// defaulting to the first element of c.Certificates. -func (c *config) getCertificate(clientHello *ClientHelloInfo) (*Certificate, error) { - if c.GetCertificate != nil && - (len(c.Certificates) == 0 || len(clientHello.ServerName) > 0) { - cert, err := c.GetCertificate(clientHello) - if cert != nil || err != nil { - return cert, err - } - } - - if len(c.Certificates) == 0 { - return nil, errNoCertificates - } - - if len(c.Certificates) == 1 { - // There's only one choice, so no point doing any work. - return &c.Certificates[0], nil - } - - if c.NameToCertificate != nil { - name := strings.ToLower(clientHello.ServerName) - if cert, ok := c.NameToCertificate[name]; ok { - return cert, nil - } - if len(name) > 0 { - labels := strings.Split(name, ".") - labels[0] = "*" - wildcardName := strings.Join(labels, ".") - if cert, ok := c.NameToCertificate[wildcardName]; ok { - return cert, nil - } - } - } - - for _, cert := range c.Certificates { - if err := clientHello.SupportsCertificate(&cert); err == nil { - return &cert, nil - } - } - - // If nothing matches, return the first certificate. - return &c.Certificates[0], nil -} - -// SupportsCertificate returns nil if the provided certificate is supported by -// the client that sent the ClientHello. Otherwise, it returns an error -// describing the reason for the incompatibility. -// -// If this ClientHelloInfo was passed to a GetConfigForClient or GetCertificate -// callback, this method will take into account the associated Config. Note that -// if GetConfigForClient returns a different Config, the change can't be -// accounted for by this method. -// -// This function will call x509.ParseCertificate unless c.Leaf is set, which can -// incur a significant performance cost. -func (chi *clientHelloInfo) SupportsCertificate(c *Certificate) error { - // Note we don't currently support certificate_authorities nor - // signature_algorithms_cert, and don't check the algorithms of the - // signatures on the chain (which anyway are a SHOULD, see RFC 8446, - // Section 4.4.2.2). - - config := chi.config - if config == nil { - config = &Config{} - } - conf := fromConfig(config) - vers, ok := conf.mutualVersion(roleServer, chi.SupportedVersions) - if !ok { - return errors.New("no mutually supported protocol versions") - } - - // If the client specified the name they are trying to connect to, the - // certificate needs to be valid for it. - if chi.ServerName != "" { - x509Cert, err := leafCertificate(c) - if err != nil { - return fmt.Errorf("failed to parse certificate: %w", err) - } - if err := x509Cert.VerifyHostname(chi.ServerName); err != nil { - return fmt.Errorf("certificate is not valid for requested server name: %w", err) - } - } - - // supportsRSAFallback returns nil if the certificate and connection support - // the static RSA key exchange, and unsupported otherwise. The logic for - // supporting static RSA is completely disjoint from the logic for - // supporting signed key exchanges, so we just check it as a fallback. - supportsRSAFallback := func(unsupported error) error { - // TLS 1.3 dropped support for the static RSA key exchange. - if vers == VersionTLS13 { - return unsupported - } - // The static RSA key exchange works by decrypting a challenge with the - // RSA private key, not by signing, so check the PrivateKey implements - // crypto.Decrypter, like *rsa.PrivateKey does. - if priv, ok := c.PrivateKey.(crypto.Decrypter); ok { - if _, ok := priv.Public().(*rsa.PublicKey); !ok { - return unsupported - } - } else { - return unsupported - } - // Finally, there needs to be a mutual cipher suite that uses the static - // RSA key exchange instead of ECDHE. - rsaCipherSuite := selectCipherSuite(chi.CipherSuites, conf.cipherSuites(), func(c *cipherSuite) bool { - if c.flags&suiteECDHE != 0 { - return false - } - if vers < VersionTLS12 && c.flags&suiteTLS12 != 0 { - return false - } - return true - }) - if rsaCipherSuite == nil { - return unsupported - } - return nil - } - - // If the client sent the signature_algorithms extension, ensure it supports - // schemes we can use with this certificate and TLS version. - if len(chi.SignatureSchemes) > 0 { - if _, err := selectSignatureScheme(vers, c, chi.SignatureSchemes); err != nil { - return supportsRSAFallback(err) - } - } - - // In TLS 1.3 we are done because supported_groups is only relevant to the - // ECDHE computation, point format negotiation is removed, cipher suites are - // only relevant to the AEAD choice, and static RSA does not exist. - if vers == VersionTLS13 { - return nil - } - - // The only signed key exchange we support is ECDHE. - if !supportsECDHE(conf, chi.SupportedCurves, chi.SupportedPoints) { - return supportsRSAFallback(errors.New("client doesn't support ECDHE, can only use legacy RSA key exchange")) - } - - var ecdsaCipherSuite bool - if priv, ok := c.PrivateKey.(crypto.Signer); ok { - switch pub := priv.Public().(type) { - case *ecdsa.PublicKey: - var curve CurveID - switch pub.Curve { - case elliptic.P256(): - curve = CurveP256 - case elliptic.P384(): - curve = CurveP384 - case elliptic.P521(): - curve = CurveP521 - default: - return supportsRSAFallback(unsupportedCertificateError(c)) - } - var curveOk bool - for _, c := range chi.SupportedCurves { - if c == curve && conf.supportsCurve(c) { - curveOk = true - break - } - } - if !curveOk { - return errors.New("client doesn't support certificate curve") - } - ecdsaCipherSuite = true - case ed25519.PublicKey: - if vers < VersionTLS12 || len(chi.SignatureSchemes) == 0 { - return errors.New("connection doesn't support Ed25519") - } - ecdsaCipherSuite = true - case *rsa.PublicKey: - default: - return supportsRSAFallback(unsupportedCertificateError(c)) - } - } else { - return supportsRSAFallback(unsupportedCertificateError(c)) - } - - // Make sure that there is a mutually supported cipher suite that works with - // this certificate. Cipher suite selection will then apply the logic in - // reverse to pick it. See also serverHandshakeState.cipherSuiteOk. - cipherSuite := selectCipherSuite(chi.CipherSuites, conf.cipherSuites(), func(c *cipherSuite) bool { - if c.flags&suiteECDHE == 0 { - return false - } - if c.flags&suiteECSign != 0 { - if !ecdsaCipherSuite { - return false - } - } else { - if ecdsaCipherSuite { - return false - } - } - if vers < VersionTLS12 && c.flags&suiteTLS12 != 0 { - return false - } - return true - }) - if cipherSuite == nil { - return supportsRSAFallback(errors.New("client doesn't support any cipher suites compatible with the certificate")) - } - - return nil -} - -// BuildNameToCertificate parses c.Certificates and builds c.NameToCertificate -// from the CommonName and SubjectAlternateName fields of each of the leaf -// certificates. -// -// Deprecated: NameToCertificate only allows associating a single certificate -// with a given name. Leave that field nil to let the library select the first -// compatible chain from Certificates. -func (c *config) BuildNameToCertificate() { - c.NameToCertificate = make(map[string]*Certificate) - for i := range c.Certificates { - cert := &c.Certificates[i] - x509Cert, err := leafCertificate(cert) - if err != nil { - continue - } - // If SANs are *not* present, some clients will consider the certificate - // valid for the name in the Common Name. - if x509Cert.Subject.CommonName != "" && len(x509Cert.DNSNames) == 0 { - c.NameToCertificate[x509Cert.Subject.CommonName] = cert - } - for _, san := range x509Cert.DNSNames { - c.NameToCertificate[san] = cert - } - } -} - -const ( - keyLogLabelTLS12 = "CLIENT_RANDOM" - keyLogLabelClientHandshake = "CLIENT_HANDSHAKE_TRAFFIC_SECRET" - keyLogLabelServerHandshake = "SERVER_HANDSHAKE_TRAFFIC_SECRET" - keyLogLabelClientTraffic = "CLIENT_TRAFFIC_SECRET_0" - keyLogLabelServerTraffic = "SERVER_TRAFFIC_SECRET_0" -) - -func (c *config) writeKeyLog(label string, clientRandom, secret []byte) error { - if c.KeyLogWriter == nil { - return nil - } - - logLine := fmt.Appendf(nil, "%s %x %x\n", label, clientRandom, secret) - - writerMutex.Lock() - _, err := c.KeyLogWriter.Write(logLine) - writerMutex.Unlock() - - return err -} - -// writerMutex protects all KeyLogWriters globally. It is rarely enabled, -// and is only for debugging, so a global mutex saves space. -var writerMutex sync.Mutex - -// A Certificate is a chain of one or more certificates, leaf first. -type Certificate = tls.Certificate - -// leaf returns the parsed leaf certificate, either from c.Leaf or by parsing -// the corresponding c.Certificate[0]. -func leafCertificate(c *Certificate) (*x509.Certificate, error) { - if c.Leaf != nil { - return c.Leaf, nil - } - return x509.ParseCertificate(c.Certificate[0]) -} - -type handshakeMessage interface { - marshal() ([]byte, error) - unmarshal([]byte) bool -} - -// lruSessionCache is a ClientSessionCache implementation that uses an LRU -// caching strategy. -type lruSessionCache struct { - sync.Mutex - - m map[string]*list.Element - q *list.List - capacity int -} - -type lruSessionCacheEntry struct { - sessionKey string - state *ClientSessionState -} - -// NewLRUClientSessionCache returns a ClientSessionCache with the given -// capacity that uses an LRU strategy. If capacity is < 1, a default capacity -// is used instead. -func NewLRUClientSessionCache(capacity int) ClientSessionCache { - const defaultSessionCacheCapacity = 64 - - if capacity < 1 { - capacity = defaultSessionCacheCapacity - } - return &lruSessionCache{ - m: make(map[string]*list.Element), - q: list.New(), - capacity: capacity, - } -} - -// Put adds the provided (sessionKey, cs) pair to the cache. If cs is nil, the entry -// corresponding to sessionKey is removed from the cache instead. -func (c *lruSessionCache) Put(sessionKey string, cs *ClientSessionState) { - c.Lock() - defer c.Unlock() - - if elem, ok := c.m[sessionKey]; ok { - if cs == nil { - c.q.Remove(elem) - delete(c.m, sessionKey) - } else { - entry := elem.Value.(*lruSessionCacheEntry) - entry.state = cs - c.q.MoveToFront(elem) - } - return - } - - if c.q.Len() < c.capacity { - entry := &lruSessionCacheEntry{sessionKey, cs} - c.m[sessionKey] = c.q.PushFront(entry) - return - } - - elem := c.q.Back() - entry := elem.Value.(*lruSessionCacheEntry) - delete(c.m, entry.sessionKey) - entry.sessionKey = sessionKey - entry.state = cs - c.q.MoveToFront(elem) - c.m[sessionKey] = elem -} - -// Get returns the ClientSessionState value associated with a given key. It -// returns (nil, false) if no value is found. -func (c *lruSessionCache) Get(sessionKey string) (*ClientSessionState, bool) { - c.Lock() - defer c.Unlock() - - if elem, ok := c.m[sessionKey]; ok { - c.q.MoveToFront(elem) - return elem.Value.(*lruSessionCacheEntry).state, true - } - return nil, false -} - -var emptyConfig Config - -func defaultConfig() *Config { - return &emptyConfig -} - -func unexpectedMessageError(wanted, got any) error { - return fmt.Errorf("tls: received unexpected handshake message of type %T when waiting for %T", got, wanted) -} - -func isSupportedSignatureAlgorithm(sigAlg SignatureScheme, supportedSignatureAlgorithms []SignatureScheme) bool { - for _, s := range supportedSignatureAlgorithms { - if s == sigAlg { - return true - } - } - return false -} - -// CertificateVerificationError is returned when certificate verification fails during the handshake. -type CertificateVerificationError = tls.CertificateVerificationError diff --git a/vendor/github.com/quic-go/qtls-go1-20/conn.go b/vendor/github.com/quic-go/qtls-go1-20/conn.go deleted file mode 100644 index b7ebdb0a7..000000000 --- a/vendor/github.com/quic-go/qtls-go1-20/conn.go +++ /dev/null @@ -1,1643 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// TLS low level connection and record layer - -package qtls - -import ( - "bytes" - "context" - "crypto/cipher" - "crypto/subtle" - "crypto/x509" - "errors" - "fmt" - "hash" - "io" - "net" - "sync" - "sync/atomic" - "time" -) - -// A Conn represents a secured connection. -// It implements the net.Conn interface. -type Conn struct { - // constant - conn net.Conn - isClient bool - handshakeFn func(context.Context) error // (*Conn).clientHandshake or serverHandshake - quic *quicState // nil for non-QUIC connections - - // isHandshakeComplete is true if the connection is currently transferring - // application data (i.e. is not currently processing a handshake). - // isHandshakeComplete is true implies handshakeErr == nil. - isHandshakeComplete atomic.Bool - // constant after handshake; protected by handshakeMutex - handshakeMutex sync.Mutex - handshakeErr error // error resulting from handshake - vers uint16 // TLS version - haveVers bool // version has been negotiated - config *config // configuration passed to constructor - extraConfig *ExtraConfig - // handshakes counts the number of handshakes performed on the - // connection so far. If renegotiation is disabled then this is either - // zero or one. - handshakes int - didResume bool // whether this connection was a session resumption - cipherSuite uint16 - ocspResponse []byte // stapled OCSP response - scts [][]byte // signed certificate timestamps from server - peerCertificates []*x509.Certificate - // activeCertHandles contains the cache handles to certificates in - // peerCertificates that are used to track active references. - activeCertHandles []*activeCert - // verifiedChains contains the certificate chains that we built, as - // opposed to the ones presented by the server. - verifiedChains [][]*x509.Certificate - // serverName contains the server name indicated by the client, if any. - serverName string - // secureRenegotiation is true if the server echoed the secure - // renegotiation extension. (This is meaningless as a server because - // renegotiation is not supported in that case.) - secureRenegotiation bool - // ekm is a closure for exporting keying material. - ekm func(label string, context []byte, length int) ([]byte, error) - // resumptionSecret is the resumption_master_secret for handling - // or sending NewSessionTicket messages. - resumptionSecret []byte - - // ticketKeys is the set of active session ticket keys for this - // connection. The first one is used to encrypt new tickets and - // all are tried to decrypt tickets. - ticketKeys []ticketKey - - // clientFinishedIsFirst is true if the client sent the first Finished - // message during the most recent handshake. This is recorded because - // the first transmitted Finished message is the tls-unique - // channel-binding value. - clientFinishedIsFirst bool - - // closeNotifyErr is any error from sending the alertCloseNotify record. - closeNotifyErr error - // closeNotifySent is true if the Conn attempted to send an - // alertCloseNotify record. - closeNotifySent bool - - // clientFinished and serverFinished contain the Finished message sent - // by the client or server in the most recent handshake. This is - // retained to support the renegotiation extension and tls-unique - // channel-binding. - clientFinished [12]byte - serverFinished [12]byte - - // clientProtocol is the negotiated ALPN protocol. - clientProtocol string - - // input/output - in, out halfConn - rawInput bytes.Buffer // raw input, starting with a record header - input bytes.Reader // application data waiting to be read, from rawInput.Next - hand bytes.Buffer // handshake data waiting to be read - buffering bool // whether records are buffered in sendBuf - sendBuf []byte // a buffer of records waiting to be sent - - // bytesSent counts the bytes of application data sent. - // packetsSent counts packets. - bytesSent int64 - packetsSent int64 - - // retryCount counts the number of consecutive non-advancing records - // received by Conn.readRecord. That is, records that neither advance the - // handshake, nor deliver application data. Protected by in.Mutex. - retryCount int - - // activeCall indicates whether Close has been call in the low bit. - // the rest of the bits are the number of goroutines in Conn.Write. - activeCall atomic.Int32 - - tmp [16]byte -} - -// Access to net.Conn methods. -// Cannot just embed net.Conn because that would -// export the struct field too. - -// LocalAddr returns the local network address. -func (c *Conn) LocalAddr() net.Addr { - return c.conn.LocalAddr() -} - -// RemoteAddr returns the remote network address. -func (c *Conn) RemoteAddr() net.Addr { - return c.conn.RemoteAddr() -} - -// SetDeadline sets the read and write deadlines associated with the connection. -// A zero value for t means Read and Write will not time out. -// After a Write has timed out, the TLS state is corrupt and all future writes will return the same error. -func (c *Conn) SetDeadline(t time.Time) error { - return c.conn.SetDeadline(t) -} - -// SetReadDeadline sets the read deadline on the underlying connection. -// A zero value for t means Read will not time out. -func (c *Conn) SetReadDeadline(t time.Time) error { - return c.conn.SetReadDeadline(t) -} - -// SetWriteDeadline sets the write deadline on the underlying connection. -// A zero value for t means Write will not time out. -// After a Write has timed out, the TLS state is corrupt and all future writes will return the same error. -func (c *Conn) SetWriteDeadline(t time.Time) error { - return c.conn.SetWriteDeadline(t) -} - -// NetConn returns the underlying connection that is wrapped by c. -// Note that writing to or reading from this connection directly will corrupt the -// TLS session. -func (c *Conn) NetConn() net.Conn { - return c.conn -} - -// A halfConn represents one direction of the record layer -// connection, either sending or receiving. -type halfConn struct { - sync.Mutex - - err error // first permanent error - version uint16 // protocol version - cipher any // cipher algorithm - mac hash.Hash - seq [8]byte // 64-bit sequence number - - scratchBuf [13]byte // to avoid allocs; interface method args escape - - nextCipher any // next encryption state - nextMac hash.Hash // next MAC algorithm - - level QUICEncryptionLevel // current QUIC encryption level - trafficSecret []byte // current TLS 1.3 traffic secret -} - -type permanentError struct { - err net.Error -} - -func (e *permanentError) Error() string { return e.err.Error() } -func (e *permanentError) Unwrap() error { return e.err } -func (e *permanentError) Timeout() bool { return e.err.Timeout() } -func (e *permanentError) Temporary() bool { return false } - -func (hc *halfConn) setErrorLocked(err error) error { - if e, ok := err.(net.Error); ok { - hc.err = &permanentError{err: e} - } else { - hc.err = err - } - return hc.err -} - -// prepareCipherSpec sets the encryption and MAC states -// that a subsequent changeCipherSpec will use. -func (hc *halfConn) prepareCipherSpec(version uint16, cipher any, mac hash.Hash) { - hc.version = version - hc.nextCipher = cipher - hc.nextMac = mac -} - -// changeCipherSpec changes the encryption and MAC states -// to the ones previously passed to prepareCipherSpec. -func (hc *halfConn) changeCipherSpec() error { - if hc.nextCipher == nil || hc.version == VersionTLS13 { - return alertInternalError - } - hc.cipher = hc.nextCipher - hc.mac = hc.nextMac - hc.nextCipher = nil - hc.nextMac = nil - for i := range hc.seq { - hc.seq[i] = 0 - } - return nil -} - -func (hc *halfConn) setTrafficSecret(suite *cipherSuiteTLS13, level QUICEncryptionLevel, secret []byte) { - hc.trafficSecret = secret - hc.level = level - key, iv := suite.trafficKey(secret) - hc.cipher = suite.aead(key, iv) - for i := range hc.seq { - hc.seq[i] = 0 - } -} - -// incSeq increments the sequence number. -func (hc *halfConn) incSeq() { - for i := 7; i >= 0; i-- { - hc.seq[i]++ - if hc.seq[i] != 0 { - return - } - } - - // Not allowed to let sequence number wrap. - // Instead, must renegotiate before it does. - // Not likely enough to bother. - panic("TLS: sequence number wraparound") -} - -// explicitNonceLen returns the number of bytes of explicit nonce or IV included -// in each record. Explicit nonces are present only in CBC modes after TLS 1.0 -// and in certain AEAD modes in TLS 1.2. -func (hc *halfConn) explicitNonceLen() int { - if hc.cipher == nil { - return 0 - } - - switch c := hc.cipher.(type) { - case cipher.Stream: - return 0 - case aead: - return c.explicitNonceLen() - case cbcMode: - // TLS 1.1 introduced a per-record explicit IV to fix the BEAST attack. - if hc.version >= VersionTLS11 { - return c.BlockSize() - } - return 0 - default: - panic("unknown cipher type") - } -} - -// extractPadding returns, in constant time, the length of the padding to remove -// from the end of payload. It also returns a byte which is equal to 255 if the -// padding was valid and 0 otherwise. See RFC 2246, Section 6.2.3.2. -func extractPadding(payload []byte) (toRemove int, good byte) { - if len(payload) < 1 { - return 0, 0 - } - - paddingLen := payload[len(payload)-1] - t := uint(len(payload)-1) - uint(paddingLen) - // if len(payload) >= (paddingLen - 1) then the MSB of t is zero - good = byte(int32(^t) >> 31) - - // The maximum possible padding length plus the actual length field - toCheck := 256 - // The length of the padded data is public, so we can use an if here - if toCheck > len(payload) { - toCheck = len(payload) - } - - for i := 0; i < toCheck; i++ { - t := uint(paddingLen) - uint(i) - // if i <= paddingLen then the MSB of t is zero - mask := byte(int32(^t) >> 31) - b := payload[len(payload)-1-i] - good &^= mask&paddingLen ^ mask&b - } - - // We AND together the bits of good and replicate the result across - // all the bits. - good &= good << 4 - good &= good << 2 - good &= good << 1 - good = uint8(int8(good) >> 7) - - // Zero the padding length on error. This ensures any unchecked bytes - // are included in the MAC. Otherwise, an attacker that could - // distinguish MAC failures from padding failures could mount an attack - // similar to POODLE in SSL 3.0: given a good ciphertext that uses a - // full block's worth of padding, replace the final block with another - // block. If the MAC check passed but the padding check failed, the - // last byte of that block decrypted to the block size. - // - // See also macAndPaddingGood logic below. - paddingLen &= good - - toRemove = int(paddingLen) + 1 - return -} - -func roundUp(a, b int) int { - return a + (b-a%b)%b -} - -// cbcMode is an interface for block ciphers using cipher block chaining. -type cbcMode interface { - cipher.BlockMode - SetIV([]byte) -} - -// decrypt authenticates and decrypts the record if protection is active at -// this stage. The returned plaintext might overlap with the input. -func (hc *halfConn) decrypt(record []byte) ([]byte, recordType, error) { - var plaintext []byte - typ := recordType(record[0]) - payload := record[recordHeaderLen:] - - // In TLS 1.3, change_cipher_spec messages are to be ignored without being - // decrypted. See RFC 8446, Appendix D.4. - if hc.version == VersionTLS13 && typ == recordTypeChangeCipherSpec { - return payload, typ, nil - } - - paddingGood := byte(255) - paddingLen := 0 - - explicitNonceLen := hc.explicitNonceLen() - - if hc.cipher != nil { - switch c := hc.cipher.(type) { - case cipher.Stream: - c.XORKeyStream(payload, payload) - case aead: - if len(payload) < explicitNonceLen { - return nil, 0, alertBadRecordMAC - } - nonce := payload[:explicitNonceLen] - if len(nonce) == 0 { - nonce = hc.seq[:] - } - payload = payload[explicitNonceLen:] - - var additionalData []byte - if hc.version == VersionTLS13 { - additionalData = record[:recordHeaderLen] - } else { - additionalData = append(hc.scratchBuf[:0], hc.seq[:]...) - additionalData = append(additionalData, record[:3]...) - n := len(payload) - c.Overhead() - additionalData = append(additionalData, byte(n>>8), byte(n)) - } - - var err error - plaintext, err = c.Open(payload[:0], nonce, payload, additionalData) - if err != nil { - return nil, 0, alertBadRecordMAC - } - case cbcMode: - blockSize := c.BlockSize() - minPayload := explicitNonceLen + roundUp(hc.mac.Size()+1, blockSize) - if len(payload)%blockSize != 0 || len(payload) < minPayload { - return nil, 0, alertBadRecordMAC - } - - if explicitNonceLen > 0 { - c.SetIV(payload[:explicitNonceLen]) - payload = payload[explicitNonceLen:] - } - c.CryptBlocks(payload, payload) - - // In a limited attempt to protect against CBC padding oracles like - // Lucky13, the data past paddingLen (which is secret) is passed to - // the MAC function as extra data, to be fed into the HMAC after - // computing the digest. This makes the MAC roughly constant time as - // long as the digest computation is constant time and does not - // affect the subsequent write, modulo cache effects. - paddingLen, paddingGood = extractPadding(payload) - default: - panic("unknown cipher type") - } - - if hc.version == VersionTLS13 { - if typ != recordTypeApplicationData { - return nil, 0, alertUnexpectedMessage - } - if len(plaintext) > maxPlaintext+1 { - return nil, 0, alertRecordOverflow - } - // Remove padding and find the ContentType scanning from the end. - for i := len(plaintext) - 1; i >= 0; i-- { - if plaintext[i] != 0 { - typ = recordType(plaintext[i]) - plaintext = plaintext[:i] - break - } - if i == 0 { - return nil, 0, alertUnexpectedMessage - } - } - } - } else { - plaintext = payload - } - - if hc.mac != nil { - macSize := hc.mac.Size() - if len(payload) < macSize { - return nil, 0, alertBadRecordMAC - } - - n := len(payload) - macSize - paddingLen - n = subtle.ConstantTimeSelect(int(uint32(n)>>31), 0, n) // if n < 0 { n = 0 } - record[3] = byte(n >> 8) - record[4] = byte(n) - remoteMAC := payload[n : n+macSize] - localMAC := tls10MAC(hc.mac, hc.scratchBuf[:0], hc.seq[:], record[:recordHeaderLen], payload[:n], payload[n+macSize:]) - - // This is equivalent to checking the MACs and paddingGood - // separately, but in constant-time to prevent distinguishing - // padding failures from MAC failures. Depending on what value - // of paddingLen was returned on bad padding, distinguishing - // bad MAC from bad padding can lead to an attack. - // - // See also the logic at the end of extractPadding. - macAndPaddingGood := subtle.ConstantTimeCompare(localMAC, remoteMAC) & int(paddingGood) - if macAndPaddingGood != 1 { - return nil, 0, alertBadRecordMAC - } - - plaintext = payload[:n] - } - - hc.incSeq() - return plaintext, typ, nil -} - -// sliceForAppend extends the input slice by n bytes. head is the full extended -// slice, while tail is the appended part. If the original slice has sufficient -// capacity no allocation is performed. -func sliceForAppend(in []byte, n int) (head, tail []byte) { - if total := len(in) + n; cap(in) >= total { - head = in[:total] - } else { - head = make([]byte, total) - copy(head, in) - } - tail = head[len(in):] - return -} - -// encrypt encrypts payload, adding the appropriate nonce and/or MAC, and -// appends it to record, which must already contain the record header. -func (hc *halfConn) encrypt(record, payload []byte, rand io.Reader) ([]byte, error) { - if hc.cipher == nil { - return append(record, payload...), nil - } - - var explicitNonce []byte - if explicitNonceLen := hc.explicitNonceLen(); explicitNonceLen > 0 { - record, explicitNonce = sliceForAppend(record, explicitNonceLen) - if _, isCBC := hc.cipher.(cbcMode); !isCBC && explicitNonceLen < 16 { - // The AES-GCM construction in TLS has an explicit nonce so that the - // nonce can be random. However, the nonce is only 8 bytes which is - // too small for a secure, random nonce. Therefore we use the - // sequence number as the nonce. The 3DES-CBC construction also has - // an 8 bytes nonce but its nonces must be unpredictable (see RFC - // 5246, Appendix F.3), forcing us to use randomness. That's not - // 3DES' biggest problem anyway because the birthday bound on block - // collision is reached first due to its similarly small block size - // (see the Sweet32 attack). - copy(explicitNonce, hc.seq[:]) - } else { - if _, err := io.ReadFull(rand, explicitNonce); err != nil { - return nil, err - } - } - } - - var dst []byte - switch c := hc.cipher.(type) { - case cipher.Stream: - mac := tls10MAC(hc.mac, hc.scratchBuf[:0], hc.seq[:], record[:recordHeaderLen], payload, nil) - record, dst = sliceForAppend(record, len(payload)+len(mac)) - c.XORKeyStream(dst[:len(payload)], payload) - c.XORKeyStream(dst[len(payload):], mac) - case aead: - nonce := explicitNonce - if len(nonce) == 0 { - nonce = hc.seq[:] - } - - if hc.version == VersionTLS13 { - record = append(record, payload...) - - // Encrypt the actual ContentType and replace the plaintext one. - record = append(record, record[0]) - record[0] = byte(recordTypeApplicationData) - - n := len(payload) + 1 + c.Overhead() - record[3] = byte(n >> 8) - record[4] = byte(n) - - record = c.Seal(record[:recordHeaderLen], - nonce, record[recordHeaderLen:], record[:recordHeaderLen]) - } else { - additionalData := append(hc.scratchBuf[:0], hc.seq[:]...) - additionalData = append(additionalData, record[:recordHeaderLen]...) - record = c.Seal(record, nonce, payload, additionalData) - } - case cbcMode: - mac := tls10MAC(hc.mac, hc.scratchBuf[:0], hc.seq[:], record[:recordHeaderLen], payload, nil) - blockSize := c.BlockSize() - plaintextLen := len(payload) + len(mac) - paddingLen := blockSize - plaintextLen%blockSize - record, dst = sliceForAppend(record, plaintextLen+paddingLen) - copy(dst, payload) - copy(dst[len(payload):], mac) - for i := plaintextLen; i < len(dst); i++ { - dst[i] = byte(paddingLen - 1) - } - if len(explicitNonce) > 0 { - c.SetIV(explicitNonce) - } - c.CryptBlocks(dst, dst) - default: - panic("unknown cipher type") - } - - // Update length to include nonce, MAC and any block padding needed. - n := len(record) - recordHeaderLen - record[3] = byte(n >> 8) - record[4] = byte(n) - hc.incSeq() - - return record, nil -} - -// RecordHeaderError is returned when a TLS record header is invalid. -type RecordHeaderError struct { - // Msg contains a human readable string that describes the error. - Msg string - // RecordHeader contains the five bytes of TLS record header that - // triggered the error. - RecordHeader [5]byte - // Conn provides the underlying net.Conn in the case that a client - // sent an initial handshake that didn't look like TLS. - // It is nil if there's already been a handshake or a TLS alert has - // been written to the connection. - Conn net.Conn -} - -func (e RecordHeaderError) Error() string { return "tls: " + e.Msg } - -func (c *Conn) newRecordHeaderError(conn net.Conn, msg string) (err RecordHeaderError) { - err.Msg = msg - err.Conn = conn - copy(err.RecordHeader[:], c.rawInput.Bytes()) - return err -} - -func (c *Conn) readRecord() error { - return c.readRecordOrCCS(false) -} - -func (c *Conn) readChangeCipherSpec() error { - return c.readRecordOrCCS(true) -} - -// readRecordOrCCS reads one or more TLS records from the connection and -// updates the record layer state. Some invariants: -// - c.in must be locked -// - c.input must be empty -// -// During the handshake one and only one of the following will happen: -// - c.hand grows -// - c.in.changeCipherSpec is called -// - an error is returned -// -// After the handshake one and only one of the following will happen: -// - c.hand grows -// - c.input is set -// - an error is returned -func (c *Conn) readRecordOrCCS(expectChangeCipherSpec bool) error { - if c.in.err != nil { - return c.in.err - } - handshakeComplete := c.isHandshakeComplete.Load() - - // This function modifies c.rawInput, which owns the c.input memory. - if c.input.Len() != 0 { - return c.in.setErrorLocked(errors.New("tls: internal error: attempted to read record with pending application data")) - } - c.input.Reset(nil) - - if c.quic != nil { - return c.in.setErrorLocked(errors.New("tls: internal error: attempted to read record with QUIC transport")) - } - - // Read header, payload. - if err := c.readFromUntil(c.conn, recordHeaderLen); err != nil { - // RFC 8446, Section 6.1 suggests that EOF without an alertCloseNotify - // is an error, but popular web sites seem to do this, so we accept it - // if and only if at the record boundary. - if err == io.ErrUnexpectedEOF && c.rawInput.Len() == 0 { - err = io.EOF - } - if e, ok := err.(net.Error); !ok || !e.Temporary() { - c.in.setErrorLocked(err) - } - return err - } - hdr := c.rawInput.Bytes()[:recordHeaderLen] - typ := recordType(hdr[0]) - - // No valid TLS record has a type of 0x80, however SSLv2 handshakes - // start with a uint16 length where the MSB is set and the first record - // is always < 256 bytes long. Therefore typ == 0x80 strongly suggests - // an SSLv2 client. - if !handshakeComplete && typ == 0x80 { - c.sendAlert(alertProtocolVersion) - return c.in.setErrorLocked(c.newRecordHeaderError(nil, "unsupported SSLv2 handshake received")) - } - - vers := uint16(hdr[1])<<8 | uint16(hdr[2]) - n := int(hdr[3])<<8 | int(hdr[4]) - if c.haveVers && c.vers != VersionTLS13 && vers != c.vers { - c.sendAlert(alertProtocolVersion) - msg := fmt.Sprintf("received record with version %x when expecting version %x", vers, c.vers) - return c.in.setErrorLocked(c.newRecordHeaderError(nil, msg)) - } - if !c.haveVers { - // First message, be extra suspicious: this might not be a TLS - // client. Bail out before reading a full 'body', if possible. - // The current max version is 3.3 so if the version is >= 16.0, - // it's probably not real. - if (typ != recordTypeAlert && typ != recordTypeHandshake) || vers >= 0x1000 { - return c.in.setErrorLocked(c.newRecordHeaderError(c.conn, "first record does not look like a TLS handshake")) - } - } - if c.vers == VersionTLS13 && n > maxCiphertextTLS13 || n > maxCiphertext { - c.sendAlert(alertRecordOverflow) - msg := fmt.Sprintf("oversized record received with length %d", n) - return c.in.setErrorLocked(c.newRecordHeaderError(nil, msg)) - } - if err := c.readFromUntil(c.conn, recordHeaderLen+n); err != nil { - if e, ok := err.(net.Error); !ok || !e.Temporary() { - c.in.setErrorLocked(err) - } - return err - } - - // Process message. - record := c.rawInput.Next(recordHeaderLen + n) - data, typ, err := c.in.decrypt(record) - if err != nil { - return c.in.setErrorLocked(c.sendAlert(err.(alert))) - } - if len(data) > maxPlaintext { - return c.in.setErrorLocked(c.sendAlert(alertRecordOverflow)) - } - - // Application Data messages are always protected. - if c.in.cipher == nil && typ == recordTypeApplicationData { - return c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage)) - } - - if typ != recordTypeAlert && typ != recordTypeChangeCipherSpec && len(data) > 0 { - // This is a state-advancing message: reset the retry count. - c.retryCount = 0 - } - - // Handshake messages MUST NOT be interleaved with other record types in TLS 1.3. - if c.vers == VersionTLS13 && typ != recordTypeHandshake && c.hand.Len() > 0 { - return c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage)) - } - - switch typ { - default: - return c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage)) - - case recordTypeAlert: - if c.quic != nil { - return c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage)) - } - if len(data) != 2 { - return c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage)) - } - if alert(data[1]) == alertCloseNotify { - return c.in.setErrorLocked(io.EOF) - } - if c.vers == VersionTLS13 { - return c.in.setErrorLocked(&net.OpError{Op: "remote error", Err: alert(data[1])}) - } - switch data[0] { - case alertLevelWarning: - // Drop the record on the floor and retry. - return c.retryReadRecord(expectChangeCipherSpec) - case alertLevelError: - return c.in.setErrorLocked(&net.OpError{Op: "remote error", Err: alert(data[1])}) - default: - return c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage)) - } - - case recordTypeChangeCipherSpec: - if len(data) != 1 || data[0] != 1 { - return c.in.setErrorLocked(c.sendAlert(alertDecodeError)) - } - // Handshake messages are not allowed to fragment across the CCS. - if c.hand.Len() > 0 { - return c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage)) - } - // In TLS 1.3, change_cipher_spec records are ignored until the - // Finished. See RFC 8446, Appendix D.4. Note that according to Section - // 5, a server can send a ChangeCipherSpec before its ServerHello, when - // c.vers is still unset. That's not useful though and suspicious if the - // server then selects a lower protocol version, so don't allow that. - if c.vers == VersionTLS13 { - return c.retryReadRecord(expectChangeCipherSpec) - } - if !expectChangeCipherSpec { - return c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage)) - } - if err := c.in.changeCipherSpec(); err != nil { - return c.in.setErrorLocked(c.sendAlert(err.(alert))) - } - - case recordTypeApplicationData: - if !handshakeComplete || expectChangeCipherSpec { - return c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage)) - } - // Some OpenSSL servers send empty records in order to randomize the - // CBC IV. Ignore a limited number of empty records. - if len(data) == 0 { - return c.retryReadRecord(expectChangeCipherSpec) - } - // Note that data is owned by c.rawInput, following the Next call above, - // to avoid copying the plaintext. This is safe because c.rawInput is - // not read from or written to until c.input is drained. - c.input.Reset(data) - - case recordTypeHandshake: - if len(data) == 0 || expectChangeCipherSpec { - return c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage)) - } - c.hand.Write(data) - } - - return nil -} - -// retryReadRecord recurs into readRecordOrCCS to drop a non-advancing record, like -// a warning alert, empty application_data, or a change_cipher_spec in TLS 1.3. -func (c *Conn) retryReadRecord(expectChangeCipherSpec bool) error { - c.retryCount++ - if c.retryCount > maxUselessRecords { - c.sendAlert(alertUnexpectedMessage) - return c.in.setErrorLocked(errors.New("tls: too many ignored records")) - } - return c.readRecordOrCCS(expectChangeCipherSpec) -} - -// atLeastReader reads from R, stopping with EOF once at least N bytes have been -// read. It is different from an io.LimitedReader in that it doesn't cut short -// the last Read call, and in that it considers an early EOF an error. -type atLeastReader struct { - R io.Reader - N int64 -} - -func (r *atLeastReader) Read(p []byte) (int, error) { - if r.N <= 0 { - return 0, io.EOF - } - n, err := r.R.Read(p) - r.N -= int64(n) // won't underflow unless len(p) >= n > 9223372036854775809 - if r.N > 0 && err == io.EOF { - return n, io.ErrUnexpectedEOF - } - if r.N <= 0 && err == nil { - return n, io.EOF - } - return n, err -} - -// readFromUntil reads from r into c.rawInput until c.rawInput contains -// at least n bytes or else returns an error. -func (c *Conn) readFromUntil(r io.Reader, n int) error { - if c.rawInput.Len() >= n { - return nil - } - needs := n - c.rawInput.Len() - // There might be extra input waiting on the wire. Make a best effort - // attempt to fetch it so that it can be used in (*Conn).Read to - // "predict" closeNotify alerts. - c.rawInput.Grow(needs + bytes.MinRead) - _, err := c.rawInput.ReadFrom(&atLeastReader{r, int64(needs)}) - return err -} - -// sendAlert sends a TLS alert message. -func (c *Conn) sendAlertLocked(err alert) error { - if c.quic != nil { - return c.out.setErrorLocked(&net.OpError{Op: "local error", Err: err}) - } - switch err { - case alertNoRenegotiation, alertCloseNotify: - c.tmp[0] = alertLevelWarning - default: - c.tmp[0] = alertLevelError - } - c.tmp[1] = byte(err) - - _, writeErr := c.writeRecordLocked(recordTypeAlert, c.tmp[0:2]) - if err == alertCloseNotify { - // closeNotify is a special case in that it isn't an error. - return writeErr - } - - return c.out.setErrorLocked(&net.OpError{Op: "local error", Err: err}) -} - -// sendAlert sends a TLS alert message. -func (c *Conn) sendAlert(err alert) error { - c.out.Lock() - defer c.out.Unlock() - return c.sendAlertLocked(err) -} - -const ( - // tcpMSSEstimate is a conservative estimate of the TCP maximum segment - // size (MSS). A constant is used, rather than querying the kernel for - // the actual MSS, to avoid complexity. The value here is the IPv6 - // minimum MTU (1280 bytes) minus the overhead of an IPv6 header (40 - // bytes) and a TCP header with timestamps (32 bytes). - tcpMSSEstimate = 1208 - - // recordSizeBoostThreshold is the number of bytes of application data - // sent after which the TLS record size will be increased to the - // maximum. - recordSizeBoostThreshold = 128 * 1024 -) - -// maxPayloadSizeForWrite returns the maximum TLS payload size to use for the -// next application data record. There is the following trade-off: -// -// - For latency-sensitive applications, such as web browsing, each TLS -// record should fit in one TCP segment. -// - For throughput-sensitive applications, such as large file transfers, -// larger TLS records better amortize framing and encryption overheads. -// -// A simple heuristic that works well in practice is to use small records for -// the first 1MB of data, then use larger records for subsequent data, and -// reset back to smaller records after the connection becomes idle. See "High -// Performance Web Networking", Chapter 4, or: -// https://www.igvita.com/2013/10/24/optimizing-tls-record-size-and-buffering-latency/ -// -// In the interests of simplicity and determinism, this code does not attempt -// to reset the record size once the connection is idle, however. -func (c *Conn) maxPayloadSizeForWrite(typ recordType) int { - if c.config.DynamicRecordSizingDisabled || typ != recordTypeApplicationData { - return maxPlaintext - } - - if c.bytesSent >= recordSizeBoostThreshold { - return maxPlaintext - } - - // Subtract TLS overheads to get the maximum payload size. - payloadBytes := tcpMSSEstimate - recordHeaderLen - c.out.explicitNonceLen() - if c.out.cipher != nil { - switch ciph := c.out.cipher.(type) { - case cipher.Stream: - payloadBytes -= c.out.mac.Size() - case cipher.AEAD: - payloadBytes -= ciph.Overhead() - case cbcMode: - blockSize := ciph.BlockSize() - // The payload must fit in a multiple of blockSize, with - // room for at least one padding byte. - payloadBytes = (payloadBytes & ^(blockSize - 1)) - 1 - // The MAC is appended before padding so affects the - // payload size directly. - payloadBytes -= c.out.mac.Size() - default: - panic("unknown cipher type") - } - } - if c.vers == VersionTLS13 { - payloadBytes-- // encrypted ContentType - } - - // Allow packet growth in arithmetic progression up to max. - pkt := c.packetsSent - c.packetsSent++ - if pkt > 1000 { - return maxPlaintext // avoid overflow in multiply below - } - - n := payloadBytes * int(pkt+1) - if n > maxPlaintext { - n = maxPlaintext - } - return n -} - -func (c *Conn) write(data []byte) (int, error) { - if c.buffering { - c.sendBuf = append(c.sendBuf, data...) - return len(data), nil - } - - n, err := c.conn.Write(data) - c.bytesSent += int64(n) - return n, err -} - -func (c *Conn) flush() (int, error) { - if len(c.sendBuf) == 0 { - return 0, nil - } - - n, err := c.conn.Write(c.sendBuf) - c.bytesSent += int64(n) - c.sendBuf = nil - c.buffering = false - return n, err -} - -// outBufPool pools the record-sized scratch buffers used by writeRecordLocked. -var outBufPool = sync.Pool{ - New: func() any { - return new([]byte) - }, -} - -// writeRecordLocked writes a TLS record with the given type and payload to the -// connection and updates the record layer state. -func (c *Conn) writeRecordLocked(typ recordType, data []byte) (int, error) { - if c.quic != nil { - if typ != recordTypeHandshake { - return 0, errors.New("tls: internal error: sending non-handshake message to QUIC transport") - } - c.quicWriteCryptoData(c.out.level, data) - if !c.buffering { - if _, err := c.flush(); err != nil { - return 0, err - } - } - return len(data), nil - } - - outBufPtr := outBufPool.Get().(*[]byte) - outBuf := *outBufPtr - defer func() { - // You might be tempted to simplify this by just passing &outBuf to Put, - // but that would make the local copy of the outBuf slice header escape - // to the heap, causing an allocation. Instead, we keep around the - // pointer to the slice header returned by Get, which is already on the - // heap, and overwrite and return that. - *outBufPtr = outBuf - outBufPool.Put(outBufPtr) - }() - - var n int - for len(data) > 0 { - m := len(data) - if maxPayload := c.maxPayloadSizeForWrite(typ); m > maxPayload { - m = maxPayload - } - - _, outBuf = sliceForAppend(outBuf[:0], recordHeaderLen) - outBuf[0] = byte(typ) - vers := c.vers - if vers == 0 { - // Some TLS servers fail if the record version is - // greater than TLS 1.0 for the initial ClientHello. - vers = VersionTLS10 - } else if vers == VersionTLS13 { - // TLS 1.3 froze the record layer version to 1.2. - // See RFC 8446, Section 5.1. - vers = VersionTLS12 - } - outBuf[1] = byte(vers >> 8) - outBuf[2] = byte(vers) - outBuf[3] = byte(m >> 8) - outBuf[4] = byte(m) - - var err error - outBuf, err = c.out.encrypt(outBuf, data[:m], c.config.rand()) - if err != nil { - return n, err - } - if _, err := c.write(outBuf); err != nil { - return n, err - } - n += m - data = data[m:] - } - - if typ == recordTypeChangeCipherSpec && c.vers != VersionTLS13 { - if err := c.out.changeCipherSpec(); err != nil { - return n, c.sendAlertLocked(err.(alert)) - } - } - - return n, nil -} - -// writeHandshakeRecord writes a handshake message to the connection and updates -// the record layer state. If transcript is non-nil the marshalled message is -// written to it. -func (c *Conn) writeHandshakeRecord(msg handshakeMessage, transcript transcriptHash) (int, error) { - c.out.Lock() - defer c.out.Unlock() - - data, err := msg.marshal() - if err != nil { - return 0, err - } - if transcript != nil { - transcript.Write(data) - } - - return c.writeRecordLocked(recordTypeHandshake, data) -} - -// writeChangeCipherRecord writes a ChangeCipherSpec message to the connection and -// updates the record layer state. -func (c *Conn) writeChangeCipherRecord() error { - c.out.Lock() - defer c.out.Unlock() - _, err := c.writeRecordLocked(recordTypeChangeCipherSpec, []byte{1}) - return err -} - -// readHandshakeBytes reads handshake data until c.hand contains at least n bytes. -func (c *Conn) readHandshakeBytes(n int) error { - if c.quic != nil { - return c.quicReadHandshakeBytes(n) - } - for c.hand.Len() < n { - if err := c.readRecord(); err != nil { - return err - } - } - return nil -} - -// readHandshake reads the next handshake message from -// the record layer. If transcript is non-nil, the message -// is written to the passed transcriptHash. -func (c *Conn) readHandshake(transcript transcriptHash) (any, error) { - if err := c.readHandshakeBytes(4); err != nil { - return nil, err - } - data := c.hand.Bytes() - n := int(data[1])<<16 | int(data[2])<<8 | int(data[3]) - if n > maxHandshake { - c.sendAlertLocked(alertInternalError) - return nil, c.in.setErrorLocked(fmt.Errorf("tls: handshake message of length %d bytes exceeds maximum of %d bytes", n, maxHandshake)) - } - if err := c.readHandshakeBytes(4 + n); err != nil { - return nil, err - } - data = c.hand.Next(4 + n) - return c.unmarshalHandshakeMessage(data, transcript) -} - -func (c *Conn) unmarshalHandshakeMessage(data []byte, transcript transcriptHash) (handshakeMessage, error) { - var m handshakeMessage - switch data[0] { - case typeHelloRequest: - m = new(helloRequestMsg) - case typeClientHello: - m = new(clientHelloMsg) - case typeServerHello: - m = new(serverHelloMsg) - case typeNewSessionTicket: - if c.vers == VersionTLS13 { - m = new(newSessionTicketMsgTLS13) - } else { - m = new(newSessionTicketMsg) - } - case typeCertificate: - if c.vers == VersionTLS13 { - m = new(certificateMsgTLS13) - } else { - m = new(certificateMsg) - } - case typeCertificateRequest: - if c.vers == VersionTLS13 { - m = new(certificateRequestMsgTLS13) - } else { - m = &certificateRequestMsg{ - hasSignatureAlgorithm: c.vers >= VersionTLS12, - } - } - case typeCertificateStatus: - m = new(certificateStatusMsg) - case typeServerKeyExchange: - m = new(serverKeyExchangeMsg) - case typeServerHelloDone: - m = new(serverHelloDoneMsg) - case typeClientKeyExchange: - m = new(clientKeyExchangeMsg) - case typeCertificateVerify: - m = &certificateVerifyMsg{ - hasSignatureAlgorithm: c.vers >= VersionTLS12, - } - case typeFinished: - m = new(finishedMsg) - case typeEncryptedExtensions: - m = new(encryptedExtensionsMsg) - case typeEndOfEarlyData: - m = new(endOfEarlyDataMsg) - case typeKeyUpdate: - m = new(keyUpdateMsg) - default: - return nil, c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage)) - } - - // The handshake message unmarshalers - // expect to be able to keep references to data, - // so pass in a fresh copy that won't be overwritten. - data = append([]byte(nil), data...) - - if !m.unmarshal(data) { - return nil, c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage)) - } - - if transcript != nil { - transcript.Write(data) - } - - return m, nil -} - -var ( - errShutdown = errors.New("tls: protocol is shutdown") -) - -// Write writes data to the connection. -// -// As Write calls Handshake, in order to prevent indefinite blocking a deadline -// must be set for both Read and Write before Write is called when the handshake -// has not yet completed. See SetDeadline, SetReadDeadline, and -// SetWriteDeadline. -func (c *Conn) Write(b []byte) (int, error) { - // interlock with Close below - for { - x := c.activeCall.Load() - if x&1 != 0 { - return 0, net.ErrClosed - } - if c.activeCall.CompareAndSwap(x, x+2) { - break - } - } - defer c.activeCall.Add(-2) - - if err := c.Handshake(); err != nil { - return 0, err - } - - c.out.Lock() - defer c.out.Unlock() - - if err := c.out.err; err != nil { - return 0, err - } - - if !c.isHandshakeComplete.Load() { - return 0, alertInternalError - } - - if c.closeNotifySent { - return 0, errShutdown - } - - // TLS 1.0 is susceptible to a chosen-plaintext - // attack when using block mode ciphers due to predictable IVs. - // This can be prevented by splitting each Application Data - // record into two records, effectively randomizing the IV. - // - // https://www.openssl.org/~bodo/tls-cbc.txt - // https://bugzilla.mozilla.org/show_bug.cgi?id=665814 - // https://www.imperialviolet.org/2012/01/15/beastfollowup.html - - var m int - if len(b) > 1 && c.vers == VersionTLS10 { - if _, ok := c.out.cipher.(cipher.BlockMode); ok { - n, err := c.writeRecordLocked(recordTypeApplicationData, b[:1]) - if err != nil { - return n, c.out.setErrorLocked(err) - } - m, b = 1, b[1:] - } - } - - n, err := c.writeRecordLocked(recordTypeApplicationData, b) - return n + m, c.out.setErrorLocked(err) -} - -// handleRenegotiation processes a HelloRequest handshake message. -func (c *Conn) handleRenegotiation() error { - if c.vers == VersionTLS13 { - return errors.New("tls: internal error: unexpected renegotiation") - } - - msg, err := c.readHandshake(nil) - if err != nil { - return err - } - - helloReq, ok := msg.(*helloRequestMsg) - if !ok { - c.sendAlert(alertUnexpectedMessage) - return unexpectedMessageError(helloReq, msg) - } - - if !c.isClient { - return c.sendAlert(alertNoRenegotiation) - } - - switch c.config.Renegotiation { - case RenegotiateNever: - return c.sendAlert(alertNoRenegotiation) - case RenegotiateOnceAsClient: - if c.handshakes > 1 { - return c.sendAlert(alertNoRenegotiation) - } - case RenegotiateFreelyAsClient: - // Ok. - default: - c.sendAlert(alertInternalError) - return errors.New("tls: unknown Renegotiation value") - } - - c.handshakeMutex.Lock() - defer c.handshakeMutex.Unlock() - - c.isHandshakeComplete.Store(false) - if c.handshakeErr = c.clientHandshake(context.Background()); c.handshakeErr == nil { - c.handshakes++ - } - return c.handshakeErr -} - -// handlePostHandshakeMessage processes a handshake message arrived after the -// handshake is complete. Up to TLS 1.2, it indicates the start of a renegotiation. -func (c *Conn) handlePostHandshakeMessage() error { - if c.vers != VersionTLS13 { - return c.handleRenegotiation() - } - - msg, err := c.readHandshake(nil) - if err != nil { - return err - } - c.retryCount++ - if c.retryCount > maxUselessRecords { - c.sendAlert(alertUnexpectedMessage) - return c.in.setErrorLocked(errors.New("tls: too many non-advancing records")) - } - - switch msg := msg.(type) { - case *newSessionTicketMsgTLS13: - return c.handleNewSessionTicket(msg) - case *keyUpdateMsg: - return c.handleKeyUpdate(msg) - } - // The QUIC layer is supposed to treat an unexpected post-handshake CertificateRequest - // as a QUIC-level PROTOCOL_VIOLATION error (RFC 9001, Section 4.4). Returning an - // unexpected_message alert here doesn't provide it with enough information to distinguish - // this condition from other unexpected messages. This is probably fine. - c.sendAlert(alertUnexpectedMessage) - return fmt.Errorf("tls: received unexpected handshake message of type %T", msg) -} - -func (c *Conn) handleKeyUpdate(keyUpdate *keyUpdateMsg) error { - if c.quic != nil { - c.sendAlert(alertUnexpectedMessage) - return c.in.setErrorLocked(errors.New("tls: received unexpected key update message")) - } - - cipherSuite := cipherSuiteTLS13ByID(c.cipherSuite) - if cipherSuite == nil { - return c.in.setErrorLocked(c.sendAlert(alertInternalError)) - } - - newSecret := cipherSuite.nextTrafficSecret(c.in.trafficSecret) - c.in.setTrafficSecret(cipherSuite, QUICEncryptionLevelInitial, newSecret) - - if keyUpdate.updateRequested { - c.out.Lock() - defer c.out.Unlock() - - msg := &keyUpdateMsg{} - msgBytes, err := msg.marshal() - if err != nil { - return err - } - _, err = c.writeRecordLocked(recordTypeHandshake, msgBytes) - if err != nil { - // Surface the error at the next write. - c.out.setErrorLocked(err) - return nil - } - - newSecret := cipherSuite.nextTrafficSecret(c.out.trafficSecret) - c.out.setTrafficSecret(cipherSuite, QUICEncryptionLevelInitial, newSecret) - } - - return nil -} - -// Read reads data from the connection. -// -// As Read calls Handshake, in order to prevent indefinite blocking a deadline -// must be set for both Read and Write before Read is called when the handshake -// has not yet completed. See SetDeadline, SetReadDeadline, and -// SetWriteDeadline. -func (c *Conn) Read(b []byte) (int, error) { - if err := c.Handshake(); err != nil { - return 0, err - } - if len(b) == 0 { - // Put this after Handshake, in case people were calling - // Read(nil) for the side effect of the Handshake. - return 0, nil - } - - c.in.Lock() - defer c.in.Unlock() - - for c.input.Len() == 0 { - if err := c.readRecord(); err != nil { - return 0, err - } - for c.hand.Len() > 0 { - if err := c.handlePostHandshakeMessage(); err != nil { - return 0, err - } - } - } - - n, _ := c.input.Read(b) - - // If a close-notify alert is waiting, read it so that we can return (n, - // EOF) instead of (n, nil), to signal to the HTTP response reading - // goroutine that the connection is now closed. This eliminates a race - // where the HTTP response reading goroutine would otherwise not observe - // the EOF until its next read, by which time a client goroutine might - // have already tried to reuse the HTTP connection for a new request. - // See https://golang.org/cl/76400046 and https://golang.org/issue/3514 - if n != 0 && c.input.Len() == 0 && c.rawInput.Len() > 0 && - recordType(c.rawInput.Bytes()[0]) == recordTypeAlert { - if err := c.readRecord(); err != nil { - return n, err // will be io.EOF on closeNotify - } - } - - return n, nil -} - -// Close closes the connection. -func (c *Conn) Close() error { - // Interlock with Conn.Write above. - var x int32 - for { - x = c.activeCall.Load() - if x&1 != 0 { - return net.ErrClosed - } - if c.activeCall.CompareAndSwap(x, x|1) { - break - } - } - if x != 0 { - // io.Writer and io.Closer should not be used concurrently. - // If Close is called while a Write is currently in-flight, - // interpret that as a sign that this Close is really just - // being used to break the Write and/or clean up resources and - // avoid sending the alertCloseNotify, which may block - // waiting on handshakeMutex or the c.out mutex. - return c.conn.Close() - } - - var alertErr error - if c.isHandshakeComplete.Load() { - if err := c.closeNotify(); err != nil { - alertErr = fmt.Errorf("tls: failed to send closeNotify alert (but connection was closed anyway): %w", err) - } - } - - if err := c.conn.Close(); err != nil { - return err - } - return alertErr -} - -var errEarlyCloseWrite = errors.New("tls: CloseWrite called before handshake complete") - -// CloseWrite shuts down the writing side of the connection. It should only be -// called once the handshake has completed and does not call CloseWrite on the -// underlying connection. Most callers should just use Close. -func (c *Conn) CloseWrite() error { - if !c.isHandshakeComplete.Load() { - return errEarlyCloseWrite - } - - return c.closeNotify() -} - -func (c *Conn) closeNotify() error { - c.out.Lock() - defer c.out.Unlock() - - if !c.closeNotifySent { - // Set a Write Deadline to prevent possibly blocking forever. - c.SetWriteDeadline(time.Now().Add(time.Second * 5)) - c.closeNotifyErr = c.sendAlertLocked(alertCloseNotify) - c.closeNotifySent = true - // Any subsequent writes will fail. - c.SetWriteDeadline(time.Now()) - } - return c.closeNotifyErr -} - -// Handshake runs the client or server handshake -// protocol if it has not yet been run. -// -// Most uses of this package need not call Handshake explicitly: the -// first Read or Write will call it automatically. -// -// For control over canceling or setting a timeout on a handshake, use -// HandshakeContext or the Dialer's DialContext method instead. -func (c *Conn) Handshake() error { - return c.HandshakeContext(context.Background()) -} - -// HandshakeContext runs the client or server handshake -// protocol if it has not yet been run. -// -// The provided Context must be non-nil. If the context is canceled before -// the handshake is complete, the handshake is interrupted and an error is returned. -// Once the handshake has completed, cancellation of the context will not affect the -// connection. -// -// Most uses of this package need not call HandshakeContext explicitly: the -// first Read or Write will call it automatically. -func (c *Conn) HandshakeContext(ctx context.Context) error { - // Delegate to unexported method for named return - // without confusing documented signature. - return c.handshakeContext(ctx) -} - -func (c *Conn) handshakeContext(ctx context.Context) (ret error) { - // Fast sync/atomic-based exit if there is no handshake in flight and the - // last one succeeded without an error. Avoids the expensive context setup - // and mutex for most Read and Write calls. - if c.isHandshakeComplete.Load() { - return nil - } - - handshakeCtx, cancel := context.WithCancel(ctx) - // Note: defer this before starting the "interrupter" goroutine - // so that we can tell the difference between the input being canceled and - // this cancellation. In the former case, we need to close the connection. - defer cancel() - - if c.quic != nil { - c.quic.cancelc = handshakeCtx.Done() - c.quic.cancel = cancel - } else if ctx.Done() != nil { - // Start the "interrupter" goroutine, if this context might be canceled. - // (The background context cannot). - // - // The interrupter goroutine waits for the input context to be done and - // closes the connection if this happens before the function returns. - done := make(chan struct{}) - interruptRes := make(chan error, 1) - defer func() { - close(done) - if ctxErr := <-interruptRes; ctxErr != nil { - // Return context error to user. - ret = ctxErr - } - }() - go func() { - select { - case <-handshakeCtx.Done(): - // Close the connection, discarding the error - _ = c.conn.Close() - interruptRes <- handshakeCtx.Err() - case <-done: - interruptRes <- nil - } - }() - } - - c.handshakeMutex.Lock() - defer c.handshakeMutex.Unlock() - - if err := c.handshakeErr; err != nil { - return err - } - if c.isHandshakeComplete.Load() { - return nil - } - - c.in.Lock() - defer c.in.Unlock() - - c.handshakeErr = c.handshakeFn(handshakeCtx) - if c.handshakeErr == nil { - c.handshakes++ - } else { - // If an error occurred during the handshake try to flush the - // alert that might be left in the buffer. - c.flush() - } - - if c.handshakeErr == nil && !c.isHandshakeComplete.Load() { - c.handshakeErr = errors.New("tls: internal error: handshake should have had a result") - } - if c.handshakeErr != nil && c.isHandshakeComplete.Load() { - panic("tls: internal error: handshake returned an error but is marked successful") - } - - if c.quic != nil { - if c.handshakeErr == nil { - c.quicHandshakeComplete() - // Provide the 1-RTT read secret now that the handshake is complete. - // The QUIC layer MUST NOT decrypt 1-RTT packets prior to completing - // the handshake (RFC 9001, Section 5.7). - c.quicSetReadSecret(QUICEncryptionLevelApplication, c.cipherSuite, c.in.trafficSecret) - } else { - var a alert - c.out.Lock() - if !errors.As(c.out.err, &a) { - a = alertInternalError - } - c.out.Unlock() - // Return an error which wraps both the handshake error and - // any alert error we may have sent, or alertInternalError - // if we didn't send an alert. - // Truncate the text of the alert to 0 characters. - c.handshakeErr = fmt.Errorf("%w%.0w", c.handshakeErr, AlertError(a)) - } - close(c.quic.blockedc) - close(c.quic.signalc) - } - - return c.handshakeErr -} - -// ConnectionState returns basic TLS details about the connection. -func (c *Conn) ConnectionState() ConnectionState { - c.handshakeMutex.Lock() - defer c.handshakeMutex.Unlock() - return c.connectionStateLocked() -} - -func (c *Conn) connectionStateLocked() ConnectionState { - var state connectionState - state.HandshakeComplete = c.isHandshakeComplete.Load() - state.Version = c.vers - state.NegotiatedProtocol = c.clientProtocol - state.DidResume = c.didResume - state.NegotiatedProtocolIsMutual = true - state.ServerName = c.serverName - state.CipherSuite = c.cipherSuite - state.PeerCertificates = c.peerCertificates - state.VerifiedChains = c.verifiedChains - state.SignedCertificateTimestamps = c.scts - state.OCSPResponse = c.ocspResponse - if !c.didResume && c.vers != VersionTLS13 { - if c.clientFinishedIsFirst { - state.TLSUnique = c.clientFinished[:] - } else { - state.TLSUnique = c.serverFinished[:] - } - } - if c.config.Renegotiation != RenegotiateNever { - state.ekm = noExportedKeyingMaterial - } else { - state.ekm = c.ekm - } - return toConnectionState(state) -} - -// OCSPResponse returns the stapled OCSP response from the TLS server, if -// any. (Only valid for client connections.) -func (c *Conn) OCSPResponse() []byte { - c.handshakeMutex.Lock() - defer c.handshakeMutex.Unlock() - - return c.ocspResponse -} - -// VerifyHostname checks that the peer certificate chain is valid for -// connecting to host. If so, it returns nil; if not, it returns an error -// describing the problem. -func (c *Conn) VerifyHostname(host string) error { - c.handshakeMutex.Lock() - defer c.handshakeMutex.Unlock() - if !c.isClient { - return errors.New("tls: VerifyHostname called on TLS server connection") - } - if !c.isHandshakeComplete.Load() { - return errors.New("tls: handshake has not yet been performed") - } - if len(c.verifiedChains) == 0 { - return errors.New("tls: handshake did not verify certificate chain") - } - return c.peerCertificates[0].VerifyHostname(host) -} diff --git a/vendor/github.com/quic-go/qtls-go1-20/handshake_client.go b/vendor/github.com/quic-go/qtls-go1-20/handshake_client.go deleted file mode 100644 index a5fdd54ca..000000000 --- a/vendor/github.com/quic-go/qtls-go1-20/handshake_client.go +++ /dev/null @@ -1,1130 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package qtls - -import ( - "bytes" - "context" - "crypto" - "crypto/ecdh" - "crypto/ecdsa" - "crypto/ed25519" - "crypto/rsa" - "crypto/subtle" - "crypto/x509" - "errors" - "fmt" - "hash" - "io" - "net" - "strings" - "time" - - "golang.org/x/crypto/cryptobyte" -) - -const clientSessionStateVersion = 1 - -type clientHandshakeState struct { - c *Conn - ctx context.Context - serverHello *serverHelloMsg - hello *clientHelloMsg - suite *cipherSuite - finishedHash finishedHash - masterSecret []byte - session *clientSessionState -} - -var testingOnlyForceClientHelloSignatureAlgorithms []SignatureScheme - -func (c *Conn) makeClientHello() (*clientHelloMsg, *ecdh.PrivateKey, error) { - config := c.config - if len(config.ServerName) == 0 && !config.InsecureSkipVerify { - return nil, nil, errors.New("tls: either ServerName or InsecureSkipVerify must be specified in the tls.Config") - } - - nextProtosLength := 0 - for _, proto := range config.NextProtos { - if l := len(proto); l == 0 || l > 255 { - return nil, nil, errors.New("tls: invalid NextProtos value") - } else { - nextProtosLength += 1 + l - } - } - if nextProtosLength > 0xffff { - return nil, nil, errors.New("tls: NextProtos values too large") - } - - supportedVersions := config.supportedVersions(roleClient) - if len(supportedVersions) == 0 { - return nil, nil, errors.New("tls: no supported versions satisfy MinVersion and MaxVersion") - } - - clientHelloVersion := config.maxSupportedVersion(roleClient) - // The version at the beginning of the ClientHello was capped at TLS 1.2 - // for compatibility reasons. The supported_versions extension is used - // to negotiate versions now. See RFC 8446, Section 4.2.1. - if clientHelloVersion > VersionTLS12 { - clientHelloVersion = VersionTLS12 - } - - hello := &clientHelloMsg{ - vers: clientHelloVersion, - compressionMethods: []uint8{compressionNone}, - random: make([]byte, 32), - ocspStapling: true, - scts: true, - serverName: hostnameInSNI(config.ServerName), - supportedCurves: config.curvePreferences(), - supportedPoints: []uint8{pointFormatUncompressed}, - secureRenegotiationSupported: true, - alpnProtocols: config.NextProtos, - supportedVersions: supportedVersions, - } - - if c.handshakes > 0 { - hello.secureRenegotiation = c.clientFinished[:] - } - - preferenceOrder := cipherSuitesPreferenceOrder - if !hasAESGCMHardwareSupport { - preferenceOrder = cipherSuitesPreferenceOrderNoAES - } - configCipherSuites := config.cipherSuites() - hello.cipherSuites = make([]uint16, 0, len(configCipherSuites)) - - for _, suiteId := range preferenceOrder { - suite := mutualCipherSuite(configCipherSuites, suiteId) - if suite == nil { - continue - } - // Don't advertise TLS 1.2-only cipher suites unless - // we're attempting TLS 1.2. - if hello.vers < VersionTLS12 && suite.flags&suiteTLS12 != 0 { - continue - } - hello.cipherSuites = append(hello.cipherSuites, suiteId) - } - - _, err := io.ReadFull(config.rand(), hello.random) - if err != nil { - return nil, nil, errors.New("tls: short read from Rand: " + err.Error()) - } - - // A random session ID is used to detect when the server accepted a ticket - // and is resuming a session (see RFC 5077). In TLS 1.3, it's always set as - // a compatibility measure (see RFC 8446, Section 4.1.2). - // - // The session ID is not set for QUIC connections (see RFC 9001, Section 8.4). - if c.quic == nil { - hello.sessionId = make([]byte, 32) - if _, err := io.ReadFull(config.rand(), hello.sessionId); err != nil { - return nil, nil, errors.New("tls: short read from Rand: " + err.Error()) - } - } - - if hello.vers >= VersionTLS12 { - hello.supportedSignatureAlgorithms = supportedSignatureAlgorithms() - } - if testingOnlyForceClientHelloSignatureAlgorithms != nil { - hello.supportedSignatureAlgorithms = testingOnlyForceClientHelloSignatureAlgorithms - } - - var key *ecdh.PrivateKey - if hello.supportedVersions[0] == VersionTLS13 { - if len(hello.supportedVersions) == 1 { - hello.cipherSuites = hello.cipherSuites[:0] - } - if hasAESGCMHardwareSupport { - hello.cipherSuites = append(hello.cipherSuites, defaultCipherSuitesTLS13...) - } else { - hello.cipherSuites = append(hello.cipherSuites, defaultCipherSuitesTLS13NoAES...) - } - - curveID := config.curvePreferences()[0] - if _, ok := curveForCurveID(curveID); !ok { - return nil, nil, errors.New("tls: CurvePreferences includes unsupported curve") - } - key, err = generateECDHEKey(config.rand(), curveID) - if err != nil { - return nil, nil, err - } - hello.keyShares = []keyShare{{group: curveID, data: key.PublicKey().Bytes()}} - } - - if c.quic != nil { - p, err := c.quicGetTransportParameters() - if err != nil { - return nil, nil, err - } - if p == nil { - p = []byte{} - } - hello.quicTransportParameters = p - } - - return hello, key, nil -} - -func (c *Conn) clientHandshake(ctx context.Context) (err error) { - if c.config == nil { - c.config = fromConfig(defaultConfig()) - } - - // This may be a renegotiation handshake, in which case some fields - // need to be reset. - c.didResume = false - - hello, ecdheKey, err := c.makeClientHello() - if err != nil { - return err - } - c.serverName = hello.serverName - - cacheKey, session, earlySecret, binderKey, err := c.loadSession(hello) - if err != nil { - return err - } - if cacheKey != "" && session != nil { - defer func() { - // If we got a handshake failure when resuming a session, throw away - // the session ticket. See RFC 5077, Section 3.2. - // - // RFC 8446 makes no mention of dropping tickets on failure, but it - // does require servers to abort on invalid binders, so we need to - // delete tickets to recover from a corrupted PSK. - if err != nil { - c.config.ClientSessionCache.Put(cacheKey, nil) - } - }() - } - - if _, err := c.writeHandshakeRecord(hello, nil); err != nil { - return err - } - - if hello.earlyData { - suite := cipherSuiteTLS13ByID(session.cipherSuite) - transcript := suite.hash.New() - if err := transcriptMsg(hello, transcript); err != nil { - return err - } - earlyTrafficSecret := suite.deriveSecret(earlySecret, clientEarlyTrafficLabel, transcript) - c.quicSetWriteSecret(QUICEncryptionLevelEarly, suite.id, earlyTrafficSecret) - } - - // serverHelloMsg is not included in the transcript - msg, err := c.readHandshake(nil) - if err != nil { - return err - } - - serverHello, ok := msg.(*serverHelloMsg) - if !ok { - c.sendAlert(alertUnexpectedMessage) - return unexpectedMessageError(serverHello, msg) - } - - if err := c.pickTLSVersion(serverHello); err != nil { - return err - } - - // If we are negotiating a protocol version that's lower than what we - // support, check for the server downgrade canaries. - // See RFC 8446, Section 4.1.3. - maxVers := c.config.maxSupportedVersion(roleClient) - tls12Downgrade := string(serverHello.random[24:]) == downgradeCanaryTLS12 - tls11Downgrade := string(serverHello.random[24:]) == downgradeCanaryTLS11 - if maxVers == VersionTLS13 && c.vers <= VersionTLS12 && (tls12Downgrade || tls11Downgrade) || - maxVers == VersionTLS12 && c.vers <= VersionTLS11 && tls11Downgrade { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: downgrade attempt detected, possibly due to a MitM attack or a broken middlebox") - } - - if c.vers == VersionTLS13 { - hs := &clientHandshakeStateTLS13{ - c: c, - ctx: ctx, - serverHello: serverHello, - hello: hello, - ecdheKey: ecdheKey, - session: session, - earlySecret: earlySecret, - binderKey: binderKey, - } - - // In TLS 1.3, session tickets are delivered after the handshake. - return hs.handshake() - } - - hs := &clientHandshakeState{ - c: c, - ctx: ctx, - serverHello: serverHello, - hello: hello, - session: session, - } - - if err := hs.handshake(); err != nil { - return err - } - - // If we had a successful handshake and hs.session is different from - // the one already cached - cache a new one. - if cacheKey != "" && hs.session != nil && session != hs.session { - c.config.ClientSessionCache.Put(cacheKey, toClientSessionState(hs.session)) - } - - return nil -} - -// extract the app data saved in the session.nonce, -// and set the session.nonce to the actual nonce value -func (c *Conn) decodeSessionState(session *clientSessionState) (uint32 /* max early data */, []byte /* app data */, bool /* ok */) { - s := cryptobyte.String(session.nonce) - var version uint16 - if !s.ReadUint16(&version) { - return 0, nil, false - } - if version != clientSessionStateVersion { - return 0, nil, false - } - var maxEarlyData uint32 - if !s.ReadUint32(&maxEarlyData) { - return 0, nil, false - } - var appData []byte - if !readUint16LengthPrefixed(&s, &appData) { - return 0, nil, false - } - var nonce []byte - if !readUint16LengthPrefixed(&s, &nonce) { - return 0, nil, false - } - session.nonce = nonce - return maxEarlyData, appData, true -} - -func (c *Conn) loadSession(hello *clientHelloMsg) (cacheKey string, - session *clientSessionState, earlySecret, binderKey []byte, err error) { - if c.config.SessionTicketsDisabled || c.config.ClientSessionCache == nil { - return "", nil, nil, nil, nil - } - - hello.ticketSupported = true - - if hello.supportedVersions[0] == VersionTLS13 { - // Require DHE on resumption as it guarantees forward secrecy against - // compromise of the session ticket key. See RFC 8446, Section 4.2.9. - hello.pskModes = []uint8{pskModeDHE} - } - - // Session resumption is not allowed if renegotiating because - // renegotiation is primarily used to allow a client to send a client - // certificate, which would be skipped if session resumption occurred. - if c.handshakes != 0 { - return "", nil, nil, nil, nil - } - - // Try to resume a previously negotiated TLS session, if available. - cacheKey = c.clientSessionCacheKey() - if cacheKey == "" { - return "", nil, nil, nil, nil - } - sess, ok := c.config.ClientSessionCache.Get(cacheKey) - if !ok || sess == nil { - return cacheKey, nil, nil, nil, nil - } - session = fromClientSessionState(sess) - - var appData []byte - var maxEarlyData uint32 - if session.vers == VersionTLS13 { - var ok bool - maxEarlyData, appData, ok = c.decodeSessionState(session) - if !ok { // delete it, if parsing failed - c.config.ClientSessionCache.Put(cacheKey, nil) - return cacheKey, nil, nil, nil, nil - } - } - - // Check that version used for the previous session is still valid. - versOk := false - for _, v := range hello.supportedVersions { - if v == session.vers { - versOk = true - break - } - } - if !versOk { - return cacheKey, nil, nil, nil, nil - } - - // Check that the cached server certificate is not expired, and that it's - // valid for the ServerName. This should be ensured by the cache key, but - // protect the application from a faulty ClientSessionCache implementation. - if !c.config.InsecureSkipVerify { - if len(session.verifiedChains) == 0 { - // The original connection had InsecureSkipVerify, while this doesn't. - return cacheKey, nil, nil, nil, nil - } - serverCert := session.serverCertificates[0] - if c.config.time().After(serverCert.NotAfter) { - // Expired certificate, delete the entry. - c.config.ClientSessionCache.Put(cacheKey, nil) - return cacheKey, nil, nil, nil, nil - } - if err := serverCert.VerifyHostname(c.config.ServerName); err != nil { - return cacheKey, nil, nil, nil, nil - } - } - - if session.vers != VersionTLS13 { - // In TLS 1.2 the cipher suite must match the resumed session. Ensure we - // are still offering it. - if mutualCipherSuite(hello.cipherSuites, session.cipherSuite) == nil { - return cacheKey, nil, nil, nil, nil - } - - hello.sessionTicket = session.sessionTicket - return - } - - // Check that the session ticket is not expired. - if c.config.time().After(session.useBy) { - c.config.ClientSessionCache.Put(cacheKey, nil) - return cacheKey, nil, nil, nil, nil - } - - // In TLS 1.3 the KDF hash must match the resumed session. Ensure we - // offer at least one cipher suite with that hash. - cipherSuite := cipherSuiteTLS13ByID(session.cipherSuite) - if cipherSuite == nil { - return cacheKey, nil, nil, nil, nil - } - cipherSuiteOk := false - for _, offeredID := range hello.cipherSuites { - offeredSuite := cipherSuiteTLS13ByID(offeredID) - if offeredSuite != nil && offeredSuite.hash == cipherSuite.hash { - cipherSuiteOk = true - break - } - } - if !cipherSuiteOk { - return cacheKey, nil, nil, nil, nil - } - - if c.quic != nil && maxEarlyData > 0 { - // For 0-RTT, the cipher suite has to match exactly. - if mutualCipherSuiteTLS13(hello.cipherSuites, session.cipherSuite) != nil { - hello.earlyData = true - } - } - - // Set the pre_shared_key extension. See RFC 8446, Section 4.2.11.1. - ticketAge := uint32(c.config.time().Sub(session.receivedAt) / time.Millisecond) - identity := pskIdentity{ - label: session.sessionTicket, - obfuscatedTicketAge: ticketAge + session.ageAdd, - } - hello.pskIdentities = []pskIdentity{identity} - hello.pskBinders = [][]byte{make([]byte, cipherSuite.hash.Size())} - - // Compute the PSK binders. See RFC 8446, Section 4.2.11.2. - psk := cipherSuite.expandLabel(session.masterSecret, "resumption", - session.nonce, cipherSuite.hash.Size()) - earlySecret = cipherSuite.extract(psk, nil) - binderKey = cipherSuite.deriveSecret(earlySecret, resumptionBinderLabel, nil) - transcript := cipherSuite.hash.New() - helloBytes, err := hello.marshalWithoutBinders() - if err != nil { - return "", nil, nil, nil, err - } - transcript.Write(helloBytes) - pskBinders := [][]byte{cipherSuite.finishedHash(binderKey, transcript)} - if err := hello.updateBinders(pskBinders); err != nil { - return "", nil, nil, nil, err - } - - if session.vers == VersionTLS13 && c.extraConfig != nil && c.extraConfig.SetAppDataFromSessionState != nil { - c.extraConfig.SetAppDataFromSessionState(appData) - } - return -} - -func (c *Conn) pickTLSVersion(serverHello *serverHelloMsg) error { - peerVersion := serverHello.vers - if serverHello.supportedVersion != 0 { - peerVersion = serverHello.supportedVersion - } - - vers, ok := c.config.mutualVersion(roleClient, []uint16{peerVersion}) - if !ok { - c.sendAlert(alertProtocolVersion) - return fmt.Errorf("tls: server selected unsupported protocol version %x", peerVersion) - } - - c.vers = vers - c.haveVers = true - c.in.version = vers - c.out.version = vers - - return nil -} - -// Does the handshake, either a full one or resumes old session. Requires hs.c, -// hs.hello, hs.serverHello, and, optionally, hs.session to be set. -func (hs *clientHandshakeState) handshake() error { - c := hs.c - - isResume, err := hs.processServerHello() - if err != nil { - return err - } - - hs.finishedHash = newFinishedHash(c.vers, hs.suite) - - // No signatures of the handshake are needed in a resumption. - // Otherwise, in a full handshake, if we don't have any certificates - // configured then we will never send a CertificateVerify message and - // thus no signatures are needed in that case either. - if isResume || (len(c.config.Certificates) == 0 && c.config.GetClientCertificate == nil) { - hs.finishedHash.discardHandshakeBuffer() - } - - if err := transcriptMsg(hs.hello, &hs.finishedHash); err != nil { - return err - } - if err := transcriptMsg(hs.serverHello, &hs.finishedHash); err != nil { - return err - } - - c.buffering = true - c.didResume = isResume - if isResume { - if err := hs.establishKeys(); err != nil { - return err - } - if err := hs.readSessionTicket(); err != nil { - return err - } - if err := hs.readFinished(c.serverFinished[:]); err != nil { - return err - } - c.clientFinishedIsFirst = false - // Make sure the connection is still being verified whether or not this - // is a resumption. Resumptions currently don't reverify certificates so - // they don't call verifyServerCertificate. See Issue 31641. - if c.config.VerifyConnection != nil { - if err := c.config.VerifyConnection(c.connectionStateLocked()); err != nil { - c.sendAlert(alertBadCertificate) - return err - } - } - if err := hs.sendFinished(c.clientFinished[:]); err != nil { - return err - } - if _, err := c.flush(); err != nil { - return err - } - } else { - if err := hs.doFullHandshake(); err != nil { - return err - } - if err := hs.establishKeys(); err != nil { - return err - } - if err := hs.sendFinished(c.clientFinished[:]); err != nil { - return err - } - if _, err := c.flush(); err != nil { - return err - } - c.clientFinishedIsFirst = true - if err := hs.readSessionTicket(); err != nil { - return err - } - if err := hs.readFinished(c.serverFinished[:]); err != nil { - return err - } - } - - c.ekm = ekmFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.hello.random, hs.serverHello.random) - c.isHandshakeComplete.Store(true) - - return nil -} - -func (hs *clientHandshakeState) pickCipherSuite() error { - if hs.suite = mutualCipherSuite(hs.hello.cipherSuites, hs.serverHello.cipherSuite); hs.suite == nil { - hs.c.sendAlert(alertHandshakeFailure) - return errors.New("tls: server chose an unconfigured cipher suite") - } - - hs.c.cipherSuite = hs.suite.id - return nil -} - -func (hs *clientHandshakeState) doFullHandshake() error { - c := hs.c - - msg, err := c.readHandshake(&hs.finishedHash) - if err != nil { - return err - } - certMsg, ok := msg.(*certificateMsg) - if !ok || len(certMsg.certificates) == 0 { - c.sendAlert(alertUnexpectedMessage) - return unexpectedMessageError(certMsg, msg) - } - - msg, err = c.readHandshake(&hs.finishedHash) - if err != nil { - return err - } - - cs, ok := msg.(*certificateStatusMsg) - if ok { - // RFC4366 on Certificate Status Request: - // The server MAY return a "certificate_status" message. - - if !hs.serverHello.ocspStapling { - // If a server returns a "CertificateStatus" message, then the - // server MUST have included an extension of type "status_request" - // with empty "extension_data" in the extended server hello. - - c.sendAlert(alertUnexpectedMessage) - return errors.New("tls: received unexpected CertificateStatus message") - } - - c.ocspResponse = cs.response - - msg, err = c.readHandshake(&hs.finishedHash) - if err != nil { - return err - } - } - - if c.handshakes == 0 { - // If this is the first handshake on a connection, process and - // (optionally) verify the server's certificates. - if err := c.verifyServerCertificate(certMsg.certificates); err != nil { - return err - } - } else { - // This is a renegotiation handshake. We require that the - // server's identity (i.e. leaf certificate) is unchanged and - // thus any previous trust decision is still valid. - // - // See https://mitls.org/pages/attacks/3SHAKE for the - // motivation behind this requirement. - if !bytes.Equal(c.peerCertificates[0].Raw, certMsg.certificates[0]) { - c.sendAlert(alertBadCertificate) - return errors.New("tls: server's identity changed during renegotiation") - } - } - - keyAgreement := hs.suite.ka(c.vers) - - skx, ok := msg.(*serverKeyExchangeMsg) - if ok { - err = keyAgreement.processServerKeyExchange(c.config, hs.hello, hs.serverHello, c.peerCertificates[0], skx) - if err != nil { - c.sendAlert(alertUnexpectedMessage) - return err - } - - msg, err = c.readHandshake(&hs.finishedHash) - if err != nil { - return err - } - } - - var chainToSend *Certificate - var certRequested bool - certReq, ok := msg.(*certificateRequestMsg) - if ok { - certRequested = true - - cri := certificateRequestInfoFromMsg(hs.ctx, c.vers, certReq) - if chainToSend, err = c.getClientCertificate(cri); err != nil { - c.sendAlert(alertInternalError) - return err - } - - msg, err = c.readHandshake(&hs.finishedHash) - if err != nil { - return err - } - } - - shd, ok := msg.(*serverHelloDoneMsg) - if !ok { - c.sendAlert(alertUnexpectedMessage) - return unexpectedMessageError(shd, msg) - } - - // If the server requested a certificate then we have to send a - // Certificate message, even if it's empty because we don't have a - // certificate to send. - if certRequested { - certMsg = new(certificateMsg) - certMsg.certificates = chainToSend.Certificate - if _, err := hs.c.writeHandshakeRecord(certMsg, &hs.finishedHash); err != nil { - return err - } - } - - preMasterSecret, ckx, err := keyAgreement.generateClientKeyExchange(c.config, hs.hello, c.peerCertificates[0]) - if err != nil { - c.sendAlert(alertInternalError) - return err - } - if ckx != nil { - if _, err := hs.c.writeHandshakeRecord(ckx, &hs.finishedHash); err != nil { - return err - } - } - - if chainToSend != nil && len(chainToSend.Certificate) > 0 { - certVerify := &certificateVerifyMsg{} - - key, ok := chainToSend.PrivateKey.(crypto.Signer) - if !ok { - c.sendAlert(alertInternalError) - return fmt.Errorf("tls: client certificate private key of type %T does not implement crypto.Signer", chainToSend.PrivateKey) - } - - var sigType uint8 - var sigHash crypto.Hash - if c.vers >= VersionTLS12 { - signatureAlgorithm, err := selectSignatureScheme(c.vers, chainToSend, certReq.supportedSignatureAlgorithms) - if err != nil { - c.sendAlert(alertIllegalParameter) - return err - } - sigType, sigHash, err = typeAndHashFromSignatureScheme(signatureAlgorithm) - if err != nil { - return c.sendAlert(alertInternalError) - } - certVerify.hasSignatureAlgorithm = true - certVerify.signatureAlgorithm = signatureAlgorithm - } else { - sigType, sigHash, err = legacyTypeAndHashFromPublicKey(key.Public()) - if err != nil { - c.sendAlert(alertIllegalParameter) - return err - } - } - - signed := hs.finishedHash.hashForClientCertificate(sigType, sigHash) - signOpts := crypto.SignerOpts(sigHash) - if sigType == signatureRSAPSS { - signOpts = &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash, Hash: sigHash} - } - certVerify.signature, err = key.Sign(c.config.rand(), signed, signOpts) - if err != nil { - c.sendAlert(alertInternalError) - return err - } - - if _, err := hs.c.writeHandshakeRecord(certVerify, &hs.finishedHash); err != nil { - return err - } - } - - hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.hello.random, hs.serverHello.random) - if err := c.config.writeKeyLog(keyLogLabelTLS12, hs.hello.random, hs.masterSecret); err != nil { - c.sendAlert(alertInternalError) - return errors.New("tls: failed to write to key log: " + err.Error()) - } - - hs.finishedHash.discardHandshakeBuffer() - - return nil -} - -func (hs *clientHandshakeState) establishKeys() error { - c := hs.c - - clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV := - keysFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.hello.random, hs.serverHello.random, hs.suite.macLen, hs.suite.keyLen, hs.suite.ivLen) - var clientCipher, serverCipher any - var clientHash, serverHash hash.Hash - if hs.suite.cipher != nil { - clientCipher = hs.suite.cipher(clientKey, clientIV, false /* not for reading */) - clientHash = hs.suite.mac(clientMAC) - serverCipher = hs.suite.cipher(serverKey, serverIV, true /* for reading */) - serverHash = hs.suite.mac(serverMAC) - } else { - clientCipher = hs.suite.aead(clientKey, clientIV) - serverCipher = hs.suite.aead(serverKey, serverIV) - } - - c.in.prepareCipherSpec(c.vers, serverCipher, serverHash) - c.out.prepareCipherSpec(c.vers, clientCipher, clientHash) - return nil -} - -func (hs *clientHandshakeState) serverResumedSession() bool { - // If the server responded with the same sessionId then it means the - // sessionTicket is being used to resume a TLS session. - return hs.session != nil && hs.hello.sessionId != nil && - bytes.Equal(hs.serverHello.sessionId, hs.hello.sessionId) -} - -func (hs *clientHandshakeState) processServerHello() (bool, error) { - c := hs.c - - if err := hs.pickCipherSuite(); err != nil { - return false, err - } - - if hs.serverHello.compressionMethod != compressionNone { - c.sendAlert(alertUnexpectedMessage) - return false, errors.New("tls: server selected unsupported compression format") - } - - if c.handshakes == 0 && hs.serverHello.secureRenegotiationSupported { - c.secureRenegotiation = true - if len(hs.serverHello.secureRenegotiation) != 0 { - c.sendAlert(alertHandshakeFailure) - return false, errors.New("tls: initial handshake had non-empty renegotiation extension") - } - } - - if c.handshakes > 0 && c.secureRenegotiation { - var expectedSecureRenegotiation [24]byte - copy(expectedSecureRenegotiation[:], c.clientFinished[:]) - copy(expectedSecureRenegotiation[12:], c.serverFinished[:]) - if !bytes.Equal(hs.serverHello.secureRenegotiation, expectedSecureRenegotiation[:]) { - c.sendAlert(alertHandshakeFailure) - return false, errors.New("tls: incorrect renegotiation extension contents") - } - } - - if err := checkALPN(hs.hello.alpnProtocols, hs.serverHello.alpnProtocol, false); err != nil { - c.sendAlert(alertUnsupportedExtension) - return false, err - } - c.clientProtocol = hs.serverHello.alpnProtocol - - c.scts = hs.serverHello.scts - - if !hs.serverResumedSession() { - return false, nil - } - - if hs.session.vers != c.vers { - c.sendAlert(alertHandshakeFailure) - return false, errors.New("tls: server resumed a session with a different version") - } - - if hs.session.cipherSuite != hs.suite.id { - c.sendAlert(alertHandshakeFailure) - return false, errors.New("tls: server resumed a session with a different cipher suite") - } - - // Restore masterSecret, peerCerts, and ocspResponse from previous state - hs.masterSecret = hs.session.masterSecret - c.peerCertificates = hs.session.serverCertificates - c.verifiedChains = hs.session.verifiedChains - c.ocspResponse = hs.session.ocspResponse - // Let the ServerHello SCTs override the session SCTs from the original - // connection, if any are provided - if len(c.scts) == 0 && len(hs.session.scts) != 0 { - c.scts = hs.session.scts - } - - return true, nil -} - -// checkALPN ensure that the server's choice of ALPN protocol is compatible with -// the protocols that we advertised in the Client Hello. -func checkALPN(clientProtos []string, serverProto string, quic bool) error { - if serverProto == "" { - if quic && len(clientProtos) > 0 { - // RFC 9001, Section 8.1 - return errors.New("tls: server did not select an ALPN protocol") - } - return nil - } - if len(clientProtos) == 0 { - return errors.New("tls: server advertised unrequested ALPN extension") - } - for _, proto := range clientProtos { - if proto == serverProto { - return nil - } - } - return errors.New("tls: server selected unadvertised ALPN protocol") -} - -func (hs *clientHandshakeState) readFinished(out []byte) error { - c := hs.c - - if err := c.readChangeCipherSpec(); err != nil { - return err - } - - // finishedMsg is included in the transcript, but not until after we - // check the client version, since the state before this message was - // sent is used during verification. - msg, err := c.readHandshake(nil) - if err != nil { - return err - } - serverFinished, ok := msg.(*finishedMsg) - if !ok { - c.sendAlert(alertUnexpectedMessage) - return unexpectedMessageError(serverFinished, msg) - } - - verify := hs.finishedHash.serverSum(hs.masterSecret) - if len(verify) != len(serverFinished.verifyData) || - subtle.ConstantTimeCompare(verify, serverFinished.verifyData) != 1 { - c.sendAlert(alertHandshakeFailure) - return errors.New("tls: server's Finished message was incorrect") - } - - if err := transcriptMsg(serverFinished, &hs.finishedHash); err != nil { - return err - } - - copy(out, verify) - return nil -} - -func (hs *clientHandshakeState) readSessionTicket() error { - if !hs.serverHello.ticketSupported { - return nil - } - - c := hs.c - msg, err := c.readHandshake(&hs.finishedHash) - if err != nil { - return err - } - sessionTicketMsg, ok := msg.(*newSessionTicketMsg) - if !ok { - c.sendAlert(alertUnexpectedMessage) - return unexpectedMessageError(sessionTicketMsg, msg) - } - - hs.session = &clientSessionState{ - sessionTicket: sessionTicketMsg.ticket, - vers: c.vers, - cipherSuite: hs.suite.id, - masterSecret: hs.masterSecret, - serverCertificates: c.peerCertificates, - verifiedChains: c.verifiedChains, - receivedAt: c.config.time(), - ocspResponse: c.ocspResponse, - scts: c.scts, - } - - return nil -} - -func (hs *clientHandshakeState) sendFinished(out []byte) error { - c := hs.c - - if err := c.writeChangeCipherRecord(); err != nil { - return err - } - - finished := new(finishedMsg) - finished.verifyData = hs.finishedHash.clientSum(hs.masterSecret) - if _, err := hs.c.writeHandshakeRecord(finished, &hs.finishedHash); err != nil { - return err - } - copy(out, finished.verifyData) - return nil -} - -// maxRSAKeySize is the maximum RSA key size in bits that we are willing -// to verify the signatures of during a TLS handshake. -const maxRSAKeySize = 8192 - -// verifyServerCertificate parses and verifies the provided chain, setting -// c.verifiedChains and c.peerCertificates or sending the appropriate alert. -func (c *Conn) verifyServerCertificate(certificates [][]byte) error { - activeHandles := make([]*activeCert, len(certificates)) - certs := make([]*x509.Certificate, len(certificates)) - for i, asn1Data := range certificates { - cert, err := clientCertCache.newCert(asn1Data) - if err != nil { - c.sendAlert(alertBadCertificate) - return errors.New("tls: failed to parse certificate from server: " + err.Error()) - } - if cert.cert.PublicKeyAlgorithm == x509.RSA && cert.cert.PublicKey.(*rsa.PublicKey).N.BitLen() > maxRSAKeySize { - c.sendAlert(alertBadCertificate) - return fmt.Errorf("tls: server sent certificate containing RSA key larger than %d bits", maxRSAKeySize) - } - activeHandles[i] = cert - certs[i] = cert.cert - } - - if !c.config.InsecureSkipVerify { - opts := x509.VerifyOptions{ - Roots: c.config.RootCAs, - CurrentTime: c.config.time(), - DNSName: c.config.ServerName, - Intermediates: x509.NewCertPool(), - } - - for _, cert := range certs[1:] { - opts.Intermediates.AddCert(cert) - } - var err error - c.verifiedChains, err = certs[0].Verify(opts) - if err != nil { - c.sendAlert(alertBadCertificate) - return &CertificateVerificationError{UnverifiedCertificates: certs, Err: err} - } - } - - switch certs[0].PublicKey.(type) { - case *rsa.PublicKey, *ecdsa.PublicKey, ed25519.PublicKey: - break - default: - c.sendAlert(alertUnsupportedCertificate) - return fmt.Errorf("tls: server's certificate contains an unsupported type of public key: %T", certs[0].PublicKey) - } - - c.activeCertHandles = activeHandles - c.peerCertificates = certs - - if c.config.VerifyPeerCertificate != nil { - if err := c.config.VerifyPeerCertificate(certificates, c.verifiedChains); err != nil { - c.sendAlert(alertBadCertificate) - return err - } - } - - if c.config.VerifyConnection != nil { - if err := c.config.VerifyConnection(c.connectionStateLocked()); err != nil { - c.sendAlert(alertBadCertificate) - return err - } - } - - return nil -} - -// certificateRequestInfoFromMsg generates a CertificateRequestInfo from a TLS -// <= 1.2 CertificateRequest, making an effort to fill in missing information. -func certificateRequestInfoFromMsg(ctx context.Context, vers uint16, certReq *certificateRequestMsg) *CertificateRequestInfo { - cri := &certificateRequestInfo{ - AcceptableCAs: certReq.certificateAuthorities, - Version: vers, - ctx: ctx, - } - - var rsaAvail, ecAvail bool - for _, certType := range certReq.certificateTypes { - switch certType { - case certTypeRSASign: - rsaAvail = true - case certTypeECDSASign: - ecAvail = true - } - } - - if !certReq.hasSignatureAlgorithm { - // Prior to TLS 1.2, signature schemes did not exist. In this case we - // make up a list based on the acceptable certificate types, to help - // GetClientCertificate and SupportsCertificate select the right certificate. - // The hash part of the SignatureScheme is a lie here, because - // TLS 1.0 and 1.1 always use MD5+SHA1 for RSA and SHA1 for ECDSA. - switch { - case rsaAvail && ecAvail: - cri.SignatureSchemes = []SignatureScheme{ - ECDSAWithP256AndSHA256, ECDSAWithP384AndSHA384, ECDSAWithP521AndSHA512, - PKCS1WithSHA256, PKCS1WithSHA384, PKCS1WithSHA512, PKCS1WithSHA1, - } - case rsaAvail: - cri.SignatureSchemes = []SignatureScheme{ - PKCS1WithSHA256, PKCS1WithSHA384, PKCS1WithSHA512, PKCS1WithSHA1, - } - case ecAvail: - cri.SignatureSchemes = []SignatureScheme{ - ECDSAWithP256AndSHA256, ECDSAWithP384AndSHA384, ECDSAWithP521AndSHA512, - } - } - return toCertificateRequestInfo(cri) - } - - // Filter the signature schemes based on the certificate types. - // See RFC 5246, Section 7.4.4 (where it calls this "somewhat complicated"). - cri.SignatureSchemes = make([]SignatureScheme, 0, len(certReq.supportedSignatureAlgorithms)) - for _, sigScheme := range certReq.supportedSignatureAlgorithms { - sigType, _, err := typeAndHashFromSignatureScheme(sigScheme) - if err != nil { - continue - } - switch sigType { - case signatureECDSA, signatureEd25519: - if ecAvail { - cri.SignatureSchemes = append(cri.SignatureSchemes, sigScheme) - } - case signatureRSAPSS, signaturePKCS1v15: - if rsaAvail { - cri.SignatureSchemes = append(cri.SignatureSchemes, sigScheme) - } - } - } - - return toCertificateRequestInfo(cri) -} - -func (c *Conn) getClientCertificate(cri *CertificateRequestInfo) (*Certificate, error) { - if c.config.GetClientCertificate != nil { - return c.config.GetClientCertificate(cri) - } - - for _, chain := range c.config.Certificates { - if err := cri.SupportsCertificate(&chain); err != nil { - continue - } - return &chain, nil - } - - // No acceptable certificate found. Don't send a certificate. - return new(Certificate), nil -} - -// clientSessionCacheKey returns a key used to cache sessionTickets that could -// be used to resume previously negotiated TLS sessions with a server. -func (c *Conn) clientSessionCacheKey() string { - if len(c.config.ServerName) > 0 { - return c.config.ServerName - } - if c.conn != nil { - return c.conn.RemoteAddr().String() - } - return "" -} - -// hostnameInSNI converts name into an appropriate hostname for SNI. -// Literal IP addresses and absolute FQDNs are not permitted as SNI values. -// See RFC 6066, Section 3. -func hostnameInSNI(name string) string { - host := name - if len(host) > 0 && host[0] == '[' && host[len(host)-1] == ']' { - host = host[1 : len(host)-1] - } - if i := strings.LastIndex(host, "%"); i > 0 { - host = host[:i] - } - if net.ParseIP(host) != nil { - return "" - } - for len(name) > 0 && name[len(name)-1] == '.' { - name = name[:len(name)-1] - } - return name -} diff --git a/vendor/github.com/quic-go/qtls-go1-20/handshake_client_tls13.go b/vendor/github.com/quic-go/qtls-go1-20/handshake_client_tls13.go deleted file mode 100644 index e9d0a533e..000000000 --- a/vendor/github.com/quic-go/qtls-go1-20/handshake_client_tls13.go +++ /dev/null @@ -1,782 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package qtls - -import ( - "bytes" - "context" - "crypto" - "crypto/ecdh" - "crypto/hmac" - "crypto/rsa" - "encoding/binary" - "errors" - "hash" - "time" - - "golang.org/x/crypto/cryptobyte" -) - -type clientHandshakeStateTLS13 struct { - c *Conn - ctx context.Context - serverHello *serverHelloMsg - hello *clientHelloMsg - ecdheKey *ecdh.PrivateKey - - session *clientSessionState - earlySecret []byte - binderKey []byte - - certReq *certificateRequestMsgTLS13 - usingPSK bool - sentDummyCCS bool - suite *cipherSuiteTLS13 - transcript hash.Hash - masterSecret []byte - trafficSecret []byte // client_application_traffic_secret_0 -} - -// handshake requires hs.c, hs.hello, hs.serverHello, hs.ecdheKey, and, -// optionally, hs.session, hs.earlySecret and hs.binderKey to be set. -func (hs *clientHandshakeStateTLS13) handshake() error { - c := hs.c - - if needFIPS() { - return errors.New("tls: internal error: TLS 1.3 reached in FIPS mode") - } - - // The server must not select TLS 1.3 in a renegotiation. See RFC 8446, - // sections 4.1.2 and 4.1.3. - if c.handshakes > 0 { - c.sendAlert(alertProtocolVersion) - return errors.New("tls: server selected TLS 1.3 in a renegotiation") - } - - // Consistency check on the presence of a keyShare and its parameters. - if hs.ecdheKey == nil || len(hs.hello.keyShares) != 1 { - return c.sendAlert(alertInternalError) - } - - if err := hs.checkServerHelloOrHRR(); err != nil { - return err - } - - hs.transcript = hs.suite.hash.New() - - if err := transcriptMsg(hs.hello, hs.transcript); err != nil { - return err - } - - if bytes.Equal(hs.serverHello.random, helloRetryRequestRandom) { - if err := hs.sendDummyChangeCipherSpec(); err != nil { - return err - } - if err := hs.processHelloRetryRequest(); err != nil { - return err - } - } - - if err := transcriptMsg(hs.serverHello, hs.transcript); err != nil { - return err - } - - c.buffering = true - if err := hs.processServerHello(); err != nil { - return err - } - if err := hs.sendDummyChangeCipherSpec(); err != nil { - return err - } - if err := hs.establishHandshakeKeys(); err != nil { - return err - } - if err := hs.readServerParameters(); err != nil { - return err - } - if err := hs.readServerCertificate(); err != nil { - return err - } - if err := hs.readServerFinished(); err != nil { - return err - } - if err := hs.sendClientCertificate(); err != nil { - return err - } - if err := hs.sendClientFinished(); err != nil { - return err - } - if _, err := c.flush(); err != nil { - return err - } - - c.isHandshakeComplete.Store(true) - - return nil -} - -// checkServerHelloOrHRR does validity checks that apply to both ServerHello and -// HelloRetryRequest messages. It sets hs.suite. -func (hs *clientHandshakeStateTLS13) checkServerHelloOrHRR() error { - c := hs.c - - if hs.serverHello.supportedVersion == 0 { - c.sendAlert(alertMissingExtension) - return errors.New("tls: server selected TLS 1.3 using the legacy version field") - } - - if hs.serverHello.supportedVersion != VersionTLS13 { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: server selected an invalid version after a HelloRetryRequest") - } - - if hs.serverHello.vers != VersionTLS12 { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: server sent an incorrect legacy version") - } - - if hs.serverHello.ocspStapling || - hs.serverHello.ticketSupported || - hs.serverHello.secureRenegotiationSupported || - len(hs.serverHello.secureRenegotiation) != 0 || - len(hs.serverHello.alpnProtocol) != 0 || - len(hs.serverHello.scts) != 0 { - c.sendAlert(alertUnsupportedExtension) - return errors.New("tls: server sent a ServerHello extension forbidden in TLS 1.3") - } - - if !bytes.Equal(hs.hello.sessionId, hs.serverHello.sessionId) { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: server did not echo the legacy session ID") - } - - if hs.serverHello.compressionMethod != compressionNone { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: server selected unsupported compression format") - } - - selectedSuite := mutualCipherSuiteTLS13(hs.hello.cipherSuites, hs.serverHello.cipherSuite) - if hs.suite != nil && selectedSuite != hs.suite { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: server changed cipher suite after a HelloRetryRequest") - } - if selectedSuite == nil { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: server chose an unconfigured cipher suite") - } - hs.suite = selectedSuite - c.cipherSuite = hs.suite.id - - return nil -} - -// sendDummyChangeCipherSpec sends a ChangeCipherSpec record for compatibility -// with middleboxes that didn't implement TLS correctly. See RFC 8446, Appendix D.4. -func (hs *clientHandshakeStateTLS13) sendDummyChangeCipherSpec() error { - if hs.c.quic != nil { - return nil - } - if hs.sentDummyCCS { - return nil - } - hs.sentDummyCCS = true - - return hs.c.writeChangeCipherRecord() -} - -// processHelloRetryRequest handles the HRR in hs.serverHello, modifies and -// resends hs.hello, and reads the new ServerHello into hs.serverHello. -func (hs *clientHandshakeStateTLS13) processHelloRetryRequest() error { - c := hs.c - - // The first ClientHello gets double-hashed into the transcript upon a - // HelloRetryRequest. (The idea is that the server might offload transcript - // storage to the client in the cookie.) See RFC 8446, Section 4.4.1. - chHash := hs.transcript.Sum(nil) - hs.transcript.Reset() - hs.transcript.Write([]byte{typeMessageHash, 0, 0, uint8(len(chHash))}) - hs.transcript.Write(chHash) - if err := transcriptMsg(hs.serverHello, hs.transcript); err != nil { - return err - } - - // The only HelloRetryRequest extensions we support are key_share and - // cookie, and clients must abort the handshake if the HRR would not result - // in any change in the ClientHello. - if hs.serverHello.selectedGroup == 0 && hs.serverHello.cookie == nil { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: server sent an unnecessary HelloRetryRequest message") - } - - if hs.serverHello.cookie != nil { - hs.hello.cookie = hs.serverHello.cookie - } - - if hs.serverHello.serverShare.group != 0 { - c.sendAlert(alertDecodeError) - return errors.New("tls: received malformed key_share extension") - } - - // If the server sent a key_share extension selecting a group, ensure it's - // a group we advertised but did not send a key share for, and send a key - // share for it this time. - if curveID := hs.serverHello.selectedGroup; curveID != 0 { - curveOK := false - for _, id := range hs.hello.supportedCurves { - if id == curveID { - curveOK = true - break - } - } - if !curveOK { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: server selected unsupported group") - } - if sentID, _ := curveIDForCurve(hs.ecdheKey.Curve()); sentID == curveID { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: server sent an unnecessary HelloRetryRequest key_share") - } - if _, ok := curveForCurveID(curveID); !ok { - c.sendAlert(alertInternalError) - return errors.New("tls: CurvePreferences includes unsupported curve") - } - key, err := generateECDHEKey(c.config.rand(), curveID) - if err != nil { - c.sendAlert(alertInternalError) - return err - } - hs.ecdheKey = key - hs.hello.keyShares = []keyShare{{group: curveID, data: key.PublicKey().Bytes()}} - } - - hs.hello.raw = nil - if len(hs.hello.pskIdentities) > 0 { - pskSuite := cipherSuiteTLS13ByID(hs.session.cipherSuite) - if pskSuite == nil { - return c.sendAlert(alertInternalError) - } - if pskSuite.hash == hs.suite.hash { - // Update binders and obfuscated_ticket_age. - ticketAge := uint32(c.config.time().Sub(hs.session.receivedAt) / time.Millisecond) - hs.hello.pskIdentities[0].obfuscatedTicketAge = ticketAge + hs.session.ageAdd - - transcript := hs.suite.hash.New() - transcript.Write([]byte{typeMessageHash, 0, 0, uint8(len(chHash))}) - transcript.Write(chHash) - if err := transcriptMsg(hs.serverHello, transcript); err != nil { - return err - } - helloBytes, err := hs.hello.marshalWithoutBinders() - if err != nil { - return err - } - transcript.Write(helloBytes) - pskBinders := [][]byte{hs.suite.finishedHash(hs.binderKey, transcript)} - if err := hs.hello.updateBinders(pskBinders); err != nil { - return err - } - } else { - // Server selected a cipher suite incompatible with the PSK. - hs.hello.pskIdentities = nil - hs.hello.pskBinders = nil - } - } - - if hs.hello.earlyData { - hs.hello.earlyData = false - c.quicRejectedEarlyData() - } - - if _, err := hs.c.writeHandshakeRecord(hs.hello, hs.transcript); err != nil { - return err - } - - // serverHelloMsg is not included in the transcript - msg, err := c.readHandshake(nil) - if err != nil { - return err - } - - serverHello, ok := msg.(*serverHelloMsg) - if !ok { - c.sendAlert(alertUnexpectedMessage) - return unexpectedMessageError(serverHello, msg) - } - hs.serverHello = serverHello - - if err := hs.checkServerHelloOrHRR(); err != nil { - return err - } - - return nil -} - -func (hs *clientHandshakeStateTLS13) processServerHello() error { - c := hs.c - - if bytes.Equal(hs.serverHello.random, helloRetryRequestRandom) { - c.sendAlert(alertUnexpectedMessage) - return errors.New("tls: server sent two HelloRetryRequest messages") - } - - if len(hs.serverHello.cookie) != 0 { - c.sendAlert(alertUnsupportedExtension) - return errors.New("tls: server sent a cookie in a normal ServerHello") - } - - if hs.serverHello.selectedGroup != 0 { - c.sendAlert(alertDecodeError) - return errors.New("tls: malformed key_share extension") - } - - if hs.serverHello.serverShare.group == 0 { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: server did not send a key share") - } - if sentID, _ := curveIDForCurve(hs.ecdheKey.Curve()); hs.serverHello.serverShare.group != sentID { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: server selected unsupported group") - } - - if !hs.serverHello.selectedIdentityPresent { - return nil - } - - if int(hs.serverHello.selectedIdentity) >= len(hs.hello.pskIdentities) { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: server selected an invalid PSK") - } - - if len(hs.hello.pskIdentities) != 1 || hs.session == nil { - return c.sendAlert(alertInternalError) - } - pskSuite := cipherSuiteTLS13ByID(hs.session.cipherSuite) - if pskSuite == nil { - return c.sendAlert(alertInternalError) - } - if pskSuite.hash != hs.suite.hash { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: server selected an invalid PSK and cipher suite pair") - } - - hs.usingPSK = true - c.didResume = true - c.peerCertificates = hs.session.serverCertificates - c.verifiedChains = hs.session.verifiedChains - c.ocspResponse = hs.session.ocspResponse - c.scts = hs.session.scts - return nil -} - -func (hs *clientHandshakeStateTLS13) establishHandshakeKeys() error { - c := hs.c - - peerKey, err := hs.ecdheKey.Curve().NewPublicKey(hs.serverHello.serverShare.data) - if err != nil { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: invalid server key share") - } - sharedKey, err := hs.ecdheKey.ECDH(peerKey) - if err != nil { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: invalid server key share") - } - - earlySecret := hs.earlySecret - if !hs.usingPSK { - earlySecret = hs.suite.extract(nil, nil) - } - - handshakeSecret := hs.suite.extract(sharedKey, - hs.suite.deriveSecret(earlySecret, "derived", nil)) - - clientSecret := hs.suite.deriveSecret(handshakeSecret, - clientHandshakeTrafficLabel, hs.transcript) - c.out.setTrafficSecret(hs.suite, QUICEncryptionLevelHandshake, clientSecret) - serverSecret := hs.suite.deriveSecret(handshakeSecret, - serverHandshakeTrafficLabel, hs.transcript) - c.in.setTrafficSecret(hs.suite, QUICEncryptionLevelHandshake, serverSecret) - - if c.quic != nil { - if c.hand.Len() != 0 { - c.sendAlert(alertUnexpectedMessage) - } - c.quicSetWriteSecret(QUICEncryptionLevelHandshake, hs.suite.id, clientSecret) - c.quicSetReadSecret(QUICEncryptionLevelHandshake, hs.suite.id, serverSecret) - } - - err = c.config.writeKeyLog(keyLogLabelClientHandshake, hs.hello.random, clientSecret) - if err != nil { - c.sendAlert(alertInternalError) - return err - } - err = c.config.writeKeyLog(keyLogLabelServerHandshake, hs.hello.random, serverSecret) - if err != nil { - c.sendAlert(alertInternalError) - return err - } - - hs.masterSecret = hs.suite.extract(nil, - hs.suite.deriveSecret(handshakeSecret, "derived", nil)) - - return nil -} - -func (hs *clientHandshakeStateTLS13) readServerParameters() error { - c := hs.c - - msg, err := c.readHandshake(hs.transcript) - if err != nil { - return err - } - - encryptedExtensions, ok := msg.(*encryptedExtensionsMsg) - if !ok { - c.sendAlert(alertUnexpectedMessage) - return unexpectedMessageError(encryptedExtensions, msg) - } - - if err := checkALPN(hs.hello.alpnProtocols, encryptedExtensions.alpnProtocol, c.quic != nil); err != nil { - // RFC 8446 specifies that no_application_protocol is sent by servers, but - // does not specify how clients handle the selection of an incompatible protocol. - // RFC 9001 Section 8.1 specifies that QUIC clients send no_application_protocol - // in this case. Always sending no_application_protocol seems reasonable. - c.sendAlert(alertNoApplicationProtocol) - return err - } - c.clientProtocol = encryptedExtensions.alpnProtocol - - if c.quic != nil { - if encryptedExtensions.quicTransportParameters == nil { - // RFC 9001 Section 8.2. - c.sendAlert(alertMissingExtension) - return errors.New("tls: server did not send a quic_transport_parameters extension") - } - c.quicSetTransportParameters(encryptedExtensions.quicTransportParameters) - } else { - if encryptedExtensions.quicTransportParameters != nil { - c.sendAlert(alertUnsupportedExtension) - return errors.New("tls: server sent an unexpected quic_transport_parameters extension") - } - } - - if hs.hello.earlyData && !encryptedExtensions.earlyData { - c.quicRejectedEarlyData() - } - - return nil -} - -func (hs *clientHandshakeStateTLS13) readServerCertificate() error { - c := hs.c - - // Either a PSK or a certificate is always used, but not both. - // See RFC 8446, Section 4.1.1. - if hs.usingPSK { - // Make sure the connection is still being verified whether or not this - // is a resumption. Resumptions currently don't reverify certificates so - // they don't call verifyServerCertificate. See Issue 31641. - if c.config.VerifyConnection != nil { - if err := c.config.VerifyConnection(c.connectionStateLocked()); err != nil { - c.sendAlert(alertBadCertificate) - return err - } - } - return nil - } - - msg, err := c.readHandshake(hs.transcript) - if err != nil { - return err - } - - certReq, ok := msg.(*certificateRequestMsgTLS13) - if ok { - hs.certReq = certReq - - msg, err = c.readHandshake(hs.transcript) - if err != nil { - return err - } - } - - certMsg, ok := msg.(*certificateMsgTLS13) - if !ok { - c.sendAlert(alertUnexpectedMessage) - return unexpectedMessageError(certMsg, msg) - } - if len(certMsg.certificate.Certificate) == 0 { - c.sendAlert(alertDecodeError) - return errors.New("tls: received empty certificates message") - } - - c.scts = certMsg.certificate.SignedCertificateTimestamps - c.ocspResponse = certMsg.certificate.OCSPStaple - - if err := c.verifyServerCertificate(certMsg.certificate.Certificate); err != nil { - return err - } - - // certificateVerifyMsg is included in the transcript, but not until - // after we verify the handshake signature, since the state before - // this message was sent is used. - msg, err = c.readHandshake(nil) - if err != nil { - return err - } - - certVerify, ok := msg.(*certificateVerifyMsg) - if !ok { - c.sendAlert(alertUnexpectedMessage) - return unexpectedMessageError(certVerify, msg) - } - - // See RFC 8446, Section 4.4.3. - if !isSupportedSignatureAlgorithm(certVerify.signatureAlgorithm, supportedSignatureAlgorithms()) { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: certificate used with invalid signature algorithm") - } - sigType, sigHash, err := typeAndHashFromSignatureScheme(certVerify.signatureAlgorithm) - if err != nil { - return c.sendAlert(alertInternalError) - } - if sigType == signaturePKCS1v15 || sigHash == crypto.SHA1 { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: certificate used with invalid signature algorithm") - } - signed := signedMessage(sigHash, serverSignatureContext, hs.transcript) - if err := verifyHandshakeSignature(sigType, c.peerCertificates[0].PublicKey, - sigHash, signed, certVerify.signature); err != nil { - c.sendAlert(alertDecryptError) - return errors.New("tls: invalid signature by the server certificate: " + err.Error()) - } - - if err := transcriptMsg(certVerify, hs.transcript); err != nil { - return err - } - - return nil -} - -func (hs *clientHandshakeStateTLS13) readServerFinished() error { - c := hs.c - - // finishedMsg is included in the transcript, but not until after we - // check the client version, since the state before this message was - // sent is used during verification. - msg, err := c.readHandshake(nil) - if err != nil { - return err - } - - finished, ok := msg.(*finishedMsg) - if !ok { - c.sendAlert(alertUnexpectedMessage) - return unexpectedMessageError(finished, msg) - } - - expectedMAC := hs.suite.finishedHash(c.in.trafficSecret, hs.transcript) - if !hmac.Equal(expectedMAC, finished.verifyData) { - c.sendAlert(alertDecryptError) - return errors.New("tls: invalid server finished hash") - } - - if err := transcriptMsg(finished, hs.transcript); err != nil { - return err - } - - // Derive secrets that take context through the server Finished. - - hs.trafficSecret = hs.suite.deriveSecret(hs.masterSecret, - clientApplicationTrafficLabel, hs.transcript) - serverSecret := hs.suite.deriveSecret(hs.masterSecret, - serverApplicationTrafficLabel, hs.transcript) - c.in.setTrafficSecret(hs.suite, QUICEncryptionLevelApplication, serverSecret) - - err = c.config.writeKeyLog(keyLogLabelClientTraffic, hs.hello.random, hs.trafficSecret) - if err != nil { - c.sendAlert(alertInternalError) - return err - } - err = c.config.writeKeyLog(keyLogLabelServerTraffic, hs.hello.random, serverSecret) - if err != nil { - c.sendAlert(alertInternalError) - return err - } - - c.ekm = hs.suite.exportKeyingMaterial(hs.masterSecret, hs.transcript) - - return nil -} - -func (hs *clientHandshakeStateTLS13) sendClientCertificate() error { - c := hs.c - - if hs.certReq == nil { - return nil - } - - cert, err := c.getClientCertificate(toCertificateRequestInfo(&certificateRequestInfo{ - AcceptableCAs: hs.certReq.certificateAuthorities, - SignatureSchemes: hs.certReq.supportedSignatureAlgorithms, - Version: c.vers, - ctx: hs.ctx, - })) - if err != nil { - return err - } - - certMsg := new(certificateMsgTLS13) - - certMsg.certificate = *cert - certMsg.scts = hs.certReq.scts && len(cert.SignedCertificateTimestamps) > 0 - certMsg.ocspStapling = hs.certReq.ocspStapling && len(cert.OCSPStaple) > 0 - - if _, err := hs.c.writeHandshakeRecord(certMsg, hs.transcript); err != nil { - return err - } - - // If we sent an empty certificate message, skip the CertificateVerify. - if len(cert.Certificate) == 0 { - return nil - } - - certVerifyMsg := new(certificateVerifyMsg) - certVerifyMsg.hasSignatureAlgorithm = true - - certVerifyMsg.signatureAlgorithm, err = selectSignatureScheme(c.vers, cert, hs.certReq.supportedSignatureAlgorithms) - if err != nil { - // getClientCertificate returned a certificate incompatible with the - // CertificateRequestInfo supported signature algorithms. - c.sendAlert(alertHandshakeFailure) - return err - } - - sigType, sigHash, err := typeAndHashFromSignatureScheme(certVerifyMsg.signatureAlgorithm) - if err != nil { - return c.sendAlert(alertInternalError) - } - - signed := signedMessage(sigHash, clientSignatureContext, hs.transcript) - signOpts := crypto.SignerOpts(sigHash) - if sigType == signatureRSAPSS { - signOpts = &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash, Hash: sigHash} - } - sig, err := cert.PrivateKey.(crypto.Signer).Sign(c.config.rand(), signed, signOpts) - if err != nil { - c.sendAlert(alertInternalError) - return errors.New("tls: failed to sign handshake: " + err.Error()) - } - certVerifyMsg.signature = sig - - if _, err := hs.c.writeHandshakeRecord(certVerifyMsg, hs.transcript); err != nil { - return err - } - - return nil -} - -func (hs *clientHandshakeStateTLS13) sendClientFinished() error { - c := hs.c - - finished := &finishedMsg{ - verifyData: hs.suite.finishedHash(c.out.trafficSecret, hs.transcript), - } - - if _, err := hs.c.writeHandshakeRecord(finished, hs.transcript); err != nil { - return err - } - - c.out.setTrafficSecret(hs.suite, QUICEncryptionLevelApplication, hs.trafficSecret) - - if !c.config.SessionTicketsDisabled && c.config.ClientSessionCache != nil { - c.resumptionSecret = hs.suite.deriveSecret(hs.masterSecret, - resumptionLabel, hs.transcript) - } - - if c.quic != nil { - if c.hand.Len() != 0 { - c.sendAlert(alertUnexpectedMessage) - } - c.quicSetWriteSecret(QUICEncryptionLevelApplication, hs.suite.id, hs.trafficSecret) - } - - return nil -} - -func (c *Conn) handleNewSessionTicket(msg *newSessionTicketMsgTLS13) error { - if !c.isClient { - c.sendAlert(alertUnexpectedMessage) - return errors.New("tls: received new session ticket from a client") - } - - if c.config.SessionTicketsDisabled || c.config.ClientSessionCache == nil { - return nil - } - - // See RFC 8446, Section 4.6.1. - if msg.lifetime == 0 { - return nil - } - lifetime := time.Duration(msg.lifetime) * time.Second - if lifetime > maxSessionTicketLifetime { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: received a session ticket with invalid lifetime") - } - - cipherSuite := cipherSuiteTLS13ByID(c.cipherSuite) - if cipherSuite == nil || c.resumptionSecret == nil { - return c.sendAlert(alertInternalError) - } - - // We need to save the max_early_data_size that the server sent us, in order - // to decide if we're going to try 0-RTT with this ticket. - // However, at the same time, the qtls.ClientSessionTicket needs to be equal to - // the tls.ClientSessionTicket, so we can't just add a new field to the struct. - // We therefore abuse the nonce field (which is a byte slice) - nonceWithEarlyData := make([]byte, len(msg.nonce)+4) - binary.BigEndian.PutUint32(nonceWithEarlyData, msg.maxEarlyData) - copy(nonceWithEarlyData[4:], msg.nonce) - - var appData []byte - if c.extraConfig != nil && c.extraConfig.GetAppDataForSessionState != nil { - appData = c.extraConfig.GetAppDataForSessionState() - } - var b cryptobyte.Builder - b.AddUint16(clientSessionStateVersion) // revision - b.AddUint32(msg.maxEarlyData) - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(appData) - }) - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(msg.nonce) - }) - - // Save the resumption_master_secret and nonce instead of deriving the PSK - // to do the least amount of work on NewSessionTicket messages before we - // know if the ticket will be used. Forward secrecy of resumed connections - // is guaranteed by the requirement for pskModeDHE. - session := &clientSessionState{ - sessionTicket: msg.label, - vers: c.vers, - cipherSuite: c.cipherSuite, - masterSecret: c.resumptionSecret, - serverCertificates: c.peerCertificates, - verifiedChains: c.verifiedChains, - receivedAt: c.config.time(), - nonce: b.BytesOrPanic(), - useBy: c.config.time().Add(lifetime), - ageAdd: msg.ageAdd, - ocspResponse: c.ocspResponse, - scts: c.scts, - } - - cacheKey := c.clientSessionCacheKey() - if cacheKey != "" { - c.config.ClientSessionCache.Put(cacheKey, toClientSessionState(session)) - } - - return nil -} diff --git a/vendor/github.com/quic-go/qtls-go1-20/handshake_messages.go b/vendor/github.com/quic-go/qtls-go1-20/handshake_messages.go deleted file mode 100644 index 37b012363..000000000 --- a/vendor/github.com/quic-go/qtls-go1-20/handshake_messages.go +++ /dev/null @@ -1,1886 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package qtls - -import ( - "errors" - "fmt" - "strings" - - "golang.org/x/crypto/cryptobyte" -) - -// The marshalingFunction type is an adapter to allow the use of ordinary -// functions as cryptobyte.MarshalingValue. -type marshalingFunction func(b *cryptobyte.Builder) error - -func (f marshalingFunction) Marshal(b *cryptobyte.Builder) error { - return f(b) -} - -// addBytesWithLength appends a sequence of bytes to the cryptobyte.Builder. If -// the length of the sequence is not the value specified, it produces an error. -func addBytesWithLength(b *cryptobyte.Builder, v []byte, n int) { - b.AddValue(marshalingFunction(func(b *cryptobyte.Builder) error { - if len(v) != n { - return fmt.Errorf("invalid value length: expected %d, got %d", n, len(v)) - } - b.AddBytes(v) - return nil - })) -} - -// addUint64 appends a big-endian, 64-bit value to the cryptobyte.Builder. -func addUint64(b *cryptobyte.Builder, v uint64) { - b.AddUint32(uint32(v >> 32)) - b.AddUint32(uint32(v)) -} - -// readUint64 decodes a big-endian, 64-bit value into out and advances over it. -// It reports whether the read was successful. -func readUint64(s *cryptobyte.String, out *uint64) bool { - var hi, lo uint32 - if !s.ReadUint32(&hi) || !s.ReadUint32(&lo) { - return false - } - *out = uint64(hi)<<32 | uint64(lo) - return true -} - -// readUint8LengthPrefixed acts like s.ReadUint8LengthPrefixed, but targets a -// []byte instead of a cryptobyte.String. -func readUint8LengthPrefixed(s *cryptobyte.String, out *[]byte) bool { - return s.ReadUint8LengthPrefixed((*cryptobyte.String)(out)) -} - -// readUint16LengthPrefixed acts like s.ReadUint16LengthPrefixed, but targets a -// []byte instead of a cryptobyte.String. -func readUint16LengthPrefixed(s *cryptobyte.String, out *[]byte) bool { - return s.ReadUint16LengthPrefixed((*cryptobyte.String)(out)) -} - -// readUint24LengthPrefixed acts like s.ReadUint24LengthPrefixed, but targets a -// []byte instead of a cryptobyte.String. -func readUint24LengthPrefixed(s *cryptobyte.String, out *[]byte) bool { - return s.ReadUint24LengthPrefixed((*cryptobyte.String)(out)) -} - -type clientHelloMsg struct { - raw []byte - vers uint16 - random []byte - sessionId []byte - cipherSuites []uint16 - compressionMethods []uint8 - serverName string - ocspStapling bool - supportedCurves []CurveID - supportedPoints []uint8 - ticketSupported bool - sessionTicket []uint8 - supportedSignatureAlgorithms []SignatureScheme - supportedSignatureAlgorithmsCert []SignatureScheme - secureRenegotiationSupported bool - secureRenegotiation []byte - alpnProtocols []string - scts bool - supportedVersions []uint16 - cookie []byte - keyShares []keyShare - earlyData bool - pskModes []uint8 - pskIdentities []pskIdentity - pskBinders [][]byte - quicTransportParameters []byte -} - -func (m *clientHelloMsg) marshal() ([]byte, error) { - if m.raw != nil { - return m.raw, nil - } - - var exts cryptobyte.Builder - if len(m.serverName) > 0 { - // RFC 6066, Section 3 - exts.AddUint16(extensionServerName) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint8(0) // name_type = host_name - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddBytes([]byte(m.serverName)) - }) - }) - }) - } - if m.ocspStapling { - // RFC 4366, Section 3.6 - exts.AddUint16(extensionStatusRequest) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint8(1) // status_type = ocsp - exts.AddUint16(0) // empty responder_id_list - exts.AddUint16(0) // empty request_extensions - }) - } - if len(m.supportedCurves) > 0 { - // RFC 4492, sections 5.1.1 and RFC 8446, Section 4.2.7 - exts.AddUint16(extensionSupportedCurves) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - for _, curve := range m.supportedCurves { - exts.AddUint16(uint16(curve)) - } - }) - }) - } - if len(m.supportedPoints) > 0 { - // RFC 4492, Section 5.1.2 - exts.AddUint16(extensionSupportedPoints) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddBytes(m.supportedPoints) - }) - }) - } - if m.ticketSupported { - // RFC 5077, Section 3.2 - exts.AddUint16(extensionSessionTicket) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddBytes(m.sessionTicket) - }) - } - if len(m.supportedSignatureAlgorithms) > 0 { - // RFC 5246, Section 7.4.1.4.1 - exts.AddUint16(extensionSignatureAlgorithms) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - for _, sigAlgo := range m.supportedSignatureAlgorithms { - exts.AddUint16(uint16(sigAlgo)) - } - }) - }) - } - if len(m.supportedSignatureAlgorithmsCert) > 0 { - // RFC 8446, Section 4.2.3 - exts.AddUint16(extensionSignatureAlgorithmsCert) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - for _, sigAlgo := range m.supportedSignatureAlgorithmsCert { - exts.AddUint16(uint16(sigAlgo)) - } - }) - }) - } - if m.secureRenegotiationSupported { - // RFC 5746, Section 3.2 - exts.AddUint16(extensionRenegotiationInfo) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddBytes(m.secureRenegotiation) - }) - }) - } - if len(m.alpnProtocols) > 0 { - // RFC 7301, Section 3.1 - exts.AddUint16(extensionALPN) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - for _, proto := range m.alpnProtocols { - exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddBytes([]byte(proto)) - }) - } - }) - }) - } - if m.scts { - // RFC 6962, Section 3.3.1 - exts.AddUint16(extensionSCT) - exts.AddUint16(0) // empty extension_data - } - if len(m.supportedVersions) > 0 { - // RFC 8446, Section 4.2.1 - exts.AddUint16(extensionSupportedVersions) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) { - for _, vers := range m.supportedVersions { - exts.AddUint16(vers) - } - }) - }) - } - if len(m.cookie) > 0 { - // RFC 8446, Section 4.2.2 - exts.AddUint16(extensionCookie) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddBytes(m.cookie) - }) - }) - } - if len(m.keyShares) > 0 { - // RFC 8446, Section 4.2.8 - exts.AddUint16(extensionKeyShare) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - for _, ks := range m.keyShares { - exts.AddUint16(uint16(ks.group)) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddBytes(ks.data) - }) - } - }) - }) - } - if m.earlyData { - // RFC 8446, Section 4.2.10 - exts.AddUint16(extensionEarlyData) - exts.AddUint16(0) // empty extension_data - } - if len(m.pskModes) > 0 { - // RFC 8446, Section 4.2.9 - exts.AddUint16(extensionPSKModes) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddBytes(m.pskModes) - }) - }) - } - if m.quicTransportParameters != nil { // marshal zero-length parameters when present - // RFC 9001, Section 8.2 - exts.AddUint16(extensionQUICTransportParameters) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddBytes(m.quicTransportParameters) - }) - } - if len(m.pskIdentities) > 0 { // pre_shared_key must be the last extension - // RFC 8446, Section 4.2.11 - exts.AddUint16(extensionPreSharedKey) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - for _, psk := range m.pskIdentities { - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddBytes(psk.label) - }) - exts.AddUint32(psk.obfuscatedTicketAge) - } - }) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - for _, binder := range m.pskBinders { - exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddBytes(binder) - }) - } - }) - }) - } - extBytes, err := exts.Bytes() - if err != nil { - return nil, err - } - - var b cryptobyte.Builder - b.AddUint8(typeClientHello) - b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddUint16(m.vers) - addBytesWithLength(b, m.random, 32) - b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(m.sessionId) - }) - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - for _, suite := range m.cipherSuites { - b.AddUint16(suite) - } - }) - b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(m.compressionMethods) - }) - - if len(extBytes) > 0 { - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(extBytes) - }) - } - }) - - m.raw, err = b.Bytes() - return m.raw, err -} - -// marshalWithoutBinders returns the ClientHello through the -// PreSharedKeyExtension.identities field, according to RFC 8446, Section -// 4.2.11.2. Note that m.pskBinders must be set to slices of the correct length. -func (m *clientHelloMsg) marshalWithoutBinders() ([]byte, error) { - bindersLen := 2 // uint16 length prefix - for _, binder := range m.pskBinders { - bindersLen += 1 // uint8 length prefix - bindersLen += len(binder) - } - - fullMessage, err := m.marshal() - if err != nil { - return nil, err - } - return fullMessage[:len(fullMessage)-bindersLen], nil -} - -// updateBinders updates the m.pskBinders field, if necessary updating the -// cached marshaled representation. The supplied binders must have the same -// length as the current m.pskBinders. -func (m *clientHelloMsg) updateBinders(pskBinders [][]byte) error { - if len(pskBinders) != len(m.pskBinders) { - return errors.New("tls: internal error: pskBinders length mismatch") - } - for i := range m.pskBinders { - if len(pskBinders[i]) != len(m.pskBinders[i]) { - return errors.New("tls: internal error: pskBinders length mismatch") - } - } - m.pskBinders = pskBinders - if m.raw != nil { - helloBytes, err := m.marshalWithoutBinders() - if err != nil { - return err - } - lenWithoutBinders := len(helloBytes) - b := cryptobyte.NewFixedBuilder(m.raw[:lenWithoutBinders]) - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - for _, binder := range m.pskBinders { - b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(binder) - }) - } - }) - if out, err := b.Bytes(); err != nil || len(out) != len(m.raw) { - return errors.New("tls: internal error: failed to update binders") - } - } - - return nil -} - -func (m *clientHelloMsg) unmarshal(data []byte) bool { - *m = clientHelloMsg{raw: data} - s := cryptobyte.String(data) - - if !s.Skip(4) || // message type and uint24 length field - !s.ReadUint16(&m.vers) || !s.ReadBytes(&m.random, 32) || - !readUint8LengthPrefixed(&s, &m.sessionId) { - return false - } - - var cipherSuites cryptobyte.String - if !s.ReadUint16LengthPrefixed(&cipherSuites) { - return false - } - m.cipherSuites = []uint16{} - m.secureRenegotiationSupported = false - for !cipherSuites.Empty() { - var suite uint16 - if !cipherSuites.ReadUint16(&suite) { - return false - } - if suite == scsvRenegotiation { - m.secureRenegotiationSupported = true - } - m.cipherSuites = append(m.cipherSuites, suite) - } - - if !readUint8LengthPrefixed(&s, &m.compressionMethods) { - return false - } - - if s.Empty() { - // ClientHello is optionally followed by extension data - return true - } - - var extensions cryptobyte.String - if !s.ReadUint16LengthPrefixed(&extensions) || !s.Empty() { - return false - } - - seenExts := make(map[uint16]bool) - for !extensions.Empty() { - var extension uint16 - var extData cryptobyte.String - if !extensions.ReadUint16(&extension) || - !extensions.ReadUint16LengthPrefixed(&extData) { - return false - } - - if seenExts[extension] { - return false - } - seenExts[extension] = true - - switch extension { - case extensionServerName: - // RFC 6066, Section 3 - var nameList cryptobyte.String - if !extData.ReadUint16LengthPrefixed(&nameList) || nameList.Empty() { - return false - } - for !nameList.Empty() { - var nameType uint8 - var serverName cryptobyte.String - if !nameList.ReadUint8(&nameType) || - !nameList.ReadUint16LengthPrefixed(&serverName) || - serverName.Empty() { - return false - } - if nameType != 0 { - continue - } - if len(m.serverName) != 0 { - // Multiple names of the same name_type are prohibited. - return false - } - m.serverName = string(serverName) - // An SNI value may not include a trailing dot. - if strings.HasSuffix(m.serverName, ".") { - return false - } - } - case extensionStatusRequest: - // RFC 4366, Section 3.6 - var statusType uint8 - var ignored cryptobyte.String - if !extData.ReadUint8(&statusType) || - !extData.ReadUint16LengthPrefixed(&ignored) || - !extData.ReadUint16LengthPrefixed(&ignored) { - return false - } - m.ocspStapling = statusType == statusTypeOCSP - case extensionSupportedCurves: - // RFC 4492, sections 5.1.1 and RFC 8446, Section 4.2.7 - var curves cryptobyte.String - if !extData.ReadUint16LengthPrefixed(&curves) || curves.Empty() { - return false - } - for !curves.Empty() { - var curve uint16 - if !curves.ReadUint16(&curve) { - return false - } - m.supportedCurves = append(m.supportedCurves, CurveID(curve)) - } - case extensionSupportedPoints: - // RFC 4492, Section 5.1.2 - if !readUint8LengthPrefixed(&extData, &m.supportedPoints) || - len(m.supportedPoints) == 0 { - return false - } - case extensionSessionTicket: - // RFC 5077, Section 3.2 - m.ticketSupported = true - extData.ReadBytes(&m.sessionTicket, len(extData)) - case extensionSignatureAlgorithms: - // RFC 5246, Section 7.4.1.4.1 - var sigAndAlgs cryptobyte.String - if !extData.ReadUint16LengthPrefixed(&sigAndAlgs) || sigAndAlgs.Empty() { - return false - } - for !sigAndAlgs.Empty() { - var sigAndAlg uint16 - if !sigAndAlgs.ReadUint16(&sigAndAlg) { - return false - } - m.supportedSignatureAlgorithms = append( - m.supportedSignatureAlgorithms, SignatureScheme(sigAndAlg)) - } - case extensionSignatureAlgorithmsCert: - // RFC 8446, Section 4.2.3 - var sigAndAlgs cryptobyte.String - if !extData.ReadUint16LengthPrefixed(&sigAndAlgs) || sigAndAlgs.Empty() { - return false - } - for !sigAndAlgs.Empty() { - var sigAndAlg uint16 - if !sigAndAlgs.ReadUint16(&sigAndAlg) { - return false - } - m.supportedSignatureAlgorithmsCert = append( - m.supportedSignatureAlgorithmsCert, SignatureScheme(sigAndAlg)) - } - case extensionRenegotiationInfo: - // RFC 5746, Section 3.2 - if !readUint8LengthPrefixed(&extData, &m.secureRenegotiation) { - return false - } - m.secureRenegotiationSupported = true - case extensionALPN: - // RFC 7301, Section 3.1 - var protoList cryptobyte.String - if !extData.ReadUint16LengthPrefixed(&protoList) || protoList.Empty() { - return false - } - for !protoList.Empty() { - var proto cryptobyte.String - if !protoList.ReadUint8LengthPrefixed(&proto) || proto.Empty() { - return false - } - m.alpnProtocols = append(m.alpnProtocols, string(proto)) - } - case extensionSCT: - // RFC 6962, Section 3.3.1 - m.scts = true - case extensionSupportedVersions: - // RFC 8446, Section 4.2.1 - var versList cryptobyte.String - if !extData.ReadUint8LengthPrefixed(&versList) || versList.Empty() { - return false - } - for !versList.Empty() { - var vers uint16 - if !versList.ReadUint16(&vers) { - return false - } - m.supportedVersions = append(m.supportedVersions, vers) - } - case extensionCookie: - // RFC 8446, Section 4.2.2 - if !readUint16LengthPrefixed(&extData, &m.cookie) || - len(m.cookie) == 0 { - return false - } - case extensionKeyShare: - // RFC 8446, Section 4.2.8 - var clientShares cryptobyte.String - if !extData.ReadUint16LengthPrefixed(&clientShares) { - return false - } - for !clientShares.Empty() { - var ks keyShare - if !clientShares.ReadUint16((*uint16)(&ks.group)) || - !readUint16LengthPrefixed(&clientShares, &ks.data) || - len(ks.data) == 0 { - return false - } - m.keyShares = append(m.keyShares, ks) - } - case extensionEarlyData: - // RFC 8446, Section 4.2.10 - m.earlyData = true - case extensionPSKModes: - // RFC 8446, Section 4.2.9 - if !readUint8LengthPrefixed(&extData, &m.pskModes) { - return false - } - case extensionQUICTransportParameters: - m.quicTransportParameters = make([]byte, len(extData)) - if !extData.CopyBytes(m.quicTransportParameters) { - return false - } - case extensionPreSharedKey: - // RFC 8446, Section 4.2.11 - if !extensions.Empty() { - return false // pre_shared_key must be the last extension - } - var identities cryptobyte.String - if !extData.ReadUint16LengthPrefixed(&identities) || identities.Empty() { - return false - } - for !identities.Empty() { - var psk pskIdentity - if !readUint16LengthPrefixed(&identities, &psk.label) || - !identities.ReadUint32(&psk.obfuscatedTicketAge) || - len(psk.label) == 0 { - return false - } - m.pskIdentities = append(m.pskIdentities, psk) - } - var binders cryptobyte.String - if !extData.ReadUint16LengthPrefixed(&binders) || binders.Empty() { - return false - } - for !binders.Empty() { - var binder []byte - if !readUint8LengthPrefixed(&binders, &binder) || - len(binder) == 0 { - return false - } - m.pskBinders = append(m.pskBinders, binder) - } - default: - // Ignore unknown extensions. - continue - } - - if !extData.Empty() { - return false - } - } - - return true -} - -type serverHelloMsg struct { - raw []byte - vers uint16 - random []byte - sessionId []byte - cipherSuite uint16 - compressionMethod uint8 - ocspStapling bool - ticketSupported bool - secureRenegotiationSupported bool - secureRenegotiation []byte - alpnProtocol string - scts [][]byte - supportedVersion uint16 - serverShare keyShare - selectedIdentityPresent bool - selectedIdentity uint16 - supportedPoints []uint8 - - // HelloRetryRequest extensions - cookie []byte - selectedGroup CurveID -} - -func (m *serverHelloMsg) marshal() ([]byte, error) { - if m.raw != nil { - return m.raw, nil - } - - var exts cryptobyte.Builder - if m.ocspStapling { - exts.AddUint16(extensionStatusRequest) - exts.AddUint16(0) // empty extension_data - } - if m.ticketSupported { - exts.AddUint16(extensionSessionTicket) - exts.AddUint16(0) // empty extension_data - } - if m.secureRenegotiationSupported { - exts.AddUint16(extensionRenegotiationInfo) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddBytes(m.secureRenegotiation) - }) - }) - } - if len(m.alpnProtocol) > 0 { - exts.AddUint16(extensionALPN) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddBytes([]byte(m.alpnProtocol)) - }) - }) - }) - } - if len(m.scts) > 0 { - exts.AddUint16(extensionSCT) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - for _, sct := range m.scts { - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddBytes(sct) - }) - } - }) - }) - } - if m.supportedVersion != 0 { - exts.AddUint16(extensionSupportedVersions) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint16(m.supportedVersion) - }) - } - if m.serverShare.group != 0 { - exts.AddUint16(extensionKeyShare) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint16(uint16(m.serverShare.group)) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddBytes(m.serverShare.data) - }) - }) - } - if m.selectedIdentityPresent { - exts.AddUint16(extensionPreSharedKey) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint16(m.selectedIdentity) - }) - } - - if len(m.cookie) > 0 { - exts.AddUint16(extensionCookie) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddBytes(m.cookie) - }) - }) - } - if m.selectedGroup != 0 { - exts.AddUint16(extensionKeyShare) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint16(uint16(m.selectedGroup)) - }) - } - if len(m.supportedPoints) > 0 { - exts.AddUint16(extensionSupportedPoints) - exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) { - exts.AddBytes(m.supportedPoints) - }) - }) - } - - extBytes, err := exts.Bytes() - if err != nil { - return nil, err - } - - var b cryptobyte.Builder - b.AddUint8(typeServerHello) - b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddUint16(m.vers) - addBytesWithLength(b, m.random, 32) - b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(m.sessionId) - }) - b.AddUint16(m.cipherSuite) - b.AddUint8(m.compressionMethod) - - if len(extBytes) > 0 { - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(extBytes) - }) - } - }) - - m.raw, err = b.Bytes() - return m.raw, err -} - -func (m *serverHelloMsg) unmarshal(data []byte) bool { - *m = serverHelloMsg{raw: data} - s := cryptobyte.String(data) - - if !s.Skip(4) || // message type and uint24 length field - !s.ReadUint16(&m.vers) || !s.ReadBytes(&m.random, 32) || - !readUint8LengthPrefixed(&s, &m.sessionId) || - !s.ReadUint16(&m.cipherSuite) || - !s.ReadUint8(&m.compressionMethod) { - return false - } - - if s.Empty() { - // ServerHello is optionally followed by extension data - return true - } - - var extensions cryptobyte.String - if !s.ReadUint16LengthPrefixed(&extensions) || !s.Empty() { - return false - } - - seenExts := make(map[uint16]bool) - for !extensions.Empty() { - var extension uint16 - var extData cryptobyte.String - if !extensions.ReadUint16(&extension) || - !extensions.ReadUint16LengthPrefixed(&extData) { - return false - } - - if seenExts[extension] { - return false - } - seenExts[extension] = true - - switch extension { - case extensionStatusRequest: - m.ocspStapling = true - case extensionSessionTicket: - m.ticketSupported = true - case extensionRenegotiationInfo: - if !readUint8LengthPrefixed(&extData, &m.secureRenegotiation) { - return false - } - m.secureRenegotiationSupported = true - case extensionALPN: - var protoList cryptobyte.String - if !extData.ReadUint16LengthPrefixed(&protoList) || protoList.Empty() { - return false - } - var proto cryptobyte.String - if !protoList.ReadUint8LengthPrefixed(&proto) || - proto.Empty() || !protoList.Empty() { - return false - } - m.alpnProtocol = string(proto) - case extensionSCT: - var sctList cryptobyte.String - if !extData.ReadUint16LengthPrefixed(&sctList) || sctList.Empty() { - return false - } - for !sctList.Empty() { - var sct []byte - if !readUint16LengthPrefixed(&sctList, &sct) || - len(sct) == 0 { - return false - } - m.scts = append(m.scts, sct) - } - case extensionSupportedVersions: - if !extData.ReadUint16(&m.supportedVersion) { - return false - } - case extensionCookie: - if !readUint16LengthPrefixed(&extData, &m.cookie) || - len(m.cookie) == 0 { - return false - } - case extensionKeyShare: - // This extension has different formats in SH and HRR, accept either - // and let the handshake logic decide. See RFC 8446, Section 4.2.8. - if len(extData) == 2 { - if !extData.ReadUint16((*uint16)(&m.selectedGroup)) { - return false - } - } else { - if !extData.ReadUint16((*uint16)(&m.serverShare.group)) || - !readUint16LengthPrefixed(&extData, &m.serverShare.data) { - return false - } - } - case extensionPreSharedKey: - m.selectedIdentityPresent = true - if !extData.ReadUint16(&m.selectedIdentity) { - return false - } - case extensionSupportedPoints: - // RFC 4492, Section 5.1.2 - if !readUint8LengthPrefixed(&extData, &m.supportedPoints) || - len(m.supportedPoints) == 0 { - return false - } - default: - // Ignore unknown extensions. - continue - } - - if !extData.Empty() { - return false - } - } - - return true -} - -type encryptedExtensionsMsg struct { - raw []byte - alpnProtocol string - quicTransportParameters []byte - earlyData bool -} - -func (m *encryptedExtensionsMsg) marshal() ([]byte, error) { - if m.raw != nil { - return m.raw, nil - } - - var b cryptobyte.Builder - b.AddUint8(typeEncryptedExtensions) - b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - if len(m.alpnProtocol) > 0 { - b.AddUint16(extensionALPN) - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes([]byte(m.alpnProtocol)) - }) - }) - }) - } - if m.quicTransportParameters != nil { // marshal zero-length parameters when present - // draft-ietf-quic-tls-32, Section 8.2 - b.AddUint16(extensionQUICTransportParameters) - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(m.quicTransportParameters) - }) - } - if m.earlyData { - // RFC 8446, Section 4.2.10 - b.AddUint16(extensionEarlyData) - b.AddUint16(0) // empty extension_data - } - }) - }) - - var err error - m.raw, err = b.Bytes() - return m.raw, err -} - -func (m *encryptedExtensionsMsg) unmarshal(data []byte) bool { - *m = encryptedExtensionsMsg{raw: data} - s := cryptobyte.String(data) - - var extensions cryptobyte.String - if !s.Skip(4) || // message type and uint24 length field - !s.ReadUint16LengthPrefixed(&extensions) || !s.Empty() { - return false - } - - for !extensions.Empty() { - var extension uint16 - var extData cryptobyte.String - if !extensions.ReadUint16(&extension) || - !extensions.ReadUint16LengthPrefixed(&extData) { - return false - } - - switch extension { - case extensionALPN: - var protoList cryptobyte.String - if !extData.ReadUint16LengthPrefixed(&protoList) || protoList.Empty() { - return false - } - var proto cryptobyte.String - if !protoList.ReadUint8LengthPrefixed(&proto) || - proto.Empty() || !protoList.Empty() { - return false - } - m.alpnProtocol = string(proto) - case extensionQUICTransportParameters: - m.quicTransportParameters = make([]byte, len(extData)) - if !extData.CopyBytes(m.quicTransportParameters) { - return false - } - case extensionEarlyData: - m.earlyData = true - default: - // Ignore unknown extensions. - continue - } - - if !extData.Empty() { - return false - } - } - - return true -} - -type endOfEarlyDataMsg struct{} - -func (m *endOfEarlyDataMsg) marshal() ([]byte, error) { - x := make([]byte, 4) - x[0] = typeEndOfEarlyData - return x, nil -} - -func (m *endOfEarlyDataMsg) unmarshal(data []byte) bool { - return len(data) == 4 -} - -type keyUpdateMsg struct { - raw []byte - updateRequested bool -} - -func (m *keyUpdateMsg) marshal() ([]byte, error) { - if m.raw != nil { - return m.raw, nil - } - - var b cryptobyte.Builder - b.AddUint8(typeKeyUpdate) - b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) { - if m.updateRequested { - b.AddUint8(1) - } else { - b.AddUint8(0) - } - }) - - var err error - m.raw, err = b.Bytes() - return m.raw, err -} - -func (m *keyUpdateMsg) unmarshal(data []byte) bool { - m.raw = data - s := cryptobyte.String(data) - - var updateRequested uint8 - if !s.Skip(4) || // message type and uint24 length field - !s.ReadUint8(&updateRequested) || !s.Empty() { - return false - } - switch updateRequested { - case 0: - m.updateRequested = false - case 1: - m.updateRequested = true - default: - return false - } - return true -} - -type newSessionTicketMsgTLS13 struct { - raw []byte - lifetime uint32 - ageAdd uint32 - nonce []byte - label []byte - maxEarlyData uint32 -} - -func (m *newSessionTicketMsgTLS13) marshal() ([]byte, error) { - if m.raw != nil { - return m.raw, nil - } - - var b cryptobyte.Builder - b.AddUint8(typeNewSessionTicket) - b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddUint32(m.lifetime) - b.AddUint32(m.ageAdd) - b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(m.nonce) - }) - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(m.label) - }) - - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - if m.maxEarlyData > 0 { - b.AddUint16(extensionEarlyData) - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddUint32(m.maxEarlyData) - }) - } - }) - }) - - var err error - m.raw, err = b.Bytes() - return m.raw, err -} - -func (m *newSessionTicketMsgTLS13) unmarshal(data []byte) bool { - *m = newSessionTicketMsgTLS13{raw: data} - s := cryptobyte.String(data) - - var extensions cryptobyte.String - if !s.Skip(4) || // message type and uint24 length field - !s.ReadUint32(&m.lifetime) || - !s.ReadUint32(&m.ageAdd) || - !readUint8LengthPrefixed(&s, &m.nonce) || - !readUint16LengthPrefixed(&s, &m.label) || - !s.ReadUint16LengthPrefixed(&extensions) || - !s.Empty() { - return false - } - - for !extensions.Empty() { - var extension uint16 - var extData cryptobyte.String - if !extensions.ReadUint16(&extension) || - !extensions.ReadUint16LengthPrefixed(&extData) { - return false - } - - switch extension { - case extensionEarlyData: - if !extData.ReadUint32(&m.maxEarlyData) { - return false - } - default: - // Ignore unknown extensions. - continue - } - - if !extData.Empty() { - return false - } - } - - return true -} - -type certificateRequestMsgTLS13 struct { - raw []byte - ocspStapling bool - scts bool - supportedSignatureAlgorithms []SignatureScheme - supportedSignatureAlgorithmsCert []SignatureScheme - certificateAuthorities [][]byte -} - -func (m *certificateRequestMsgTLS13) marshal() ([]byte, error) { - if m.raw != nil { - return m.raw, nil - } - - var b cryptobyte.Builder - b.AddUint8(typeCertificateRequest) - b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) { - // certificate_request_context (SHALL be zero length unless used for - // post-handshake authentication) - b.AddUint8(0) - - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - if m.ocspStapling { - b.AddUint16(extensionStatusRequest) - b.AddUint16(0) // empty extension_data - } - if m.scts { - // RFC 8446, Section 4.4.2.1 makes no mention of - // signed_certificate_timestamp in CertificateRequest, but - // "Extensions in the Certificate message from the client MUST - // correspond to extensions in the CertificateRequest message - // from the server." and it appears in the table in Section 4.2. - b.AddUint16(extensionSCT) - b.AddUint16(0) // empty extension_data - } - if len(m.supportedSignatureAlgorithms) > 0 { - b.AddUint16(extensionSignatureAlgorithms) - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - for _, sigAlgo := range m.supportedSignatureAlgorithms { - b.AddUint16(uint16(sigAlgo)) - } - }) - }) - } - if len(m.supportedSignatureAlgorithmsCert) > 0 { - b.AddUint16(extensionSignatureAlgorithmsCert) - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - for _, sigAlgo := range m.supportedSignatureAlgorithmsCert { - b.AddUint16(uint16(sigAlgo)) - } - }) - }) - } - if len(m.certificateAuthorities) > 0 { - b.AddUint16(extensionCertificateAuthorities) - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - for _, ca := range m.certificateAuthorities { - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(ca) - }) - } - }) - }) - } - }) - }) - - var err error - m.raw, err = b.Bytes() - return m.raw, err -} - -func (m *certificateRequestMsgTLS13) unmarshal(data []byte) bool { - *m = certificateRequestMsgTLS13{raw: data} - s := cryptobyte.String(data) - - var context, extensions cryptobyte.String - if !s.Skip(4) || // message type and uint24 length field - !s.ReadUint8LengthPrefixed(&context) || !context.Empty() || - !s.ReadUint16LengthPrefixed(&extensions) || - !s.Empty() { - return false - } - - for !extensions.Empty() { - var extension uint16 - var extData cryptobyte.String - if !extensions.ReadUint16(&extension) || - !extensions.ReadUint16LengthPrefixed(&extData) { - return false - } - - switch extension { - case extensionStatusRequest: - m.ocspStapling = true - case extensionSCT: - m.scts = true - case extensionSignatureAlgorithms: - var sigAndAlgs cryptobyte.String - if !extData.ReadUint16LengthPrefixed(&sigAndAlgs) || sigAndAlgs.Empty() { - return false - } - for !sigAndAlgs.Empty() { - var sigAndAlg uint16 - if !sigAndAlgs.ReadUint16(&sigAndAlg) { - return false - } - m.supportedSignatureAlgorithms = append( - m.supportedSignatureAlgorithms, SignatureScheme(sigAndAlg)) - } - case extensionSignatureAlgorithmsCert: - var sigAndAlgs cryptobyte.String - if !extData.ReadUint16LengthPrefixed(&sigAndAlgs) || sigAndAlgs.Empty() { - return false - } - for !sigAndAlgs.Empty() { - var sigAndAlg uint16 - if !sigAndAlgs.ReadUint16(&sigAndAlg) { - return false - } - m.supportedSignatureAlgorithmsCert = append( - m.supportedSignatureAlgorithmsCert, SignatureScheme(sigAndAlg)) - } - case extensionCertificateAuthorities: - var auths cryptobyte.String - if !extData.ReadUint16LengthPrefixed(&auths) || auths.Empty() { - return false - } - for !auths.Empty() { - var ca []byte - if !readUint16LengthPrefixed(&auths, &ca) || len(ca) == 0 { - return false - } - m.certificateAuthorities = append(m.certificateAuthorities, ca) - } - default: - // Ignore unknown extensions. - continue - } - - if !extData.Empty() { - return false - } - } - - return true -} - -type certificateMsg struct { - raw []byte - certificates [][]byte -} - -func (m *certificateMsg) marshal() ([]byte, error) { - if m.raw != nil { - return m.raw, nil - } - - var i int - for _, slice := range m.certificates { - i += len(slice) - } - - length := 3 + 3*len(m.certificates) + i - x := make([]byte, 4+length) - x[0] = typeCertificate - x[1] = uint8(length >> 16) - x[2] = uint8(length >> 8) - x[3] = uint8(length) - - certificateOctets := length - 3 - x[4] = uint8(certificateOctets >> 16) - x[5] = uint8(certificateOctets >> 8) - x[6] = uint8(certificateOctets) - - y := x[7:] - for _, slice := range m.certificates { - y[0] = uint8(len(slice) >> 16) - y[1] = uint8(len(slice) >> 8) - y[2] = uint8(len(slice)) - copy(y[3:], slice) - y = y[3+len(slice):] - } - - m.raw = x - return m.raw, nil -} - -func (m *certificateMsg) unmarshal(data []byte) bool { - if len(data) < 7 { - return false - } - - m.raw = data - certsLen := uint32(data[4])<<16 | uint32(data[5])<<8 | uint32(data[6]) - if uint32(len(data)) != certsLen+7 { - return false - } - - numCerts := 0 - d := data[7:] - for certsLen > 0 { - if len(d) < 4 { - return false - } - certLen := uint32(d[0])<<16 | uint32(d[1])<<8 | uint32(d[2]) - if uint32(len(d)) < 3+certLen { - return false - } - d = d[3+certLen:] - certsLen -= 3 + certLen - numCerts++ - } - - m.certificates = make([][]byte, numCerts) - d = data[7:] - for i := 0; i < numCerts; i++ { - certLen := uint32(d[0])<<16 | uint32(d[1])<<8 | uint32(d[2]) - m.certificates[i] = d[3 : 3+certLen] - d = d[3+certLen:] - } - - return true -} - -type certificateMsgTLS13 struct { - raw []byte - certificate Certificate - ocspStapling bool - scts bool -} - -func (m *certificateMsgTLS13) marshal() ([]byte, error) { - if m.raw != nil { - return m.raw, nil - } - - var b cryptobyte.Builder - b.AddUint8(typeCertificate) - b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddUint8(0) // certificate_request_context - - certificate := m.certificate - if !m.ocspStapling { - certificate.OCSPStaple = nil - } - if !m.scts { - certificate.SignedCertificateTimestamps = nil - } - marshalCertificate(b, certificate) - }) - - var err error - m.raw, err = b.Bytes() - return m.raw, err -} - -func marshalCertificate(b *cryptobyte.Builder, certificate Certificate) { - b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) { - for i, cert := range certificate.Certificate { - b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(cert) - }) - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - if i > 0 { - // This library only supports OCSP and SCT for leaf certificates. - return - } - if certificate.OCSPStaple != nil { - b.AddUint16(extensionStatusRequest) - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddUint8(statusTypeOCSP) - b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(certificate.OCSPStaple) - }) - }) - } - if certificate.SignedCertificateTimestamps != nil { - b.AddUint16(extensionSCT) - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - for _, sct := range certificate.SignedCertificateTimestamps { - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(sct) - }) - } - }) - }) - } - }) - } - }) -} - -func (m *certificateMsgTLS13) unmarshal(data []byte) bool { - *m = certificateMsgTLS13{raw: data} - s := cryptobyte.String(data) - - var context cryptobyte.String - if !s.Skip(4) || // message type and uint24 length field - !s.ReadUint8LengthPrefixed(&context) || !context.Empty() || - !unmarshalCertificate(&s, &m.certificate) || - !s.Empty() { - return false - } - - m.scts = m.certificate.SignedCertificateTimestamps != nil - m.ocspStapling = m.certificate.OCSPStaple != nil - - return true -} - -func unmarshalCertificate(s *cryptobyte.String, certificate *Certificate) bool { - var certList cryptobyte.String - if !s.ReadUint24LengthPrefixed(&certList) { - return false - } - for !certList.Empty() { - var cert []byte - var extensions cryptobyte.String - if !readUint24LengthPrefixed(&certList, &cert) || - !certList.ReadUint16LengthPrefixed(&extensions) { - return false - } - certificate.Certificate = append(certificate.Certificate, cert) - for !extensions.Empty() { - var extension uint16 - var extData cryptobyte.String - if !extensions.ReadUint16(&extension) || - !extensions.ReadUint16LengthPrefixed(&extData) { - return false - } - if len(certificate.Certificate) > 1 { - // This library only supports OCSP and SCT for leaf certificates. - continue - } - - switch extension { - case extensionStatusRequest: - var statusType uint8 - if !extData.ReadUint8(&statusType) || statusType != statusTypeOCSP || - !readUint24LengthPrefixed(&extData, &certificate.OCSPStaple) || - len(certificate.OCSPStaple) == 0 { - return false - } - case extensionSCT: - var sctList cryptobyte.String - if !extData.ReadUint16LengthPrefixed(&sctList) || sctList.Empty() { - return false - } - for !sctList.Empty() { - var sct []byte - if !readUint16LengthPrefixed(&sctList, &sct) || - len(sct) == 0 { - return false - } - certificate.SignedCertificateTimestamps = append( - certificate.SignedCertificateTimestamps, sct) - } - default: - // Ignore unknown extensions. - continue - } - - if !extData.Empty() { - return false - } - } - } - return true -} - -type serverKeyExchangeMsg struct { - raw []byte - key []byte -} - -func (m *serverKeyExchangeMsg) marshal() ([]byte, error) { - if m.raw != nil { - return m.raw, nil - } - length := len(m.key) - x := make([]byte, length+4) - x[0] = typeServerKeyExchange - x[1] = uint8(length >> 16) - x[2] = uint8(length >> 8) - x[3] = uint8(length) - copy(x[4:], m.key) - - m.raw = x - return x, nil -} - -func (m *serverKeyExchangeMsg) unmarshal(data []byte) bool { - m.raw = data - if len(data) < 4 { - return false - } - m.key = data[4:] - return true -} - -type certificateStatusMsg struct { - raw []byte - response []byte -} - -func (m *certificateStatusMsg) marshal() ([]byte, error) { - if m.raw != nil { - return m.raw, nil - } - - var b cryptobyte.Builder - b.AddUint8(typeCertificateStatus) - b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddUint8(statusTypeOCSP) - b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(m.response) - }) - }) - - var err error - m.raw, err = b.Bytes() - return m.raw, err -} - -func (m *certificateStatusMsg) unmarshal(data []byte) bool { - m.raw = data - s := cryptobyte.String(data) - - var statusType uint8 - if !s.Skip(4) || // message type and uint24 length field - !s.ReadUint8(&statusType) || statusType != statusTypeOCSP || - !readUint24LengthPrefixed(&s, &m.response) || - len(m.response) == 0 || !s.Empty() { - return false - } - return true -} - -type serverHelloDoneMsg struct{} - -func (m *serverHelloDoneMsg) marshal() ([]byte, error) { - x := make([]byte, 4) - x[0] = typeServerHelloDone - return x, nil -} - -func (m *serverHelloDoneMsg) unmarshal(data []byte) bool { - return len(data) == 4 -} - -type clientKeyExchangeMsg struct { - raw []byte - ciphertext []byte -} - -func (m *clientKeyExchangeMsg) marshal() ([]byte, error) { - if m.raw != nil { - return m.raw, nil - } - length := len(m.ciphertext) - x := make([]byte, length+4) - x[0] = typeClientKeyExchange - x[1] = uint8(length >> 16) - x[2] = uint8(length >> 8) - x[3] = uint8(length) - copy(x[4:], m.ciphertext) - - m.raw = x - return x, nil -} - -func (m *clientKeyExchangeMsg) unmarshal(data []byte) bool { - m.raw = data - if len(data) < 4 { - return false - } - l := int(data[1])<<16 | int(data[2])<<8 | int(data[3]) - if l != len(data)-4 { - return false - } - m.ciphertext = data[4:] - return true -} - -type finishedMsg struct { - raw []byte - verifyData []byte -} - -func (m *finishedMsg) marshal() ([]byte, error) { - if m.raw != nil { - return m.raw, nil - } - - var b cryptobyte.Builder - b.AddUint8(typeFinished) - b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(m.verifyData) - }) - - var err error - m.raw, err = b.Bytes() - return m.raw, err -} - -func (m *finishedMsg) unmarshal(data []byte) bool { - m.raw = data - s := cryptobyte.String(data) - return s.Skip(1) && - readUint24LengthPrefixed(&s, &m.verifyData) && - s.Empty() -} - -type certificateRequestMsg struct { - raw []byte - // hasSignatureAlgorithm indicates whether this message includes a list of - // supported signature algorithms. This change was introduced with TLS 1.2. - hasSignatureAlgorithm bool - - certificateTypes []byte - supportedSignatureAlgorithms []SignatureScheme - certificateAuthorities [][]byte -} - -func (m *certificateRequestMsg) marshal() ([]byte, error) { - if m.raw != nil { - return m.raw, nil - } - - // See RFC 4346, Section 7.4.4. - length := 1 + len(m.certificateTypes) + 2 - casLength := 0 - for _, ca := range m.certificateAuthorities { - casLength += 2 + len(ca) - } - length += casLength - - if m.hasSignatureAlgorithm { - length += 2 + 2*len(m.supportedSignatureAlgorithms) - } - - x := make([]byte, 4+length) - x[0] = typeCertificateRequest - x[1] = uint8(length >> 16) - x[2] = uint8(length >> 8) - x[3] = uint8(length) - - x[4] = uint8(len(m.certificateTypes)) - - copy(x[5:], m.certificateTypes) - y := x[5+len(m.certificateTypes):] - - if m.hasSignatureAlgorithm { - n := len(m.supportedSignatureAlgorithms) * 2 - y[0] = uint8(n >> 8) - y[1] = uint8(n) - y = y[2:] - for _, sigAlgo := range m.supportedSignatureAlgorithms { - y[0] = uint8(sigAlgo >> 8) - y[1] = uint8(sigAlgo) - y = y[2:] - } - } - - y[0] = uint8(casLength >> 8) - y[1] = uint8(casLength) - y = y[2:] - for _, ca := range m.certificateAuthorities { - y[0] = uint8(len(ca) >> 8) - y[1] = uint8(len(ca)) - y = y[2:] - copy(y, ca) - y = y[len(ca):] - } - - m.raw = x - return m.raw, nil -} - -func (m *certificateRequestMsg) unmarshal(data []byte) bool { - m.raw = data - - if len(data) < 5 { - return false - } - - length := uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3]) - if uint32(len(data))-4 != length { - return false - } - - numCertTypes := int(data[4]) - data = data[5:] - if numCertTypes == 0 || len(data) <= numCertTypes { - return false - } - - m.certificateTypes = make([]byte, numCertTypes) - if copy(m.certificateTypes, data) != numCertTypes { - return false - } - - data = data[numCertTypes:] - - if m.hasSignatureAlgorithm { - if len(data) < 2 { - return false - } - sigAndHashLen := uint16(data[0])<<8 | uint16(data[1]) - data = data[2:] - if sigAndHashLen&1 != 0 { - return false - } - if len(data) < int(sigAndHashLen) { - return false - } - numSigAlgos := sigAndHashLen / 2 - m.supportedSignatureAlgorithms = make([]SignatureScheme, numSigAlgos) - for i := range m.supportedSignatureAlgorithms { - m.supportedSignatureAlgorithms[i] = SignatureScheme(data[0])<<8 | SignatureScheme(data[1]) - data = data[2:] - } - } - - if len(data) < 2 { - return false - } - casLength := uint16(data[0])<<8 | uint16(data[1]) - data = data[2:] - if len(data) < int(casLength) { - return false - } - cas := make([]byte, casLength) - copy(cas, data) - data = data[casLength:] - - m.certificateAuthorities = nil - for len(cas) > 0 { - if len(cas) < 2 { - return false - } - caLen := uint16(cas[0])<<8 | uint16(cas[1]) - cas = cas[2:] - - if len(cas) < int(caLen) { - return false - } - - m.certificateAuthorities = append(m.certificateAuthorities, cas[:caLen]) - cas = cas[caLen:] - } - - return len(data) == 0 -} - -type certificateVerifyMsg struct { - raw []byte - hasSignatureAlgorithm bool // format change introduced in TLS 1.2 - signatureAlgorithm SignatureScheme - signature []byte -} - -func (m *certificateVerifyMsg) marshal() ([]byte, error) { - if m.raw != nil { - return m.raw, nil - } - - var b cryptobyte.Builder - b.AddUint8(typeCertificateVerify) - b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) { - if m.hasSignatureAlgorithm { - b.AddUint16(uint16(m.signatureAlgorithm)) - } - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(m.signature) - }) - }) - - var err error - m.raw, err = b.Bytes() - return m.raw, err -} - -func (m *certificateVerifyMsg) unmarshal(data []byte) bool { - m.raw = data - s := cryptobyte.String(data) - - if !s.Skip(4) { // message type and uint24 length field - return false - } - if m.hasSignatureAlgorithm { - if !s.ReadUint16((*uint16)(&m.signatureAlgorithm)) { - return false - } - } - return readUint16LengthPrefixed(&s, &m.signature) && s.Empty() -} - -type newSessionTicketMsg struct { - raw []byte - ticket []byte -} - -func (m *newSessionTicketMsg) marshal() ([]byte, error) { - if m.raw != nil { - return m.raw, nil - } - - // See RFC 5077, Section 3.3. - ticketLen := len(m.ticket) - length := 2 + 4 + ticketLen - x := make([]byte, 4+length) - x[0] = typeNewSessionTicket - x[1] = uint8(length >> 16) - x[2] = uint8(length >> 8) - x[3] = uint8(length) - x[8] = uint8(ticketLen >> 8) - x[9] = uint8(ticketLen) - copy(x[10:], m.ticket) - - m.raw = x - - return m.raw, nil -} - -func (m *newSessionTicketMsg) unmarshal(data []byte) bool { - m.raw = data - - if len(data) < 10 { - return false - } - - length := uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3]) - if uint32(len(data))-4 != length { - return false - } - - ticketLen := int(data[8])<<8 + int(data[9]) - if len(data)-10 != ticketLen { - return false - } - - m.ticket = data[10:] - - return true -} - -type helloRequestMsg struct { -} - -func (*helloRequestMsg) marshal() ([]byte, error) { - return []byte{typeHelloRequest, 0, 0, 0}, nil -} - -func (*helloRequestMsg) unmarshal(data []byte) bool { - return len(data) == 4 -} - -type transcriptHash interface { - Write([]byte) (int, error) -} - -// transcriptMsg is a helper used to marshal and hash messages which typically -// are not written to the wire, and as such aren't hashed during Conn.writeRecord. -func transcriptMsg(msg handshakeMessage, h transcriptHash) error { - data, err := msg.marshal() - if err != nil { - return err - } - h.Write(data) - return nil -} diff --git a/vendor/github.com/quic-go/qtls-go1-20/handshake_server.go b/vendor/github.com/quic-go/qtls-go1-20/handshake_server.go deleted file mode 100644 index 7539c95d5..000000000 --- a/vendor/github.com/quic-go/qtls-go1-20/handshake_server.go +++ /dev/null @@ -1,899 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package qtls - -import ( - "context" - "crypto" - "crypto/ecdsa" - "crypto/ed25519" - "crypto/rsa" - "crypto/subtle" - "crypto/x509" - "errors" - "fmt" - "hash" - "io" - "time" -) - -// serverHandshakeState contains details of a server handshake in progress. -// It's discarded once the handshake has completed. -type serverHandshakeState struct { - c *Conn - ctx context.Context - clientHello *clientHelloMsg - hello *serverHelloMsg - suite *cipherSuite - ecdheOk bool - ecSignOk bool - rsaDecryptOk bool - rsaSignOk bool - sessionState *sessionState - finishedHash finishedHash - masterSecret []byte - cert *Certificate -} - -// serverHandshake performs a TLS handshake as a server. -func (c *Conn) serverHandshake(ctx context.Context) error { - clientHello, err := c.readClientHello(ctx) - if err != nil { - return err - } - - if c.vers == VersionTLS13 { - hs := serverHandshakeStateTLS13{ - c: c, - ctx: ctx, - clientHello: clientHello, - } - return hs.handshake() - } - - hs := serverHandshakeState{ - c: c, - ctx: ctx, - clientHello: clientHello, - } - return hs.handshake() -} - -func (hs *serverHandshakeState) handshake() error { - c := hs.c - - if err := hs.processClientHello(); err != nil { - return err - } - - // For an overview of TLS handshaking, see RFC 5246, Section 7.3. - c.buffering = true - if hs.checkForResumption() { - // The client has included a session ticket and so we do an abbreviated handshake. - c.didResume = true - if err := hs.doResumeHandshake(); err != nil { - return err - } - if err := hs.establishKeys(); err != nil { - return err - } - if err := hs.sendSessionTicket(); err != nil { - return err - } - if err := hs.sendFinished(c.serverFinished[:]); err != nil { - return err - } - if _, err := c.flush(); err != nil { - return err - } - c.clientFinishedIsFirst = false - if err := hs.readFinished(nil); err != nil { - return err - } - } else { - // The client didn't include a session ticket, or it wasn't - // valid so we do a full handshake. - if err := hs.pickCipherSuite(); err != nil { - return err - } - if err := hs.doFullHandshake(); err != nil { - return err - } - if err := hs.establishKeys(); err != nil { - return err - } - if err := hs.readFinished(c.clientFinished[:]); err != nil { - return err - } - c.clientFinishedIsFirst = true - c.buffering = true - if err := hs.sendSessionTicket(); err != nil { - return err - } - if err := hs.sendFinished(nil); err != nil { - return err - } - if _, err := c.flush(); err != nil { - return err - } - } - - c.ekm = ekmFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.clientHello.random, hs.hello.random) - c.isHandshakeComplete.Store(true) - - return nil -} - -// readClientHello reads a ClientHello message and selects the protocol version. -func (c *Conn) readClientHello(ctx context.Context) (*clientHelloMsg, error) { - // clientHelloMsg is included in the transcript, but we haven't initialized - // it yet. The respective handshake functions will record it themselves. - msg, err := c.readHandshake(nil) - if err != nil { - return nil, err - } - clientHello, ok := msg.(*clientHelloMsg) - if !ok { - c.sendAlert(alertUnexpectedMessage) - return nil, unexpectedMessageError(clientHello, msg) - } - - var configForClient *config - originalConfig := c.config - if c.config.GetConfigForClient != nil { - chi := newClientHelloInfo(ctx, c, clientHello) - if cfc, err := c.config.GetConfigForClient(chi); err != nil { - c.sendAlert(alertInternalError) - return nil, err - } else if cfc != nil { - configForClient = fromConfig(cfc) - c.config = configForClient - } - } - c.ticketKeys = originalConfig.ticketKeys(configForClient) - - clientVersions := clientHello.supportedVersions - if len(clientHello.supportedVersions) == 0 { - clientVersions = supportedVersionsFromMax(clientHello.vers) - } - c.vers, ok = c.config.mutualVersion(roleServer, clientVersions) - if !ok { - c.sendAlert(alertProtocolVersion) - return nil, fmt.Errorf("tls: client offered only unsupported versions: %x", clientVersions) - } - c.haveVers = true - c.in.version = c.vers - c.out.version = c.vers - - return clientHello, nil -} - -func (hs *serverHandshakeState) processClientHello() error { - c := hs.c - - hs.hello = new(serverHelloMsg) - hs.hello.vers = c.vers - - foundCompression := false - // We only support null compression, so check that the client offered it. - for _, compression := range hs.clientHello.compressionMethods { - if compression == compressionNone { - foundCompression = true - break - } - } - - if !foundCompression { - c.sendAlert(alertHandshakeFailure) - return errors.New("tls: client does not support uncompressed connections") - } - - hs.hello.random = make([]byte, 32) - serverRandom := hs.hello.random - // Downgrade protection canaries. See RFC 8446, Section 4.1.3. - maxVers := c.config.maxSupportedVersion(roleServer) - if maxVers >= VersionTLS12 && c.vers < maxVers || testingOnlyForceDowngradeCanary { - if c.vers == VersionTLS12 { - copy(serverRandom[24:], downgradeCanaryTLS12) - } else { - copy(serverRandom[24:], downgradeCanaryTLS11) - } - serverRandom = serverRandom[:24] - } - _, err := io.ReadFull(c.config.rand(), serverRandom) - if err != nil { - c.sendAlert(alertInternalError) - return err - } - - if len(hs.clientHello.secureRenegotiation) != 0 { - c.sendAlert(alertHandshakeFailure) - return errors.New("tls: initial handshake had non-empty renegotiation extension") - } - - hs.hello.secureRenegotiationSupported = hs.clientHello.secureRenegotiationSupported - hs.hello.compressionMethod = compressionNone - if len(hs.clientHello.serverName) > 0 { - c.serverName = hs.clientHello.serverName - } - - selectedProto, err := negotiateALPN(c.config.NextProtos, hs.clientHello.alpnProtocols, false) - if err != nil { - c.sendAlert(alertNoApplicationProtocol) - return err - } - hs.hello.alpnProtocol = selectedProto - c.clientProtocol = selectedProto - - hs.cert, err = c.config.getCertificate(newClientHelloInfo(hs.ctx, c, hs.clientHello)) - if err != nil { - if err == errNoCertificates { - c.sendAlert(alertUnrecognizedName) - } else { - c.sendAlert(alertInternalError) - } - return err - } - if hs.clientHello.scts { - hs.hello.scts = hs.cert.SignedCertificateTimestamps - } - - hs.ecdheOk = supportsECDHE(c.config, hs.clientHello.supportedCurves, hs.clientHello.supportedPoints) - - if hs.ecdheOk && len(hs.clientHello.supportedPoints) > 0 { - // Although omitting the ec_point_formats extension is permitted, some - // old OpenSSL version will refuse to handshake if not present. - // - // Per RFC 4492, section 5.1.2, implementations MUST support the - // uncompressed point format. See golang.org/issue/31943. - hs.hello.supportedPoints = []uint8{pointFormatUncompressed} - } - - if priv, ok := hs.cert.PrivateKey.(crypto.Signer); ok { - switch priv.Public().(type) { - case *ecdsa.PublicKey: - hs.ecSignOk = true - case ed25519.PublicKey: - hs.ecSignOk = true - case *rsa.PublicKey: - hs.rsaSignOk = true - default: - c.sendAlert(alertInternalError) - return fmt.Errorf("tls: unsupported signing key type (%T)", priv.Public()) - } - } - if priv, ok := hs.cert.PrivateKey.(crypto.Decrypter); ok { - switch priv.Public().(type) { - case *rsa.PublicKey: - hs.rsaDecryptOk = true - default: - c.sendAlert(alertInternalError) - return fmt.Errorf("tls: unsupported decryption key type (%T)", priv.Public()) - } - } - - return nil -} - -// negotiateALPN picks a shared ALPN protocol that both sides support in server -// preference order. If ALPN is not configured or the peer doesn't support it, -// it returns "" and no error. -func negotiateALPN(serverProtos, clientProtos []string, quic bool) (string, error) { - if len(serverProtos) == 0 || len(clientProtos) == 0 { - if quic && len(serverProtos) != 0 { - // RFC 9001, Section 8.1 - return "", fmt.Errorf("tls: client did not request an application protocol") - } - return "", nil - } - var http11fallback bool - for _, s := range serverProtos { - for _, c := range clientProtos { - if s == c { - return s, nil - } - if s == "h2" && c == "http/1.1" { - http11fallback = true - } - } - } - // As a special case, let http/1.1 clients connect to h2 servers as if they - // didn't support ALPN. We used not to enforce protocol overlap, so over - // time a number of HTTP servers were configured with only "h2", but - // expected to accept connections from "http/1.1" clients. See Issue 46310. - if http11fallback { - return "", nil - } - return "", fmt.Errorf("tls: client requested unsupported application protocols (%s)", clientProtos) -} - -// supportsECDHE returns whether ECDHE key exchanges can be used with this -// pre-TLS 1.3 client. -func supportsECDHE(c *config, supportedCurves []CurveID, supportedPoints []uint8) bool { - supportsCurve := false - for _, curve := range supportedCurves { - if c.supportsCurve(curve) { - supportsCurve = true - break - } - } - - supportsPointFormat := false - for _, pointFormat := range supportedPoints { - if pointFormat == pointFormatUncompressed { - supportsPointFormat = true - break - } - } - // Per RFC 8422, Section 5.1.2, if the Supported Point Formats extension is - // missing, uncompressed points are supported. If supportedPoints is empty, - // the extension must be missing, as an empty extension body is rejected by - // the parser. See https://go.dev/issue/49126. - if len(supportedPoints) == 0 { - supportsPointFormat = true - } - - return supportsCurve && supportsPointFormat -} - -func (hs *serverHandshakeState) pickCipherSuite() error { - c := hs.c - - preferenceOrder := cipherSuitesPreferenceOrder - if !hasAESGCMHardwareSupport || !aesgcmPreferred(hs.clientHello.cipherSuites) { - preferenceOrder = cipherSuitesPreferenceOrderNoAES - } - - configCipherSuites := c.config.cipherSuites() - preferenceList := make([]uint16, 0, len(configCipherSuites)) - for _, suiteID := range preferenceOrder { - for _, id := range configCipherSuites { - if id == suiteID { - preferenceList = append(preferenceList, id) - break - } - } - } - - hs.suite = selectCipherSuite(preferenceList, hs.clientHello.cipherSuites, hs.cipherSuiteOk) - if hs.suite == nil { - c.sendAlert(alertHandshakeFailure) - return errors.New("tls: no cipher suite supported by both client and server") - } - c.cipherSuite = hs.suite.id - - for _, id := range hs.clientHello.cipherSuites { - if id == TLS_FALLBACK_SCSV { - // The client is doing a fallback connection. See RFC 7507. - if hs.clientHello.vers < c.config.maxSupportedVersion(roleServer) { - c.sendAlert(alertInappropriateFallback) - return errors.New("tls: client using inappropriate protocol fallback") - } - break - } - } - - return nil -} - -func (hs *serverHandshakeState) cipherSuiteOk(c *cipherSuite) bool { - if c.flags&suiteECDHE != 0 { - if !hs.ecdheOk { - return false - } - if c.flags&suiteECSign != 0 { - if !hs.ecSignOk { - return false - } - } else if !hs.rsaSignOk { - return false - } - } else if !hs.rsaDecryptOk { - return false - } - if hs.c.vers < VersionTLS12 && c.flags&suiteTLS12 != 0 { - return false - } - return true -} - -// checkForResumption reports whether we should perform resumption on this connection. -func (hs *serverHandshakeState) checkForResumption() bool { - c := hs.c - - if c.config.SessionTicketsDisabled { - return false - } - - plaintext, usedOldKey := c.decryptTicket(hs.clientHello.sessionTicket) - if plaintext == nil { - return false - } - hs.sessionState = &sessionState{usedOldKey: usedOldKey} - ok := hs.sessionState.unmarshal(plaintext) - if !ok { - return false - } - - createdAt := time.Unix(int64(hs.sessionState.createdAt), 0) - if c.config.time().Sub(createdAt) > maxSessionTicketLifetime { - return false - } - - // Never resume a session for a different TLS version. - if c.vers != hs.sessionState.vers { - return false - } - - cipherSuiteOk := false - // Check that the client is still offering the ciphersuite in the session. - for _, id := range hs.clientHello.cipherSuites { - if id == hs.sessionState.cipherSuite { - cipherSuiteOk = true - break - } - } - if !cipherSuiteOk { - return false - } - - // Check that we also support the ciphersuite from the session. - hs.suite = selectCipherSuite([]uint16{hs.sessionState.cipherSuite}, - c.config.cipherSuites(), hs.cipherSuiteOk) - if hs.suite == nil { - return false - } - - sessionHasClientCerts := len(hs.sessionState.certificates) != 0 - needClientCerts := requiresClientCert(c.config.ClientAuth) - if needClientCerts && !sessionHasClientCerts { - return false - } - if sessionHasClientCerts && c.config.ClientAuth == NoClientCert { - return false - } - - return true -} - -func (hs *serverHandshakeState) doResumeHandshake() error { - c := hs.c - - hs.hello.cipherSuite = hs.suite.id - c.cipherSuite = hs.suite.id - // We echo the client's session ID in the ServerHello to let it know - // that we're doing a resumption. - hs.hello.sessionId = hs.clientHello.sessionId - hs.hello.ticketSupported = hs.sessionState.usedOldKey - hs.finishedHash = newFinishedHash(c.vers, hs.suite) - hs.finishedHash.discardHandshakeBuffer() - if err := transcriptMsg(hs.clientHello, &hs.finishedHash); err != nil { - return err - } - if _, err := hs.c.writeHandshakeRecord(hs.hello, &hs.finishedHash); err != nil { - return err - } - - if err := c.processCertsFromClient(Certificate{ - Certificate: hs.sessionState.certificates, - }); err != nil { - return err - } - - if c.config.VerifyConnection != nil { - if err := c.config.VerifyConnection(c.connectionStateLocked()); err != nil { - c.sendAlert(alertBadCertificate) - return err - } - } - - hs.masterSecret = hs.sessionState.masterSecret - - return nil -} - -func (hs *serverHandshakeState) doFullHandshake() error { - c := hs.c - - if hs.clientHello.ocspStapling && len(hs.cert.OCSPStaple) > 0 { - hs.hello.ocspStapling = true - } - - hs.hello.ticketSupported = hs.clientHello.ticketSupported && !c.config.SessionTicketsDisabled - hs.hello.cipherSuite = hs.suite.id - - hs.finishedHash = newFinishedHash(hs.c.vers, hs.suite) - if c.config.ClientAuth == NoClientCert { - // No need to keep a full record of the handshake if client - // certificates won't be used. - hs.finishedHash.discardHandshakeBuffer() - } - if err := transcriptMsg(hs.clientHello, &hs.finishedHash); err != nil { - return err - } - if _, err := hs.c.writeHandshakeRecord(hs.hello, &hs.finishedHash); err != nil { - return err - } - - certMsg := new(certificateMsg) - certMsg.certificates = hs.cert.Certificate - if _, err := hs.c.writeHandshakeRecord(certMsg, &hs.finishedHash); err != nil { - return err - } - - if hs.hello.ocspStapling { - certStatus := new(certificateStatusMsg) - certStatus.response = hs.cert.OCSPStaple - if _, err := hs.c.writeHandshakeRecord(certStatus, &hs.finishedHash); err != nil { - return err - } - } - - keyAgreement := hs.suite.ka(c.vers) - skx, err := keyAgreement.generateServerKeyExchange(c.config, hs.cert, hs.clientHello, hs.hello) - if err != nil { - c.sendAlert(alertHandshakeFailure) - return err - } - if skx != nil { - if _, err := hs.c.writeHandshakeRecord(skx, &hs.finishedHash); err != nil { - return err - } - } - - var certReq *certificateRequestMsg - if c.config.ClientAuth >= RequestClientCert { - // Request a client certificate - certReq = new(certificateRequestMsg) - certReq.certificateTypes = []byte{ - byte(certTypeRSASign), - byte(certTypeECDSASign), - } - if c.vers >= VersionTLS12 { - certReq.hasSignatureAlgorithm = true - certReq.supportedSignatureAlgorithms = supportedSignatureAlgorithms() - } - - // An empty list of certificateAuthorities signals to - // the client that it may send any certificate in response - // to our request. When we know the CAs we trust, then - // we can send them down, so that the client can choose - // an appropriate certificate to give to us. - if c.config.ClientCAs != nil { - certReq.certificateAuthorities = c.config.ClientCAs.Subjects() - } - if _, err := hs.c.writeHandshakeRecord(certReq, &hs.finishedHash); err != nil { - return err - } - } - - helloDone := new(serverHelloDoneMsg) - if _, err := hs.c.writeHandshakeRecord(helloDone, &hs.finishedHash); err != nil { - return err - } - - if _, err := c.flush(); err != nil { - return err - } - - var pub crypto.PublicKey // public key for client auth, if any - - msg, err := c.readHandshake(&hs.finishedHash) - if err != nil { - return err - } - - // If we requested a client certificate, then the client must send a - // certificate message, even if it's empty. - if c.config.ClientAuth >= RequestClientCert { - certMsg, ok := msg.(*certificateMsg) - if !ok { - c.sendAlert(alertUnexpectedMessage) - return unexpectedMessageError(certMsg, msg) - } - - if err := c.processCertsFromClient(Certificate{ - Certificate: certMsg.certificates, - }); err != nil { - return err - } - if len(certMsg.certificates) != 0 { - pub = c.peerCertificates[0].PublicKey - } - - msg, err = c.readHandshake(&hs.finishedHash) - if err != nil { - return err - } - } - if c.config.VerifyConnection != nil { - if err := c.config.VerifyConnection(c.connectionStateLocked()); err != nil { - c.sendAlert(alertBadCertificate) - return err - } - } - - // Get client key exchange - ckx, ok := msg.(*clientKeyExchangeMsg) - if !ok { - c.sendAlert(alertUnexpectedMessage) - return unexpectedMessageError(ckx, msg) - } - - preMasterSecret, err := keyAgreement.processClientKeyExchange(c.config, hs.cert, ckx, c.vers) - if err != nil { - c.sendAlert(alertHandshakeFailure) - return err - } - hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.clientHello.random, hs.hello.random) - if err := c.config.writeKeyLog(keyLogLabelTLS12, hs.clientHello.random, hs.masterSecret); err != nil { - c.sendAlert(alertInternalError) - return err - } - - // If we received a client cert in response to our certificate request message, - // the client will send us a certificateVerifyMsg immediately after the - // clientKeyExchangeMsg. This message is a digest of all preceding - // handshake-layer messages that is signed using the private key corresponding - // to the client's certificate. This allows us to verify that the client is in - // possession of the private key of the certificate. - if len(c.peerCertificates) > 0 { - // certificateVerifyMsg is included in the transcript, but not until - // after we verify the handshake signature, since the state before - // this message was sent is used. - msg, err = c.readHandshake(nil) - if err != nil { - return err - } - certVerify, ok := msg.(*certificateVerifyMsg) - if !ok { - c.sendAlert(alertUnexpectedMessage) - return unexpectedMessageError(certVerify, msg) - } - - var sigType uint8 - var sigHash crypto.Hash - if c.vers >= VersionTLS12 { - if !isSupportedSignatureAlgorithm(certVerify.signatureAlgorithm, certReq.supportedSignatureAlgorithms) { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: client certificate used with invalid signature algorithm") - } - sigType, sigHash, err = typeAndHashFromSignatureScheme(certVerify.signatureAlgorithm) - if err != nil { - return c.sendAlert(alertInternalError) - } - } else { - sigType, sigHash, err = legacyTypeAndHashFromPublicKey(pub) - if err != nil { - c.sendAlert(alertIllegalParameter) - return err - } - } - - signed := hs.finishedHash.hashForClientCertificate(sigType, sigHash) - if err := verifyHandshakeSignature(sigType, pub, sigHash, signed, certVerify.signature); err != nil { - c.sendAlert(alertDecryptError) - return errors.New("tls: invalid signature by the client certificate: " + err.Error()) - } - - if err := transcriptMsg(certVerify, &hs.finishedHash); err != nil { - return err - } - } - - hs.finishedHash.discardHandshakeBuffer() - - return nil -} - -func (hs *serverHandshakeState) establishKeys() error { - c := hs.c - - clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV := - keysFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.clientHello.random, hs.hello.random, hs.suite.macLen, hs.suite.keyLen, hs.suite.ivLen) - - var clientCipher, serverCipher any - var clientHash, serverHash hash.Hash - - if hs.suite.aead == nil { - clientCipher = hs.suite.cipher(clientKey, clientIV, true /* for reading */) - clientHash = hs.suite.mac(clientMAC) - serverCipher = hs.suite.cipher(serverKey, serverIV, false /* not for reading */) - serverHash = hs.suite.mac(serverMAC) - } else { - clientCipher = hs.suite.aead(clientKey, clientIV) - serverCipher = hs.suite.aead(serverKey, serverIV) - } - - c.in.prepareCipherSpec(c.vers, clientCipher, clientHash) - c.out.prepareCipherSpec(c.vers, serverCipher, serverHash) - - return nil -} - -func (hs *serverHandshakeState) readFinished(out []byte) error { - c := hs.c - - if err := c.readChangeCipherSpec(); err != nil { - return err - } - - // finishedMsg is included in the transcript, but not until after we - // check the client version, since the state before this message was - // sent is used during verification. - msg, err := c.readHandshake(nil) - if err != nil { - return err - } - clientFinished, ok := msg.(*finishedMsg) - if !ok { - c.sendAlert(alertUnexpectedMessage) - return unexpectedMessageError(clientFinished, msg) - } - - verify := hs.finishedHash.clientSum(hs.masterSecret) - if len(verify) != len(clientFinished.verifyData) || - subtle.ConstantTimeCompare(verify, clientFinished.verifyData) != 1 { - c.sendAlert(alertHandshakeFailure) - return errors.New("tls: client's Finished message is incorrect") - } - - if err := transcriptMsg(clientFinished, &hs.finishedHash); err != nil { - return err - } - - copy(out, verify) - return nil -} - -func (hs *serverHandshakeState) sendSessionTicket() error { - // ticketSupported is set in a resumption handshake if the - // ticket from the client was encrypted with an old session - // ticket key and thus a refreshed ticket should be sent. - if !hs.hello.ticketSupported { - return nil - } - - c := hs.c - m := new(newSessionTicketMsg) - - createdAt := uint64(c.config.time().Unix()) - if hs.sessionState != nil { - // If this is re-wrapping an old key, then keep - // the original time it was created. - createdAt = hs.sessionState.createdAt - } - - var certsFromClient [][]byte - for _, cert := range c.peerCertificates { - certsFromClient = append(certsFromClient, cert.Raw) - } - state := sessionState{ - vers: c.vers, - cipherSuite: hs.suite.id, - createdAt: createdAt, - masterSecret: hs.masterSecret, - certificates: certsFromClient, - } - stateBytes, err := state.marshal() - if err != nil { - return err - } - m.ticket, err = c.encryptTicket(stateBytes) - if err != nil { - return err - } - - if _, err := hs.c.writeHandshakeRecord(m, &hs.finishedHash); err != nil { - return err - } - - return nil -} - -func (hs *serverHandshakeState) sendFinished(out []byte) error { - c := hs.c - - if err := c.writeChangeCipherRecord(); err != nil { - return err - } - - finished := new(finishedMsg) - finished.verifyData = hs.finishedHash.serverSum(hs.masterSecret) - if _, err := hs.c.writeHandshakeRecord(finished, &hs.finishedHash); err != nil { - return err - } - - copy(out, finished.verifyData) - - return nil -} - -// processCertsFromClient takes a chain of client certificates either from a -// Certificates message or from a sessionState and verifies them. It returns -// the public key of the leaf certificate. -func (c *Conn) processCertsFromClient(certificate Certificate) error { - certificates := certificate.Certificate - certs := make([]*x509.Certificate, len(certificates)) - var err error - for i, asn1Data := range certificates { - if certs[i], err = x509.ParseCertificate(asn1Data); err != nil { - c.sendAlert(alertBadCertificate) - return errors.New("tls: failed to parse client certificate: " + err.Error()) - } - if certs[i].PublicKeyAlgorithm == x509.RSA && certs[i].PublicKey.(*rsa.PublicKey).N.BitLen() > maxRSAKeySize { - c.sendAlert(alertBadCertificate) - return fmt.Errorf("tls: client sent certificate containing RSA key larger than %d bits", maxRSAKeySize) - } - } - - if len(certs) == 0 && requiresClientCert(c.config.ClientAuth) { - c.sendAlert(alertBadCertificate) - return errors.New("tls: client didn't provide a certificate") - } - - if c.config.ClientAuth >= VerifyClientCertIfGiven && len(certs) > 0 { - opts := x509.VerifyOptions{ - Roots: c.config.ClientCAs, - CurrentTime: c.config.time(), - Intermediates: x509.NewCertPool(), - KeyUsages: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth}, - } - - for _, cert := range certs[1:] { - opts.Intermediates.AddCert(cert) - } - - chains, err := certs[0].Verify(opts) - if err != nil { - c.sendAlert(alertBadCertificate) - return &CertificateVerificationError{UnverifiedCertificates: certs, Err: err} - } - - c.verifiedChains = chains - } - - c.peerCertificates = certs - c.ocspResponse = certificate.OCSPStaple - c.scts = certificate.SignedCertificateTimestamps - - if len(certs) > 0 { - switch certs[0].PublicKey.(type) { - case *ecdsa.PublicKey, *rsa.PublicKey, ed25519.PublicKey: - default: - c.sendAlert(alertUnsupportedCertificate) - return fmt.Errorf("tls: client certificate contains an unsupported public key of type %T", certs[0].PublicKey) - } - } - - if c.config.VerifyPeerCertificate != nil { - if err := c.config.VerifyPeerCertificate(certificates, c.verifiedChains); err != nil { - c.sendAlert(alertBadCertificate) - return err - } - } - - return nil -} - -func newClientHelloInfo(ctx context.Context, c *Conn, clientHello *clientHelloMsg) *ClientHelloInfo { - supportedVersions := clientHello.supportedVersions - if len(clientHello.supportedVersions) == 0 { - supportedVersions = supportedVersionsFromMax(clientHello.vers) - } - - return toClientHelloInfo(&clientHelloInfo{ - CipherSuites: clientHello.cipherSuites, - ServerName: clientHello.serverName, - SupportedCurves: clientHello.supportedCurves, - SupportedPoints: clientHello.supportedPoints, - SignatureSchemes: clientHello.supportedSignatureAlgorithms, - SupportedProtos: clientHello.alpnProtocols, - SupportedVersions: supportedVersions, - Conn: c.conn, - config: toConfig(c.config), - ctx: ctx, - }) -} diff --git a/vendor/github.com/quic-go/qtls-go1-20/handshake_server_tls13.go b/vendor/github.com/quic-go/qtls-go1-20/handshake_server_tls13.go deleted file mode 100644 index 03bc5eb51..000000000 --- a/vendor/github.com/quic-go/qtls-go1-20/handshake_server_tls13.go +++ /dev/null @@ -1,979 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package qtls - -import ( - "bytes" - "context" - "crypto" - "crypto/hmac" - "crypto/rsa" - "errors" - "hash" - "io" - "time" -) - -// maxClientPSKIdentities is the number of client PSK identities the server will -// attempt to validate. It will ignore the rest not to let cheap ClientHello -// messages cause too much work in session ticket decryption attempts. -const maxClientPSKIdentities = 5 - -type serverHandshakeStateTLS13 struct { - c *Conn - ctx context.Context - clientHello *clientHelloMsg - hello *serverHelloMsg - alpnNegotiationErr error - encryptedExtensions *encryptedExtensionsMsg - sentDummyCCS bool - usingPSK bool - suite *cipherSuiteTLS13 - cert *Certificate - sigAlg SignatureScheme - earlySecret []byte - sharedKey []byte - handshakeSecret []byte - masterSecret []byte - trafficSecret []byte // client_application_traffic_secret_0 - transcript hash.Hash - clientFinished []byte - earlyData bool -} - -func (hs *serverHandshakeStateTLS13) handshake() error { - c := hs.c - - if needFIPS() { - return errors.New("tls: internal error: TLS 1.3 reached in FIPS mode") - } - - // For an overview of the TLS 1.3 handshake, see RFC 8446, Section 2. - if err := hs.processClientHello(); err != nil { - return err - } - if err := hs.checkForResumption(); err != nil { - return err - } - if err := hs.pickCertificate(); err != nil { - return err - } - c.buffering = true - if err := hs.sendServerParameters(); err != nil { - return err - } - if err := hs.sendServerCertificate(); err != nil { - return err - } - if err := hs.sendServerFinished(); err != nil { - return err - } - // Note that at this point we could start sending application data without - // waiting for the client's second flight, but the application might not - // expect the lack of replay protection of the ClientHello parameters. - if _, err := c.flush(); err != nil { - return err - } - if err := hs.readClientCertificate(); err != nil { - return err - } - if err := hs.readClientFinished(); err != nil { - return err - } - - c.isHandshakeComplete.Store(true) - - return nil -} - -func (hs *serverHandshakeStateTLS13) processClientHello() error { - c := hs.c - - hs.hello = new(serverHelloMsg) - hs.encryptedExtensions = new(encryptedExtensionsMsg) - - // TLS 1.3 froze the ServerHello.legacy_version field, and uses - // supported_versions instead. See RFC 8446, sections 4.1.3 and 4.2.1. - hs.hello.vers = VersionTLS12 - hs.hello.supportedVersion = c.vers - - if len(hs.clientHello.supportedVersions) == 0 { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: client used the legacy version field to negotiate TLS 1.3") - } - - // Abort if the client is doing a fallback and landing lower than what we - // support. See RFC 7507, which however does not specify the interaction - // with supported_versions. The only difference is that with - // supported_versions a client has a chance to attempt a [TLS 1.2, TLS 1.4] - // handshake in case TLS 1.3 is broken but 1.2 is not. Alas, in that case, - // it will have to drop the TLS_FALLBACK_SCSV protection if it falls back to - // TLS 1.2, because a TLS 1.3 server would abort here. The situation before - // supported_versions was not better because there was just no way to do a - // TLS 1.4 handshake without risking the server selecting TLS 1.3. - for _, id := range hs.clientHello.cipherSuites { - if id == TLS_FALLBACK_SCSV { - // Use c.vers instead of max(supported_versions) because an attacker - // could defeat this by adding an arbitrary high version otherwise. - if c.vers < c.config.maxSupportedVersion(roleServer) { - c.sendAlert(alertInappropriateFallback) - return errors.New("tls: client using inappropriate protocol fallback") - } - break - } - } - - if len(hs.clientHello.compressionMethods) != 1 || - hs.clientHello.compressionMethods[0] != compressionNone { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: TLS 1.3 client supports illegal compression methods") - } - - hs.hello.random = make([]byte, 32) - if _, err := io.ReadFull(c.config.rand(), hs.hello.random); err != nil { - c.sendAlert(alertInternalError) - return err - } - - if len(hs.clientHello.secureRenegotiation) != 0 { - c.sendAlert(alertHandshakeFailure) - return errors.New("tls: initial handshake had non-empty renegotiation extension") - } - - hs.hello.sessionId = hs.clientHello.sessionId - hs.hello.compressionMethod = compressionNone - - preferenceList := defaultCipherSuitesTLS13 - if !hasAESGCMHardwareSupport || !aesgcmPreferred(hs.clientHello.cipherSuites) { - preferenceList = defaultCipherSuitesTLS13NoAES - } - for _, suiteID := range preferenceList { - hs.suite = mutualCipherSuiteTLS13(hs.clientHello.cipherSuites, suiteID) - if hs.suite != nil { - break - } - } - if hs.suite == nil { - c.sendAlert(alertHandshakeFailure) - return errors.New("tls: no cipher suite supported by both client and server") - } - c.cipherSuite = hs.suite.id - hs.hello.cipherSuite = hs.suite.id - hs.transcript = hs.suite.hash.New() - - // Pick the ECDHE group in server preference order, but give priority to - // groups with a key share, to avoid a HelloRetryRequest round-trip. - var selectedGroup CurveID - var clientKeyShare *keyShare -GroupSelection: - for _, preferredGroup := range c.config.curvePreferences() { - for _, ks := range hs.clientHello.keyShares { - if ks.group == preferredGroup { - selectedGroup = ks.group - clientKeyShare = &ks - break GroupSelection - } - } - if selectedGroup != 0 { - continue - } - for _, group := range hs.clientHello.supportedCurves { - if group == preferredGroup { - selectedGroup = group - break - } - } - } - if selectedGroup == 0 { - c.sendAlert(alertHandshakeFailure) - return errors.New("tls: no ECDHE curve supported by both client and server") - } - if clientKeyShare == nil { - if err := hs.doHelloRetryRequest(selectedGroup); err != nil { - return err - } - clientKeyShare = &hs.clientHello.keyShares[0] - } - - if _, ok := curveForCurveID(selectedGroup); !ok { - c.sendAlert(alertInternalError) - return errors.New("tls: CurvePreferences includes unsupported curve") - } - key, err := generateECDHEKey(c.config.rand(), selectedGroup) - if err != nil { - c.sendAlert(alertInternalError) - return err - } - hs.hello.serverShare = keyShare{group: selectedGroup, data: key.PublicKey().Bytes()} - peerKey, err := key.Curve().NewPublicKey(clientKeyShare.data) - if err != nil { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: invalid client key share") - } - hs.sharedKey, err = key.ECDH(peerKey) - if err != nil { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: invalid client key share") - } - - if c.quic != nil { - if hs.clientHello.quicTransportParameters == nil { - // RFC 9001 Section 8.2. - c.sendAlert(alertMissingExtension) - return errors.New("tls: client did not send a quic_transport_parameters extension") - } - c.quicSetTransportParameters(hs.clientHello.quicTransportParameters) - } else { - if hs.clientHello.quicTransportParameters != nil { - c.sendAlert(alertUnsupportedExtension) - return errors.New("tls: client sent an unexpected quic_transport_parameters extension") - } - } - - c.serverName = hs.clientHello.serverName - - selectedProto, err := negotiateALPN(c.config.NextProtos, hs.clientHello.alpnProtocols, c.quic != nil) - if err != nil { - hs.alpnNegotiationErr = err - } - hs.encryptedExtensions.alpnProtocol = selectedProto - c.clientProtocol = selectedProto - - return nil -} - -func (hs *serverHandshakeStateTLS13) checkForResumption() error { - c := hs.c - - if c.config.SessionTicketsDisabled { - return nil - } - - modeOK := false - for _, mode := range hs.clientHello.pskModes { - if mode == pskModeDHE { - modeOK = true - break - } - } - if !modeOK { - return nil - } - - if len(hs.clientHello.pskIdentities) != len(hs.clientHello.pskBinders) { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: invalid or missing PSK binders") - } - if len(hs.clientHello.pskIdentities) == 0 { - return nil - } - - for i, identity := range hs.clientHello.pskIdentities { - if i >= maxClientPSKIdentities { - break - } - - plaintext, _ := c.decryptTicket(identity.label) - if plaintext == nil { - continue - } - sessionState := new(sessionStateTLS13) - if ok := sessionState.unmarshal(plaintext); !ok { - continue - } - - if hs.clientHello.earlyData { - if sessionState.maxEarlyData == 0 { - c.sendAlert(alertUnsupportedExtension) - return errors.New("tls: client sent unexpected early data") - } - - if hs.alpnNegotiationErr == nil && sessionState.alpn == c.clientProtocol && - c.extraConfig != nil && c.extraConfig.Enable0RTT && - c.extraConfig.Accept0RTT != nil && c.extraConfig.Accept0RTT(sessionState.appData) { - hs.encryptedExtensions.earlyData = true - } - } - - createdAt := time.Unix(int64(sessionState.createdAt), 0) - if c.config.time().Sub(createdAt) > maxSessionTicketLifetime { - continue - } - - // We don't check the obfuscated ticket age because it's affected by - // clock skew and it's only a freshness signal useful for shrinking the - // window for replay attacks, which don't affect us as we don't do 0-RTT. - - pskSuite := cipherSuiteTLS13ByID(sessionState.cipherSuite) - if pskSuite == nil || pskSuite.hash != hs.suite.hash { - continue - } - - // PSK connections don't re-establish client certificates, but carry - // them over in the session ticket. Ensure the presence of client certs - // in the ticket is consistent with the configured requirements. - sessionHasClientCerts := len(sessionState.certificate.Certificate) != 0 - needClientCerts := requiresClientCert(c.config.ClientAuth) - if needClientCerts && !sessionHasClientCerts { - continue - } - if sessionHasClientCerts && c.config.ClientAuth == NoClientCert { - continue - } - - psk := hs.suite.expandLabel(sessionState.resumptionSecret, "resumption", - nil, hs.suite.hash.Size()) - hs.earlySecret = hs.suite.extract(psk, nil) - binderKey := hs.suite.deriveSecret(hs.earlySecret, resumptionBinderLabel, nil) - // Clone the transcript in case a HelloRetryRequest was recorded. - transcript := cloneHash(hs.transcript, hs.suite.hash) - if transcript == nil { - c.sendAlert(alertInternalError) - return errors.New("tls: internal error: failed to clone hash") - } - clientHelloBytes, err := hs.clientHello.marshalWithoutBinders() - if err != nil { - c.sendAlert(alertInternalError) - return err - } - transcript.Write(clientHelloBytes) - pskBinder := hs.suite.finishedHash(binderKey, transcript) - if !hmac.Equal(hs.clientHello.pskBinders[i], pskBinder) { - c.sendAlert(alertDecryptError) - return errors.New("tls: invalid PSK binder") - } - - if c.quic != nil && hs.clientHello.earlyData && hs.encryptedExtensions.earlyData && i == 0 && - sessionState.maxEarlyData > 0 && sessionState.cipherSuite == hs.suite.id { - hs.earlyData = true - - transcript := hs.suite.hash.New() - if err := transcriptMsg(hs.clientHello, transcript); err != nil { - return err - } - earlyTrafficSecret := hs.suite.deriveSecret(hs.earlySecret, clientEarlyTrafficLabel, transcript) - c.quicSetReadSecret(QUICEncryptionLevelEarly, hs.suite.id, earlyTrafficSecret) - } - - c.didResume = true - if err := c.processCertsFromClient(sessionState.certificate); err != nil { - return err - } - - hs.hello.selectedIdentityPresent = true - hs.hello.selectedIdentity = uint16(i) - hs.usingPSK = true - return nil - } - - return nil -} - -// cloneHash uses the encoding.BinaryMarshaler and encoding.BinaryUnmarshaler -// interfaces implemented by standard library hashes to clone the state of in -// to a new instance of h. It returns nil if the operation fails. -func cloneHash(in hash.Hash, h crypto.Hash) hash.Hash { - // Recreate the interface to avoid importing encoding. - type binaryMarshaler interface { - MarshalBinary() (data []byte, err error) - UnmarshalBinary(data []byte) error - } - marshaler, ok := in.(binaryMarshaler) - if !ok { - return nil - } - state, err := marshaler.MarshalBinary() - if err != nil { - return nil - } - out := h.New() - unmarshaler, ok := out.(binaryMarshaler) - if !ok { - return nil - } - if err := unmarshaler.UnmarshalBinary(state); err != nil { - return nil - } - return out -} - -func (hs *serverHandshakeStateTLS13) pickCertificate() error { - c := hs.c - - // Only one of PSK and certificates are used at a time. - if hs.usingPSK { - return nil - } - - // signature_algorithms is required in TLS 1.3. See RFC 8446, Section 4.2.3. - if len(hs.clientHello.supportedSignatureAlgorithms) == 0 { - return c.sendAlert(alertMissingExtension) - } - - certificate, err := c.config.getCertificate(newClientHelloInfo(hs.ctx, c, hs.clientHello)) - if err != nil { - if err == errNoCertificates { - c.sendAlert(alertUnrecognizedName) - } else { - c.sendAlert(alertInternalError) - } - return err - } - hs.sigAlg, err = selectSignatureScheme(c.vers, certificate, hs.clientHello.supportedSignatureAlgorithms) - if err != nil { - // getCertificate returned a certificate that is unsupported or - // incompatible with the client's signature algorithms. - c.sendAlert(alertHandshakeFailure) - return err - } - hs.cert = certificate - - return nil -} - -// sendDummyChangeCipherSpec sends a ChangeCipherSpec record for compatibility -// with middleboxes that didn't implement TLS correctly. See RFC 8446, Appendix D.4. -func (hs *serverHandshakeStateTLS13) sendDummyChangeCipherSpec() error { - if hs.c.quic != nil { - return nil - } - if hs.sentDummyCCS { - return nil - } - hs.sentDummyCCS = true - - return hs.c.writeChangeCipherRecord() -} - -func (hs *serverHandshakeStateTLS13) doHelloRetryRequest(selectedGroup CurveID) error { - c := hs.c - - // The first ClientHello gets double-hashed into the transcript upon a - // HelloRetryRequest. See RFC 8446, Section 4.4.1. - if err := transcriptMsg(hs.clientHello, hs.transcript); err != nil { - return err - } - chHash := hs.transcript.Sum(nil) - hs.transcript.Reset() - hs.transcript.Write([]byte{typeMessageHash, 0, 0, uint8(len(chHash))}) - hs.transcript.Write(chHash) - - helloRetryRequest := &serverHelloMsg{ - vers: hs.hello.vers, - random: helloRetryRequestRandom, - sessionId: hs.hello.sessionId, - cipherSuite: hs.hello.cipherSuite, - compressionMethod: hs.hello.compressionMethod, - supportedVersion: hs.hello.supportedVersion, - selectedGroup: selectedGroup, - } - - if _, err := hs.c.writeHandshakeRecord(helloRetryRequest, hs.transcript); err != nil { - return err - } - - if err := hs.sendDummyChangeCipherSpec(); err != nil { - return err - } - - // clientHelloMsg is not included in the transcript. - msg, err := c.readHandshake(nil) - if err != nil { - return err - } - - clientHello, ok := msg.(*clientHelloMsg) - if !ok { - c.sendAlert(alertUnexpectedMessage) - return unexpectedMessageError(clientHello, msg) - } - - if len(clientHello.keyShares) != 1 || clientHello.keyShares[0].group != selectedGroup { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: client sent invalid key share in second ClientHello") - } - - if clientHello.earlyData { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: client indicated early data in second ClientHello") - } - - if illegalClientHelloChange(clientHello, hs.clientHello) { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: client illegally modified second ClientHello") - } - - if illegalClientHelloChange(clientHello, hs.clientHello) { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: client illegally modified second ClientHello") - } - - hs.clientHello = clientHello - return nil -} - -// illegalClientHelloChange reports whether the two ClientHello messages are -// different, with the exception of the changes allowed before and after a -// HelloRetryRequest. See RFC 8446, Section 4.1.2. -func illegalClientHelloChange(ch, ch1 *clientHelloMsg) bool { - if len(ch.supportedVersions) != len(ch1.supportedVersions) || - len(ch.cipherSuites) != len(ch1.cipherSuites) || - len(ch.supportedCurves) != len(ch1.supportedCurves) || - len(ch.supportedSignatureAlgorithms) != len(ch1.supportedSignatureAlgorithms) || - len(ch.supportedSignatureAlgorithmsCert) != len(ch1.supportedSignatureAlgorithmsCert) || - len(ch.alpnProtocols) != len(ch1.alpnProtocols) { - return true - } - for i := range ch.supportedVersions { - if ch.supportedVersions[i] != ch1.supportedVersions[i] { - return true - } - } - for i := range ch.cipherSuites { - if ch.cipherSuites[i] != ch1.cipherSuites[i] { - return true - } - } - for i := range ch.supportedCurves { - if ch.supportedCurves[i] != ch1.supportedCurves[i] { - return true - } - } - for i := range ch.supportedSignatureAlgorithms { - if ch.supportedSignatureAlgorithms[i] != ch1.supportedSignatureAlgorithms[i] { - return true - } - } - for i := range ch.supportedSignatureAlgorithmsCert { - if ch.supportedSignatureAlgorithmsCert[i] != ch1.supportedSignatureAlgorithmsCert[i] { - return true - } - } - for i := range ch.alpnProtocols { - if ch.alpnProtocols[i] != ch1.alpnProtocols[i] { - return true - } - } - return ch.vers != ch1.vers || - !bytes.Equal(ch.random, ch1.random) || - !bytes.Equal(ch.sessionId, ch1.sessionId) || - !bytes.Equal(ch.compressionMethods, ch1.compressionMethods) || - ch.serverName != ch1.serverName || - ch.ocspStapling != ch1.ocspStapling || - !bytes.Equal(ch.supportedPoints, ch1.supportedPoints) || - ch.ticketSupported != ch1.ticketSupported || - !bytes.Equal(ch.sessionTicket, ch1.sessionTicket) || - ch.secureRenegotiationSupported != ch1.secureRenegotiationSupported || - !bytes.Equal(ch.secureRenegotiation, ch1.secureRenegotiation) || - ch.scts != ch1.scts || - !bytes.Equal(ch.cookie, ch1.cookie) || - !bytes.Equal(ch.pskModes, ch1.pskModes) -} - -func (hs *serverHandshakeStateTLS13) sendServerParameters() error { - c := hs.c - - if err := transcriptMsg(hs.clientHello, hs.transcript); err != nil { - return err - } - if _, err := hs.c.writeHandshakeRecord(hs.hello, hs.transcript); err != nil { - return err - } - - if err := hs.sendDummyChangeCipherSpec(); err != nil { - return err - } - - earlySecret := hs.earlySecret - if earlySecret == nil { - earlySecret = hs.suite.extract(nil, nil) - } - hs.handshakeSecret = hs.suite.extract(hs.sharedKey, - hs.suite.deriveSecret(earlySecret, "derived", nil)) - - clientSecret := hs.suite.deriveSecret(hs.handshakeSecret, - clientHandshakeTrafficLabel, hs.transcript) - c.in.setTrafficSecret(hs.suite, QUICEncryptionLevelHandshake, clientSecret) - serverSecret := hs.suite.deriveSecret(hs.handshakeSecret, - serverHandshakeTrafficLabel, hs.transcript) - c.out.setTrafficSecret(hs.suite, QUICEncryptionLevelHandshake, serverSecret) - - if c.quic != nil { - if c.hand.Len() != 0 { - c.sendAlert(alertUnexpectedMessage) - } - c.quicSetWriteSecret(QUICEncryptionLevelHandshake, hs.suite.id, serverSecret) - c.quicSetReadSecret(QUICEncryptionLevelHandshake, hs.suite.id, clientSecret) - } - - err := c.config.writeKeyLog(keyLogLabelClientHandshake, hs.clientHello.random, clientSecret) - if err != nil { - c.sendAlert(alertInternalError) - return err - } - err = c.config.writeKeyLog(keyLogLabelServerHandshake, hs.clientHello.random, serverSecret) - if err != nil { - c.sendAlert(alertInternalError) - return err - } - - selectedProto, err := negotiateALPN(c.config.NextProtos, hs.clientHello.alpnProtocols, c.quic != nil) - if err != nil { - c.sendAlert(alertNoApplicationProtocol) - return err - } - hs.encryptedExtensions.alpnProtocol = selectedProto - c.clientProtocol = selectedProto - - if c.quic != nil { - p, err := c.quicGetTransportParameters() - if err != nil { - return err - } - hs.encryptedExtensions.quicTransportParameters = p - } - - if _, err := hs.c.writeHandshakeRecord(hs.encryptedExtensions, hs.transcript); err != nil { - return err - } - - return nil -} - -func (hs *serverHandshakeStateTLS13) requestClientCert() bool { - return hs.c.config.ClientAuth >= RequestClientCert && !hs.usingPSK -} - -func (hs *serverHandshakeStateTLS13) sendServerCertificate() error { - c := hs.c - - // Only one of PSK and certificates are used at a time. - if hs.usingPSK { - return nil - } - - if hs.requestClientCert() { - // Request a client certificate - certReq := new(certificateRequestMsgTLS13) - certReq.ocspStapling = true - certReq.scts = true - certReq.supportedSignatureAlgorithms = supportedSignatureAlgorithms() - if c.config.ClientCAs != nil { - certReq.certificateAuthorities = c.config.ClientCAs.Subjects() - } - - if _, err := hs.c.writeHandshakeRecord(certReq, hs.transcript); err != nil { - return err - } - } - - certMsg := new(certificateMsgTLS13) - - certMsg.certificate = *hs.cert - certMsg.scts = hs.clientHello.scts && len(hs.cert.SignedCertificateTimestamps) > 0 - certMsg.ocspStapling = hs.clientHello.ocspStapling && len(hs.cert.OCSPStaple) > 0 - - if _, err := hs.c.writeHandshakeRecord(certMsg, hs.transcript); err != nil { - return err - } - - certVerifyMsg := new(certificateVerifyMsg) - certVerifyMsg.hasSignatureAlgorithm = true - certVerifyMsg.signatureAlgorithm = hs.sigAlg - - sigType, sigHash, err := typeAndHashFromSignatureScheme(hs.sigAlg) - if err != nil { - return c.sendAlert(alertInternalError) - } - - signed := signedMessage(sigHash, serverSignatureContext, hs.transcript) - signOpts := crypto.SignerOpts(sigHash) - if sigType == signatureRSAPSS { - signOpts = &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash, Hash: sigHash} - } - sig, err := hs.cert.PrivateKey.(crypto.Signer).Sign(c.config.rand(), signed, signOpts) - if err != nil { - public := hs.cert.PrivateKey.(crypto.Signer).Public() - if rsaKey, ok := public.(*rsa.PublicKey); ok && sigType == signatureRSAPSS && - rsaKey.N.BitLen()/8 < sigHash.Size()*2+2 { // key too small for RSA-PSS - c.sendAlert(alertHandshakeFailure) - } else { - c.sendAlert(alertInternalError) - } - return errors.New("tls: failed to sign handshake: " + err.Error()) - } - certVerifyMsg.signature = sig - - if _, err := hs.c.writeHandshakeRecord(certVerifyMsg, hs.transcript); err != nil { - return err - } - - return nil -} - -func (hs *serverHandshakeStateTLS13) sendServerFinished() error { - c := hs.c - - finished := &finishedMsg{ - verifyData: hs.suite.finishedHash(c.out.trafficSecret, hs.transcript), - } - - if _, err := hs.c.writeHandshakeRecord(finished, hs.transcript); err != nil { - return err - } - - // Derive secrets that take context through the server Finished. - - hs.masterSecret = hs.suite.extract(nil, - hs.suite.deriveSecret(hs.handshakeSecret, "derived", nil)) - - hs.trafficSecret = hs.suite.deriveSecret(hs.masterSecret, - clientApplicationTrafficLabel, hs.transcript) - serverSecret := hs.suite.deriveSecret(hs.masterSecret, - serverApplicationTrafficLabel, hs.transcript) - c.out.setTrafficSecret(hs.suite, QUICEncryptionLevelApplication, serverSecret) - - if c.quic != nil { - if c.hand.Len() != 0 { - // TODO: Handle this in setTrafficSecret? - c.sendAlert(alertUnexpectedMessage) - } - c.quicSetWriteSecret(QUICEncryptionLevelApplication, hs.suite.id, serverSecret) - } - - err := c.config.writeKeyLog(keyLogLabelClientTraffic, hs.clientHello.random, hs.trafficSecret) - if err != nil { - c.sendAlert(alertInternalError) - return err - } - err = c.config.writeKeyLog(keyLogLabelServerTraffic, hs.clientHello.random, serverSecret) - if err != nil { - c.sendAlert(alertInternalError) - return err - } - - c.ekm = hs.suite.exportKeyingMaterial(hs.masterSecret, hs.transcript) - - // If we did not request client certificates, at this point we can - // precompute the client finished and roll the transcript forward to send - // session tickets in our first flight. - if !hs.requestClientCert() { - if err := hs.sendSessionTickets(); err != nil { - return err - } - } - - return nil -} - -func (hs *serverHandshakeStateTLS13) shouldSendSessionTickets() bool { - if hs.c.config.SessionTicketsDisabled { - return false - } - - // QUIC tickets are sent by QUICConn.SendSessionTicket, not automatically. - if hs.c.quic != nil { - return false - } - // Don't send tickets the client wouldn't use. See RFC 8446, Section 4.2.9. - for _, pskMode := range hs.clientHello.pskModes { - if pskMode == pskModeDHE { - return true - } - } - return false -} - -func (hs *serverHandshakeStateTLS13) sendSessionTickets() error { - c := hs.c - - hs.clientFinished = hs.suite.finishedHash(c.in.trafficSecret, hs.transcript) - finishedMsg := &finishedMsg{ - verifyData: hs.clientFinished, - } - if err := transcriptMsg(finishedMsg, hs.transcript); err != nil { - return err - } - c.resumptionSecret = hs.suite.deriveSecret(hs.masterSecret, - resumptionLabel, hs.transcript) - - if !hs.shouldSendSessionTickets() { - return nil - } - return c.sendSessionTicket(false) -} - -func (c *Conn) sendSessionTicket(earlyData bool) error { - suite := cipherSuiteTLS13ByID(c.cipherSuite) - if suite == nil { - return errors.New("tls: internal error: unknown cipher suite") - } - - m := new(newSessionTicketMsgTLS13) - - var certsFromClient [][]byte - for _, cert := range c.peerCertificates { - certsFromClient = append(certsFromClient, cert.Raw) - } - state := sessionStateTLS13{ - cipherSuite: suite.id, - createdAt: uint64(c.config.time().Unix()), - resumptionSecret: c.resumptionSecret, - certificate: Certificate{ - Certificate: certsFromClient, - OCSPStaple: c.ocspResponse, - SignedCertificateTimestamps: c.scts, - }, - alpn: c.clientProtocol, - } - if earlyData { - state.maxEarlyData = 0xffffffff - state.appData = c.extraConfig.GetAppDataForSessionTicket() - } - stateBytes, err := state.marshal() - if err != nil { - c.sendAlert(alertInternalError) - return err - } - m.label, err = c.encryptTicket(stateBytes) - if err != nil { - return err - } - m.lifetime = uint32(maxSessionTicketLifetime / time.Second) - - // ticket_age_add is a random 32-bit value. See RFC 8446, section 4.6.1 - // The value is not stored anywhere; we never need to check the ticket age - // because 0-RTT is not supported. - ageAdd := make([]byte, 4) - _, err = c.config.rand().Read(ageAdd) - if err != nil { - return err - } - - if earlyData { - // RFC 9001, Section 4.6.1 - m.maxEarlyData = 0xffffffff - } - - if _, err := c.writeHandshakeRecord(m, nil); err != nil { - return err - } - - return nil -} - -func (hs *serverHandshakeStateTLS13) readClientCertificate() error { - c := hs.c - - if !hs.requestClientCert() { - // Make sure the connection is still being verified whether or not - // the server requested a client certificate. - if c.config.VerifyConnection != nil { - if err := c.config.VerifyConnection(c.connectionStateLocked()); err != nil { - c.sendAlert(alertBadCertificate) - return err - } - } - return nil - } - - // If we requested a client certificate, then the client must send a - // certificate message. If it's empty, no CertificateVerify is sent. - - msg, err := c.readHandshake(hs.transcript) - if err != nil { - return err - } - - certMsg, ok := msg.(*certificateMsgTLS13) - if !ok { - c.sendAlert(alertUnexpectedMessage) - return unexpectedMessageError(certMsg, msg) - } - - if err := c.processCertsFromClient(certMsg.certificate); err != nil { - return err - } - - if c.config.VerifyConnection != nil { - if err := c.config.VerifyConnection(c.connectionStateLocked()); err != nil { - c.sendAlert(alertBadCertificate) - return err - } - } - - if len(certMsg.certificate.Certificate) != 0 { - // certificateVerifyMsg is included in the transcript, but not until - // after we verify the handshake signature, since the state before - // this message was sent is used. - msg, err = c.readHandshake(nil) - if err != nil { - return err - } - - certVerify, ok := msg.(*certificateVerifyMsg) - if !ok { - c.sendAlert(alertUnexpectedMessage) - return unexpectedMessageError(certVerify, msg) - } - - // See RFC 8446, Section 4.4.3. - if !isSupportedSignatureAlgorithm(certVerify.signatureAlgorithm, supportedSignatureAlgorithms()) { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: client certificate used with invalid signature algorithm") - } - sigType, sigHash, err := typeAndHashFromSignatureScheme(certVerify.signatureAlgorithm) - if err != nil { - return c.sendAlert(alertInternalError) - } - if sigType == signaturePKCS1v15 || sigHash == crypto.SHA1 { - c.sendAlert(alertIllegalParameter) - return errors.New("tls: client certificate used with invalid signature algorithm") - } - signed := signedMessage(sigHash, clientSignatureContext, hs.transcript) - if err := verifyHandshakeSignature(sigType, c.peerCertificates[0].PublicKey, - sigHash, signed, certVerify.signature); err != nil { - c.sendAlert(alertDecryptError) - return errors.New("tls: invalid signature by the client certificate: " + err.Error()) - } - - if err := transcriptMsg(certVerify, hs.transcript); err != nil { - return err - } - } - - // If we waited until the client certificates to send session tickets, we - // are ready to do it now. - if err := hs.sendSessionTickets(); err != nil { - return err - } - - return nil -} - -func (hs *serverHandshakeStateTLS13) readClientFinished() error { - c := hs.c - - // finishedMsg is not included in the transcript. - msg, err := c.readHandshake(nil) - if err != nil { - return err - } - - finished, ok := msg.(*finishedMsg) - if !ok { - c.sendAlert(alertUnexpectedMessage) - return unexpectedMessageError(finished, msg) - } - - if !hmac.Equal(hs.clientFinished, finished.verifyData) { - c.sendAlert(alertDecryptError) - return errors.New("tls: invalid client finished hash") - } - - c.in.setTrafficSecret(hs.suite, QUICEncryptionLevelApplication, hs.trafficSecret) - - return nil -} diff --git a/vendor/github.com/quic-go/qtls-go1-20/key_agreement.go b/vendor/github.com/quic-go/qtls-go1-20/key_agreement.go deleted file mode 100644 index f926869a1..000000000 --- a/vendor/github.com/quic-go/qtls-go1-20/key_agreement.go +++ /dev/null @@ -1,366 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package qtls - -import ( - "crypto" - "crypto/ecdh" - "crypto/md5" - "crypto/rsa" - "crypto/sha1" - "crypto/x509" - "errors" - "fmt" - "io" -) - -// a keyAgreement implements the client and server side of a TLS key agreement -// protocol by generating and processing key exchange messages. -type keyAgreement interface { - // On the server side, the first two methods are called in order. - - // In the case that the key agreement protocol doesn't use a - // ServerKeyExchange message, generateServerKeyExchange can return nil, - // nil. - generateServerKeyExchange(*config, *Certificate, *clientHelloMsg, *serverHelloMsg) (*serverKeyExchangeMsg, error) - processClientKeyExchange(*config, *Certificate, *clientKeyExchangeMsg, uint16) ([]byte, error) - - // On the client side, the next two methods are called in order. - - // This method may not be called if the server doesn't send a - // ServerKeyExchange message. - processServerKeyExchange(*config, *clientHelloMsg, *serverHelloMsg, *x509.Certificate, *serverKeyExchangeMsg) error - generateClientKeyExchange(*config, *clientHelloMsg, *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) -} - -var errClientKeyExchange = errors.New("tls: invalid ClientKeyExchange message") -var errServerKeyExchange = errors.New("tls: invalid ServerKeyExchange message") - -// rsaKeyAgreement implements the standard TLS key agreement where the client -// encrypts the pre-master secret to the server's public key. -type rsaKeyAgreement struct{} - -func (ka rsaKeyAgreement) generateServerKeyExchange(config *config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg) (*serverKeyExchangeMsg, error) { - return nil, nil -} - -func (ka rsaKeyAgreement) processClientKeyExchange(config *config, cert *Certificate, ckx *clientKeyExchangeMsg, version uint16) ([]byte, error) { - if len(ckx.ciphertext) < 2 { - return nil, errClientKeyExchange - } - ciphertextLen := int(ckx.ciphertext[0])<<8 | int(ckx.ciphertext[1]) - if ciphertextLen != len(ckx.ciphertext)-2 { - return nil, errClientKeyExchange - } - ciphertext := ckx.ciphertext[2:] - - priv, ok := cert.PrivateKey.(crypto.Decrypter) - if !ok { - return nil, errors.New("tls: certificate private key does not implement crypto.Decrypter") - } - // Perform constant time RSA PKCS #1 v1.5 decryption - preMasterSecret, err := priv.Decrypt(config.rand(), ciphertext, &rsa.PKCS1v15DecryptOptions{SessionKeyLen: 48}) - if err != nil { - return nil, err - } - // We don't check the version number in the premaster secret. For one, - // by checking it, we would leak information about the validity of the - // encrypted pre-master secret. Secondly, it provides only a small - // benefit against a downgrade attack and some implementations send the - // wrong version anyway. See the discussion at the end of section - // 7.4.7.1 of RFC 4346. - return preMasterSecret, nil -} - -func (ka rsaKeyAgreement) processServerKeyExchange(config *config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, skx *serverKeyExchangeMsg) error { - return errors.New("tls: unexpected ServerKeyExchange") -} - -func (ka rsaKeyAgreement) generateClientKeyExchange(config *config, clientHello *clientHelloMsg, cert *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) { - preMasterSecret := make([]byte, 48) - preMasterSecret[0] = byte(clientHello.vers >> 8) - preMasterSecret[1] = byte(clientHello.vers) - _, err := io.ReadFull(config.rand(), preMasterSecret[2:]) - if err != nil { - return nil, nil, err - } - - rsaKey, ok := cert.PublicKey.(*rsa.PublicKey) - if !ok { - return nil, nil, errors.New("tls: server certificate contains incorrect key type for selected ciphersuite") - } - encrypted, err := rsa.EncryptPKCS1v15(config.rand(), rsaKey, preMasterSecret) - if err != nil { - return nil, nil, err - } - ckx := new(clientKeyExchangeMsg) - ckx.ciphertext = make([]byte, len(encrypted)+2) - ckx.ciphertext[0] = byte(len(encrypted) >> 8) - ckx.ciphertext[1] = byte(len(encrypted)) - copy(ckx.ciphertext[2:], encrypted) - return preMasterSecret, ckx, nil -} - -// sha1Hash calculates a SHA1 hash over the given byte slices. -func sha1Hash(slices [][]byte) []byte { - hsha1 := sha1.New() - for _, slice := range slices { - hsha1.Write(slice) - } - return hsha1.Sum(nil) -} - -// md5SHA1Hash implements TLS 1.0's hybrid hash function which consists of the -// concatenation of an MD5 and SHA1 hash. -func md5SHA1Hash(slices [][]byte) []byte { - md5sha1 := make([]byte, md5.Size+sha1.Size) - hmd5 := md5.New() - for _, slice := range slices { - hmd5.Write(slice) - } - copy(md5sha1, hmd5.Sum(nil)) - copy(md5sha1[md5.Size:], sha1Hash(slices)) - return md5sha1 -} - -// hashForServerKeyExchange hashes the given slices and returns their digest -// using the given hash function (for >= TLS 1.2) or using a default based on -// the sigType (for earlier TLS versions). For Ed25519 signatures, which don't -// do pre-hashing, it returns the concatenation of the slices. -func hashForServerKeyExchange(sigType uint8, hashFunc crypto.Hash, version uint16, slices ...[]byte) []byte { - if sigType == signatureEd25519 { - var signed []byte - for _, slice := range slices { - signed = append(signed, slice...) - } - return signed - } - if version >= VersionTLS12 { - h := hashFunc.New() - for _, slice := range slices { - h.Write(slice) - } - digest := h.Sum(nil) - return digest - } - if sigType == signatureECDSA { - return sha1Hash(slices) - } - return md5SHA1Hash(slices) -} - -// ecdheKeyAgreement implements a TLS key agreement where the server -// generates an ephemeral EC public/private key pair and signs it. The -// pre-master secret is then calculated using ECDH. The signature may -// be ECDSA, Ed25519 or RSA. -type ecdheKeyAgreement struct { - version uint16 - isRSA bool - key *ecdh.PrivateKey - - // ckx and preMasterSecret are generated in processServerKeyExchange - // and returned in generateClientKeyExchange. - ckx *clientKeyExchangeMsg - preMasterSecret []byte -} - -func (ka *ecdheKeyAgreement) generateServerKeyExchange(config *config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg) (*serverKeyExchangeMsg, error) { - var curveID CurveID - for _, c := range clientHello.supportedCurves { - if config.supportsCurve(c) { - curveID = c - break - } - } - - if curveID == 0 { - return nil, errors.New("tls: no supported elliptic curves offered") - } - if _, ok := curveForCurveID(curveID); !ok { - return nil, errors.New("tls: CurvePreferences includes unsupported curve") - } - - key, err := generateECDHEKey(config.rand(), curveID) - if err != nil { - return nil, err - } - ka.key = key - - // See RFC 4492, Section 5.4. - ecdhePublic := key.PublicKey().Bytes() - serverECDHEParams := make([]byte, 1+2+1+len(ecdhePublic)) - serverECDHEParams[0] = 3 // named curve - serverECDHEParams[1] = byte(curveID >> 8) - serverECDHEParams[2] = byte(curveID) - serverECDHEParams[3] = byte(len(ecdhePublic)) - copy(serverECDHEParams[4:], ecdhePublic) - - priv, ok := cert.PrivateKey.(crypto.Signer) - if !ok { - return nil, fmt.Errorf("tls: certificate private key of type %T does not implement crypto.Signer", cert.PrivateKey) - } - - var signatureAlgorithm SignatureScheme - var sigType uint8 - var sigHash crypto.Hash - if ka.version >= VersionTLS12 { - signatureAlgorithm, err = selectSignatureScheme(ka.version, cert, clientHello.supportedSignatureAlgorithms) - if err != nil { - return nil, err - } - sigType, sigHash, err = typeAndHashFromSignatureScheme(signatureAlgorithm) - if err != nil { - return nil, err - } - } else { - sigType, sigHash, err = legacyTypeAndHashFromPublicKey(priv.Public()) - if err != nil { - return nil, err - } - } - if (sigType == signaturePKCS1v15 || sigType == signatureRSAPSS) != ka.isRSA { - return nil, errors.New("tls: certificate cannot be used with the selected cipher suite") - } - - signed := hashForServerKeyExchange(sigType, sigHash, ka.version, clientHello.random, hello.random, serverECDHEParams) - - signOpts := crypto.SignerOpts(sigHash) - if sigType == signatureRSAPSS { - signOpts = &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash, Hash: sigHash} - } - sig, err := priv.Sign(config.rand(), signed, signOpts) - if err != nil { - return nil, errors.New("tls: failed to sign ECDHE parameters: " + err.Error()) - } - - skx := new(serverKeyExchangeMsg) - sigAndHashLen := 0 - if ka.version >= VersionTLS12 { - sigAndHashLen = 2 - } - skx.key = make([]byte, len(serverECDHEParams)+sigAndHashLen+2+len(sig)) - copy(skx.key, serverECDHEParams) - k := skx.key[len(serverECDHEParams):] - if ka.version >= VersionTLS12 { - k[0] = byte(signatureAlgorithm >> 8) - k[1] = byte(signatureAlgorithm) - k = k[2:] - } - k[0] = byte(len(sig) >> 8) - k[1] = byte(len(sig)) - copy(k[2:], sig) - - return skx, nil -} - -func (ka *ecdheKeyAgreement) processClientKeyExchange(config *config, cert *Certificate, ckx *clientKeyExchangeMsg, version uint16) ([]byte, error) { - if len(ckx.ciphertext) == 0 || int(ckx.ciphertext[0]) != len(ckx.ciphertext)-1 { - return nil, errClientKeyExchange - } - - peerKey, err := ka.key.Curve().NewPublicKey(ckx.ciphertext[1:]) - if err != nil { - return nil, errClientKeyExchange - } - preMasterSecret, err := ka.key.ECDH(peerKey) - if err != nil { - return nil, errClientKeyExchange - } - - return preMasterSecret, nil -} - -func (ka *ecdheKeyAgreement) processServerKeyExchange(config *config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, skx *serverKeyExchangeMsg) error { - if len(skx.key) < 4 { - return errServerKeyExchange - } - if skx.key[0] != 3 { // named curve - return errors.New("tls: server selected unsupported curve") - } - curveID := CurveID(skx.key[1])<<8 | CurveID(skx.key[2]) - - publicLen := int(skx.key[3]) - if publicLen+4 > len(skx.key) { - return errServerKeyExchange - } - serverECDHEParams := skx.key[:4+publicLen] - publicKey := serverECDHEParams[4:] - - sig := skx.key[4+publicLen:] - if len(sig) < 2 { - return errServerKeyExchange - } - - if _, ok := curveForCurveID(curveID); !ok { - return errors.New("tls: server selected unsupported curve") - } - - key, err := generateECDHEKey(config.rand(), curveID) - if err != nil { - return err - } - ka.key = key - - peerKey, err := key.Curve().NewPublicKey(publicKey) - if err != nil { - return errServerKeyExchange - } - ka.preMasterSecret, err = key.ECDH(peerKey) - if err != nil { - return errServerKeyExchange - } - - ourPublicKey := key.PublicKey().Bytes() - ka.ckx = new(clientKeyExchangeMsg) - ka.ckx.ciphertext = make([]byte, 1+len(ourPublicKey)) - ka.ckx.ciphertext[0] = byte(len(ourPublicKey)) - copy(ka.ckx.ciphertext[1:], ourPublicKey) - - var sigType uint8 - var sigHash crypto.Hash - if ka.version >= VersionTLS12 { - signatureAlgorithm := SignatureScheme(sig[0])<<8 | SignatureScheme(sig[1]) - sig = sig[2:] - if len(sig) < 2 { - return errServerKeyExchange - } - - if !isSupportedSignatureAlgorithm(signatureAlgorithm, clientHello.supportedSignatureAlgorithms) { - return errors.New("tls: certificate used with invalid signature algorithm") - } - sigType, sigHash, err = typeAndHashFromSignatureScheme(signatureAlgorithm) - if err != nil { - return err - } - } else { - sigType, sigHash, err = legacyTypeAndHashFromPublicKey(cert.PublicKey) - if err != nil { - return err - } - } - if (sigType == signaturePKCS1v15 || sigType == signatureRSAPSS) != ka.isRSA { - return errServerKeyExchange - } - - sigLen := int(sig[0])<<8 | int(sig[1]) - if sigLen+2 != len(sig) { - return errServerKeyExchange - } - sig = sig[2:] - - signed := hashForServerKeyExchange(sigType, sigHash, ka.version, clientHello.random, serverHello.random, serverECDHEParams) - if err := verifyHandshakeSignature(sigType, cert.PublicKey, sigHash, signed, sig); err != nil { - return errors.New("tls: invalid signature by the server certificate: " + err.Error()) - } - return nil -} - -func (ka *ecdheKeyAgreement) generateClientKeyExchange(config *config, clientHello *clientHelloMsg, cert *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) { - if ka.ckx == nil { - return nil, nil, errors.New("tls: missing ServerKeyExchange message") - } - - return ka.preMasterSecret, ka.ckx, nil -} diff --git a/vendor/github.com/quic-go/qtls-go1-20/key_schedule.go b/vendor/github.com/quic-go/qtls-go1-20/key_schedule.go deleted file mode 100644 index a4568933d..000000000 --- a/vendor/github.com/quic-go/qtls-go1-20/key_schedule.go +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package qtls - -import ( - "crypto/ecdh" - "crypto/hmac" - "errors" - "fmt" - "hash" - "io" - - "golang.org/x/crypto/cryptobyte" - "golang.org/x/crypto/hkdf" -) - -// This file contains the functions necessary to compute the TLS 1.3 key -// schedule. See RFC 8446, Section 7. - -const ( - resumptionBinderLabel = "res binder" - clientEarlyTrafficLabel = "c e traffic" - clientHandshakeTrafficLabel = "c hs traffic" - serverHandshakeTrafficLabel = "s hs traffic" - clientApplicationTrafficLabel = "c ap traffic" - serverApplicationTrafficLabel = "s ap traffic" - exporterLabel = "exp master" - resumptionLabel = "res master" - trafficUpdateLabel = "traffic upd" -) - -// expandLabel implements HKDF-Expand-Label from RFC 8446, Section 7.1. -func (c *cipherSuiteTLS13) expandLabel(secret []byte, label string, context []byte, length int) []byte { - var hkdfLabel cryptobyte.Builder - hkdfLabel.AddUint16(uint16(length)) - hkdfLabel.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes([]byte("tls13 ")) - b.AddBytes([]byte(label)) - }) - hkdfLabel.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(context) - }) - hkdfLabelBytes, err := hkdfLabel.Bytes() - if err != nil { - // Rather than calling BytesOrPanic, we explicitly handle this error, in - // order to provide a reasonable error message. It should be basically - // impossible for this to panic, and routing errors back through the - // tree rooted in this function is quite painful. The labels are fixed - // size, and the context is either a fixed-length computed hash, or - // parsed from a field which has the same length limitation. As such, an - // error here is likely to only be caused during development. - // - // NOTE: another reasonable approach here might be to return a - // randomized slice if we encounter an error, which would break the - // connection, but avoid panicking. This would perhaps be safer but - // significantly more confusing to users. - panic(fmt.Errorf("failed to construct HKDF label: %s", err)) - } - out := make([]byte, length) - n, err := hkdf.Expand(c.hash.New, secret, hkdfLabelBytes).Read(out) - if err != nil || n != length { - panic("tls: HKDF-Expand-Label invocation failed unexpectedly") - } - return out -} - -// deriveSecret implements Derive-Secret from RFC 8446, Section 7.1. -func (c *cipherSuiteTLS13) deriveSecret(secret []byte, label string, transcript hash.Hash) []byte { - if transcript == nil { - transcript = c.hash.New() - } - return c.expandLabel(secret, label, transcript.Sum(nil), c.hash.Size()) -} - -// extract implements HKDF-Extract with the cipher suite hash. -func (c *cipherSuiteTLS13) extract(newSecret, currentSecret []byte) []byte { - if newSecret == nil { - newSecret = make([]byte, c.hash.Size()) - } - return hkdf.Extract(c.hash.New, newSecret, currentSecret) -} - -// nextTrafficSecret generates the next traffic secret, given the current one, -// according to RFC 8446, Section 7.2. -func (c *cipherSuiteTLS13) nextTrafficSecret(trafficSecret []byte) []byte { - return c.expandLabel(trafficSecret, trafficUpdateLabel, nil, c.hash.Size()) -} - -// trafficKey generates traffic keys according to RFC 8446, Section 7.3. -func (c *cipherSuiteTLS13) trafficKey(trafficSecret []byte) (key, iv []byte) { - key = c.expandLabel(trafficSecret, "key", nil, c.keyLen) - iv = c.expandLabel(trafficSecret, "iv", nil, aeadNonceLength) - return -} - -// finishedHash generates the Finished verify_data or PskBinderEntry according -// to RFC 8446, Section 4.4.4. See sections 4.4 and 4.2.11.2 for the baseKey -// selection. -func (c *cipherSuiteTLS13) finishedHash(baseKey []byte, transcript hash.Hash) []byte { - finishedKey := c.expandLabel(baseKey, "finished", nil, c.hash.Size()) - verifyData := hmac.New(c.hash.New, finishedKey) - verifyData.Write(transcript.Sum(nil)) - return verifyData.Sum(nil) -} - -// exportKeyingMaterial implements RFC5705 exporters for TLS 1.3 according to -// RFC 8446, Section 7.5. -func (c *cipherSuiteTLS13) exportKeyingMaterial(masterSecret []byte, transcript hash.Hash) func(string, []byte, int) ([]byte, error) { - expMasterSecret := c.deriveSecret(masterSecret, exporterLabel, transcript) - return func(label string, context []byte, length int) ([]byte, error) { - secret := c.deriveSecret(expMasterSecret, label, nil) - h := c.hash.New() - h.Write(context) - return c.expandLabel(secret, "exporter", h.Sum(nil), length), nil - } -} - -// generateECDHEKey returns a PrivateKey that implements Diffie-Hellman -// according to RFC 8446, Section 4.2.8.2. -func generateECDHEKey(rand io.Reader, curveID CurveID) (*ecdh.PrivateKey, error) { - curve, ok := curveForCurveID(curveID) - if !ok { - return nil, errors.New("tls: internal error: unsupported curve") - } - - return curve.GenerateKey(rand) -} - -func curveForCurveID(id CurveID) (ecdh.Curve, bool) { - switch id { - case X25519: - return ecdh.X25519(), true - case CurveP256: - return ecdh.P256(), true - case CurveP384: - return ecdh.P384(), true - case CurveP521: - return ecdh.P521(), true - default: - return nil, false - } -} - -func curveIDForCurve(curve ecdh.Curve) (CurveID, bool) { - switch curve { - case ecdh.X25519(): - return X25519, true - case ecdh.P256(): - return CurveP256, true - case ecdh.P384(): - return CurveP384, true - case ecdh.P521(): - return CurveP521, true - default: - return 0, false - } -} diff --git a/vendor/github.com/quic-go/qtls-go1-20/notboring.go b/vendor/github.com/quic-go/qtls-go1-20/notboring.go deleted file mode 100644 index f292e4f02..000000000 --- a/vendor/github.com/quic-go/qtls-go1-20/notboring.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package qtls - -func needFIPS() bool { return false } - -func supportedSignatureAlgorithms() []SignatureScheme { - return defaultSupportedSignatureAlgorithms -} - -func fipsMinVersion(c *config) uint16 { panic("fipsMinVersion") } -func fipsMaxVersion(c *config) uint16 { panic("fipsMaxVersion") } -func fipsCurvePreferences(c *config) []CurveID { panic("fipsCurvePreferences") } -func fipsCipherSuites(c *config) []uint16 { panic("fipsCipherSuites") } - -var fipsSupportedSignatureAlgorithms []SignatureScheme diff --git a/vendor/github.com/quic-go/qtls-go1-20/prf.go b/vendor/github.com/quic-go/qtls-go1-20/prf.go deleted file mode 100644 index 147128918..000000000 --- a/vendor/github.com/quic-go/qtls-go1-20/prf.go +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package qtls - -import ( - "crypto" - "crypto/hmac" - "crypto/md5" - "crypto/sha1" - "crypto/sha256" - "crypto/sha512" - "errors" - "fmt" - "hash" -) - -// Split a premaster secret in two as specified in RFC 4346, Section 5. -func splitPreMasterSecret(secret []byte) (s1, s2 []byte) { - s1 = secret[0 : (len(secret)+1)/2] - s2 = secret[len(secret)/2:] - return -} - -// pHash implements the P_hash function, as defined in RFC 4346, Section 5. -func pHash(result, secret, seed []byte, hash func() hash.Hash) { - h := hmac.New(hash, secret) - h.Write(seed) - a := h.Sum(nil) - - j := 0 - for j < len(result) { - h.Reset() - h.Write(a) - h.Write(seed) - b := h.Sum(nil) - copy(result[j:], b) - j += len(b) - - h.Reset() - h.Write(a) - a = h.Sum(nil) - } -} - -// prf10 implements the TLS 1.0 pseudo-random function, as defined in RFC 2246, Section 5. -func prf10(result, secret, label, seed []byte) { - hashSHA1 := sha1.New - hashMD5 := md5.New - - labelAndSeed := make([]byte, len(label)+len(seed)) - copy(labelAndSeed, label) - copy(labelAndSeed[len(label):], seed) - - s1, s2 := splitPreMasterSecret(secret) - pHash(result, s1, labelAndSeed, hashMD5) - result2 := make([]byte, len(result)) - pHash(result2, s2, labelAndSeed, hashSHA1) - - for i, b := range result2 { - result[i] ^= b - } -} - -// prf12 implements the TLS 1.2 pseudo-random function, as defined in RFC 5246, Section 5. -func prf12(hashFunc func() hash.Hash) func(result, secret, label, seed []byte) { - return func(result, secret, label, seed []byte) { - labelAndSeed := make([]byte, len(label)+len(seed)) - copy(labelAndSeed, label) - copy(labelAndSeed[len(label):], seed) - - pHash(result, secret, labelAndSeed, hashFunc) - } -} - -const ( - masterSecretLength = 48 // Length of a master secret in TLS 1.1. - finishedVerifyLength = 12 // Length of verify_data in a Finished message. -) - -var masterSecretLabel = []byte("master secret") -var keyExpansionLabel = []byte("key expansion") -var clientFinishedLabel = []byte("client finished") -var serverFinishedLabel = []byte("server finished") - -func prfAndHashForVersion(version uint16, suite *cipherSuite) (func(result, secret, label, seed []byte), crypto.Hash) { - switch version { - case VersionTLS10, VersionTLS11: - return prf10, crypto.Hash(0) - case VersionTLS12: - if suite.flags&suiteSHA384 != 0 { - return prf12(sha512.New384), crypto.SHA384 - } - return prf12(sha256.New), crypto.SHA256 - default: - panic("unknown version") - } -} - -func prfForVersion(version uint16, suite *cipherSuite) func(result, secret, label, seed []byte) { - prf, _ := prfAndHashForVersion(version, suite) - return prf -} - -// masterFromPreMasterSecret generates the master secret from the pre-master -// secret. See RFC 5246, Section 8.1. -func masterFromPreMasterSecret(version uint16, suite *cipherSuite, preMasterSecret, clientRandom, serverRandom []byte) []byte { - seed := make([]byte, 0, len(clientRandom)+len(serverRandom)) - seed = append(seed, clientRandom...) - seed = append(seed, serverRandom...) - - masterSecret := make([]byte, masterSecretLength) - prfForVersion(version, suite)(masterSecret, preMasterSecret, masterSecretLabel, seed) - return masterSecret -} - -// keysFromMasterSecret generates the connection keys from the master -// secret, given the lengths of the MAC key, cipher key and IV, as defined in -// RFC 2246, Section 6.3. -func keysFromMasterSecret(version uint16, suite *cipherSuite, masterSecret, clientRandom, serverRandom []byte, macLen, keyLen, ivLen int) (clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV []byte) { - seed := make([]byte, 0, len(serverRandom)+len(clientRandom)) - seed = append(seed, serverRandom...) - seed = append(seed, clientRandom...) - - n := 2*macLen + 2*keyLen + 2*ivLen - keyMaterial := make([]byte, n) - prfForVersion(version, suite)(keyMaterial, masterSecret, keyExpansionLabel, seed) - clientMAC = keyMaterial[:macLen] - keyMaterial = keyMaterial[macLen:] - serverMAC = keyMaterial[:macLen] - keyMaterial = keyMaterial[macLen:] - clientKey = keyMaterial[:keyLen] - keyMaterial = keyMaterial[keyLen:] - serverKey = keyMaterial[:keyLen] - keyMaterial = keyMaterial[keyLen:] - clientIV = keyMaterial[:ivLen] - keyMaterial = keyMaterial[ivLen:] - serverIV = keyMaterial[:ivLen] - return -} - -func newFinishedHash(version uint16, cipherSuite *cipherSuite) finishedHash { - var buffer []byte - if version >= VersionTLS12 { - buffer = []byte{} - } - - prf, hash := prfAndHashForVersion(version, cipherSuite) - if hash != 0 { - return finishedHash{hash.New(), hash.New(), nil, nil, buffer, version, prf} - } - - return finishedHash{sha1.New(), sha1.New(), md5.New(), md5.New(), buffer, version, prf} -} - -// A finishedHash calculates the hash of a set of handshake messages suitable -// for including in a Finished message. -type finishedHash struct { - client hash.Hash - server hash.Hash - - // Prior to TLS 1.2, an additional MD5 hash is required. - clientMD5 hash.Hash - serverMD5 hash.Hash - - // In TLS 1.2, a full buffer is sadly required. - buffer []byte - - version uint16 - prf func(result, secret, label, seed []byte) -} - -func (h *finishedHash) Write(msg []byte) (n int, err error) { - h.client.Write(msg) - h.server.Write(msg) - - if h.version < VersionTLS12 { - h.clientMD5.Write(msg) - h.serverMD5.Write(msg) - } - - if h.buffer != nil { - h.buffer = append(h.buffer, msg...) - } - - return len(msg), nil -} - -func (h finishedHash) Sum() []byte { - if h.version >= VersionTLS12 { - return h.client.Sum(nil) - } - - out := make([]byte, 0, md5.Size+sha1.Size) - out = h.clientMD5.Sum(out) - return h.client.Sum(out) -} - -// clientSum returns the contents of the verify_data member of a client's -// Finished message. -func (h finishedHash) clientSum(masterSecret []byte) []byte { - out := make([]byte, finishedVerifyLength) - h.prf(out, masterSecret, clientFinishedLabel, h.Sum()) - return out -} - -// serverSum returns the contents of the verify_data member of a server's -// Finished message. -func (h finishedHash) serverSum(masterSecret []byte) []byte { - out := make([]byte, finishedVerifyLength) - h.prf(out, masterSecret, serverFinishedLabel, h.Sum()) - return out -} - -// hashForClientCertificate returns the handshake messages so far, pre-hashed if -// necessary, suitable for signing by a TLS client certificate. -func (h finishedHash) hashForClientCertificate(sigType uint8, hashAlg crypto.Hash) []byte { - if (h.version >= VersionTLS12 || sigType == signatureEd25519) && h.buffer == nil { - panic("tls: handshake hash for a client certificate requested after discarding the handshake buffer") - } - - if sigType == signatureEd25519 { - return h.buffer - } - - if h.version >= VersionTLS12 { - hash := hashAlg.New() - hash.Write(h.buffer) - return hash.Sum(nil) - } - - if sigType == signatureECDSA { - return h.server.Sum(nil) - } - - return h.Sum() -} - -// discardHandshakeBuffer is called when there is no more need to -// buffer the entirety of the handshake messages. -func (h *finishedHash) discardHandshakeBuffer() { - h.buffer = nil -} - -// noExportedKeyingMaterial is used as a value of -// ConnectionState.ekm when renegotiation is enabled and thus -// we wish to fail all key-material export requests. -func noExportedKeyingMaterial(label string, context []byte, length int) ([]byte, error) { - return nil, errors.New("crypto/tls: ExportKeyingMaterial is unavailable when renegotiation is enabled") -} - -// ekmFromMasterSecret generates exported keying material as defined in RFC 5705. -func ekmFromMasterSecret(version uint16, suite *cipherSuite, masterSecret, clientRandom, serverRandom []byte) func(string, []byte, int) ([]byte, error) { - return func(label string, context []byte, length int) ([]byte, error) { - switch label { - case "client finished", "server finished", "master secret", "key expansion": - // These values are reserved and may not be used. - return nil, fmt.Errorf("crypto/tls: reserved ExportKeyingMaterial label: %s", label) - } - - seedLen := len(serverRandom) + len(clientRandom) - if context != nil { - seedLen += 2 + len(context) - } - seed := make([]byte, 0, seedLen) - - seed = append(seed, clientRandom...) - seed = append(seed, serverRandom...) - - if context != nil { - if len(context) >= 1<<16 { - return nil, fmt.Errorf("crypto/tls: ExportKeyingMaterial context too long") - } - seed = append(seed, byte(len(context)>>8), byte(len(context))) - seed = append(seed, context...) - } - - keyMaterial := make([]byte, length) - prfForVersion(version, suite)(keyMaterial, masterSecret, []byte(label), seed) - return keyMaterial, nil - } -} diff --git a/vendor/github.com/quic-go/qtls-go1-20/quic.go b/vendor/github.com/quic-go/qtls-go1-20/quic.go deleted file mode 100644 index f146688b1..000000000 --- a/vendor/github.com/quic-go/qtls-go1-20/quic.go +++ /dev/null @@ -1,418 +0,0 @@ -// Copyright 2023 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package qtls - -import ( - "context" - "errors" - "fmt" -) - -// QUICEncryptionLevel represents a QUIC encryption level used to transmit -// handshake messages. -type QUICEncryptionLevel int - -const ( - QUICEncryptionLevelInitial = QUICEncryptionLevel(iota) - QUICEncryptionLevelEarly - QUICEncryptionLevelHandshake - QUICEncryptionLevelApplication -) - -func (l QUICEncryptionLevel) String() string { - switch l { - case QUICEncryptionLevelInitial: - return "Initial" - case QUICEncryptionLevelEarly: - return "Early" - case QUICEncryptionLevelHandshake: - return "Handshake" - case QUICEncryptionLevelApplication: - return "Application" - default: - return fmt.Sprintf("QUICEncryptionLevel(%v)", int(l)) - } -} - -// A QUICConn represents a connection which uses a QUIC implementation as the underlying -// transport as described in RFC 9001. -// -// Methods of QUICConn are not safe for concurrent use. -type QUICConn struct { - conn *Conn - - sessionTicketSent bool -} - -// A QUICConfig configures a QUICConn. -type QUICConfig struct { - TLSConfig *Config - ExtraConfig *ExtraConfig -} - -// A QUICEventKind is a type of operation on a QUIC connection. -type QUICEventKind int - -const ( - // QUICNoEvent indicates that there are no events available. - QUICNoEvent QUICEventKind = iota - - // QUICSetReadSecret and QUICSetWriteSecret provide the read and write - // secrets for a given encryption level. - // QUICEvent.Level, QUICEvent.Data, and QUICEvent.Suite are set. - // - // Secrets for the Initial encryption level are derived from the initial - // destination connection ID, and are not provided by the QUICConn. - QUICSetReadSecret - QUICSetWriteSecret - - // QUICWriteData provides data to send to the peer in CRYPTO frames. - // QUICEvent.Data is set. - QUICWriteData - - // QUICTransportParameters provides the peer's QUIC transport parameters. - // QUICEvent.Data is set. - QUICTransportParameters - - // QUICTransportParametersRequired indicates that the caller must provide - // QUIC transport parameters to send to the peer. The caller should set - // the transport parameters with QUICConn.SetTransportParameters and call - // QUICConn.NextEvent again. - // - // If transport parameters are set before calling QUICConn.Start, the - // connection will never generate a QUICTransportParametersRequired event. - QUICTransportParametersRequired - - // QUICRejectedEarlyData indicates that the server rejected 0-RTT data even - // if we offered it. It's returned before QUICEncryptionLevelApplication - // keys are returned. - QUICRejectedEarlyData - - // QUICHandshakeDone indicates that the TLS handshake has completed. - QUICHandshakeDone -) - -// A QUICEvent is an event occurring on a QUIC connection. -// -// The type of event is specified by the Kind field. -// The contents of the other fields are kind-specific. -type QUICEvent struct { - Kind QUICEventKind - - // Set for QUICSetReadSecret, QUICSetWriteSecret, and QUICWriteData. - Level QUICEncryptionLevel - - // Set for QUICTransportParameters, QUICSetReadSecret, QUICSetWriteSecret, and QUICWriteData. - // The contents are owned by crypto/tls, and are valid until the next NextEvent call. - Data []byte - - // Set for QUICSetReadSecret and QUICSetWriteSecret. - Suite uint16 -} - -type quicState struct { - events []QUICEvent - nextEvent int - - // eventArr is a statically allocated event array, large enough to handle - // the usual maximum number of events resulting from a single call: transport - // parameters, Initial data, Early read secret, Handshake write and read - // secrets, Handshake data, Application write secret, Application data. - eventArr [8]QUICEvent - - started bool - signalc chan struct{} // handshake data is available to be read - blockedc chan struct{} // handshake is waiting for data, closed when done - cancelc <-chan struct{} // handshake has been canceled - cancel context.CancelFunc - - // readbuf is shared between HandleData and the handshake goroutine. - // HandshakeCryptoData passes ownership to the handshake goroutine by - // reading from signalc, and reclaims ownership by reading from blockedc. - readbuf []byte - - transportParams []byte // to send to the peer -} - -// QUICClient returns a new TLS client side connection using QUICTransport as the -// underlying transport. The config cannot be nil. -// -// The config's MinVersion must be at least TLS 1.3. -func QUICClient(config *QUICConfig) *QUICConn { - return newQUICConn(Client(nil, config.TLSConfig), config.ExtraConfig) -} - -// QUICServer returns a new TLS server side connection using QUICTransport as the -// underlying transport. The config cannot be nil. -// -// The config's MinVersion must be at least TLS 1.3. -func QUICServer(config *QUICConfig) *QUICConn { - return newQUICConn(Server(nil, config.TLSConfig), config.ExtraConfig) -} - -func newQUICConn(conn *Conn, extraConfig *ExtraConfig) *QUICConn { - conn.quic = &quicState{ - signalc: make(chan struct{}), - blockedc: make(chan struct{}), - } - conn.quic.events = conn.quic.eventArr[:0] - conn.extraConfig = extraConfig - return &QUICConn{ - conn: conn, - } -} - -// Start starts the client or server handshake protocol. -// It may produce connection events, which may be read with NextEvent. -// -// Start must be called at most once. -func (q *QUICConn) Start(ctx context.Context) error { - if q.conn.quic.started { - return quicError(errors.New("tls: Start called more than once")) - } - q.conn.quic.started = true - if q.conn.config.MinVersion < VersionTLS13 { - return quicError(errors.New("tls: Config MinVersion must be at least TLS 1.13")) - } - go q.conn.HandshakeContext(ctx) - if _, ok := <-q.conn.quic.blockedc; !ok { - return q.conn.handshakeErr - } - return nil -} - -// NextEvent returns the next event occurring on the connection. -// It returns an event with a Kind of QUICNoEvent when no events are available. -func (q *QUICConn) NextEvent() QUICEvent { - qs := q.conn.quic - if last := qs.nextEvent - 1; last >= 0 && len(qs.events[last].Data) > 0 { - // Write over some of the previous event's data, - // to catch callers erroniously retaining it. - qs.events[last].Data[0] = 0 - } - if qs.nextEvent >= len(qs.events) { - qs.events = qs.events[:0] - qs.nextEvent = 0 - return QUICEvent{Kind: QUICNoEvent} - } - e := qs.events[qs.nextEvent] - qs.events[qs.nextEvent] = QUICEvent{} // zero out references to data - qs.nextEvent++ - return e -} - -// Close closes the connection and stops any in-progress handshake. -func (q *QUICConn) Close() error { - if q.conn.quic.cancel == nil { - return nil // never started - } - q.conn.quic.cancel() - for range q.conn.quic.blockedc { - // Wait for the handshake goroutine to return. - } - return q.conn.handshakeErr -} - -// HandleData handles handshake bytes received from the peer. -// It may produce connection events, which may be read with NextEvent. -func (q *QUICConn) HandleData(level QUICEncryptionLevel, data []byte) error { - c := q.conn - if c.in.level != level { - return quicError(c.in.setErrorLocked(errors.New("tls: handshake data received at wrong level"))) - } - c.quic.readbuf = data - <-c.quic.signalc - _, ok := <-c.quic.blockedc - if ok { - // The handshake goroutine is waiting for more data. - return nil - } - // The handshake goroutine has exited. - c.handshakeMutex.Lock() - defer c.handshakeMutex.Unlock() - c.hand.Write(c.quic.readbuf) - c.quic.readbuf = nil - for q.conn.hand.Len() >= 4 && q.conn.handshakeErr == nil { - b := q.conn.hand.Bytes() - n := int(b[1])<<16 | int(b[2])<<8 | int(b[3]) - if n > maxHandshake { - q.conn.handshakeErr = fmt.Errorf("tls: handshake message of length %d bytes exceeds maximum of %d bytes", n, maxHandshake) - break - } - if len(b) < 4+n { - return nil - } - if err := q.conn.handlePostHandshakeMessage(); err != nil { - q.conn.handshakeErr = err - } - } - if q.conn.handshakeErr != nil { - return quicError(q.conn.handshakeErr) - } - return nil -} - -// SendSessionTicket sends a session ticket to the client. -// It produces connection events, which may be read with NextEvent. -// Currently, it can only be called once. -func (q *QUICConn) SendSessionTicket(earlyData bool) error { - c := q.conn - if !c.isHandshakeComplete.Load() { - return quicError(errors.New("tls: SendSessionTicket called before handshake completed")) - } - if c.isClient { - return quicError(errors.New("tls: SendSessionTicket called on the client")) - } - if q.sessionTicketSent { - return quicError(errors.New("tls: SendSessionTicket called multiple times")) - } - q.sessionTicketSent = true - return quicError(c.sendSessionTicket(earlyData)) -} - -// ConnectionState returns basic TLS details about the connection. -func (q *QUICConn) ConnectionState() ConnectionState { - return q.conn.ConnectionState() -} - -// SetTransportParameters sets the transport parameters to send to the peer. -// -// Server connections may delay setting the transport parameters until after -// receiving the client's transport parameters. See QUICTransportParametersRequired. -func (q *QUICConn) SetTransportParameters(params []byte) { - if params == nil { - params = []byte{} - } - q.conn.quic.transportParams = params - if q.conn.quic.started { - <-q.conn.quic.signalc - <-q.conn.quic.blockedc - } -} - -// quicError ensures err is an AlertError. -// If err is not already, quicError wraps it with alertInternalError. -func quicError(err error) error { - if err == nil { - return nil - } - var ae AlertError - if errors.As(err, &ae) { - return err - } - var a alert - if !errors.As(err, &a) { - a = alertInternalError - } - // Return an error wrapping the original error and an AlertError. - // Truncate the text of the alert to 0 characters. - return fmt.Errorf("%w%.0w", err, AlertError(a)) -} - -func (c *Conn) quicReadHandshakeBytes(n int) error { - for c.hand.Len() < n { - if err := c.quicWaitForSignal(); err != nil { - return err - } - } - return nil -} - -func (c *Conn) quicSetReadSecret(level QUICEncryptionLevel, suite uint16, secret []byte) { - c.quic.events = append(c.quic.events, QUICEvent{ - Kind: QUICSetReadSecret, - Level: level, - Suite: suite, - Data: secret, - }) -} - -func (c *Conn) quicSetWriteSecret(level QUICEncryptionLevel, suite uint16, secret []byte) { - c.quic.events = append(c.quic.events, QUICEvent{ - Kind: QUICSetWriteSecret, - Level: level, - Suite: suite, - Data: secret, - }) -} - -func (c *Conn) quicWriteCryptoData(level QUICEncryptionLevel, data []byte) { - var last *QUICEvent - if len(c.quic.events) > 0 { - last = &c.quic.events[len(c.quic.events)-1] - } - if last == nil || last.Kind != QUICWriteData || last.Level != level { - c.quic.events = append(c.quic.events, QUICEvent{ - Kind: QUICWriteData, - Level: level, - }) - last = &c.quic.events[len(c.quic.events)-1] - } - last.Data = append(last.Data, data...) -} - -func (c *Conn) quicSetTransportParameters(params []byte) { - c.quic.events = append(c.quic.events, QUICEvent{ - Kind: QUICTransportParameters, - Data: params, - }) -} - -func (c *Conn) quicGetTransportParameters() ([]byte, error) { - if c.quic.transportParams == nil { - c.quic.events = append(c.quic.events, QUICEvent{ - Kind: QUICTransportParametersRequired, - }) - } - for c.quic.transportParams == nil { - if err := c.quicWaitForSignal(); err != nil { - return nil, err - } - } - return c.quic.transportParams, nil -} - -func (c *Conn) quicHandshakeComplete() { - c.quic.events = append(c.quic.events, QUICEvent{ - Kind: QUICHandshakeDone, - }) -} - -func (c *Conn) quicRejectedEarlyData() { - c.quic.events = append(c.quic.events, QUICEvent{ - Kind: QUICRejectedEarlyData, - }) -} - -// quicWaitForSignal notifies the QUICConn that handshake progress is blocked, -// and waits for a signal that the handshake should proceed. -// -// The handshake may become blocked waiting for handshake bytes -// or for the user to provide transport parameters. -func (c *Conn) quicWaitForSignal() error { - // Drop the handshake mutex while blocked to allow the user - // to call ConnectionState before the handshake completes. - c.handshakeMutex.Unlock() - defer c.handshakeMutex.Lock() - // Send on blockedc to notify the QUICConn that the handshake is blocked. - // Exported methods of QUICConn wait for the handshake to become blocked - // before returning to the user. - select { - case c.quic.blockedc <- struct{}{}: - case <-c.quic.cancelc: - return c.sendAlertLocked(alertCloseNotify) - } - // The QUICConn reads from signalc to notify us that the handshake may - // be able to proceed. (The QUICConn reads, because we close signalc to - // indicate that the handshake has completed.) - select { - case c.quic.signalc <- struct{}{}: - c.hand.Write(c.quic.readbuf) - c.quic.readbuf = nil - case <-c.quic.cancelc: - return c.sendAlertLocked(alertCloseNotify) - } - return nil -} diff --git a/vendor/github.com/quic-go/qtls-go1-20/ticket.go b/vendor/github.com/quic-go/qtls-go1-20/ticket.go deleted file mode 100644 index 366620707..000000000 --- a/vendor/github.com/quic-go/qtls-go1-20/ticket.go +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package qtls - -import ( - "bytes" - "crypto/aes" - "crypto/cipher" - "crypto/hmac" - "crypto/sha256" - "crypto/subtle" - "errors" - "golang.org/x/crypto/cryptobyte" - "io" -) - -// sessionState contains the information that is serialized into a session -// ticket in order to later resume a connection. -type sessionState struct { - vers uint16 - cipherSuite uint16 - createdAt uint64 - masterSecret []byte // opaque master_secret<1..2^16-1>; - // struct { opaque certificate<1..2^24-1> } Certificate; - certificates [][]byte // Certificate certificate_list<0..2^24-1>; - - // usedOldKey is true if the ticket from which this session came from - // was encrypted with an older key and thus should be refreshed. - usedOldKey bool -} - -func (m *sessionState) marshal() ([]byte, error) { - var b cryptobyte.Builder - b.AddUint16(m.vers) - b.AddUint16(m.cipherSuite) - addUint64(&b, m.createdAt) - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(m.masterSecret) - }) - b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) { - for _, cert := range m.certificates { - b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(cert) - }) - } - }) - return b.Bytes() -} - -func (m *sessionState) unmarshal(data []byte) bool { - *m = sessionState{usedOldKey: m.usedOldKey} - s := cryptobyte.String(data) - if ok := s.ReadUint16(&m.vers) && - s.ReadUint16(&m.cipherSuite) && - readUint64(&s, &m.createdAt) && - readUint16LengthPrefixed(&s, &m.masterSecret) && - len(m.masterSecret) != 0; !ok { - return false - } - var certList cryptobyte.String - if !s.ReadUint24LengthPrefixed(&certList) { - return false - } - for !certList.Empty() { - var cert []byte - if !readUint24LengthPrefixed(&certList, &cert) { - return false - } - m.certificates = append(m.certificates, cert) - } - return s.Empty() -} - -// sessionStateTLS13 is the content of a TLS 1.3 session ticket. Its first -// version (revision = 0) doesn't carry any of the information needed for 0-RTT -// validation and the nonce is always empty. -// version (revision = 1) carries the max_early_data_size sent in the ticket. -// version (revision = 2) carries the ALPN sent in the ticket. -type sessionStateTLS13 struct { - // uint8 version = 0x0304; - // uint8 revision = 2; - cipherSuite uint16 - createdAt uint64 - resumptionSecret []byte // opaque resumption_master_secret<1..2^8-1>; - certificate Certificate // CertificateEntry certificate_list<0..2^24-1>; - maxEarlyData uint32 - alpn string - - appData []byte -} - -func (m *sessionStateTLS13) marshal() ([]byte, error) { - var b cryptobyte.Builder - b.AddUint16(VersionTLS13) - b.AddUint8(2) // revision - b.AddUint16(m.cipherSuite) - addUint64(&b, m.createdAt) - b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(m.resumptionSecret) - }) - marshalCertificate(&b, m.certificate) - b.AddUint32(m.maxEarlyData) - b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes([]byte(m.alpn)) - }) - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(m.appData) - }) - return b.Bytes() -} - -func (m *sessionStateTLS13) unmarshal(data []byte) bool { - *m = sessionStateTLS13{} - s := cryptobyte.String(data) - var version uint16 - var revision uint8 - var alpn []byte - ret := s.ReadUint16(&version) && - version == VersionTLS13 && - s.ReadUint8(&revision) && - revision == 2 && - s.ReadUint16(&m.cipherSuite) && - readUint64(&s, &m.createdAt) && - readUint8LengthPrefixed(&s, &m.resumptionSecret) && - len(m.resumptionSecret) != 0 && - unmarshalCertificate(&s, &m.certificate) && - s.ReadUint32(&m.maxEarlyData) && - readUint8LengthPrefixed(&s, &alpn) && - readUint16LengthPrefixed(&s, &m.appData) && - s.Empty() - m.alpn = string(alpn) - return ret -} - -func (c *Conn) encryptTicket(state []byte) ([]byte, error) { - if len(c.ticketKeys) == 0 { - return nil, errors.New("tls: internal error: session ticket keys unavailable") - } - - encrypted := make([]byte, ticketKeyNameLen+aes.BlockSize+len(state)+sha256.Size) - keyName := encrypted[:ticketKeyNameLen] - iv := encrypted[ticketKeyNameLen : ticketKeyNameLen+aes.BlockSize] - macBytes := encrypted[len(encrypted)-sha256.Size:] - - if _, err := io.ReadFull(c.config.rand(), iv); err != nil { - return nil, err - } - key := c.ticketKeys[0] - copy(keyName, key.keyName[:]) - block, err := aes.NewCipher(key.aesKey[:]) - if err != nil { - return nil, errors.New("tls: failed to create cipher while encrypting ticket: " + err.Error()) - } - cipher.NewCTR(block, iv).XORKeyStream(encrypted[ticketKeyNameLen+aes.BlockSize:], state) - - mac := hmac.New(sha256.New, key.hmacKey[:]) - mac.Write(encrypted[:len(encrypted)-sha256.Size]) - mac.Sum(macBytes[:0]) - - return encrypted, nil -} - -func (c *Conn) decryptTicket(encrypted []byte) (plaintext []byte, usedOldKey bool) { - if len(encrypted) < ticketKeyNameLen+aes.BlockSize+sha256.Size { - return nil, false - } - - keyName := encrypted[:ticketKeyNameLen] - iv := encrypted[ticketKeyNameLen : ticketKeyNameLen+aes.BlockSize] - macBytes := encrypted[len(encrypted)-sha256.Size:] - ciphertext := encrypted[ticketKeyNameLen+aes.BlockSize : len(encrypted)-sha256.Size] - - keyIndex := -1 - for i, candidateKey := range c.ticketKeys { - if bytes.Equal(keyName, candidateKey.keyName[:]) { - keyIndex = i - break - } - } - if keyIndex == -1 { - return nil, false - } - key := &c.ticketKeys[keyIndex] - - mac := hmac.New(sha256.New, key.hmacKey[:]) - mac.Write(encrypted[:len(encrypted)-sha256.Size]) - expected := mac.Sum(nil) - - if subtle.ConstantTimeCompare(macBytes, expected) != 1 { - return nil, false - } - - block, err := aes.NewCipher(key.aesKey[:]) - if err != nil { - return nil, false - } - plaintext = make([]byte, len(ciphertext)) - cipher.NewCTR(block, iv).XORKeyStream(plaintext, ciphertext) - - return plaintext, keyIndex > 0 -} diff --git a/vendor/github.com/quic-go/qtls-go1-20/tls.go b/vendor/github.com/quic-go/qtls-go1-20/tls.go deleted file mode 100644 index 47eed0855..000000000 --- a/vendor/github.com/quic-go/qtls-go1-20/tls.go +++ /dev/null @@ -1,356 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// package qtls partially implements TLS 1.2, as specified in RFC 5246, -// and TLS 1.3, as specified in RFC 8446. -package qtls - -// BUG(agl): The crypto/tls package only implements some countermeasures -// against Lucky13 attacks on CBC-mode encryption, and only on SHA1 -// variants. See http://www.isg.rhul.ac.uk/tls/TLStiming.pdf and -// https://www.imperialviolet.org/2013/02/04/luckythirteen.html. - -import ( - "bytes" - "context" - "crypto" - "crypto/ecdsa" - "crypto/ed25519" - "crypto/rsa" - "crypto/x509" - "encoding/pem" - "errors" - "fmt" - "net" - "os" - "strings" -) - -// Server returns a new TLS server side connection -// using conn as the underlying transport. -// The configuration config must be non-nil and must include -// at least one certificate or else set GetCertificate. -func Server(conn net.Conn, config *Config) *Conn { - c := &Conn{ - conn: conn, - config: fromConfig(config), - } - c.handshakeFn = c.serverHandshake - return c -} - -// Client returns a new TLS client side connection -// using conn as the underlying transport. -// The config cannot be nil: users must set either ServerName or -// InsecureSkipVerify in the config. -func Client(conn net.Conn, config *Config) *Conn { - c := &Conn{ - conn: conn, - config: fromConfig(config), - isClient: true, - } - c.handshakeFn = c.clientHandshake - return c -} - -// A listener implements a network listener (net.Listener) for TLS connections. -type listener struct { - net.Listener - config *Config -} - -// Accept waits for and returns the next incoming TLS connection. -// The returned connection is of type *Conn. -func (l *listener) Accept() (net.Conn, error) { - c, err := l.Listener.Accept() - if err != nil { - return nil, err - } - return Server(c, l.config), nil -} - -// NewListener creates a Listener which accepts connections from an inner -// Listener and wraps each connection with Server. -// The configuration config must be non-nil and must include -// at least one certificate or else set GetCertificate. -func NewListener(inner net.Listener, config *Config) net.Listener { - l := new(listener) - l.Listener = inner - l.config = config - return l -} - -// Listen creates a TLS listener accepting connections on the -// given network address using net.Listen. -// The configuration config must be non-nil and must include -// at least one certificate or else set GetCertificate. -func Listen(network, laddr string, config *Config) (net.Listener, error) { - if config == nil || len(config.Certificates) == 0 && - config.GetCertificate == nil && config.GetConfigForClient == nil { - return nil, errors.New("tls: neither Certificates, GetCertificate, nor GetConfigForClient set in Config") - } - l, err := net.Listen(network, laddr) - if err != nil { - return nil, err - } - return NewListener(l, config), nil -} - -type timeoutError struct{} - -func (timeoutError) Error() string { return "tls: DialWithDialer timed out" } -func (timeoutError) Timeout() bool { return true } -func (timeoutError) Temporary() bool { return true } - -// DialWithDialer connects to the given network address using dialer.Dial and -// then initiates a TLS handshake, returning the resulting TLS connection. Any -// timeout or deadline given in the dialer apply to connection and TLS -// handshake as a whole. -// -// DialWithDialer interprets a nil configuration as equivalent to the zero -// configuration; see the documentation of Config for the defaults. -// -// DialWithDialer uses context.Background internally; to specify the context, -// use Dialer.DialContext with NetDialer set to the desired dialer. -func DialWithDialer(dialer *net.Dialer, network, addr string, config *Config) (*Conn, error) { - return dial(context.Background(), dialer, network, addr, config) -} - -func dial(ctx context.Context, netDialer *net.Dialer, network, addr string, config *Config) (*Conn, error) { - if netDialer.Timeout != 0 { - var cancel context.CancelFunc - ctx, cancel = context.WithTimeout(ctx, netDialer.Timeout) - defer cancel() - } - - if !netDialer.Deadline.IsZero() { - var cancel context.CancelFunc - ctx, cancel = context.WithDeadline(ctx, netDialer.Deadline) - defer cancel() - } - - rawConn, err := netDialer.DialContext(ctx, network, addr) - if err != nil { - return nil, err - } - - colonPos := strings.LastIndex(addr, ":") - if colonPos == -1 { - colonPos = len(addr) - } - hostname := addr[:colonPos] - - if config == nil { - config = defaultConfig() - } - // If no ServerName is set, infer the ServerName - // from the hostname we're connecting to. - if config.ServerName == "" { - // Make a copy to avoid polluting argument or default. - c := config.Clone() - c.ServerName = hostname - config = c - } - - conn := Client(rawConn, config) - if err := conn.HandshakeContext(ctx); err != nil { - rawConn.Close() - return nil, err - } - return conn, nil -} - -// Dial connects to the given network address using net.Dial -// and then initiates a TLS handshake, returning the resulting -// TLS connection. -// Dial interprets a nil configuration as equivalent to -// the zero configuration; see the documentation of Config -// for the defaults. -func Dial(network, addr string, config *Config) (*Conn, error) { - return DialWithDialer(new(net.Dialer), network, addr, config) -} - -// Dialer dials TLS connections given a configuration and a Dialer for the -// underlying connection. -type Dialer struct { - // NetDialer is the optional dialer to use for the TLS connections' - // underlying TCP connections. - // A nil NetDialer is equivalent to the net.Dialer zero value. - NetDialer *net.Dialer - - // Config is the TLS configuration to use for new connections. - // A nil configuration is equivalent to the zero - // configuration; see the documentation of Config for the - // defaults. - Config *Config -} - -// Dial connects to the given network address and initiates a TLS -// handshake, returning the resulting TLS connection. -// -// The returned Conn, if any, will always be of type *Conn. -// -// Dial uses context.Background internally; to specify the context, -// use DialContext. -func (d *Dialer) Dial(network, addr string) (net.Conn, error) { - return d.DialContext(context.Background(), network, addr) -} - -func (d *Dialer) netDialer() *net.Dialer { - if d.NetDialer != nil { - return d.NetDialer - } - return new(net.Dialer) -} - -// DialContext connects to the given network address and initiates a TLS -// handshake, returning the resulting TLS connection. -// -// The provided Context must be non-nil. If the context expires before -// the connection is complete, an error is returned. Once successfully -// connected, any expiration of the context will not affect the -// connection. -// -// The returned Conn, if any, will always be of type *Conn. -func (d *Dialer) DialContext(ctx context.Context, network, addr string) (net.Conn, error) { - c, err := dial(ctx, d.netDialer(), network, addr, d.Config) - if err != nil { - // Don't return c (a typed nil) in an interface. - return nil, err - } - return c, nil -} - -// LoadX509KeyPair reads and parses a public/private key pair from a pair -// of files. The files must contain PEM encoded data. The certificate file -// may contain intermediate certificates following the leaf certificate to -// form a certificate chain. On successful return, Certificate.Leaf will -// be nil because the parsed form of the certificate is not retained. -func LoadX509KeyPair(certFile, keyFile string) (Certificate, error) { - certPEMBlock, err := os.ReadFile(certFile) - if err != nil { - return Certificate{}, err - } - keyPEMBlock, err := os.ReadFile(keyFile) - if err != nil { - return Certificate{}, err - } - return X509KeyPair(certPEMBlock, keyPEMBlock) -} - -// X509KeyPair parses a public/private key pair from a pair of -// PEM encoded data. On successful return, Certificate.Leaf will be nil because -// the parsed form of the certificate is not retained. -func X509KeyPair(certPEMBlock, keyPEMBlock []byte) (Certificate, error) { - fail := func(err error) (Certificate, error) { return Certificate{}, err } - - var cert Certificate - var skippedBlockTypes []string - for { - var certDERBlock *pem.Block - certDERBlock, certPEMBlock = pem.Decode(certPEMBlock) - if certDERBlock == nil { - break - } - if certDERBlock.Type == "CERTIFICATE" { - cert.Certificate = append(cert.Certificate, certDERBlock.Bytes) - } else { - skippedBlockTypes = append(skippedBlockTypes, certDERBlock.Type) - } - } - - if len(cert.Certificate) == 0 { - if len(skippedBlockTypes) == 0 { - return fail(errors.New("tls: failed to find any PEM data in certificate input")) - } - if len(skippedBlockTypes) == 1 && strings.HasSuffix(skippedBlockTypes[0], "PRIVATE KEY") { - return fail(errors.New("tls: failed to find certificate PEM data in certificate input, but did find a private key; PEM inputs may have been switched")) - } - return fail(fmt.Errorf("tls: failed to find \"CERTIFICATE\" PEM block in certificate input after skipping PEM blocks of the following types: %v", skippedBlockTypes)) - } - - skippedBlockTypes = skippedBlockTypes[:0] - var keyDERBlock *pem.Block - for { - keyDERBlock, keyPEMBlock = pem.Decode(keyPEMBlock) - if keyDERBlock == nil { - if len(skippedBlockTypes) == 0 { - return fail(errors.New("tls: failed to find any PEM data in key input")) - } - if len(skippedBlockTypes) == 1 && skippedBlockTypes[0] == "CERTIFICATE" { - return fail(errors.New("tls: found a certificate rather than a key in the PEM for the private key")) - } - return fail(fmt.Errorf("tls: failed to find PEM block with type ending in \"PRIVATE KEY\" in key input after skipping PEM blocks of the following types: %v", skippedBlockTypes)) - } - if keyDERBlock.Type == "PRIVATE KEY" || strings.HasSuffix(keyDERBlock.Type, " PRIVATE KEY") { - break - } - skippedBlockTypes = append(skippedBlockTypes, keyDERBlock.Type) - } - - // We don't need to parse the public key for TLS, but we so do anyway - // to check that it looks sane and matches the private key. - x509Cert, err := x509.ParseCertificate(cert.Certificate[0]) - if err != nil { - return fail(err) - } - - cert.PrivateKey, err = parsePrivateKey(keyDERBlock.Bytes) - if err != nil { - return fail(err) - } - - switch pub := x509Cert.PublicKey.(type) { - case *rsa.PublicKey: - priv, ok := cert.PrivateKey.(*rsa.PrivateKey) - if !ok { - return fail(errors.New("tls: private key type does not match public key type")) - } - if pub.N.Cmp(priv.N) != 0 { - return fail(errors.New("tls: private key does not match public key")) - } - case *ecdsa.PublicKey: - priv, ok := cert.PrivateKey.(*ecdsa.PrivateKey) - if !ok { - return fail(errors.New("tls: private key type does not match public key type")) - } - if pub.X.Cmp(priv.X) != 0 || pub.Y.Cmp(priv.Y) != 0 { - return fail(errors.New("tls: private key does not match public key")) - } - case ed25519.PublicKey: - priv, ok := cert.PrivateKey.(ed25519.PrivateKey) - if !ok { - return fail(errors.New("tls: private key type does not match public key type")) - } - if !bytes.Equal(priv.Public().(ed25519.PublicKey), pub) { - return fail(errors.New("tls: private key does not match public key")) - } - default: - return fail(errors.New("tls: unknown public key algorithm")) - } - - return cert, nil -} - -// Attempt to parse the given private key DER block. OpenSSL 0.9.8 generates -// PKCS #1 private keys by default, while OpenSSL 1.0.0 generates PKCS #8 keys. -// OpenSSL ecparam generates SEC1 EC private keys for ECDSA. We try all three. -func parsePrivateKey(der []byte) (crypto.PrivateKey, error) { - if key, err := x509.ParsePKCS1PrivateKey(der); err == nil { - return key, nil - } - if key, err := x509.ParsePKCS8PrivateKey(der); err == nil { - switch key := key.(type) { - case *rsa.PrivateKey, *ecdsa.PrivateKey, ed25519.PrivateKey: - return key, nil - default: - return nil, errors.New("tls: found unknown private key type in PKCS#8 wrapping") - } - } - if key, err := x509.ParseECPrivateKey(der); err == nil { - return key, nil - } - - return nil, errors.New("tls: failed to parse private key") -} diff --git a/vendor/github.com/quic-go/qtls-go1-20/unsafe.go b/vendor/github.com/quic-go/qtls-go1-20/unsafe.go deleted file mode 100644 index 67a75677c..000000000 --- a/vendor/github.com/quic-go/qtls-go1-20/unsafe.go +++ /dev/null @@ -1,101 +0,0 @@ -package qtls - -import ( - "crypto/tls" - "reflect" - "unsafe" -) - -func init() { - if !structsEqual(&tls.ConnectionState{}, &connectionState{}) { - panic("qtls.ConnectionState doesn't match") - } - if !structsEqual(&tls.ClientSessionState{}, &clientSessionState{}) { - panic("qtls.ClientSessionState doesn't match") - } - if !structsEqual(&tls.CertificateRequestInfo{}, &certificateRequestInfo{}) { - panic("qtls.CertificateRequestInfo doesn't match") - } - if !structsEqual(&tls.Config{}, &config{}) { - panic("qtls.Config doesn't match") - } - if !structsEqual(&tls.ClientHelloInfo{}, &clientHelloInfo{}) { - panic("qtls.ClientHelloInfo doesn't match") - } -} - -func toConnectionState(c connectionState) ConnectionState { - return *(*ConnectionState)(unsafe.Pointer(&c)) -} - -func toClientSessionState(s *clientSessionState) *ClientSessionState { - return (*ClientSessionState)(unsafe.Pointer(s)) -} - -func fromClientSessionState(s *ClientSessionState) *clientSessionState { - return (*clientSessionState)(unsafe.Pointer(s)) -} - -func toCertificateRequestInfo(i *certificateRequestInfo) *CertificateRequestInfo { - return (*CertificateRequestInfo)(unsafe.Pointer(i)) -} - -func toConfig(c *config) *Config { - return (*Config)(unsafe.Pointer(c)) -} - -func fromConfig(c *Config) *config { - return (*config)(unsafe.Pointer(c)) -} - -func toClientHelloInfo(chi *clientHelloInfo) *ClientHelloInfo { - return (*ClientHelloInfo)(unsafe.Pointer(chi)) -} - -func structsEqual(a, b interface{}) bool { - return compare(reflect.ValueOf(a), reflect.ValueOf(b)) -} - -func compare(a, b reflect.Value) bool { - sa := a.Elem() - sb := b.Elem() - if sa.NumField() != sb.NumField() { - return false - } - for i := 0; i < sa.NumField(); i++ { - fa := sa.Type().Field(i) - fb := sb.Type().Field(i) - if !reflect.DeepEqual(fa.Index, fb.Index) || fa.Name != fb.Name || fa.Anonymous != fb.Anonymous || fa.Offset != fb.Offset || !reflect.DeepEqual(fa.Type, fb.Type) { - if fa.Type.Kind() != fb.Type.Kind() { - return false - } - if fa.Type.Kind() == reflect.Slice { - if !compareStruct(fa.Type.Elem(), fb.Type.Elem()) { - return false - } - continue - } - return false - } - } - return true -} - -func compareStruct(a, b reflect.Type) bool { - if a.NumField() != b.NumField() { - return false - } - for i := 0; i < a.NumField(); i++ { - fa := a.Field(i) - fb := b.Field(i) - if !reflect.DeepEqual(fa.Index, fb.Index) || fa.Name != fb.Name || fa.Anonymous != fb.Anonymous || fa.Offset != fb.Offset || !reflect.DeepEqual(fa.Type, fb.Type) { - return false - } - } - return true -} - -// InitSessionTicketKeys triggers the initialization of session ticket keys. -func InitSessionTicketKeys(conf *Config) { - fromConfig(conf).ticketKeys(nil) -} diff --git a/vendor/github.com/quic-go/quic-go/.golangci.yml b/vendor/github.com/quic-go/quic-go/.golangci.yml index 1315759bc..7c4b71c09 100644 --- a/vendor/github.com/quic-go/quic-go/.golangci.yml +++ b/vendor/github.com/quic-go/quic-go/.golangci.yml @@ -1,20 +1,16 @@ -run: - skip-files: - - internal/handshake/cipher_suite.go linters-settings: - depguard: - type: blacklist - packages: - - github.com/marten-seemann/qtls - - github.com/quic-go/qtls-go1-19 - - github.com/quic-go/qtls-go1-20 - packages-with-error-message: - - github.com/marten-seemann/qtls: "importing qtls only allowed in internal/qtls" - - github.com/quic-go/qtls-go1-19: "importing qtls only allowed in internal/qtls" - - github.com/quic-go/qtls-go1-20: "importing qtls only allowed in internal/qtls" misspell: ignore-words: - ect + depguard: + rules: + quicvarint: + list-mode: strict + files: + - "**/github.com/quic-go/quic-go/quicvarint/*" + - "!$test" + allow: + - $gostd linters: disable-all: true @@ -27,6 +23,7 @@ linters: - gofmt # redundant, since gofmt *should* be a no-op after gofumpt - gofumpt - gosimple + - govet - ineffassign - misspell - prealloc @@ -35,10 +32,14 @@ linters: - unconvert - unparam - unused - - vet issues: + exclude-files: + - internal/handshake/cipher_suite.go exclude-rules: - path: internal/qtls linters: - depguard + - path: _test\.go + linters: + - exhaustive diff --git a/vendor/github.com/quic-go/quic-go/README.md b/vendor/github.com/quic-go/quic-go/README.md index 976a07ccd..94823d994 100644 --- a/vendor/github.com/quic-go/quic-go/README.md +++ b/vendor/github.com/quic-go/quic-go/README.md @@ -2,213 +2,38 @@ +[![Documentation](https://img.shields.io/badge/docs-quic--go.net-red?style=flat)](https://quic-go.net/docs/) [![PkgGoDev](https://pkg.go.dev/badge/github.com/quic-go/quic-go)](https://pkg.go.dev/github.com/quic-go/quic-go) [![Code Coverage](https://img.shields.io/codecov/c/github/quic-go/quic-go/master.svg?style=flat-square)](https://codecov.io/gh/quic-go/quic-go/) [![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/quic-go.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:quic-go) -quic-go is an implementation of the QUIC protocol ([RFC 9000](https://datatracker.ietf.org/doc/html/rfc9000), [RFC 9001](https://datatracker.ietf.org/doc/html/rfc9001), [RFC 9002](https://datatracker.ietf.org/doc/html/rfc9002)) in Go. It has support for HTTP/3 ([RFC 9114](https://datatracker.ietf.org/doc/html/rfc9114)), including QPACK ([RFC 9204](https://datatracker.ietf.org/doc/html/rfc9204)). +quic-go is an implementation of the QUIC protocol ([RFC 9000](https://datatracker.ietf.org/doc/html/rfc9000), [RFC 9001](https://datatracker.ietf.org/doc/html/rfc9001), [RFC 9002](https://datatracker.ietf.org/doc/html/rfc9002)) in Go. It has support for HTTP/3 ([RFC 9114](https://datatracker.ietf.org/doc/html/rfc9114)), including QPACK ([RFC 9204](https://datatracker.ietf.org/doc/html/rfc9204)) and HTTP Datagrams ([RFC 9297](https://datatracker.ietf.org/doc/html/rfc9297)). In addition to these base RFCs, it also implements the following RFCs: * Unreliable Datagram Extension ([RFC 9221](https://datatracker.ietf.org/doc/html/rfc9221)) * Datagram Packetization Layer Path MTU Discovery (DPLPMTUD, [RFC 8899](https://datatracker.ietf.org/doc/html/rfc8899)) * QUIC Version 2 ([RFC 9369](https://datatracker.ietf.org/doc/html/rfc9369)) +* QUIC Event Logging using qlog ([draft-ietf-quic-qlog-main-schema](https://datatracker.ietf.org/doc/draft-ietf-quic-qlog-main-schema/) and [draft-ietf-quic-qlog-quic-events](https://datatracker.ietf.org/doc/draft-ietf-quic-qlog-quic-events/)) -## Using QUIC +Support for WebTransport over HTTP/3 ([draft-ietf-webtrans-http3](https://datatracker.ietf.org/doc/draft-ietf-webtrans-http3/)) is implemented in [webtransport-go](https://github.com/quic-go/webtransport-go). -### Running a Server - -The central entry point is the `quic.Transport`. A transport manages QUIC connections running on a single UDP socket. Since QUIC uses Connection IDs, it can demultiplex a listener (accepting incoming connections) and an arbitrary number of outgoing QUIC connections on the same UDP socket. - -```go -udpConn, err := net.ListenUDP("udp4", &net.UDPAddr{Port: 1234}) -// ... error handling -tr := quic.Transport{ - Conn: udpConn, -} -ln, err := tr.Listen(tlsConf, quicConf) -// ... error handling -go func() { - for { - conn, err := ln.Accept() - // ... error handling - // handle the connection, usually in a new Go routine - } -}() -``` - -The listener `ln` can now be used to accept incoming QUIC connections by (repeatedly) calling the `Accept` method (see below for more information on the `quic.Connection`). - -As a shortcut, `quic.Listen` and `quic.ListenAddr` can be used without explicitly initializing a `quic.Transport`: - -``` -ln, err := quic.Listen(udpConn, tlsConf, quicConf) -``` - -When using the shortcut, it's not possible to reuse the same UDP socket for outgoing connections. - -### Running a Client - -As mentioned above, multiple outgoing connections can share a single UDP socket, since QUIC uses Connection IDs to demultiplex connections. - -```go -ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) // 3s handshake timeout -defer cancel() -conn, err := tr.Dial(ctx, , , ) -// ... error handling -``` - -As a shortcut, `quic.Dial` and `quic.DialAddr` can be used without explictly initializing a `quic.Transport`: - -```go -ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) // 3s handshake timeout -defer cancel() -conn, err := quic.Dial(ctx, conn, , , ) -``` - -Just as we saw before when used a similar shortcut to run a server, it's also not possible to reuse the same UDP socket for other outgoing connections, or to listen for incoming connections. - -### Using a QUIC Connection - -#### Accepting Streams - -QUIC is a stream-multiplexed transport. A `quic.Connection` fundamentally differs from the `net.Conn` and the `net.PacketConn` interface defined in the standard library. Data is sent and received on (unidirectional and bidirectional) streams (and, if supported, in [datagrams](#quic-datagrams)), not on the connection itself. The stream state machine is described in detail in [Section 3 of RFC 9000](https://datatracker.ietf.org/doc/html/rfc9000#section-3). - -Note: A unidirectional stream is a stream that the initiator can only write to (`quic.SendStream`), and the receiver can only read from (`quic.ReceiveStream`). A bidirectional stream (`quic.Stream`) allows reading from and writing to for both sides. - -On the receiver side, streams are accepted using the `AcceptStream` (for bidirectional) and `AcceptUniStream` functions. For most user cases, it makes sense to call these functions in a loop: - -```go -for { - str, err := conn.AcceptStream(context.Background()) // for bidirectional streams - // ... error handling - // handle the stream, usually in a new Go routine -} -``` - -These functions return an error when the underlying QUIC connection is closed. - -#### Opening Streams - -There are two slightly different ways to open streams, one synchronous and one (potentially) asynchronous. This API is necessary since the receiver grants us a certain number of streams that we're allowed to open. It may grant us additional streams later on (typically when existing streams are closed), but it means that at the time we want to open a new stream, we might not be able to do so. - -Using the synchronous method `OpenStreamSync` for bidirectional streams, and `OpenUniStreamSync` for unidirectional streams, an application can block until the peer allows opening additional streams. In case that we're allowed to open a new stream, these methods return right away: - -```go -ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) -defer cancel() -str, err := conn.OpenStreamSync(ctx) // wait up to 5s to open a new bidirectional stream -``` - -The asynchronous version never blocks. If it's currently not possible to open a new stream, it returns a `net.Error` timeout error: - -```go -str, err := conn.OpenStream() -if nerr, ok := err.(net.Error); ok && nerr.Timeout() { - // It's currently not possible to open another stream, - // but it might be possible later, once the peer allowed us to do so. -} -``` - -These functions return an error when the underlying QUIC connection is closed. - -#### Using Streams - -Using QUIC streams is pretty straightforward. The `quic.ReceiveStream` implements the `io.Reader` interface, and the `quic.SendStream` implements the `io.Writer` interface. A bidirectional stream (`quic.Stream`) implements both these interfaces. Conceptually, a bidirectional stream can be thought of as the composition of two unidirectional streams in opposite directions. - -Calling `Close` on a `quic.SendStream` or a `quic.Stream` closes the send side of the stream. On the receiver side, this will be surfaced as an `io.EOF` returned from the `io.Reader` once all data has been consumed. Note that for bidirectional streams, `Close` _only_ closes the send side of the stream. It is still possible to read from the stream until the peer closes or resets the stream. - -In case the application wishes to abort sending on a `quic.SendStream` or a `quic.Stream` , it can reset the send side by calling `CancelWrite` with an application-defined error code (an unsigned 62-bit number). On the receiver side, this surfaced as a `quic.StreamError` containing that error code on the `io.Reader`. Note that for bidirectional streams, `CancelWrite` _only_ resets the send side of the stream. It is still possible to read from the stream until the peer closes or resets the stream. - -Conversely, in case the application wishes to abort receiving from a `quic.ReceiveStream` or a `quic.Stream`, it can ask the sender to abort data transmission by calling `CancelRead` with an application-defined error code (an unsigned 62-bit number). On the receiver side, this surfaced as a `quic.StreamError` containing that error code on the `io.Writer`. Note that for bidirectional streams, `CancelWrite` _only_ resets the receive side of the stream. It is still possible to write to the stream. - -A bidirectional stream is only closed once both the read and the write side of the stream have been either closed and reset. Only then the peer is granted a new stream according to the maximum number of concurrent streams configured via `quic.Config.MaxIncomingStreams`. - -### Configuring QUIC - -The `quic.Config` struct passed to both the listen and dial calls (see above) contains a wide range of configuration options for QUIC connections, incl. the ability to fine-tune flow control limits, the number of streams that the peer is allowed to open concurrently, keep-alives, idle timeouts, and many more. Please refer to the documentation for the `quic.Config` for details. - -The `quic.Transport` contains a few configuration options that don't apply to any single QUIC connection, but to all connections handled by that transport. It is highly recommend to set the `StatelessResetToken`, which allows endpoints to quickly recover from crashes / reboots of our node (see [Section 10.3 of RFC 9000](https://datatracker.ietf.org/doc/html/rfc9000#section-10.3)). - -### Closing a Connection - -#### When the remote Peer closes the Connection - -In case the peer closes the QUIC connection, all calls to open streams, accept streams, as well as all methods on streams immediately return an error. Additionally, it is set as cancellation cause of the connection context. Users can use errors assertions to find out what exactly went wrong: - -* `quic.VersionNegotiationError`: Happens during the handshake, if there is no overlap between our and the remote's supported QUIC versions. -* `quic.HandshakeTimeoutError`: Happens if the QUIC handshake doesn't complete within the time specified in `quic.Config.HandshakeTimeout`. -* `quic.IdleTimeoutError`: Happens after completion of the handshake if the connection is idle for longer than the minimum of both peers idle timeouts (as configured by `quic.Config.IdleTimeout`). The connection is considered idle when no stream data (and datagrams, if applicable) are exchanged for that period. The QUIC connection can be instructed to regularly send a packet to prevent a connection from going idle by setting `quic.Config.KeepAlive`. However, this is no guarantee that the peer doesn't suddenly go away (e.g. by abruptly shutting down the node or by crashing), or by a NAT binding expiring, in which case this error might still occur. -* `quic.StatelessResetError`: Happens when the remote peer lost the state required to decrypt the packet. This requires the `quic.Transport.StatelessResetToken` to be configured by the peer. -* `quic.TransportError`: Happens if when the QUIC protocol is violated. Unless the error code is `APPLICATION_ERROR`, this will not happen unless one of the QUIC stacks involved is misbehaving. Please open an issue if you encounter this error. -* `quic.ApplicationError`: Happens when the remote decides to close the connection, see below. - -#### Initiated by the Application - -A `quic.Connection` can be closed using `CloseWithError`: - -```go -conn.CloseWithError(0x42, "error 0x42 occurred") -``` - -Applications can transmit both an error code (an unsigned 62-bit number) as well as a UTF-8 encoded human-readable reason. The error code allows the receiver to learn why the connection was closed, and the reason can be useful for debugging purposes. - -On the receiver side, this is surfaced as a `quic.ApplicationError`. - -### QUIC Datagrams - -Unreliable datagrams are a QUIC extension ([RFC 9221](https://datatracker.ietf.org/doc/html/rfc9221)) that is negotiated during the handshake. Support can be enabled by setting the `quic.Config.EnableDatagram` flag. Note that this doesn't guarantee that the peer also supports datagrams. Whether or not the feature negotiation succeeded can be learned from the `quic.ConnectionState.SupportsDatagrams` obtained from `quic.Connection.ConnectionState()`. - -QUIC DATAGRAMs are a new QUIC frame type sent in QUIC 1-RTT packets (i.e. after completion of the handshake). Therefore, they're end-to-end encrypted and congestion-controlled. However, if a DATAGRAM frame is deemed lost by QUIC's loss detection mechanism, they are not automatically retransmitted. - -Datagrams are sent using the `SendMessage` method on the `quic.Connection`: - -```go -conn.SendMessage([]byte("foobar")) -``` - -And received using `ReceiveMessage`: - -```go -msg, err := conn.ReceiveMessage() -``` - -Note that this code path is currently not optimized. It works for datagrams that are sent occasionally, but it doesn't achieve the same throughput as writing data on a stream. Please get in touch on issue #3766 if your use case relies on high datagram throughput, or if you'd like to help fix this issue. There are also some restrictions regarding the maximum message size (see #3599). - - - -## Using HTTP/3 - -### As a server - -See the [example server](example/main.go). Starting a QUIC server is very similar to the standard library http package in Go: - -```go -http.Handle("/", http.FileServer(http.Dir(wwwDir))) -http3.ListenAndServeQUIC("localhost:4242", "/path/to/cert/chain.pem", "/path/to/privkey.pem", nil) -``` - -### As a client - -See the [example client](example/client/main.go). Use a `http3.RoundTripper` as a `Transport` in a `http.Client`. - -```go -http.Client{ - Transport: &http3.RoundTripper{}, -} -``` +Detailed documentation can be found on [quic-go.net](https://quic-go.net/docs/). ## Projects using quic-go | Project | Description | Stars | -| --------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | +| ---------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | | [AdGuardHome](https://github.com/AdguardTeam/AdGuardHome) | Free and open source, powerful network-wide ads & trackers blocking DNS server. | ![GitHub Repo stars](https://img.shields.io/github/stars/AdguardTeam/AdGuardHome?style=flat-square) | | [algernon](https://github.com/xyproto/algernon) | Small self-contained pure-Go web server with Lua, Markdown, HTTP/2, QUIC, Redis and PostgreSQL support | ![GitHub Repo stars](https://img.shields.io/github/stars/xyproto/algernon?style=flat-square) | | [caddy](https://github.com/caddyserver/caddy/) | Fast, multi-platform web server with automatic HTTPS | ![GitHub Repo stars](https://img.shields.io/github/stars/caddyserver/caddy?style=flat-square) | | [cloudflared](https://github.com/cloudflare/cloudflared) | A tunneling daemon that proxies traffic from the Cloudflare network to your origins | ![GitHub Repo stars](https://img.shields.io/github/stars/cloudflare/cloudflared?style=flat-square) | -| [go-libp2p](https://github.com/libp2p/go-libp2p) | libp2p implementation in Go, powering [Kubo](https://github.com/ipfs/kubo) (IPFS) and [Lotus](https://github.com/filecoin-project/lotus) (Filecoin), among others | ![GitHub Repo stars](https://img.shields.io/github/stars/libp2p/go-libp2p?style=flat-square) | +| [frp](https://github.com/fatedier/frp) | A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet | ![GitHub Repo stars](https://img.shields.io/github/stars/fatedier/frp?style=flat-square) | +| [go-libp2p](https://github.com/libp2p/go-libp2p) | libp2p implementation in Go, powering [Kubo](https://github.com/ipfs/kubo) (IPFS) and [Lotus](https://github.com/filecoin-project/lotus) (Filecoin), among others | ![GitHub Repo stars](https://img.shields.io/github/stars/libp2p/go-libp2p?style=flat-square) | +| [gost](https://github.com/go-gost/gost) | A simple security tunnel written in Go | ![GitHub Repo stars](https://img.shields.io/github/stars/go-gost/gost?style=flat-square) | | [Hysteria](https://github.com/apernet/hysteria) | A powerful, lightning fast and censorship resistant proxy | ![GitHub Repo stars](https://img.shields.io/github/stars/apernet/hysteria?style=flat-square) | | [Mercure](https://github.com/dunglas/mercure) | An open, easy, fast, reliable and battery-efficient solution for real-time communications | ![GitHub Repo stars](https://img.shields.io/github/stars/dunglas/mercure?style=flat-square) | | [OONI Probe](https://github.com/ooni/probe-cli) | Next generation OONI Probe. Library and CLI tool. | ![GitHub Repo stars](https://img.shields.io/github/stars/ooni/probe-cli?style=flat-square) | +| [RoadRunner](https://github.com/roadrunner-server/roadrunner) | High-performance PHP application server, process manager written in Go and powered with plugins | ![GitHub Repo stars](https://img.shields.io/github/stars/roadrunner-server/roadrunner?style=flat-square) | | [syncthing](https://github.com/syncthing/syncthing/) | Open Source Continuous File Synchronization | ![GitHub Repo stars](https://img.shields.io/github/stars/syncthing/syncthing?style=flat-square) | | [traefik](https://github.com/traefik/traefik) | The Cloud Native Application Proxy | ![GitHub Repo stars](https://img.shields.io/github/stars/traefik/traefik?style=flat-square) | | [v2ray-core](https://github.com/v2fly/v2ray-core) | A platform for building proxies to bypass network restrictions | ![GitHub Repo stars](https://img.shields.io/github/stars/v2fly/v2ray-core?style=flat-square) | @@ -220,11 +45,6 @@ If you'd like to see your project added to this list, please send us a PR. quic-go always aims to support the latest two Go releases. -### Dependency on forked crypto/tls - -Since the standard library didn't provide any QUIC APIs before the Go 1.21 release, we had to fork crypto/tls to add the required APIs ourselves: [qtls for Go 1.20](https://github.com/quic-go/qtls-go1-20). -This had led to a lot of pain in the Go ecosystem, and we're happy that we can rely on Go 1.21 going forward. - ## Contributing We are always happy to welcome new contributors! We have a number of self-contained issues that are suitable for first-time contributors, they are tagged with [help wanted](https://github.com/quic-go/quic-go/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22). If you have any questions, please feel free to reach out by opening an issue or leaving a comment. diff --git a/vendor/github.com/quic-go/quic-go/client.go b/vendor/github.com/quic-go/quic-go/client.go index e0ae5d3cb..20ef74072 100644 --- a/vendor/github.com/quic-go/quic-go/client.go +++ b/vendor/github.com/quic-go/quic-go/client.go @@ -28,14 +28,14 @@ type client struct { initialPacketNumber protocol.PacketNumber hasNegotiatedVersion bool - version protocol.VersionNumber + version protocol.Version handshakeChan chan struct{} conn quicConn tracer *logging.ConnectionTracer - tracingID uint64 + tracingID ConnectionTracingID logger utils.Logger } @@ -232,7 +232,7 @@ func (c *client) dial(ctx context.Context) error { select { case <-ctx.Done(): - c.conn.shutdown() + c.conn.destroy(nil) return context.Cause(ctx) case err := <-errorChan: return err diff --git a/vendor/github.com/quic-go/quic-go/closed_conn.go b/vendor/github.com/quic-go/quic-go/closed_conn.go index 0c988b53e..833385327 100644 --- a/vendor/github.com/quic-go/quic-go/closed_conn.go +++ b/vendor/github.com/quic-go/quic-go/closed_conn.go @@ -4,7 +4,6 @@ import ( "math/bits" "net" - "github.com/quic-go/quic-go/internal/protocol" "github.com/quic-go/quic-go/internal/utils" ) @@ -12,9 +11,8 @@ import ( // When receiving packets for such a connection, we need to retransmit the packet containing the CONNECTION_CLOSE frame, // with an exponential backoff. type closedLocalConn struct { - counter uint32 - perspective protocol.Perspective - logger utils.Logger + counter uint32 + logger utils.Logger sendPacket func(net.Addr, packetInfo) } @@ -22,11 +20,10 @@ type closedLocalConn struct { var _ packetHandler = &closedLocalConn{} // newClosedLocalConn creates a new closedLocalConn and runs it. -func newClosedLocalConn(sendPacket func(net.Addr, packetInfo), pers protocol.Perspective, logger utils.Logger) packetHandler { +func newClosedLocalConn(sendPacket func(net.Addr, packetInfo), logger utils.Logger) packetHandler { return &closedLocalConn{ - sendPacket: sendPacket, - perspective: pers, - logger: logger, + sendPacket: sendPacket, + logger: logger, } } @@ -41,24 +38,20 @@ func (c *closedLocalConn) handlePacket(p receivedPacket) { c.sendPacket(p.remoteAddr, p.info) } -func (c *closedLocalConn) shutdown() {} -func (c *closedLocalConn) destroy(error) {} -func (c *closedLocalConn) getPerspective() protocol.Perspective { return c.perspective } +func (c *closedLocalConn) destroy(error) {} +func (c *closedLocalConn) closeWithTransportError(TransportErrorCode) {} // A closedRemoteConn is a connection that was closed remotely. // For such a connection, we might receive reordered packets that were sent before the CONNECTION_CLOSE. // We can just ignore those packets. -type closedRemoteConn struct { - perspective protocol.Perspective -} +type closedRemoteConn struct{} var _ packetHandler = &closedRemoteConn{} -func newClosedRemoteConn(pers protocol.Perspective) packetHandler { - return &closedRemoteConn{perspective: pers} +func newClosedRemoteConn() packetHandler { + return &closedRemoteConn{} } -func (s *closedRemoteConn) handlePacket(receivedPacket) {} -func (s *closedRemoteConn) shutdown() {} -func (s *closedRemoteConn) destroy(error) {} -func (s *closedRemoteConn) getPerspective() protocol.Perspective { return s.perspective } +func (c *closedRemoteConn) handlePacket(receivedPacket) {} +func (c *closedRemoteConn) destroy(error) {} +func (c *closedRemoteConn) closeWithTransportError(TransportErrorCode) {} diff --git a/vendor/github.com/quic-go/quic-go/codecov.yml b/vendor/github.com/quic-go/quic-go/codecov.yml index a24c7a15e..59e4b58f6 100644 --- a/vendor/github.com/quic-go/quic-go/codecov.yml +++ b/vendor/github.com/quic-go/quic-go/codecov.yml @@ -5,6 +5,8 @@ coverage: - interop/ - internal/handshake/cipher_suite.go - internal/utils/linkedlist/linkedlist.go + - internal/testdata + - testutils/ - fuzzing/ - metrics/ status: diff --git a/vendor/github.com/quic-go/quic-go/config.go b/vendor/github.com/quic-go/quic-go/config.go index 49b9fc3f0..d42bdc1c5 100644 --- a/vendor/github.com/quic-go/quic-go/config.go +++ b/vendor/github.com/quic-go/quic-go/config.go @@ -2,7 +2,6 @@ package quic import ( "fmt" - "net" "time" "github.com/quic-go/quic-go/internal/protocol" @@ -40,6 +39,12 @@ func validateConfig(config *Config) error { if config.MaxConnectionReceiveWindow > quicvarint.Max { config.MaxConnectionReceiveWindow = quicvarint.Max } + if config.InitialPacketSize > 0 && config.InitialPacketSize < protocol.MinInitialPacketSize { + config.InitialPacketSize = protocol.MinInitialPacketSize + } + if config.InitialPacketSize > protocol.MaxPacketBufferSize { + config.InitialPacketSize = protocol.MaxPacketBufferSize + } // check that all QUIC versions are actually supported for _, v := range config.Versions { if !protocol.IsValidVersion(v) { @@ -49,16 +54,6 @@ func validateConfig(config *Config) error { return nil } -// populateServerConfig populates fields in the quic.Config with their default values, if none are set -// it may be called with nil -func populateServerConfig(config *Config) *Config { - config = populateConfig(config) - if config.RequireAddressValidation == nil { - config.RequireAddressValidation = func(net.Addr) bool { return false } - } - return config -} - // populateConfig populates fields in the quic.Config with their default values, if none are set // it may be called with nil func populateConfig(config *Config) *Config { @@ -105,13 +100,16 @@ func populateConfig(config *Config) *Config { } else if maxIncomingUniStreams < 0 { maxIncomingUniStreams = 0 } + initialPacketSize := config.InitialPacketSize + if initialPacketSize == 0 { + initialPacketSize = protocol.InitialPacketSize + } return &Config{ GetConfigForClient: config.GetConfigForClient, Versions: versions, HandshakeIdleTimeout: handshakeIdleTimeout, MaxIdleTimeout: idleTimeout, - RequireAddressValidation: config.RequireAddressValidation, KeepAlivePeriod: config.KeepAlivePeriod, InitialStreamReceiveWindow: initialStreamReceiveWindow, MaxStreamReceiveWindow: maxStreamReceiveWindow, @@ -122,6 +120,7 @@ func populateConfig(config *Config) *Config { MaxIncomingUniStreams: maxIncomingUniStreams, TokenStore: config.TokenStore, EnableDatagrams: config.EnableDatagrams, + InitialPacketSize: initialPacketSize, DisablePathMTUDiscovery: config.DisablePathMTUDiscovery, Allow0RTT: config.Allow0RTT, Tracer: config.Tracer, diff --git a/vendor/github.com/quic-go/quic-go/conn_id_generator.go b/vendor/github.com/quic-go/quic-go/conn_id_generator.go index 2d28dc619..d7be6540e 100644 --- a/vendor/github.com/quic-go/quic-go/conn_id_generator.go +++ b/vendor/github.com/quic-go/quic-go/conn_id_generator.go @@ -5,7 +5,6 @@ import ( "github.com/quic-go/quic-go/internal/protocol" "github.com/quic-go/quic-go/internal/qerr" - "github.com/quic-go/quic-go/internal/utils" "github.com/quic-go/quic-go/internal/wire" ) @@ -20,7 +19,7 @@ type connIDGenerator struct { getStatelessResetToken func(protocol.ConnectionID) protocol.StatelessResetToken removeConnectionID func(protocol.ConnectionID) retireConnectionID func(protocol.ConnectionID) - replaceWithClosed func([]protocol.ConnectionID, protocol.Perspective, []byte) + replaceWithClosed func([]protocol.ConnectionID, []byte) queueControlFrame func(wire.Frame) } @@ -31,7 +30,7 @@ func newConnIDGenerator( getStatelessResetToken func(protocol.ConnectionID) protocol.StatelessResetToken, removeConnectionID func(protocol.ConnectionID), retireConnectionID func(protocol.ConnectionID), - replaceWithClosed func([]protocol.ConnectionID, protocol.Perspective, []byte), + replaceWithClosed func([]protocol.ConnectionID, []byte), queueControlFrame func(wire.Frame), generator ConnectionIDGenerator, ) *connIDGenerator { @@ -60,7 +59,7 @@ func (m *connIDGenerator) SetMaxActiveConnIDs(limit uint64) error { // transport parameter. // We currently don't send the preferred_address transport parameter, // so we can issue (limit - 1) connection IDs. - for i := uint64(len(m.activeSrcConnIDs)); i < utils.Min(limit, protocol.MaxIssuedConnectionIDs); i++ { + for i := uint64(len(m.activeSrcConnIDs)); i < min(limit, protocol.MaxIssuedConnectionIDs); i++ { if err := m.issueNewConnID(); err != nil { return err } @@ -127,7 +126,7 @@ func (m *connIDGenerator) RemoveAll() { } } -func (m *connIDGenerator) ReplaceWithClosed(pers protocol.Perspective, connClose []byte) { +func (m *connIDGenerator) ReplaceWithClosed(connClose []byte) { connIDs := make([]protocol.ConnectionID, 0, len(m.activeSrcConnIDs)+1) if m.initialClientDestConnID != nil { connIDs = append(connIDs, *m.initialClientDestConnID) @@ -135,5 +134,5 @@ func (m *connIDGenerator) ReplaceWithClosed(pers protocol.Perspective, connClose for _, connID := range m.activeSrcConnIDs { connIDs = append(connIDs, connID) } - m.replaceWithClosed(connIDs, pers, connClose) + m.replaceWithClosed(connIDs, connClose) } diff --git a/vendor/github.com/quic-go/quic-go/conn_id_manager.go b/vendor/github.com/quic-go/quic-go/conn_id_manager.go index ba65aec04..4aa3f749e 100644 --- a/vendor/github.com/quic-go/quic-go/conn_id_manager.go +++ b/vendor/github.com/quic-go/quic-go/conn_id_manager.go @@ -145,7 +145,7 @@ func (h *connIDManager) updateConnectionID() { h.queueControlFrame(&wire.RetireConnectionIDFrame{ SequenceNumber: h.activeSequenceNumber, }) - h.highestRetired = utils.Max(h.highestRetired, h.activeSequenceNumber) + h.highestRetired = max(h.highestRetired, h.activeSequenceNumber) if h.activeStatelessResetToken != nil { h.removeStatelessResetToken(*h.activeStatelessResetToken) } diff --git a/vendor/github.com/quic-go/quic-go/connection.go b/vendor/github.com/quic-go/quic-go/connection.go index 09b522a9e..0404fb195 100644 --- a/vendor/github.com/quic-go/quic-go/connection.go +++ b/vendor/github.com/quic-go/quic-go/connection.go @@ -25,7 +25,7 @@ import ( ) type unpacker interface { - UnpackLongHeader(hdr *wire.Header, rcvTime time.Time, data []byte, v protocol.VersionNumber) (*unpackedPacket, error) + UnpackLongHeader(hdr *wire.Header, rcvTime time.Time, data []byte, v protocol.Version) (*unpackedPacket, error) UnpackShortHeader(rcvTime time.Time, data []byte) (protocol.PacketNumber, protocol.PacketNumberLen, protocol.KeyPhaseBit, []byte, error) } @@ -93,7 +93,7 @@ type connRunner interface { GetStatelessResetToken(protocol.ConnectionID) protocol.StatelessResetToken Retire(protocol.ConnectionID) Remove(protocol.ConnectionID) - ReplaceWithClosed([]protocol.ConnectionID, protocol.Perspective, []byte) + ReplaceWithClosed([]protocol.ConnectionID, []byte) AddResetToken(protocol.StatelessResetToken, packetHandler) RemoveResetToken(protocol.StatelessResetToken) } @@ -106,15 +106,15 @@ type closeError struct { type errCloseForRecreating struct { nextPacketNumber protocol.PacketNumber - nextVersion protocol.VersionNumber + nextVersion protocol.Version } func (e *errCloseForRecreating) Error() string { return "closing connection in order to recreate it" } -var connTracingID uint64 // to be accessed atomically -func nextConnTracingID() uint64 { return atomic.AddUint64(&connTracingID, 1) } +var connTracingID atomic.Uint64 // to be accessed atomically +func nextConnTracingID() ConnectionTracingID { return ConnectionTracingID(connTracingID.Add(1)) } // A Connection is a QUIC connection type connection struct { @@ -128,7 +128,7 @@ type connection struct { srcConnIDLen int perspective protocol.Perspective - version protocol.VersionNumber + version protocol.Version config *Config conn sendConn @@ -153,7 +153,9 @@ type connection struct { unpacker unpacker frameParser wire.FrameParser packer packer - mtuDiscoverer mtuDiscoverer // initialized when the handshake completes + mtuDiscoverer mtuDiscoverer // initialized when the transport parameters are received + + maxPayloadSizeEstimate atomic.Uint32 initialStream cryptoStream handshakeStream cryptoStream @@ -177,6 +179,7 @@ type connection struct { earlyConnReadyChan chan struct{} sentFirstPacket bool + droppedInitialKeys bool handshakeComplete bool handshakeConfirmed bool @@ -233,9 +236,9 @@ var newConnection = func( tokenGenerator *handshake.TokenGenerator, clientAddressValidated bool, tracer *logging.ConnectionTracer, - tracingID uint64, + tracingID ConnectionTracingID, logger utils.Logger, - v protocol.VersionNumber, + v protocol.Version, ) quicConn { s := &connection{ conn: conn, @@ -271,11 +274,11 @@ var newConnection = func( s.queueControlFrame, connIDGenerator, ) - s.preSetup() s.ctx, s.ctxCancel = context.WithCancelCause(context.WithValue(context.Background(), ConnectionTracingKey, tracingID)) + s.preSetup() s.sentPacketHandler, s.receivedPacketHandler = ackhandler.NewAckHandler( 0, - getMaxPacketSize(s.conn.RemoteAddr()), + protocol.ByteCount(s.config.InitialPacketSize), s.rttStats, clientAddressValidated, s.conn.capabilities().ECN, @@ -283,7 +286,7 @@ var newConnection = func( s.tracer, s.logger, ) - s.mtuDiscoverer = newMTUDiscoverer(s.rttStats, getMaxPacketSize(s.conn.RemoteAddr()), s.sentPacketHandler.SetMaxDatagramSize) + s.maxPayloadSizeEstimate.Store(uint32(estimateMaxPayloadSize(protocol.ByteCount(s.config.InitialPacketSize)))) params := &wire.TransportParameters{ InitialMaxStreamDataBidiLocal: protocol.ByteCount(s.config.InitialStreamReceiveWindow), InitialMaxStreamDataBidiRemote: protocol.ByteCount(s.config.InitialStreamReceiveWindow), @@ -294,6 +297,7 @@ var newConnection = func( MaxUniStreamNum: protocol.StreamNum(s.config.MaxIncomingUniStreams), MaxAckDelay: protocol.MaxAckDelayInclGranularity, AckDelayExponent: protocol.AckDelayExponent, + MaxUDPPayloadSize: protocol.MaxPacketBufferSize, DisableActiveMigration: true, StatelessResetToken: &statelessResetToken, OriginalDestinationConnectionID: origDestConnID, @@ -307,7 +311,7 @@ var newConnection = func( RetrySourceConnectionID: retrySrcConnID, } if s.config.EnableDatagrams { - params.MaxDatagramFrameSize = protocol.MaxDatagramFrameSize + params.MaxDatagramFrameSize = wire.MaxDatagramSize } else { params.MaxDatagramFrameSize = protocol.InvalidByteCount } @@ -346,9 +350,9 @@ var newClientConnection = func( enable0RTT bool, hasNegotiatedVersion bool, tracer *logging.ConnectionTracer, - tracingID uint64, + tracingID ConnectionTracingID, logger utils.Logger, - v protocol.VersionNumber, + v protocol.Version, ) quicConn { s := &connection{ conn: conn, @@ -380,11 +384,11 @@ var newClientConnection = func( s.queueControlFrame, connIDGenerator, ) - s.preSetup() s.ctx, s.ctxCancel = context.WithCancelCause(context.WithValue(context.Background(), ConnectionTracingKey, tracingID)) + s.preSetup() s.sentPacketHandler, s.receivedPacketHandler = ackhandler.NewAckHandler( initialPacketNumber, - getMaxPacketSize(s.conn.RemoteAddr()), + protocol.ByteCount(s.config.InitialPacketSize), s.rttStats, false, // has no effect s.conn.capabilities().ECN, @@ -392,7 +396,7 @@ var newClientConnection = func( s.tracer, s.logger, ) - s.mtuDiscoverer = newMTUDiscoverer(s.rttStats, getMaxPacketSize(s.conn.RemoteAddr()), s.sentPacketHandler.SetMaxDatagramSize) + s.maxPayloadSizeEstimate.Store(uint32(estimateMaxPayloadSize(protocol.ByteCount(s.config.InitialPacketSize)))) oneRTTStream := newCryptoStream() params := &wire.TransportParameters{ InitialMaxStreamDataBidiRemote: protocol.ByteCount(s.config.InitialStreamReceiveWindow), @@ -403,6 +407,7 @@ var newClientConnection = func( MaxBidiStreamNum: protocol.StreamNum(s.config.MaxIncomingStreams), MaxUniStreamNum: protocol.StreamNum(s.config.MaxIncomingUniStreams), MaxAckDelay: protocol.MaxAckDelayInclGranularity, + MaxUDPPayloadSize: protocol.MaxPacketBufferSize, AckDelayExponent: protocol.AckDelayExponent, DisableActiveMigration: true, // For interoperability with quic-go versions before May 2023, this value must be set to a value @@ -414,7 +419,7 @@ var newClientConnection = func( InitialSourceConnectionID: srcConnID, } if s.config.EnableDatagrams { - params.MaxDatagramFrameSize = protocol.MaxDatagramFrameSize + params.MaxDatagramFrameSize = wire.MaxDatagramSize } else { params.MaxDatagramFrameSize = protocol.InvalidByteCount } @@ -453,7 +458,7 @@ func (s *connection) preSetup() { s.handshakeStream = newCryptoStream() s.sendQueue = newSendQueue(s.conn) s.retransmissionQueue = newRetransmissionQueue() - s.frameParser = wire.NewFrameParser(s.config.EnableDatagrams) + s.frameParser = *wire.NewFrameParser(s.config.EnableDatagrams) s.rttStats = &utils.RTTStats{} s.connFlowController = flowcontrol.NewConnectionFlowController( protocol.ByteCount(s.config.InitialConnectionReceiveWindow), @@ -470,6 +475,7 @@ func (s *connection) preSetup() { ) s.earlyConnReadyChan = make(chan struct{}) s.streamsMap = newStreamsMap( + s.ctx, s, s.newFlowController, uint64(s.config.MaxIncomingStreams), @@ -520,6 +526,9 @@ func (s *connection) run() error { runLoop: for { + if s.framer.QueuedTooManyControlFrames() { + s.closeLocal(&qerr.TransportError{ErrorCode: InternalError}) + } // Close immediately if requested select { case closeErr = <-s.closeChan: @@ -629,7 +638,7 @@ runLoop: sendQueueAvailable = s.sendQueue.Available() continue } - if err := s.triggerSending(); err != nil { + if err := s.triggerSending(now); err != nil { s.closeLocal(err) } if s.sendQueue.WouldBlock() { @@ -681,7 +690,7 @@ func (s *connection) ConnectionState() ConnectionState { // Time when the connection should time out func (s *connection) nextIdleTimeoutTime() time.Time { - idleTimeout := utils.Max(s.idleTimeout, s.rttStats.PTO(true)*3) + idleTimeout := max(s.idleTimeout, s.rttStats.PTO(true)*3) return s.idleTimeoutStartTime().Add(idleTimeout) } @@ -691,7 +700,7 @@ func (s *connection) nextKeepAliveTime() time.Time { if s.config.KeepAlivePeriod == 0 || s.keepAlivePingSent || !s.firstAckElicitingPacketAfterIdleSentTime.IsZero() { return time.Time{} } - keepAliveInterval := utils.Max(s.keepAliveInterval, s.rttStats.PTO(true)*3/2) + keepAliveInterval := max(s.keepAliveInterval, s.rttStats.PTO(true)*3/2) return s.lastPacketReceivedTime.Add(keepAliveInterval) } @@ -731,6 +740,10 @@ func (s *connection) handleHandshakeComplete() error { s.connIDManager.SetHandshakeComplete() s.connIDGenerator.SetHandshakeComplete() + if s.tracer != nil && s.tracer.ChoseALPN != nil { + s.tracer.ChoseALPN(s.cryptoStreamHandler.ConnectionState().NegotiatedProtocol) + } + // The server applies transport parameters right away, but the client side has to wait for handshake completion. // During a 0-RTT connection, the client is only allowed to use the new transport parameters for 1-RTT packets. if s.perspective == protocol.PerspectiveClient { @@ -772,11 +785,7 @@ func (s *connection) handleHandshakeConfirmed() error { s.cryptoStreamHandler.SetHandshakeConfirmed() if !s.config.DisablePathMTUDiscovery && s.conn.capabilities().DF { - maxPacketSize := s.peerParams.MaxUDPPayloadSize - if maxPacketSize == 0 { - maxPacketSize = protocol.MaxByteCount - } - s.mtuDiscoverer.Start(utils.Min(maxPacketSize, protocol.MaxPacketBufferSize)) + s.mtuDiscoverer.Start() } return nil } @@ -804,14 +813,14 @@ func (s *connection) handlePacketImpl(rp receivedPacket) bool { destConnID, err = wire.ParseConnectionID(p.data, s.srcConnIDLen) if err != nil { if s.tracer != nil && s.tracer.DroppedPacket != nil { - s.tracer.DroppedPacket(logging.PacketTypeNotDetermined, protocol.ByteCount(len(data)), logging.PacketDropHeaderParseError) + s.tracer.DroppedPacket(logging.PacketTypeNotDetermined, protocol.InvalidPacketNumber, protocol.ByteCount(len(data)), logging.PacketDropHeaderParseError) } s.logger.Debugf("error parsing packet, couldn't parse connection ID: %s", err) break } if destConnID != lastConnID { if s.tracer != nil && s.tracer.DroppedPacket != nil { - s.tracer.DroppedPacket(logging.PacketTypeNotDetermined, protocol.ByteCount(len(data)), logging.PacketDropUnknownConnectionID) + s.tracer.DroppedPacket(logging.PacketTypeNotDetermined, protocol.InvalidPacketNumber, protocol.ByteCount(len(data)), logging.PacketDropUnknownConnectionID) } s.logger.Debugf("coalesced packet has different destination connection ID: %s, expected %s", destConnID, lastConnID) break @@ -826,7 +835,7 @@ func (s *connection) handlePacketImpl(rp receivedPacket) bool { if err == wire.ErrUnsupportedVersion { dropReason = logging.PacketDropUnsupportedVersion } - s.tracer.DroppedPacket(logging.PacketTypeNotDetermined, protocol.ByteCount(len(data)), dropReason) + s.tracer.DroppedPacket(logging.PacketTypeNotDetermined, protocol.InvalidPacketNumber, protocol.ByteCount(len(data)), dropReason) } s.logger.Debugf("error parsing packet: %s", err) break @@ -835,7 +844,7 @@ func (s *connection) handlePacketImpl(rp receivedPacket) bool { if hdr.Version != s.version { if s.tracer != nil && s.tracer.DroppedPacket != nil { - s.tracer.DroppedPacket(logging.PacketTypeFromHeader(hdr), protocol.ByteCount(len(data)), logging.PacketDropUnexpectedVersion) + s.tracer.DroppedPacket(logging.PacketTypeFromHeader(hdr), protocol.InvalidPacketNumber, protocol.ByteCount(len(data)), logging.PacketDropUnexpectedVersion) } s.logger.Debugf("Dropping packet with version %x. Expected %x.", hdr.Version, s.version) break @@ -894,7 +903,7 @@ func (s *connection) handleShortHeaderPacket(p receivedPacket, destConnID protoc if s.receivedPacketHandler.IsPotentiallyDuplicate(pn, protocol.Encryption1RTT) { s.logger.Debugf("Dropping (potentially) duplicate packet.") if s.tracer != nil && s.tracer.DroppedPacket != nil { - s.tracer.DroppedPacket(logging.PacketType1RTT, p.Size(), logging.PacketDropDuplicate) + s.tracer.DroppedPacket(logging.PacketType1RTT, pn, p.Size(), logging.PacketDropDuplicate) } return false } @@ -940,7 +949,7 @@ func (s *connection) handleLongHeaderPacket(p receivedPacket, hdr *wire.Header) // After this, all packets with a different source connection have to be ignored. if s.receivedFirstPacket && hdr.Type == protocol.PacketTypeInitial && hdr.SrcConnectionID != s.handshakeDestConnID { if s.tracer != nil && s.tracer.DroppedPacket != nil { - s.tracer.DroppedPacket(logging.PacketTypeInitial, p.Size(), logging.PacketDropUnknownConnectionID) + s.tracer.DroppedPacket(logging.PacketTypeInitial, protocol.InvalidPacketNumber, p.Size(), logging.PacketDropUnknownConnectionID) } s.logger.Debugf("Dropping Initial packet (%d bytes) with unexpected source connection ID: %s (expected %s)", p.Size(), hdr.SrcConnectionID, s.handshakeDestConnID) return false @@ -948,7 +957,7 @@ func (s *connection) handleLongHeaderPacket(p receivedPacket, hdr *wire.Header) // drop 0-RTT packets, if we are a client if s.perspective == protocol.PerspectiveClient && hdr.Type == protocol.PacketType0RTT { if s.tracer != nil && s.tracer.DroppedPacket != nil { - s.tracer.DroppedPacket(logging.PacketType0RTT, p.Size(), logging.PacketDropKeyUnavailable) + s.tracer.DroppedPacket(logging.PacketType0RTT, protocol.InvalidPacketNumber, p.Size(), logging.PacketDropKeyUnavailable) } return false } @@ -964,10 +973,10 @@ func (s *connection) handleLongHeaderPacket(p receivedPacket, hdr *wire.Header) packet.hdr.Log(s.logger) } - if s.receivedPacketHandler.IsPotentiallyDuplicate(packet.hdr.PacketNumber, packet.encryptionLevel) { + if pn := packet.hdr.PacketNumber; s.receivedPacketHandler.IsPotentiallyDuplicate(pn, packet.encryptionLevel) { s.logger.Debugf("Dropping (potentially) duplicate packet.") if s.tracer != nil && s.tracer.DroppedPacket != nil { - s.tracer.DroppedPacket(logging.PacketTypeFromHeader(hdr), p.Size(), logging.PacketDropDuplicate) + s.tracer.DroppedPacket(logging.PacketTypeFromHeader(hdr), pn, p.Size(), logging.PacketDropDuplicate) } return false } @@ -983,7 +992,7 @@ func (s *connection) handleUnpackError(err error, p receivedPacket, pt logging.P switch err { case handshake.ErrKeysDropped: if s.tracer != nil && s.tracer.DroppedPacket != nil { - s.tracer.DroppedPacket(pt, p.Size(), logging.PacketDropKeyUnavailable) + s.tracer.DroppedPacket(pt, protocol.InvalidPacketNumber, p.Size(), logging.PacketDropKeyUnavailable) } s.logger.Debugf("Dropping %s packet (%d bytes) because we already dropped the keys.", pt, p.Size()) case handshake.ErrKeysNotYetAvailable: @@ -999,7 +1008,7 @@ func (s *connection) handleUnpackError(err error, p receivedPacket, pt logging.P case handshake.ErrDecryptionFailed: // This might be a packet injected by an attacker. Drop it. if s.tracer != nil && s.tracer.DroppedPacket != nil { - s.tracer.DroppedPacket(pt, p.Size(), logging.PacketDropPayloadDecryptError) + s.tracer.DroppedPacket(pt, protocol.InvalidPacketNumber, p.Size(), logging.PacketDropPayloadDecryptError) } s.logger.Debugf("Dropping %s packet (%d bytes) that could not be unpacked. Error: %s", pt, p.Size(), err) default: @@ -1007,7 +1016,7 @@ func (s *connection) handleUnpackError(err error, p receivedPacket, pt logging.P if errors.As(err, &headerErr) { // This might be a packet injected by an attacker. Drop it. if s.tracer != nil && s.tracer.DroppedPacket != nil { - s.tracer.DroppedPacket(pt, p.Size(), logging.PacketDropHeaderParseError) + s.tracer.DroppedPacket(pt, protocol.InvalidPacketNumber, p.Size(), logging.PacketDropHeaderParseError) } s.logger.Debugf("Dropping %s packet (%d bytes) for which we couldn't unpack the header. Error: %s", pt, p.Size(), err) } else { @@ -1022,14 +1031,14 @@ func (s *connection) handleUnpackError(err error, p receivedPacket, pt logging.P func (s *connection) handleRetryPacket(hdr *wire.Header, data []byte, rcvTime time.Time) bool /* was this a valid Retry */ { if s.perspective == protocol.PerspectiveServer { if s.tracer != nil && s.tracer.DroppedPacket != nil { - s.tracer.DroppedPacket(logging.PacketTypeRetry, protocol.ByteCount(len(data)), logging.PacketDropUnexpectedPacket) + s.tracer.DroppedPacket(logging.PacketTypeRetry, protocol.InvalidPacketNumber, protocol.ByteCount(len(data)), logging.PacketDropUnexpectedPacket) } s.logger.Debugf("Ignoring Retry.") return false } if s.receivedFirstPacket { if s.tracer != nil && s.tracer.DroppedPacket != nil { - s.tracer.DroppedPacket(logging.PacketTypeRetry, protocol.ByteCount(len(data)), logging.PacketDropUnexpectedPacket) + s.tracer.DroppedPacket(logging.PacketTypeRetry, protocol.InvalidPacketNumber, protocol.ByteCount(len(data)), logging.PacketDropUnexpectedPacket) } s.logger.Debugf("Ignoring Retry, since we already received a packet.") return false @@ -1037,7 +1046,7 @@ func (s *connection) handleRetryPacket(hdr *wire.Header, data []byte, rcvTime ti destConnID := s.connIDManager.Get() if hdr.SrcConnectionID == destConnID { if s.tracer != nil && s.tracer.DroppedPacket != nil { - s.tracer.DroppedPacket(logging.PacketTypeRetry, protocol.ByteCount(len(data)), logging.PacketDropUnexpectedPacket) + s.tracer.DroppedPacket(logging.PacketTypeRetry, protocol.InvalidPacketNumber, protocol.ByteCount(len(data)), logging.PacketDropUnexpectedPacket) } s.logger.Debugf("Ignoring Retry, since the server didn't change the Source Connection ID.") return false @@ -1052,7 +1061,7 @@ func (s *connection) handleRetryPacket(hdr *wire.Header, data []byte, rcvTime ti tag := handshake.GetRetryIntegrityTag(data[:len(data)-16], destConnID, hdr.Version) if !bytes.Equal(data[len(data)-16:], tag[:]) { if s.tracer != nil && s.tracer.DroppedPacket != nil { - s.tracer.DroppedPacket(logging.PacketTypeRetry, protocol.ByteCount(len(data)), logging.PacketDropPayloadDecryptError) + s.tracer.DroppedPacket(logging.PacketTypeRetry, protocol.InvalidPacketNumber, protocol.ByteCount(len(data)), logging.PacketDropPayloadDecryptError) } s.logger.Debugf("Ignoring spoofed Retry. Integrity Tag doesn't match.") return false @@ -1085,7 +1094,7 @@ func (s *connection) handleVersionNegotiationPacket(p receivedPacket) { if s.perspective == protocol.PerspectiveServer || // servers never receive version negotiation packets s.receivedFirstPacket || s.versionNegotiated { // ignore delayed / duplicated version negotiation packets if s.tracer != nil && s.tracer.DroppedPacket != nil { - s.tracer.DroppedPacket(logging.PacketTypeVersionNegotiation, p.Size(), logging.PacketDropUnexpectedPacket) + s.tracer.DroppedPacket(logging.PacketTypeVersionNegotiation, protocol.InvalidPacketNumber, p.Size(), logging.PacketDropUnexpectedPacket) } return } @@ -1093,7 +1102,7 @@ func (s *connection) handleVersionNegotiationPacket(p receivedPacket) { src, dest, supportedVersions, err := wire.ParseVersionNegotiationPacket(p.data) if err != nil { if s.tracer != nil && s.tracer.DroppedPacket != nil { - s.tracer.DroppedPacket(logging.PacketTypeVersionNegotiation, p.Size(), logging.PacketDropHeaderParseError) + s.tracer.DroppedPacket(logging.PacketTypeVersionNegotiation, protocol.InvalidPacketNumber, p.Size(), logging.PacketDropHeaderParseError) } s.logger.Debugf("Error parsing Version Negotiation packet: %s", err) return @@ -1102,7 +1111,7 @@ func (s *connection) handleVersionNegotiationPacket(p receivedPacket) { for _, v := range supportedVersions { if v == s.version { if s.tracer != nil && s.tracer.DroppedPacket != nil { - s.tracer.DroppedPacket(logging.PacketTypeVersionNegotiation, p.Size(), logging.PacketDropUnexpectedVersion) + s.tracer.DroppedPacket(logging.PacketTypeVersionNegotiation, protocol.InvalidPacketNumber, p.Size(), logging.PacketDropUnexpectedVersion) } // The Version Negotiation packet contains the version that we offered. // This might be a packet sent by an attacker, or it was corrupted. @@ -1144,7 +1153,7 @@ func (s *connection) handleUnpackedLongHeaderPacket( if !s.receivedFirstPacket { s.receivedFirstPacket = true if !s.versionNegotiated && s.tracer != nil && s.tracer.NegotiatedVersion != nil { - var clientVersions, serverVersions []protocol.VersionNumber + var clientVersions, serverVersions []protocol.Version switch s.perspective { case protocol.PerspectiveClient: clientVersions = s.config.Versions @@ -1181,7 +1190,8 @@ func (s *connection) handleUnpackedLongHeaderPacket( } } - if s.perspective == protocol.PerspectiveServer && packet.encryptionLevel == protocol.EncryptionHandshake { + if s.perspective == protocol.PerspectiveServer && packet.encryptionLevel == protocol.EncryptionHandshake && + !s.droppedInitialKeys { // On the server side, Initial keys are dropped as soon as the first Handshake packet is received. // See Section 4.9.1 of RFC 9001. if err := s.dropEncryptionLevel(protocol.EncryptionInitial); err != nil { @@ -1343,7 +1353,7 @@ func (s *connection) handlePacket(p receivedPacket) { case s.receivedPackets <- p: default: if s.tracer != nil && s.tracer.DroppedPacket != nil { - s.tracer.DroppedPacket(logging.PacketTypeNotDetermined, p.Size(), logging.PacketDropDOSPrevention) + s.tracer.DroppedPacket(logging.PacketTypeNotDetermined, protocol.InvalidPacketNumber, p.Size(), logging.PacketDropDOSPrevention) } } } @@ -1522,7 +1532,7 @@ func (s *connection) handleAckFrame(frame *wire.AckFrame, encLevel protocol.Encr } func (s *connection) handleDatagramFrame(f *wire.DatagramFrame) error { - if f.Length(s.version) > protocol.MaxDatagramFrameSize { + if f.Length(s.version) > wire.MaxDatagramSize { return &qerr.TransportError{ ErrorCode: qerr.ProtocolViolation, ErrorMessage: "DATAGRAM frame too large", @@ -1568,13 +1578,6 @@ func (s *connection) closeRemote(e error) { }) } -// Close the connection. It sends a NO_ERROR application error. -// It waits until the run loop has stopped before returning -func (s *connection) shutdown() { - s.closeLocal(nil) - <-s.ctx.Done() -} - func (s *connection) CloseWithError(code ApplicationErrorCode, desc string) error { s.closeLocal(&qerr.ApplicationError{ ErrorCode: code, @@ -1584,6 +1587,11 @@ func (s *connection) CloseWithError(code ApplicationErrorCode, desc string) erro return nil } +func (s *connection) closeWithTransportError(code TransportErrorCode) { + s.closeLocal(&qerr.TransportError{ErrorCode: code}) + <-s.ctx.Done() +} + func (s *connection) handleCloseError(closeErr *closeError) { e := closeErr.err if e == nil { @@ -1628,7 +1636,7 @@ func (s *connection) handleCloseError(closeErr *closeError) { // If this is a remote close we're done here if closeErr.remote { - s.connIDGenerator.ReplaceWithClosed(s.perspective, nil) + s.connIDGenerator.ReplaceWithClosed(nil) return } if closeErr.immediate { @@ -1645,7 +1653,7 @@ func (s *connection) handleCloseError(closeErr *closeError) { if err != nil { s.logger.Debugf("Error sending CONNECTION_CLOSE: %s", err) } - s.connIDGenerator.ReplaceWithClosed(s.perspective, connClosePacket) + s.connIDGenerator.ReplaceWithClosed(connClosePacket) } func (s *connection) dropEncryptionLevel(encLevel protocol.EncryptionLevel) error { @@ -1657,6 +1665,7 @@ func (s *connection) dropEncryptionLevel(encLevel protocol.EncryptionLevel) erro //nolint:exhaustive // only Initial and 0-RTT need special treatment switch encLevel { case protocol.EncryptionInitial: + s.droppedInitialKeys = true s.cryptoStreamHandler.DiscardInitialKeys() case protocol.Encryption0RTT: s.streamsMap.ResetFor0RTT() @@ -1751,7 +1760,7 @@ func (s *connection) applyTransportParameters() { params := s.peerParams // Our local idle timeout will always be > 0. s.idleTimeout = utils.MinNonZeroDuration(s.config.MaxIdleTimeout, params.MaxIdleTimeout) - s.keepAliveInterval = utils.Min(s.config.KeepAlivePeriod, utils.Min(s.idleTimeout/2, protocol.MaxKeepAliveInterval)) + s.keepAliveInterval = min(s.config.KeepAlivePeriod, min(s.idleTimeout/2, protocol.MaxKeepAliveInterval)) s.streamsMap.UpdateLimits(params) s.frameParser.SetAckDelayExponent(params.AckDelayExponent) s.connFlowController.UpdateSendWindow(params.InitialMaxData) @@ -1765,11 +1774,21 @@ func (s *connection) applyTransportParameters() { // Retire the connection ID. s.connIDManager.AddFromPreferredAddress(params.PreferredAddress.ConnectionID, params.PreferredAddress.StatelessResetToken) } + maxPacketSize := protocol.ByteCount(protocol.MaxPacketBufferSize) + if params.MaxUDPPayloadSize > 0 && params.MaxUDPPayloadSize < maxPacketSize { + maxPacketSize = params.MaxUDPPayloadSize + } + s.mtuDiscoverer = newMTUDiscoverer( + s.rttStats, + protocol.ByteCount(s.config.InitialPacketSize), + maxPacketSize, + s.onMTUIncreased, + s.tracer, + ) } -func (s *connection) triggerSending() error { +func (s *connection) triggerSending(now time.Time) error { s.pacingDeadline = time.Time{} - now := time.Now() sendMode := s.sentPacketHandler.SendMode(now) //nolint:exhaustive // No need to handle pacing limited here. @@ -1801,7 +1820,7 @@ func (s *connection) triggerSending() error { s.scheduleSending() return nil } - return s.triggerSending() + return s.triggerSending(now) case ackhandler.SendPTOHandshake: if err := s.sendProbePacket(protocol.EncryptionHandshake, now); err != nil { return err @@ -1810,7 +1829,7 @@ func (s *connection) triggerSending() error { s.scheduleSending() return nil } - return s.triggerSending() + return s.triggerSending(now) case ackhandler.SendPTOAppData: if err := s.sendProbePacket(protocol.Encryption1RTT, now); err != nil { return err @@ -1819,7 +1838,7 @@ func (s *connection) triggerSending() error { s.scheduleSending() return nil } - return s.triggerSending() + return s.triggerSending(now) default: return fmt.Errorf("BUG: invalid send mode %d", sendMode) } @@ -1854,7 +1873,7 @@ func (s *connection) sendPackets(now time.Time) error { } if !s.handshakeConfirmed { - packet, err := s.packer.PackCoalescedPacket(false, s.mtuDiscoverer.CurrentSize(), s.version) + packet, err := s.packer.PackCoalescedPacket(false, s.maxPacketSize(), s.version) if err != nil || packet == nil { return err } @@ -1881,7 +1900,7 @@ func (s *connection) sendPacketsWithoutGSO(now time.Time) error { for { buf := getPacketBuffer() ecn := s.sentPacketHandler.ECNMode(true) - if _, err := s.appendOneShortHeaderPacket(buf, s.mtuDiscoverer.CurrentSize(), ecn, now); err != nil { + if _, err := s.appendOneShortHeaderPacket(buf, s.maxPacketSize(), ecn, now); err != nil { if err == errNothingToPack { buf.Release() return nil @@ -1912,7 +1931,7 @@ func (s *connection) sendPacketsWithoutGSO(now time.Time) error { func (s *connection) sendPacketsWithGSO(now time.Time) error { buf := getLargePacketBuffer() - maxSize := s.mtuDiscoverer.CurrentSize() + maxSize := s.maxPacketSize() ecn := s.sentPacketHandler.ECNMode(true) for { @@ -1981,18 +2000,18 @@ func (s *connection) resetPacingDeadline() { func (s *connection) maybeSendAckOnlyPacket(now time.Time) error { if !s.handshakeConfirmed { ecn := s.sentPacketHandler.ECNMode(false) - packet, err := s.packer.PackCoalescedPacket(true, s.mtuDiscoverer.CurrentSize(), s.version) + packet, err := s.packer.PackCoalescedPacket(true, s.maxPacketSize(), s.version) if err != nil { return err } if packet == nil { return nil } - return s.sendPackedCoalescedPacket(packet, ecn, time.Now()) + return s.sendPackedCoalescedPacket(packet, ecn, now) } ecn := s.sentPacketHandler.ECNMode(true) - p, buf, err := s.packer.PackAckOnlyPacket(s.mtuDiscoverer.CurrentSize(), s.version) + p, buf, err := s.packer.PackAckOnlyPacket(s.maxPacketSize(), s.version) if err != nil { if err == errNothingToPack { return nil @@ -2014,7 +2033,7 @@ func (s *connection) sendProbePacket(encLevel protocol.EncryptionLevel, now time break } var err error - packet, err = s.packer.MaybePackProbePacket(encLevel, s.mtuDiscoverer.CurrentSize(), s.version) + packet, err = s.packer.MaybePackProbePacket(encLevel, s.maxPacketSize(), s.version) if err != nil { return err } @@ -2025,7 +2044,7 @@ func (s *connection) sendProbePacket(encLevel protocol.EncryptionLevel, now time if packet == nil { s.retransmissionQueue.AddPing(encLevel) var err error - packet, err = s.packer.MaybePackProbePacket(encLevel, s.mtuDiscoverer.CurrentSize(), s.version) + packet, err = s.packer.MaybePackProbePacket(encLevel, s.maxPacketSize(), s.version) if err != nil { return err } @@ -2074,7 +2093,8 @@ func (s *connection) sendPackedCoalescedPacket(packet *coalescedPacket, ecn prot largestAcked = p.ack.LargestAcked() } s.sentPacketHandler.SentPacket(now, p.header.PacketNumber, largestAcked, p.streamFrames, p.frames, p.EncryptionLevel(), ecn, p.length, false) - if s.perspective == protocol.PerspectiveClient && p.EncryptionLevel() == protocol.EncryptionHandshake { + if s.perspective == protocol.PerspectiveClient && p.EncryptionLevel() == protocol.EncryptionHandshake && + !s.droppedInitialKeys { // On the client side, Initial keys are dropped as soon as the first Handshake packet is sent. // See Section 4.9.1 of RFC 9001. if err := s.dropEncryptionLevel(protocol.EncryptionInitial); err != nil { @@ -2103,14 +2123,14 @@ func (s *connection) sendConnectionClose(e error) ([]byte, error) { var transportErr *qerr.TransportError var applicationErr *qerr.ApplicationError if errors.As(e, &transportErr) { - packet, err = s.packer.PackConnectionClose(transportErr, s.mtuDiscoverer.CurrentSize(), s.version) + packet, err = s.packer.PackConnectionClose(transportErr, s.maxPacketSize(), s.version) } else if errors.As(e, &applicationErr) { - packet, err = s.packer.PackApplicationClose(applicationErr, s.mtuDiscoverer.CurrentSize(), s.version) + packet, err = s.packer.PackApplicationClose(applicationErr, s.maxPacketSize(), s.version) } else { packet, err = s.packer.PackConnectionClose(&qerr.TransportError{ ErrorCode: qerr.InternalError, ErrorMessage: fmt.Sprintf("connection BUG: unspecified error type (msg: %s)", e.Error()), - }, s.mtuDiscoverer.CurrentSize(), s.version) + }, s.maxPacketSize(), s.version) } if err != nil { return nil, err @@ -2120,6 +2140,24 @@ func (s *connection) sendConnectionClose(e error) ([]byte, error) { return packet.buffer.Data, s.conn.Write(packet.buffer.Data, 0, ecn) } +func (s *connection) maxPacketSize() protocol.ByteCount { + if s.mtuDiscoverer == nil { + // Use the configured packet size on the client side. + // If the server sends a max_udp_payload_size that's smaller than this size, we can ignore this: + // Apparently the server still processed the (fully padded) Initial packet anyway. + if s.perspective == protocol.PerspectiveClient { + return protocol.ByteCount(s.config.InitialPacketSize) + } + // On the server side, there's no downside to using 1200 bytes until we received the client's transport + // parameters: + // * If the first packet didn't contain the entire ClientHello, all we can do is ACK that packet. We don't + // need a lot of bytes for that. + // * If it did, we will have processed the transport parameters and initialized the MTU discoverer. + return protocol.MinInitialPacketSize + } + return s.mtuDiscoverer.CurrentSize() +} + func (s *connection) logLongHeaderPacket(p *longHeaderPacket, ecn protocol.ECN) { // quic-go logging if s.logger.Debug() { @@ -2305,7 +2343,7 @@ func (s *connection) tryQueueingUndecryptablePacket(p receivedPacket, pt logging } if len(s.undecryptablePackets)+1 > protocol.MaxUndecryptablePackets { if s.tracer != nil && s.tracer.DroppedPacket != nil { - s.tracer.DroppedPacket(pt, p.Size(), logging.PacketDropDOSPrevention) + s.tracer.DroppedPacket(pt, protocol.InvalidPacketNumber, p.Size(), logging.PacketDropDOSPrevention) } s.logger.Infof("Dropping undecryptable packet (%d bytes). Undecryptable packet queue full.", p.Size()) return @@ -2343,21 +2381,32 @@ func (s *connection) onStreamCompleted(id protocol.StreamID) { } } -func (s *connection) SendMessage(p []byte) error { +func (s *connection) onMTUIncreased(mtu protocol.ByteCount) { + s.maxPayloadSizeEstimate.Store(uint32(estimateMaxPayloadSize(mtu))) + s.sentPacketHandler.SetMaxDatagramSize(mtu) +} + +func (s *connection) SendDatagram(p []byte) error { if !s.supportsDatagrams() { return errors.New("datagram support disabled") } f := &wire.DatagramFrame{DataLenPresent: true} - if protocol.ByteCount(len(p)) > f.MaxDataLen(s.peerParams.MaxDatagramFrameSize, s.version) { - return errors.New("message too large") + // The payload size estimate is conservative. + // Under many circumstances we could send a few more bytes. + maxDataLen := min( + f.MaxDataLen(s.peerParams.MaxDatagramFrameSize, s.version), + protocol.ByteCount(s.maxPayloadSizeEstimate.Load()), + ) + if protocol.ByteCount(len(p)) > maxDataLen { + return &DatagramTooLargeError{MaxDatagramPayloadSize: int64(maxDataLen)} } f.Data = make([]byte, len(p)) copy(f.Data, p) - return s.datagramQueue.AddAndWait(f) + return s.datagramQueue.Add(f) } -func (s *connection) ReceiveMessage(ctx context.Context) ([]byte, error) { +func (s *connection) ReceiveDatagram(ctx context.Context) ([]byte, error) { if !s.config.EnableDatagrams { return nil, errors.New("datagram support disabled") } @@ -2372,11 +2421,7 @@ func (s *connection) RemoteAddr() net.Addr { return s.conn.RemoteAddr() } -func (s *connection) getPerspective() protocol.Perspective { - return s.perspective -} - -func (s *connection) GetVersion() protocol.VersionNumber { +func (s *connection) GetVersion() protocol.Version { return s.version } @@ -2385,3 +2430,10 @@ func (s *connection) NextConnection() Connection { s.streamsMap.UseResetMaps() return s } + +// estimateMaxPayloadSize estimates the maximum payload size for short header packets. +// It is not very sophisticated: it just subtracts the size of header (assuming the maximum +// connection ID length), and the size of the encryption tag. +func estimateMaxPayloadSize(mtu protocol.ByteCount) protocol.ByteCount { + return mtu - 1 /* type byte */ - 20 /* maximum connection ID length */ - 16 /* tag size */ +} diff --git a/vendor/github.com/quic-go/quic-go/crypto_stream.go b/vendor/github.com/quic-go/quic-go/crypto_stream.go index 4be2a07ae..abc7ddcf8 100644 --- a/vendor/github.com/quic-go/quic-go/crypto_stream.go +++ b/vendor/github.com/quic-go/quic-go/crypto_stream.go @@ -6,7 +6,6 @@ import ( "github.com/quic-go/quic-go/internal/protocol" "github.com/quic-go/quic-go/internal/qerr" - "github.com/quic-go/quic-go/internal/utils" "github.com/quic-go/quic-go/internal/wire" ) @@ -56,7 +55,7 @@ func (s *cryptoStreamImpl) HandleCryptoFrame(f *wire.CryptoFrame) error { // could e.g. be a retransmission return nil } - s.highestOffset = utils.Max(s.highestOffset, highestOffset) + s.highestOffset = max(s.highestOffset, highestOffset) if err := s.queue.Push(f.Data, f.Offset, nil); err != nil { return err } @@ -99,7 +98,7 @@ func (s *cryptoStreamImpl) HasData() bool { func (s *cryptoStreamImpl) PopCryptoFrame(maxLen protocol.ByteCount) *wire.CryptoFrame { f := &wire.CryptoFrame{Offset: s.writeOffset} - n := utils.Min(f.MaxDataLen(maxLen), protocol.ByteCount(len(s.writeBuf))) + n := min(f.MaxDataLen(maxLen), protocol.ByteCount(len(s.writeBuf))) f.Data = s.writeBuf[:n] s.writeBuf = s.writeBuf[n:] s.writeOffset += n diff --git a/vendor/github.com/quic-go/quic-go/datagram_queue.go b/vendor/github.com/quic-go/quic-go/datagram_queue.go index ca80d404c..e26285b26 100644 --- a/vendor/github.com/quic-go/quic-go/datagram_queue.go +++ b/vendor/github.com/quic-go/quic-go/datagram_queue.go @@ -4,14 +4,20 @@ import ( "context" "sync" - "github.com/quic-go/quic-go/internal/protocol" "github.com/quic-go/quic-go/internal/utils" + "github.com/quic-go/quic-go/internal/utils/ringbuffer" "github.com/quic-go/quic-go/internal/wire" ) +const ( + maxDatagramSendQueueLen = 32 + maxDatagramRcvQueueLen = 128 +) + type datagramQueue struct { - sendQueue chan *wire.DatagramFrame - nextFrame *wire.DatagramFrame + sendMx sync.Mutex + sendQueue ringbuffer.RingBuffer[*wire.DatagramFrame] + sent chan struct{} // used to notify Add that a datagram was dequeued rcvMx sync.Mutex rcvQueue [][]byte @@ -22,60 +28,65 @@ type datagramQueue struct { hasData func() - dequeued chan struct{} - logger utils.Logger } func newDatagramQueue(hasData func(), logger utils.Logger) *datagramQueue { return &datagramQueue{ - hasData: hasData, - sendQueue: make(chan *wire.DatagramFrame, 1), - rcvd: make(chan struct{}, 1), - dequeued: make(chan struct{}), - closed: make(chan struct{}), - logger: logger, + hasData: hasData, + rcvd: make(chan struct{}, 1), + sent: make(chan struct{}, 1), + closed: make(chan struct{}), + logger: logger, } } -// AddAndWait queues a new DATAGRAM frame for sending. -// It blocks until the frame has been dequeued. -func (h *datagramQueue) AddAndWait(f *wire.DatagramFrame) error { - select { - case h.sendQueue <- f: - h.hasData() - case <-h.closed: - return h.closeErr - } +// Add queues a new DATAGRAM frame for sending. +// Up to 32 DATAGRAM frames will be queued. +// Once that limit is reached, Add blocks until the queue size has reduced. +func (h *datagramQueue) Add(f *wire.DatagramFrame) error { + h.sendMx.Lock() - select { - case <-h.dequeued: - return nil - case <-h.closed: - return h.closeErr + for { + if h.sendQueue.Len() < maxDatagramSendQueueLen { + h.sendQueue.PushBack(f) + h.sendMx.Unlock() + h.hasData() + return nil + } + select { + case <-h.sent: // drain the queue so we don't loop immediately + default: + } + h.sendMx.Unlock() + select { + case <-h.closed: + return h.closeErr + case <-h.sent: + } + h.sendMx.Lock() } } // Peek gets the next DATAGRAM frame for sending. // If actually sent out, Pop needs to be called before the next call to Peek. func (h *datagramQueue) Peek() *wire.DatagramFrame { - if h.nextFrame != nil { - return h.nextFrame - } - select { - case h.nextFrame = <-h.sendQueue: - h.dequeued <- struct{}{} - default: + h.sendMx.Lock() + defer h.sendMx.Unlock() + if h.sendQueue.Empty() { return nil } - return h.nextFrame + return h.sendQueue.PeekFront() } func (h *datagramQueue) Pop() { - if h.nextFrame == nil { - panic("datagramQueue BUG: Pop called for nil frame") + h.sendMx.Lock() + defer h.sendMx.Unlock() + _ = h.sendQueue.PopFront() + select { + case h.sent <- struct{}{}: + default: } - h.nextFrame = nil } // HandleDatagramFrame handles a received DATAGRAM frame. @@ -84,7 +95,7 @@ func (h *datagramQueue) HandleDatagramFrame(f *wire.DatagramFrame) { copy(data, f.Data) var queued bool h.rcvMx.Lock() - if len(h.rcvQueue) < protocol.DatagramRcvQueueLen { + if len(h.rcvQueue) < maxDatagramRcvQueueLen { h.rcvQueue = append(h.rcvQueue, data) queued = true select { @@ -94,7 +105,7 @@ func (h *datagramQueue) HandleDatagramFrame(f *wire.DatagramFrame) { } h.rcvMx.Unlock() if !queued && h.logger.Debug() { - h.logger.Debugf("Discarding DATAGRAM frame (%d bytes payload)", len(f.Data)) + h.logger.Debugf("Discarding received DATAGRAM frame (%d bytes payload)", len(f.Data)) } } diff --git a/vendor/github.com/quic-go/quic-go/errors.go b/vendor/github.com/quic-go/quic-go/errors.go index c9fb0a07b..3fe1e0a90 100644 --- a/vendor/github.com/quic-go/quic-go/errors.go +++ b/vendor/github.com/quic-go/quic-go/errors.go @@ -61,3 +61,15 @@ func (e *StreamError) Error() string { } return fmt.Sprintf("stream %d canceled by %s with error code %d", e.StreamID, pers, e.ErrorCode) } + +// DatagramTooLargeError is returned from Connection.SendDatagram if the payload is too large to be sent. +type DatagramTooLargeError struct { + MaxDatagramPayloadSize int64 +} + +func (e *DatagramTooLargeError) Is(target error) bool { + _, ok := target.(*DatagramTooLargeError) + return ok +} + +func (e *DatagramTooLargeError) Error() string { return "DATAGRAM frame too large" } diff --git a/vendor/github.com/quic-go/quic-go/framer.go b/vendor/github.com/quic-go/quic-go/framer.go index d5c61bcf7..5eef65372 100644 --- a/vendor/github.com/quic-go/quic-go/framer.go +++ b/vendor/github.com/quic-go/quic-go/framer.go @@ -15,15 +15,25 @@ type framer interface { HasData() bool QueueControlFrame(wire.Frame) - AppendControlFrames([]ackhandler.Frame, protocol.ByteCount, protocol.VersionNumber) ([]ackhandler.Frame, protocol.ByteCount) + AppendControlFrames([]ackhandler.Frame, protocol.ByteCount, protocol.Version) ([]ackhandler.Frame, protocol.ByteCount) AddActiveStream(protocol.StreamID) - AppendStreamFrames([]ackhandler.StreamFrame, protocol.ByteCount, protocol.VersionNumber) ([]ackhandler.StreamFrame, protocol.ByteCount) + AppendStreamFrames([]ackhandler.StreamFrame, protocol.ByteCount, protocol.Version) ([]ackhandler.StreamFrame, protocol.ByteCount) Handle0RTTRejection() error + + // QueuedTooManyControlFrames says if the control frame queue exceeded its maximum queue length. + // This is a hack. + // It is easier to implement than propagating an error return value in QueueControlFrame. + // The correct solution would be to queue frames with their respective structs. + // See https://github.com/quic-go/quic-go/issues/4271 for the queueing of stream-related control frames. + QueuedTooManyControlFrames() bool } -const maxPathResponses = 256 +const ( + maxPathResponses = 256 + maxControlFrames = 16 << 10 +) type framerI struct { mutex sync.Mutex @@ -33,9 +43,10 @@ type framerI struct { activeStreams map[protocol.StreamID]struct{} streamQueue ringbuffer.RingBuffer[protocol.StreamID] - controlFrameMutex sync.Mutex - controlFrames []wire.Frame - pathResponses []*wire.PathResponseFrame + controlFrameMutex sync.Mutex + controlFrames []wire.Frame + pathResponses []*wire.PathResponseFrame + queuedTooManyControlFrames bool } var _ framer = &framerI{} @@ -73,10 +84,15 @@ func (f *framerI) QueueControlFrame(frame wire.Frame) { f.pathResponses = append(f.pathResponses, pr) return } + // This is a hack. + if len(f.controlFrames) >= maxControlFrames { + f.queuedTooManyControlFrames = true + return + } f.controlFrames = append(f.controlFrames, frame) } -func (f *framerI) AppendControlFrames(frames []ackhandler.Frame, maxLen protocol.ByteCount, v protocol.VersionNumber) ([]ackhandler.Frame, protocol.ByteCount) { +func (f *framerI) AppendControlFrames(frames []ackhandler.Frame, maxLen protocol.ByteCount, v protocol.Version) ([]ackhandler.Frame, protocol.ByteCount) { f.controlFrameMutex.Lock() defer f.controlFrameMutex.Unlock() @@ -105,6 +121,10 @@ func (f *framerI) AppendControlFrames(frames []ackhandler.Frame, maxLen protocol return frames, length } +func (f *framerI) QueuedTooManyControlFrames() bool { + return f.queuedTooManyControlFrames +} + func (f *framerI) AddActiveStream(id protocol.StreamID) { f.mutex.Lock() if _, ok := f.activeStreams[id]; !ok { @@ -114,7 +134,7 @@ func (f *framerI) AddActiveStream(id protocol.StreamID) { f.mutex.Unlock() } -func (f *framerI) AppendStreamFrames(frames []ackhandler.StreamFrame, maxLen protocol.ByteCount, v protocol.VersionNumber) ([]ackhandler.StreamFrame, protocol.ByteCount) { +func (f *framerI) AppendStreamFrames(frames []ackhandler.StreamFrame, maxLen protocol.ByteCount, v protocol.Version) ([]ackhandler.StreamFrame, protocol.ByteCount) { startLen := len(frames) var length protocol.ByteCount f.mutex.Lock() @@ -137,7 +157,7 @@ func (f *framerI) AppendStreamFrames(frames []ackhandler.StreamFrame, maxLen pro // For the last STREAM frame, we'll remove the DataLen field later. // Therefore, we can pretend to have more bytes available when popping // the STREAM frame (which will always have the DataLen set). - remainingLen += quicvarint.Len(uint64(remainingLen)) + remainingLen += protocol.ByteCount(quicvarint.Len(uint64(remainingLen))) frame, ok, hasMoreData := str.popStreamFrame(remainingLen, v) if hasMoreData { // put the stream back in the queue (at the end) f.streamQueue.PushBack(id) diff --git a/vendor/github.com/quic-go/quic-go/http3/README.md b/vendor/github.com/quic-go/quic-go/http3/README.md new file mode 100644 index 000000000..0e2ed4c5f --- /dev/null +++ b/vendor/github.com/quic-go/quic-go/http3/README.md @@ -0,0 +1,9 @@ +# HTTP/3 + +[![Documentation](https://img.shields.io/badge/docs-quic--go.net-red?style=flat)](https://quic-go.net/docs/) +[![PkgGoDev](https://pkg.go.dev/badge/github.com/quic-go/quic-go/http3)](https://pkg.go.dev/github.com/quic-go/quic-go/http3) + +This package implements HTTP/3 ([RFC 9114](https://datatracker.ietf.org/doc/html/rfc9114)), including QPACK ([RFC 9204](https://datatracker.ietf.org/doc/html/rfc9204)) and HTTP Datagrams ([RFC 9297](https://datatracker.ietf.org/doc/html/rfc9297)). +It aims to provide feature parity with the standard library's HTTP/1.1 and HTTP/2 implementation. + +Detailed documentation can be found on [quic-go.net](https://quic-go.net/docs/). diff --git a/vendor/github.com/quic-go/quic-go/http3/body.go b/vendor/github.com/quic-go/quic-go/http3/body.go index dc168e9e8..fa023ce49 100644 --- a/vendor/github.com/quic-go/quic-go/http3/body.go +++ b/vendor/github.com/quic-go/quic-go/http3/body.go @@ -2,68 +2,67 @@ package http3 import ( "context" + "errors" "io" - "net" "github.com/quic-go/quic-go" ) -// The HTTPStreamer allows taking over a HTTP/3 stream. The interface is implemented by: -// * for the server: the http.Request.Body -// * for the client: the http.Response.Body -// On the client side, the stream will be closed for writing, unless the DontCloseRequestStream RoundTripOpt was set. -// When a stream is taken over, it's the caller's responsibility to close the stream. -type HTTPStreamer interface { - HTTPStream() Stream -} - -type StreamCreator interface { - // Context returns a context that is cancelled when the underlying connection is closed. - Context() context.Context - OpenStream() (quic.Stream, error) - OpenStreamSync(context.Context) (quic.Stream, error) - OpenUniStream() (quic.SendStream, error) - OpenUniStreamSync(context.Context) (quic.SendStream, error) - LocalAddr() net.Addr - RemoteAddr() net.Addr - ConnectionState() quic.ConnectionState -} - -var _ StreamCreator = quic.Connection(nil) - // A Hijacker allows hijacking of the stream creating part of a quic.Session from a http.Response.Body. // It is used by WebTransport to create WebTransport streams after a session has been established. type Hijacker interface { - StreamCreator() StreamCreator + Connection() Connection } -// The body of a http.Request or http.Response. +var errTooMuchData = errors.New("peer sent too much data") + +// The body is used in the requestBody (for a http.Request) and the responseBody (for a http.Response). type body struct { - str quic.Stream + str *stream - wasHijacked bool // set when HTTPStream is called + remainingContentLength int64 + violatedContentLength bool + hasContentLength bool } -var ( - _ io.ReadCloser = &body{} - _ HTTPStreamer = &body{} -) - -func newRequestBody(str Stream) *body { - return &body{str: str} +func newBody(str *stream, contentLength int64) *body { + b := &body{str: str} + if contentLength >= 0 { + b.hasContentLength = true + b.remainingContentLength = contentLength + } + return b } -func (r *body) HTTPStream() Stream { - r.wasHijacked = true - return r.str -} +func (r *body) StreamID() quic.StreamID { return r.str.StreamID() } -func (r *body) wasStreamHijacked() bool { - return r.wasHijacked +func (r *body) checkContentLengthViolation() error { + if !r.hasContentLength { + return nil + } + if r.remainingContentLength < 0 || r.remainingContentLength == 0 && r.str.hasMoreData() { + if !r.violatedContentLength { + r.str.CancelRead(quic.StreamErrorCode(ErrCodeMessageError)) + r.str.CancelWrite(quic.StreamErrorCode(ErrCodeMessageError)) + r.violatedContentLength = true + } + return errTooMuchData + } + return nil } func (r *body) Read(b []byte) (int, error) { + if err := r.checkContentLengthViolation(); err != nil { + return 0, err + } + if r.hasContentLength { + b = b[:min(int64(len(b)), r.remainingContentLength)] + } n, err := r.str.Read(b) + r.remainingContentLength -= int64(n) + if err := r.checkContentLengthViolation(); err != nil { + return n, err + } return n, maybeReplaceError(err) } @@ -72,9 +71,26 @@ func (r *body) Close() error { return nil } -type hijackableBody struct { +type requestBody struct { body - conn quic.Connection // only needed to implement Hijacker + connCtx context.Context + rcvdSettings <-chan struct{} + getSettings func() *Settings +} + +var _ io.ReadCloser = &requestBody{} + +func newRequestBody(str *stream, contentLength int64, connCtx context.Context, rcvdSettings <-chan struct{}, getSettings func() *Settings) *requestBody { + return &requestBody{ + body: *newBody(str, contentLength), + connCtx: connCtx, + rcvdSettings: rcvdSettings, + getSettings: getSettings, + } +} + +type hijackableBody struct { + body body // only set for the http.Response // The channel is closed when the user is done with this response: @@ -83,27 +99,17 @@ type hijackableBody struct { reqDoneClosed bool } -var ( - _ Hijacker = &hijackableBody{} - _ HTTPStreamer = &hijackableBody{} -) +var _ io.ReadCloser = &hijackableBody{} -func newResponseBody(str Stream, conn quic.Connection, done chan<- struct{}) *hijackableBody { +func newResponseBody(str *stream, contentLength int64, done chan<- struct{}) *hijackableBody { return &hijackableBody{ - body: body{ - str: str, - }, + body: *newBody(str, contentLength), reqDone: done, - conn: conn, } } -func (r *hijackableBody) StreamCreator() StreamCreator { - return r.conn -} - func (r *hijackableBody) Read(b []byte) (int, error) { - n, err := r.str.Read(b) + n, err := r.body.Read(b) if err != nil { r.requestDone() } @@ -120,17 +126,9 @@ func (r *hijackableBody) requestDone() { r.reqDoneClosed = true } -func (r *body) StreamID() quic.StreamID { - return r.str.StreamID() -} - func (r *hijackableBody) Close() error { r.requestDone() // If the EOF was read, CancelRead() is a no-op. - r.str.CancelRead(quic.StreamErrorCode(ErrCodeRequestCanceled)) + r.body.str.CancelRead(quic.StreamErrorCode(ErrCodeRequestCanceled)) return nil } - -func (r *hijackableBody) HTTPStream() Stream { - return r.str -} diff --git a/vendor/github.com/quic-go/quic-go/http3/capsule.go b/vendor/github.com/quic-go/quic-go/http3/capsule.go index 7bdcd4e57..69d4037a7 100644 --- a/vendor/github.com/quic-go/quic-go/http3/capsule.go +++ b/vendor/github.com/quic-go/quic-go/http3/capsule.go @@ -21,13 +21,29 @@ func (r *exactReader) Read(b []byte) (int, error) { return n, err } +type countingByteReader struct { + io.ByteReader + Read int +} + +func (r *countingByteReader) ReadByte() (byte, error) { + b, err := r.ByteReader.ReadByte() + if err == nil { + r.Read++ + } + return b, err +} + // ParseCapsule parses the header of a Capsule. // It returns an io.LimitedReader that can be used to read the Capsule value. // The Capsule value must be read entirely (i.e. until the io.EOF) before using r again. func ParseCapsule(r quicvarint.Reader) (CapsuleType, io.Reader, error) { - ct, err := quicvarint.Read(r) + cbr := countingByteReader{ByteReader: r} + ct, err := quicvarint.Read(&cbr) if err != nil { - if err == io.EOF { + // If an io.EOF is returned without consuming any bytes, return it unmodified. + // Otherwise, return an io.ErrUnexpectedEOF. + if err == io.EOF && cbr.Read > 0 { return 0, nil, io.ErrUnexpectedEOF } return 0, nil, err diff --git a/vendor/github.com/quic-go/quic-go/http3/client.go b/vendor/github.com/quic-go/quic-go/http3/client.go index 8aca48078..f5370549b 100644 --- a/vendor/github.com/quic-go/quic-go/http3/client.go +++ b/vendor/github.com/quic-go/quic-go/http3/client.go @@ -2,28 +2,31 @@ package http3 import ( "context" - "crypto/tls" "errors" "fmt" "io" - "net" + "log/slog" "net/http" - "strconv" + "net/http/httptrace" + "net/textproto" "sync" - "sync/atomic" "time" "github.com/quic-go/quic-go" "github.com/quic-go/quic-go/internal/protocol" - "github.com/quic-go/quic-go/internal/utils" "github.com/quic-go/quic-go/quicvarint" "github.com/quic-go/qpack" ) -// MethodGet0RTT allows a GET request to be sent using 0-RTT. -// Note that 0-RTT data doesn't provide replay protection. -const MethodGet0RTT = "GET_0RTT" +const ( + // MethodGet0RTT allows a GET request to be sent using 0-RTT. + // Note that 0-RTT doesn't provide replay protection and should only be used for idempotent requests. + MethodGet0RTT = "GET_0RTT" + // MethodHead0RTT allows a HEAD request to be sent using 0-RTT. + // Note that 0-RTT doesn't provide replay protection and should only be used for idempotent requests. + MethodHead0RTT = "HEAD_0RTT" +) const ( defaultUserAgent = "quic-go HTTP/3" @@ -35,115 +38,67 @@ var defaultQuicConfig = &quic.Config{ KeepAlivePeriod: 10 * time.Second, } -type dialFunc func(ctx context.Context, addr string, tlsCfg *tls.Config, cfg *quic.Config) (quic.EarlyConnection, error) +// SingleDestinationRoundTripper is an HTTP/3 client doing requests to a single remote server. +type SingleDestinationRoundTripper struct { + Connection quic.Connection -var dialAddr dialFunc = quic.DialAddrEarly + // Enable support for HTTP/3 datagrams (RFC 9297). + // If a QUICConfig is set, datagram support also needs to be enabled on the QUIC layer by setting EnableDatagrams. + EnableDatagrams bool -type roundTripperOpts struct { - DisableCompression bool - EnableDatagram bool - MaxHeaderBytes int64 + // Additional HTTP/3 settings. + // It is invalid to specify any settings defined by RFC 9114 (HTTP/3) and RFC 9297 (HTTP Datagrams). AdditionalSettings map[uint64]uint64 - StreamHijacker func(FrameType, quic.Connection, quic.Stream, error) (hijacked bool, err error) - UniStreamHijacker func(StreamType, quic.Connection, quic.ReceiveStream, error) (hijacked bool) -} + StreamHijacker func(FrameType, quic.ConnectionTracingID, quic.Stream, error) (hijacked bool, err error) + UniStreamHijacker func(StreamType, quic.ConnectionTracingID, quic.ReceiveStream, error) (hijacked bool) -// client is a HTTP3 client doing requests -type client struct { - tlsConf *tls.Config - config *quic.Config - opts *roundTripperOpts + // MaxResponseHeaderBytes specifies a limit on how many response bytes are + // allowed in the server's response header. + // Zero means to use a default limit. + MaxResponseHeaderBytes int64 - dialOnce sync.Once - dialer dialFunc - handshakeErr error + // DisableCompression, if true, prevents the Transport from requesting compression with an + // "Accept-Encoding: gzip" request header when the Request contains no existing Accept-Encoding value. + // If the Transport requests gzip on its own and gets a gzipped response, it's transparently + // decoded in the Response.Body. + // However, if the user explicitly requested gzip it is not automatically uncompressed. + DisableCompression bool + Logger *slog.Logger + + initOnce sync.Once + hconn *connection requestWriter *requestWriter - - decoder *qpack.Decoder - - hostname string - conn atomic.Pointer[quic.EarlyConnection] - - logger utils.Logger + decoder *qpack.Decoder } -var _ roundTripCloser = &client{} +var _ http.RoundTripper = &SingleDestinationRoundTripper{} -func newClient(hostname string, tlsConf *tls.Config, opts *roundTripperOpts, conf *quic.Config, dialer dialFunc) (roundTripCloser, error) { - if conf == nil { - conf = defaultQuicConfig.Clone() - } - if len(conf.Versions) == 0 { - conf = conf.Clone() - conf.Versions = []quic.VersionNumber{protocol.SupportedVersions[0]} - } - if len(conf.Versions) != 1 { - return nil, errors.New("can only use a single QUIC version for dialing a HTTP/3 connection") - } - if conf.MaxIncomingStreams == 0 { - conf.MaxIncomingStreams = -1 // don't allow any bidirectional streams - } - conf.EnableDatagrams = opts.EnableDatagram - logger := utils.DefaultLogger.WithPrefix("h3 client") - - if tlsConf == nil { - tlsConf = &tls.Config{} - } else { - tlsConf = tlsConf.Clone() - } - if tlsConf.ServerName == "" { - sni, _, err := net.SplitHostPort(hostname) - if err != nil { - // It's ok if net.SplitHostPort returns an error - it could be a hostname/IP address without a port. - sni = hostname - } - tlsConf.ServerName = sni - } - // Replace existing ALPNs by H3 - tlsConf.NextProtos = []string{versionToALPN(conf.Versions[0])} - - return &client{ - hostname: authorityAddr("https", hostname), - tlsConf: tlsConf, - requestWriter: newRequestWriter(logger), - decoder: qpack.NewDecoder(func(hf qpack.HeaderField) {}), - config: conf, - opts: opts, - dialer: dialer, - logger: logger, - }, nil +func (c *SingleDestinationRoundTripper) Start() Connection { + c.initOnce.Do(func() { c.init() }) + return c.hconn } -func (c *client) dial(ctx context.Context) error { - var err error - var conn quic.EarlyConnection - if c.dialer != nil { - conn, err = c.dialer(ctx, c.hostname, c.tlsConf, c.config) - } else { - conn, err = dialAddr(ctx, c.hostname, c.tlsConf, c.config) - } - if err != nil { - return err - } - c.conn.Store(&conn) - +func (c *SingleDestinationRoundTripper) init() { + c.decoder = qpack.NewDecoder(func(hf qpack.HeaderField) {}) + c.requestWriter = newRequestWriter() + c.hconn = newConnection(c.Connection, c.EnableDatagrams, protocol.PerspectiveClient, c.Logger) // send the SETTINGs frame, using 0-RTT data, if possible go func() { - if err := c.setupConn(conn); err != nil { - c.logger.Debugf("Setting up connection failed: %s", err) - conn.CloseWithError(quic.ApplicationErrorCode(ErrCodeInternalError), "") + if err := c.setupConn(c.hconn); err != nil { + if c.Logger != nil { + c.Logger.Debug("Setting up connection failed", "error", err) + } + c.hconn.CloseWithError(quic.ApplicationErrorCode(ErrCodeInternalError), "") } }() - - if c.opts.StreamHijacker != nil { - go c.handleBidirectionalStreams(conn) + if c.StreamHijacker != nil { + go c.handleBidirectionalStreams() } - go c.handleUnidirectionalStreams(conn) - return nil + go c.hconn.HandleUnidirectionalStreams(c.UniStreamHijacker) } -func (c *client) setupConn(conn quic.EarlyConnection) error { +func (c *SingleDestinationRoundTripper) setupConn(conn *connection) error { // open the control stream str, err := conn.OpenUniStream() if err != nil { @@ -152,135 +107,103 @@ func (c *client) setupConn(conn quic.EarlyConnection) error { b := make([]byte, 0, 64) b = quicvarint.Append(b, streamTypeControlStream) // send the SETTINGS frame - b = (&settingsFrame{Datagram: c.opts.EnableDatagram, Other: c.opts.AdditionalSettings}).Append(b) + b = (&settingsFrame{Datagram: c.EnableDatagrams, Other: c.AdditionalSettings}).Append(b) _, err = str.Write(b) return err } -func (c *client) handleBidirectionalStreams(conn quic.EarlyConnection) { +func (c *SingleDestinationRoundTripper) handleBidirectionalStreams() { for { - str, err := conn.AcceptStream(context.Background()) + str, err := c.hconn.AcceptStream(context.Background()) if err != nil { - c.logger.Debugf("accepting bidirectional stream failed: %s", err) + if c.Logger != nil { + c.Logger.Debug("accepting bidirectional stream failed", "error", err) + } return } - go func(str quic.Stream) { - _, err := parseNextFrame(str, func(ft FrameType, e error) (processed bool, err error) { - return c.opts.StreamHijacker(ft, conn, str, e) - }) - if err == errHijacked { - return - } - if err != nil { - c.logger.Debugf("error handling stream: %s", err) - } - conn.CloseWithError(quic.ApplicationErrorCode(ErrCodeFrameUnexpected), "received HTTP/3 frame on bidirectional stream") - }(str) - } -} - -func (c *client) handleUnidirectionalStreams(conn quic.EarlyConnection) { - for { - str, err := conn.AcceptUniStream(context.Background()) - if err != nil { - c.logger.Debugf("accepting unidirectional stream failed: %s", err) - return + fp := &frameParser{ + r: str, + conn: c.hconn, + unknownFrameHandler: func(ft FrameType, e error) (processed bool, err error) { + id := c.hconn.Context().Value(quic.ConnectionTracingKey).(quic.ConnectionTracingID) + return c.StreamHijacker(ft, id, str, e) + }, } - - go func(str quic.ReceiveStream) { - streamType, err := quicvarint.Read(quicvarint.NewReader(str)) + go func() { + if _, err := fp.ParseNext(); err == errHijacked { + return + } if err != nil { - if c.opts.UniStreamHijacker != nil && c.opts.UniStreamHijacker(StreamType(streamType), conn, str, err) { - return + if c.Logger != nil { + c.Logger.Debug("error handling stream", "error", err) } - c.logger.Debugf("reading stream type on stream %d failed: %s", str.StreamID(), err) - return } - // We're only interested in the control stream here. - switch streamType { - case streamTypeControlStream: - case streamTypeQPACKEncoderStream, streamTypeQPACKDecoderStream: - // Our QPACK implementation doesn't use the dynamic table yet. - // TODO: check that only one stream of each type is opened. - return - case streamTypePushStream: - // We never increased the Push ID, so we don't expect any push streams. - conn.CloseWithError(quic.ApplicationErrorCode(ErrCodeIDError), "") - return - default: - if c.opts.UniStreamHijacker != nil && c.opts.UniStreamHijacker(StreamType(streamType), conn, str, nil) { - return - } - str.CancelRead(quic.StreamErrorCode(ErrCodeStreamCreationError)) - return - } - f, err := parseNextFrame(str, nil) - if err != nil { - conn.CloseWithError(quic.ApplicationErrorCode(ErrCodeFrameError), "") - return - } - sf, ok := f.(*settingsFrame) - if !ok { - conn.CloseWithError(quic.ApplicationErrorCode(ErrCodeMissingSettings), "") - return - } - if !sf.Datagram { - return - } - // If datagram support was enabled on our side as well as on the server side, - // we can expect it to have been negotiated both on the transport and on the HTTP/3 layer. - // Note: ConnectionState() will block until the handshake is complete (relevant when using 0-RTT). - if c.opts.EnableDatagram && !conn.ConnectionState().SupportsDatagrams { - conn.CloseWithError(quic.ApplicationErrorCode(ErrCodeSettingsError), "missing QUIC Datagram support") - } - }(str) + c.hconn.CloseWithError(quic.ApplicationErrorCode(ErrCodeFrameUnexpected), "received HTTP/3 frame on bidirectional stream") + }() } } -func (c *client) Close() error { - conn := c.conn.Load() - if conn == nil { - return nil - } - return (*conn).CloseWithError(quic.ApplicationErrorCode(ErrCodeNoError), "") -} - -func (c *client) maxHeaderBytes() uint64 { - if c.opts.MaxHeaderBytes <= 0 { +func (c *SingleDestinationRoundTripper) maxHeaderBytes() uint64 { + if c.MaxResponseHeaderBytes <= 0 { return defaultMaxResponseHeaderBytes } - return uint64(c.opts.MaxHeaderBytes) + return uint64(c.MaxResponseHeaderBytes) } -// RoundTripOpt executes a request and returns a response -func (c *client) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Response, error) { - if authorityAddr("https", hostnameFromRequest(req)) != c.hostname { - return nil, fmt.Errorf("http3 client BUG: RoundTripOpt called for the wrong client (expected %s, got %s)", c.hostname, req.Host) +// RoundTrip executes a request and returns a response +func (c *SingleDestinationRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + c.initOnce.Do(func() { c.init() }) + + rsp, err := c.roundTrip(req) + if err != nil && req.Context().Err() != nil { + // if the context was canceled, return the context cancellation error + err = req.Context().Err() } + return rsp, err +} - c.dialOnce.Do(func() { - c.handshakeErr = c.dial(req.Context()) - }) - if c.handshakeErr != nil { - return nil, c.handshakeErr - } - - // At this point, c.conn is guaranteed to be set. - conn := *c.conn.Load() - +func (c *SingleDestinationRoundTripper) roundTrip(req *http.Request) (*http.Response, error) { // Immediately send out this request, if this is a 0-RTT request. - if req.Method == MethodGet0RTT { + switch req.Method { + case MethodGet0RTT: + // don't modify the original request + reqCopy := *req + req = &reqCopy req.Method = http.MethodGet - } else { + case MethodHead0RTT: + // don't modify the original request + reqCopy := *req + req = &reqCopy + req.Method = http.MethodHead + default: // wait for the handshake to complete - select { - case <-conn.HandshakeComplete(): - case <-req.Context().Done(): - return nil, req.Context().Err() + earlyConn, ok := c.Connection.(quic.EarlyConnection) + if ok { + select { + case <-earlyConn.HandshakeComplete(): + case <-req.Context().Done(): + return nil, req.Context().Err() + } } } - str, err := conn.OpenStreamSync(req.Context()) + // It is only possible to send an Extended CONNECT request once the SETTINGS were received. + // See section 3 of RFC 8441. + if isExtendedConnectRequest(req) { + connCtx := c.Connection.Context() + // wait for the server's SETTINGS frame to arrive + select { + case <-c.hconn.ReceivedSettings(): + case <-connCtx.Done(): + return nil, context.Cause(connCtx) + } + if !c.hconn.Settings().EnableExtendedConnect { + return nil, errors.New("http3: server didn't enable Extended CONNECT") + } + } + + reqDone := make(chan struct{}) + str, err := c.hconn.openRequestStream(req.Context(), c.requestWriter, reqDone, c.DisableCompression, c.maxHeaderBytes()) if err != nil { return nil, err } @@ -288,7 +211,6 @@ func (c *client) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Respon // Request Cancellation: // This go routine keeps running even after RoundTripOpt() returns. // It is shut down when the application is done processing the body. - reqDone := make(chan struct{}) done := make(chan struct{}) go func() { defer close(done) @@ -300,31 +222,19 @@ func (c *client) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Respon } }() - doneChan := reqDone - if opt.DontCloseRequestStream { - doneChan = nil - } - rsp, rerr := c.doRequest(req, conn, str, opt, doneChan) - if rerr.err != nil { // if any error occurred + rsp, err := c.doRequest(req, str) + if err != nil { // if any error occurred close(reqDone) <-done - if rerr.streamErr != 0 { // if it was a stream error - str.CancelWrite(quic.StreamErrorCode(rerr.streamErr)) - } - if rerr.connErr != 0 { // if it was a connection error - var reason string - if rerr.err != nil { - reason = rerr.err.Error() - } - conn.CloseWithError(quic.ApplicationErrorCode(rerr.connErr), reason) - } - return nil, maybeReplaceError(rerr.err) + return nil, maybeReplaceError(err) } - if opt.DontCloseRequestStream { - close(reqDone) - <-done - } - return rsp, maybeReplaceError(rerr.err) + return rsp, maybeReplaceError(err) +} + +func (c *SingleDestinationRoundTripper) OpenRequestStream(ctx context.Context) (RequestStream, error) { + c.initOnce.Do(func() { c.init() }) + + return c.hconn.openRequestStream(ctx, c.requestWriter, nil, c.DisableCompression, c.maxHeaderBytes()) } // cancelingReader reads from the io.Reader. @@ -342,7 +252,7 @@ func (r *cancelingReader) Read(b []byte) (int, error) { return n, err } -func (c *client) sendRequestBody(str Stream, body io.ReadCloser, contentLength int64) error { +func (c *SingleDestinationRoundTripper) sendRequestBody(str Stream, body io.ReadCloser, contentLength int64) error { defer body.Close() buf := make([]byte, bodyCopyBufferSize) sr := &cancelingReader{str: str, r: body} @@ -366,21 +276,13 @@ func (c *client) sendRequestBody(str Stream, body io.ReadCloser, contentLength i return err } -func (c *client) doRequest(req *http.Request, conn quic.EarlyConnection, str quic.Stream, opt RoundTripOpt, reqDone chan<- struct{}) (*http.Response, requestError) { - var requestGzip bool - if !c.opts.DisableCompression && req.Method != "HEAD" && req.Header.Get("Accept-Encoding") == "" && req.Header.Get("Range") == "" { - requestGzip = true +func (c *SingleDestinationRoundTripper) doRequest(req *http.Request, str *requestStream) (*http.Response, error) { + if err := str.SendRequestHeader(req); err != nil { + return nil, err } - if err := c.requestWriter.WriteRequestHeader(str, req, requestGzip); err != nil { - return nil, newStreamError(ErrCodeInternalError, err) - } - - if req.Body == nil && !opt.DontCloseRequestStream { + if req.Body == nil { str.Close() - } - - hstr := newStream(str, func() { conn.CloseWithError(quic.ApplicationErrorCode(ErrCodeFrameUnexpected), "") }) - if req.Body != nil { + } else { // send the request body asynchronously go func() { contentLength := int64(-1) @@ -389,89 +291,47 @@ func (c *client) doRequest(req *http.Request, conn quic.EarlyConnection, str qui if req.ContentLength > 0 { contentLength = req.ContentLength } - if err := c.sendRequestBody(hstr, req.Body, contentLength); err != nil { - c.logger.Errorf("Error writing request: %s", err) - } - if !opt.DontCloseRequestStream { - hstr.Close() + if err := c.sendRequestBody(str, req.Body, contentLength); err != nil { + if c.Logger != nil { + c.Logger.Debug("error writing request", "error", err) + } } + str.Close() }() } - frame, err := parseNextFrame(str, nil) - if err != nil { - return nil, newStreamError(ErrCodeFrameError, err) - } - hf, ok := frame.(*headersFrame) - if !ok { - return nil, newConnError(ErrCodeFrameUnexpected, errors.New("expected first frame to be a HEADERS frame")) - } - if hf.Length > c.maxHeaderBytes() { - return nil, newStreamError(ErrCodeFrameError, fmt.Errorf("HEADERS frame too large: %d bytes (max: %d)", hf.Length, c.maxHeaderBytes())) - } - headerBlock := make([]byte, hf.Length) - if _, err := io.ReadFull(str, headerBlock); err != nil { - return nil, newStreamError(ErrCodeRequestIncomplete, err) - } - hfs, err := c.decoder.DecodeFull(headerBlock) - if err != nil { - // TODO: use the right error code - return nil, newConnError(ErrCodeGeneralProtocolError, err) - } + // copy from net/http: support 1xx responses + trace := httptrace.ContextClientTrace(req.Context()) + num1xx := 0 // number of informational 1xx headers received + const max1xxResponses = 5 // arbitrary bound on number of informational responses - res, err := responseFromHeaders(hfs) - if err != nil { - return nil, newStreamError(ErrCodeMessageError, err) + var res *http.Response + for { + var err error + res, err = str.ReadResponse() + if err != nil { + return nil, err + } + resCode := res.StatusCode + is1xx := 100 <= resCode && resCode <= 199 + // treat 101 as a terminal status, see https://github.com/golang/go/issues/26161 + is1xxNonTerminal := is1xx && resCode != http.StatusSwitchingProtocols + if is1xxNonTerminal { + num1xx++ + if num1xx > max1xxResponses { + return nil, errors.New("http: too many 1xx informational responses") + } + if trace != nil && trace.Got1xxResponse != nil { + if err := trace.Got1xxResponse(resCode, textproto.MIMEHeader(res.Header)); err != nil { + return nil, err + } + } + continue + } + break } - connState := conn.ConnectionState().TLS + connState := c.hconn.ConnectionState().TLS res.TLS = &connState res.Request = req - // Check that the server doesn't send more data in DATA frames than indicated by the Content-Length header (if set). - // See section 4.1.2 of RFC 9114. - var httpStr Stream - if _, ok := res.Header["Content-Length"]; ok && res.ContentLength >= 0 { - httpStr = newLengthLimitedStream(hstr, res.ContentLength) - } else { - httpStr = hstr - } - respBody := newResponseBody(httpStr, conn, reqDone) - - // Rules for when to set Content-Length are defined in https://tools.ietf.org/html/rfc7230#section-3.3.2. - _, hasTransferEncoding := res.Header["Transfer-Encoding"] - isInformational := res.StatusCode >= 100 && res.StatusCode < 200 - isNoContent := res.StatusCode == http.StatusNoContent - isSuccessfulConnect := req.Method == http.MethodConnect && res.StatusCode >= 200 && res.StatusCode < 300 - if !hasTransferEncoding && !isInformational && !isNoContent && !isSuccessfulConnect { - res.ContentLength = -1 - if clens, ok := res.Header["Content-Length"]; ok && len(clens) == 1 { - if clen64, err := strconv.ParseInt(clens[0], 10, 64); err == nil { - res.ContentLength = clen64 - } - } - } - - if requestGzip && res.Header.Get("Content-Encoding") == "gzip" { - res.Header.Del("Content-Encoding") - res.Header.Del("Content-Length") - res.ContentLength = -1 - res.Body = newGzipReader(respBody) - res.Uncompressed = true - } else { - res.Body = respBody - } - - return res, requestError{} -} - -func (c *client) HandshakeComplete() bool { - conn := c.conn.Load() - if conn == nil { - return false - } - select { - case <-(*conn).HandshakeComplete(): - return true - default: - return false - } + return res, nil } diff --git a/vendor/github.com/quic-go/quic-go/http3/conn.go b/vendor/github.com/quic-go/quic-go/http3/conn.go new file mode 100644 index 000000000..7ea4b2929 --- /dev/null +++ b/vendor/github.com/quic-go/quic-go/http3/conn.go @@ -0,0 +1,266 @@ +package http3 + +import ( + "context" + "fmt" + "log/slog" + "net" + "sync" + "sync/atomic" + + "github.com/quic-go/quic-go" + "github.com/quic-go/quic-go/internal/protocol" + "github.com/quic-go/quic-go/quicvarint" + + "github.com/quic-go/qpack" +) + +// Connection is an HTTP/3 connection. +// It has all methods from the quic.Connection expect for AcceptStream, AcceptUniStream, +// SendDatagram and ReceiveDatagram. +type Connection interface { + OpenStream() (quic.Stream, error) + OpenStreamSync(context.Context) (quic.Stream, error) + OpenUniStream() (quic.SendStream, error) + OpenUniStreamSync(context.Context) (quic.SendStream, error) + LocalAddr() net.Addr + RemoteAddr() net.Addr + CloseWithError(quic.ApplicationErrorCode, string) error + Context() context.Context + ConnectionState() quic.ConnectionState + + // ReceivedSettings returns a channel that is closed once the client's SETTINGS frame was received. + ReceivedSettings() <-chan struct{} + // Settings returns the settings received on this connection. + Settings() *Settings +} + +type connection struct { + quic.Connection + + perspective protocol.Perspective + logger *slog.Logger + + enableDatagrams bool + + decoder *qpack.Decoder + + streamMx sync.Mutex + streams map[protocol.StreamID]*datagrammer + + settings *Settings + receivedSettings chan struct{} +} + +func newConnection( + quicConn quic.Connection, + enableDatagrams bool, + perspective protocol.Perspective, + logger *slog.Logger, +) *connection { + c := &connection{ + Connection: quicConn, + perspective: perspective, + logger: logger, + enableDatagrams: enableDatagrams, + decoder: qpack.NewDecoder(func(hf qpack.HeaderField) {}), + receivedSettings: make(chan struct{}), + streams: make(map[protocol.StreamID]*datagrammer), + } + return c +} + +func (c *connection) clearStream(id quic.StreamID) { + c.streamMx.Lock() + defer c.streamMx.Unlock() + + delete(c.streams, id) +} + +func (c *connection) openRequestStream( + ctx context.Context, + requestWriter *requestWriter, + reqDone chan<- struct{}, + disableCompression bool, + maxHeaderBytes uint64, +) (*requestStream, error) { + str, err := c.Connection.OpenStreamSync(ctx) + if err != nil { + return nil, err + } + datagrams := newDatagrammer(func(b []byte) error { return c.sendDatagram(str.StreamID(), b) }) + c.streamMx.Lock() + c.streams[str.StreamID()] = datagrams + c.streamMx.Unlock() + qstr := newStateTrackingStream(str, c, datagrams) + hstr := newStream(qstr, c, datagrams) + return newRequestStream(hstr, requestWriter, reqDone, c.decoder, disableCompression, maxHeaderBytes), nil +} + +func (c *connection) acceptStream(ctx context.Context) (quic.Stream, *datagrammer, error) { + str, err := c.AcceptStream(ctx) + if err != nil { + return nil, nil, err + } + datagrams := newDatagrammer(func(b []byte) error { return c.sendDatagram(str.StreamID(), b) }) + if c.perspective == protocol.PerspectiveServer { + strID := str.StreamID() + c.streamMx.Lock() + c.streams[strID] = datagrams + c.streamMx.Unlock() + str = newStateTrackingStream(str, c, datagrams) + } + return str, datagrams, nil +} + +func (c *connection) HandleUnidirectionalStreams(hijack func(StreamType, quic.ConnectionTracingID, quic.ReceiveStream, error) (hijacked bool)) { + var ( + rcvdControlStr atomic.Bool + rcvdQPACKEncoderStr atomic.Bool + rcvdQPACKDecoderStr atomic.Bool + ) + + for { + str, err := c.Connection.AcceptUniStream(context.Background()) + if err != nil { + if c.logger != nil { + c.logger.Debug("accepting unidirectional stream failed", "error", err) + } + return + } + + go func(str quic.ReceiveStream) { + streamType, err := quicvarint.Read(quicvarint.NewReader(str)) + if err != nil { + id := c.Connection.Context().Value(quic.ConnectionTracingKey).(quic.ConnectionTracingID) + if hijack != nil && hijack(StreamType(streamType), id, str, err) { + return + } + if c.logger != nil { + c.logger.Debug("reading stream type on stream failed", "stream ID", str.StreamID(), "error", err) + } + return + } + // We're only interested in the control stream here. + switch streamType { + case streamTypeControlStream: + case streamTypeQPACKEncoderStream: + if isFirst := rcvdQPACKEncoderStr.CompareAndSwap(false, true); !isFirst { + c.Connection.CloseWithError(quic.ApplicationErrorCode(ErrCodeStreamCreationError), "duplicate QPACK encoder stream") + } + // Our QPACK implementation doesn't use the dynamic table yet. + return + case streamTypeQPACKDecoderStream: + if isFirst := rcvdQPACKDecoderStr.CompareAndSwap(false, true); !isFirst { + c.Connection.CloseWithError(quic.ApplicationErrorCode(ErrCodeStreamCreationError), "duplicate QPACK decoder stream") + } + // Our QPACK implementation doesn't use the dynamic table yet. + return + case streamTypePushStream: + switch c.perspective { + case protocol.PerspectiveClient: + // we never increased the Push ID, so we don't expect any push streams + c.Connection.CloseWithError(quic.ApplicationErrorCode(ErrCodeIDError), "") + case protocol.PerspectiveServer: + // only the server can push + c.Connection.CloseWithError(quic.ApplicationErrorCode(ErrCodeStreamCreationError), "") + } + return + default: + if hijack != nil { + if hijack( + StreamType(streamType), + c.Connection.Context().Value(quic.ConnectionTracingKey).(quic.ConnectionTracingID), + str, + nil, + ) { + return + } + } + str.CancelRead(quic.StreamErrorCode(ErrCodeStreamCreationError)) + return + } + // Only a single control stream is allowed. + if isFirstControlStr := rcvdControlStr.CompareAndSwap(false, true); !isFirstControlStr { + c.Connection.CloseWithError(quic.ApplicationErrorCode(ErrCodeStreamCreationError), "duplicate control stream") + return + } + fp := &frameParser{conn: c.Connection, r: str} + f, err := fp.ParseNext() + if err != nil { + c.Connection.CloseWithError(quic.ApplicationErrorCode(ErrCodeFrameError), "") + return + } + sf, ok := f.(*settingsFrame) + if !ok { + c.Connection.CloseWithError(quic.ApplicationErrorCode(ErrCodeMissingSettings), "") + return + } + c.settings = &Settings{ + EnableDatagrams: sf.Datagram, + EnableExtendedConnect: sf.ExtendedConnect, + Other: sf.Other, + } + close(c.receivedSettings) + if !sf.Datagram { + return + } + // If datagram support was enabled on our side as well as on the server side, + // we can expect it to have been negotiated both on the transport and on the HTTP/3 layer. + // Note: ConnectionState() will block until the handshake is complete (relevant when using 0-RTT). + if c.enableDatagrams && !c.Connection.ConnectionState().SupportsDatagrams { + c.Connection.CloseWithError(quic.ApplicationErrorCode(ErrCodeSettingsError), "missing QUIC Datagram support") + return + } + go func() { + if err := c.receiveDatagrams(); err != nil { + if c.logger != nil { + c.logger.Debug("receiving datagrams failed", "error", err) + } + } + }() + }(str) + } +} + +func (c *connection) sendDatagram(streamID protocol.StreamID, b []byte) error { + // TODO: this creates a lot of garbage and an additional copy + data := make([]byte, 0, len(b)+8) + data = quicvarint.Append(data, uint64(streamID/4)) + data = append(data, b...) + return c.Connection.SendDatagram(data) +} + +func (c *connection) receiveDatagrams() error { + for { + b, err := c.Connection.ReceiveDatagram(context.Background()) + if err != nil { + return err + } + quarterStreamID, n, err := quicvarint.Parse(b) + if err != nil { + c.Connection.CloseWithError(quic.ApplicationErrorCode(ErrCodeDatagramError), "") + return fmt.Errorf("could not read quarter stream id: %w", err) + } + if quarterStreamID > maxQuarterStreamID { + c.Connection.CloseWithError(quic.ApplicationErrorCode(ErrCodeDatagramError), "") + return fmt.Errorf("invalid quarter stream id: %w", err) + } + streamID := protocol.StreamID(4 * quarterStreamID) + c.streamMx.Lock() + dg, ok := c.streams[streamID] + if !ok { + c.streamMx.Unlock() + return nil + } + c.streamMx.Unlock() + dg.enqueue(b[n:]) + } +} + +// ReceivedSettings returns a channel that is closed once the peer's SETTINGS frame was received. +func (c *connection) ReceivedSettings() <-chan struct{} { return c.receivedSettings } + +// Settings returns the settings received on this connection. +// It is only valid to call this function after the channel returned by ReceivedSettings was closed. +func (c *connection) Settings() *Settings { return c.settings } diff --git a/vendor/github.com/quic-go/quic-go/http3/datagram.go b/vendor/github.com/quic-go/quic-go/http3/datagram.go new file mode 100644 index 000000000..6d570e6b0 --- /dev/null +++ b/vendor/github.com/quic-go/quic-go/http3/datagram.go @@ -0,0 +1,98 @@ +package http3 + +import ( + "context" + "sync" +) + +const maxQuarterStreamID = 1<<60 - 1 + +const streamDatagramQueueLen = 32 + +type datagrammer struct { + sendDatagram func([]byte) error + + hasData chan struct{} + queue [][]byte // TODO: use a ring buffer + + mx sync.Mutex + sendErr error + receiveErr error +} + +func newDatagrammer(sendDatagram func([]byte) error) *datagrammer { + return &datagrammer{ + sendDatagram: sendDatagram, + hasData: make(chan struct{}, 1), + } +} + +func (d *datagrammer) SetReceiveError(err error) { + d.mx.Lock() + defer d.mx.Unlock() + + d.receiveErr = err + d.signalHasData() +} + +func (d *datagrammer) SetSendError(err error) { + d.mx.Lock() + defer d.mx.Unlock() + + d.sendErr = err +} + +func (d *datagrammer) Send(b []byte) error { + d.mx.Lock() + sendErr := d.sendErr + d.mx.Unlock() + if sendErr != nil { + return sendErr + } + + return d.sendDatagram(b) +} + +func (d *datagrammer) signalHasData() { + select { + case d.hasData <- struct{}{}: + default: + } +} + +func (d *datagrammer) enqueue(data []byte) { + d.mx.Lock() + defer d.mx.Unlock() + + if d.receiveErr != nil { + return + } + if len(d.queue) >= streamDatagramQueueLen { + return + } + d.queue = append(d.queue, data) + d.signalHasData() +} + +func (d *datagrammer) Receive(ctx context.Context) ([]byte, error) { +start: + d.mx.Lock() + if len(d.queue) >= 1 { + data := d.queue[0] + d.queue = d.queue[1:] + d.mx.Unlock() + return data, nil + } + if receiveErr := d.receiveErr; receiveErr != nil { + d.mx.Unlock() + return nil, receiveErr + } + d.mx.Unlock() + + select { + case <-ctx.Done(): + return nil, context.Cause(ctx) + case <-d.hasData: + } + goto start +} diff --git a/vendor/github.com/quic-go/quic-go/http3/frames.go b/vendor/github.com/quic-go/quic-go/http3/frames.go index 454e5f945..66cba68ca 100644 --- a/vendor/github.com/quic-go/quic-go/http3/frames.go +++ b/vendor/github.com/quic-go/quic-go/http3/frames.go @@ -6,7 +6,7 @@ import ( "fmt" "io" - "github.com/quic-go/quic-go/internal/protocol" + "github.com/quic-go/quic-go" "github.com/quic-go/quic-go/quicvarint" ) @@ -19,13 +19,19 @@ type frame interface{} var errHijacked = errors.New("hijacked") -func parseNextFrame(r io.Reader, unknownFrameHandler unknownFrameHandlerFunc) (frame, error) { - qr := quicvarint.NewReader(r) +type frameParser struct { + r io.Reader + conn quic.Connection + unknownFrameHandler unknownFrameHandlerFunc +} + +func (p *frameParser) ParseNext() (frame, error) { + qr := quicvarint.NewReader(p.r) for { t, err := quicvarint.Read(qr) if err != nil { - if unknownFrameHandler != nil { - hijacked, err := unknownFrameHandler(0, err) + if p.unknownFrameHandler != nil { + hijacked, err := p.unknownFrameHandler(0, err) if err != nil { return nil, err } @@ -36,8 +42,8 @@ func parseNextFrame(r io.Reader, unknownFrameHandler unknownFrameHandlerFunc) (f return nil, err } // Call the unknownFrameHandler for frames not defined in the HTTP/3 spec - if t > 0xd && unknownFrameHandler != nil { - hijacked, err := unknownFrameHandler(FrameType(t), nil) + if t > 0xd && p.unknownFrameHandler != nil { + hijacked, err := p.unknownFrameHandler(FrameType(t), nil) if err != nil { return nil, err } @@ -57,11 +63,14 @@ func parseNextFrame(r io.Reader, unknownFrameHandler unknownFrameHandlerFunc) (f case 0x1: return &headersFrame{Length: l}, nil case 0x4: - return parseSettingsFrame(r, l) + return parseSettingsFrame(p.r, l) case 0x3: // CANCEL_PUSH case 0x5: // PUSH_PROMISE case 0x7: // GOAWAY case 0xd: // MAX_PUSH_ID + case 0x2, 0x6, 0x8, 0x9: + p.conn.CloseWithError(quic.ApplicationErrorCode(ErrCodeFrameUnexpected), "") + return nil, fmt.Errorf("http3: reserved frame type: %d", t) } // skip over unknown frames if _, err := io.CopyN(io.Discard, qr, int64(l)); err != nil { @@ -88,11 +97,18 @@ func (f *headersFrame) Append(b []byte) []byte { return quicvarint.Append(b, f.Length) } -const settingDatagram = 0x33 +const ( + // Extended CONNECT, RFC 9220 + settingExtendedConnect = 0x8 + // HTTP Datagrams, RFC 9297 + settingDatagram = 0x33 +) type settingsFrame struct { - Datagram bool - Other map[uint64]uint64 // all settings that we don't explicitly recognize + Datagram bool // HTTP Datagrams, RFC 9297 + ExtendedConnect bool // Extended CONNECT, RFC 9220 + + Other map[uint64]uint64 // all settings that we don't explicitly recognize } func parseSettingsFrame(r io.Reader, l uint64) (*settingsFrame, error) { @@ -108,7 +124,7 @@ func parseSettingsFrame(r io.Reader, l uint64) (*settingsFrame, error) { } frame := &settingsFrame{} b := bytes.NewReader(buf) - var readDatagram bool + var readDatagram, readExtendedConnect bool for b.Len() > 0 { id, err := quicvarint.Read(b) if err != nil { // should not happen. We allocated the whole frame already. @@ -120,13 +136,22 @@ func parseSettingsFrame(r io.Reader, l uint64) (*settingsFrame, error) { } switch id { + case settingExtendedConnect: + if readExtendedConnect { + return nil, fmt.Errorf("duplicate setting: %d", id) + } + readExtendedConnect = true + if val != 0 && val != 1 { + return nil, fmt.Errorf("invalid value for SETTINGS_ENABLE_CONNECT_PROTOCOL: %d", val) + } + frame.ExtendedConnect = val == 1 case settingDatagram: if readDatagram { return nil, fmt.Errorf("duplicate setting: %d", id) } readDatagram = true if val != 0 && val != 1 { - return nil, fmt.Errorf("invalid value for H3_DATAGRAM: %d", val) + return nil, fmt.Errorf("invalid value for SETTINGS_H3_DATAGRAM: %d", val) } frame.Datagram = val == 1 default: @@ -144,18 +169,25 @@ func parseSettingsFrame(r io.Reader, l uint64) (*settingsFrame, error) { func (f *settingsFrame) Append(b []byte) []byte { b = quicvarint.Append(b, 0x4) - var l protocol.ByteCount + var l int for id, val := range f.Other { l += quicvarint.Len(id) + quicvarint.Len(val) } if f.Datagram { l += quicvarint.Len(settingDatagram) + quicvarint.Len(1) } + if f.ExtendedConnect { + l += quicvarint.Len(settingExtendedConnect) + quicvarint.Len(1) + } b = quicvarint.Append(b, uint64(l)) if f.Datagram { b = quicvarint.Append(b, settingDatagram) b = quicvarint.Append(b, 1) } + if f.ExtendedConnect { + b = quicvarint.Append(b, settingExtendedConnect) + b = quicvarint.Append(b, 1) + } for id, val := range f.Other { b = quicvarint.Append(b, id) b = quicvarint.Append(b, val) diff --git a/vendor/github.com/quic-go/quic-go/http3/headers.go b/vendor/github.com/quic-go/quic-go/http3/headers.go index 79c070b55..d587efd44 100644 --- a/vendor/github.com/quic-go/quic-go/http3/headers.go +++ b/vendor/github.com/quic-go/quic-go/http3/headers.go @@ -126,9 +126,14 @@ func requestFromHeaders(headerFields []qpack.HeaderField) (*http.Request, error) return nil, errors.New(":path, :authority and :method must not be empty") } + if !isExtendedConnected && len(hdr.Protocol) > 0 { + return nil, errors.New(":protocol must be empty") + } + var u *url.URL var requestURI string - var protocol string + + protocol := "HTTP/3.0" if isConnect { u = &url.URL{} @@ -137,15 +142,14 @@ func requestFromHeaders(headerFields []qpack.HeaderField) (*http.Request, error) if err != nil { return nil, err } + protocol = hdr.Protocol } else { u.Path = hdr.Path } u.Scheme = hdr.Scheme u.Host = hdr.Authority requestURI = hdr.Authority - protocol = hdr.Protocol } else { - protocol = "HTTP/3.0" u, err = url.ParseRequestURI(hdr.Path) if err != nil { return nil, fmt.Errorf("invalid content length: %w", err) @@ -167,9 +171,9 @@ func requestFromHeaders(headerFields []qpack.HeaderField) (*http.Request, error) }, nil } -func hostnameFromRequest(req *http.Request) string { - if req.URL != nil { - return req.URL.Host +func hostnameFromURL(url *url.URL) string { + if url != nil { + return url.Host } return "" } diff --git a/vendor/github.com/quic-go/quic-go/http3/http_stream.go b/vendor/github.com/quic-go/quic-go/http3/http_stream.go index 1c0ec4f18..63bea0e18 100644 --- a/vendor/github.com/quic-go/quic-go/http3/http_stream.go +++ b/vendor/github.com/quic-go/quic-go/http3/http_stream.go @@ -1,43 +1,76 @@ package http3 import ( + "context" "errors" "fmt" + "io" + "net/http" + "strconv" "github.com/quic-go/quic-go" - "github.com/quic-go/quic-go/internal/utils" + "github.com/quic-go/quic-go/internal/protocol" + + "github.com/quic-go/qpack" ) -// A Stream is a HTTP/3 stream. +// A Stream is an HTTP/3 request stream. // When writing to and reading from the stream, data is framed in HTTP/3 DATA frames. -type Stream quic.Stream - -// The stream conforms to the quic.Stream interface, but instead of writing to and reading directly -// from the QUIC stream, it writes to and reads from the HTTP stream. -type stream struct { +type Stream interface { quic.Stream - buf []byte + SendDatagram([]byte) error + ReceiveDatagram(context.Context) ([]byte, error) +} + +// A RequestStream is an HTTP/3 request stream. +// When writing to and reading from the stream, data is framed in HTTP/3 DATA frames. +type RequestStream interface { + Stream + + // SendRequestHeader sends the HTTP request. + // It is invalid to call it more than once. + // It is invalid to call it after Write has been called. + SendRequestHeader(req *http.Request) error + + // ReadResponse reads the HTTP response from the stream. + // It is invalid to call it more than once. + // It doesn't set Response.Request and Response.TLS. + // It is invalid to call it after Read has been called. + ReadResponse() (*http.Response, error) +} + +type stream struct { + quic.Stream + conn *connection + + buf []byte // used as a temporary buffer when writing the HTTP/3 frame headers - onFrameError func() bytesRemainingInFrame uint64 + + datagrams *datagrammer } var _ Stream = &stream{} -func newStream(str quic.Stream, onFrameError func()) *stream { +func newStream(str quic.Stream, conn *connection, datagrams *datagrammer) *stream { return &stream{ - Stream: str, - onFrameError: onFrameError, - buf: make([]byte, 0, 16), + Stream: str, + conn: conn, + buf: make([]byte, 16), + datagrams: datagrams, } } func (s *stream) Read(b []byte) (int, error) { + fp := &frameParser{ + r: s.Stream, + conn: s.conn, + } if s.bytesRemainingInFrame == 0 { parseLoop: for { - frame, err := parseNextFrame(s.Stream, nil) + frame, err := fp.ParseNext() if err != nil { return 0, err } @@ -49,7 +82,7 @@ func (s *stream) Read(b []byte) (int, error) { s.bytesRemainingInFrame = f.Length break parseLoop default: - s.onFrameError() + s.conn.CloseWithError(quic.ApplicationErrorCode(ErrCodeFrameUnexpected), "") // parseNextFrame skips over unknown frame types // Therefore, this condition is only entered when we parsed another known frame type. return 0, fmt.Errorf("peer sent an unexpected frame: %T", f) @@ -81,44 +114,154 @@ func (s *stream) Write(b []byte) (int, error) { return s.Stream.Write(b) } -var errTooMuchData = errors.New("peer sent too much data") +func (s *stream) writeUnframed(b []byte) (int, error) { + return s.Stream.Write(b) +} -type lengthLimitedStream struct { +func (s *stream) StreamID() protocol.StreamID { + return s.Stream.StreamID() +} + +// The stream conforms to the quic.Stream interface, but instead of writing to and reading directly +// from the QUIC stream, it writes to and reads from the HTTP stream. +type requestStream struct { *stream - contentLength int64 - read int64 - resetStream bool + + responseBody io.ReadCloser // set by ReadResponse + + decoder *qpack.Decoder + requestWriter *requestWriter + maxHeaderBytes uint64 + reqDone chan<- struct{} + disableCompression bool + + sentRequest bool + requestedGzip bool + isConnect bool } -var _ Stream = &lengthLimitedStream{} +var _ RequestStream = &requestStream{} -func newLengthLimitedStream(str *stream, contentLength int64) *lengthLimitedStream { - return &lengthLimitedStream{ - stream: str, - contentLength: contentLength, +func newRequestStream( + str *stream, + requestWriter *requestWriter, + reqDone chan<- struct{}, + decoder *qpack.Decoder, + disableCompression bool, + maxHeaderBytes uint64, +) *requestStream { + return &requestStream{ + stream: str, + requestWriter: requestWriter, + reqDone: reqDone, + decoder: decoder, + disableCompression: disableCompression, + maxHeaderBytes: maxHeaderBytes, } } -func (s *lengthLimitedStream) checkContentLengthViolation() error { - if s.read > s.contentLength || s.read == s.contentLength && s.hasMoreData() { - if !s.resetStream { - s.CancelRead(quic.StreamErrorCode(ErrCodeMessageError)) - s.CancelWrite(quic.StreamErrorCode(ErrCodeMessageError)) - s.resetStream = true +func (s *requestStream) Read(b []byte) (int, error) { + if s.responseBody == nil { + return 0, errors.New("http3: invalid use of RequestStream.Read: need to call ReadResponse first") + } + return s.responseBody.Read(b) +} + +func (s *requestStream) SendRequestHeader(req *http.Request) error { + if s.sentRequest { + return errors.New("http3: invalid duplicate use of SendRequestHeader") + } + if !s.disableCompression && req.Method != http.MethodHead && + req.Header.Get("Accept-Encoding") == "" && req.Header.Get("Range") == "" { + s.requestedGzip = true + } + s.isConnect = req.Method == http.MethodConnect + s.sentRequest = true + return s.requestWriter.WriteRequestHeader(s.Stream, req, s.requestedGzip) +} + +func (s *requestStream) ReadResponse() (*http.Response, error) { + fp := &frameParser{ + r: s.Stream, + conn: s.conn, + } + frame, err := fp.ParseNext() + if err != nil { + s.Stream.CancelRead(quic.StreamErrorCode(ErrCodeFrameError)) + s.Stream.CancelWrite(quic.StreamErrorCode(ErrCodeFrameError)) + return nil, fmt.Errorf("http3: parsing frame failed: %w", err) + } + hf, ok := frame.(*headersFrame) + if !ok { + s.conn.CloseWithError(quic.ApplicationErrorCode(ErrCodeFrameUnexpected), "expected first frame to be a HEADERS frame") + return nil, errors.New("http3: expected first frame to be a HEADERS frame") + } + if hf.Length > s.maxHeaderBytes { + s.Stream.CancelRead(quic.StreamErrorCode(ErrCodeFrameError)) + s.Stream.CancelWrite(quic.StreamErrorCode(ErrCodeFrameError)) + return nil, fmt.Errorf("http3: HEADERS frame too large: %d bytes (max: %d)", hf.Length, s.maxHeaderBytes) + } + headerBlock := make([]byte, hf.Length) + if _, err := io.ReadFull(s.Stream, headerBlock); err != nil { + s.Stream.CancelRead(quic.StreamErrorCode(ErrCodeRequestIncomplete)) + s.Stream.CancelWrite(quic.StreamErrorCode(ErrCodeRequestIncomplete)) + return nil, fmt.Errorf("http3: failed to read response headers: %w", err) + } + hfs, err := s.decoder.DecodeFull(headerBlock) + if err != nil { + // TODO: use the right error code + s.conn.CloseWithError(quic.ApplicationErrorCode(ErrCodeGeneralProtocolError), "") + return nil, fmt.Errorf("http3: failed to decode response headers: %w", err) + } + + res, err := responseFromHeaders(hfs) + if err != nil { + s.Stream.CancelRead(quic.StreamErrorCode(ErrCodeMessageError)) + s.Stream.CancelWrite(quic.StreamErrorCode(ErrCodeMessageError)) + return nil, fmt.Errorf("http3: invalid response: %w", err) + } + + // Check that the server doesn't send more data in DATA frames than indicated by the Content-Length header (if set). + // See section 4.1.2 of RFC 9114. + contentLength := int64(-1) + if _, ok := res.Header["Content-Length"]; ok && res.ContentLength >= 0 { + contentLength = res.ContentLength + } + respBody := newResponseBody(s.stream, contentLength, s.reqDone) + + // Rules for when to set Content-Length are defined in https://tools.ietf.org/html/rfc7230#section-3.3.2. + _, hasTransferEncoding := res.Header["Transfer-Encoding"] + isInformational := res.StatusCode >= 100 && res.StatusCode < 200 + isNoContent := res.StatusCode == http.StatusNoContent + isSuccessfulConnect := s.isConnect && res.StatusCode >= 200 && res.StatusCode < 300 + if !hasTransferEncoding && !isInformational && !isNoContent && !isSuccessfulConnect { + res.ContentLength = -1 + if clens, ok := res.Header["Content-Length"]; ok && len(clens) == 1 { + if clen64, err := strconv.ParseInt(clens[0], 10, 64); err == nil { + res.ContentLength = clen64 + } } - return errTooMuchData } - return nil + + if s.requestedGzip && res.Header.Get("Content-Encoding") == "gzip" { + res.Header.Del("Content-Encoding") + res.Header.Del("Content-Length") + res.ContentLength = -1 + s.responseBody = newGzipReader(respBody) + res.Uncompressed = true + } else { + s.responseBody = respBody + } + res.Body = s.responseBody + return res, nil } -func (s *lengthLimitedStream) Read(b []byte) (int, error) { - if err := s.checkContentLengthViolation(); err != nil { - return 0, err - } - n, err := s.stream.Read(b[:utils.Min(int64(len(b)), s.contentLength-s.read)]) - s.read += int64(n) - if err := s.checkContentLengthViolation(); err != nil { - return n, err - } - return n, err +func (s *stream) SendDatagram(b []byte) error { + // TODO: reject if datagrams are not negotiated (yet) + return s.datagrams.Send(b) +} + +func (s *stream) ReceiveDatagram(ctx context.Context) ([]byte, error) { + // TODO: reject if datagrams are not negotiated (yet) + return s.datagrams.Receive(ctx) } diff --git a/vendor/github.com/quic-go/quic-go/http3/mockgen.go b/vendor/github.com/quic-go/quic-go/http3/mockgen.go index ad0a8a26e..83a3974f0 100644 --- a/vendor/github.com/quic-go/quic-go/http3/mockgen.go +++ b/vendor/github.com/quic-go/quic-go/http3/mockgen.go @@ -2,7 +2,7 @@ package http3 -//go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package http3 -destination mock_roundtripcloser_test.go github.com/quic-go/quic-go/http3 RoundTripCloser" -type RoundTripCloser = roundTripCloser +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package http3 -destination mock_singleroundtripper_test.go github.com/quic-go/quic-go/http3 SingleRoundTripper" +type SingleRoundTripper = singleRoundTripper -//go:generate sh -c "go run go.uber.org/mock/mockgen -package http3 -destination mock_quic_early_listener_test.go github.com/quic-go/quic-go/http3 QUICEarlyListener" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -package http3 -destination mock_quic_early_listener_test.go github.com/quic-go/quic-go/http3 QUICEarlyListener" diff --git a/vendor/github.com/quic-go/quic-go/http3/request_writer.go b/vendor/github.com/quic-go/quic-go/http3/request_writer.go index 875f4031a..e83e9cc81 100644 --- a/vendor/github.com/quic-go/quic-go/http3/request_writer.go +++ b/vendor/github.com/quic-go/quic-go/http3/request_writer.go @@ -17,7 +17,6 @@ import ( "github.com/quic-go/qpack" "github.com/quic-go/quic-go" - "github.com/quic-go/quic-go/internal/utils" ) const bodyCopyBufferSize = 8 * 1024 @@ -26,17 +25,14 @@ type requestWriter struct { mutex sync.Mutex encoder *qpack.Encoder headerBuf *bytes.Buffer - - logger utils.Logger } -func newRequestWriter(logger utils.Logger) *requestWriter { +func newRequestWriter() *requestWriter { headerBuf := &bytes.Buffer{} encoder := qpack.NewEncoder(headerBuf) return &requestWriter{ encoder: encoder, headerBuf: headerBuf, - logger: logger, } } @@ -69,6 +65,10 @@ func (w *requestWriter) writeHeaders(wr io.Writer, req *http.Request, gzip bool) return err } +func isExtendedConnectRequest(req *http.Request) bool { + return req.Method == http.MethodConnect && req.Proto != "" && req.Proto != "HTTP/1.1" +} + // copied from net/transport.go // Modified to support Extended CONNECT: // Contrary to what the godoc for the http.Request says, @@ -87,7 +87,7 @@ func (w *requestWriter) encodeHeaders(req *http.Request, addGzipHeader bool, tra } // http.NewRequest sets this field to HTTP/1.1 - isExtendedConnect := req.Method == http.MethodConnect && req.Proto != "" && req.Proto != "HTTP/1.1" + isExtendedConnect := isExtendedConnectRequest(req) var path string if req.Method != http.MethodConnect || isExtendedConnect { @@ -215,13 +215,10 @@ func (w *requestWriter) encodeHeaders(req *http.Request, addGzipHeader bool, tra // authorityAddr returns a given authority (a host/IP, or host:port / ip:port) // and returns a host:port. The port 443 is added if needed. -func authorityAddr(scheme string, authority string) (addr string) { +func authorityAddr(authority string) (addr string) { host, port, err := net.SplitHostPort(authority) if err != nil { // authority didn't have a port port = "443" - if scheme == "http" { - port = "80" - } host = authority } if a, err := idna.ToASCII(host); err == nil { diff --git a/vendor/github.com/quic-go/quic-go/http3/response_writer.go b/vendor/github.com/quic-go/quic-go/http3/response_writer.go index 0d9314782..8638ec577 100644 --- a/vendor/github.com/quic-go/quic-go/http3/response_writer.go +++ b/vendor/github.com/quic-go/quic-go/http3/response_writer.go @@ -1,94 +1,68 @@ package http3 import ( - "bufio" "bytes" "fmt" + "log/slog" "net/http" "strconv" "strings" "time" - "github.com/quic-go/quic-go" - "github.com/quic-go/quic-go/internal/utils" - "github.com/quic-go/qpack" ) +// The HTTPStreamer allows taking over a HTTP/3 stream. The interface is implemented the http.Response.Body. +// On the client side, the stream will be closed for writing, unless the DontCloseRequestStream RoundTripOpt was set. +// When a stream is taken over, it's the caller's responsibility to close the stream. +type HTTPStreamer interface { + HTTPStream() Stream +} + // The maximum length of an encoded HTTP/3 frame header is 16: // The frame has a type and length field, both QUIC varints (maximum 8 bytes in length) const frameHeaderLen = 16 -// headerWriter wraps the stream, so that the first Write call flushes the header to the stream -type headerWriter struct { - str quic.Stream - header http.Header - status int // status code passed to WriteHeader - written bool - - logger utils.Logger -} - -// writeHeader encodes and flush header to the stream -func (hw *headerWriter) writeHeader() error { - var headers bytes.Buffer - enc := qpack.NewEncoder(&headers) - enc.WriteField(qpack.HeaderField{Name: ":status", Value: strconv.Itoa(hw.status)}) - - for k, v := range hw.header { - for index := range v { - enc.WriteField(qpack.HeaderField{Name: strings.ToLower(k), Value: v[index]}) - } - } - - buf := make([]byte, 0, frameHeaderLen+headers.Len()) - buf = (&headersFrame{Length: uint64(headers.Len())}).Append(buf) - hw.logger.Infof("Responding with %d", hw.status) - buf = append(buf, headers.Bytes()...) - - _, err := hw.str.Write(buf) - return err -} - -// first Write will trigger flushing header -func (hw *headerWriter) Write(p []byte) (int, error) { - if !hw.written { - if err := hw.writeHeader(); err != nil { - return 0, err - } - hw.written = true - } - return hw.str.Write(p) -} +const maxSmallResponseSize = 4096 type responseWriter struct { - *headerWriter - conn quic.Connection - bufferedStr *bufio.Writer - buf []byte + str *stream - headerWritten bool - contentLen int64 // if handler set valid Content-Length header - numWritten int64 // bytes written + conn Connection + header http.Header + buf []byte + status int // status code passed to WriteHeader + + // for responses smaller than maxSmallResponseSize, we buffer calls to Write, + // and automatically add the Content-Length header + smallResponseBuf []byte + + contentLen int64 // if handler set valid Content-Length header + numWritten int64 // bytes written + headerComplete bool // set once WriteHeader is called with a status code >= 200 + headerWritten bool // set once the response header has been serialized to the stream + isHead bool + + hijacked bool // set on HTTPStream is called + + logger *slog.Logger } var ( _ http.ResponseWriter = &responseWriter{} _ http.Flusher = &responseWriter{} _ Hijacker = &responseWriter{} + _ HTTPStreamer = &responseWriter{} ) -func newResponseWriter(str quic.Stream, conn quic.Connection, logger utils.Logger) *responseWriter { - hw := &headerWriter{ - str: str, - header: http.Header{}, - logger: logger, - } +func newResponseWriter(str *stream, conn Connection, isHead bool, logger *slog.Logger) *responseWriter { return &responseWriter{ - headerWriter: hw, - buf: make([]byte, frameHeaderLen), - conn: conn, - bufferedStr: bufio.NewWriter(hw), + str: str, + conn: conn, + header: http.Header{}, + buf: make([]byte, frameHeaderLen), + isHead: isHead, + logger: logger, } } @@ -97,7 +71,7 @@ func (w *responseWriter) Header() http.Header { } func (w *responseWriter) WriteHeader(status int) { - if w.headerWritten { + if w.headerComplete { return } @@ -105,51 +79,57 @@ func (w *responseWriter) WriteHeader(status int) { if status < 100 || status > 999 { panic(fmt.Sprintf("invalid WriteHeader code %v", status)) } - - if status >= 200 { - w.headerWritten = true - // Add Date header. - // This is what the standard library does. - // Can be disabled by setting the Date header to nil. - if _, ok := w.header["Date"]; !ok { - w.header.Set("Date", time.Now().UTC().Format(http.TimeFormat)) - } - // Content-Length checking - // use ParseUint instead of ParseInt, as negative values are invalid - if clen := w.header.Get("Content-Length"); clen != "" { - if cl, err := strconv.ParseUint(clen, 10, 63); err == nil { - w.contentLen = int64(cl) - } else { - // emit a warning for malformed Content-Length and remove it - w.logger.Errorf("Malformed Content-Length %s", clen) - w.header.Del("Content-Length") - } - } - } w.status = status - if !w.headerWritten { - w.writeHeader() + // immediately write 1xx headers + if status < 200 { + w.writeHeader(status) + return + } + + // We're done with headers once we write a status >= 200. + w.headerComplete = true + // Add Date header. + // This is what the standard library does. + // Can be disabled by setting the Date header to nil. + if _, ok := w.header["Date"]; !ok { + w.header.Set("Date", time.Now().UTC().Format(http.TimeFormat)) + } + // Content-Length checking + // use ParseUint instead of ParseInt, as negative values are invalid + if clen := w.header.Get("Content-Length"); clen != "" { + if cl, err := strconv.ParseUint(clen, 10, 63); err == nil { + w.contentLen = int64(cl) + } else { + // emit a warning for malformed Content-Length and remove it + logger := w.logger + if logger == nil { + logger = slog.Default() + } + logger.Error("Malformed Content-Length", "value", clen) + w.header.Del("Content-Length") + } + } +} + +func (w *responseWriter) sniffContentType(p []byte) { + // If no content type, apply sniffing algorithm to body. + // We can't use `w.header.Get` here since if the Content-Type was set to nil, we shouldn't do sniffing. + _, haveType := w.header["Content-Type"] + + // If the Transfer-Encoding or Content-Encoding was set and is non-blank, + // we shouldn't sniff the body. + hasTE := w.header.Get("Transfer-Encoding") != "" + hasCE := w.header.Get("Content-Encoding") != "" + if !hasCE && !haveType && !hasTE && len(p) > 0 { + w.header.Set("Content-Type", http.DetectContentType(p)) } } func (w *responseWriter) Write(p []byte) (int, error) { bodyAllowed := bodyAllowedForStatus(w.status) - if !w.headerWritten { - // If body is not allowed, we don't need to (and we can't) sniff the content type. - if bodyAllowed { - // If no content type, apply sniffing algorithm to body. - // We can't use `w.header.Get` here since if the Content-Type was set to nil, we shoundn't do sniffing. - _, haveType := w.header["Content-Type"] - - // If the Transfer-Encoding or Content-Encoding was set and is non-blank, - // we shouldn't sniff the body. - hasTE := w.header.Get("Transfer-Encoding") != "" - hasCE := w.header.Get("Content-Encoding") != "" - if !hasCE && !haveType && !hasTE && len(p) > 0 { - w.header.Set("Content-Type", http.DetectContentType(p)) - } - } + if !w.headerComplete { + w.sniffContentType(p) w.WriteHeader(http.StatusOK) bodyAllowed = true } @@ -162,36 +142,105 @@ func (w *responseWriter) Write(p []byte) (int, error) { return 0, http.ErrContentLength } - df := &dataFrame{Length: uint64(len(p))} + if w.isHead { + return len(p), nil + } + + if !w.headerWritten { + // Buffer small responses. + // This allows us to automatically set the Content-Length field. + if len(w.smallResponseBuf)+len(p) < maxSmallResponseSize { + w.smallResponseBuf = append(w.smallResponseBuf, p...) + return len(p), nil + } + } + return w.doWrite(p) +} + +func (w *responseWriter) doWrite(p []byte) (int, error) { + if !w.headerWritten { + w.sniffContentType(w.smallResponseBuf) + if err := w.writeHeader(w.status); err != nil { + return 0, maybeReplaceError(err) + } + w.headerWritten = true + } + + l := uint64(len(w.smallResponseBuf) + len(p)) + if l == 0 { + return 0, nil + } + df := &dataFrame{Length: l} w.buf = w.buf[:0] w.buf = df.Append(w.buf) - if _, err := w.bufferedStr.Write(w.buf); err != nil { + if _, err := w.str.writeUnframed(w.buf); err != nil { return 0, maybeReplaceError(err) } - n, err := w.bufferedStr.Write(p) - return n, maybeReplaceError(err) + if len(w.smallResponseBuf) > 0 { + if _, err := w.str.writeUnframed(w.smallResponseBuf); err != nil { + return 0, maybeReplaceError(err) + } + w.smallResponseBuf = nil + } + var n int + if len(p) > 0 { + var err error + n, err = w.str.writeUnframed(p) + if err != nil { + return n, maybeReplaceError(err) + } + } + return n, nil +} + +func (w *responseWriter) writeHeader(status int) error { + var headers bytes.Buffer + enc := qpack.NewEncoder(&headers) + if err := enc.WriteField(qpack.HeaderField{Name: ":status", Value: strconv.Itoa(status)}); err != nil { + return err + } + + for k, v := range w.header { + for index := range v { + if err := enc.WriteField(qpack.HeaderField{Name: strings.ToLower(k), Value: v[index]}); err != nil { + return err + } + } + } + + buf := make([]byte, 0, frameHeaderLen+headers.Len()) + buf = (&headersFrame{Length: uint64(headers.Len())}).Append(buf) + buf = append(buf, headers.Bytes()...) + + _, err := w.str.writeUnframed(buf) + return err } func (w *responseWriter) FlushError() error { - if !w.headerWritten { + if !w.headerComplete { w.WriteHeader(http.StatusOK) } - if !w.written { - if err := w.writeHeader(); err != nil { - return maybeReplaceError(err) - } - w.written = true - } - return w.bufferedStr.Flush() + _, err := w.doWrite(nil) + return err } func (w *responseWriter) Flush() { if err := w.FlushError(); err != nil { - w.logger.Errorf("could not flush to stream: %s", err.Error()) + if w.logger != nil { + w.logger.Debug("could not flush to stream", "error", err) + } } } -func (w *responseWriter) StreamCreator() StreamCreator { +func (w *responseWriter) HTTPStream() Stream { + w.hijacked = true + w.Flush() + return w.str +} + +func (w *responseWriter) wasStreamHijacked() bool { return w.hijacked } + +func (w *responseWriter) Connection() Connection { return w.conn } diff --git a/vendor/github.com/quic-go/quic-go/http3/roundtrip.go b/vendor/github.com/quic-go/quic-go/http3/roundtrip.go index bed421030..148e33735 100644 --- a/vendor/github.com/quic-go/quic-go/http3/roundtrip.go +++ b/vendor/github.com/quic-go/quic-go/http3/roundtrip.go @@ -15,78 +15,17 @@ import ( "golang.org/x/net/http/httpguts" "github.com/quic-go/quic-go" + "github.com/quic-go/quic-go/internal/protocol" ) -type roundTripCloser interface { - RoundTripOpt(*http.Request, RoundTripOpt) (*http.Response, error) - HandshakeComplete() bool - io.Closer -} - -type roundTripCloserWithCount struct { - roundTripCloser - useCount atomic.Int64 -} - -// RoundTripper implements the http.RoundTripper interface -type RoundTripper struct { - mutex sync.Mutex - - // DisableCompression, if true, prevents the Transport from - // requesting compression with an "Accept-Encoding: gzip" - // request header when the Request contains no existing - // Accept-Encoding value. If the Transport requests gzip on - // its own and gets a gzipped response, it's transparently - // decoded in the Response.Body. However, if the user - // explicitly requested gzip it is not automatically - // uncompressed. - DisableCompression bool - - // TLSClientConfig specifies the TLS configuration to use with - // tls.Client. If nil, the default configuration is used. - TLSClientConfig *tls.Config - - // QuicConfig is the quic.Config used for dialing new connections. - // If nil, reasonable default values will be used. - QuicConfig *quic.Config - - // Enable support for HTTP/3 datagrams. - // If set to true, QuicConfig.EnableDatagram will be set. - // See https://datatracker.ietf.org/doc/html/rfc9297. +// Settings are HTTP/3 settings that apply to the underlying connection. +type Settings struct { + // Support for HTTP/3 datagrams (RFC 9297) EnableDatagrams bool - - // Additional HTTP/3 settings. - // It is invalid to specify any settings defined by the HTTP/3 draft and the datagram draft. - AdditionalSettings map[uint64]uint64 - - // When set, this callback is called for the first unknown frame parsed on a bidirectional stream. - // It is called right after parsing the frame type. - // If parsing the frame type fails, the error is passed to the callback. - // In that case, the frame type will not be set. - // Callers can either ignore the frame and return control of the stream back to HTTP/3 - // (by returning hijacked false). - // Alternatively, callers can take over the QUIC stream (by returning hijacked true). - StreamHijacker func(FrameType, quic.Connection, quic.Stream, error) (hijacked bool, err error) - - // When set, this callback is called for unknown unidirectional stream of unknown stream type. - // If parsing the stream type fails, the error is passed to the callback. - // In that case, the stream type will not be set. - UniStreamHijacker func(StreamType, quic.Connection, quic.ReceiveStream, error) (hijacked bool) - - // Dial specifies an optional dial function for creating QUIC - // connections for requests. - // If Dial is nil, a UDPConn will be created at the first request - // and will be reused for subsequent connections to other servers. - Dial func(ctx context.Context, addr string, tlsCfg *tls.Config, cfg *quic.Config) (quic.EarlyConnection, error) - - // MaxResponseHeaderBytes specifies a limit on how many response bytes are - // allowed in the server's response header. - // Zero means to use a default limit. - MaxResponseHeaderBytes int64 - - newClient func(hostname string, tlsConf *tls.Config, opts *roundTripperOpts, conf *quic.Config, dialer dialFunc) (roundTripCloser, error) // so we can mock it in tests - clients map[string]*roundTripCloserWithCount - transport *quic.Transport + // Extended CONNECT, RFC 9220 + EnableExtendedConnect bool + // Other settings, defined by the application + Other map[uint64]uint64 } // RoundTripOpt are options for the Transport.RoundTripOpt method. @@ -94,9 +33,77 @@ type RoundTripOpt struct { // OnlyCachedConn controls whether the RoundTripper may create a new QUIC connection. // If set true and no cached connection is available, RoundTripOpt will return ErrNoCachedConn. OnlyCachedConn bool - // DontCloseRequestStream controls whether the request stream is closed after sending the request. - // If set, context cancellations have no effect after the response headers are received. - DontCloseRequestStream bool +} + +type singleRoundTripper interface { + OpenRequestStream(context.Context) (RequestStream, error) + RoundTrip(*http.Request) (*http.Response, error) +} + +type roundTripperWithCount struct { + cancel context.CancelFunc + dialing chan struct{} // closed as soon as quic.Dial(Early) returned + dialErr error + conn quic.EarlyConnection + rt singleRoundTripper + + useCount atomic.Int64 +} + +func (r *roundTripperWithCount) Close() error { + r.cancel() + <-r.dialing + if r.conn != nil { + return r.conn.CloseWithError(0, "") + } + return nil +} + +// RoundTripper implements the http.RoundTripper interface +type RoundTripper struct { + mutex sync.Mutex + + // TLSClientConfig specifies the TLS configuration to use with + // tls.Client. If nil, the default configuration is used. + TLSClientConfig *tls.Config + + // QUICConfig is the quic.Config used for dialing new connections. + // If nil, reasonable default values will be used. + QUICConfig *quic.Config + + // Dial specifies an optional dial function for creating QUIC + // connections for requests. + // If Dial is nil, a UDPConn will be created at the first request + // and will be reused for subsequent connections to other servers. + Dial func(ctx context.Context, addr string, tlsCfg *tls.Config, cfg *quic.Config) (quic.EarlyConnection, error) + + // Enable support for HTTP/3 datagrams (RFC 9297). + // If a QUICConfig is set, datagram support also needs to be enabled on the QUIC layer by setting EnableDatagrams. + EnableDatagrams bool + + // Additional HTTP/3 settings. + // It is invalid to specify any settings defined by RFC 9114 (HTTP/3) and RFC 9297 (HTTP Datagrams). + AdditionalSettings map[uint64]uint64 + + // MaxResponseHeaderBytes specifies a limit on how many response bytes are + // allowed in the server's response header. + // Zero means to use a default limit. + MaxResponseHeaderBytes int64 + + // DisableCompression, if true, prevents the Transport from requesting compression with an + // "Accept-Encoding: gzip" request header when the Request contains no existing Accept-Encoding value. + // If the Transport requests gzip on its own and gets a gzipped response, it's transparently + // decoded in the Response.Body. + // However, if the user explicitly requested gzip it is not automatically uncompressed. + DisableCompression bool + + initOnce sync.Once + initErr error + + newClient func(quic.EarlyConnection) singleRoundTripper + + clients map[string]*roundTripperWithCount + transport *quic.Transport } var ( @@ -109,6 +116,11 @@ var ErrNoCachedConn = errors.New("http3: no cached connection was available") // RoundTripOpt is like RoundTrip, but takes options. func (r *RoundTripper) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Response, error) { + r.initOnce.Do(func() { r.initErr = r.init() }) + if r.initErr != nil { + return nil, r.initErr + } + if req.URL == nil { closeRequestBody(req) return nil, errors.New("http3: nil Request.URL") @@ -141,15 +153,31 @@ func (r *RoundTripper) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http. return nil, fmt.Errorf("http3: invalid method %q", req.Method) } - hostname := authorityAddr("https", hostnameFromRequest(req)) - cl, isReused, err := r.getClient(hostname, opt.OnlyCachedConn) + hostname := authorityAddr(hostnameFromURL(req.URL)) + cl, isReused, err := r.getClient(req.Context(), hostname, opt.OnlyCachedConn) if err != nil { return nil, err } + + select { + case <-cl.dialing: + case <-req.Context().Done(): + return nil, context.Cause(req.Context()) + } + + if cl.dialErr != nil { + return nil, cl.dialErr + } defer cl.useCount.Add(-1) - rsp, err := cl.RoundTripOpt(req, opt) + rsp, err := cl.rt.RoundTrip(req) if err != nil { - r.removeClient(hostname) + // non-nil errors on roundtrip are likely due to a problem with the connection + // so we remove the client from the cache so that subsequent trips reconnect + // context cancelation is excluded as is does not signify a connection error + if !errors.Is(err, context.Canceled) { + r.removeClient(hostname) + } + if isReused { if nerr, ok := err.(net.Error); ok && nerr.Timeout() { return r.RoundTripOpt(req, opt) @@ -164,58 +192,126 @@ func (r *RoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { return r.RoundTripOpt(req, RoundTripOpt{}) } -func (r *RoundTripper) getClient(hostname string, onlyCached bool) (rtc *roundTripCloserWithCount, isReused bool, err error) { +func (r *RoundTripper) init() error { + if r.newClient == nil { + r.newClient = func(conn quic.EarlyConnection) singleRoundTripper { + return &SingleDestinationRoundTripper{ + Connection: conn, + EnableDatagrams: r.EnableDatagrams, + DisableCompression: r.DisableCompression, + AdditionalSettings: r.AdditionalSettings, + MaxResponseHeaderBytes: r.MaxResponseHeaderBytes, + } + } + } + if r.QUICConfig == nil { + r.QUICConfig = defaultQuicConfig.Clone() + r.QUICConfig.EnableDatagrams = r.EnableDatagrams + } + if r.EnableDatagrams && !r.QUICConfig.EnableDatagrams { + return errors.New("HTTP Datagrams enabled, but QUIC Datagrams disabled") + } + if len(r.QUICConfig.Versions) == 0 { + r.QUICConfig = r.QUICConfig.Clone() + r.QUICConfig.Versions = []quic.Version{protocol.SupportedVersions[0]} + } + if len(r.QUICConfig.Versions) != 1 { + return errors.New("can only use a single QUIC version for dialing a HTTP/3 connection") + } + if r.QUICConfig.MaxIncomingStreams == 0 { + r.QUICConfig.MaxIncomingStreams = -1 // don't allow any bidirectional streams + } + return nil +} + +func (r *RoundTripper) getClient(ctx context.Context, hostname string, onlyCached bool) (rtc *roundTripperWithCount, isReused bool, err error) { r.mutex.Lock() defer r.mutex.Unlock() if r.clients == nil { - r.clients = make(map[string]*roundTripCloserWithCount) + r.clients = make(map[string]*roundTripperWithCount) } - client, ok := r.clients[hostname] + cl, ok := r.clients[hostname] if !ok { if onlyCached { return nil, false, ErrNoCachedConn } - var err error - newCl := newClient - if r.newClient != nil { - newCl = r.newClient + ctx, cancel := context.WithCancel(ctx) + cl = &roundTripperWithCount{ + dialing: make(chan struct{}), + cancel: cancel, } - dial := r.Dial - if dial == nil { - if r.transport == nil { - udpConn, err := net.ListenUDP("udp", nil) - if err != nil { - return nil, false, err - } - r.transport = &quic.Transport{Conn: udpConn} + go func() { + defer close(cl.dialing) + defer cancel() + conn, rt, err := r.dial(ctx, hostname) + if err != nil { + cl.dialErr = err + return } - dial = r.makeDialer() - } - c, err := newCl( - hostname, - r.TLSClientConfig, - &roundTripperOpts{ - EnableDatagram: r.EnableDatagrams, - DisableCompression: r.DisableCompression, - MaxHeaderBytes: r.MaxResponseHeaderBytes, - StreamHijacker: r.StreamHijacker, - UniStreamHijacker: r.UniStreamHijacker, - }, - r.QuicConfig, - dial, - ) - if err != nil { - return nil, false, err - } - client = &roundTripCloserWithCount{roundTripCloser: c} - r.clients[hostname] = client - } else if client.HandshakeComplete() { - isReused = true + cl.conn = conn + cl.rt = rt + }() + r.clients[hostname] = cl } - client.useCount.Add(1) - return client, isReused, nil + select { + case <-cl.dialing: + if cl.dialErr != nil { + return nil, false, cl.dialErr + } + select { + case <-cl.conn.HandshakeComplete(): + isReused = true + default: + } + default: + } + cl.useCount.Add(1) + return cl, isReused, nil +} + +func (r *RoundTripper) dial(ctx context.Context, hostname string) (quic.EarlyConnection, singleRoundTripper, error) { + var tlsConf *tls.Config + if r.TLSClientConfig == nil { + tlsConf = &tls.Config{} + } else { + tlsConf = r.TLSClientConfig.Clone() + } + if tlsConf.ServerName == "" { + sni, _, err := net.SplitHostPort(hostname) + if err != nil { + // It's ok if net.SplitHostPort returns an error - it could be a hostname/IP address without a port. + sni = hostname + } + tlsConf.ServerName = sni + } + // Replace existing ALPNs by H3 + tlsConf.NextProtos = []string{versionToALPN(r.QUICConfig.Versions[0])} + + dial := r.Dial + if dial == nil { + if r.transport == nil { + udpConn, err := net.ListenUDP("udp", nil) + if err != nil { + return nil, nil, err + } + r.transport = &quic.Transport{Conn: udpConn} + } + dial = func(ctx context.Context, addr string, tlsCfg *tls.Config, cfg *quic.Config) (quic.EarlyConnection, error) { + udpAddr, err := net.ResolveUDPAddr("udp", addr) + if err != nil { + return nil, err + } + return r.transport.DialEarly(ctx, udpAddr, tlsCfg, cfg) + } + } + + conn, err := dial(ctx, hostname, tlsConf, r.QUICConfig) + if err != nil { + return nil, nil, err + } + return conn, r.newClient(conn), nil } func (r *RoundTripper) removeClient(hostname string) { @@ -232,8 +328,8 @@ func (r *RoundTripper) removeClient(hostname string) { func (r *RoundTripper) Close() error { r.mutex.Lock() defer r.mutex.Unlock() - for _, client := range r.clients { - if err := client.Close(); err != nil { + for _, cl := range r.clients { + if err := cl.Close(); err != nil { return err } } @@ -278,23 +374,12 @@ func isNotToken(r rune) bool { return !httpguts.IsTokenRune(r) } -// makeDialer makes a QUIC dialer using r.udpConn. -func (r *RoundTripper) makeDialer() func(ctx context.Context, addr string, tlsCfg *tls.Config, cfg *quic.Config) (quic.EarlyConnection, error) { - return func(ctx context.Context, addr string, tlsCfg *tls.Config, cfg *quic.Config) (quic.EarlyConnection, error) { - udpAddr, err := net.ResolveUDPAddr("udp", addr) - if err != nil { - return nil, err - } - return r.transport.DialEarly(ctx, udpAddr, tlsCfg, cfg) - } -} - func (r *RoundTripper) CloseIdleConnections() { r.mutex.Lock() defer r.mutex.Unlock() - for hostname, client := range r.clients { - if client.useCount.Load() == 0 { - client.Close() + for hostname, cl := range r.clients { + if cl.useCount.Load() == 0 { + cl.Close() delete(r.clients, hostname) } } diff --git a/vendor/github.com/quic-go/quic-go/http3/server.go b/vendor/github.com/quic-go/quic-go/http3/server.go index 4587a1fca..5d7aec8a5 100644 --- a/vendor/github.com/quic-go/quic-go/http3/server.go +++ b/vendor/github.com/quic-go/quic-go/http3/server.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "io" + "log/slog" "net" "net/http" "runtime" @@ -16,7 +17,6 @@ import ( "github.com/quic-go/quic-go" "github.com/quic-go/quic-go/internal/protocol" - "github.com/quic-go/quic-go/internal/utils" "github.com/quic-go/quic-go/quicvarint" "github.com/quic-go/qpack" @@ -54,7 +54,7 @@ type QUICEarlyListener interface { var _ QUICEarlyListener = &quic.EarlyListener{} -func versionToALPN(v protocol.VersionNumber) string { +func versionToALPN(v protocol.Version) string { //nolint:exhaustive // These are all the versions we care about. switch v { case protocol.Version1, protocol.Version2: @@ -76,7 +76,7 @@ func ConfigureTLSConfig(tlsConf *tls.Config) *tls.Config { // determine the ALPN from the QUIC version used proto := NextProtoH3 val := ch.Context().Value(quic.QUICVersionContextKey) - if v, ok := val.(quic.VersionNumber); ok { + if v, ok := val.(quic.Version); ok { proto = versionToALPN(v) } config := tlsConf @@ -115,19 +115,15 @@ func (k *contextKey) String() string { return "quic-go/http3 context value " + k // type *http3.Server. var ServerContextKey = &contextKey{"http3-server"} -type requestError struct { - err error - streamErr ErrCode - connErr ErrCode -} - -func newStreamError(code ErrCode, err error) requestError { - return requestError{err: err, streamErr: code} -} - -func newConnError(code ErrCode, err error) requestError { - return requestError{err: err, connErr: code} -} +// RemoteAddrContextKey is a context key. It can be used in +// HTTP handlers with Context.Value to access the remote +// address of the connection. The associated value will be of +// type net.Addr. +// +// Use this value instead of [http.Request.RemoteAddr] if you +// require access to the remote address of the connection rather +// than its string representation. +var RemoteAddrContextKey = &contextKey{"remote-addr"} // listenerInfo contains info about specific listener added with addListener type listenerInfo struct { @@ -145,10 +141,10 @@ type Server struct { // // Otherwise, if Port is not set and underlying QUIC listeners do not // have valid port numbers, the port part is used in Alt-Svc headers set - // with SetQuicHeaders. + // with SetQUICHeaders. Addr string - // Port is used in Alt-Svc response headers set with SetQuicHeaders. If + // Port is used in Alt-Svc response headers set with SetQUICHeaders. If // needed Port can be manually set when the Server is created. // // This is useful when a Layer 4 firewall is redirecting UDP traffic and @@ -160,20 +156,18 @@ type Server struct { // set for ListenAndServe and Serve methods. TLSConfig *tls.Config - // QuicConfig provides the parameters for QUIC connection created with - // Serve. If nil, it uses reasonable default values. + // QUICConfig provides the parameters for QUIC connection created with Serve. + // If nil, it uses reasonable default values. // - // Configured versions are also used in Alt-Svc response header set with - // SetQuicHeaders. - QuicConfig *quic.Config + // Configured versions are also used in Alt-Svc response header set with SetQUICHeaders. + QUICConfig *quic.Config // Handler is the HTTP request handler to use. If not set, defaults to // http.NotFound. Handler http.Handler - // EnableDatagrams enables support for HTTP/3 datagrams. - // If set to true, QuicConfig.EnableDatagram will be set. - // See https://datatracker.ietf.org/doc/html/rfc9297. + // EnableDatagrams enables support for HTTP/3 datagrams (RFC 9297). + // If set to true, QUICConfig.EnableDatagrams will be set. EnableDatagrams bool // MaxHeaderBytes controls the maximum number of bytes the server will @@ -183,7 +177,7 @@ type Server struct { MaxHeaderBytes int // AdditionalSettings specifies additional HTTP/3 settings. - // It is invalid to specify any settings defined by the HTTP/3 draft and the datagram draft. + // It is invalid to specify any settings defined by RFC 9114 (HTTP/3) and RFC 9297 (HTTP Datagrams). AdditionalSettings map[uint64]uint64 // StreamHijacker, when set, is called for the first unknown frame parsed on a bidirectional stream. @@ -193,12 +187,19 @@ type Server struct { // Callers can either ignore the frame and return control of the stream back to HTTP/3 // (by returning hijacked false). // Alternatively, callers can take over the QUIC stream (by returning hijacked true). - StreamHijacker func(FrameType, quic.Connection, quic.Stream, error) (hijacked bool, err error) + StreamHijacker func(FrameType, quic.ConnectionTracingID, quic.Stream, error) (hijacked bool, err error) // UniStreamHijacker, when set, is called for unknown unidirectional stream of unknown stream type. // If parsing the stream type fails, the error is passed to the callback. // In that case, the stream type will not be set. - UniStreamHijacker func(StreamType, quic.Connection, quic.ReceiveStream, error) (hijacked bool) + UniStreamHijacker func(StreamType, quic.ConnectionTracingID, quic.ReceiveStream, error) (hijacked bool) + + // ConnContext optionally specifies a function that modifies + // the context used for a new connection c. The provided ctx + // has a ServerContextKey value. + ConnContext func(ctx context.Context, c quic.Connection) context.Context + + Logger *slog.Logger mutex sync.RWMutex listeners map[*QUICEarlyListener]listenerInfo @@ -206,8 +207,6 @@ type Server struct { closed bool altSvcHeader string - - logger utils.Logger } // ListenAndServe listens on the UDP address s.Addr and calls s.Handler to handle HTTP/3 requests on incoming connections. @@ -244,12 +243,6 @@ func (s *Server) Serve(conn net.PacketConn) error { // ServeQUICConn serves a single QUIC connection. func (s *Server) ServeQUICConn(conn quic.Connection) error { - s.mutex.Lock() - if s.logger == nil { - s.logger = utils.DefaultLogger.WithPrefix("server") - } - s.mutex.Unlock() - return s.handleConn(conn) } @@ -273,7 +266,9 @@ func (s *Server) ServeListener(ln QUICEarlyListener) error { } go func() { if err := s.handleConn(conn); err != nil { - s.logger.Debugf(err.Error()) + if s.Logger != nil { + s.Logger.Debug("handling connection failed", "error", err) + } } }() } @@ -294,11 +289,11 @@ func (s *Server) serveConn(tlsConf *tls.Config, conn net.PacketConn) error { } baseConf := ConfigureTLSConfig(tlsConf) - quicConf := s.QuicConfig + quicConf := s.QUICConfig if quicConf == nil { quicConf = &quic.Config{Allow0RTT: true} } else { - quicConf = s.QuicConfig.Clone() + quicConf = s.QUICConfig.Clone() } if s.EnableDatagrams { quicConf.EnableDatagrams = true @@ -343,8 +338,8 @@ func (s *Server) generateAltSvcHeader() { // This code assumes that we will use protocol.SupportedVersions if no quic.Config is passed. supportedVersions := protocol.SupportedVersions - if s.QuicConfig != nil && len(s.QuicConfig.Versions) > 0 { - supportedVersions = s.QuicConfig.Versions + if s.QUICConfig != nil && len(s.QUICConfig.Versions) > 0 { + supportedVersions = s.QUICConfig.Versions } // keep track of which have been seen so we don't yield duplicate values @@ -400,17 +395,19 @@ func (s *Server) addListener(l *QUICEarlyListener) error { if s.closed { return http.ErrServerClosed } - if s.logger == nil { - s.logger = utils.DefaultLogger.WithPrefix("server") - } if s.listeners == nil { s.listeners = make(map[*QUICEarlyListener]listenerInfo) } - if port, err := extractPort((*l).Addr().String()); err == nil { + laddr := (*l).Addr() + if port, err := extractPort(laddr.String()); err == nil { s.listeners[l] = listenerInfo{port} } else { - s.logger.Errorf("Unable to extract port from listener %+v, will not be announced using SetQuicHeaders: %s", err) + logger := s.Logger + if logger == nil { + logger = slog.Default() + } + logger.Error("Unable to extract port from listener, will not be announced using SetQUICHeaders", "local addr", laddr, "error", err) s.listeners[l] = listenerInfo{} } s.generateAltSvcHeader() @@ -425,8 +422,6 @@ func (s *Server) removeListener(l *QUICEarlyListener) { } func (s *Server) handleConn(conn quic.Connection) error { - decoder := qpack.NewDecoder(nil) - // send a SETTINGS frame str, err := conn.OpenUniStream() if err != nil { @@ -434,15 +429,24 @@ func (s *Server) handleConn(conn quic.Connection) error { } b := make([]byte, 0, 64) b = quicvarint.Append(b, streamTypeControlStream) // stream type - b = (&settingsFrame{Datagram: s.EnableDatagrams, Other: s.AdditionalSettings}).Append(b) + b = (&settingsFrame{ + Datagram: s.EnableDatagrams, + ExtendedConnect: true, + Other: s.AdditionalSettings, + }).Append(b) str.Write(b) - go s.handleUnidirectionalStreams(conn) - + hconn := newConnection( + conn, + s.EnableDatagrams, + protocol.PerspectiveServer, + s.Logger, + ) + go hconn.HandleUnidirectionalStreams(s.UniStreamHijacker) // Process all requests immediately. // It's the client's responsibility to decide which requests are eligible for 0-RTT. for { - str, err := conn.AcceptStream(context.Background()) + str, datagrams, err := hconn.acceptStream(context.Background()) if err != nil { var appErr *quic.ApplicationError if errors.As(err, &appErr) && appErr.ErrorCode == quic.ApplicationErrorCode(ErrCodeNoError) { @@ -450,86 +454,7 @@ func (s *Server) handleConn(conn quic.Connection) error { } return fmt.Errorf("accepting stream failed: %w", err) } - go func() { - rerr := s.handleRequest(conn, str, decoder, func() { - conn.CloseWithError(quic.ApplicationErrorCode(ErrCodeFrameUnexpected), "") - }) - if rerr.err == errHijacked { - return - } - if rerr.err != nil || rerr.streamErr != 0 || rerr.connErr != 0 { - s.logger.Debugf("Handling request failed: %s", err) - if rerr.streamErr != 0 { - str.CancelWrite(quic.StreamErrorCode(rerr.streamErr)) - } - if rerr.connErr != 0 { - var reason string - if rerr.err != nil { - reason = rerr.err.Error() - } - conn.CloseWithError(quic.ApplicationErrorCode(rerr.connErr), reason) - } - return - } - str.Close() - }() - } -} - -func (s *Server) handleUnidirectionalStreams(conn quic.Connection) { - for { - str, err := conn.AcceptUniStream(context.Background()) - if err != nil { - s.logger.Debugf("accepting unidirectional stream failed: %s", err) - return - } - - go func(str quic.ReceiveStream) { - streamType, err := quicvarint.Read(quicvarint.NewReader(str)) - if err != nil { - if s.UniStreamHijacker != nil && s.UniStreamHijacker(StreamType(streamType), conn, str, err) { - return - } - s.logger.Debugf("reading stream type on stream %d failed: %s", str.StreamID(), err) - return - } - // We're only interested in the control stream here. - switch streamType { - case streamTypeControlStream: - case streamTypeQPACKEncoderStream, streamTypeQPACKDecoderStream: - // Our QPACK implementation doesn't use the dynamic table yet. - // TODO: check that only one stream of each type is opened. - return - case streamTypePushStream: // only the server can push - conn.CloseWithError(quic.ApplicationErrorCode(ErrCodeStreamCreationError), "") - return - default: - if s.UniStreamHijacker != nil && s.UniStreamHijacker(StreamType(streamType), conn, str, nil) { - return - } - str.CancelRead(quic.StreamErrorCode(ErrCodeStreamCreationError)) - return - } - f, err := parseNextFrame(str, nil) - if err != nil { - conn.CloseWithError(quic.ApplicationErrorCode(ErrCodeFrameError), "") - return - } - sf, ok := f.(*settingsFrame) - if !ok { - conn.CloseWithError(quic.ApplicationErrorCode(ErrCodeMissingSettings), "") - return - } - if !sf.Datagram { - return - } - // If datagram support was enabled on our side as well as on the client side, - // we can expect it to have been negotiated both on the transport and on the HTTP/3 layer. - // Note: ConnectionState() will block until the handshake is complete (relevant when using 0-RTT). - if s.EnableDatagrams && !conn.ConnectionState().SupportsDatagrams { - conn.CloseWithError(quic.ApplicationErrorCode(ErrCodeSettingsError), "missing QUIC Datagram support") - } - }(str) + go s.handleRequest(hconn, str, datagrams, hconn.decoder) } } @@ -540,37 +465,54 @@ func (s *Server) maxHeaderBytes() uint64 { return uint64(s.MaxHeaderBytes) } -func (s *Server) handleRequest(conn quic.Connection, str quic.Stream, decoder *qpack.Decoder, onFrameError func()) requestError { +func (s *Server) handleRequest(conn *connection, str quic.Stream, datagrams *datagrammer, decoder *qpack.Decoder) { var ufh unknownFrameHandlerFunc if s.StreamHijacker != nil { - ufh = func(ft FrameType, e error) (processed bool, err error) { return s.StreamHijacker(ft, conn, str, e) } - } - frame, err := parseNextFrame(str, ufh) - if err != nil { - if err == errHijacked { - return requestError{err: errHijacked} + ufh = func(ft FrameType, e error) (processed bool, err error) { + return s.StreamHijacker( + ft, + conn.Context().Value(quic.ConnectionTracingKey).(quic.ConnectionTracingID), + str, + e, + ) } - return newStreamError(ErrCodeRequestIncomplete, err) + } + fp := &frameParser{conn: conn, r: str, unknownFrameHandler: ufh} + frame, err := fp.ParseNext() + if err != nil { + if !errors.Is(err, errHijacked) { + str.CancelRead(quic.StreamErrorCode(ErrCodeRequestIncomplete)) + str.CancelWrite(quic.StreamErrorCode(ErrCodeRequestIncomplete)) + } + return } hf, ok := frame.(*headersFrame) if !ok { - return newConnError(ErrCodeFrameUnexpected, errors.New("expected first frame to be a HEADERS frame")) + conn.CloseWithError(quic.ApplicationErrorCode(ErrCodeFrameUnexpected), "expected first frame to be a HEADERS frame") + return } if hf.Length > s.maxHeaderBytes() { - return newStreamError(ErrCodeFrameError, fmt.Errorf("HEADERS frame too large: %d bytes (max: %d)", hf.Length, s.maxHeaderBytes())) + str.CancelRead(quic.StreamErrorCode(ErrCodeFrameError)) + str.CancelWrite(quic.StreamErrorCode(ErrCodeFrameError)) + return } headerBlock := make([]byte, hf.Length) if _, err := io.ReadFull(str, headerBlock); err != nil { - return newStreamError(ErrCodeRequestIncomplete, err) + str.CancelRead(quic.StreamErrorCode(ErrCodeRequestIncomplete)) + str.CancelWrite(quic.StreamErrorCode(ErrCodeRequestIncomplete)) + return } hfs, err := decoder.DecodeFull(headerBlock) if err != nil { // TODO: use the right error code - return newConnError(ErrCodeGeneralProtocolError, err) + conn.CloseWithError(quic.ApplicationErrorCode(ErrCodeGeneralProtocolError), "expected first frame to be a HEADERS frame") + return } req, err := requestFromHeaders(hfs) if err != nil { - return newStreamError(ErrCodeMessageError, err) + str.CancelRead(quic.StreamErrorCode(ErrCodeMessageError)) + str.CancelWrite(quic.StreamErrorCode(ErrCodeMessageError)) + return } connState := conn.ConnectionState().TLS @@ -579,31 +521,36 @@ func (s *Server) handleRequest(conn quic.Connection, str quic.Stream, decoder *q // Check that the client doesn't send more data in DATA frames than indicated by the Content-Length header (if set). // See section 4.1.2 of RFC 9114. - var httpStr Stream + contentLength := int64(-1) if _, ok := req.Header["Content-Length"]; ok && req.ContentLength >= 0 { - httpStr = newLengthLimitedStream(newStream(str, onFrameError), req.ContentLength) - } else { - httpStr = newStream(str, onFrameError) + contentLength = req.ContentLength } - body := newRequestBody(httpStr) + hstr := newStream(str, conn, datagrams) + body := newRequestBody(hstr, contentLength, conn.Context(), conn.ReceivedSettings(), conn.Settings) req.Body = body - if s.logger.Debug() { - s.logger.Infof("%s %s%s, on stream %d", req.Method, req.Host, req.RequestURI, str.StreamID()) - } else { - s.logger.Infof("%s %s%s", req.Method, req.Host, req.RequestURI) + if s.Logger != nil { + s.Logger.Debug("handling request", "method", req.Method, "host", req.Host, "uri", req.RequestURI) } ctx := str.Context() ctx = context.WithValue(ctx, ServerContextKey, s) ctx = context.WithValue(ctx, http.LocalAddrContextKey, conn.LocalAddr()) + ctx = context.WithValue(ctx, RemoteAddrContextKey, conn.RemoteAddr()) + if s.ConnContext != nil { + ctx = s.ConnContext(ctx, conn.Connection) + if ctx == nil { + panic("http3: ConnContext returned nil") + } + } req = req.WithContext(ctx) - r := newResponseWriter(str, conn, s.logger) + r := newResponseWriter(hstr, conn, req.Method == http.MethodHead, s.Logger) handler := s.Handler if handler == nil { handler = http.DefaultServeMux } + // It's the client's responsibility to decide which requests are eligible for 0-RTT. var panicked bool func() { defer func() { @@ -616,29 +563,42 @@ func (s *Server) handleRequest(conn quic.Connection, str quic.Stream, decoder *q const size = 64 << 10 buf := make([]byte, size) buf = buf[:runtime.Stack(buf, false)] - s.logger.Errorf("http: panic serving: %v\n%s", p, buf) + logger := s.Logger + if logger == nil { + logger = slog.Default() + } + logger.Error("http: panic serving", "arg", p, "trace", buf) } }() handler.ServeHTTP(r, req) }() - if body.wasStreamHijacked() { - return requestError{err: errHijacked} + if r.wasStreamHijacked() { + return } // only write response when there is no panic if !panicked { // response not written to the client yet, set Content-Length - if !r.written { + if !r.headerWritten { if _, haveCL := r.header["Content-Length"]; !haveCL { r.header.Set("Content-Length", strconv.FormatInt(r.numWritten, 10)) } } r.Flush() } + + // abort the stream when there is a panic + if panicked { + str.CancelRead(quic.StreamErrorCode(ErrCodeInternalError)) + str.CancelWrite(quic.StreamErrorCode(ErrCodeInternalError)) + return + } + // If the EOF was read by the handler, CancelRead() is a no-op. str.CancelRead(quic.StreamErrorCode(ErrCodeNoError)) - return requestError{} + + str.Close() } // Close the server immediately, aborting requests and sending CONNECTION_CLOSE frames to connected clients. @@ -665,32 +625,36 @@ func (s *Server) CloseGracefully(timeout time.Duration) error { return nil } -// ErrNoAltSvcPort is the error returned by SetQuicHeaders when no port was found +// ErrNoAltSvcPort is the error returned by SetQUICHeaders when no port was found // for Alt-Svc to announce. This can happen if listening on a PacketConn without a port // (UNIX socket, for example) and no port is specified in Server.Port or Server.Addr. var ErrNoAltSvcPort = errors.New("no port can be announced, specify it explicitly using Server.Port or Server.Addr") -// SetQuicHeaders can be used to set the proper headers that announce that this server supports HTTP/3. -// The values set by default advertise all of the ports the server is listening on, but can be -// changed to a specific port by setting Server.Port before launching the serverr. +// SetQUICHeaders can be used to set the proper headers that announce that this server supports HTTP/3. +// The values set by default advertise all the ports the server is listening on, but can be +// changed to a specific port by setting Server.Port before launching the server. // If no listener's Addr().String() returns an address with a valid port, Server.Addr will be used // to extract the port, if specified. // For example, a server launched using ListenAndServe on an address with port 443 would set: // -// Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 -func (s *Server) SetQuicHeaders(hdr http.Header) error { +// Alt-Svc: h3=":443"; ma=2592000 +func (s *Server) SetQUICHeaders(hdr http.Header) error { s.mutex.RLock() defer s.mutex.RUnlock() if s.altSvcHeader == "" { return ErrNoAltSvcPort } - // use the map directly to avoid constant canonicalization - // since the key is already canonicalized + // use the map directly to avoid constant canonicalization since the key is already canonicalized hdr["Alt-Svc"] = append(hdr["Alt-Svc"], s.altSvcHeader) return nil } +// Deprecated: use SetQUICHeaders instead. +func (s *Server) SetQuicHeaders(hdr http.Header) error { + return s.SetQUICHeaders(hdr) +} + // ListenAndServeQUIC listens on the UDP network address addr and calls the // handler for HTTP/3 requests on incoming connections. http.DefaultServeMux is // used when handler is nil. @@ -702,11 +666,16 @@ func ListenAndServeQUIC(addr, certFile, keyFile string, handler http.Handler) er return server.ListenAndServeTLS(certFile, keyFile) } -// ListenAndServe listens on the given network address for both, TLS and QUIC +// Deprecated: use ListenAndServeTLS instead. +func ListenAndServe(addr, certFile, keyFile string, handler http.Handler) error { + return ListenAndServeTLS(addr, certFile, keyFile, handler) +} + +// ListenAndServeTLS listens on the given network address for both TLS/TCP and QUIC // connections in parallel. It returns if one of the two returns an error. // http.DefaultServeMux is used when handler is nil. // The correct Alt-Svc headers for QUIC are set. -func ListenAndServe(addr, certFile, keyFile string, handler http.Handler) error { +func ListenAndServeTLS(addr, certFile, keyFile string, handler http.Handler) error { // Load certs var err error certs := make([]tls.Certificate, 1) @@ -744,11 +713,11 @@ func ListenAndServe(addr, certFile, keyFile string, handler http.Handler) error Handler: handler, } - hErr := make(chan error) - qErr := make(chan error) + hErr := make(chan error, 1) + qErr := make(chan error, 1) go func() { hErr <- http.ListenAndServeTLS(addr, certFile, keyFile, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - quicServer.SetQuicHeaders(w.Header()) + quicServer.SetQUICHeaders(w.Header()) handler.ServeHTTP(w, r) })) }() diff --git a/vendor/github.com/quic-go/quic-go/http3/state_tracking_stream.go b/vendor/github.com/quic-go/quic-go/http3/state_tracking_stream.go new file mode 100644 index 000000000..9cf17f5e6 --- /dev/null +++ b/vendor/github.com/quic-go/quic-go/http3/state_tracking_stream.go @@ -0,0 +1,116 @@ +package http3 + +import ( + "context" + "errors" + "os" + "sync" + + "github.com/quic-go/quic-go" +) + +var _ quic.Stream = &stateTrackingStream{} + +// stateTrackingStream is an implementation of quic.Stream that delegates +// to an underlying stream +// it takes care of proxying send and receive errors onto an implementation of +// the errorSetter interface (intended to be occupied by a datagrammer) +// it is also responsible for clearing the stream based on its ID from its +// parent connection, this is done through the streamClearer interface when +// both the send and receive sides are closed +type stateTrackingStream struct { + quic.Stream + + mx sync.Mutex + sendErr error + recvErr error + + clearer streamClearer + setter errorSetter +} + +type streamClearer interface { + clearStream(quic.StreamID) +} + +type errorSetter interface { + SetSendError(error) + SetReceiveError(error) +} + +func newStateTrackingStream(s quic.Stream, clearer streamClearer, setter errorSetter) *stateTrackingStream { + t := &stateTrackingStream{ + Stream: s, + clearer: clearer, + setter: setter, + } + + context.AfterFunc(s.Context(), func() { + t.closeSend(context.Cause(s.Context())) + }) + + return t +} + +func (s *stateTrackingStream) closeSend(e error) { + s.mx.Lock() + defer s.mx.Unlock() + + // clear the stream the first time both the send + // and receive are finished + if s.sendErr == nil { + if s.recvErr != nil { + s.clearer.clearStream(s.StreamID()) + } + + s.setter.SetSendError(e) + s.sendErr = e + } +} + +func (s *stateTrackingStream) closeReceive(e error) { + s.mx.Lock() + defer s.mx.Unlock() + + // clear the stream the first time both the send + // and receive are finished + if s.recvErr == nil { + if s.sendErr != nil { + s.clearer.clearStream(s.StreamID()) + } + + s.setter.SetReceiveError(e) + s.recvErr = e + } +} + +func (s *stateTrackingStream) Close() error { + s.closeSend(errors.New("write on closed stream")) + return s.Stream.Close() +} + +func (s *stateTrackingStream) CancelWrite(e quic.StreamErrorCode) { + s.closeSend(&quic.StreamError{StreamID: s.Stream.StreamID(), ErrorCode: e}) + s.Stream.CancelWrite(e) +} + +func (s *stateTrackingStream) Write(b []byte) (int, error) { + n, err := s.Stream.Write(b) + if err != nil && !errors.Is(err, os.ErrDeadlineExceeded) { + s.closeSend(err) + } + return n, err +} + +func (s *stateTrackingStream) CancelRead(e quic.StreamErrorCode) { + s.closeReceive(&quic.StreamError{StreamID: s.Stream.StreamID(), ErrorCode: e}) + s.Stream.CancelRead(e) +} + +func (s *stateTrackingStream) Read(b []byte) (int, error) { + n, err := s.Stream.Read(b) + if err != nil && !errors.Is(err, os.ErrDeadlineExceeded) { + s.closeReceive(err) + } + return n, err +} diff --git a/vendor/github.com/quic-go/quic-go/interface.go b/vendor/github.com/quic-go/quic-go/interface.go index 6eac385df..5837cb405 100644 --- a/vendor/github.com/quic-go/quic-go/interface.go +++ b/vendor/github.com/quic-go/quic-go/interface.go @@ -16,8 +16,12 @@ import ( // The StreamID is the ID of a QUIC stream. type StreamID = protocol.StreamID +// A Version is a QUIC version number. +type Version = protocol.Version + // A VersionNumber is a QUIC version number. -type VersionNumber = protocol.VersionNumber +// Deprecated: VersionNumber was renamed to Version. +type VersionNumber = Version const ( // Version1 is RFC 9000 @@ -55,6 +59,9 @@ var Err0RTTRejected = errors.New("0-RTT rejected") // as well as on the context passed to logging.Tracer.NewConnectionTracer. var ConnectionTracingKey = connTracingCtxKey{} +// ConnectionTracingID is the type of the context value saved under the ConnectionTracingKey. +type ConnectionTracingID uint64 + type connTracingCtxKey struct{} // QUICVersionContextKey can be used to find out the QUIC version of a TLS handshake from the @@ -117,7 +124,9 @@ type SendStream interface { // CancelWrite aborts sending on this stream. // Data already written, but not yet delivered to the peer is not guaranteed to be delivered reliably. // Write will unblock immediately, and future calls to Write will fail. - // When called multiple times or after closing the stream it is a no-op. + // When called multiple times it is a no-op. + // When called after Close, it aborts delivery. Note that there is no guarantee if + // the peer will receive the FIN or the reset first. CancelWrite(StreamErrorCode) // The Context is canceled as soon as the write-side of the stream is closed. // This happens when Close() or CancelWrite() is called, or when the peer @@ -159,6 +168,9 @@ type Connection interface { OpenStream() (Stream, error) // OpenStreamSync opens a new bidirectional QUIC stream. // It blocks until a new stream can be opened. + // There is no signaling to the peer about new streams: + // The peer can only accept the stream after data has been sent on the stream, + // or the stream has been reset or closed. // If the error is non-nil, it satisfies the net.Error interface. // If the connection was closed due to a timeout, Timeout() will be true. OpenStreamSync(context.Context) (Stream, error) @@ -187,10 +199,14 @@ type Connection interface { // Warning: This API should not be considered stable and might change soon. ConnectionState() ConnectionState - // SendMessage sends a message as a datagram, as specified in RFC 9221. - SendMessage([]byte) error - // ReceiveMessage gets a message received in a datagram, as specified in RFC 9221. - ReceiveMessage(context.Context) ([]byte, error) + // SendDatagram sends a message using a QUIC datagram, as specified in RFC 9221. + // There is no delivery guarantee for DATAGRAM frames, they are not retransmitted if lost. + // The payload of the datagram needs to fit into a single QUIC packet. + // In addition, a datagram may be dropped before being sent out if the available packet size suddenly decreases. + // If the payload is too large to be sent at the current time, a DatagramTooLargeError is returned. + SendDatagram(payload []byte) error + // ReceiveDatagram gets a message received in a datagram, as specified in RFC 9221. + ReceiveDatagram(context.Context) ([]byte, error) } // An EarlyConnection is a connection that is handshaking. @@ -251,7 +267,7 @@ type Config struct { GetConfigForClient func(info *ClientHelloInfo) (*Config, error) // The QUIC versions that can be negotiated. // If not set, it uses all versions available. - Versions []VersionNumber + Versions []Version // HandshakeIdleTimeout is the idle timeout before completion of the handshake. // If we don't receive any packet from the peer within this time, the connection attempt is aborted. // Additionally, if the handshake doesn't complete in twice this time, the connection attempt is also aborted. @@ -263,11 +279,6 @@ type Config struct { // If the timeout is exceeded, the connection is closed. // If this value is zero, the timeout is set to 30 seconds. MaxIdleTimeout time.Duration - // RequireAddressValidation determines if a QUIC Retry packet is sent. - // This allows the server to verify the client's address, at the cost of increasing the handshake latency by 1 RTT. - // See https://datatracker.ietf.org/doc/html/rfc9000#section-8 for details. - // If not set, every client is forced to prove its remote address. - RequireAddressValidation func(net.Addr) bool // The TokenStore stores tokens received from the server. // Tokens are used to skip address validation on future connection attempts. // The key used to store tokens is the ServerName from the tls.Config, if set @@ -314,10 +325,16 @@ type Config struct { // If set to 0, then no keep alive is sent. Otherwise, the keep alive is sent on that period (or at most // every half of MaxIdleTimeout, whichever is smaller). KeepAlivePeriod time.Duration + // InitialPacketSize is the initial size of packets sent. + // It is usually not necessary to manually set this value, + // since Path MTU discovery very quickly finds the path's MTU. + // If set too high, the path might not support packets that large, leading to a timeout of the QUIC handshake. + // Values below 1200 are invalid. + InitialPacketSize uint16 // DisablePathMTUDiscovery disables Path MTU Discovery (RFC 8899). // This allows the sending of QUIC packets that fully utilize the available MTU of the path. // Path MTU discovery is only available on systems that allow setting of the Don't Fragment (DF) bit. - // If unavailable or disabled, packets will be at most 1252 (IPv4) / 1232 (IPv6) bytes in size. + // If unavailable or disabled, packets will be at most 1280 bytes in size. DisablePathMTUDiscovery bool // Allow0RTT allows the application to decide if a 0-RTT connection attempt should be accepted. // Only valid for the server. @@ -327,8 +344,15 @@ type Config struct { Tracer func(context.Context, logging.Perspective, ConnectionID) *logging.ConnectionTracer } +// ClientHelloInfo contains information about an incoming connection attempt. type ClientHelloInfo struct { + // RemoteAddr is the remote address on the Initial packet. + // Unless AddrVerified is set, the address is not yet verified, and could be a spoofed IP address. RemoteAddr net.Addr + // AddrVerified says if the remote address was verified using QUIC's Retry mechanism. + // Note that the Retry mechanism costs one network roundtrip, + // and is not performed unless Transport.MaxUnvalidatedHandshakes is surpassed. + AddrVerified bool } // ConnectionState records basic details about a QUIC connection @@ -338,12 +362,12 @@ type ConnectionState struct { // SupportsDatagrams says if support for QUIC datagrams (RFC 9221) was negotiated. // This requires both nodes to support and enable the datagram extensions (via Config.EnableDatagrams). // If datagram support was negotiated, datagrams can be sent and received using the - // SendMessage and ReceiveMessage methods on the Connection. + // SendDatagram and ReceiveDatagram methods on the Connection. SupportsDatagrams bool // Used0RTT says if 0-RTT resumption was used. Used0RTT bool // Version is the QUIC version of the QUIC connection. - Version VersionNumber + Version Version // GSO says if generic segmentation offload is used GSO bool } diff --git a/vendor/github.com/quic-go/quic-go/internal/ackhandler/ackhandler.go b/vendor/github.com/quic-go/quic-go/internal/ackhandler/ackhandler.go index cb28582a3..6f890b4d3 100644 --- a/vendor/github.com/quic-go/quic-go/internal/ackhandler/ackhandler.go +++ b/vendor/github.com/quic-go/quic-go/internal/ackhandler/ackhandler.go @@ -20,5 +20,5 @@ func NewAckHandler( logger utils.Logger, ) (SentPacketHandler, ReceivedPacketHandler) { sph := newSentPacketHandler(initialPacketNumber, initialMaxDatagramSize, rttStats, clientAddressValidated, enableECN, pers, tracer, logger) - return sph, newReceivedPacketHandler(sph, rttStats, logger) + return sph, newReceivedPacketHandler(sph, logger) } diff --git a/vendor/github.com/quic-go/quic-go/internal/ackhandler/mockgen.go b/vendor/github.com/quic-go/quic-go/internal/ackhandler/mockgen.go index dbf6ee2d1..0031e6b1c 100644 --- a/vendor/github.com/quic-go/quic-go/internal/ackhandler/mockgen.go +++ b/vendor/github.com/quic-go/quic-go/internal/ackhandler/mockgen.go @@ -2,7 +2,7 @@ package ackhandler -//go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package ackhandler -destination mock_sent_packet_tracker_test.go github.com/quic-go/quic-go/internal/ackhandler SentPacketTracker" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package ackhandler -destination mock_sent_packet_tracker_test.go github.com/quic-go/quic-go/internal/ackhandler SentPacketTracker" type SentPacketTracker = sentPacketTracker //go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package ackhandler -destination mock_ecn_handler_test.go github.com/quic-go/quic-go/internal/ackhandler ECNHandler" diff --git a/vendor/github.com/quic-go/quic-go/internal/ackhandler/packet_number_generator.go b/vendor/github.com/quic-go/quic-go/internal/ackhandler/packet_number_generator.go index e84171e3c..4a9db8635 100644 --- a/vendor/github.com/quic-go/quic-go/internal/ackhandler/packet_number_generator.go +++ b/vendor/github.com/quic-go/quic-go/internal/ackhandler/packet_number_generator.go @@ -80,5 +80,5 @@ func (p *skippingPacketNumberGenerator) Pop() (bool, protocol.PacketNumber) { func (p *skippingPacketNumberGenerator) generateNewSkip() { // make sure that there are never two consecutive packet numbers that are skipped p.nextToSkip = p.next + 3 + protocol.PacketNumber(p.rng.Int31n(int32(2*p.period))) - p.period = utils.Min(2*p.period, p.maxPeriod) + p.period = min(2*p.period, p.maxPeriod) } diff --git a/vendor/github.com/quic-go/quic-go/internal/ackhandler/received_packet_handler.go b/vendor/github.com/quic-go/quic-go/internal/ackhandler/received_packet_handler.go index b37f91c5c..1175c790b 100644 --- a/vendor/github.com/quic-go/quic-go/internal/ackhandler/received_packet_handler.go +++ b/vendor/github.com/quic-go/quic-go/internal/ackhandler/received_packet_handler.go @@ -14,23 +14,19 @@ type receivedPacketHandler struct { initialPackets *receivedPacketTracker handshakePackets *receivedPacketTracker - appDataPackets *receivedPacketTracker + appDataPackets appDataReceivedPacketTracker lowest1RTTPacket protocol.PacketNumber } var _ ReceivedPacketHandler = &receivedPacketHandler{} -func newReceivedPacketHandler( - sentPackets sentPacketTracker, - rttStats *utils.RTTStats, - logger utils.Logger, -) ReceivedPacketHandler { +func newReceivedPacketHandler(sentPackets sentPacketTracker, logger utils.Logger) ReceivedPacketHandler { return &receivedPacketHandler{ sentPackets: sentPackets, - initialPackets: newReceivedPacketTracker(rttStats, logger), - handshakePackets: newReceivedPacketTracker(rttStats, logger), - appDataPackets: newReceivedPacketTracker(rttStats, logger), + initialPackets: newReceivedPacketTracker(), + handshakePackets: newReceivedPacketTracker(), + appDataPackets: *newAppDataReceivedPacketTracker(logger), lowest1RTTPacket: protocol.InvalidPacketNumber, } } @@ -88,41 +84,28 @@ func (h *receivedPacketHandler) DropPackets(encLevel protocol.EncryptionLevel) { } func (h *receivedPacketHandler) GetAlarmTimeout() time.Time { - var initialAlarm, handshakeAlarm time.Time - if h.initialPackets != nil { - initialAlarm = h.initialPackets.GetAlarmTimeout() - } - if h.handshakePackets != nil { - handshakeAlarm = h.handshakePackets.GetAlarmTimeout() - } - oneRTTAlarm := h.appDataPackets.GetAlarmTimeout() - return utils.MinNonZeroTime(utils.MinNonZeroTime(initialAlarm, handshakeAlarm), oneRTTAlarm) + return h.appDataPackets.GetAlarmTimeout() } func (h *receivedPacketHandler) GetAckFrame(encLevel protocol.EncryptionLevel, onlyIfQueued bool) *wire.AckFrame { - var ack *wire.AckFrame //nolint:exhaustive // 0-RTT packets can't contain ACK frames. switch encLevel { case protocol.EncryptionInitial: if h.initialPackets != nil { - ack = h.initialPackets.GetAckFrame(onlyIfQueued) + return h.initialPackets.GetAckFrame() } + return nil case protocol.EncryptionHandshake: if h.handshakePackets != nil { - ack = h.handshakePackets.GetAckFrame(onlyIfQueued) + return h.handshakePackets.GetAckFrame() } + return nil case protocol.Encryption1RTT: - // 0-RTT packets can't contain ACK frames return h.appDataPackets.GetAckFrame(onlyIfQueued) default: + // 0-RTT packets can't contain ACK frames return nil } - // For Initial and Handshake ACKs, the delay time is ignored by the receiver. - // Set it to 0 in order to save bytes. - if ack != nil { - ack.DelayTime = 0 - } - return ack } func (h *receivedPacketHandler) IsPotentiallyDuplicate(pn protocol.PacketNumber, encLevel protocol.EncryptionLevel) bool { diff --git a/vendor/github.com/quic-go/quic-go/internal/ackhandler/received_packet_tracker.go b/vendor/github.com/quic-go/quic-go/internal/ackhandler/received_packet_tracker.go index 7fd071e68..08af6f1ee 100644 --- a/vendor/github.com/quic-go/quic-go/internal/ackhandler/received_packet_tracker.go +++ b/vendor/github.com/quic-go/quic-go/internal/ackhandler/received_packet_tracker.go @@ -9,40 +9,19 @@ import ( "github.com/quic-go/quic-go/internal/wire" ) -// number of ack-eliciting packets received before sending an ack. -const packetsBeforeAck = 2 - +// The receivedPacketTracker tracks packets for the Initial and Handshake packet number space. +// Every received packet is acknowledged immediately. type receivedPacketTracker struct { - largestObserved protocol.PacketNumber - ignoreBelow protocol.PacketNumber - largestObservedRcvdTime time.Time - ect0, ect1, ecnce uint64 + ect0, ect1, ecnce uint64 - packetHistory *receivedPacketHistory - - maxAckDelay time.Duration - rttStats *utils.RTTStats + packetHistory receivedPacketHistory + lastAck *wire.AckFrame hasNewAck bool // true as soon as we received an ack-eliciting new packet - ackQueued bool // true once we received more than 2 (or later in the connection 10) ack-eliciting packets - - ackElicitingPacketsReceivedSinceLastAck int - ackAlarm time.Time - lastAck *wire.AckFrame - - logger utils.Logger } -func newReceivedPacketTracker( - rttStats *utils.RTTStats, - logger utils.Logger, -) *receivedPacketTracker { - return &receivedPacketTracker{ - packetHistory: newReceivedPacketHistory(), - maxAckDelay: protocol.MaxAckDelay, - rttStats: rttStats, - logger: logger, - } +func newReceivedPacketTracker() *receivedPacketTracker { + return &receivedPacketTracker{packetHistory: *newReceivedPacketHistory()} } func (h *receivedPacketTracker) ReceivedPacket(pn protocol.PacketNumber, ecn protocol.ECN, rcvTime time.Time, ackEliciting bool) error { @@ -50,19 +29,7 @@ func (h *receivedPacketTracker) ReceivedPacket(pn protocol.PacketNumber, ecn pro return fmt.Errorf("recevedPacketTracker BUG: ReceivedPacket called for old / duplicate packet %d", pn) } - isMissing := h.isMissing(pn) - if pn >= h.largestObserved { - h.largestObserved = pn - h.largestObservedRcvdTime = rcvTime - } - - if ackEliciting { - h.hasNewAck = true - } - if ackEliciting { - h.maybeQueueACK(pn, rcvTime, isMissing) - } - //nolint:exhaustive // Only need to count ECT(0), ECT(1) and ECNCE. + //nolint:exhaustive // Only need to count ECT(0), ECT(1) and ECN-CE. switch ecn { case protocol.ECT0: h.ect0++ @@ -71,12 +38,99 @@ func (h *receivedPacketTracker) ReceivedPacket(pn protocol.PacketNumber, ecn pro case protocol.ECNCE: h.ecnce++ } + if !ackEliciting { + return nil + } + h.hasNewAck = true + return nil +} + +func (h *receivedPacketTracker) GetAckFrame() *wire.AckFrame { + if !h.hasNewAck { + return nil + } + + // This function always returns the same ACK frame struct, filled with the most recent values. + ack := h.lastAck + if ack == nil { + ack = &wire.AckFrame{} + } + ack.Reset() + ack.ECT0 = h.ect0 + ack.ECT1 = h.ect1 + ack.ECNCE = h.ecnce + ack.AckRanges = h.packetHistory.AppendAckRanges(ack.AckRanges) + + h.lastAck = ack + h.hasNewAck = false + return ack +} + +func (h *receivedPacketTracker) IsPotentiallyDuplicate(pn protocol.PacketNumber) bool { + return h.packetHistory.IsPotentiallyDuplicate(pn) +} + +// number of ack-eliciting packets received before sending an ACK +const packetsBeforeAck = 2 + +// The appDataReceivedPacketTracker tracks packets received in the Application Data packet number space. +// It waits until at least 2 packets were received before queueing an ACK, or until the max_ack_delay was reached. +type appDataReceivedPacketTracker struct { + receivedPacketTracker + + largestObservedRcvdTime time.Time + + largestObserved protocol.PacketNumber + ignoreBelow protocol.PacketNumber + + maxAckDelay time.Duration + ackQueued bool // true if we need send a new ACK + + ackElicitingPacketsReceivedSinceLastAck int + ackAlarm time.Time + + logger utils.Logger +} + +func newAppDataReceivedPacketTracker(logger utils.Logger) *appDataReceivedPacketTracker { + h := &appDataReceivedPacketTracker{ + receivedPacketTracker: *newReceivedPacketTracker(), + maxAckDelay: protocol.MaxAckDelay, + logger: logger, + } + return h +} + +func (h *appDataReceivedPacketTracker) ReceivedPacket(pn protocol.PacketNumber, ecn protocol.ECN, rcvTime time.Time, ackEliciting bool) error { + if err := h.receivedPacketTracker.ReceivedPacket(pn, ecn, rcvTime, ackEliciting); err != nil { + return err + } + if pn >= h.largestObserved { + h.largestObserved = pn + h.largestObservedRcvdTime = rcvTime + } + if !ackEliciting { + return nil + } + h.ackElicitingPacketsReceivedSinceLastAck++ + isMissing := h.isMissing(pn) + if !h.ackQueued && h.shouldQueueACK(pn, ecn, isMissing) { + h.ackQueued = true + h.ackAlarm = time.Time{} // cancel the ack alarm + } + if !h.ackQueued { + // No ACK queued, but we'll need to acknowledge the packet after max_ack_delay. + h.ackAlarm = rcvTime.Add(h.maxAckDelay) + if h.logger.Debug() { + h.logger.Debugf("\tSetting ACK timer to max ack delay: %s", h.maxAckDelay) + } + } return nil } // IgnoreBelow sets a lower limit for acknowledging packets. // Packets with packet numbers smaller than p will not be acked. -func (h *receivedPacketTracker) IgnoreBelow(pn protocol.PacketNumber) { +func (h *appDataReceivedPacketTracker) IgnoreBelow(pn protocol.PacketNumber) { if pn <= h.ignoreBelow { return } @@ -88,14 +142,14 @@ func (h *receivedPacketTracker) IgnoreBelow(pn protocol.PacketNumber) { } // isMissing says if a packet was reported missing in the last ACK. -func (h *receivedPacketTracker) isMissing(p protocol.PacketNumber) bool { +func (h *appDataReceivedPacketTracker) isMissing(p protocol.PacketNumber) bool { if h.lastAck == nil || p < h.ignoreBelow { return false } return p < h.lastAck.LargestAcked() && !h.lastAck.AcksPacket(p) } -func (h *receivedPacketTracker) hasNewMissingPackets() bool { +func (h *appDataReceivedPacketTracker) hasNewMissingPackets() bool { if h.lastAck == nil { return false } @@ -103,31 +157,21 @@ func (h *receivedPacketTracker) hasNewMissingPackets() bool { return highestRange.Smallest > h.lastAck.LargestAcked()+1 && highestRange.Len() == 1 } -// maybeQueueACK queues an ACK, if necessary. -func (h *receivedPacketTracker) maybeQueueACK(pn protocol.PacketNumber, rcvTime time.Time, wasMissing bool) { +func (h *appDataReceivedPacketTracker) shouldQueueACK(pn protocol.PacketNumber, ecn protocol.ECN, wasMissing bool) bool { // always acknowledge the first packet if h.lastAck == nil { - if !h.ackQueued { - h.logger.Debugf("\tQueueing ACK because the first packet should be acknowledged.") - } - h.ackQueued = true - return + h.logger.Debugf("\tQueueing ACK because the first packet should be acknowledged.") + return true } - if h.ackQueued { - return - } - - h.ackElicitingPacketsReceivedSinceLastAck++ - // Send an ACK if this packet was reported missing in an ACK sent before. // Ack decimation with reordering relies on the timer to send an ACK, but if - // missing packets we reported in the previous ack, send an ACK immediately. + // missing packets we reported in the previous ACK, send an ACK immediately. if wasMissing { if h.logger.Debug() { h.logger.Debugf("\tQueueing ACK because packet %d was missing before.", pn) } - h.ackQueued = true + return true } // send an ACK every 2 ack-eliciting packets @@ -135,62 +179,42 @@ func (h *receivedPacketTracker) maybeQueueACK(pn protocol.PacketNumber, rcvTime if h.logger.Debug() { h.logger.Debugf("\tQueueing ACK because packet %d packets were received after the last ACK (using initial threshold: %d).", h.ackElicitingPacketsReceivedSinceLastAck, packetsBeforeAck) } - h.ackQueued = true - } else if h.ackAlarm.IsZero() { - if h.logger.Debug() { - h.logger.Debugf("\tSetting ACK timer to max ack delay: %s", h.maxAckDelay) - } - h.ackAlarm = rcvTime.Add(h.maxAckDelay) + return true } - // Queue an ACK if there are new missing packets to report. + // queue an ACK if there are new missing packets to report if h.hasNewMissingPackets() { h.logger.Debugf("\tQueuing ACK because there's a new missing packet to report.") - h.ackQueued = true + return true } - if h.ackQueued { - // cancel the ack alarm - h.ackAlarm = time.Time{} + // queue an ACK if the packet was ECN-CE marked + if ecn == protocol.ECNCE { + h.logger.Debugf("\tQueuing ACK because the packet was ECN-CE marked.") + return true } + return false } -func (h *receivedPacketTracker) GetAckFrame(onlyIfQueued bool) *wire.AckFrame { - if !h.hasNewAck { - return nil - } +func (h *appDataReceivedPacketTracker) GetAckFrame(onlyIfQueued bool) *wire.AckFrame { now := time.Now() - if onlyIfQueued { - if !h.ackQueued && (h.ackAlarm.IsZero() || h.ackAlarm.After(now)) { + if onlyIfQueued && !h.ackQueued { + if h.ackAlarm.IsZero() || h.ackAlarm.After(now) { return nil } - if h.logger.Debug() && !h.ackQueued && !h.ackAlarm.IsZero() { + if h.logger.Debug() && !h.ackAlarm.IsZero() { h.logger.Debugf("Sending ACK because the ACK timer expired.") } } - - // This function always returns the same ACK frame struct, filled with the most recent values. - ack := h.lastAck + ack := h.receivedPacketTracker.GetAckFrame() if ack == nil { - ack = &wire.AckFrame{} + return nil } - ack.Reset() - ack.DelayTime = utils.Max(0, now.Sub(h.largestObservedRcvdTime)) - ack.ECT0 = h.ect0 - ack.ECT1 = h.ect1 - ack.ECNCE = h.ecnce - ack.AckRanges = h.packetHistory.AppendAckRanges(ack.AckRanges) - - h.lastAck = ack - h.ackAlarm = time.Time{} + ack.DelayTime = max(0, now.Sub(h.largestObservedRcvdTime)) h.ackQueued = false - h.hasNewAck = false + h.ackAlarm = time.Time{} h.ackElicitingPacketsReceivedSinceLastAck = 0 return ack } -func (h *receivedPacketTracker) GetAlarmTimeout() time.Time { return h.ackAlarm } - -func (h *receivedPacketTracker) IsPotentiallyDuplicate(pn protocol.PacketNumber) bool { - return h.packetHistory.IsPotentiallyDuplicate(pn) -} +func (h *appDataReceivedPacketTracker) GetAlarmTimeout() time.Time { return h.ackAlarm } diff --git a/vendor/github.com/quic-go/quic-go/internal/ackhandler/sent_packet_handler.go b/vendor/github.com/quic-go/quic-go/internal/ackhandler/sent_packet_handler.go index c8265a78d..3cef89239 100644 --- a/vendor/github.com/quic-go/quic-go/internal/ackhandler/sent_packet_handler.go +++ b/vendor/github.com/quic-go/quic-go/internal/ackhandler/sent_packet_handler.go @@ -245,7 +245,7 @@ func (h *sentPacketHandler) SentPacket( pnSpace := h.getPacketNumberSpace(encLevel) if h.logger.Debug() && pnSpace.history.HasOutstandingPackets() { - for p := utils.Max(0, pnSpace.largestSent+1); p < pn; p++ { + for p := max(0, pnSpace.largestSent+1); p < pn; p++ { h.logger.Debugf("Skipping packet number %d", p) } } @@ -336,7 +336,7 @@ func (h *sentPacketHandler) ReceivedAck(ack *wire.AckFrame, encLevel protocol.En // don't use the ack delay for Initial and Handshake packets var ackDelay time.Duration if encLevel == protocol.Encryption1RTT { - ackDelay = utils.Min(ack.DelayTime, h.rttStats.MaxAckDelay()) + ackDelay = min(ack.DelayTime, h.rttStats.MaxAckDelay()) } h.rttStats.UpdateRTT(rcvTime.Sub(p.SendTime), ackDelay, rcvTime) if h.logger.Debug() { @@ -354,7 +354,7 @@ func (h *sentPacketHandler) ReceivedAck(ack *wire.AckFrame, encLevel protocol.En } } - pnSpace.largestAcked = utils.Max(pnSpace.largestAcked, largestAcked) + pnSpace.largestAcked = max(pnSpace.largestAcked, largestAcked) if err := h.detectLostPackets(rcvTime, encLevel); err != nil { return false, err @@ -446,7 +446,7 @@ func (h *sentPacketHandler) detectAndRemoveAckedPackets(ack *wire.AckFrame, encL for _, p := range h.ackedPackets { if p.LargestAcked != protocol.InvalidPacketNumber && encLevel == protocol.Encryption1RTT { - h.lowestNotConfirmedAcked = utils.Max(h.lowestNotConfirmedAcked, p.LargestAcked+1) + h.lowestNotConfirmedAcked = max(h.lowestNotConfirmedAcked, p.LargestAcked+1) } for _, f := range p.Frames { @@ -607,11 +607,11 @@ func (h *sentPacketHandler) detectLostPackets(now time.Time, encLevel protocol.E pnSpace := h.getPacketNumberSpace(encLevel) pnSpace.lossTime = time.Time{} - maxRTT := float64(utils.Max(h.rttStats.LatestRTT(), h.rttStats.SmoothedRTT())) + maxRTT := float64(max(h.rttStats.LatestRTT(), h.rttStats.SmoothedRTT())) lossDelay := time.Duration(timeThreshold * maxRTT) // Minimum time of granularity before packets are deemed lost. - lossDelay = utils.Max(lossDelay, protocol.TimerGranularity) + lossDelay = max(lossDelay, protocol.TimerGranularity) // Packets sent before this time are deemed lost. lostSendTime := now.Add(-lossDelay) @@ -890,7 +890,7 @@ func (h *sentPacketHandler) ResetForRetry(now time.Time) error { // Otherwise, we don't know which Initial the Retry was sent in response to. if h.ptoCount == 0 { // Don't set the RTT to a value lower than 5ms here. - h.rttStats.UpdateRTT(utils.Max(minRTTAfterRetry, now.Sub(firstPacketSendTime)), 0, now) + h.rttStats.UpdateRTT(max(minRTTAfterRetry, now.Sub(firstPacketSendTime)), 0, now) if h.logger.Debug() { h.logger.Debugf("\tupdated RTT: %s (σ: %s)", h.rttStats.SmoothedRTT(), h.rttStats.MeanDeviation()) } diff --git a/vendor/github.com/quic-go/quic-go/internal/congestion/cubic.go b/vendor/github.com/quic-go/quic-go/internal/congestion/cubic.go index a73cf82aa..b35d40d41 100644 --- a/vendor/github.com/quic-go/quic-go/internal/congestion/cubic.go +++ b/vendor/github.com/quic-go/quic-go/internal/congestion/cubic.go @@ -5,7 +5,6 @@ import ( "time" "github.com/quic-go/quic-go/internal/protocol" - "github.com/quic-go/quic-go/internal/utils" ) // This cubic implementation is based on the one found in Chromiums's QUIC @@ -18,11 +17,11 @@ import ( // 1024*1024^3 (first 1024 is from 0.100^3) // where 0.100 is 100 ms which is the scaling round trip time. const ( - cubeScale = 40 - cubeCongestionWindowScale = 410 - cubeFactor protocol.ByteCount = 1 << cubeScale / cubeCongestionWindowScale / maxDatagramSize + cubeScale = 40 + cubeCongestionWindowScale = 410 + cubeFactor = 1 << cubeScale / cubeCongestionWindowScale / maxDatagramSize // TODO: when re-enabling cubic, make sure to use the actual packet size here - maxDatagramSize = protocol.ByteCount(protocol.InitialPacketSizeIPv4) + maxDatagramSize = protocol.ByteCount(protocol.InitialPacketSize) ) const defaultNumConnections = 1 @@ -187,7 +186,7 @@ func (c *Cubic) CongestionWindowAfterAck( targetCongestionWindow = c.originPointCongestionWindow - deltaCongestionWindow } // Limit the CWND increase to half the acked bytes. - targetCongestionWindow = utils.Min(targetCongestionWindow, currentCongestionWindow+c.ackedBytesCount/2) + targetCongestionWindow = min(targetCongestionWindow, currentCongestionWindow+c.ackedBytesCount/2) // Increase the window by approximately Alpha * 1 MSS of bytes every // time we ack an estimated tcp window of bytes. For small diff --git a/vendor/github.com/quic-go/quic-go/internal/congestion/cubic_sender.go b/vendor/github.com/quic-go/quic-go/internal/congestion/cubic_sender.go index ee558f2d5..075b08e00 100644 --- a/vendor/github.com/quic-go/quic-go/internal/congestion/cubic_sender.go +++ b/vendor/github.com/quic-go/quic-go/internal/congestion/cubic_sender.go @@ -12,7 +12,7 @@ import ( const ( // maxDatagramSize is the default maximum packet size used in the Linux TCP implementation. // Used in QUIC for congestion window computations in bytes. - initialMaxDatagramSize = protocol.ByteCount(protocol.InitialPacketSizeIPv4) + initialMaxDatagramSize = protocol.ByteCount(protocol.InitialPacketSize) maxBurstPackets = 3 renoBeta = 0.7 // Reno backoff factor. minCongestionWindowPackets = 2 @@ -178,7 +178,7 @@ func (c *cubicSender) OnPacketAcked( priorInFlight protocol.ByteCount, eventTime time.Time, ) { - c.largestAckedPacketNumber = utils.Max(ackedPacketNumber, c.largestAckedPacketNumber) + c.largestAckedPacketNumber = max(ackedPacketNumber, c.largestAckedPacketNumber) if c.InRecovery() { return } @@ -246,7 +246,7 @@ func (c *cubicSender) maybeIncreaseCwnd( c.numAckedPackets = 0 } } else { - c.congestionWindow = utils.Min(c.maxCongestionWindow(), c.cubic.CongestionWindowAfterAck(ackedBytes, c.congestionWindow, c.rttStats.MinRTT(), eventTime)) + c.congestionWindow = min(c.maxCongestionWindow(), c.cubic.CongestionWindowAfterAck(ackedBytes, c.congestionWindow, c.rttStats.MinRTT(), eventTime)) } } diff --git a/vendor/github.com/quic-go/quic-go/internal/congestion/hybrid_slow_start.go b/vendor/github.com/quic-go/quic-go/internal/congestion/hybrid_slow_start.go index b2f7c908e..9679d9e46 100644 --- a/vendor/github.com/quic-go/quic-go/internal/congestion/hybrid_slow_start.go +++ b/vendor/github.com/quic-go/quic-go/internal/congestion/hybrid_slow_start.go @@ -4,7 +4,6 @@ import ( "time" "github.com/quic-go/quic-go/internal/protocol" - "github.com/quic-go/quic-go/internal/utils" ) // Note(pwestin): the magic clamping numbers come from the original code in @@ -75,8 +74,8 @@ func (s *HybridSlowStart) ShouldExitSlowStart(latestRTT time.Duration, minRTT ti // Divide minRTT by 8 to get a rtt increase threshold for exiting. minRTTincreaseThresholdUs := int64(minRTT / time.Microsecond >> hybridStartDelayFactorExp) // Ensure the rtt threshold is never less than 2ms or more than 16ms. - minRTTincreaseThresholdUs = utils.Min(minRTTincreaseThresholdUs, hybridStartDelayMaxThresholdUs) - minRTTincreaseThreshold := time.Duration(utils.Max(minRTTincreaseThresholdUs, hybridStartDelayMinThresholdUs)) * time.Microsecond + minRTTincreaseThresholdUs = min(minRTTincreaseThresholdUs, hybridStartDelayMaxThresholdUs) + minRTTincreaseThreshold := time.Duration(max(minRTTincreaseThresholdUs, hybridStartDelayMinThresholdUs)) * time.Microsecond if s.currentMinRTT > (minRTT + minRTTincreaseThreshold) { s.hystartFound = true diff --git a/vendor/github.com/quic-go/quic-go/internal/congestion/pacer.go b/vendor/github.com/quic-go/quic-go/internal/congestion/pacer.go index 09ea26806..34d3d1d09 100644 --- a/vendor/github.com/quic-go/quic-go/internal/congestion/pacer.go +++ b/vendor/github.com/quic-go/quic-go/internal/congestion/pacer.go @@ -1,11 +1,9 @@ package congestion import ( - "math" "time" "github.com/quic-go/quic-go/internal/protocol" - "github.com/quic-go/quic-go/internal/utils" ) const maxBurstSizePackets = 10 @@ -26,7 +24,7 @@ func newPacer(getBandwidth func() Bandwidth) *pacer { bw := uint64(getBandwidth() / BytesPerSecond) // Use a slightly higher value than the actual measured bandwidth. // RTT variations then won't result in under-utilization of the congestion window. - // Ultimately, this will result in sending packets as acknowledgments are received rather than when timers fire, + // Ultimately, this will result in sending packets as acknowledgments are received rather than when timers fire, // provided the congestion window is fully utilized and acknowledgments arrive at regular intervals. return bw * 5 / 4 }, @@ -37,7 +35,7 @@ func newPacer(getBandwidth func() Bandwidth) *pacer { func (p *pacer) SentPacket(sendTime time.Time, size protocol.ByteCount) { budget := p.Budget(sendTime) - if size > budget { + if size >= budget { p.budgetAtLastSent = 0 } else { p.budgetAtLastSent = budget - size @@ -53,11 +51,11 @@ func (p *pacer) Budget(now time.Time) protocol.ByteCount { if budget < 0 { // protect against overflows budget = protocol.MaxByteCount } - return utils.Min(p.maxBurstSize(), budget) + return min(p.maxBurstSize(), budget) } func (p *pacer) maxBurstSize() protocol.ByteCount { - return utils.Max( + return max( protocol.ByteCount(uint64((protocol.MinPacingDelay+protocol.TimerGranularity).Nanoseconds())*p.adjustedBandwidth())/1e9, maxBurstSizePackets*p.maxDatagramSize, ) @@ -69,10 +67,16 @@ func (p *pacer) TimeUntilSend() time.Time { if p.budgetAtLastSent >= p.maxDatagramSize { return time.Time{} } - return p.lastSentTime.Add(utils.Max( - protocol.MinPacingDelay, - time.Duration(math.Ceil(float64(p.maxDatagramSize-p.budgetAtLastSent)*1e9/float64(p.adjustedBandwidth())))*time.Nanosecond, - )) + diff := 1e9 * uint64(p.maxDatagramSize-p.budgetAtLastSent) + bw := p.adjustedBandwidth() + // We might need to round up this value. + // Otherwise, we might have a budget (slightly) smaller than the datagram size when the timer expires. + d := diff / bw + // this is effectively a math.Ceil, but using only integer math + if diff%bw > 0 { + d++ + } + return p.lastSentTime.Add(max(protocol.MinPacingDelay, time.Duration(d)*time.Nanosecond)) } func (p *pacer) SetMaxDatagramSize(s protocol.ByteCount) { diff --git a/vendor/github.com/quic-go/quic-go/internal/flowcontrol/base_flow_controller.go b/vendor/github.com/quic-go/quic-go/internal/flowcontrol/base_flow_controller.go index f3f24a60e..3d88d577e 100644 --- a/vendor/github.com/quic-go/quic-go/internal/flowcontrol/base_flow_controller.go +++ b/vendor/github.com/quic-go/quic-go/internal/flowcontrol/base_flow_controller.go @@ -48,10 +48,12 @@ func (c *baseFlowController) AddBytesSent(n protocol.ByteCount) { } // UpdateSendWindow is called after receiving a MAX_{STREAM_}DATA frame. -func (c *baseFlowController) UpdateSendWindow(offset protocol.ByteCount) { +func (c *baseFlowController) UpdateSendWindow(offset protocol.ByteCount) (updated bool) { if offset > c.sendWindow { c.sendWindow = offset + return true } + return false } func (c *baseFlowController) sendWindowSize() protocol.ByteCount { @@ -107,7 +109,7 @@ func (c *baseFlowController) maybeAdjustWindowSize() { now := time.Now() if now.Sub(c.epochStartTime) < time.Duration(4*fraction*float64(rtt)) { // window is consumed too fast, try to increase the window size - newSize := utils.Min(2*c.receiveWindowSize, c.maxReceiveWindowSize) + newSize := min(2*c.receiveWindowSize, c.maxReceiveWindowSize) if newSize > c.receiveWindowSize && (c.allowWindowIncrease == nil || c.allowWindowIncrease(newSize-c.receiveWindowSize)) { c.receiveWindowSize = newSize } diff --git a/vendor/github.com/quic-go/quic-go/internal/flowcontrol/connection_flow_controller.go b/vendor/github.com/quic-go/quic-go/internal/flowcontrol/connection_flow_controller.go index 13e69d6c4..8504cdcf5 100644 --- a/vendor/github.com/quic-go/quic-go/internal/flowcontrol/connection_flow_controller.go +++ b/vendor/github.com/quic-go/quic-go/internal/flowcontrol/connection_flow_controller.go @@ -87,7 +87,7 @@ func (c *connectionFlowController) EnsureMinimumWindowSize(inc protocol.ByteCoun c.mutex.Lock() if inc > c.receiveWindowSize { c.logger.Debugf("Increasing receive flow control window for the connection to %d kB, in response to stream flow control window increase", c.receiveWindowSize/(1<<10)) - newSize := utils.Min(inc, c.maxReceiveWindowSize) + newSize := min(inc, c.maxReceiveWindowSize) if delta := newSize - c.receiveWindowSize; delta > 0 && c.allowWindowIncrease(delta) { c.receiveWindowSize = newSize } diff --git a/vendor/github.com/quic-go/quic-go/internal/flowcontrol/interface.go b/vendor/github.com/quic-go/quic-go/internal/flowcontrol/interface.go index 946519d52..fc5f9de0a 100644 --- a/vendor/github.com/quic-go/quic-go/internal/flowcontrol/interface.go +++ b/vendor/github.com/quic-go/quic-go/internal/flowcontrol/interface.go @@ -5,7 +5,7 @@ import "github.com/quic-go/quic-go/internal/protocol" type flowController interface { // for sending SendWindowSize() protocol.ByteCount - UpdateSendWindow(protocol.ByteCount) + UpdateSendWindow(protocol.ByteCount) (updated bool) AddBytesSent(protocol.ByteCount) // for receiving AddBytesRead(protocol.ByteCount) @@ -16,12 +16,11 @@ type flowController interface { // A StreamFlowController is a flow controller for a QUIC stream. type StreamFlowController interface { flowController - // for receiving - // UpdateHighestReceived should be called when a new highest offset is received + // UpdateHighestReceived is called when a new highest offset is received // final has to be to true if this is the final offset of the stream, // as contained in a STREAM frame with FIN bit, and the RESET_STREAM frame UpdateHighestReceived(offset protocol.ByteCount, final bool) error - // Abandon should be called when reading from the stream is aborted early, + // Abandon is called when reading from the stream is aborted early, // and there won't be any further calls to AddBytesRead. Abandon() } diff --git a/vendor/github.com/quic-go/quic-go/internal/flowcontrol/stream_flow_controller.go b/vendor/github.com/quic-go/quic-go/internal/flowcontrol/stream_flow_controller.go index 1770a9c84..ccee287dc 100644 --- a/vendor/github.com/quic-go/quic-go/internal/flowcontrol/stream_flow_controller.go +++ b/vendor/github.com/quic-go/quic-go/internal/flowcontrol/stream_flow_controller.go @@ -111,6 +111,7 @@ func (c *streamFlowController) AddBytesRead(n protocol.ByteCount) { func (c *streamFlowController) Abandon() { c.mutex.Lock() unread := c.highestReceived - c.bytesRead + c.bytesRead = c.highestReceived c.mutex.Unlock() if unread > 0 { c.connection.AddBytesRead(unread) @@ -123,7 +124,7 @@ func (c *streamFlowController) AddBytesSent(n protocol.ByteCount) { } func (c *streamFlowController) SendWindowSize() protocol.ByteCount { - return utils.Min(c.baseFlowController.sendWindowSize(), c.connection.SendWindowSize()) + return min(c.baseFlowController.sendWindowSize(), c.connection.SendWindowSize()) } func (c *streamFlowController) shouldQueueWindowUpdate() bool { diff --git a/vendor/github.com/quic-go/quic-go/internal/handshake/aead.go b/vendor/github.com/quic-go/quic-go/internal/handshake/aead.go index 6aa89fb3f..1baf5d6b0 100644 --- a/vendor/github.com/quic-go/quic-go/internal/handshake/aead.go +++ b/vendor/github.com/quic-go/quic-go/internal/handshake/aead.go @@ -1,14 +1,12 @@ package handshake import ( - "crypto/cipher" "encoding/binary" "github.com/quic-go/quic-go/internal/protocol" - "github.com/quic-go/quic-go/internal/utils" ) -func createAEAD(suite *cipherSuite, trafficSecret []byte, v protocol.VersionNumber) cipher.AEAD { +func createAEAD(suite *cipherSuite, trafficSecret []byte, v protocol.Version) *xorNonceAEAD { keyLabel := hkdfLabelKeyV1 ivLabel := hkdfLabelIVV1 if v == protocol.Version2 { @@ -21,28 +19,26 @@ func createAEAD(suite *cipherSuite, trafficSecret []byte, v protocol.VersionNumb } type longHeaderSealer struct { - aead cipher.AEAD + aead *xorNonceAEAD headerProtector headerProtector - - // use a single slice to avoid allocations - nonceBuf []byte + nonceBuf [8]byte } var _ LongHeaderSealer = &longHeaderSealer{} -func newLongHeaderSealer(aead cipher.AEAD, headerProtector headerProtector) LongHeaderSealer { +func newLongHeaderSealer(aead *xorNonceAEAD, headerProtector headerProtector) LongHeaderSealer { + if aead.NonceSize() != 8 { + panic("unexpected nonce size") + } return &longHeaderSealer{ aead: aead, headerProtector: headerProtector, - nonceBuf: make([]byte, aead.NonceSize()), } } func (s *longHeaderSealer) Seal(dst, src []byte, pn protocol.PacketNumber, ad []byte) []byte { - binary.BigEndian.PutUint64(s.nonceBuf[len(s.nonceBuf)-8:], uint64(pn)) - // The AEAD we're using here will be the qtls.aeadAESGCM13. - // It uses the nonce provided here and XOR it with the IV. - return s.aead.Seal(dst, s.nonceBuf, src, ad) + binary.BigEndian.PutUint64(s.nonceBuf[:], uint64(pn)) + return s.aead.Seal(dst, s.nonceBuf[:], src, ad) } func (s *longHeaderSealer) EncryptHeader(sample []byte, firstByte *byte, pnBytes []byte) { @@ -54,21 +50,23 @@ func (s *longHeaderSealer) Overhead() int { } type longHeaderOpener struct { - aead cipher.AEAD + aead *xorNonceAEAD headerProtector headerProtector highestRcvdPN protocol.PacketNumber // highest packet number received (which could be successfully unprotected) - // use a single slice to avoid allocations - nonceBuf []byte + // use a single array to avoid allocations + nonceBuf [8]byte } var _ LongHeaderOpener = &longHeaderOpener{} -func newLongHeaderOpener(aead cipher.AEAD, headerProtector headerProtector) LongHeaderOpener { +func newLongHeaderOpener(aead *xorNonceAEAD, headerProtector headerProtector) LongHeaderOpener { + if aead.NonceSize() != 8 { + panic("unexpected nonce size") + } return &longHeaderOpener{ aead: aead, headerProtector: headerProtector, - nonceBuf: make([]byte, aead.NonceSize()), } } @@ -77,12 +75,10 @@ func (o *longHeaderOpener) DecodePacketNumber(wirePN protocol.PacketNumber, wire } func (o *longHeaderOpener) Open(dst, src []byte, pn protocol.PacketNumber, ad []byte) ([]byte, error) { - binary.BigEndian.PutUint64(o.nonceBuf[len(o.nonceBuf)-8:], uint64(pn)) - // The AEAD we're using here will be the qtls.aeadAESGCM13. - // It uses the nonce provided here and XOR it with the IV. - dec, err := o.aead.Open(dst, o.nonceBuf, src, ad) + binary.BigEndian.PutUint64(o.nonceBuf[:], uint64(pn)) + dec, err := o.aead.Open(dst, o.nonceBuf[:], src, ad) if err == nil { - o.highestRcvdPN = utils.Max(o.highestRcvdPN, pn) + o.highestRcvdPN = max(o.highestRcvdPN, pn) } else { err = ErrDecryptionFailed } diff --git a/vendor/github.com/quic-go/quic-go/internal/handshake/cipher_suite.go b/vendor/github.com/quic-go/quic-go/internal/handshake/cipher_suite.go index 265231f0c..d8a381daf 100644 --- a/vendor/github.com/quic-go/quic-go/internal/handshake/cipher_suite.go +++ b/vendor/github.com/quic-go/quic-go/internal/handshake/cipher_suite.go @@ -18,7 +18,7 @@ type cipherSuite struct { ID uint16 Hash crypto.Hash KeyLen int - AEAD func(key, nonceMask []byte) cipher.AEAD + AEAD func(key, nonceMask []byte) *xorNonceAEAD } func (s cipherSuite) IVLen() int { return aeadNonceLength } @@ -36,7 +36,7 @@ func getCipherSuite(id uint16) *cipherSuite { } } -func aeadAESGCMTLS13(key, nonceMask []byte) cipher.AEAD { +func aeadAESGCMTLS13(key, nonceMask []byte) *xorNonceAEAD { if len(nonceMask) != aeadNonceLength { panic("tls: internal error: wrong nonce length") } @@ -54,7 +54,7 @@ func aeadAESGCMTLS13(key, nonceMask []byte) cipher.AEAD { return ret } -func aeadChaCha20Poly1305(key, nonceMask []byte) cipher.AEAD { +func aeadChaCha20Poly1305(key, nonceMask []byte) *xorNonceAEAD { if len(nonceMask) != aeadNonceLength { panic("tls: internal error: wrong nonce length") } diff --git a/vendor/github.com/quic-go/quic-go/internal/handshake/crypto_setup.go b/vendor/github.com/quic-go/quic-go/internal/handshake/crypto_setup.go index 861494c47..4273a4a6a 100644 --- a/vendor/github.com/quic-go/quic-go/internal/handshake/crypto_setup.go +++ b/vendor/github.com/quic-go/quic-go/internal/handshake/crypto_setup.go @@ -1,14 +1,12 @@ package handshake import ( - "bytes" "context" "crypto/tls" "errors" "fmt" "net" "strings" - "sync" "sync/atomic" "time" @@ -25,15 +23,15 @@ type quicVersionContextKey struct{} var QUICVersionContextKey = &quicVersionContextKey{} -const clientSessionStateRevision = 3 +const clientSessionStateRevision = 4 type cryptoSetup struct { tlsConf *tls.Config - conn *qtls.QUICConn + conn *tls.QUICConn events []Event - version protocol.VersionNumber + version protocol.Version ourParams *wire.TransportParameters peerParams *wire.TransportParameters @@ -48,8 +46,6 @@ type cryptoSetup struct { perspective protocol.Perspective - mutex sync.Mutex // protects all members below - handshakeCompleteTime time.Time zeroRTTOpener LongHeaderOpener // only set for the server @@ -79,7 +75,7 @@ func NewCryptoSetupClient( rttStats *utils.RTTStats, tracer *logging.ConnectionTracer, logger utils.Logger, - version protocol.VersionNumber, + version protocol.Version, ) CryptoSetup { cs := newCryptoSetup( connID, @@ -93,11 +89,12 @@ func NewCryptoSetupClient( tlsConf = tlsConf.Clone() tlsConf.MinVersion = tls.VersionTLS13 - quicConf := &qtls.QUICConfig{TLSConfig: tlsConf} + quicConf := &tls.QUICConfig{TLSConfig: tlsConf} qtls.SetupConfigForClient(quicConf, cs.marshalDataForSessionState, cs.handleDataFromSessionState) cs.tlsConf = tlsConf + cs.allow0RTT = enable0RTT - cs.conn = qtls.QUICClient(quicConf) + cs.conn = tls.QUICClient(quicConf) cs.conn.SetTransportParameters(cs.ourParams.Marshal(protocol.PerspectiveClient)) return cs @@ -113,7 +110,7 @@ func NewCryptoSetupServer( rttStats *utils.RTTStats, tracer *logging.ConnectionTracer, logger utils.Logger, - version protocol.VersionNumber, + version protocol.Version, ) CryptoSetup { cs := newCryptoSetup( connID, @@ -126,12 +123,12 @@ func NewCryptoSetupServer( ) cs.allow0RTT = allow0RTT - quicConf := &qtls.QUICConfig{TLSConfig: tlsConf} + quicConf := &tls.QUICConfig{TLSConfig: tlsConf} qtls.SetupConfigForServer(quicConf, cs.allow0RTT, cs.getDataForSessionTicket, cs.handleSessionTicket) addConnToClientHelloInfo(quicConf.TLSConfig, localAddr, remoteAddr) cs.tlsConf = quicConf.TLSConfig - cs.conn = qtls.QUICServer(quicConf) + cs.conn = tls.QUICServer(quicConf) return cs } @@ -171,7 +168,7 @@ func newCryptoSetup( tracer *logging.ConnectionTracer, logger utils.Logger, perspective protocol.Perspective, - version protocol.VersionNumber, + version protocol.Version, ) *cryptoSetup { initialSealer, initialOpener := NewInitialAEAD(connID, perspective, version) if tracer != nil && tracer.UpdatedKeyFromTLS != nil { @@ -263,28 +260,28 @@ func (h *cryptoSetup) handleMessage(data []byte, encLevel protocol.EncryptionLev } } -func (h *cryptoSetup) handleEvent(ev qtls.QUICEvent) (done bool, err error) { +func (h *cryptoSetup) handleEvent(ev tls.QUICEvent) (done bool, err error) { switch ev.Kind { - case qtls.QUICNoEvent: + case tls.QUICNoEvent: return true, nil - case qtls.QUICSetReadSecret: - h.SetReadKey(ev.Level, ev.Suite, ev.Data) + case tls.QUICSetReadSecret: + h.setReadKey(ev.Level, ev.Suite, ev.Data) return false, nil - case qtls.QUICSetWriteSecret: - h.SetWriteKey(ev.Level, ev.Suite, ev.Data) + case tls.QUICSetWriteSecret: + h.setWriteKey(ev.Level, ev.Suite, ev.Data) return false, nil - case qtls.QUICTransportParameters: + case tls.QUICTransportParameters: return false, h.handleTransportParameters(ev.Data) - case qtls.QUICTransportParametersRequired: + case tls.QUICTransportParametersRequired: h.conn.SetTransportParameters(h.ourParams.Marshal(h.perspective)) return false, nil - case qtls.QUICRejectedEarlyData: + case tls.QUICRejectedEarlyData: h.rejected0RTT() return false, nil - case qtls.QUICWriteData: - h.WriteRecord(ev.Level, ev.Data) + case tls.QUICWriteData: + h.writeRecord(ev.Level, ev.Data) return false, nil - case qtls.QUICHandshakeDone: + case tls.QUICHandshakeDone: h.handshakeComplete() return false, nil default: @@ -312,41 +309,57 @@ func (h *cryptoSetup) handleTransportParameters(data []byte) error { } // must be called after receiving the transport parameters -func (h *cryptoSetup) marshalDataForSessionState() []byte { +func (h *cryptoSetup) marshalDataForSessionState(earlyData bool) []byte { b := make([]byte, 0, 256) b = quicvarint.Append(b, clientSessionStateRevision) b = quicvarint.Append(b, uint64(h.rttStats.SmoothedRTT().Microseconds())) - return h.peerParams.MarshalForSessionTicket(b) + if earlyData { + // only save the transport parameters for 0-RTT enabled session tickets + return h.peerParams.MarshalForSessionTicket(b) + } + return b } -func (h *cryptoSetup) handleDataFromSessionState(data []byte) { - tp, err := h.handleDataFromSessionStateImpl(data) +func (h *cryptoSetup) handleDataFromSessionState(data []byte, earlyData bool) (allowEarlyData bool) { + rtt, tp, err := decodeDataFromSessionState(data, earlyData) if err != nil { h.logger.Debugf("Restoring of transport parameters from session ticket failed: %s", err.Error()) return } - h.zeroRTTParameters = tp + h.rttStats.SetInitialRTT(rtt) + // The session ticket might have been saved from a connection that allowed 0-RTT, + // and therefore contain transport parameters. + // Only use them if 0-RTT is actually used on the new connection. + if tp != nil && h.allow0RTT { + h.zeroRTTParameters = tp + return true + } + return false } -func (h *cryptoSetup) handleDataFromSessionStateImpl(data []byte) (*wire.TransportParameters, error) { - r := bytes.NewReader(data) - ver, err := quicvarint.Read(r) +func decodeDataFromSessionState(b []byte, earlyData bool) (time.Duration, *wire.TransportParameters, error) { + ver, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return 0, nil, err } + b = b[l:] if ver != clientSessionStateRevision { - return nil, fmt.Errorf("mismatching version. Got %d, expected %d", ver, clientSessionStateRevision) + return 0, nil, fmt.Errorf("mismatching version. Got %d, expected %d", ver, clientSessionStateRevision) } - rtt, err := quicvarint.Read(r) + rttEncoded, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return 0, nil, err + } + b = b[l:] + rtt := time.Duration(rttEncoded) * time.Microsecond + if !earlyData { + return rtt, nil, nil } - h.rttStats.SetInitialRTT(time.Duration(rtt) * time.Microsecond) var tp wire.TransportParameters - if err := tp.UnmarshalFromSessionTicket(r); err != nil { - return nil, err + if err := tp.UnmarshalFromSessionTicket(b); err != nil { + return 0, nil, err } - return &tp, nil + return rtt, &tp, nil } func (h *cryptoSetup) getDataForSessionTicket() []byte { @@ -363,7 +376,9 @@ func (h *cryptoSetup) getDataForSessionTicket() []byte { // Due to limitations in crypto/tls, it's only possible to generate a single session ticket per connection. // It is only valid for the server. func (h *cryptoSetup) GetSessionTicket() ([]byte, error) { - if err := qtls.SendSessionTicket(h.conn, h.allow0RTT); err != nil { + if err := h.conn.SendSessionTicket(tls.QUICSessionTicketOptions{ + EarlyData: h.allow0RTT, + }); err != nil { // Session tickets might be disabled by tls.Config.SessionTicketsDisabled. // We can't check h.tlsConfig here, since the actual config might have been obtained from // the GetConfigForClient callback. @@ -375,18 +390,20 @@ func (h *cryptoSetup) GetSessionTicket() ([]byte, error) { return nil, err } ev := h.conn.NextEvent() - if ev.Kind != qtls.QUICWriteData || ev.Level != qtls.QUICEncryptionLevelApplication { + if ev.Kind != tls.QUICWriteData || ev.Level != tls.QUICEncryptionLevelApplication { panic("crypto/tls bug: where's my session ticket?") } ticket := ev.Data - if ev := h.conn.NextEvent(); ev.Kind != qtls.QUICNoEvent { + if ev := h.conn.NextEvent(); ev.Kind != tls.QUICNoEvent { panic("crypto/tls bug: why more than one ticket?") } return ticket, nil } // handleSessionTicket is called for the server when receiving the client's session ticket. -// It reads parameters from the session ticket and decides whether to accept 0-RTT when the session ticket is used for 0-RTT. +// It reads parameters from the session ticket and checks whether to accept 0-RTT if the session ticket enabled 0-RTT. +// Note that the fact that the session ticket allows 0-RTT doesn't mean that the actual TLS handshake enables 0-RTT: +// A client may use a 0-RTT enabled session to resume a TLS session without using 0-RTT. func (h *cryptoSetup) handleSessionTicket(sessionTicketData []byte, using0RTT bool) bool { var t sessionTicket if err := t.Unmarshal(sessionTicketData, using0RTT); err != nil { @@ -414,22 +431,19 @@ func (h *cryptoSetup) handleSessionTicket(sessionTicketData []byte, using0RTT bo func (h *cryptoSetup) rejected0RTT() { h.logger.Debugf("0-RTT was rejected. Dropping 0-RTT keys.") - h.mutex.Lock() had0RTTKeys := h.zeroRTTSealer != nil h.zeroRTTSealer = nil - h.mutex.Unlock() if had0RTTKeys { h.events = append(h.events, Event{Kind: EventDiscard0RTTKeys}) } } -func (h *cryptoSetup) SetReadKey(el qtls.QUICEncryptionLevel, suiteID uint16, trafficSecret []byte) { +func (h *cryptoSetup) setReadKey(el tls.QUICEncryptionLevel, suiteID uint16, trafficSecret []byte) { suite := getCipherSuite(suiteID) - h.mutex.Lock() //nolint:exhaustive // The TLS stack doesn't export Initial keys. switch el { - case qtls.QUICEncryptionLevelEarly: + case tls.QUICEncryptionLevelEarly: if h.perspective == protocol.PerspectiveClient { panic("Received 0-RTT read key for the client") } @@ -441,7 +455,7 @@ func (h *cryptoSetup) SetReadKey(el qtls.QUICEncryptionLevel, suiteID uint16, tr if h.logger.Debug() { h.logger.Debugf("Installed 0-RTT Read keys (using %s)", tls.CipherSuiteName(suite.ID)) } - case qtls.QUICEncryptionLevelHandshake: + case tls.QUICEncryptionLevelHandshake: h.handshakeOpener = newLongHeaderOpener( createAEAD(suite, trafficSecret, h.version), newHeaderProtector(suite, trafficSecret, true, h.version), @@ -449,7 +463,7 @@ func (h *cryptoSetup) SetReadKey(el qtls.QUICEncryptionLevel, suiteID uint16, tr if h.logger.Debug() { h.logger.Debugf("Installed Handshake Read keys (using %s)", tls.CipherSuiteName(suite.ID)) } - case qtls.QUICEncryptionLevelApplication: + case tls.QUICEncryptionLevelApplication: h.aead.SetReadKey(suite, trafficSecret) h.has1RTTOpener = true if h.logger.Debug() { @@ -458,19 +472,17 @@ func (h *cryptoSetup) SetReadKey(el qtls.QUICEncryptionLevel, suiteID uint16, tr default: panic("unexpected read encryption level") } - h.mutex.Unlock() h.events = append(h.events, Event{Kind: EventReceivedReadKeys}) if h.tracer != nil && h.tracer.UpdatedKeyFromTLS != nil { h.tracer.UpdatedKeyFromTLS(qtls.FromTLSEncryptionLevel(el), h.perspective.Opposite()) } } -func (h *cryptoSetup) SetWriteKey(el qtls.QUICEncryptionLevel, suiteID uint16, trafficSecret []byte) { +func (h *cryptoSetup) setWriteKey(el tls.QUICEncryptionLevel, suiteID uint16, trafficSecret []byte) { suite := getCipherSuite(suiteID) - h.mutex.Lock() //nolint:exhaustive // The TLS stack doesn't export Initial keys. switch el { - case qtls.QUICEncryptionLevelEarly: + case tls.QUICEncryptionLevelEarly: if h.perspective == protocol.PerspectiveServer { panic("Received 0-RTT write key for the server") } @@ -478,7 +490,6 @@ func (h *cryptoSetup) SetWriteKey(el qtls.QUICEncryptionLevel, suiteID uint16, t createAEAD(suite, trafficSecret, h.version), newHeaderProtector(suite, trafficSecret, true, h.version), ) - h.mutex.Unlock() if h.logger.Debug() { h.logger.Debugf("Installed 0-RTT Write keys (using %s)", tls.CipherSuiteName(suite.ID)) } @@ -487,7 +498,7 @@ func (h *cryptoSetup) SetWriteKey(el qtls.QUICEncryptionLevel, suiteID uint16, t } // don't set used0RTT here. 0-RTT might still get rejected. return - case qtls.QUICEncryptionLevelHandshake: + case tls.QUICEncryptionLevelHandshake: h.handshakeSealer = newLongHeaderSealer( createAEAD(suite, trafficSecret, h.version), newHeaderProtector(suite, trafficSecret, true, h.version), @@ -495,7 +506,7 @@ func (h *cryptoSetup) SetWriteKey(el qtls.QUICEncryptionLevel, suiteID uint16, t if h.logger.Debug() { h.logger.Debugf("Installed Handshake Write keys (using %s)", tls.CipherSuiteName(suite.ID)) } - case qtls.QUICEncryptionLevelApplication: + case tls.QUICEncryptionLevelApplication: h.aead.SetWriteKey(suite, trafficSecret) h.has1RTTSealer = true if h.logger.Debug() { @@ -513,21 +524,20 @@ func (h *cryptoSetup) SetWriteKey(el qtls.QUICEncryptionLevel, suiteID uint16, t default: panic("unexpected write encryption level") } - h.mutex.Unlock() if h.tracer != nil && h.tracer.UpdatedKeyFromTLS != nil { h.tracer.UpdatedKeyFromTLS(qtls.FromTLSEncryptionLevel(el), h.perspective) } } -// WriteRecord is called when TLS writes data -func (h *cryptoSetup) WriteRecord(encLevel qtls.QUICEncryptionLevel, p []byte) { +// writeRecord is called when TLS writes data +func (h *cryptoSetup) writeRecord(encLevel tls.QUICEncryptionLevel, p []byte) { //nolint:exhaustive // handshake records can only be written for Initial and Handshake. switch encLevel { - case qtls.QUICEncryptionLevelInitial: + case tls.QUICEncryptionLevelInitial: h.events = append(h.events, Event{Kind: EventWriteInitialData, Data: p}) - case qtls.QUICEncryptionLevelHandshake: + case tls.QUICEncryptionLevelHandshake: h.events = append(h.events, Event{Kind: EventWriteHandshakeData, Data: p}) - case qtls.QUICEncryptionLevelApplication: + case tls.QUICEncryptionLevelApplication: panic("unexpected write") default: panic(fmt.Sprintf("unexpected write encryption level: %s", encLevel)) @@ -535,11 +545,9 @@ func (h *cryptoSetup) WriteRecord(encLevel qtls.QUICEncryptionLevel, p []byte) { } func (h *cryptoSetup) DiscardInitialKeys() { - h.mutex.Lock() dropped := h.initialOpener != nil h.initialOpener = nil h.initialSealer = nil - h.mutex.Unlock() if dropped { h.logger.Debugf("Dropping Initial keys.") } @@ -554,22 +562,17 @@ func (h *cryptoSetup) SetHandshakeConfirmed() { h.aead.SetHandshakeConfirmed() // drop Handshake keys var dropped bool - h.mutex.Lock() if h.handshakeOpener != nil { h.handshakeOpener = nil h.handshakeSealer = nil dropped = true } - h.mutex.Unlock() if dropped { h.logger.Debugf("Dropping Handshake keys.") } } func (h *cryptoSetup) GetInitialSealer() (LongHeaderSealer, error) { - h.mutex.Lock() - defer h.mutex.Unlock() - if h.initialSealer == nil { return nil, ErrKeysDropped } @@ -577,9 +580,6 @@ func (h *cryptoSetup) GetInitialSealer() (LongHeaderSealer, error) { } func (h *cryptoSetup) Get0RTTSealer() (LongHeaderSealer, error) { - h.mutex.Lock() - defer h.mutex.Unlock() - if h.zeroRTTSealer == nil { return nil, ErrKeysDropped } @@ -587,9 +587,6 @@ func (h *cryptoSetup) Get0RTTSealer() (LongHeaderSealer, error) { } func (h *cryptoSetup) GetHandshakeSealer() (LongHeaderSealer, error) { - h.mutex.Lock() - defer h.mutex.Unlock() - if h.handshakeSealer == nil { if h.initialSealer == nil { return nil, ErrKeysDropped @@ -600,9 +597,6 @@ func (h *cryptoSetup) GetHandshakeSealer() (LongHeaderSealer, error) { } func (h *cryptoSetup) Get1RTTSealer() (ShortHeaderSealer, error) { - h.mutex.Lock() - defer h.mutex.Unlock() - if !h.has1RTTSealer { return nil, ErrKeysNotYetAvailable } @@ -610,9 +604,6 @@ func (h *cryptoSetup) Get1RTTSealer() (ShortHeaderSealer, error) { } func (h *cryptoSetup) GetInitialOpener() (LongHeaderOpener, error) { - h.mutex.Lock() - defer h.mutex.Unlock() - if h.initialOpener == nil { return nil, ErrKeysDropped } @@ -620,9 +611,6 @@ func (h *cryptoSetup) GetInitialOpener() (LongHeaderOpener, error) { } func (h *cryptoSetup) Get0RTTOpener() (LongHeaderOpener, error) { - h.mutex.Lock() - defer h.mutex.Unlock() - if h.zeroRTTOpener == nil { if h.initialOpener != nil { return nil, ErrKeysNotYetAvailable @@ -634,9 +622,6 @@ func (h *cryptoSetup) Get0RTTOpener() (LongHeaderOpener, error) { } func (h *cryptoSetup) GetHandshakeOpener() (LongHeaderOpener, error) { - h.mutex.Lock() - defer h.mutex.Unlock() - if h.handshakeOpener == nil { if h.initialOpener != nil { return nil, ErrKeysNotYetAvailable @@ -648,9 +633,6 @@ func (h *cryptoSetup) GetHandshakeOpener() (LongHeaderOpener, error) { } func (h *cryptoSetup) Get1RTTOpener() (ShortHeaderOpener, error) { - h.mutex.Lock() - defer h.mutex.Unlock() - if h.zeroRTTOpener != nil && time.Since(h.handshakeCompleteTime) > 3*h.rttStats.PTO(true) { h.zeroRTTOpener = nil h.logger.Debugf("Dropping 0-RTT keys.") @@ -674,7 +656,7 @@ func (h *cryptoSetup) ConnectionState() ConnectionState { func wrapError(err error) error { // alert 80 is an internal error - if alertErr := qtls.AlertError(0); errors.As(err, &alertErr) && alertErr != 80 { + if alertErr := tls.AlertError(0); errors.As(err, &alertErr) && alertErr != 80 { return qerr.NewLocalCryptoError(uint8(alertErr), err) } return &qerr.TransportError{ErrorCode: qerr.InternalError, ErrorMessage: err.Error()} diff --git a/vendor/github.com/quic-go/quic-go/internal/handshake/header_protector.go b/vendor/github.com/quic-go/quic-go/internal/handshake/header_protector.go index fb6092e04..2c5ee42f1 100644 --- a/vendor/github.com/quic-go/quic-go/internal/handshake/header_protector.go +++ b/vendor/github.com/quic-go/quic-go/internal/handshake/header_protector.go @@ -17,14 +17,14 @@ type headerProtector interface { DecryptHeader(sample []byte, firstByte *byte, hdrBytes []byte) } -func hkdfHeaderProtectionLabel(v protocol.VersionNumber) string { +func hkdfHeaderProtectionLabel(v protocol.Version) string { if v == protocol.Version2 { return "quicv2 hp" } return "quic hp" } -func newHeaderProtector(suite *cipherSuite, trafficSecret []byte, isLongHeader bool, v protocol.VersionNumber) headerProtector { +func newHeaderProtector(suite *cipherSuite, trafficSecret []byte, isLongHeader bool, v protocol.Version) headerProtector { hkdfLabel := hkdfHeaderProtectionLabel(v) switch suite.ID { case tls.TLS_AES_128_GCM_SHA256, tls.TLS_AES_256_GCM_SHA384: @@ -37,7 +37,7 @@ func newHeaderProtector(suite *cipherSuite, trafficSecret []byte, isLongHeader b } type aesHeaderProtector struct { - mask []byte + mask [16]byte // AES always has a 16 byte block size block cipher.Block isLongHeader bool } @@ -52,7 +52,6 @@ func newAESHeaderProtector(suite *cipherSuite, trafficSecret []byte, isLongHeade } return &aesHeaderProtector{ block: block, - mask: make([]byte, block.BlockSize()), isLongHeader: isLongHeader, } } @@ -69,7 +68,7 @@ func (p *aesHeaderProtector) apply(sample []byte, firstByte *byte, hdrBytes []by if len(sample) != len(p.mask) { panic("invalid sample size") } - p.block.Encrypt(p.mask, sample) + p.block.Encrypt(p.mask[:], sample) if p.isLongHeader { *firstByte ^= p.mask[0] & 0xf } else { diff --git a/vendor/github.com/quic-go/quic-go/internal/handshake/hkdf.go b/vendor/github.com/quic-go/quic-go/internal/handshake/hkdf.go index c4fd86c57..0caf1c8e5 100644 --- a/vendor/github.com/quic-go/quic-go/internal/handshake/hkdf.go +++ b/vendor/github.com/quic-go/quic-go/internal/handshake/hkdf.go @@ -7,7 +7,7 @@ import ( "golang.org/x/crypto/hkdf" ) -// hkdfExpandLabel HKDF expands a label. +// hkdfExpandLabel HKDF expands a label as defined in RFC 8446, section 7.1. // Since this implementation avoids using a cryptobyte.Builder, it is about 15% faster than the // hkdfExpandLabel in the standard library. func hkdfExpandLabel(hash crypto.Hash, secret, context []byte, label string, length int) []byte { diff --git a/vendor/github.com/quic-go/quic-go/internal/handshake/initial_aead.go b/vendor/github.com/quic-go/quic-go/internal/handshake/initial_aead.go index b0377c39a..b8aa7e3e7 100644 --- a/vendor/github.com/quic-go/quic-go/internal/handshake/initial_aead.go +++ b/vendor/github.com/quic-go/quic-go/internal/handshake/initial_aead.go @@ -21,7 +21,7 @@ const ( hkdfLabelIVV2 = "quicv2 iv" ) -func getSalt(v protocol.VersionNumber) []byte { +func getSalt(v protocol.Version) []byte { if v == protocol.Version2 { return quicSaltV2 } @@ -31,7 +31,7 @@ func getSalt(v protocol.VersionNumber) []byte { var initialSuite = getCipherSuite(tls.TLS_AES_128_GCM_SHA256) // NewInitialAEAD creates a new AEAD for Initial encryption / decryption. -func NewInitialAEAD(connID protocol.ConnectionID, pers protocol.Perspective, v protocol.VersionNumber) (LongHeaderSealer, LongHeaderOpener) { +func NewInitialAEAD(connID protocol.ConnectionID, pers protocol.Perspective, v protocol.Version) (LongHeaderSealer, LongHeaderOpener) { clientSecret, serverSecret := computeSecrets(connID, v) var mySecret, otherSecret []byte if pers == protocol.PerspectiveClient { @@ -51,14 +51,14 @@ func NewInitialAEAD(connID protocol.ConnectionID, pers protocol.Perspective, v p newLongHeaderOpener(decrypter, newAESHeaderProtector(initialSuite, otherSecret, true, hkdfHeaderProtectionLabel(v))) } -func computeSecrets(connID protocol.ConnectionID, v protocol.VersionNumber) (clientSecret, serverSecret []byte) { +func computeSecrets(connID protocol.ConnectionID, v protocol.Version) (clientSecret, serverSecret []byte) { initialSecret := hkdf.Extract(crypto.SHA256.New, connID.Bytes(), getSalt(v)) clientSecret = hkdfExpandLabel(crypto.SHA256, initialSecret, []byte{}, "client in", crypto.SHA256.Size()) serverSecret = hkdfExpandLabel(crypto.SHA256, initialSecret, []byte{}, "server in", crypto.SHA256.Size()) return } -func computeInitialKeyAndIV(secret []byte, v protocol.VersionNumber) (key, iv []byte) { +func computeInitialKeyAndIV(secret []byte, v protocol.Version) (key, iv []byte) { keyLabel := hkdfLabelKeyV1 ivLabel := hkdfLabelIVV1 if v == protocol.Version2 { diff --git a/vendor/github.com/quic-go/quic-go/internal/handshake/retry.go b/vendor/github.com/quic-go/quic-go/internal/handshake/retry.go index 68fa53ed1..30643cdfc 100644 --- a/vendor/github.com/quic-go/quic-go/internal/handshake/retry.go +++ b/vendor/github.com/quic-go/quic-go/internal/handshake/retry.go @@ -40,7 +40,7 @@ var ( ) // GetRetryIntegrityTag calculates the integrity tag on a Retry packet -func GetRetryIntegrityTag(retry []byte, origDestConnID protocol.ConnectionID, version protocol.VersionNumber) *[16]byte { +func GetRetryIntegrityTag(retry []byte, origDestConnID protocol.ConnectionID, version protocol.Version) *[16]byte { retryMutex.Lock() defer retryMutex.Unlock() diff --git a/vendor/github.com/quic-go/quic-go/internal/handshake/session_ticket.go b/vendor/github.com/quic-go/quic-go/internal/handshake/session_ticket.go index 9481af563..b67f0101e 100644 --- a/vendor/github.com/quic-go/quic-go/internal/handshake/session_ticket.go +++ b/vendor/github.com/quic-go/quic-go/internal/handshake/session_ticket.go @@ -1,7 +1,6 @@ package handshake import ( - "bytes" "errors" "fmt" "time" @@ -28,25 +27,26 @@ func (t *sessionTicket) Marshal() []byte { } func (t *sessionTicket) Unmarshal(b []byte, using0RTT bool) error { - r := bytes.NewReader(b) - rev, err := quicvarint.Read(r) + rev, l, err := quicvarint.Parse(b) if err != nil { return errors.New("failed to read session ticket revision") } + b = b[l:] if rev != sessionTicketRevision { return fmt.Errorf("unknown session ticket revision: %d", rev) } - rtt, err := quicvarint.Read(r) + rtt, l, err := quicvarint.Parse(b) if err != nil { return errors.New("failed to read RTT") } + b = b[l:] if using0RTT { var tp wire.TransportParameters - if err := tp.UnmarshalFromSessionTicket(r); err != nil { + if err := tp.UnmarshalFromSessionTicket(b); err != nil { return fmt.Errorf("unmarshaling transport parameters from session ticket failed: %s", err.Error()) } t.Parameters = &tp - } else if r.Len() > 0 { + } else if len(b) > 0 { return fmt.Errorf("the session ticket has more bytes than expected") } t.RTT = time.Duration(rtt) * time.Microsecond diff --git a/vendor/github.com/quic-go/quic-go/internal/handshake/updatable_aead.go b/vendor/github.com/quic-go/quic-go/internal/handshake/updatable_aead.go index a583f2773..ceaa8047a 100644 --- a/vendor/github.com/quic-go/quic-go/internal/handshake/updatable_aead.go +++ b/vendor/github.com/quic-go/quic-go/internal/handshake/updatable_aead.go @@ -59,7 +59,7 @@ type updatableAEAD struct { tracer *logging.ConnectionTracer logger utils.Logger - version protocol.VersionNumber + version protocol.Version // use a single slice to avoid allocations nonceBuf []byte @@ -70,7 +70,7 @@ var ( _ ShortHeaderSealer = &updatableAEAD{} ) -func newUpdatableAEAD(rttStats *utils.RTTStats, tracer *logging.ConnectionTracer, logger utils.Logger, version protocol.VersionNumber) *updatableAEAD { +func newUpdatableAEAD(rttStats *utils.RTTStats, tracer *logging.ConnectionTracer, logger utils.Logger, version protocol.Version) *updatableAEAD { return &updatableAEAD{ firstPacketNumber: protocol.InvalidPacketNumber, largestAcked: protocol.InvalidPacketNumber, @@ -133,7 +133,7 @@ func (a *updatableAEAD) SetReadKey(suite *cipherSuite, trafficSecret []byte) { // SetWriteKey sets the write key. // For the client, this function is called after SetReadKey. -// For the server, this function is called before SetWriteKey. +// For the server, this function is called before SetReadKey. func (a *updatableAEAD) SetWriteKey(suite *cipherSuite, trafficSecret []byte) { a.sendAEAD = createAEAD(suite, trafficSecret, a.version) a.headerEncrypter = newHeaderProtector(suite, trafficSecret, false, a.version) @@ -172,7 +172,7 @@ func (a *updatableAEAD) Open(dst, src []byte, rcvTime time.Time, pn protocol.Pac } } if err == nil { - a.highestRcvdPN = utils.Max(a.highestRcvdPN, pn) + a.highestRcvdPN = max(a.highestRcvdPN, pn) } return dec, err } diff --git a/vendor/github.com/quic-go/quic-go/internal/protocol/params.go b/vendor/github.com/quic-go/quic-go/internal/protocol/params.go index 3ca68bf83..7c4d8d4de 100644 --- a/vendor/github.com/quic-go/quic-go/internal/protocol/params.go +++ b/vendor/github.com/quic-go/quic-go/internal/protocol/params.go @@ -3,16 +3,13 @@ package protocol import "time" // DesiredReceiveBufferSize is the kernel UDP receive buffer size that we'd like to use. -const DesiredReceiveBufferSize = (1 << 20) * 2 // 2 MB +const DesiredReceiveBufferSize = (1 << 20) * 7 // 7 MB // DesiredSendBufferSize is the kernel UDP send buffer size that we'd like to use. -const DesiredSendBufferSize = (1 << 20) * 2 // 2 MB +const DesiredSendBufferSize = (1 << 20) * 7 // 7 MB -// InitialPacketSizeIPv4 is the maximum packet size that we use for sending IPv4 packets. -const InitialPacketSizeIPv4 = 1252 - -// InitialPacketSizeIPv6 is the maximum packet size that we use for sending IPv6 packets. -const InitialPacketSizeIPv6 = 1232 +// InitialPacketSize is the initial (before Path MTU discovery) maximum packet size used. +const InitialPacketSize = 1280 // MaxCongestionWindowPackets is the maximum congestion window in packet. const MaxCongestionWindowPackets = 10000 @@ -129,13 +126,6 @@ const MaxPostHandshakeCryptoFrameSize = 1000 // but must ensure that a maximum size ACK frame fits into one packet. const MaxAckFrameSize ByteCount = 1000 -// MaxDatagramFrameSize is the maximum size of a DATAGRAM frame (RFC 9221). -// The size is chosen such that a DATAGRAM frame fits into a QUIC packet. -const MaxDatagramFrameSize ByteCount = 1200 - -// DatagramRcvQueueLen is the length of the receive queue for DATAGRAM frames (RFC 9221) -const DatagramRcvQueueLen = 128 - // MaxNumAckRanges is the maximum number of ACK ranges that we send in an ACK frame. // It also serves as a limit for the packet history. // If at any point we keep track of more ranges, old ranges are discarded. diff --git a/vendor/github.com/quic-go/quic-go/internal/protocol/perspective.go b/vendor/github.com/quic-go/quic-go/internal/protocol/perspective.go index 43358fecb..5a29d3ce2 100644 --- a/vendor/github.com/quic-go/quic-go/internal/protocol/perspective.go +++ b/vendor/github.com/quic-go/quic-go/internal/protocol/perspective.go @@ -17,9 +17,9 @@ func (p Perspective) Opposite() Perspective { func (p Perspective) String() string { switch p { case PerspectiveServer: - return "Server" + return "server" case PerspectiveClient: - return "Client" + return "client" default: return "invalid perspective" } diff --git a/vendor/github.com/quic-go/quic-go/internal/protocol/version.go b/vendor/github.com/quic-go/quic-go/internal/protocol/version.go index 5c2decbdc..025ade9b4 100644 --- a/vendor/github.com/quic-go/quic-go/internal/protocol/version.go +++ b/vendor/github.com/quic-go/quic-go/internal/protocol/version.go @@ -1,14 +1,17 @@ package protocol import ( - "crypto/rand" "encoding/binary" "fmt" "math" + "sync" + "time" + + "golang.org/x/exp/rand" ) -// VersionNumber is a version number as int -type VersionNumber uint32 +// Version is a version number as int +type Version uint32 // gQUIC version range as defined in the wiki: https://github.com/quicwg/base-drafts/wiki/QUIC-Versions const ( @@ -18,22 +21,22 @@ const ( // The version numbers, making grepping easier const ( - VersionUnknown VersionNumber = math.MaxUint32 - versionDraft29 VersionNumber = 0xff00001d // draft-29 used to be a widely deployed version - Version1 VersionNumber = 0x1 - Version2 VersionNumber = 0x6b3343cf + VersionUnknown Version = math.MaxUint32 + versionDraft29 Version = 0xff00001d // draft-29 used to be a widely deployed version + Version1 Version = 0x1 + Version2 Version = 0x6b3343cf ) // SupportedVersions lists the versions that the server supports // must be in sorted descending order -var SupportedVersions = []VersionNumber{Version1, Version2} +var SupportedVersions = []Version{Version1, Version2} // IsValidVersion says if the version is known to quic-go -func IsValidVersion(v VersionNumber) bool { +func IsValidVersion(v Version) bool { return v == Version1 || IsSupportedVersion(SupportedVersions, v) } -func (vn VersionNumber) String() string { +func (vn Version) String() string { //nolint:exhaustive switch vn { case VersionUnknown: @@ -52,16 +55,16 @@ func (vn VersionNumber) String() string { } } -func (vn VersionNumber) isGQUIC() bool { +func (vn Version) isGQUIC() bool { return vn > gquicVersion0 && vn <= maxGquicVersion } -func (vn VersionNumber) toGQUICVersion() int { +func (vn Version) toGQUICVersion() int { return int(10*(vn-gquicVersion0)/0x100) + int(vn%0x10) } // IsSupportedVersion returns true if the server supports this version -func IsSupportedVersion(supported []VersionNumber, v VersionNumber) bool { +func IsSupportedVersion(supported []Version, v Version) bool { for _, t := range supported { if t == v { return true @@ -74,7 +77,7 @@ func IsSupportedVersion(supported []VersionNumber, v VersionNumber) bool { // ours is a slice of versions that we support, sorted by our preference (descending) // theirs is a slice of versions offered by the peer. The order does not matter. // The bool returned indicates if a matching version was found. -func ChooseSupportedVersion(ours, theirs []VersionNumber) (VersionNumber, bool) { +func ChooseSupportedVersion(ours, theirs []Version) (Version, bool) { for _, ourVer := range ours { for _, theirVer := range theirs { if ourVer == theirVer { @@ -85,19 +88,25 @@ func ChooseSupportedVersion(ours, theirs []VersionNumber) (VersionNumber, bool) return 0, false } -// generateReservedVersion generates a reserved version number (v & 0x0f0f0f0f == 0x0a0a0a0a) -func generateReservedVersion() VersionNumber { - b := make([]byte, 4) - _, _ = rand.Read(b) // ignore the error here. Failure to read random data doesn't break anything - return VersionNumber((binary.BigEndian.Uint32(b) | 0x0a0a0a0a) & 0xfafafafa) +var ( + versionNegotiationMx sync.Mutex + versionNegotiationRand = rand.New(rand.NewSource(uint64(time.Now().UnixNano()))) +) + +// generateReservedVersion generates a reserved version (v & 0x0f0f0f0f == 0x0a0a0a0a) +func generateReservedVersion() Version { + var b [4]byte + _, _ = versionNegotiationRand.Read(b[:]) // ignore the error here. Failure to read random data doesn't break anything + return Version((binary.BigEndian.Uint32(b[:]) | 0x0a0a0a0a) & 0xfafafafa) } -// GetGreasedVersions adds one reserved version number to a slice of version numbers, at a random position -func GetGreasedVersions(supported []VersionNumber) []VersionNumber { - b := make([]byte, 1) - _, _ = rand.Read(b) // ignore the error here. Failure to read random data doesn't break anything - randPos := int(b[0]) % (len(supported) + 1) - greased := make([]VersionNumber, len(supported)+1) +// GetGreasedVersions adds one reserved version number to a slice of version numbers, at a random position. +// It doesn't modify the supported slice. +func GetGreasedVersions(supported []Version) []Version { + versionNegotiationMx.Lock() + defer versionNegotiationMx.Unlock() + randPos := rand.Intn(len(supported) + 1) + greased := make([]Version, len(supported)+1) copy(greased, supported[:randPos]) greased[randPos] = generateReservedVersion() copy(greased[randPos+1:], supported[randPos:]) diff --git a/vendor/github.com/quic-go/quic-go/internal/qerr/error_codes.go b/vendor/github.com/quic-go/quic-go/internal/qerr/error_codes.go index a037acd22..00361308e 100644 --- a/vendor/github.com/quic-go/quic-go/internal/qerr/error_codes.go +++ b/vendor/github.com/quic-go/quic-go/internal/qerr/error_codes.go @@ -1,9 +1,8 @@ package qerr import ( + "crypto/tls" "fmt" - - "github.com/quic-go/quic-go/internal/qtls" ) // TransportErrorCode is a QUIC transport error. @@ -40,7 +39,7 @@ func (e TransportErrorCode) Message() string { if !e.IsCryptoError() { return "" } - return qtls.AlertError(e - 0x100).Error() + return tls.AlertError(e - 0x100).Error() } func (e TransportErrorCode) String() string { diff --git a/vendor/github.com/quic-go/quic-go/internal/qerr/errors.go b/vendor/github.com/quic-go/quic-go/internal/qerr/errors.go index 2d8511f77..8f5936dfa 100644 --- a/vendor/github.com/quic-go/quic-go/internal/qerr/errors.go +++ b/vendor/github.com/quic-go/quic-go/internal/qerr/errors.go @@ -101,8 +101,8 @@ func (e *HandshakeTimeoutError) Is(target error) bool { return target == net.Err // A VersionNegotiationError occurs when the client and the server can't agree on a QUIC version. type VersionNegotiationError struct { - Ours []protocol.VersionNumber - Theirs []protocol.VersionNumber + Ours []protocol.Version + Theirs []protocol.Version } func (e *VersionNegotiationError) Error() string { diff --git a/vendor/github.com/quic-go/quic-go/internal/qtls/cipher_suite_go121.go b/vendor/github.com/quic-go/quic-go/internal/qtls/cipher_suite.go similarity index 85% rename from vendor/github.com/quic-go/quic-go/internal/qtls/cipher_suite_go121.go rename to vendor/github.com/quic-go/quic-go/internal/qtls/cipher_suite.go index aa8c768fd..32a921cd5 100644 --- a/vendor/github.com/quic-go/quic-go/internal/qtls/cipher_suite_go121.go +++ b/vendor/github.com/quic-go/quic-go/internal/qtls/cipher_suite.go @@ -1,25 +1,11 @@ -//go:build go1.21 - package qtls import ( - "crypto" - "crypto/cipher" "crypto/tls" "fmt" "unsafe" ) -type cipherSuiteTLS13 struct { - ID uint16 - KeyLen int - AEAD func(key, fixedNonce []byte) cipher.AEAD - Hash crypto.Hash -} - -//go:linkname cipherSuiteTLS13ByID crypto/tls.cipherSuiteTLS13ByID -func cipherSuiteTLS13ByID(id uint16) *cipherSuiteTLS13 - //go:linkname cipherSuitesTLS13 crypto/tls.cipherSuitesTLS13 var cipherSuitesTLS13 []unsafe.Pointer diff --git a/vendor/github.com/quic-go/quic-go/internal/qtls/client_session_cache.go b/vendor/github.com/quic-go/quic-go/internal/qtls/client_session_cache.go index 519895ee6..4acac9e2e 100644 --- a/vendor/github.com/quic-go/quic-go/internal/qtls/client_session_cache.go +++ b/vendor/github.com/quic-go/quic-go/internal/qtls/client_session_cache.go @@ -1,20 +1,23 @@ -//go:build go1.21 - package qtls import ( "crypto/tls" + "sync" ) type clientSessionCache struct { - getData func() []byte - setData func([]byte) + mx sync.Mutex + getData func(earlyData bool) []byte + setData func(data []byte, earlyData bool) (allowEarlyData bool) wrapped tls.ClientSessionCache } var _ tls.ClientSessionCache = &clientSessionCache{} -func (c clientSessionCache) Put(key string, cs *tls.ClientSessionState) { +func (c *clientSessionCache) Put(key string, cs *tls.ClientSessionState) { + c.mx.Lock() + defer c.mx.Unlock() + if cs == nil { c.wrapped.Put(key, nil) return @@ -24,7 +27,7 @@ func (c clientSessionCache) Put(key string, cs *tls.ClientSessionState) { c.wrapped.Put(key, cs) return } - state.Extra = append(state.Extra, addExtraPrefix(c.getData())) + state.Extra = append(state.Extra, addExtraPrefix(c.getData(state.EarlyData))) newCS, err := tls.NewResumptionState(ticket, state) if err != nil { // It's not clear why this would error. Just save the original state. @@ -34,7 +37,10 @@ func (c clientSessionCache) Put(key string, cs *tls.ClientSessionState) { c.wrapped.Put(key, newCS) } -func (c clientSessionCache) Get(key string) (*tls.ClientSessionState, bool) { +func (c *clientSessionCache) Get(key string) (*tls.ClientSessionState, bool) { + c.mx.Lock() + defer c.mx.Unlock() + cs, ok := c.wrapped.Get(key) if !ok || cs == nil { return cs, ok @@ -48,7 +54,10 @@ func (c clientSessionCache) Get(key string) (*tls.ClientSessionState, bool) { } // restore QUIC transport parameters and RTT stored in state.Extra if extra := findExtraData(state.Extra); extra != nil { - c.setData(extra) + earlyData := c.setData(extra, state.EarlyData) + if state.EarlyData { + state.EarlyData = earlyData + } } session, err := tls.NewResumptionState(ticket, state) if err != nil { diff --git a/vendor/github.com/quic-go/quic-go/internal/qtls/go120.go b/vendor/github.com/quic-go/quic-go/internal/qtls/go120.go deleted file mode 100644 index 898f03526..000000000 --- a/vendor/github.com/quic-go/quic-go/internal/qtls/go120.go +++ /dev/null @@ -1,147 +0,0 @@ -//go:build go1.20 && !go1.21 - -package qtls - -import ( - "crypto/tls" - "fmt" - "unsafe" - - "github.com/quic-go/quic-go/internal/protocol" - - "github.com/quic-go/qtls-go1-20" -) - -type ( - QUICConn = qtls.QUICConn - QUICConfig = qtls.QUICConfig - QUICEvent = qtls.QUICEvent - QUICEventKind = qtls.QUICEventKind - QUICEncryptionLevel = qtls.QUICEncryptionLevel - AlertError = qtls.AlertError -) - -const ( - QUICEncryptionLevelInitial = qtls.QUICEncryptionLevelInitial - QUICEncryptionLevelEarly = qtls.QUICEncryptionLevelEarly - QUICEncryptionLevelHandshake = qtls.QUICEncryptionLevelHandshake - QUICEncryptionLevelApplication = qtls.QUICEncryptionLevelApplication -) - -const ( - QUICNoEvent = qtls.QUICNoEvent - QUICSetReadSecret = qtls.QUICSetReadSecret - QUICSetWriteSecret = qtls.QUICSetWriteSecret - QUICWriteData = qtls.QUICWriteData - QUICTransportParameters = qtls.QUICTransportParameters - QUICTransportParametersRequired = qtls.QUICTransportParametersRequired - QUICRejectedEarlyData = qtls.QUICRejectedEarlyData - QUICHandshakeDone = qtls.QUICHandshakeDone -) - -func SetupConfigForServer(conf *QUICConfig, enable0RTT bool, getDataForSessionTicket func() []byte, handleSessionTicket func([]byte, bool) bool) { - qtls.InitSessionTicketKeys(conf.TLSConfig) - conf.TLSConfig = conf.TLSConfig.Clone() - conf.TLSConfig.MinVersion = tls.VersionTLS13 - conf.ExtraConfig = &qtls.ExtraConfig{ - Enable0RTT: enable0RTT, - Accept0RTT: func(data []byte) bool { - return handleSessionTicket(data, true) - }, - GetAppDataForSessionTicket: getDataForSessionTicket, - } -} - -func SetupConfigForClient(conf *QUICConfig, getDataForSessionState func() []byte, setDataFromSessionState func([]byte)) { - conf.ExtraConfig = &qtls.ExtraConfig{ - GetAppDataForSessionState: getDataForSessionState, - SetAppDataFromSessionState: setDataFromSessionState, - } -} - -func QUICServer(config *QUICConfig) *QUICConn { - return qtls.QUICServer(config) -} - -func QUICClient(config *QUICConfig) *QUICConn { - return qtls.QUICClient(config) -} - -func ToTLSEncryptionLevel(e protocol.EncryptionLevel) qtls.QUICEncryptionLevel { - switch e { - case protocol.EncryptionInitial: - return qtls.QUICEncryptionLevelInitial - case protocol.EncryptionHandshake: - return qtls.QUICEncryptionLevelHandshake - case protocol.Encryption1RTT: - return qtls.QUICEncryptionLevelApplication - case protocol.Encryption0RTT: - return qtls.QUICEncryptionLevelEarly - default: - panic(fmt.Sprintf("unexpected encryption level: %s", e)) - } -} - -func FromTLSEncryptionLevel(e qtls.QUICEncryptionLevel) protocol.EncryptionLevel { - switch e { - case qtls.QUICEncryptionLevelInitial: - return protocol.EncryptionInitial - case qtls.QUICEncryptionLevelHandshake: - return protocol.EncryptionHandshake - case qtls.QUICEncryptionLevelApplication: - return protocol.Encryption1RTT - case qtls.QUICEncryptionLevelEarly: - return protocol.Encryption0RTT - default: - panic(fmt.Sprintf("unexpect encryption level: %s", e)) - } -} - -//go:linkname cipherSuitesTLS13 github.com/quic-go/qtls-go1-20.cipherSuitesTLS13 -var cipherSuitesTLS13 []unsafe.Pointer - -//go:linkname defaultCipherSuitesTLS13 github.com/quic-go/qtls-go1-20.defaultCipherSuitesTLS13 -var defaultCipherSuitesTLS13 []uint16 - -//go:linkname defaultCipherSuitesTLS13NoAES github.com/quic-go/qtls-go1-20.defaultCipherSuitesTLS13NoAES -var defaultCipherSuitesTLS13NoAES []uint16 - -var cipherSuitesModified bool - -// SetCipherSuite modifies the cipherSuiteTLS13 slice of cipher suites inside qtls -// such that it only contains the cipher suite with the chosen id. -// The reset function returned resets them back to the original value. -func SetCipherSuite(id uint16) (reset func()) { - if cipherSuitesModified { - panic("cipher suites modified multiple times without resetting") - } - cipherSuitesModified = true - - origCipherSuitesTLS13 := append([]unsafe.Pointer{}, cipherSuitesTLS13...) - origDefaultCipherSuitesTLS13 := append([]uint16{}, defaultCipherSuitesTLS13...) - origDefaultCipherSuitesTLS13NoAES := append([]uint16{}, defaultCipherSuitesTLS13NoAES...) - // The order is given by the order of the slice elements in cipherSuitesTLS13 in qtls. - switch id { - case tls.TLS_AES_128_GCM_SHA256: - cipherSuitesTLS13 = cipherSuitesTLS13[:1] - case tls.TLS_CHACHA20_POLY1305_SHA256: - cipherSuitesTLS13 = cipherSuitesTLS13[1:2] - case tls.TLS_AES_256_GCM_SHA384: - cipherSuitesTLS13 = cipherSuitesTLS13[2:] - default: - panic(fmt.Sprintf("unexpected cipher suite: %d", id)) - } - defaultCipherSuitesTLS13 = []uint16{id} - defaultCipherSuitesTLS13NoAES = []uint16{id} - - return func() { - cipherSuitesTLS13 = origCipherSuitesTLS13 - defaultCipherSuitesTLS13 = origDefaultCipherSuitesTLS13 - defaultCipherSuitesTLS13NoAES = origDefaultCipherSuitesTLS13NoAES - cipherSuitesModified = false - } -} - -func SendSessionTicket(c *QUICConn, allow0RTT bool) error { - return c.SendSessionTicket(allow0RTT) -} diff --git a/vendor/github.com/quic-go/quic-go/internal/qtls/go_oldversion.go b/vendor/github.com/quic-go/quic-go/internal/qtls/go_oldversion.go deleted file mode 100644 index 0fca80a38..000000000 --- a/vendor/github.com/quic-go/quic-go/internal/qtls/go_oldversion.go +++ /dev/null @@ -1,5 +0,0 @@ -//go:build !go1.20 - -package qtls - -var _ int = "The version of quic-go you're using can't be built using outdated Go versions. For more details, please see https://github.com/quic-go/quic-go/wiki/quic-go-and-Go-versions." diff --git a/vendor/github.com/quic-go/quic-go/internal/qtls/go121.go b/vendor/github.com/quic-go/quic-go/internal/qtls/qtls.go similarity index 66% rename from vendor/github.com/quic-go/quic-go/internal/qtls/go121.go rename to vendor/github.com/quic-go/quic-go/internal/qtls/qtls.go index 65a274ac0..ebcd9d4de 100644 --- a/vendor/github.com/quic-go/quic-go/internal/qtls/go121.go +++ b/vendor/github.com/quic-go/quic-go/internal/qtls/qtls.go @@ -1,5 +1,3 @@ -//go:build go1.21 - package qtls import ( @@ -10,38 +8,7 @@ import ( "github.com/quic-go/quic-go/internal/protocol" ) -type ( - QUICConn = tls.QUICConn - QUICConfig = tls.QUICConfig - QUICEvent = tls.QUICEvent - QUICEventKind = tls.QUICEventKind - QUICEncryptionLevel = tls.QUICEncryptionLevel - QUICSessionTicketOptions = tls.QUICSessionTicketOptions - AlertError = tls.AlertError -) - -const ( - QUICEncryptionLevelInitial = tls.QUICEncryptionLevelInitial - QUICEncryptionLevelEarly = tls.QUICEncryptionLevelEarly - QUICEncryptionLevelHandshake = tls.QUICEncryptionLevelHandshake - QUICEncryptionLevelApplication = tls.QUICEncryptionLevelApplication -) - -const ( - QUICNoEvent = tls.QUICNoEvent - QUICSetReadSecret = tls.QUICSetReadSecret - QUICSetWriteSecret = tls.QUICSetWriteSecret - QUICWriteData = tls.QUICWriteData - QUICTransportParameters = tls.QUICTransportParameters - QUICTransportParametersRequired = tls.QUICTransportParametersRequired - QUICRejectedEarlyData = tls.QUICRejectedEarlyData - QUICHandshakeDone = tls.QUICHandshakeDone -) - -func QUICServer(config *QUICConfig) *QUICConn { return tls.QUICServer(config) } -func QUICClient(config *QUICConfig) *QUICConn { return tls.QUICClient(config) } - -func SetupConfigForServer(qconf *QUICConfig, _ bool, getData func() []byte, handleSessionTicket func([]byte, bool) bool) { +func SetupConfigForServer(qconf *tls.QUICConfig, _ bool, getData func() []byte, handleSessionTicket func([]byte, bool) bool) { conf := qconf.TLSConfig // Workaround for https://github.com/golang/go/issues/60506. @@ -93,7 +60,11 @@ func SetupConfigForServer(qconf *QUICConfig, _ bool, getData func() []byte, hand } } -func SetupConfigForClient(qconf *QUICConfig, getData func() []byte, setData func([]byte)) { +func SetupConfigForClient( + qconf *tls.QUICConfig, + getData func(earlyData bool) []byte, + setData func(data []byte, earlyData bool) (allowEarlyData bool), +) { conf := qconf.TLSConfig if conf.ClientSessionCache != nil { origCache := conf.ClientSessionCache @@ -151,9 +122,3 @@ func findExtraData(extras [][]byte) []byte { } return nil } - -func SendSessionTicket(c *QUICConn, allow0RTT bool) error { - return c.SendSessionTicket(tls.QUICSessionTicketOptions{ - EarlyData: allow0RTT, - }) -} diff --git a/vendor/github.com/quic-go/quic-go/internal/utils/minmax.go b/vendor/github.com/quic-go/quic-go/internal/utils/minmax.go index d191f7515..03a9c9a87 100644 --- a/vendor/github.com/quic-go/quic-go/internal/utils/minmax.go +++ b/vendor/github.com/quic-go/quic-go/internal/utils/minmax.go @@ -3,27 +3,11 @@ package utils import ( "math" "time" - - "golang.org/x/exp/constraints" ) // InfDuration is a duration of infinite length const InfDuration = time.Duration(math.MaxInt64) -func Max[T constraints.Ordered](a, b T) T { - if a < b { - return b - } - return a -} - -func Min[T constraints.Ordered](a, b T) T { - if a < b { - return a - } - return b -} - // MinNonZeroDuration return the minimum duration that's not zero. func MinNonZeroDuration(a, b time.Duration) time.Duration { if a == 0 { @@ -32,15 +16,7 @@ func MinNonZeroDuration(a, b time.Duration) time.Duration { if b == 0 { return a } - return Min(a, b) -} - -// AbsDuration returns the absolute value of a time duration -func AbsDuration(d time.Duration) time.Duration { - if d >= 0 { - return d - } - return -d + return min(a, b) } // MinTime returns the earlier time @@ -51,18 +27,6 @@ func MinTime(a, b time.Time) time.Time { return a } -// MinNonZeroTime returns the earlist time that is not time.Time{} -// If both a and b are time.Time{}, it returns time.Time{} -func MinNonZeroTime(a, b time.Time) time.Time { - if a.IsZero() { - return b - } - if b.IsZero() { - return a - } - return MinTime(a, b) -} - // MaxTime returns the later time func MaxTime(a, b time.Time) time.Time { if a.After(b) { diff --git a/vendor/github.com/quic-go/quic-go/internal/utils/ringbuffer/ringbuffer.go b/vendor/github.com/quic-go/quic-go/internal/utils/ringbuffer/ringbuffer.go index 81a5ad44b..f9b2c797b 100644 --- a/vendor/github.com/quic-go/quic-go/internal/utils/ringbuffer/ringbuffer.go +++ b/vendor/github.com/quic-go/quic-go/internal/utils/ringbuffer/ringbuffer.go @@ -8,7 +8,7 @@ type RingBuffer[T any] struct { full bool } -// Init preallocs a buffer with a certain size. +// Init preallocates a buffer with a certain size. func (r *RingBuffer[T]) Init(size int) { r.ring = make([]T, size) } @@ -62,6 +62,16 @@ func (r *RingBuffer[T]) PopFront() T { return t } +// PeekFront returns the next element. +// It must not be called when the buffer is empty, that means that +// callers might need to check if there are elements in the buffer first. +func (r *RingBuffer[T]) PeekFront() T { + if r.Empty() { + panic("github.com/quic-go/quic-go/internal/utils/ringbuffer: peek from an empty queue") + } + return r.ring[r.headPos] +} + // Grow the maximum size of the queue. // This method assume the queue is full. func (r *RingBuffer[T]) grow() { diff --git a/vendor/github.com/quic-go/quic-go/internal/utils/rtt_stats.go b/vendor/github.com/quic-go/quic-go/internal/utils/rtt_stats.go index 2cd9a1919..463b95424 100644 --- a/vendor/github.com/quic-go/quic-go/internal/utils/rtt_stats.go +++ b/vendor/github.com/quic-go/quic-go/internal/utils/rtt_stats.go @@ -55,7 +55,7 @@ func (r *RTTStats) PTO(includeMaxAckDelay bool) time.Duration { if r.SmoothedRTT() == 0 { return 2 * defaultInitialRTT } - pto := r.SmoothedRTT() + Max(4*r.MeanDeviation(), protocol.TimerGranularity) + pto := r.SmoothedRTT() + max(4*r.MeanDeviation(), protocol.TimerGranularity) if includeMaxAckDelay { pto += r.MaxAckDelay() } @@ -90,7 +90,7 @@ func (r *RTTStats) UpdateRTT(sendDelta, ackDelay time.Duration, now time.Time) { r.smoothedRTT = sample r.meanDeviation = sample / 2 } else { - r.meanDeviation = time.Duration(oneMinusBeta*float32(r.meanDeviation/time.Microsecond)+rttBeta*float32(AbsDuration(r.smoothedRTT-sample)/time.Microsecond)) * time.Microsecond + r.meanDeviation = time.Duration(oneMinusBeta*float32(r.meanDeviation/time.Microsecond)+rttBeta*float32((r.smoothedRTT-sample).Abs()/time.Microsecond)) * time.Microsecond r.smoothedRTT = time.Duration((float32(r.smoothedRTT/time.Microsecond)*oneMinusAlpha)+(float32(sample/time.Microsecond)*rttAlpha)) * time.Microsecond } } @@ -126,6 +126,6 @@ func (r *RTTStats) OnConnectionMigration() { // is larger. The mean deviation is increased to the most recent deviation if // it's larger. func (r *RTTStats) ExpireSmoothedMetrics() { - r.meanDeviation = Max(r.meanDeviation, AbsDuration(r.smoothedRTT-r.latestRTT)) - r.smoothedRTT = Max(r.smoothedRTT, r.latestRTT) + r.meanDeviation = max(r.meanDeviation, (r.smoothedRTT - r.latestRTT).Abs()) + r.smoothedRTT = max(r.smoothedRTT, r.latestRTT) } diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/ack_frame.go b/vendor/github.com/quic-go/quic-go/internal/wire/ack_frame.go index 9b23cc25f..e0f2db3c7 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/ack_frame.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/ack_frame.go @@ -1,7 +1,6 @@ package wire import ( - "bytes" "errors" "sort" "time" @@ -22,95 +21,105 @@ type AckFrame struct { } // parseAckFrame reads an ACK frame -func parseAckFrame(frame *AckFrame, r *bytes.Reader, typ uint64, ackDelayExponent uint8, _ protocol.VersionNumber) error { +func parseAckFrame(frame *AckFrame, b []byte, typ uint64, ackDelayExponent uint8, _ protocol.Version) (int, error) { + startLen := len(b) ecn := typ == ackECNFrameType - la, err := quicvarint.Read(r) + la, l, err := quicvarint.Parse(b) if err != nil { - return err + return 0, replaceUnexpectedEOF(err) } + b = b[l:] largestAcked := protocol.PacketNumber(la) - delay, err := quicvarint.Read(r) + delay, l, err := quicvarint.Parse(b) if err != nil { - return err + return 0, replaceUnexpectedEOF(err) } + b = b[l:] delayTime := time.Duration(delay*1< largestAcked { - return errors.New("invalid first ACK range") + return 0, errors.New("invalid first ACK range") } smallest := largestAcked - ackBlock + frame.AckRanges = append(frame.AckRanges, AckRange{Smallest: smallest, Largest: largestAcked}) // read all the other ACK ranges - frame.AckRanges = append(frame.AckRanges, AckRange{Smallest: smallest, Largest: largestAcked}) for i := uint64(0); i < numBlocks; i++ { - g, err := quicvarint.Read(r) + g, l, err := quicvarint.Parse(b) if err != nil { - return err + return 0, replaceUnexpectedEOF(err) } + b = b[l:] gap := protocol.PacketNumber(g) if smallest < gap+2 { - return errInvalidAckRanges + return 0, errInvalidAckRanges } largest := smallest - gap - 2 - ab, err := quicvarint.Read(r) + ab, l, err := quicvarint.Parse(b) if err != nil { - return err + return 0, replaceUnexpectedEOF(err) } + b = b[l:] ackBlock := protocol.PacketNumber(ab) if ackBlock > largest { - return errInvalidAckRanges + return 0, errInvalidAckRanges } smallest = largest - ackBlock frame.AckRanges = append(frame.AckRanges, AckRange{Smallest: smallest, Largest: largest}) } if !frame.validateAckRanges() { - return errInvalidAckRanges + return 0, errInvalidAckRanges } if ecn { - ect0, err := quicvarint.Read(r) + ect0, l, err := quicvarint.Parse(b) if err != nil { - return err + return 0, replaceUnexpectedEOF(err) } + b = b[l:] frame.ECT0 = ect0 - ect1, err := quicvarint.Read(r) + ect1, l, err := quicvarint.Parse(b) if err != nil { - return err + return 0, replaceUnexpectedEOF(err) } + b = b[l:] frame.ECT1 = ect1 - ecnce, err := quicvarint.Read(r) + ecnce, l, err := quicvarint.Parse(b) if err != nil { - return err + return 0, replaceUnexpectedEOF(err) } + b = b[l:] frame.ECNCE = ecnce } - return nil + return startLen - len(b), nil } // Append appends an ACK frame. -func (f *AckFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, error) { +func (f *AckFrame) Append(b []byte, _ protocol.Version) ([]byte, error) { hasECN := f.ECT0 > 0 || f.ECT1 > 0 || f.ECNCE > 0 if hasECN { b = append(b, ackECNFrameType) @@ -143,7 +152,7 @@ func (f *AckFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, error) { } // Length of a written frame -func (f *AckFrame) Length(_ protocol.VersionNumber) protocol.ByteCount { +func (f *AckFrame) Length(_ protocol.Version) protocol.ByteCount { largestAcked := f.AckRanges[0].Largest numRanges := f.numEncodableAckRanges() @@ -163,7 +172,7 @@ func (f *AckFrame) Length(_ protocol.VersionNumber) protocol.ByteCount { length += quicvarint.Len(f.ECT1) length += quicvarint.Len(f.ECNCE) } - return length + return protocol.ByteCount(length) } // gets the number of ACK ranges that can be encoded @@ -174,7 +183,7 @@ func (f *AckFrame) numEncodableAckRanges() int { for i := 1; i < len(f.AckRanges); i++ { gap, len := f.encodeAckRange(i) rangeLen := quicvarint.Len(gap) + quicvarint.Len(len) - if length+rangeLen > protocol.MaxAckFrameSize { + if protocol.ByteCount(length+rangeLen) > protocol.MaxAckFrameSize { // Writing range i would exceed the MaxAckFrameSize. // So encode one range less than that. return i - 1 diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/connection_close_frame.go b/vendor/github.com/quic-go/quic-go/internal/wire/connection_close_frame.go index f56c2c0d8..be11a1b2e 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/connection_close_frame.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/connection_close_frame.go @@ -1,7 +1,6 @@ package wire import ( - "bytes" "io" "github.com/quic-go/quic-go/internal/protocol" @@ -16,52 +15,50 @@ type ConnectionCloseFrame struct { ReasonPhrase string } -func parseConnectionCloseFrame(r *bytes.Reader, typ uint64, _ protocol.VersionNumber) (*ConnectionCloseFrame, error) { +func parseConnectionCloseFrame(b []byte, typ uint64, _ protocol.Version) (*ConnectionCloseFrame, int, error) { + startLen := len(b) f := &ConnectionCloseFrame{IsApplicationError: typ == applicationCloseFrameType} - ec, err := quicvarint.Read(r) + ec, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } + b = b[l:] f.ErrorCode = ec // read the Frame Type, if this is not an application error if !f.IsApplicationError { - ft, err := quicvarint.Read(r) + ft, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } + b = b[l:] f.FrameType = ft } var reasonPhraseLen uint64 - reasonPhraseLen, err = quicvarint.Read(r) + reasonPhraseLen, l, err = quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } - // shortcut to prevent the unnecessary allocation of dataLen bytes - // if the dataLen is larger than the remaining length of the packet - // reading the whole reason phrase would result in EOF when attempting to READ - if int(reasonPhraseLen) > r.Len() { - return nil, io.EOF + b = b[l:] + if int(reasonPhraseLen) > len(b) { + return nil, 0, io.EOF } reasonPhrase := make([]byte, reasonPhraseLen) - if _, err := io.ReadFull(r, reasonPhrase); err != nil { - // this should never happen, since we already checked the reasonPhraseLen earlier - return nil, err - } + copy(reasonPhrase, b) f.ReasonPhrase = string(reasonPhrase) - return f, nil + return f, startLen - len(b) + int(reasonPhraseLen), nil } // Length of a written frame -func (f *ConnectionCloseFrame) Length(protocol.VersionNumber) protocol.ByteCount { - length := 1 + quicvarint.Len(f.ErrorCode) + quicvarint.Len(uint64(len(f.ReasonPhrase))) + protocol.ByteCount(len(f.ReasonPhrase)) +func (f *ConnectionCloseFrame) Length(protocol.Version) protocol.ByteCount { + length := 1 + protocol.ByteCount(quicvarint.Len(f.ErrorCode)+quicvarint.Len(uint64(len(f.ReasonPhrase)))) + protocol.ByteCount(len(f.ReasonPhrase)) if !f.IsApplicationError { - length += quicvarint.Len(f.FrameType) // for the frame type + length += protocol.ByteCount(quicvarint.Len(f.FrameType)) // for the frame type } return length } -func (f *ConnectionCloseFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, error) { +func (f *ConnectionCloseFrame) Append(b []byte, _ protocol.Version) ([]byte, error) { if f.IsApplicationError { b = append(b, applicationCloseFrameType) } else { diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/crypto_frame.go b/vendor/github.com/quic-go/quic-go/internal/wire/crypto_frame.go index 0f005c5ba..0aa7fe7bc 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/crypto_frame.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/crypto_frame.go @@ -1,7 +1,6 @@ package wire import ( - "bytes" "io" "github.com/quic-go/quic-go/internal/protocol" @@ -14,31 +13,31 @@ type CryptoFrame struct { Data []byte } -func parseCryptoFrame(r *bytes.Reader, _ protocol.VersionNumber) (*CryptoFrame, error) { +func parseCryptoFrame(b []byte, _ protocol.Version) (*CryptoFrame, int, error) { + startLen := len(b) frame := &CryptoFrame{} - offset, err := quicvarint.Read(r) + offset, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } + b = b[l:] frame.Offset = protocol.ByteCount(offset) - dataLen, err := quicvarint.Read(r) + dataLen, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } - if dataLen > uint64(r.Len()) { - return nil, io.EOF + b = b[l:] + if dataLen > uint64(len(b)) { + return nil, 0, io.EOF } if dataLen != 0 { frame.Data = make([]byte, dataLen) - if _, err := io.ReadFull(r, frame.Data); err != nil { - // this should never happen, since we already checked the dataLen earlier - return nil, err - } + copy(frame.Data, b) } - return frame, nil + return frame, startLen - len(b) + int(dataLen), nil } -func (f *CryptoFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, error) { +func (f *CryptoFrame) Append(b []byte, _ protocol.Version) ([]byte, error) { b = append(b, cryptoFrameType) b = quicvarint.Append(b, uint64(f.Offset)) b = quicvarint.Append(b, uint64(len(f.Data))) @@ -47,15 +46,15 @@ func (f *CryptoFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, error) } // Length of a written frame -func (f *CryptoFrame) Length(_ protocol.VersionNumber) protocol.ByteCount { - return 1 + quicvarint.Len(uint64(f.Offset)) + quicvarint.Len(uint64(len(f.Data))) + protocol.ByteCount(len(f.Data)) +func (f *CryptoFrame) Length(_ protocol.Version) protocol.ByteCount { + return protocol.ByteCount(1 + quicvarint.Len(uint64(f.Offset)) + quicvarint.Len(uint64(len(f.Data))) + len(f.Data)) } // MaxDataLen returns the maximum data length func (f *CryptoFrame) MaxDataLen(maxSize protocol.ByteCount) protocol.ByteCount { // pretend that the data size will be 1 bytes // if it turns out that varint encoding the length will consume 2 bytes, we need to adjust the data length afterwards - headerLen := 1 + quicvarint.Len(uint64(f.Offset)) + 1 + headerLen := protocol.ByteCount(1 + quicvarint.Len(uint64(f.Offset)) + 1) if headerLen > maxSize { return 0 } @@ -71,7 +70,7 @@ func (f *CryptoFrame) MaxDataLen(maxSize protocol.ByteCount) protocol.ByteCount // The frame might not be split if: // * the size is large enough to fit the whole frame // * the size is too small to fit even a 1-byte frame. In that case, the frame returned is nil. -func (f *CryptoFrame) MaybeSplitOffFrame(maxSize protocol.ByteCount, version protocol.VersionNumber) (*CryptoFrame, bool /* was splitting required */) { +func (f *CryptoFrame) MaybeSplitOffFrame(maxSize protocol.ByteCount, version protocol.Version) (*CryptoFrame, bool /* was splitting required */) { if f.Length(version) <= maxSize { return nil, false } diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/data_blocked_frame.go b/vendor/github.com/quic-go/quic-go/internal/wire/data_blocked_frame.go index 0d4d1f565..c97d4c629 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/data_blocked_frame.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/data_blocked_frame.go @@ -1,8 +1,6 @@ package wire import ( - "bytes" - "github.com/quic-go/quic-go/internal/protocol" "github.com/quic-go/quic-go/quicvarint" ) @@ -12,20 +10,20 @@ type DataBlockedFrame struct { MaximumData protocol.ByteCount } -func parseDataBlockedFrame(r *bytes.Reader, _ protocol.VersionNumber) (*DataBlockedFrame, error) { - offset, err := quicvarint.Read(r) +func parseDataBlockedFrame(b []byte, _ protocol.Version) (*DataBlockedFrame, int, error) { + offset, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } - return &DataBlockedFrame{MaximumData: protocol.ByteCount(offset)}, nil + return &DataBlockedFrame{MaximumData: protocol.ByteCount(offset)}, l, nil } -func (f *DataBlockedFrame) Append(b []byte, version protocol.VersionNumber) ([]byte, error) { +func (f *DataBlockedFrame) Append(b []byte, version protocol.Version) ([]byte, error) { b = append(b, dataBlockedFrameType) return quicvarint.Append(b, uint64(f.MaximumData)), nil } // Length of a written frame -func (f *DataBlockedFrame) Length(version protocol.VersionNumber) protocol.ByteCount { - return 1 + quicvarint.Len(uint64(f.MaximumData)) +func (f *DataBlockedFrame) Length(version protocol.Version) protocol.ByteCount { + return 1 + protocol.ByteCount(quicvarint.Len(uint64(f.MaximumData))) } diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/datagram_frame.go b/vendor/github.com/quic-go/quic-go/internal/wire/datagram_frame.go index e6c451961..071fda9a0 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/datagram_frame.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/datagram_frame.go @@ -1,45 +1,50 @@ package wire import ( - "bytes" "io" "github.com/quic-go/quic-go/internal/protocol" "github.com/quic-go/quic-go/quicvarint" ) +// MaxDatagramSize is the maximum size of a DATAGRAM frame (RFC 9221). +// By setting it to a large value, we allow all datagrams that fit into a QUIC packet. +// The value is chosen such that it can still be encoded as a 2 byte varint. +// This is a var and not a const so it can be set in tests. +var MaxDatagramSize protocol.ByteCount = 16383 + // A DatagramFrame is a DATAGRAM frame type DatagramFrame struct { DataLenPresent bool Data []byte } -func parseDatagramFrame(r *bytes.Reader, typ uint64, _ protocol.VersionNumber) (*DatagramFrame, error) { +func parseDatagramFrame(b []byte, typ uint64, _ protocol.Version) (*DatagramFrame, int, error) { + startLen := len(b) f := &DatagramFrame{} f.DataLenPresent = typ&0x1 > 0 var length uint64 if f.DataLenPresent { var err error - len, err := quicvarint.Read(r) + var l int + length, l, err = quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } - if len > uint64(r.Len()) { - return nil, io.EOF + b = b[l:] + if length > uint64(len(b)) { + return nil, 0, io.EOF } - length = len } else { - length = uint64(r.Len()) + length = uint64(len(b)) } f.Data = make([]byte, length) - if _, err := io.ReadFull(r, f.Data); err != nil { - return nil, err - } - return f, nil + copy(f.Data, b) + return f, startLen - len(b) + int(length), nil } -func (f *DatagramFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, error) { +func (f *DatagramFrame) Append(b []byte, _ protocol.Version) ([]byte, error) { typ := uint8(0x30) if f.DataLenPresent { typ ^= 0b1 @@ -53,7 +58,7 @@ func (f *DatagramFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, erro } // MaxDataLen returns the maximum data length -func (f *DatagramFrame) MaxDataLen(maxSize protocol.ByteCount, version protocol.VersionNumber) protocol.ByteCount { +func (f *DatagramFrame) MaxDataLen(maxSize protocol.ByteCount, version protocol.Version) protocol.ByteCount { headerLen := protocol.ByteCount(1) if f.DataLenPresent { // pretend that the data size will be 1 bytes @@ -71,10 +76,10 @@ func (f *DatagramFrame) MaxDataLen(maxSize protocol.ByteCount, version protocol. } // Length of a written frame -func (f *DatagramFrame) Length(_ protocol.VersionNumber) protocol.ByteCount { +func (f *DatagramFrame) Length(_ protocol.Version) protocol.ByteCount { length := 1 + protocol.ByteCount(len(f.Data)) if f.DataLenPresent { - length += quicvarint.Len(uint64(len(f.Data))) + length += protocol.ByteCount(quicvarint.Len(uint64(len(f.Data)))) } return length } diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/extended_header.go b/vendor/github.com/quic-go/quic-go/internal/wire/extended_header.go index d10820d6d..6e3b1224b 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/extended_header.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/extended_header.go @@ -32,7 +32,7 @@ type ExtendedHeader struct { parsedLen protocol.ByteCount } -func (h *ExtendedHeader) parse(b *bytes.Reader, v protocol.VersionNumber) (bool /* reserved bits valid */, error) { +func (h *ExtendedHeader) parse(b *bytes.Reader, v protocol.Version) (bool /* reserved bits valid */, error) { startLen := b.Len() // read the (now unencrypted) first byte var err error @@ -51,7 +51,7 @@ func (h *ExtendedHeader) parse(b *bytes.Reader, v protocol.VersionNumber) (bool return reservedBitsValid, err } -func (h *ExtendedHeader) parseLongHeader(b *bytes.Reader, _ protocol.VersionNumber) (bool /* reserved bits valid */, error) { +func (h *ExtendedHeader) parseLongHeader(b *bytes.Reader, _ protocol.Version) (bool /* reserved bits valid */, error) { if err := h.readPacketNumber(b); err != nil { return false, err } @@ -95,7 +95,7 @@ func (h *ExtendedHeader) readPacketNumber(b *bytes.Reader) error { } // Append appends the Header. -func (h *ExtendedHeader) Append(b []byte, v protocol.VersionNumber) ([]byte, error) { +func (h *ExtendedHeader) Append(b []byte, v protocol.Version) ([]byte, error) { if h.DestConnectionID.Len() > protocol.MaxConnIDLen { return nil, fmt.Errorf("invalid connection ID length: %d bytes", h.DestConnectionID.Len()) } @@ -162,10 +162,10 @@ func (h *ExtendedHeader) ParsedLen() protocol.ByteCount { } // GetLength determines the length of the Header. -func (h *ExtendedHeader) GetLength(_ protocol.VersionNumber) protocol.ByteCount { +func (h *ExtendedHeader) GetLength(_ protocol.Version) protocol.ByteCount { length := 1 /* type byte */ + 4 /* version */ + 1 /* dest conn ID len */ + protocol.ByteCount(h.DestConnectionID.Len()) + 1 /* src conn ID len */ + protocol.ByteCount(h.SrcConnectionID.Len()) + protocol.ByteCount(h.PacketNumberLen) + 2 /* length */ if h.Type == protocol.PacketTypeInitial { - length += quicvarint.Len(uint64(len(h.Token))) + protocol.ByteCount(len(h.Token)) + length += protocol.ByteCount(quicvarint.Len(uint64(len(h.Token))) + len(h.Token)) } return length } diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/frame_parser.go b/vendor/github.com/quic-go/quic-go/internal/wire/frame_parser.go index ff35dd101..59d41444a 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/frame_parser.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/frame_parser.go @@ -1,9 +1,9 @@ package wire import ( - "bytes" "errors" "fmt" + "io" "reflect" "github.com/quic-go/quic-go/internal/protocol" @@ -36,9 +36,8 @@ const ( handshakeDoneFrameType = 0x1e ) -type frameParser struct { - r bytes.Reader // cached bytes.Reader, so we don't have to repeatedly allocate them - +// The FrameParser parses QUIC frames, one by one. +type FrameParser struct { ackDelayExponent uint8 supportsDatagrams bool @@ -47,12 +46,9 @@ type frameParser struct { ackFrame *AckFrame } -var _ FrameParser = &frameParser{} - // NewFrameParser creates a new frame parser. -func NewFrameParser(supportsDatagrams bool) *frameParser { - return &frameParser{ - r: *bytes.NewReader(nil), +func NewFrameParser(supportsDatagrams bool) *FrameParser { + return &FrameParser{ supportsDatagrams: supportsDatagrams, ackFrame: &AckFrame{}, } @@ -60,46 +56,47 @@ func NewFrameParser(supportsDatagrams bool) *frameParser { // ParseNext parses the next frame. // It skips PADDING frames. -func (p *frameParser) ParseNext(data []byte, encLevel protocol.EncryptionLevel, v protocol.VersionNumber) (int, Frame, error) { - startLen := len(data) - p.r.Reset(data) - frame, err := p.parseNext(&p.r, encLevel, v) - n := startLen - p.r.Len() - p.r.Reset(nil) - return n, frame, err +func (p *FrameParser) ParseNext(data []byte, encLevel protocol.EncryptionLevel, v protocol.Version) (int, Frame, error) { + frame, l, err := p.parseNext(data, encLevel, v) + return l, frame, err } -func (p *frameParser) parseNext(r *bytes.Reader, encLevel protocol.EncryptionLevel, v protocol.VersionNumber) (Frame, error) { - for r.Len() != 0 { - typ, err := quicvarint.Read(r) +func (p *FrameParser) parseNext(b []byte, encLevel protocol.EncryptionLevel, v protocol.Version) (Frame, int, error) { + var parsed int + for len(b) != 0 { + typ, l, err := quicvarint.Parse(b) + parsed += l if err != nil { - return nil, &qerr.TransportError{ + return nil, parsed, &qerr.TransportError{ ErrorCode: qerr.FrameEncodingError, ErrorMessage: err.Error(), } } + b = b[l:] if typ == 0x0 { // skip PADDING frames continue } - f, err := p.parseFrame(r, typ, encLevel, v) + f, l, err := p.parseFrame(b, typ, encLevel, v) + parsed += l if err != nil { - return nil, &qerr.TransportError{ + return nil, parsed, &qerr.TransportError{ FrameType: typ, ErrorCode: qerr.FrameEncodingError, ErrorMessage: err.Error(), } } - return f, nil + return f, parsed, nil } - return nil, nil + return nil, parsed, nil } -func (p *frameParser) parseFrame(r *bytes.Reader, typ uint64, encLevel protocol.EncryptionLevel, v protocol.VersionNumber) (Frame, error) { +func (p *FrameParser) parseFrame(b []byte, typ uint64, encLevel protocol.EncryptionLevel, v protocol.Version) (Frame, int, error) { var frame Frame var err error + var l int if typ&0xf8 == 0x8 { - frame, err = parseStreamFrame(r, typ, v) + frame, l, err = parseStreamFrame(b, typ, v) } else { switch typ { case pingFrameType: @@ -110,43 +107,43 @@ func (p *frameParser) parseFrame(r *bytes.Reader, typ uint64, encLevel protocol. ackDelayExponent = protocol.DefaultAckDelayExponent } p.ackFrame.Reset() - err = parseAckFrame(p.ackFrame, r, typ, ackDelayExponent, v) + l, err = parseAckFrame(p.ackFrame, b, typ, ackDelayExponent, v) frame = p.ackFrame case resetStreamFrameType: - frame, err = parseResetStreamFrame(r, v) + frame, l, err = parseResetStreamFrame(b, v) case stopSendingFrameType: - frame, err = parseStopSendingFrame(r, v) + frame, l, err = parseStopSendingFrame(b, v) case cryptoFrameType: - frame, err = parseCryptoFrame(r, v) + frame, l, err = parseCryptoFrame(b, v) case newTokenFrameType: - frame, err = parseNewTokenFrame(r, v) + frame, l, err = parseNewTokenFrame(b, v) case maxDataFrameType: - frame, err = parseMaxDataFrame(r, v) + frame, l, err = parseMaxDataFrame(b, v) case maxStreamDataFrameType: - frame, err = parseMaxStreamDataFrame(r, v) + frame, l, err = parseMaxStreamDataFrame(b, v) case bidiMaxStreamsFrameType, uniMaxStreamsFrameType: - frame, err = parseMaxStreamsFrame(r, typ, v) + frame, l, err = parseMaxStreamsFrame(b, typ, v) case dataBlockedFrameType: - frame, err = parseDataBlockedFrame(r, v) + frame, l, err = parseDataBlockedFrame(b, v) case streamDataBlockedFrameType: - frame, err = parseStreamDataBlockedFrame(r, v) + frame, l, err = parseStreamDataBlockedFrame(b, v) case bidiStreamBlockedFrameType, uniStreamBlockedFrameType: - frame, err = parseStreamsBlockedFrame(r, typ, v) + frame, l, err = parseStreamsBlockedFrame(b, typ, v) case newConnectionIDFrameType: - frame, err = parseNewConnectionIDFrame(r, v) + frame, l, err = parseNewConnectionIDFrame(b, v) case retireConnectionIDFrameType: - frame, err = parseRetireConnectionIDFrame(r, v) + frame, l, err = parseRetireConnectionIDFrame(b, v) case pathChallengeFrameType: - frame, err = parsePathChallengeFrame(r, v) + frame, l, err = parsePathChallengeFrame(b, v) case pathResponseFrameType: - frame, err = parsePathResponseFrame(r, v) + frame, l, err = parsePathResponseFrame(b, v) case connectionCloseFrameType, applicationCloseFrameType: - frame, err = parseConnectionCloseFrame(r, typ, v) + frame, l, err = parseConnectionCloseFrame(b, typ, v) case handshakeDoneFrameType: frame = &HandshakeDoneFrame{} case 0x30, 0x31: if p.supportsDatagrams { - frame, err = parseDatagramFrame(r, typ, v) + frame, l, err = parseDatagramFrame(b, typ, v) break } fallthrough @@ -155,15 +152,15 @@ func (p *frameParser) parseFrame(r *bytes.Reader, typ uint64, encLevel protocol. } } if err != nil { - return nil, err + return nil, 0, err } if !p.isAllowedAtEncLevel(frame, encLevel) { - return nil, fmt.Errorf("%s not allowed at encryption level %s", reflect.TypeOf(frame).Elem().Name(), encLevel) + return nil, l, fmt.Errorf("%s not allowed at encryption level %s", reflect.TypeOf(frame).Elem().Name(), encLevel) } - return frame, nil + return frame, l, nil } -func (p *frameParser) isAllowedAtEncLevel(f Frame, encLevel protocol.EncryptionLevel) bool { +func (p *FrameParser) isAllowedAtEncLevel(f Frame, encLevel protocol.EncryptionLevel) bool { switch encLevel { case protocol.EncryptionInitial, protocol.EncryptionHandshake: switch f.(type) { @@ -186,6 +183,15 @@ func (p *frameParser) isAllowedAtEncLevel(f Frame, encLevel protocol.EncryptionL } } -func (p *frameParser) SetAckDelayExponent(exp uint8) { +// SetAckDelayExponent sets the acknowledgment delay exponent (sent in the transport parameters). +// This value is used to scale the ACK Delay field in the ACK frame. +func (p *FrameParser) SetAckDelayExponent(exp uint8) { p.ackDelayExponent = exp } + +func replaceUnexpectedEOF(e error) error { + if e == io.ErrUnexpectedEOF { + return io.EOF + } + return e +} diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/handshake_done_frame.go b/vendor/github.com/quic-go/quic-go/internal/wire/handshake_done_frame.go index 29521bc9e..85dd64745 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/handshake_done_frame.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/handshake_done_frame.go @@ -7,11 +7,11 @@ import ( // A HandshakeDoneFrame is a HANDSHAKE_DONE frame type HandshakeDoneFrame struct{} -func (f *HandshakeDoneFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, error) { +func (f *HandshakeDoneFrame) Append(b []byte, _ protocol.Version) ([]byte, error) { return append(b, handshakeDoneFrameType), nil } // Length of a written frame -func (f *HandshakeDoneFrame) Length(_ protocol.VersionNumber) protocol.ByteCount { +func (f *HandshakeDoneFrame) Length(_ protocol.Version) protocol.ByteCount { return 1 } diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/header.go b/vendor/github.com/quic-go/quic-go/internal/wire/header.go index 0c60f4dd9..5ec74b16c 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/header.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/header.go @@ -8,7 +8,6 @@ import ( "io" "github.com/quic-go/quic-go/internal/protocol" - "github.com/quic-go/quic-go/internal/utils" "github.com/quic-go/quic-go/quicvarint" ) @@ -85,11 +84,11 @@ func IsLongHeaderPacket(firstByte byte) bool { // ParseVersion parses the QUIC version. // It should only be called for Long Header packets (Short Header packets don't contain a version number). -func ParseVersion(data []byte) (protocol.VersionNumber, error) { +func ParseVersion(data []byte) (protocol.Version, error) { if len(data) < 5 { return 0, io.EOF } - return protocol.VersionNumber(binary.BigEndian.Uint32(data[1:5])), nil + return protocol.Version(binary.BigEndian.Uint32(data[1:5])), nil } // IsVersionNegotiationPacket says if this is a version negotiation packet @@ -109,7 +108,7 @@ func Is0RTTPacket(b []byte) bool { if !IsLongHeaderPacket(b[0]) { return false } - version := protocol.VersionNumber(binary.BigEndian.Uint32(b[1:5])) + version := protocol.Version(binary.BigEndian.Uint32(b[1:5])) //nolint:exhaustive // We only need to test QUIC versions that we support. switch version { case protocol.Version1: @@ -128,7 +127,7 @@ type Header struct { typeByte byte Type protocol.PacketType - Version protocol.VersionNumber + Version protocol.Version SrcConnectionID protocol.ConnectionID DestConnectionID protocol.ConnectionID @@ -139,18 +138,18 @@ type Header struct { parsedLen protocol.ByteCount // how many bytes were read while parsing this header } -// ParsePacket parses a packet. -// If the packet has a long header, the packet is cut according to the length field. -// If we understand the version, the packet is header up unto the packet number. +// ParsePacket parses a long header packet. +// The packet is cut according to the length field. +// If we understand the version, the packet is parsed up unto the packet number. // Otherwise, only the invariant part of the header is parsed. func ParsePacket(data []byte) (*Header, []byte, []byte, error) { if len(data) == 0 || !IsLongHeaderPacket(data[0]) { return nil, nil, nil, errors.New("not a long header packet") } - hdr, err := parseHeader(bytes.NewReader(data)) + hdr, err := parseHeader(data) if err != nil { - if err == ErrUnsupportedVersion { - return hdr, nil, nil, ErrUnsupportedVersion + if errors.Is(err, ErrUnsupportedVersion) { + return hdr, nil, nil, err } return nil, nil, nil, err } @@ -161,55 +160,55 @@ func ParsePacket(data []byte) (*Header, []byte, []byte, error) { return hdr, data[:packetLen], data[packetLen:], nil } -// ParseHeader parses the header. -// For short header packets: up to the packet number. -// For long header packets: +// ParseHeader parses the header: // * if we understand the version: up to the packet number // * if not, only the invariant part of the header -func parseHeader(b *bytes.Reader) (*Header, error) { - startLen := b.Len() - typeByte, err := b.ReadByte() - if err != nil { - return nil, err +func parseHeader(b []byte) (*Header, error) { + if len(b) == 0 { + return nil, io.EOF } + typeByte := b[0] h := &Header{typeByte: typeByte} - err = h.parseLongHeader(b) - h.parsedLen = protocol.ByteCount(startLen - b.Len()) + l, err := h.parseLongHeader(b[1:]) + h.parsedLen = protocol.ByteCount(l) + 1 return h, err } -func (h *Header) parseLongHeader(b *bytes.Reader) error { - v, err := utils.BigEndian.ReadUint32(b) - if err != nil { - return err +func (h *Header) parseLongHeader(b []byte) (int, error) { + startLen := len(b) + if len(b) < 5 { + return 0, io.EOF } - h.Version = protocol.VersionNumber(v) + h.Version = protocol.Version(binary.BigEndian.Uint32(b[:4])) if h.Version != 0 && h.typeByte&0x40 == 0 { - return errors.New("not a QUIC packet") + return startLen - len(b), errors.New("not a QUIC packet") } - destConnIDLen, err := b.ReadByte() - if err != nil { - return err + destConnIDLen := int(b[4]) + if destConnIDLen > protocol.MaxConnIDLen { + return startLen - len(b), protocol.ErrInvalidConnectionIDLen } - h.DestConnectionID, err = protocol.ReadConnectionID(b, int(destConnIDLen)) - if err != nil { - return err + b = b[5:] + if len(b) < destConnIDLen+1 { + return startLen - len(b), io.EOF } - srcConnIDLen, err := b.ReadByte() - if err != nil { - return err + h.DestConnectionID = protocol.ParseConnectionID(b[:destConnIDLen]) + srcConnIDLen := int(b[destConnIDLen]) + if srcConnIDLen > protocol.MaxConnIDLen { + return startLen - len(b), protocol.ErrInvalidConnectionIDLen } - h.SrcConnectionID, err = protocol.ReadConnectionID(b, int(srcConnIDLen)) - if err != nil { - return err + b = b[destConnIDLen+1:] + if len(b) < srcConnIDLen { + return startLen - len(b), io.EOF } + h.SrcConnectionID = protocol.ParseConnectionID(b[:srcConnIDLen]) + b = b[srcConnIDLen:] if h.Version == 0 { // version negotiation packet - return nil + return startLen - len(b), nil } // If we don't understand the version, we have no idea how to interpret the rest of the bytes if !protocol.IsSupportedVersion(protocol.SupportedVersions, h.Version) { - return ErrUnsupportedVersion + return startLen - len(b), ErrUnsupportedVersion } if h.Version == protocol.Version2 { @@ -237,38 +236,35 @@ func (h *Header) parseLongHeader(b *bytes.Reader) error { } if h.Type == protocol.PacketTypeRetry { - tokenLen := b.Len() - 16 + tokenLen := len(b) - 16 if tokenLen <= 0 { - return io.EOF + return startLen - len(b), io.EOF } h.Token = make([]byte, tokenLen) - if _, err := io.ReadFull(b, h.Token); err != nil { - return err - } - _, err := b.Seek(16, io.SeekCurrent) - return err + copy(h.Token, b[:tokenLen]) + return startLen - len(b) + tokenLen + 16, nil } if h.Type == protocol.PacketTypeInitial { - tokenLen, err := quicvarint.Read(b) + tokenLen, n, err := quicvarint.Parse(b) if err != nil { - return err + return startLen - len(b), err } - if tokenLen > uint64(b.Len()) { - return io.EOF + b = b[n:] + if tokenLen > uint64(len(b)) { + return startLen - len(b), io.EOF } h.Token = make([]byte, tokenLen) - if _, err := io.ReadFull(b, h.Token); err != nil { - return err - } + copy(h.Token, b[:tokenLen]) + b = b[tokenLen:] } - pl, err := quicvarint.Read(b) + pl, n, err := quicvarint.Parse(b) if err != nil { - return err + return 0, err } h.Length = protocol.ByteCount(pl) - return nil + return startLen - len(b) + n, nil } // ParsedLen returns the number of bytes that were consumed when parsing the header @@ -278,7 +274,7 @@ func (h *Header) ParsedLen() protocol.ByteCount { // ParseExtended parses the version dependent part of the header. // The Reader has to be set such that it points to the first byte of the header. -func (h *Header) ParseExtended(b *bytes.Reader, ver protocol.VersionNumber) (*ExtendedHeader, error) { +func (h *Header) ParseExtended(b *bytes.Reader, ver protocol.Version) (*ExtendedHeader, error) { extHdr := h.toExtendedHeader() reservedBitsValid, err := extHdr.parse(b, ver) if err != nil { diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/interface.go b/vendor/github.com/quic-go/quic-go/internal/wire/interface.go index 7e0f9a03e..bc17883b5 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/interface.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/interface.go @@ -6,12 +6,6 @@ import ( // A Frame in QUIC type Frame interface { - Append(b []byte, version protocol.VersionNumber) ([]byte, error) - Length(version protocol.VersionNumber) protocol.ByteCount -} - -// A FrameParser parses QUIC frames, one by one. -type FrameParser interface { - ParseNext([]byte, protocol.EncryptionLevel, protocol.VersionNumber) (int, Frame, error) - SetAckDelayExponent(uint8) + Append(b []byte, version protocol.Version) ([]byte, error) + Length(version protocol.Version) protocol.ByteCount } diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/log.go b/vendor/github.com/quic-go/quic-go/internal/wire/log.go index ec7d45d86..c8b28d924 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/log.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/log.go @@ -63,7 +63,9 @@ func LogFrame(logger utils.Logger, frame Frame, sent bool) { logger.Debugf("\t%s &wire.StreamsBlockedFrame{Type: bidi, MaxStreams: %d}", dir, f.StreamLimit) } case *NewConnectionIDFrame: - logger.Debugf("\t%s &wire.NewConnectionIDFrame{SequenceNumber: %d, ConnectionID: %s, StatelessResetToken: %#x}", dir, f.SequenceNumber, f.ConnectionID, f.StatelessResetToken) + logger.Debugf("\t%s &wire.NewConnectionIDFrame{SequenceNumber: %d, RetirePriorTo: %d, ConnectionID: %s, StatelessResetToken: %#x}", dir, f.SequenceNumber, f.RetirePriorTo, f.ConnectionID, f.StatelessResetToken) + case *RetireConnectionIDFrame: + logger.Debugf("\t%s &wire.RetireConnectionIDFrame{SequenceNumber: %d}", dir, f.SequenceNumber) case *NewTokenFrame: logger.Debugf("\t%s &wire.NewTokenFrame{Token: %#x}", dir, f.Token) default: diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/max_data_frame.go b/vendor/github.com/quic-go/quic-go/internal/wire/max_data_frame.go index e61b0f9f3..5819c0273 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/max_data_frame.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/max_data_frame.go @@ -1,8 +1,6 @@ package wire import ( - "bytes" - "github.com/quic-go/quic-go/internal/protocol" "github.com/quic-go/quic-go/quicvarint" ) @@ -13,23 +11,23 @@ type MaxDataFrame struct { } // parseMaxDataFrame parses a MAX_DATA frame -func parseMaxDataFrame(r *bytes.Reader, _ protocol.VersionNumber) (*MaxDataFrame, error) { +func parseMaxDataFrame(b []byte, _ protocol.Version) (*MaxDataFrame, int, error) { frame := &MaxDataFrame{} - byteOffset, err := quicvarint.Read(r) + byteOffset, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } frame.MaximumData = protocol.ByteCount(byteOffset) - return frame, nil + return frame, l, nil } -func (f *MaxDataFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, error) { +func (f *MaxDataFrame) Append(b []byte, _ protocol.Version) ([]byte, error) { b = append(b, maxDataFrameType) b = quicvarint.Append(b, uint64(f.MaximumData)) return b, nil } // Length of a written frame -func (f *MaxDataFrame) Length(_ protocol.VersionNumber) protocol.ByteCount { - return 1 + quicvarint.Len(uint64(f.MaximumData)) +func (f *MaxDataFrame) Length(_ protocol.Version) protocol.ByteCount { + return 1 + protocol.ByteCount(quicvarint.Len(uint64(f.MaximumData))) } diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/max_stream_data_frame.go b/vendor/github.com/quic-go/quic-go/internal/wire/max_stream_data_frame.go index fe3d1e3f7..db9091af8 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/max_stream_data_frame.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/max_stream_data_frame.go @@ -1,8 +1,6 @@ package wire import ( - "bytes" - "github.com/quic-go/quic-go/internal/protocol" "github.com/quic-go/quic-go/quicvarint" ) @@ -13,23 +11,26 @@ type MaxStreamDataFrame struct { MaximumStreamData protocol.ByteCount } -func parseMaxStreamDataFrame(r *bytes.Reader, _ protocol.VersionNumber) (*MaxStreamDataFrame, error) { - sid, err := quicvarint.Read(r) +func parseMaxStreamDataFrame(b []byte, _ protocol.Version) (*MaxStreamDataFrame, int, error) { + startLen := len(b) + sid, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } - offset, err := quicvarint.Read(r) + b = b[l:] + offset, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } + b = b[l:] return &MaxStreamDataFrame{ StreamID: protocol.StreamID(sid), MaximumStreamData: protocol.ByteCount(offset), - }, nil + }, startLen - len(b), nil } -func (f *MaxStreamDataFrame) Append(b []byte, version protocol.VersionNumber) ([]byte, error) { +func (f *MaxStreamDataFrame) Append(b []byte, _ protocol.Version) ([]byte, error) { b = append(b, maxStreamDataFrameType) b = quicvarint.Append(b, uint64(f.StreamID)) b = quicvarint.Append(b, uint64(f.MaximumStreamData)) @@ -37,6 +38,6 @@ func (f *MaxStreamDataFrame) Append(b []byte, version protocol.VersionNumber) ([ } // Length of a written frame -func (f *MaxStreamDataFrame) Length(version protocol.VersionNumber) protocol.ByteCount { - return 1 + quicvarint.Len(uint64(f.StreamID)) + quicvarint.Len(uint64(f.MaximumStreamData)) +func (f *MaxStreamDataFrame) Length(protocol.Version) protocol.ByteCount { + return 1 + protocol.ByteCount(quicvarint.Len(uint64(f.StreamID))+quicvarint.Len(uint64(f.MaximumStreamData))) } diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/max_streams_frame.go b/vendor/github.com/quic-go/quic-go/internal/wire/max_streams_frame.go index bd278c02a..a8745bd12 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/max_streams_frame.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/max_streams_frame.go @@ -1,7 +1,6 @@ package wire import ( - "bytes" "fmt" "github.com/quic-go/quic-go/internal/protocol" @@ -14,7 +13,7 @@ type MaxStreamsFrame struct { MaxStreamNum protocol.StreamNum } -func parseMaxStreamsFrame(r *bytes.Reader, typ uint64, _ protocol.VersionNumber) (*MaxStreamsFrame, error) { +func parseMaxStreamsFrame(b []byte, typ uint64, _ protocol.Version) (*MaxStreamsFrame, int, error) { f := &MaxStreamsFrame{} switch typ { case bidiMaxStreamsFrameType: @@ -22,18 +21,18 @@ func parseMaxStreamsFrame(r *bytes.Reader, typ uint64, _ protocol.VersionNumber) case uniMaxStreamsFrameType: f.Type = protocol.StreamTypeUni } - streamID, err := quicvarint.Read(r) + streamID, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } f.MaxStreamNum = protocol.StreamNum(streamID) if f.MaxStreamNum > protocol.MaxStreamCount { - return nil, fmt.Errorf("%d exceeds the maximum stream count", f.MaxStreamNum) + return nil, 0, fmt.Errorf("%d exceeds the maximum stream count", f.MaxStreamNum) } - return f, nil + return f, l, nil } -func (f *MaxStreamsFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, error) { +func (f *MaxStreamsFrame) Append(b []byte, _ protocol.Version) ([]byte, error) { switch f.Type { case protocol.StreamTypeBidi: b = append(b, bidiMaxStreamsFrameType) @@ -45,6 +44,6 @@ func (f *MaxStreamsFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, er } // Length of a written frame -func (f *MaxStreamsFrame) Length(protocol.VersionNumber) protocol.ByteCount { - return 1 + quicvarint.Len(uint64(f.MaxStreamNum)) +func (f *MaxStreamsFrame) Length(protocol.Version) protocol.ByteCount { + return 1 + protocol.ByteCount(quicvarint.Len(uint64(f.MaxStreamNum))) } diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/new_connection_id_frame.go b/vendor/github.com/quic-go/quic-go/internal/wire/new_connection_id_frame.go index 83102d5d1..852d46ef1 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/new_connection_id_frame.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/new_connection_id_frame.go @@ -1,7 +1,7 @@ package wire import ( - "bytes" + "errors" "fmt" "io" @@ -17,43 +17,50 @@ type NewConnectionIDFrame struct { StatelessResetToken protocol.StatelessResetToken } -func parseNewConnectionIDFrame(r *bytes.Reader, _ protocol.VersionNumber) (*NewConnectionIDFrame, error) { - seq, err := quicvarint.Read(r) +func parseNewConnectionIDFrame(b []byte, _ protocol.Version) (*NewConnectionIDFrame, int, error) { + startLen := len(b) + seq, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } - ret, err := quicvarint.Read(r) + b = b[l:] + ret, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } + b = b[l:] if ret > seq { //nolint:stylecheck - return nil, fmt.Errorf("Retire Prior To value (%d) larger than Sequence Number (%d)", ret, seq) + return nil, 0, fmt.Errorf("Retire Prior To value (%d) larger than Sequence Number (%d)", ret, seq) } - connIDLen, err := r.ReadByte() - if err != nil { - return nil, err + if len(b) == 0 { + return nil, 0, io.EOF } - connID, err := protocol.ReadConnectionID(r, int(connIDLen)) - if err != nil { - return nil, err + connIDLen := int(b[0]) + b = b[1:] + if connIDLen == 0 { + return nil, 0, errors.New("invalid zero-length connection ID") + } + if connIDLen > protocol.MaxConnIDLen { + return nil, 0, protocol.ErrInvalidConnectionIDLen + } + if len(b) < connIDLen { + return nil, 0, io.EOF } frame := &NewConnectionIDFrame{ SequenceNumber: seq, RetirePriorTo: ret, - ConnectionID: connID, + ConnectionID: protocol.ParseConnectionID(b[:connIDLen]), } - if _, err := io.ReadFull(r, frame.StatelessResetToken[:]); err != nil { - if err == io.ErrUnexpectedEOF { - return nil, io.EOF - } - return nil, err + b = b[connIDLen:] + if len(b) < len(frame.StatelessResetToken) { + return nil, 0, io.EOF } - - return frame, nil + copy(frame.StatelessResetToken[:], b) + return frame, startLen - len(b) + len(frame.StatelessResetToken), nil } -func (f *NewConnectionIDFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, error) { +func (f *NewConnectionIDFrame) Append(b []byte, _ protocol.Version) ([]byte, error) { b = append(b, newConnectionIDFrameType) b = quicvarint.Append(b, f.SequenceNumber) b = quicvarint.Append(b, f.RetirePriorTo) @@ -68,6 +75,6 @@ func (f *NewConnectionIDFrame) Append(b []byte, _ protocol.VersionNumber) ([]byt } // Length of a written frame -func (f *NewConnectionIDFrame) Length(protocol.VersionNumber) protocol.ByteCount { - return 1 + quicvarint.Len(f.SequenceNumber) + quicvarint.Len(f.RetirePriorTo) + 1 /* connection ID length */ + protocol.ByteCount(f.ConnectionID.Len()) + 16 +func (f *NewConnectionIDFrame) Length(protocol.Version) protocol.ByteCount { + return 1 + protocol.ByteCount(quicvarint.Len(f.SequenceNumber)+quicvarint.Len(f.RetirePriorTo)+1 /* connection ID length */ +f.ConnectionID.Len()) + 16 } diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/new_token_frame.go b/vendor/github.com/quic-go/quic-go/internal/wire/new_token_frame.go index c3fa178c1..f1d4d00fe 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/new_token_frame.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/new_token_frame.go @@ -1,7 +1,6 @@ package wire import ( - "bytes" "errors" "io" @@ -14,25 +13,24 @@ type NewTokenFrame struct { Token []byte } -func parseNewTokenFrame(r *bytes.Reader, _ protocol.VersionNumber) (*NewTokenFrame, error) { - tokenLen, err := quicvarint.Read(r) +func parseNewTokenFrame(b []byte, _ protocol.Version) (*NewTokenFrame, int, error) { + tokenLen, l, err := quicvarint.Parse(b) if err != nil { - return nil, err - } - if uint64(r.Len()) < tokenLen { - return nil, io.EOF + return nil, 0, replaceUnexpectedEOF(err) } + b = b[l:] if tokenLen == 0 { - return nil, errors.New("token must not be empty") + return nil, 0, errors.New("token must not be empty") + } + if uint64(len(b)) < tokenLen { + return nil, 0, io.EOF } token := make([]byte, int(tokenLen)) - if _, err := io.ReadFull(r, token); err != nil { - return nil, err - } - return &NewTokenFrame{Token: token}, nil + copy(token, b) + return &NewTokenFrame{Token: token}, l + int(tokenLen), nil } -func (f *NewTokenFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, error) { +func (f *NewTokenFrame) Append(b []byte, _ protocol.Version) ([]byte, error) { b = append(b, newTokenFrameType) b = quicvarint.Append(b, uint64(len(f.Token))) b = append(b, f.Token...) @@ -40,6 +38,6 @@ func (f *NewTokenFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, erro } // Length of a written frame -func (f *NewTokenFrame) Length(protocol.VersionNumber) protocol.ByteCount { - return 1 + quicvarint.Len(uint64(len(f.Token))) + protocol.ByteCount(len(f.Token)) +func (f *NewTokenFrame) Length(protocol.Version) protocol.ByteCount { + return 1 + protocol.ByteCount(quicvarint.Len(uint64(len(f.Token)))+len(f.Token)) } diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/path_challenge_frame.go b/vendor/github.com/quic-go/quic-go/internal/wire/path_challenge_frame.go index ad024330a..2aca989fa 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/path_challenge_frame.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/path_challenge_frame.go @@ -1,7 +1,6 @@ package wire import ( - "bytes" "io" "github.com/quic-go/quic-go/internal/protocol" @@ -12,24 +11,22 @@ type PathChallengeFrame struct { Data [8]byte } -func parsePathChallengeFrame(r *bytes.Reader, _ protocol.VersionNumber) (*PathChallengeFrame, error) { - frame := &PathChallengeFrame{} - if _, err := io.ReadFull(r, frame.Data[:]); err != nil { - if err == io.ErrUnexpectedEOF { - return nil, io.EOF - } - return nil, err +func parsePathChallengeFrame(b []byte, _ protocol.Version) (*PathChallengeFrame, int, error) { + f := &PathChallengeFrame{} + if len(b) < 8 { + return nil, 0, io.EOF } - return frame, nil + copy(f.Data[:], b) + return f, 8, nil } -func (f *PathChallengeFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, error) { +func (f *PathChallengeFrame) Append(b []byte, _ protocol.Version) ([]byte, error) { b = append(b, pathChallengeFrameType) b = append(b, f.Data[:]...) return b, nil } // Length of a written frame -func (f *PathChallengeFrame) Length(_ protocol.VersionNumber) protocol.ByteCount { +func (f *PathChallengeFrame) Length(_ protocol.Version) protocol.ByteCount { return 1 + 8 } diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/path_response_frame.go b/vendor/github.com/quic-go/quic-go/internal/wire/path_response_frame.go index 76e651049..76532c852 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/path_response_frame.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/path_response_frame.go @@ -1,7 +1,6 @@ package wire import ( - "bytes" "io" "github.com/quic-go/quic-go/internal/protocol" @@ -12,24 +11,22 @@ type PathResponseFrame struct { Data [8]byte } -func parsePathResponseFrame(r *bytes.Reader, _ protocol.VersionNumber) (*PathResponseFrame, error) { - frame := &PathResponseFrame{} - if _, err := io.ReadFull(r, frame.Data[:]); err != nil { - if err == io.ErrUnexpectedEOF { - return nil, io.EOF - } - return nil, err +func parsePathResponseFrame(b []byte, _ protocol.Version) (*PathResponseFrame, int, error) { + f := &PathResponseFrame{} + if len(b) < 8 { + return nil, 0, io.EOF } - return frame, nil + copy(f.Data[:], b) + return f, 8, nil } -func (f *PathResponseFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, error) { +func (f *PathResponseFrame) Append(b []byte, _ protocol.Version) ([]byte, error) { b = append(b, pathResponseFrameType) b = append(b, f.Data[:]...) return b, nil } // Length of a written frame -func (f *PathResponseFrame) Length(_ protocol.VersionNumber) protocol.ByteCount { +func (f *PathResponseFrame) Length(_ protocol.Version) protocol.ByteCount { return 1 + 8 } diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/ping_frame.go b/vendor/github.com/quic-go/quic-go/internal/wire/ping_frame.go index dd24edc0c..71f8d16c3 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/ping_frame.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/ping_frame.go @@ -7,11 +7,11 @@ import ( // A PingFrame is a PING frame type PingFrame struct{} -func (f *PingFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, error) { +func (f *PingFrame) Append(b []byte, _ protocol.Version) ([]byte, error) { return append(b, pingFrameType), nil } // Length of a written frame -func (f *PingFrame) Length(_ protocol.VersionNumber) protocol.ByteCount { +func (f *PingFrame) Length(_ protocol.Version) protocol.ByteCount { return 1 } diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/reset_stream_frame.go b/vendor/github.com/quic-go/quic-go/internal/wire/reset_stream_frame.go index cd94c9408..a20029af2 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/reset_stream_frame.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/reset_stream_frame.go @@ -1,8 +1,6 @@ package wire import ( - "bytes" - "github.com/quic-go/quic-go/internal/protocol" "github.com/quic-go/quic-go/internal/qerr" "github.com/quic-go/quic-go/quicvarint" @@ -15,21 +13,24 @@ type ResetStreamFrame struct { FinalSize protocol.ByteCount } -func parseResetStreamFrame(r *bytes.Reader, _ protocol.VersionNumber) (*ResetStreamFrame, error) { +func parseResetStreamFrame(b []byte, _ protocol.Version) (*ResetStreamFrame, int, error) { + startLen := len(b) var streamID protocol.StreamID var byteOffset protocol.ByteCount - sid, err := quicvarint.Read(r) + sid, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } + b = b[l:] streamID = protocol.StreamID(sid) - errorCode, err := quicvarint.Read(r) + errorCode, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } - bo, err := quicvarint.Read(r) + b = b[l:] + bo, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } byteOffset = protocol.ByteCount(bo) @@ -37,10 +38,10 @@ func parseResetStreamFrame(r *bytes.Reader, _ protocol.VersionNumber) (*ResetStr StreamID: streamID, ErrorCode: qerr.StreamErrorCode(errorCode), FinalSize: byteOffset, - }, nil + }, startLen - len(b) + l, nil } -func (f *ResetStreamFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, error) { +func (f *ResetStreamFrame) Append(b []byte, _ protocol.Version) ([]byte, error) { b = append(b, resetStreamFrameType) b = quicvarint.Append(b, uint64(f.StreamID)) b = quicvarint.Append(b, uint64(f.ErrorCode)) @@ -49,6 +50,6 @@ func (f *ResetStreamFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, e } // Length of a written frame -func (f *ResetStreamFrame) Length(version protocol.VersionNumber) protocol.ByteCount { - return 1 + quicvarint.Len(uint64(f.StreamID)) + quicvarint.Len(uint64(f.ErrorCode)) + quicvarint.Len(uint64(f.FinalSize)) +func (f *ResetStreamFrame) Length(protocol.Version) protocol.ByteCount { + return 1 + protocol.ByteCount(quicvarint.Len(uint64(f.StreamID))+quicvarint.Len(uint64(f.ErrorCode))+quicvarint.Len(uint64(f.FinalSize))) } diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/retire_connection_id_frame.go b/vendor/github.com/quic-go/quic-go/internal/wire/retire_connection_id_frame.go index 8e9a41d89..27aeff842 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/retire_connection_id_frame.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/retire_connection_id_frame.go @@ -1,8 +1,6 @@ package wire import ( - "bytes" - "github.com/quic-go/quic-go/internal/protocol" "github.com/quic-go/quic-go/quicvarint" ) @@ -12,21 +10,21 @@ type RetireConnectionIDFrame struct { SequenceNumber uint64 } -func parseRetireConnectionIDFrame(r *bytes.Reader, _ protocol.VersionNumber) (*RetireConnectionIDFrame, error) { - seq, err := quicvarint.Read(r) +func parseRetireConnectionIDFrame(b []byte, _ protocol.Version) (*RetireConnectionIDFrame, int, error) { + seq, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } - return &RetireConnectionIDFrame{SequenceNumber: seq}, nil + return &RetireConnectionIDFrame{SequenceNumber: seq}, l, nil } -func (f *RetireConnectionIDFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, error) { +func (f *RetireConnectionIDFrame) Append(b []byte, _ protocol.Version) ([]byte, error) { b = append(b, retireConnectionIDFrameType) b = quicvarint.Append(b, f.SequenceNumber) return b, nil } // Length of a written frame -func (f *RetireConnectionIDFrame) Length(protocol.VersionNumber) protocol.ByteCount { - return 1 + quicvarint.Len(f.SequenceNumber) +func (f *RetireConnectionIDFrame) Length(protocol.Version) protocol.ByteCount { + return 1 + protocol.ByteCount(quicvarint.Len(f.SequenceNumber)) } diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/stop_sending_frame.go b/vendor/github.com/quic-go/quic-go/internal/wire/stop_sending_frame.go index d7b8b2402..a2326f8ec 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/stop_sending_frame.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/stop_sending_frame.go @@ -1,8 +1,6 @@ package wire import ( - "bytes" - "github.com/quic-go/quic-go/internal/protocol" "github.com/quic-go/quic-go/internal/qerr" "github.com/quic-go/quic-go/quicvarint" @@ -15,28 +13,31 @@ type StopSendingFrame struct { } // parseStopSendingFrame parses a STOP_SENDING frame -func parseStopSendingFrame(r *bytes.Reader, _ protocol.VersionNumber) (*StopSendingFrame, error) { - streamID, err := quicvarint.Read(r) +func parseStopSendingFrame(b []byte, _ protocol.Version) (*StopSendingFrame, int, error) { + startLen := len(b) + streamID, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } - errorCode, err := quicvarint.Read(r) + b = b[l:] + errorCode, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } + b = b[l:] return &StopSendingFrame{ StreamID: protocol.StreamID(streamID), ErrorCode: qerr.StreamErrorCode(errorCode), - }, nil + }, startLen - len(b), nil } // Length of a written frame -func (f *StopSendingFrame) Length(_ protocol.VersionNumber) protocol.ByteCount { - return 1 + quicvarint.Len(uint64(f.StreamID)) + quicvarint.Len(uint64(f.ErrorCode)) +func (f *StopSendingFrame) Length(_ protocol.Version) protocol.ByteCount { + return 1 + protocol.ByteCount(quicvarint.Len(uint64(f.StreamID))+quicvarint.Len(uint64(f.ErrorCode))) } -func (f *StopSendingFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, error) { +func (f *StopSendingFrame) Append(b []byte, _ protocol.Version) ([]byte, error) { b = append(b, stopSendingFrameType) b = quicvarint.Append(b, uint64(f.StreamID)) b = quicvarint.Append(b, uint64(f.ErrorCode)) diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/stream_data_blocked_frame.go b/vendor/github.com/quic-go/quic-go/internal/wire/stream_data_blocked_frame.go index d42e59a2d..3762ec76a 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/stream_data_blocked_frame.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/stream_data_blocked_frame.go @@ -1,8 +1,6 @@ package wire import ( - "bytes" - "github.com/quic-go/quic-go/internal/protocol" "github.com/quic-go/quic-go/quicvarint" ) @@ -13,23 +11,25 @@ type StreamDataBlockedFrame struct { MaximumStreamData protocol.ByteCount } -func parseStreamDataBlockedFrame(r *bytes.Reader, _ protocol.VersionNumber) (*StreamDataBlockedFrame, error) { - sid, err := quicvarint.Read(r) +func parseStreamDataBlockedFrame(b []byte, _ protocol.Version) (*StreamDataBlockedFrame, int, error) { + startLen := len(b) + sid, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } - offset, err := quicvarint.Read(r) + b = b[l:] + offset, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } return &StreamDataBlockedFrame{ StreamID: protocol.StreamID(sid), MaximumStreamData: protocol.ByteCount(offset), - }, nil + }, startLen - len(b) + l, nil } -func (f *StreamDataBlockedFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, error) { +func (f *StreamDataBlockedFrame) Append(b []byte, _ protocol.Version) ([]byte, error) { b = append(b, 0x15) b = quicvarint.Append(b, uint64(f.StreamID)) b = quicvarint.Append(b, uint64(f.MaximumStreamData)) @@ -37,6 +37,6 @@ func (f *StreamDataBlockedFrame) Append(b []byte, _ protocol.VersionNumber) ([]b } // Length of a written frame -func (f *StreamDataBlockedFrame) Length(version protocol.VersionNumber) protocol.ByteCount { - return 1 + quicvarint.Len(uint64(f.StreamID)) + quicvarint.Len(uint64(f.MaximumStreamData)) +func (f *StreamDataBlockedFrame) Length(protocol.Version) protocol.ByteCount { + return 1 + protocol.ByteCount(quicvarint.Len(uint64(f.StreamID))+quicvarint.Len(uint64(f.MaximumStreamData))) } diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/stream_frame.go b/vendor/github.com/quic-go/quic-go/internal/wire/stream_frame.go index d22e1c052..f9470ecd6 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/stream_frame.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/stream_frame.go @@ -1,7 +1,6 @@ package wire import ( - "bytes" "errors" "io" @@ -20,33 +19,41 @@ type StreamFrame struct { fromPool bool } -func parseStreamFrame(r *bytes.Reader, typ uint64, _ protocol.VersionNumber) (*StreamFrame, error) { +func parseStreamFrame(b []byte, typ uint64, _ protocol.Version) (*StreamFrame, int, error) { + startLen := len(b) hasOffset := typ&0b100 > 0 fin := typ&0b1 > 0 hasDataLen := typ&0b10 > 0 - streamID, err := quicvarint.Read(r) + streamID, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } + b = b[l:] var offset uint64 if hasOffset { - offset, err = quicvarint.Read(r) + offset, l, err = quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } + b = b[l:] } var dataLen uint64 if hasDataLen { var err error - dataLen, err = quicvarint.Read(r) + var l int + dataLen, l, err = quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) + } + b = b[l:] + if dataLen > uint64(len(b)) { + return nil, 0, io.EOF } } else { // The rest of the packet is data - dataLen = uint64(r.Len()) + dataLen = uint64(len(b)) } var frame *StreamFrame @@ -57,7 +64,7 @@ func parseStreamFrame(r *bytes.Reader, typ uint64, _ protocol.VersionNumber) (*S // The STREAM frame can't be larger than the StreamFrame we obtained from the buffer, // since those StreamFrames have a buffer length of the maximum packet size. if dataLen > uint64(cap(frame.Data)) { - return nil, io.EOF + return nil, 0, io.EOF } frame.Data = frame.Data[:dataLen] } @@ -68,18 +75,15 @@ func parseStreamFrame(r *bytes.Reader, typ uint64, _ protocol.VersionNumber) (*S frame.DataLenPresent = hasDataLen if dataLen != 0 { - if _, err := io.ReadFull(r, frame.Data); err != nil { - return nil, err - } + copy(frame.Data, b) } if frame.Offset+frame.DataLen() > protocol.MaxByteCount { - return nil, errors.New("stream data overflows maximum offset") + return nil, 0, errors.New("stream data overflows maximum offset") } - return frame, nil + return frame, startLen - len(b) + int(dataLen), nil } -// Write writes a STREAM frame -func (f *StreamFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, error) { +func (f *StreamFrame) Append(b []byte, _ protocol.Version) ([]byte, error) { if len(f.Data) == 0 && !f.Fin { return nil, errors.New("StreamFrame: attempting to write empty frame without FIN") } @@ -108,7 +112,7 @@ func (f *StreamFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, error) } // Length returns the total length of the STREAM frame -func (f *StreamFrame) Length(version protocol.VersionNumber) protocol.ByteCount { +func (f *StreamFrame) Length(protocol.Version) protocol.ByteCount { length := 1 + quicvarint.Len(uint64(f.StreamID)) if f.Offset != 0 { length += quicvarint.Len(uint64(f.Offset)) @@ -116,7 +120,7 @@ func (f *StreamFrame) Length(version protocol.VersionNumber) protocol.ByteCount if f.DataLenPresent { length += quicvarint.Len(uint64(f.DataLen())) } - return length + f.DataLen() + return protocol.ByteCount(length) + f.DataLen() } // DataLen gives the length of data in bytes @@ -126,14 +130,14 @@ func (f *StreamFrame) DataLen() protocol.ByteCount { // MaxDataLen returns the maximum data length // If 0 is returned, writing will fail (a STREAM frame must contain at least 1 byte of data). -func (f *StreamFrame) MaxDataLen(maxSize protocol.ByteCount, version protocol.VersionNumber) protocol.ByteCount { - headerLen := 1 + quicvarint.Len(uint64(f.StreamID)) +func (f *StreamFrame) MaxDataLen(maxSize protocol.ByteCount, _ protocol.Version) protocol.ByteCount { + headerLen := 1 + protocol.ByteCount(quicvarint.Len(uint64(f.StreamID))) if f.Offset != 0 { - headerLen += quicvarint.Len(uint64(f.Offset)) + headerLen += protocol.ByteCount(quicvarint.Len(uint64(f.Offset))) } if f.DataLenPresent { - // pretend that the data size will be 1 bytes - // if it turns out that varint encoding the length will consume 2 bytes, we need to adjust the data length afterwards + // Pretend that the data size will be 1 byte. + // If it turns out that varint encoding the length will consume 2 bytes, we need to adjust the data length afterward headerLen++ } if headerLen > maxSize { @@ -151,7 +155,7 @@ func (f *StreamFrame) MaxDataLen(maxSize protocol.ByteCount, version protocol.Ve // The frame might not be split if: // * the size is large enough to fit the whole frame // * the size is too small to fit even a 1-byte frame. In that case, the frame returned is nil. -func (f *StreamFrame) MaybeSplitOffFrame(maxSize protocol.ByteCount, version protocol.VersionNumber) (*StreamFrame, bool /* was splitting required */) { +func (f *StreamFrame) MaybeSplitOffFrame(maxSize protocol.ByteCount, version protocol.Version) (*StreamFrame, bool /* was splitting required */) { if maxSize >= f.Length(version) { return nil, false } diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/streams_blocked_frame.go b/vendor/github.com/quic-go/quic-go/internal/wire/streams_blocked_frame.go index 4a5951c62..c946fec31 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/streams_blocked_frame.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/streams_blocked_frame.go @@ -1,7 +1,6 @@ package wire import ( - "bytes" "fmt" "github.com/quic-go/quic-go/internal/protocol" @@ -14,7 +13,7 @@ type StreamsBlockedFrame struct { StreamLimit protocol.StreamNum } -func parseStreamsBlockedFrame(r *bytes.Reader, typ uint64, _ protocol.VersionNumber) (*StreamsBlockedFrame, error) { +func parseStreamsBlockedFrame(b []byte, typ uint64, _ protocol.Version) (*StreamsBlockedFrame, int, error) { f := &StreamsBlockedFrame{} switch typ { case bidiStreamBlockedFrameType: @@ -22,18 +21,18 @@ func parseStreamsBlockedFrame(r *bytes.Reader, typ uint64, _ protocol.VersionNum case uniStreamBlockedFrameType: f.Type = protocol.StreamTypeUni } - streamLimit, err := quicvarint.Read(r) + streamLimit, l, err := quicvarint.Parse(b) if err != nil { - return nil, err + return nil, 0, replaceUnexpectedEOF(err) } f.StreamLimit = protocol.StreamNum(streamLimit) if f.StreamLimit > protocol.MaxStreamCount { - return nil, fmt.Errorf("%d exceeds the maximum stream count", f.StreamLimit) + return nil, 0, fmt.Errorf("%d exceeds the maximum stream count", f.StreamLimit) } - return f, nil + return f, l, nil } -func (f *StreamsBlockedFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte, error) { +func (f *StreamsBlockedFrame) Append(b []byte, _ protocol.Version) ([]byte, error) { switch f.Type { case protocol.StreamTypeBidi: b = append(b, bidiStreamBlockedFrameType) @@ -45,6 +44,6 @@ func (f *StreamsBlockedFrame) Append(b []byte, _ protocol.VersionNumber) ([]byte } // Length of a written frame -func (f *StreamsBlockedFrame) Length(_ protocol.VersionNumber) protocol.ByteCount { - return 1 + quicvarint.Len(uint64(f.StreamLimit)) +func (f *StreamsBlockedFrame) Length(_ protocol.Version) protocol.ByteCount { + return 1 + protocol.ByteCount(quicvarint.Len(uint64(f.StreamLimit))) } diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/transport_parameters.go b/vendor/github.com/quic-go/quic-go/internal/wire/transport_parameters.go index 7226521b0..cee74b8fa 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/transport_parameters.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/transport_parameters.go @@ -1,19 +1,17 @@ package wire import ( - "bytes" "crypto/rand" "encoding/binary" "errors" "fmt" "io" - "net" - "sort" + "net/netip" + "slices" "time" "github.com/quic-go/quic-go/internal/protocol" "github.com/quic-go/quic-go/internal/qerr" - "github.com/quic-go/quic-go/internal/utils" "github.com/quic-go/quic-go/quicvarint" ) @@ -51,10 +49,7 @@ const ( // PreferredAddress is the value encoding in the preferred_address transport parameter type PreferredAddress struct { - IPv4 net.IP - IPv4Port uint16 - IPv6 net.IP - IPv6Port uint16 + IPv4, IPv6 netip.AddrPort ConnectionID protocol.ConnectionID StatelessResetToken protocol.StatelessResetToken } @@ -92,7 +87,7 @@ type TransportParameters struct { // Unmarshal the transport parameters func (p *TransportParameters) Unmarshal(data []byte, sentBy protocol.Perspective) error { - if err := p.unmarshal(bytes.NewReader(data), sentBy, false); err != nil { + if err := p.unmarshal(data, sentBy, false); err != nil { return &qerr.TransportError{ ErrorCode: qerr.TransportParameterError, ErrorMessage: err.Error(), @@ -101,9 +96,9 @@ func (p *TransportParameters) Unmarshal(data []byte, sentBy protocol.Perspective return nil } -func (p *TransportParameters) unmarshal(r *bytes.Reader, sentBy protocol.Perspective, fromSessionTicket bool) error { +func (p *TransportParameters) unmarshal(b []byte, sentBy protocol.Perspective, fromSessionTicket bool) error { // needed to check that every parameter is only sent at most once - var parameterIDs []transportParameterID + parameterIDs := make([]transportParameterID, 0, 32) var ( readOriginalDestinationConnectionID bool @@ -115,18 +110,20 @@ func (p *TransportParameters) unmarshal(r *bytes.Reader, sentBy protocol.Perspec p.MaxAckDelay = protocol.DefaultMaxAckDelay p.MaxDatagramFrameSize = protocol.InvalidByteCount - for r.Len() > 0 { - paramIDInt, err := quicvarint.Read(r) + for len(b) > 0 { + paramIDInt, l, err := quicvarint.Parse(b) if err != nil { return err } paramID := transportParameterID(paramIDInt) - paramLen, err := quicvarint.Read(r) + b = b[l:] + paramLen, l, err := quicvarint.Parse(b) if err != nil { return err } - if uint64(r.Len()) < paramLen { - return fmt.Errorf("remaining length (%d) smaller than parameter length (%d)", r.Len(), paramLen) + b = b[l:] + if uint64(len(b)) < paramLen { + return fmt.Errorf("remaining length (%d) smaller than parameter length (%d)", len(b), paramLen) } parameterIDs = append(parameterIDs, paramID) switch paramID { @@ -144,16 +141,18 @@ func (p *TransportParameters) unmarshal(r *bytes.Reader, sentBy protocol.Perspec maxAckDelayParameterID, maxDatagramFrameSizeParameterID, ackDelayExponentParameterID: - if err := p.readNumericTransportParameter(r, paramID, int(paramLen)); err != nil { + if err := p.readNumericTransportParameter(b, paramID, int(paramLen)); err != nil { return err } + b = b[paramLen:] case preferredAddressParameterID: if sentBy == protocol.PerspectiveClient { return errors.New("client sent a preferred_address") } - if err := p.readPreferredAddress(r, int(paramLen)); err != nil { + if err := p.readPreferredAddress(b, int(paramLen)); err != nil { return err } + b = b[paramLen:] case disableActiveMigrationParameterID: if paramLen != 0 { return fmt.Errorf("wrong length for disable_active_migration: %d (expected empty)", paramLen) @@ -167,25 +166,41 @@ func (p *TransportParameters) unmarshal(r *bytes.Reader, sentBy protocol.Perspec return fmt.Errorf("wrong length for stateless_reset_token: %d (expected 16)", paramLen) } var token protocol.StatelessResetToken - r.Read(token[:]) + if len(b) < len(token) { + return io.EOF + } + copy(token[:], b) + b = b[len(token):] p.StatelessResetToken = &token case originalDestinationConnectionIDParameterID: if sentBy == protocol.PerspectiveClient { return errors.New("client sent an original_destination_connection_id") } - p.OriginalDestinationConnectionID, _ = protocol.ReadConnectionID(r, int(paramLen)) + if paramLen > protocol.MaxConnIDLen { + return protocol.ErrInvalidConnectionIDLen + } + p.OriginalDestinationConnectionID = protocol.ParseConnectionID(b[:paramLen]) + b = b[paramLen:] readOriginalDestinationConnectionID = true case initialSourceConnectionIDParameterID: - p.InitialSourceConnectionID, _ = protocol.ReadConnectionID(r, int(paramLen)) + if paramLen > protocol.MaxConnIDLen { + return protocol.ErrInvalidConnectionIDLen + } + p.InitialSourceConnectionID = protocol.ParseConnectionID(b[:paramLen]) + b = b[paramLen:] readInitialSourceConnectionID = true case retrySourceConnectionIDParameterID: if sentBy == protocol.PerspectiveClient { return errors.New("client sent a retry_source_connection_id") } - connID, _ := protocol.ReadConnectionID(r, int(paramLen)) + if paramLen > protocol.MaxConnIDLen { + return protocol.ErrInvalidConnectionIDLen + } + connID := protocol.ParseConnectionID(b[:paramLen]) + b = b[paramLen:] p.RetrySourceConnectionID = &connID default: - r.Seek(int64(paramLen), io.SeekCurrent) + b = b[paramLen:] } } @@ -205,7 +220,12 @@ func (p *TransportParameters) unmarshal(r *bytes.Reader, sentBy protocol.Perspec } // check that every transport parameter was sent at most once - sort.Slice(parameterIDs, func(i, j int) bool { return parameterIDs[i] < parameterIDs[j] }) + slices.SortFunc(parameterIDs, func(a, b transportParameterID) int { + if a < b { + return -1 + } + return 1 + }) for i := 0; i < len(parameterIDs)-1; i++ { if parameterIDs[i] == parameterIDs[i+1] { return fmt.Errorf("received duplicate transport parameter %#x", parameterIDs[i]) @@ -215,62 +235,47 @@ func (p *TransportParameters) unmarshal(r *bytes.Reader, sentBy protocol.Perspec return nil } -func (p *TransportParameters) readPreferredAddress(r *bytes.Reader, expectedLen int) error { - remainingLen := r.Len() +func (p *TransportParameters) readPreferredAddress(b []byte, expectedLen int) error { + remainingLen := len(b) pa := &PreferredAddress{} - ipv4 := make([]byte, 4) - if _, err := io.ReadFull(r, ipv4); err != nil { - return err - } - pa.IPv4 = net.IP(ipv4) - port, err := utils.BigEndian.ReadUint16(r) - if err != nil { - return err - } - pa.IPv4Port = port - ipv6 := make([]byte, 16) - if _, err := io.ReadFull(r, ipv6); err != nil { - return err - } - pa.IPv6 = net.IP(ipv6) - port, err = utils.BigEndian.ReadUint16(r) - if err != nil { - return err - } - pa.IPv6Port = port - connIDLen, err := r.ReadByte() - if err != nil { - return err + if len(b) < 4+2+16+2+1 { + return io.EOF } + var ipv4 [4]byte + copy(ipv4[:], b[:4]) + port4 := binary.BigEndian.Uint16(b[4:]) + b = b[4+2:] + pa.IPv4 = netip.AddrPortFrom(netip.AddrFrom4(ipv4), port4) + var ipv6 [16]byte + copy(ipv6[:], b[:16]) + port6 := binary.BigEndian.Uint16(b[16:]) + pa.IPv6 = netip.AddrPortFrom(netip.AddrFrom16(ipv6), port6) + b = b[16+2:] + connIDLen := int(b[0]) + b = b[1:] if connIDLen == 0 || connIDLen > protocol.MaxConnIDLen { return fmt.Errorf("invalid connection ID length: %d", connIDLen) } - connID, err := protocol.ReadConnectionID(r, int(connIDLen)) - if err != nil { - return err + if len(b) < connIDLen+len(pa.StatelessResetToken) { + return io.EOF } - pa.ConnectionID = connID - if _, err := io.ReadFull(r, pa.StatelessResetToken[:]); err != nil { - return err - } - if bytesRead := remainingLen - r.Len(); bytesRead != expectedLen { + pa.ConnectionID = protocol.ParseConnectionID(b[:connIDLen]) + b = b[connIDLen:] + copy(pa.StatelessResetToken[:], b) + b = b[len(pa.StatelessResetToken):] + if bytesRead := remainingLen - len(b); bytesRead != expectedLen { return fmt.Errorf("expected preferred_address to be %d long, read %d bytes", expectedLen, bytesRead) } p.PreferredAddress = pa return nil } -func (p *TransportParameters) readNumericTransportParameter( - r *bytes.Reader, - paramID transportParameterID, - expectedLen int, -) error { - remainingLen := r.Len() - val, err := quicvarint.Read(r) +func (p *TransportParameters) readNumericTransportParameter(b []byte, paramID transportParameterID, expectedLen int) error { + val, l, err := quicvarint.Parse(b) if err != nil { return fmt.Errorf("error while reading transport parameter %d: %s", paramID, err) } - if remainingLen-r.Len() != expectedLen { + if l != expectedLen { return fmt.Errorf("inconsistent transport parameter length for transport parameter %#x", paramID) } //nolint:exhaustive // This only covers the numeric transport parameters. @@ -294,10 +299,10 @@ func (p *TransportParameters) readNumericTransportParameter( return fmt.Errorf("initial_max_streams_uni too large: %d (maximum %d)", p.MaxUniStreamNum, protocol.MaxStreamCount) } case maxIdleTimeoutParameterID: - p.MaxIdleTimeout = utils.Max(protocol.MinRemoteIdleTimeout, time.Duration(val)*time.Millisecond) + p.MaxIdleTimeout = max(protocol.MinRemoteIdleTimeout, time.Duration(val)*time.Millisecond) case maxUDPPayloadSizeParameterID: if val < 1200 { - return fmt.Errorf("invalid value for max_packet_size: %d (minimum 1200)", val) + return fmt.Errorf("invalid value for max_udp_payload_size: %d (minimum 1200)", val) } p.MaxUDPPayloadSize = protocol.ByteCount(val) case ackDelayExponentParameterID: @@ -352,8 +357,10 @@ func (p *TransportParameters) Marshal(pers protocol.Perspective) []byte { b = p.marshalVarintParam(b, initialMaxStreamsUniParameterID, uint64(p.MaxUniStreamNum)) // idle_timeout b = p.marshalVarintParam(b, maxIdleTimeoutParameterID, uint64(p.MaxIdleTimeout/time.Millisecond)) - // max_packet_size - b = p.marshalVarintParam(b, maxUDPPayloadSizeParameterID, uint64(protocol.MaxPacketBufferSize)) + // max_udp_payload_size + if p.MaxUDPPayloadSize > 0 { + b = p.marshalVarintParam(b, maxUDPPayloadSizeParameterID, uint64(p.MaxUDPPayloadSize)) + } // max_ack_delay // Only send it if is different from the default value. if p.MaxAckDelay != protocol.DefaultMaxAckDelay { @@ -384,13 +391,12 @@ func (p *TransportParameters) Marshal(pers protocol.Perspective) []byte { if p.PreferredAddress != nil { b = quicvarint.Append(b, uint64(preferredAddressParameterID)) b = quicvarint.Append(b, 4+2+16+2+1+uint64(p.PreferredAddress.ConnectionID.Len())+16) - ipv4 := p.PreferredAddress.IPv4 - b = append(b, ipv4[len(ipv4)-4:]...) - b = append(b, []byte{0, 0}...) - binary.BigEndian.PutUint16(b[len(b)-2:], p.PreferredAddress.IPv4Port) - b = append(b, p.PreferredAddress.IPv6...) - b = append(b, []byte{0, 0}...) - binary.BigEndian.PutUint16(b[len(b)-2:], p.PreferredAddress.IPv6Port) + ip4 := p.PreferredAddress.IPv4.Addr().As4() + b = append(b, ip4[:]...) + b = binary.BigEndian.AppendUint16(b, p.PreferredAddress.IPv4.Port()) + ip6 := p.PreferredAddress.IPv6.Addr().As16() + b = append(b, ip6[:]...) + b = binary.BigEndian.AppendUint16(b, p.PreferredAddress.IPv6.Port()) b = append(b, uint8(p.PreferredAddress.ConnectionID.Len())) b = append(b, p.PreferredAddress.ConnectionID.Bytes()...) b = append(b, p.PreferredAddress.StatelessResetToken[:]...) @@ -463,15 +469,15 @@ func (p *TransportParameters) MarshalForSessionTicket(b []byte) []byte { } // UnmarshalFromSessionTicket unmarshals transport parameters from a session ticket. -func (p *TransportParameters) UnmarshalFromSessionTicket(r *bytes.Reader) error { - version, err := quicvarint.Read(r) +func (p *TransportParameters) UnmarshalFromSessionTicket(b []byte) error { + version, l, err := quicvarint.Parse(b) if err != nil { return err } if version != transportParameterMarshalingVersion { return fmt.Errorf("unknown transport parameter marshaling version: %d", version) } - return p.unmarshal(r, protocol.PerspectiveServer, true) + return p.unmarshal(b[l:], protocol.PerspectiveServer, true) } // ValidFor0RTT checks if the transport parameters match those saved in the session ticket. diff --git a/vendor/github.com/quic-go/quic-go/internal/wire/version_negotiation.go b/vendor/github.com/quic-go/quic-go/internal/wire/version_negotiation.go index afde70fa4..a551aa8c9 100644 --- a/vendor/github.com/quic-go/quic-go/internal/wire/version_negotiation.go +++ b/vendor/github.com/quic-go/quic-go/internal/wire/version_negotiation.go @@ -1,17 +1,15 @@ package wire import ( - "bytes" "crypto/rand" "encoding/binary" "errors" "github.com/quic-go/quic-go/internal/protocol" - "github.com/quic-go/quic-go/internal/utils" ) // ParseVersionNegotiationPacket parses a Version Negotiation packet. -func ParseVersionNegotiationPacket(b []byte) (dest, src protocol.ArbitraryLenConnectionID, _ []protocol.VersionNumber, _ error) { +func ParseVersionNegotiationPacket(b []byte) (dest, src protocol.ArbitraryLenConnectionID, _ []protocol.Version, _ error) { n, dest, src, err := ParseArbitraryLenConnectionIDs(b) if err != nil { return nil, nil, nil, err @@ -25,32 +23,31 @@ func ParseVersionNegotiationPacket(b []byte) (dest, src protocol.ArbitraryLenCon //nolint:stylecheck return nil, nil, nil, errors.New("Version Negotiation packet has a version list with an invalid length") } - versions := make([]protocol.VersionNumber, len(b)/4) + versions := make([]protocol.Version, len(b)/4) for i := 0; len(b) > 0; i++ { - versions[i] = protocol.VersionNumber(binary.BigEndian.Uint32(b[:4])) + versions[i] = protocol.Version(binary.BigEndian.Uint32(b[:4])) b = b[4:] } return dest, src, versions, nil } // ComposeVersionNegotiation composes a Version Negotiation -func ComposeVersionNegotiation(destConnID, srcConnID protocol.ArbitraryLenConnectionID, versions []protocol.VersionNumber) []byte { +func ComposeVersionNegotiation(destConnID, srcConnID protocol.ArbitraryLenConnectionID, versions []protocol.Version) []byte { greasedVersions := protocol.GetGreasedVersions(versions) expectedLen := 1 /* type byte */ + 4 /* version field */ + 1 /* dest connection ID length field */ + destConnID.Len() + 1 /* src connection ID length field */ + srcConnID.Len() + len(greasedVersions)*4 - buf := bytes.NewBuffer(make([]byte, 0, expectedLen)) - r := make([]byte, 1) - _, _ = rand.Read(r) // ignore the error here. It is not critical to have perfect random here. + buf := make([]byte, 1+4 /* type byte and version field */, expectedLen) + _, _ = rand.Read(buf[:1]) // ignore the error here. It is not critical to have perfect random here. // Setting the "QUIC bit" (0x40) is not required by the RFC, // but it allows clients to demultiplex QUIC with a long list of other protocols. // See RFC 9443 and https://mailarchive.ietf.org/arch/msg/quic/oR4kxGKY6mjtPC1CZegY1ED4beg/ for details. - buf.WriteByte(r[0] | 0xc0) - utils.BigEndian.WriteUint32(buf, 0) // version 0 - buf.WriteByte(uint8(destConnID.Len())) - buf.Write(destConnID.Bytes()) - buf.WriteByte(uint8(srcConnID.Len())) - buf.Write(srcConnID.Bytes()) + buf[0] |= 0xc0 + // The next 4 bytes are left at 0 (version number). + buf = append(buf, uint8(destConnID.Len())) + buf = append(buf, destConnID.Bytes()...) + buf = append(buf, uint8(srcConnID.Len())) + buf = append(buf, srcConnID.Bytes()...) for _, v := range greasedVersions { - utils.BigEndian.WriteUint32(buf, uint32(v)) + buf = binary.BigEndian.AppendUint32(buf, uint32(v)) } - return buf.Bytes() + return buf } diff --git a/vendor/github.com/quic-go/quic-go/logging/connection_tracer.go b/vendor/github.com/quic-go/quic-go/logging/connection_tracer.go index e3f322d91..a354bbd94 100644 --- a/vendor/github.com/quic-go/quic-go/logging/connection_tracer.go +++ b/vendor/github.com/quic-go/quic-go/logging/connection_tracer.go @@ -20,20 +20,22 @@ type ConnectionTracer struct { ReceivedLongHeaderPacket func(*ExtendedHeader, ByteCount, ECN, []Frame) ReceivedShortHeaderPacket func(*ShortHeader, ByteCount, ECN, []Frame) BufferedPacket func(PacketType, ByteCount) - DroppedPacket func(PacketType, ByteCount, PacketDropReason) + DroppedPacket func(PacketType, PacketNumber, ByteCount, PacketDropReason) UpdatedMetrics func(rttStats *RTTStats, cwnd, bytesInFlight ByteCount, packetsInFlight int) AcknowledgedPacket func(EncryptionLevel, PacketNumber) LostPacket func(EncryptionLevel, PacketNumber, PacketLossReason) + UpdatedMTU func(mtu ByteCount, done bool) UpdatedCongestionState func(CongestionState) UpdatedPTOCount func(value uint32) UpdatedKeyFromTLS func(EncryptionLevel, Perspective) - UpdatedKey func(generation KeyPhase, remote bool) + UpdatedKey func(keyPhase KeyPhase, remote bool) DroppedEncryptionLevel func(EncryptionLevel) - DroppedKey func(generation KeyPhase) + DroppedKey func(keyPhase KeyPhase) SetLossTimer func(TimerType, EncryptionLevel, time.Time) LossTimerExpired func(TimerType, EncryptionLevel) LossTimerCanceled func() ECNStateUpdated func(state ECNState, trigger ECNStateTrigger) + ChoseALPN func(protocol string) // Close is called when the connection is closed. Close func() Debug func(name, msg string) @@ -139,10 +141,10 @@ func NewMultiplexedConnectionTracer(tracers ...*ConnectionTracer) *ConnectionTra } } }, - DroppedPacket: func(typ PacketType, size ByteCount, reason PacketDropReason) { + DroppedPacket: func(typ PacketType, pn PacketNumber, size ByteCount, reason PacketDropReason) { for _, t := range tracers { if t.DroppedPacket != nil { - t.DroppedPacket(typ, size, reason) + t.DroppedPacket(typ, pn, size, reason) } } }, @@ -167,6 +169,13 @@ func NewMultiplexedConnectionTracer(tracers ...*ConnectionTracer) *ConnectionTra } } }, + UpdatedMTU: func(mtu ByteCount, done bool) { + for _, t := range tracers { + if t.UpdatedMTU != nil { + t.UpdatedMTU(mtu, done) + } + } + }, UpdatedCongestionState: func(state CongestionState) { for _, t := range tracers { if t.UpdatedCongestionState != nil { @@ -237,6 +246,13 @@ func NewMultiplexedConnectionTracer(tracers ...*ConnectionTracer) *ConnectionTra } } }, + ChoseALPN: func(protocol string) { + for _, t := range tracers { + if t.ChoseALPN != nil { + t.ChoseALPN(protocol) + } + } + }, Close: func() { for _, t := range tracers { if t.Close != nil { diff --git a/vendor/github.com/quic-go/quic-go/logging/interface.go b/vendor/github.com/quic-go/quic-go/logging/interface.go index 10ac038fb..a618a1893 100644 --- a/vendor/github.com/quic-go/quic-go/logging/interface.go +++ b/vendor/github.com/quic-go/quic-go/logging/interface.go @@ -37,7 +37,7 @@ type ( // The StreamType is the type of the stream (unidirectional or bidirectional). StreamType = protocol.StreamType // The VersionNumber is the QUIC version. - VersionNumber = protocol.VersionNumber + VersionNumber = protocol.Version // The Header is the QUIC packet header, before removing header protection. Header = wire.Header diff --git a/vendor/github.com/quic-go/quic-go/logging/tracer.go b/vendor/github.com/quic-go/quic-go/logging/tracer.go index 5918f30f8..edd85dbaa 100644 --- a/vendor/github.com/quic-go/quic-go/logging/tracer.go +++ b/vendor/github.com/quic-go/quic-go/logging/tracer.go @@ -7,6 +7,8 @@ type Tracer struct { SentPacket func(net.Addr, *Header, ByteCount, []Frame) SentVersionNegotiationPacket func(_ net.Addr, dest, src ArbitraryLenConnectionID, _ []VersionNumber) DroppedPacket func(net.Addr, PacketType, ByteCount, PacketDropReason) + Debug func(name, msg string) + Close func() } // NewMultiplexedTracer creates a new tracer that multiplexes events to multiple tracers. @@ -39,5 +41,19 @@ func NewMultiplexedTracer(tracers ...*Tracer) *Tracer { } } }, + Debug: func(name, msg string) { + for _, t := range tracers { + if t.Debug != nil { + t.Debug(name, msg) + } + } + }, + Close: func() { + for _, t := range tracers { + if t.Close != nil { + t.Close() + } + } + }, } } diff --git a/vendor/github.com/quic-go/quic-go/mockgen.go b/vendor/github.com/quic-go/quic-go/mockgen.go index eb2473863..81cc4a5ef 100644 --- a/vendor/github.com/quic-go/quic-go/mockgen.go +++ b/vendor/github.com/quic-go/quic-go/mockgen.go @@ -2,73 +2,75 @@ package quic -//go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_send_conn_test.go github.com/quic-go/quic-go SendConn" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_send_conn_test.go github.com/quic-go/quic-go SendConn" type SendConn = sendConn -//go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_raw_conn_test.go github.com/quic-go/quic-go RawConn" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_raw_conn_test.go github.com/quic-go/quic-go RawConn" type RawConn = rawConn -//go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_sender_test.go github.com/quic-go/quic-go Sender" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_sender_test.go github.com/quic-go/quic-go Sender" type Sender = sender -//go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_stream_internal_test.go github.com/quic-go/quic-go StreamI" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_stream_internal_test.go github.com/quic-go/quic-go StreamI" type StreamI = streamI -//go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_crypto_stream_test.go github.com/quic-go/quic-go CryptoStream" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_crypto_stream_test.go github.com/quic-go/quic-go CryptoStream" type CryptoStream = cryptoStream -//go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_receive_stream_internal_test.go github.com/quic-go/quic-go ReceiveStreamI" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_receive_stream_internal_test.go github.com/quic-go/quic-go ReceiveStreamI" type ReceiveStreamI = receiveStreamI -//go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_send_stream_internal_test.go github.com/quic-go/quic-go SendStreamI" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_send_stream_internal_test.go github.com/quic-go/quic-go SendStreamI" type SendStreamI = sendStreamI -//go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_stream_getter_test.go github.com/quic-go/quic-go StreamGetter" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_stream_getter_test.go github.com/quic-go/quic-go StreamGetter" type StreamGetter = streamGetter -//go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_stream_sender_test.go github.com/quic-go/quic-go StreamSender" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_stream_sender_test.go github.com/quic-go/quic-go StreamSender" type StreamSender = streamSender -//go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_crypto_data_handler_test.go github.com/quic-go/quic-go CryptoDataHandler" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_crypto_data_handler_test.go github.com/quic-go/quic-go CryptoDataHandler" type CryptoDataHandler = cryptoDataHandler -//go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_frame_source_test.go github.com/quic-go/quic-go FrameSource" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_frame_source_test.go github.com/quic-go/quic-go FrameSource" type FrameSource = frameSource -//go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_ack_frame_source_test.go github.com/quic-go/quic-go AckFrameSource" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_ack_frame_source_test.go github.com/quic-go/quic-go AckFrameSource" type AckFrameSource = ackFrameSource -//go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_stream_manager_test.go github.com/quic-go/quic-go StreamManager" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_stream_manager_test.go github.com/quic-go/quic-go StreamManager" type StreamManager = streamManager -//go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_sealing_manager_test.go github.com/quic-go/quic-go SealingManager" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_sealing_manager_test.go github.com/quic-go/quic-go SealingManager" type SealingManager = sealingManager -//go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_unpacker_test.go github.com/quic-go/quic-go Unpacker" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_unpacker_test.go github.com/quic-go/quic-go Unpacker" type Unpacker = unpacker -//go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_packer_test.go github.com/quic-go/quic-go Packer" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_packer_test.go github.com/quic-go/quic-go Packer" type Packer = packer -//go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_mtu_discoverer_test.go github.com/quic-go/quic-go MTUDiscoverer" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_mtu_discoverer_test.go github.com/quic-go/quic-go MTUDiscoverer" type MTUDiscoverer = mtuDiscoverer -//go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_conn_runner_test.go github.com/quic-go/quic-go ConnRunner" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_conn_runner_test.go github.com/quic-go/quic-go ConnRunner" type ConnRunner = connRunner -//go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_quic_conn_test.go github.com/quic-go/quic-go QUICConn" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_quic_conn_test.go github.com/quic-go/quic-go QUICConn" type QUICConn = quicConn -//go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_packet_handler_test.go github.com/quic-go/quic-go PacketHandler" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_packet_handler_test.go github.com/quic-go/quic-go PacketHandler" type PacketHandler = packetHandler //go:generate sh -c "go run go.uber.org/mock/mockgen -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_packet_handler_manager_test.go github.com/quic-go/quic-go PacketHandlerManager" + +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -build_flags=\"-tags=gomock\" -package quic -self_package github.com/quic-go/quic-go -destination mock_packet_handler_manager_test.go github.com/quic-go/quic-go PacketHandlerManager" type PacketHandlerManager = packetHandlerManager // Need to use source mode for the batchConn, since reflect mode follows type aliases. // See https://github.com/golang/mock/issues/244 for details. // -//go:generate sh -c "go run go.uber.org/mock/mockgen -package quic -self_package github.com/quic-go/quic-go -source sys_conn_oob.go -destination mock_batch_conn_test.go -mock_names batchConn=MockBatchConn" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -package quic -self_package github.com/quic-go/quic-go -source sys_conn_oob.go -destination mock_batch_conn_test.go -mock_names batchConn=MockBatchConn" -//go:generate sh -c "go run go.uber.org/mock/mockgen -package quic -self_package github.com/quic-go/quic-go -self_package github.com/quic-go/quic-go -destination mock_token_store_test.go github.com/quic-go/quic-go TokenStore" -//go:generate sh -c "go run go.uber.org/mock/mockgen -package quic -self_package github.com/quic-go/quic-go -self_package github.com/quic-go/quic-go -destination mock_packetconn_test.go net PacketConn" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -package quic -self_package github.com/quic-go/quic-go -self_package github.com/quic-go/quic-go -destination mock_token_store_test.go github.com/quic-go/quic-go TokenStore" +//go:generate sh -c "go run go.uber.org/mock/mockgen -typed -package quic -self_package github.com/quic-go/quic-go -self_package github.com/quic-go/quic-go -destination mock_packetconn_test.go net PacketConn" diff --git a/vendor/github.com/quic-go/quic-go/mtu_discoverer.go b/vendor/github.com/quic-go/quic-go/mtu_discoverer.go index 317b09292..fb7c09a92 100644 --- a/vendor/github.com/quic-go/quic-go/mtu_discoverer.go +++ b/vendor/github.com/quic-go/quic-go/mtu_discoverer.go @@ -1,19 +1,19 @@ package quic import ( - "net" "time" "github.com/quic-go/quic-go/internal/ackhandler" "github.com/quic-go/quic-go/internal/protocol" "github.com/quic-go/quic-go/internal/utils" "github.com/quic-go/quic-go/internal/wire" + "github.com/quic-go/quic-go/logging" ) type mtuDiscoverer interface { // Start starts the MTU discovery process. // It's unnecessary to call ShouldSendProbe before that. - Start(maxPacketSize protocol.ByteCount) + Start() ShouldSendProbe(now time.Time) bool CurrentSize() protocol.ByteCount GetPing() (ping ackhandler.Frame, datagramSize protocol.ByteCount) @@ -27,20 +27,6 @@ const ( mtuProbeDelay = 5 ) -func getMaxPacketSize(addr net.Addr) protocol.ByteCount { - maxSize := protocol.ByteCount(protocol.MinInitialPacketSize) - // If this is not a UDP address, we don't know anything about the MTU. - // Use the minimum size of an Initial packet as the max packet size. - if udpAddr, ok := addr.(*net.UDPAddr); ok { - if utils.IsIPv4(udpAddr.IP) { - maxSize = protocol.InitialPacketSizeIPv4 - } else { - maxSize = protocol.InitialPacketSizeIPv6 - } - } - return maxSize -} - type mtuFinder struct { lastProbeTime time.Time mtuIncreased func(protocol.ByteCount) @@ -49,16 +35,25 @@ type mtuFinder struct { inFlight protocol.ByteCount // the size of the probe packet currently in flight. InvalidByteCount if none is in flight current protocol.ByteCount max protocol.ByteCount // the maximum value, as advertised by the peer (or our maximum size buffer) + + tracer *logging.ConnectionTracer } var _ mtuDiscoverer = &mtuFinder{} -func newMTUDiscoverer(rttStats *utils.RTTStats, start protocol.ByteCount, mtuIncreased func(protocol.ByteCount)) *mtuFinder { +func newMTUDiscoverer( + rttStats *utils.RTTStats, + start, max protocol.ByteCount, + mtuIncreased func(protocol.ByteCount), + tracer *logging.ConnectionTracer, +) *mtuFinder { return &mtuFinder{ inFlight: protocol.InvalidByteCount, current: start, + max: max, rttStats: rttStats, mtuIncreased: mtuIncreased, + tracer: tracer, } } @@ -66,9 +61,15 @@ func (f *mtuFinder) done() bool { return f.max-f.current <= maxMTUDiff+1 } -func (f *mtuFinder) Start(maxPacketSize protocol.ByteCount) { +func (f *mtuFinder) SetMax(max protocol.ByteCount) { + f.max = max +} + +func (f *mtuFinder) Start() { + if f.max == protocol.InvalidByteCount { + panic("invalid") + } f.lastProbeTime = time.Now() // makes sure the first probe packet is not sent immediately - f.max = maxPacketSize } func (f *mtuFinder) ShouldSendProbe(now time.Time) bool { @@ -87,7 +88,7 @@ func (f *mtuFinder) GetPing() (ackhandler.Frame, protocol.ByteCount) { f.inFlight = size return ackhandler.Frame{ Frame: &wire.PingFrame{}, - Handler: (*mtuFinderAckHandler)(f), + Handler: &mtuFinderAckHandler{f}, }, size } @@ -95,7 +96,9 @@ func (f *mtuFinder) CurrentSize() protocol.ByteCount { return f.current } -type mtuFinderAckHandler mtuFinder +type mtuFinderAckHandler struct { + *mtuFinder +} var _ ackhandler.FrameHandler = &mtuFinderAckHandler{} @@ -106,6 +109,9 @@ func (h *mtuFinderAckHandler) OnAcked(wire.Frame) { } h.inFlight = protocol.InvalidByteCount h.current = size + if h.tracer != nil && h.tracer.UpdatedMTU != nil { + h.tracer.UpdatedMTU(size, h.done()) + } h.mtuIncreased(size) } diff --git a/vendor/github.com/quic-go/quic-go/oss-fuzz.sh b/vendor/github.com/quic-go/quic-go/oss-fuzz.sh index 1efe6baa6..22a577fe1 100644 --- a/vendor/github.com/quic-go/quic-go/oss-fuzz.sh +++ b/vendor/github.com/quic-go/quic-go/oss-fuzz.sh @@ -3,12 +3,12 @@ # Install Go manually, since oss-fuzz ships with an outdated Go version. # See https://github.com/google/oss-fuzz/pull/10643. export CXX="${CXX} -lresolv" # required by Go 1.20 -wget https://go.dev/dl/go1.20.5.linux-amd64.tar.gz \ +wget https://go.dev/dl/go1.22.0.linux-amd64.tar.gz \ && mkdir temp-go \ && rm -rf /root/.go/* \ - && tar -C temp-go/ -xzf go1.20.5.linux-amd64.tar.gz \ + && tar -C temp-go/ -xzf go1.22.0.linux-amd64.tar.gz \ && mv temp-go/go/* /root/.go/ \ - && rm -rf temp-go go1.20.5.linux-amd64.tar.gz + && rm -rf temp-go go1.22.0.linux-amd64.tar.gz ( # fuzz qpack diff --git a/vendor/github.com/quic-go/quic-go/packet_handler_map.go b/vendor/github.com/quic-go/quic-go/packet_handler_map.go index 006eadf92..7840202cc 100644 --- a/vendor/github.com/quic-go/quic-go/packet_handler_map.go +++ b/vendor/github.com/quic-go/quic-go/packet_handler_map.go @@ -129,7 +129,7 @@ func (h *packetHandlerMap) Add(id protocol.ConnectionID, handler packetHandler) return true } -func (h *packetHandlerMap) AddWithConnID(clientDestConnID, newConnID protocol.ConnectionID, fn func() (packetHandler, bool)) bool { +func (h *packetHandlerMap) AddWithConnID(clientDestConnID, newConnID protocol.ConnectionID, handler packetHandler) bool { h.mutex.Lock() defer h.mutex.Unlock() @@ -137,12 +137,8 @@ func (h *packetHandlerMap) AddWithConnID(clientDestConnID, newConnID protocol.Co h.logger.Debugf("Not adding connection ID %s for a new connection, as it already exists.", clientDestConnID) return false } - conn, ok := fn() - if !ok { - return false - } - h.handlers[clientDestConnID] = conn - h.handlers[newConnID] = conn + h.handlers[clientDestConnID] = handler + h.handlers[newConnID] = handler h.logger.Debugf("Adding connection IDs %s and %s for a new connection.", clientDestConnID, newConnID) return true } @@ -168,18 +164,17 @@ func (h *packetHandlerMap) Retire(id protocol.ConnectionID) { // Depending on which side closed the connection, we need to: // * remote close: absorb delayed packets // * local close: retransmit the CONNECTION_CLOSE packet, in case it was lost -func (h *packetHandlerMap) ReplaceWithClosed(ids []protocol.ConnectionID, pers protocol.Perspective, connClosePacket []byte) { +func (h *packetHandlerMap) ReplaceWithClosed(ids []protocol.ConnectionID, connClosePacket []byte) { var handler packetHandler if connClosePacket != nil { handler = newClosedLocalConn( func(addr net.Addr, info packetInfo) { h.enqueueClosePacket(closePacket{payload: connClosePacket, addr: addr, info: info}) }, - pers, h.logger, ) } else { - handler = newClosedRemoteConn(pers) + handler = newClosedRemoteConn() } h.mutex.Lock() @@ -191,7 +186,6 @@ func (h *packetHandlerMap) ReplaceWithClosed(ids []protocol.ConnectionID, pers p time.AfterFunc(h.deleteRetiredConnsAfter, func() { h.mutex.Lock() - handler.shutdown() for _, id := range ids { delete(h.handlers, id) } @@ -220,23 +214,6 @@ func (h *packetHandlerMap) GetByResetToken(token protocol.StatelessResetToken) ( return handler, ok } -func (h *packetHandlerMap) CloseServer() { - h.mutex.Lock() - var wg sync.WaitGroup - for _, handler := range h.handlers { - if handler.getPerspective() == protocol.PerspectiveServer { - wg.Add(1) - go func(handler packetHandler) { - // blocks until the CONNECTION_CLOSE has been sent and the run-loop has stopped - handler.shutdown() - wg.Done() - }(handler) - } - } - h.mutex.Unlock() - wg.Wait() -} - func (h *packetHandlerMap) Close(e error) { h.mutex.Lock() diff --git a/vendor/github.com/quic-go/quic-go/packet_packer.go b/vendor/github.com/quic-go/quic-go/packet_packer.go index a330632be..e707734fb 100644 --- a/vendor/github.com/quic-go/quic-go/packet_packer.go +++ b/vendor/github.com/quic-go/quic-go/packet_packer.go @@ -18,13 +18,13 @@ import ( var errNothingToPack = errors.New("nothing to pack") type packer interface { - PackCoalescedPacket(onlyAck bool, maxPacketSize protocol.ByteCount, v protocol.VersionNumber) (*coalescedPacket, error) - PackAckOnlyPacket(maxPacketSize protocol.ByteCount, v protocol.VersionNumber) (shortHeaderPacket, *packetBuffer, error) - AppendPacket(buf *packetBuffer, maxPacketSize protocol.ByteCount, v protocol.VersionNumber) (shortHeaderPacket, error) - MaybePackProbePacket(protocol.EncryptionLevel, protocol.ByteCount, protocol.VersionNumber) (*coalescedPacket, error) - PackConnectionClose(*qerr.TransportError, protocol.ByteCount, protocol.VersionNumber) (*coalescedPacket, error) - PackApplicationClose(*qerr.ApplicationError, protocol.ByteCount, protocol.VersionNumber) (*coalescedPacket, error) - PackMTUProbePacket(ping ackhandler.Frame, size protocol.ByteCount, v protocol.VersionNumber) (shortHeaderPacket, *packetBuffer, error) + PackCoalescedPacket(onlyAck bool, maxPacketSize protocol.ByteCount, v protocol.Version) (*coalescedPacket, error) + PackAckOnlyPacket(maxPacketSize protocol.ByteCount, v protocol.Version) (shortHeaderPacket, *packetBuffer, error) + AppendPacket(buf *packetBuffer, maxPacketSize protocol.ByteCount, v protocol.Version) (shortHeaderPacket, error) + MaybePackProbePacket(protocol.EncryptionLevel, protocol.ByteCount, protocol.Version) (*coalescedPacket, error) + PackConnectionClose(*qerr.TransportError, protocol.ByteCount, protocol.Version) (*coalescedPacket, error) + PackApplicationClose(*qerr.ApplicationError, protocol.ByteCount, protocol.Version) (*coalescedPacket, error) + PackMTUProbePacket(ping ackhandler.Frame, size protocol.ByteCount, v protocol.Version) (shortHeaderPacket, *packetBuffer, error) SetToken([]byte) } @@ -106,8 +106,8 @@ type sealingManager interface { type frameSource interface { HasData() bool - AppendStreamFrames([]ackhandler.StreamFrame, protocol.ByteCount, protocol.VersionNumber) ([]ackhandler.StreamFrame, protocol.ByteCount) - AppendControlFrames([]ackhandler.Frame, protocol.ByteCount, protocol.VersionNumber) ([]ackhandler.Frame, protocol.ByteCount) + AppendStreamFrames([]ackhandler.StreamFrame, protocol.ByteCount, protocol.Version) ([]ackhandler.StreamFrame, protocol.ByteCount) + AppendControlFrames([]ackhandler.Frame, protocol.ByteCount, protocol.Version) ([]ackhandler.Frame, protocol.ByteCount) } type ackFrameSource interface { @@ -170,7 +170,7 @@ func newPacketPacker( } // PackConnectionClose packs a packet that closes the connection with a transport error. -func (p *packetPacker) PackConnectionClose(e *qerr.TransportError, maxPacketSize protocol.ByteCount, v protocol.VersionNumber) (*coalescedPacket, error) { +func (p *packetPacker) PackConnectionClose(e *qerr.TransportError, maxPacketSize protocol.ByteCount, v protocol.Version) (*coalescedPacket, error) { var reason string // don't send details of crypto errors if !e.ErrorCode.IsCryptoError() { @@ -180,7 +180,7 @@ func (p *packetPacker) PackConnectionClose(e *qerr.TransportError, maxPacketSize } // PackApplicationClose packs a packet that closes the connection with an application error. -func (p *packetPacker) PackApplicationClose(e *qerr.ApplicationError, maxPacketSize protocol.ByteCount, v protocol.VersionNumber) (*coalescedPacket, error) { +func (p *packetPacker) PackApplicationClose(e *qerr.ApplicationError, maxPacketSize protocol.ByteCount, v protocol.Version) (*coalescedPacket, error) { return p.packConnectionClose(true, uint64(e.ErrorCode), 0, e.ErrorMessage, maxPacketSize, v) } @@ -190,7 +190,7 @@ func (p *packetPacker) packConnectionClose( frameType uint64, reason string, maxPacketSize protocol.ByteCount, - v protocol.VersionNumber, + v protocol.Version, ) (*coalescedPacket, error) { var sealers [4]sealer var hdrs [3]*wire.ExtendedHeader @@ -293,7 +293,7 @@ func (p *packetPacker) packConnectionClose( // longHeaderPacketLength calculates the length of a serialized long header packet. // It takes into account that packets that have a tiny payload need to be padded, // such that len(payload) + packet number len >= 4 + AEAD overhead -func (p *packetPacker) longHeaderPacketLength(hdr *wire.ExtendedHeader, pl payload, v protocol.VersionNumber) protocol.ByteCount { +func (p *packetPacker) longHeaderPacketLength(hdr *wire.ExtendedHeader, pl payload, v protocol.Version) protocol.ByteCount { var paddingLen protocol.ByteCount pnLen := protocol.ByteCount(hdr.PacketNumberLen) if pl.length < 4-pnLen { @@ -328,7 +328,7 @@ func (p *packetPacker) initialPaddingLen(frames []ackhandler.Frame, currentSize, // PackCoalescedPacket packs a new packet. // It packs an Initial / Handshake if there is data to send in these packet number spaces. // It should only be called before the handshake is confirmed. -func (p *packetPacker) PackCoalescedPacket(onlyAck bool, maxPacketSize protocol.ByteCount, v protocol.VersionNumber) (*coalescedPacket, error) { +func (p *packetPacker) PackCoalescedPacket(onlyAck bool, maxPacketSize protocol.ByteCount, v protocol.Version) (*coalescedPacket, error) { var ( initialHdr, handshakeHdr, zeroRTTHdr *wire.ExtendedHeader initialPayload, handshakePayload, zeroRTTPayload, oneRTTPayload payload @@ -442,7 +442,7 @@ func (p *packetPacker) PackCoalescedPacket(onlyAck bool, maxPacketSize protocol. // PackAckOnlyPacket packs a packet containing only an ACK in the application data packet number space. // It should be called after the handshake is confirmed. -func (p *packetPacker) PackAckOnlyPacket(maxPacketSize protocol.ByteCount, v protocol.VersionNumber) (shortHeaderPacket, *packetBuffer, error) { +func (p *packetPacker) PackAckOnlyPacket(maxPacketSize protocol.ByteCount, v protocol.Version) (shortHeaderPacket, *packetBuffer, error) { buf := getPacketBuffer() packet, err := p.appendPacket(buf, true, maxPacketSize, v) return packet, buf, err @@ -450,11 +450,11 @@ func (p *packetPacker) PackAckOnlyPacket(maxPacketSize protocol.ByteCount, v pro // AppendPacket packs a packet in the application data packet number space. // It should be called after the handshake is confirmed. -func (p *packetPacker) AppendPacket(buf *packetBuffer, maxPacketSize protocol.ByteCount, v protocol.VersionNumber) (shortHeaderPacket, error) { +func (p *packetPacker) AppendPacket(buf *packetBuffer, maxPacketSize protocol.ByteCount, v protocol.Version) (shortHeaderPacket, error) { return p.appendPacket(buf, false, maxPacketSize, v) } -func (p *packetPacker) appendPacket(buf *packetBuffer, onlyAck bool, maxPacketSize protocol.ByteCount, v protocol.VersionNumber) (shortHeaderPacket, error) { +func (p *packetPacker) appendPacket(buf *packetBuffer, onlyAck bool, maxPacketSize protocol.ByteCount, v protocol.Version) (shortHeaderPacket, error) { sealer, err := p.cryptoSetup.Get1RTTSealer() if err != nil { return shortHeaderPacket{}, err @@ -471,7 +471,7 @@ func (p *packetPacker) appendPacket(buf *packetBuffer, onlyAck bool, maxPacketSi return p.appendShortHeaderPacket(buf, connID, pn, pnLen, kp, pl, 0, maxPacketSize, sealer, false, v) } -func (p *packetPacker) maybeGetCryptoPacket(maxPacketSize protocol.ByteCount, encLevel protocol.EncryptionLevel, onlyAck, ackAllowed bool, v protocol.VersionNumber) (*wire.ExtendedHeader, payload) { +func (p *packetPacker) maybeGetCryptoPacket(maxPacketSize protocol.ByteCount, encLevel protocol.EncryptionLevel, onlyAck, ackAllowed bool, v protocol.Version) (*wire.ExtendedHeader, payload) { if onlyAck { if ack := p.acks.GetAckFrame(encLevel, true); ack != nil { return p.getLongHeader(encLevel, v), payload{ @@ -543,7 +543,7 @@ func (p *packetPacker) maybeGetCryptoPacket(maxPacketSize protocol.ByteCount, en return hdr, pl } -func (p *packetPacker) maybeGetAppDataPacketFor0RTT(sealer sealer, maxPacketSize protocol.ByteCount, v protocol.VersionNumber) (*wire.ExtendedHeader, payload) { +func (p *packetPacker) maybeGetAppDataPacketFor0RTT(sealer sealer, maxPacketSize protocol.ByteCount, v protocol.Version) (*wire.ExtendedHeader, payload) { if p.perspective != protocol.PerspectiveClient { return nil, payload{} } @@ -553,12 +553,12 @@ func (p *packetPacker) maybeGetAppDataPacketFor0RTT(sealer sealer, maxPacketSize return hdr, p.maybeGetAppDataPacket(maxPayloadSize, false, false, v) } -func (p *packetPacker) maybeGetShortHeaderPacket(sealer handshake.ShortHeaderSealer, hdrLen protocol.ByteCount, maxPacketSize protocol.ByteCount, onlyAck, ackAllowed bool, v protocol.VersionNumber) payload { +func (p *packetPacker) maybeGetShortHeaderPacket(sealer handshake.ShortHeaderSealer, hdrLen protocol.ByteCount, maxPacketSize protocol.ByteCount, onlyAck, ackAllowed bool, v protocol.Version) payload { maxPayloadSize := maxPacketSize - hdrLen - protocol.ByteCount(sealer.Overhead()) return p.maybeGetAppDataPacket(maxPayloadSize, onlyAck, ackAllowed, v) } -func (p *packetPacker) maybeGetAppDataPacket(maxPayloadSize protocol.ByteCount, onlyAck, ackAllowed bool, v protocol.VersionNumber) payload { +func (p *packetPacker) maybeGetAppDataPacket(maxPayloadSize protocol.ByteCount, onlyAck, ackAllowed bool, v protocol.Version) payload { pl := p.composeNextPacket(maxPayloadSize, onlyAck, ackAllowed, v) // check if we have anything to send @@ -581,7 +581,7 @@ func (p *packetPacker) maybeGetAppDataPacket(maxPayloadSize protocol.ByteCount, return pl } -func (p *packetPacker) composeNextPacket(maxFrameSize protocol.ByteCount, onlyAck, ackAllowed bool, v protocol.VersionNumber) payload { +func (p *packetPacker) composeNextPacket(maxFrameSize protocol.ByteCount, onlyAck, ackAllowed bool, v protocol.Version) payload { if onlyAck { if ack := p.acks.GetAckFrame(protocol.Encryption1RTT, true); ack != nil { return payload{ack: ack, length: ack.Length(v)} @@ -589,12 +589,11 @@ func (p *packetPacker) composeNextPacket(maxFrameSize protocol.ByteCount, onlyAc return payload{} } - pl := payload{streamFrames: make([]ackhandler.StreamFrame, 0, 1)} - hasData := p.framer.HasData() hasRetransmission := p.retransmissionQueue.HasAppData() var hasAck bool + var pl payload if ackAllowed { if ack := p.acks.GetAckFrame(protocol.Encryption1RTT, !hasRetransmission && !hasData); ack != nil { pl.ack = ack @@ -606,11 +605,17 @@ func (p *packetPacker) composeNextPacket(maxFrameSize protocol.ByteCount, onlyAc if p.datagramQueue != nil { if f := p.datagramQueue.Peek(); f != nil { size := f.Length(v) - if size <= maxFrameSize-pl.length { + if size <= maxFrameSize-pl.length { // DATAGRAM frame fits pl.frames = append(pl.frames, ackhandler.Frame{Frame: f}) pl.length += size p.datagramQueue.Pop() + } else if !hasAck { + // The DATAGRAM frame doesn't fit, and the packet doesn't contain an ACK. + // Discard this frame. There's no point in retrying this in the next packet, + // as it's unlikely that the available packet size will increase. + p.datagramQueue.Pop() } + // If the DATAGRAM frame was too large and the packet contained an ACK, we'll try to send it out later. } } @@ -655,7 +660,7 @@ func (p *packetPacker) composeNextPacket(maxFrameSize protocol.ByteCount, onlyAc return pl } -func (p *packetPacker) MaybePackProbePacket(encLevel protocol.EncryptionLevel, maxPacketSize protocol.ByteCount, v protocol.VersionNumber) (*coalescedPacket, error) { +func (p *packetPacker) MaybePackProbePacket(encLevel protocol.EncryptionLevel, maxPacketSize protocol.ByteCount, v protocol.Version) (*coalescedPacket, error) { if encLevel == protocol.Encryption1RTT { s, err := p.cryptoSetup.Get1RTTSealer() if err != nil { @@ -721,7 +726,7 @@ func (p *packetPacker) MaybePackProbePacket(encLevel protocol.EncryptionLevel, m return packet, nil } -func (p *packetPacker) PackMTUProbePacket(ping ackhandler.Frame, size protocol.ByteCount, v protocol.VersionNumber) (shortHeaderPacket, *packetBuffer, error) { +func (p *packetPacker) PackMTUProbePacket(ping ackhandler.Frame, size protocol.ByteCount, v protocol.Version) (shortHeaderPacket, *packetBuffer, error) { pl := payload{ frames: []ackhandler.Frame{ping}, length: ping.Frame.Length(v), @@ -739,7 +744,7 @@ func (p *packetPacker) PackMTUProbePacket(ping ackhandler.Frame, size protocol.B return packet, buffer, err } -func (p *packetPacker) getLongHeader(encLevel protocol.EncryptionLevel, v protocol.VersionNumber) *wire.ExtendedHeader { +func (p *packetPacker) getLongHeader(encLevel protocol.EncryptionLevel, v protocol.Version) *wire.ExtendedHeader { pn, pnLen := p.pnManager.PeekPacketNumber(encLevel) hdr := &wire.ExtendedHeader{ PacketNumber: pn, @@ -762,7 +767,7 @@ func (p *packetPacker) getLongHeader(encLevel protocol.EncryptionLevel, v protoc return hdr } -func (p *packetPacker) appendLongHeaderPacket(buffer *packetBuffer, header *wire.ExtendedHeader, pl payload, padding protocol.ByteCount, encLevel protocol.EncryptionLevel, sealer sealer, v protocol.VersionNumber) (*longHeaderPacket, error) { +func (p *packetPacker) appendLongHeaderPacket(buffer *packetBuffer, header *wire.ExtendedHeader, pl payload, padding protocol.ByteCount, encLevel protocol.EncryptionLevel, sealer sealer, v protocol.Version) (*longHeaderPacket, error) { var paddingLen protocol.ByteCount pnLen := protocol.ByteCount(header.PacketNumberLen) if pl.length < 4-pnLen { @@ -808,7 +813,7 @@ func (p *packetPacker) appendShortHeaderPacket( padding, maxPacketSize protocol.ByteCount, sealer sealer, isMTUProbePacket bool, - v protocol.VersionNumber, + v protocol.Version, ) (shortHeaderPacket, error) { var paddingLen protocol.ByteCount if pl.length < 4-protocol.ByteCount(pnLen) { @@ -854,7 +859,7 @@ func (p *packetPacker) appendShortHeaderPacket( // appendPacketPayload serializes the payload of a packet into the raw byte slice. // It modifies the order of payload.frames. -func (p *packetPacker) appendPacketPayload(raw []byte, pl payload, paddingLen protocol.ByteCount, v protocol.VersionNumber) ([]byte, error) { +func (p *packetPacker) appendPacketPayload(raw []byte, pl payload, paddingLen protocol.ByteCount, v protocol.Version) ([]byte, error) { payloadOffset := len(raw) if pl.ack != nil { var err error diff --git a/vendor/github.com/quic-go/quic-go/packet_unpacker.go b/vendor/github.com/quic-go/quic-go/packet_unpacker.go index 103524c7d..1034aab1d 100644 --- a/vendor/github.com/quic-go/quic-go/packet_unpacker.go +++ b/vendor/github.com/quic-go/quic-go/packet_unpacker.go @@ -53,7 +53,7 @@ func newPacketUnpacker(cs handshake.CryptoSetup, shortHdrConnIDLen int) *packetU // If the reserved bits are invalid, the error is wire.ErrInvalidReservedBits. // If any other error occurred when parsing the header, the error is of type headerParseError. // If decrypting the payload fails for any reason, the error is the error returned by the AEAD. -func (u *packetUnpacker) UnpackLongHeader(hdr *wire.Header, rcvTime time.Time, data []byte, v protocol.VersionNumber) (*unpackedPacket, error) { +func (u *packetUnpacker) UnpackLongHeader(hdr *wire.Header, rcvTime time.Time, data []byte, v protocol.Version) (*unpackedPacket, error) { var encLevel protocol.EncryptionLevel var extHdr *wire.ExtendedHeader var decrypted []byte @@ -125,7 +125,7 @@ func (u *packetUnpacker) UnpackShortHeader(rcvTime time.Time, data []byte) (prot return pn, pnLen, kp, decrypted, nil } -func (u *packetUnpacker) unpackLongHeaderPacket(opener handshake.LongHeaderOpener, hdr *wire.Header, data []byte, v protocol.VersionNumber) (*wire.ExtendedHeader, []byte, error) { +func (u *packetUnpacker) unpackLongHeaderPacket(opener handshake.LongHeaderOpener, hdr *wire.Header, data []byte, v protocol.Version) (*wire.ExtendedHeader, []byte, error) { extHdr, parseErr := u.unpackLongHeader(opener, hdr, data, v) // If the reserved bits are set incorrectly, we still need to continue unpacking. // This avoids a timing side-channel, which otherwise might allow an attacker @@ -187,7 +187,7 @@ func (u *packetUnpacker) unpackShortHeader(hd headerDecryptor, data []byte) (int } // The error is either nil, a wire.ErrInvalidReservedBits or of type headerParseError. -func (u *packetUnpacker) unpackLongHeader(hd headerDecryptor, hdr *wire.Header, data []byte, v protocol.VersionNumber) (*wire.ExtendedHeader, error) { +func (u *packetUnpacker) unpackLongHeader(hd headerDecryptor, hdr *wire.Header, data []byte, v protocol.Version) (*wire.ExtendedHeader, error) { extHdr, err := unpackLongHeader(hd, hdr, data, v) if err != nil && err != wire.ErrInvalidReservedBits { return nil, &headerParseError{err: err} @@ -195,7 +195,7 @@ func (u *packetUnpacker) unpackLongHeader(hd headerDecryptor, hdr *wire.Header, return extHdr, err } -func unpackLongHeader(hd headerDecryptor, hdr *wire.Header, data []byte, v protocol.VersionNumber) (*wire.ExtendedHeader, error) { +func unpackLongHeader(hd headerDecryptor, hdr *wire.Header, data []byte, v protocol.Version) (*wire.ExtendedHeader, error) { r := bytes.NewReader(data) hdrLen := hdr.ParsedLen() diff --git a/vendor/github.com/quic-go/quic-go/qlog/qlog.go b/vendor/github.com/quic-go/quic-go/qlog/connection_tracer.go similarity index 75% rename from vendor/github.com/quic-go/quic-go/qlog/qlog.go rename to vendor/github.com/quic-go/quic-go/qlog/connection_tracer.go index 7801b6463..3ea0ce11c 100644 --- a/vendor/github.com/quic-go/quic-go/qlog/qlog.go +++ b/vendor/github.com/quic-go/quic-go/qlog/connection_tracer.go @@ -1,13 +1,8 @@ package qlog import ( - "bytes" - "fmt" "io" - "log" "net" - "runtime/debug" - "sync" "time" "github.com/quic-go/quic-go/internal/protocol" @@ -18,62 +13,28 @@ import ( "github.com/francoispqt/gojay" ) -// Setting of this only works when quic-go is used as a library. -// When building a binary from this repository, the version can be set using the following go build flag: -// -ldflags="-X github.com/quic-go/quic-go/qlog.quicGoVersion=foobar" -var quicGoVersion = "(devel)" - -func init() { - if quicGoVersion != "(devel)" { // variable set by ldflags - return - } - info, ok := debug.ReadBuildInfo() - if !ok { // no build info available. This happens when quic-go is not used as a library. - return - } - for _, d := range info.Deps { - if d.Path == "github.com/quic-go/quic-go" { - quicGoVersion = d.Version - if d.Replace != nil { - if len(d.Replace.Version) > 0 { - quicGoVersion = d.Version - } else { - quicGoVersion += " (replaced)" - } - } - break - } - } -} - -const eventChanSize = 50 - type connectionTracer struct { - mutex sync.Mutex - - w io.WriteCloser - odcid protocol.ConnectionID - perspective protocol.Perspective - referenceTime time.Time - - events chan event - encodeErr error - runStopped chan struct{} - + w writer lastMetrics *metrics + + perspective logging.Perspective } // NewConnectionTracer creates a new tracer to record a qlog for a connection. -func NewConnectionTracer(w io.WriteCloser, p protocol.Perspective, odcid protocol.ConnectionID) *logging.ConnectionTracer { - t := connectionTracer{ - w: w, - perspective: p, - odcid: odcid, - runStopped: make(chan struct{}), - events: make(chan event, eventChanSize), - referenceTime: time.Now(), +func NewConnectionTracer(w io.WriteCloser, p logging.Perspective, odcid protocol.ConnectionID) *logging.ConnectionTracer { + tr := &trace{ + VantagePoint: vantagePoint{Type: p.String()}, + CommonFields: commonFields{ + ODCID: &odcid, + GroupID: &odcid, + ReferenceTime: time.Now(), + }, } - go t.run() + t := connectionTracer{ + w: *newWriter(w, tr), + perspective: p, + } + go t.w.Run() return &logging.ConnectionTracer{ StartedConnection: func(local, remote net.Addr, srcConnID, destConnID logging.ConnectionID) { t.StartedConnection(local, remote, srcConnID, destConnID) @@ -106,8 +67,8 @@ func NewConnectionTracer(w io.WriteCloser, p protocol.Perspective, odcid protoco BufferedPacket: func(pt logging.PacketType, size protocol.ByteCount) { t.BufferedPacket(pt, size) }, - DroppedPacket: func(pt logging.PacketType, size protocol.ByteCount, reason logging.PacketDropReason) { - t.DroppedPacket(pt, size, reason) + DroppedPacket: func(pt logging.PacketType, pn logging.PacketNumber, size logging.ByteCount, reason logging.PacketDropReason) { + t.DroppedPacket(pt, pn, size, reason) }, UpdatedMetrics: func(rttStats *utils.RTTStats, cwnd, bytesInFlight protocol.ByteCount, packetsInFlight int) { t.UpdatedMetrics(rttStats, cwnd, bytesInFlight, packetsInFlight) @@ -115,6 +76,9 @@ func NewConnectionTracer(w io.WriteCloser, p protocol.Perspective, odcid protoco LostPacket: func(encLevel protocol.EncryptionLevel, pn protocol.PacketNumber, lossReason logging.PacketLossReason) { t.LostPacket(encLevel, pn, lossReason) }, + UpdatedMTU: func(mtu logging.ByteCount, done bool) { + t.UpdatedMTU(mtu, done) + }, UpdatedCongestionState: func(state logging.CongestionState) { t.UpdatedCongestionState(state) }, @@ -124,14 +88,14 @@ func NewConnectionTracer(w io.WriteCloser, p protocol.Perspective, odcid protoco UpdatedKeyFromTLS: func(encLevel protocol.EncryptionLevel, pers protocol.Perspective) { t.UpdatedKeyFromTLS(encLevel, pers) }, - UpdatedKey: func(generation protocol.KeyPhase, remote bool) { - t.UpdatedKey(generation, remote) + UpdatedKey: func(keyPhase protocol.KeyPhase, remote bool) { + t.UpdatedKey(keyPhase, remote) }, DroppedEncryptionLevel: func(encLevel protocol.EncryptionLevel) { t.DroppedEncryptionLevel(encLevel) }, - DroppedKey: func(generation protocol.KeyPhase) { - t.DroppedKey(generation) + DroppedKey: func(keyPhase protocol.KeyPhase) { + t.DroppedKey(keyPhase) }, SetLossTimer: func(tt logging.TimerType, encLevel protocol.EncryptionLevel, timeout time.Time) { t.SetLossTimer(tt, encLevel, timeout) @@ -145,6 +109,9 @@ func NewConnectionTracer(w io.WriteCloser, p protocol.Perspective, odcid protoco ECNStateUpdated: func(state logging.ECNState, trigger logging.ECNStateTrigger) { t.ECNStateUpdated(state, trigger) }, + ChoseALPN: func(protocol string) { + t.recordEvent(time.Now(), eventALPNInformation{chosenALPN: protocol}) + }, Debug: func(name, msg string) { t.Debug(name, msg) }, @@ -154,65 +121,12 @@ func NewConnectionTracer(w io.WriteCloser, p protocol.Perspective, odcid protoco } } -func (t *connectionTracer) run() { - defer close(t.runStopped) - buf := &bytes.Buffer{} - enc := gojay.NewEncoder(buf) - tl := &topLevel{ - trace: trace{ - VantagePoint: vantagePoint{Type: t.perspective}, - CommonFields: commonFields{ - ODCID: t.odcid, - GroupID: t.odcid, - ReferenceTime: t.referenceTime, - }, - }, - } - if err := enc.Encode(tl); err != nil { - panic(fmt.Sprintf("qlog encoding into a bytes.Buffer failed: %s", err)) - } - if err := buf.WriteByte('\n'); err != nil { - panic(fmt.Sprintf("qlog encoding into a bytes.Buffer failed: %s", err)) - } - if _, err := t.w.Write(buf.Bytes()); err != nil { - t.encodeErr = err - } - enc = gojay.NewEncoder(t.w) - for ev := range t.events { - if t.encodeErr != nil { // if encoding failed, just continue draining the event channel - continue - } - if err := enc.Encode(ev); err != nil { - t.encodeErr = err - continue - } - if _, err := t.w.Write([]byte{'\n'}); err != nil { - t.encodeErr = err - } - } +func (t *connectionTracer) recordEvent(eventTime time.Time, details eventDetails) { + t.w.RecordEvent(eventTime, details) } func (t *connectionTracer) Close() { - if err := t.export(); err != nil { - log.Printf("exporting qlog failed: %s\n", err) - } -} - -// export writes a qlog. -func (t *connectionTracer) export() error { - close(t.events) - <-t.runStopped - if t.encodeErr != nil { - return t.encodeErr - } - return t.w.Close() -} - -func (t *connectionTracer) recordEvent(eventTime time.Time, details eventDetails) { - t.events <- event{ - RelativeTime: eventTime.Sub(t.referenceTime), - eventDetails: details, - } + t.w.Close() } func (t *connectionTracer) StartedConnection(local, remote net.Addr, srcConnID, destConnID protocol.ConnectionID) { @@ -225,14 +139,12 @@ func (t *connectionTracer) StartedConnection(local, remote net.Addr, srcConnID, if !ok { return } - t.mutex.Lock() t.recordEvent(time.Now(), &eventConnectionStarted{ SrcAddr: localAddr, DestAddr: remoteAddr, SrcConnectionID: srcConnID, DestConnectionID: destConnID, }) - t.mutex.Unlock() } func (t *connectionTracer) NegotiatedVersion(chosen logging.VersionNumber, client, server []logging.VersionNumber) { @@ -249,19 +161,15 @@ func (t *connectionTracer) NegotiatedVersion(chosen logging.VersionNumber, clien serverVersions[i] = versionNumber(v) } } - t.mutex.Lock() t.recordEvent(time.Now(), &eventVersionNegotiated{ clientVersions: clientVersions, serverVersions: serverVersions, chosenVersion: versionNumber(chosen), }) - t.mutex.Unlock() } func (t *connectionTracer) ClosedConnection(e error) { - t.mutex.Lock() t.recordEvent(time.Now(), &eventConnectionClosed{e: e}) - t.mutex.Unlock() } func (t *connectionTracer) SentTransportParameters(tp *wire.TransportParameters) { @@ -276,9 +184,7 @@ func (t *connectionTracer) RestoredTransportParameters(tp *wire.TransportParamet ev := t.toTransportParameters(tp) ev.Restore = true - t.mutex.Lock() t.recordEvent(time.Now(), ev) - t.mutex.Unlock() } func (t *connectionTracer) recordTransportParameters(sentBy protocol.Perspective, tp *wire.TransportParameters) { @@ -289,9 +195,7 @@ func (t *connectionTracer) recordTransportParameters(sentBy protocol.Perspective } ev.SentBy = sentBy - t.mutex.Lock() t.recordEvent(time.Now(), ev) - t.mutex.Unlock() } func (t *connectionTracer) toTransportParameters(tp *wire.TransportParameters) *eventTransportParameters { @@ -299,9 +203,7 @@ func (t *connectionTracer) toTransportParameters(tp *wire.TransportParameters) * if tp.PreferredAddress != nil { pa = &preferredAddress{ IPv4: tp.PreferredAddress.IPv4, - PortV4: tp.PreferredAddress.IPv4Port, IPv6: tp.PreferredAddress.IPv6, - PortV6: tp.PreferredAddress.IPv6Port, ConnectionID: tp.PreferredAddress.ConnectionID, StatelessResetToken: tp.PreferredAddress.StatelessResetToken, } @@ -366,7 +268,6 @@ func (t *connectionTracer) sentPacket( for _, f := range frames { fs = append(fs, frame{Frame: f}) } - t.mutex.Lock() t.recordEvent(time.Now(), &eventPacketSent{ Header: hdr, Length: size, @@ -374,7 +275,6 @@ func (t *connectionTracer) sentPacket( ECN: ecn, Frames: fs, }) - t.mutex.Unlock() } func (t *connectionTracer) ReceivedLongHeaderPacket(hdr *logging.ExtendedHeader, size logging.ByteCount, ecn logging.ECN, frames []logging.Frame) { @@ -383,7 +283,6 @@ func (t *connectionTracer) ReceivedLongHeaderPacket(hdr *logging.ExtendedHeader, fs[i] = frame{Frame: f} } header := *transformLongHeader(hdr) - t.mutex.Lock() t.recordEvent(time.Now(), &eventPacketReceived{ Header: header, Length: size, @@ -391,7 +290,6 @@ func (t *connectionTracer) ReceivedLongHeaderPacket(hdr *logging.ExtendedHeader, ECN: ecn, Frames: fs, }) - t.mutex.Unlock() } func (t *connectionTracer) ReceivedShortHeaderPacket(hdr *logging.ShortHeader, size logging.ByteCount, ecn logging.ECN, frames []logging.Frame) { @@ -400,7 +298,6 @@ func (t *connectionTracer) ReceivedShortHeaderPacket(hdr *logging.ShortHeader, s fs[i] = frame{Frame: f} } header := *transformShortHeader(hdr) - t.mutex.Lock() t.recordEvent(time.Now(), &eventPacketReceived{ Header: header, Length: size, @@ -408,15 +305,12 @@ func (t *connectionTracer) ReceivedShortHeaderPacket(hdr *logging.ShortHeader, s ECN: ecn, Frames: fs, }) - t.mutex.Unlock() } func (t *connectionTracer) ReceivedRetry(hdr *wire.Header) { - t.mutex.Lock() t.recordEvent(time.Now(), &eventRetryReceived{ Header: *transformHeader(hdr), }) - t.mutex.Unlock() } func (t *connectionTracer) ReceivedVersionNegotiationPacket(dest, src logging.ArbitraryLenConnectionID, versions []logging.VersionNumber) { @@ -424,7 +318,6 @@ func (t *connectionTracer) ReceivedVersionNegotiationPacket(dest, src logging.Ar for i, v := range versions { ver[i] = versionNumber(v) } - t.mutex.Lock() t.recordEvent(time.Now(), &eventVersionNegotiationReceived{ Header: packetHeaderVersionNegotiation{ SrcConnectionID: src, @@ -432,26 +325,22 @@ func (t *connectionTracer) ReceivedVersionNegotiationPacket(dest, src logging.Ar }, SupportedVersions: ver, }) - t.mutex.Unlock() } func (t *connectionTracer) BufferedPacket(pt logging.PacketType, size protocol.ByteCount) { - t.mutex.Lock() t.recordEvent(time.Now(), &eventPacketBuffered{ PacketType: pt, PacketSize: size, }) - t.mutex.Unlock() } -func (t *connectionTracer) DroppedPacket(pt logging.PacketType, size protocol.ByteCount, reason logging.PacketDropReason) { - t.mutex.Lock() +func (t *connectionTracer) DroppedPacket(pt logging.PacketType, pn logging.PacketNumber, size protocol.ByteCount, reason logging.PacketDropReason) { t.recordEvent(time.Now(), &eventPacketDropped{ - PacketType: pt, - PacketSize: size, - Trigger: packetDropReason(reason), + PacketType: pt, + PacketNumber: pn, + PacketSize: size, + Trigger: packetDropReason(reason), }) - t.mutex.Unlock() } func (t *connectionTracer) UpdatedMetrics(rttStats *utils.RTTStats, cwnd, bytesInFlight protocol.ByteCount, packetsInFlight int) { @@ -464,46 +353,40 @@ func (t *connectionTracer) UpdatedMetrics(rttStats *utils.RTTStats, cwnd, bytesI BytesInFlight: bytesInFlight, PacketsInFlight: packetsInFlight, } - t.mutex.Lock() t.recordEvent(time.Now(), &eventMetricsUpdated{ Last: t.lastMetrics, Current: m, }) t.lastMetrics = m - t.mutex.Unlock() } func (t *connectionTracer) AcknowledgedPacket(protocol.EncryptionLevel, protocol.PacketNumber) {} func (t *connectionTracer) LostPacket(encLevel protocol.EncryptionLevel, pn protocol.PacketNumber, lossReason logging.PacketLossReason) { - t.mutex.Lock() t.recordEvent(time.Now(), &eventPacketLost{ PacketType: getPacketTypeFromEncryptionLevel(encLevel), PacketNumber: pn, Trigger: packetLossReason(lossReason), }) - t.mutex.Unlock() +} + +func (t *connectionTracer) UpdatedMTU(mtu protocol.ByteCount, done bool) { + t.recordEvent(time.Now(), &eventMTUUpdated{mtu: mtu, done: done}) } func (t *connectionTracer) UpdatedCongestionState(state logging.CongestionState) { - t.mutex.Lock() t.recordEvent(time.Now(), &eventCongestionStateUpdated{state: congestionState(state)}) - t.mutex.Unlock() } func (t *connectionTracer) UpdatedPTOCount(value uint32) { - t.mutex.Lock() t.recordEvent(time.Now(), &eventUpdatedPTO{Value: value}) - t.mutex.Unlock() } func (t *connectionTracer) UpdatedKeyFromTLS(encLevel protocol.EncryptionLevel, pers protocol.Perspective) { - t.mutex.Lock() t.recordEvent(time.Now(), &eventKeyUpdated{ Trigger: keyUpdateTLS, KeyType: encLevelToKeyType(encLevel, pers), }) - t.mutex.Unlock() } func (t *connectionTracer) UpdatedKey(generation protocol.KeyPhase, remote bool) { @@ -511,23 +394,20 @@ func (t *connectionTracer) UpdatedKey(generation protocol.KeyPhase, remote bool) if remote { trigger = keyUpdateRemote } - t.mutex.Lock() now := time.Now() t.recordEvent(now, &eventKeyUpdated{ - Trigger: trigger, - KeyType: keyTypeClient1RTT, - Generation: generation, + Trigger: trigger, + KeyType: keyTypeClient1RTT, + KeyPhase: generation, }) t.recordEvent(now, &eventKeyUpdated{ - Trigger: trigger, - KeyType: keyTypeServer1RTT, - Generation: generation, + Trigger: trigger, + KeyType: keyTypeServer1RTT, + KeyPhase: generation, }) - t.mutex.Unlock() } func (t *connectionTracer) DroppedEncryptionLevel(encLevel protocol.EncryptionLevel) { - t.mutex.Lock() now := time.Now() if encLevel == protocol.Encryption0RTT { t.recordEvent(now, &eventKeyDiscarded{KeyType: encLevelToKeyType(encLevel, t.perspective)}) @@ -535,60 +415,47 @@ func (t *connectionTracer) DroppedEncryptionLevel(encLevel protocol.EncryptionLe t.recordEvent(now, &eventKeyDiscarded{KeyType: encLevelToKeyType(encLevel, protocol.PerspectiveServer)}) t.recordEvent(now, &eventKeyDiscarded{KeyType: encLevelToKeyType(encLevel, protocol.PerspectiveClient)}) } - t.mutex.Unlock() } func (t *connectionTracer) DroppedKey(generation protocol.KeyPhase) { - t.mutex.Lock() now := time.Now() t.recordEvent(now, &eventKeyDiscarded{ - KeyType: encLevelToKeyType(protocol.Encryption1RTT, protocol.PerspectiveServer), - Generation: generation, + KeyType: encLevelToKeyType(protocol.Encryption1RTT, protocol.PerspectiveServer), + KeyPhase: generation, }) t.recordEvent(now, &eventKeyDiscarded{ - KeyType: encLevelToKeyType(protocol.Encryption1RTT, protocol.PerspectiveClient), - Generation: generation, + KeyType: encLevelToKeyType(protocol.Encryption1RTT, protocol.PerspectiveClient), + KeyPhase: generation, }) - t.mutex.Unlock() } func (t *connectionTracer) SetLossTimer(tt logging.TimerType, encLevel protocol.EncryptionLevel, timeout time.Time) { - t.mutex.Lock() now := time.Now() t.recordEvent(now, &eventLossTimerSet{ TimerType: timerType(tt), EncLevel: encLevel, Delta: timeout.Sub(now), }) - t.mutex.Unlock() } func (t *connectionTracer) LossTimerExpired(tt logging.TimerType, encLevel protocol.EncryptionLevel) { - t.mutex.Lock() t.recordEvent(time.Now(), &eventLossTimerExpired{ TimerType: timerType(tt), EncLevel: encLevel, }) - t.mutex.Unlock() } func (t *connectionTracer) LossTimerCanceled() { - t.mutex.Lock() t.recordEvent(time.Now(), &eventLossTimerCanceled{}) - t.mutex.Unlock() } func (t *connectionTracer) ECNStateUpdated(state logging.ECNState, trigger logging.ECNStateTrigger) { - t.mutex.Lock() t.recordEvent(time.Now(), &eventECNStateUpdated{state: state, trigger: trigger}) - t.mutex.Unlock() } func (t *connectionTracer) Debug(name, msg string) { - t.mutex.Lock() t.recordEvent(time.Now(), &eventGeneric{ name: name, msg: msg, }) - t.mutex.Unlock() } diff --git a/vendor/github.com/quic-go/quic-go/qlog/event.go b/vendor/github.com/quic-go/quic-go/qlog/event.go index 740d3c2e1..7602b55ce 100644 --- a/vendor/github.com/quic-go/quic-go/qlog/event.go +++ b/vendor/github.com/quic-go/quic-go/qlog/event.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "net" + "net/netip" "time" "github.com/quic-go/quic-go" @@ -232,6 +233,20 @@ func (e eventVersionNegotiationReceived) MarshalJSONObject(enc *gojay.Encoder) { enc.ArrayKey("supported_versions", versions(e.SupportedVersions)) } +type eventVersionNegotiationSent struct { + Header packetHeaderVersionNegotiation + SupportedVersions []versionNumber +} + +func (e eventVersionNegotiationSent) Category() category { return categoryTransport } +func (e eventVersionNegotiationSent) Name() string { return "packet_sent" } +func (e eventVersionNegotiationSent) IsNil() bool { return false } + +func (e eventVersionNegotiationSent) MarshalJSONObject(enc *gojay.Encoder) { + enc.ObjectKey("header", e.Header) + enc.ArrayKey("supported_versions", versions(e.SupportedVersions)) +} + type eventPacketBuffered struct { PacketType logging.PacketType PacketSize protocol.ByteCount @@ -243,15 +258,16 @@ func (e eventPacketBuffered) IsNil() bool { return false } func (e eventPacketBuffered) MarshalJSONObject(enc *gojay.Encoder) { //nolint:gosimple - enc.ObjectKey("header", packetHeaderWithType{PacketType: e.PacketType}) + enc.ObjectKey("header", packetHeaderWithType{PacketType: e.PacketType, PacketNumber: protocol.InvalidPacketNumber}) enc.ObjectKey("raw", rawInfo{Length: e.PacketSize}) enc.StringKey("trigger", "keys_unavailable") } type eventPacketDropped struct { - PacketType logging.PacketType - PacketSize protocol.ByteCount - Trigger packetDropReason + PacketType logging.PacketType + PacketSize protocol.ByteCount + PacketNumber logging.PacketNumber + Trigger packetDropReason } func (e eventPacketDropped) Category() category { return categoryTransport } @@ -259,7 +275,10 @@ func (e eventPacketDropped) Name() string { return "packet_dropped" } func (e eventPacketDropped) IsNil() bool { return false } func (e eventPacketDropped) MarshalJSONObject(enc *gojay.Encoder) { - enc.ObjectKey("header", packetHeaderWithType{PacketType: e.PacketType}) + enc.ObjectKey("header", packetHeaderWithType{ + PacketType: e.PacketType, + PacketNumber: e.PacketNumber, + }) enc.ObjectKey("raw", rawInfo{Length: e.PacketSize}) enc.StringKey("trigger", e.Trigger.String()) } @@ -275,6 +294,20 @@ type metrics struct { PacketsInFlight int } +type eventMTUUpdated struct { + mtu protocol.ByteCount + done bool +} + +func (e eventMTUUpdated) Category() category { return categoryRecovery } +func (e eventMTUUpdated) Name() string { return "mtu_updated" } +func (e eventMTUUpdated) IsNil() bool { return false } + +func (e eventMTUUpdated) MarshalJSONObject(enc *gojay.Encoder) { + enc.Uint64Key("mtu", uint64(e.mtu)) + enc.BoolKey("done", e.done) +} + type eventMetricsUpdated struct { Last *metrics Current *metrics @@ -340,9 +373,9 @@ func (e eventPacketLost) MarshalJSONObject(enc *gojay.Encoder) { } type eventKeyUpdated struct { - Trigger keyUpdateTrigger - KeyType keyType - Generation protocol.KeyPhase + Trigger keyUpdateTrigger + KeyType keyType + KeyPhase protocol.KeyPhase // we don't log the keys here, so we don't need `old` and `new`. } @@ -354,13 +387,13 @@ func (e eventKeyUpdated) MarshalJSONObject(enc *gojay.Encoder) { enc.StringKey("trigger", e.Trigger.String()) enc.StringKey("key_type", e.KeyType.String()) if e.KeyType == keyTypeClient1RTT || e.KeyType == keyTypeServer1RTT { - enc.Uint64Key("generation", uint64(e.Generation)) + enc.Uint64Key("key_phase", uint64(e.KeyPhase)) } } type eventKeyDiscarded struct { - KeyType keyType - Generation protocol.KeyPhase + KeyType keyType + KeyPhase protocol.KeyPhase } func (e eventKeyDiscarded) Category() category { return categorySecurity } @@ -373,7 +406,7 @@ func (e eventKeyDiscarded) MarshalJSONObject(enc *gojay.Encoder) { } enc.StringKey("key_type", e.KeyType.String()) if e.KeyType == keyTypeClient1RTT || e.KeyType == keyTypeServer1RTT { - enc.Uint64Key("generation", uint64(e.Generation)) + enc.Uint64Key("key_phase", uint64(e.KeyPhase)) } } @@ -452,8 +485,7 @@ func (e eventTransportParameters) MarshalJSONObject(enc *gojay.Encoder) { } type preferredAddress struct { - IPv4, IPv6 net.IP - PortV4, PortV6 uint16 + IPv4, IPv6 netip.AddrPort ConnectionID protocol.ConnectionID StatelessResetToken protocol.StatelessResetToken } @@ -462,10 +494,10 @@ var _ gojay.MarshalerJSONObject = &preferredAddress{} func (a preferredAddress) IsNil() bool { return false } func (a preferredAddress) MarshalJSONObject(enc *gojay.Encoder) { - enc.StringKey("ip_v4", a.IPv4.String()) - enc.Uint16Key("port_v4", a.PortV4) - enc.StringKey("ip_v6", a.IPv6.String()) - enc.Uint16Key("port_v6", a.PortV6) + enc.StringKey("ip_v4", a.IPv4.Addr().String()) + enc.Uint16Key("port_v4", a.IPv4.Port()) + enc.StringKey("ip_v6", a.IPv6.Addr().String()) + enc.Uint16Key("port_v6", a.IPv6.Port()) enc.StringKey("connection_id", a.ConnectionID.String()) enc.StringKey("stateless_reset_token", fmt.Sprintf("%x", a.StatelessResetToken)) } @@ -550,3 +582,15 @@ func (e eventGeneric) IsNil() bool { return false } func (e eventGeneric) MarshalJSONObject(enc *gojay.Encoder) { enc.StringKey("details", e.msg) } + +type eventALPNInformation struct { + chosenALPN string +} + +func (e eventALPNInformation) Category() category { return categoryTransport } +func (e eventALPNInformation) Name() string { return "alpn_information" } +func (e eventALPNInformation) IsNil() bool { return false } + +func (e eventALPNInformation) MarshalJSONObject(enc *gojay.Encoder) { + enc.StringKey("chosen_alpn", e.chosenALPN) +} diff --git a/vendor/github.com/quic-go/quic-go/qlog/packet_header.go b/vendor/github.com/quic-go/quic-go/qlog/packet_header.go index 106499b05..53c9f2b0d 100644 --- a/vendor/github.com/quic-go/quic-go/qlog/packet_header.go +++ b/vendor/github.com/quic-go/quic-go/qlog/packet_header.go @@ -110,14 +110,18 @@ func (h packetHeaderVersionNegotiation) MarshalJSONObject(enc *gojay.Encoder) { enc.StringKey("dcid", h.DestConnectionID.String()) } -// a minimal header that only outputs the packet type +// a minimal header that only outputs the packet type, and potentially a packet number type packetHeaderWithType struct { - PacketType logging.PacketType + PacketType logging.PacketType + PacketNumber logging.PacketNumber } func (h packetHeaderWithType) IsNil() bool { return false } func (h packetHeaderWithType) MarshalJSONObject(enc *gojay.Encoder) { enc.StringKey("packet_type", packetType(h.PacketType).String()) + if h.PacketNumber != protocol.InvalidPacketNumber { + enc.Int64Key("packet_number", int64(h.PacketNumber)) + } } // a minimal header that only outputs the packet type diff --git a/vendor/github.com/quic-go/quic-go/qlog/qlog_dir.go b/vendor/github.com/quic-go/quic-go/qlog/qlog_dir.go new file mode 100644 index 000000000..e7acef4f0 --- /dev/null +++ b/vendor/github.com/quic-go/quic-go/qlog/qlog_dir.go @@ -0,0 +1,49 @@ +package qlog + +import ( + "bufio" + "context" + "fmt" + "log" + "os" + "strings" + + "github.com/quic-go/quic-go/internal/utils" + "github.com/quic-go/quic-go/logging" +) + +// DefaultTracer creates a qlog file in the qlog directory specified by the QLOGDIR environment variable. +// File names are _.qlog. +// Returns nil if QLOGDIR is not set. +func DefaultTracer(_ context.Context, p logging.Perspective, connID logging.ConnectionID) *logging.ConnectionTracer { + var label string + switch p { + case logging.PerspectiveClient: + label = "client" + case logging.PerspectiveServer: + label = "server" + } + return qlogDirTracer(p, connID, label) +} + +// qlogDirTracer creates a qlog file in the qlog directory specified by the QLOGDIR environment variable. +// File names are _